#include "rtp-ext.h" #include #include #include // https://datatracker.ietf.org/doc/html/draft-ietf-avtext-framemarking-13 /* * 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ID=? | L=2 |S|E|I|D|B| TID | LID | TL0PICIDX | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ or +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ID=? | L=1 |S|E|I|D|B| TID | LID | (TL0PICIDX omitted) +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ or +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ID=? | L=0 |S|E|I|D|B| TID | (LID and TL0PICIDX omitted) +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ int rtp_ext_frame_marking_parse(const uint8_t* data, int bytes, struct rtp_ext_frame_marking_t *ext) { memset(ext, 0, sizeof(*ext)); if (bytes-- > 0) { ext->s = (data[0] >> 7) & 0x01; ext->e = (data[0] >> 6) & 0x01; ext->i = (data[0] >> 5) & 0x01; ext->d = (data[0] >> 4) & 0x01; ext->b = (data[0] >> 3) & 0x01; ext->tid = data[0] & 0x07; } if (bytes-- > 0) ext->lid = data[1]; if (bytes > 0) ext->tl0_pic_idx = data[2]; return 0; } int rtp_ext_frame_marking_write(uint8_t* data, int bytes, const struct rtp_ext_frame_marking_t* ext) { int len; len = 1 + ((ext->lid || ext->tl0_pic_idx) ? 1 : 0) + (ext->tl0_pic_idx ? 1 : 0); if (bytes < len) return -1; data[0] = ext->s ? 0x80 : 0x00; data[0] |= ext->e ? 0x40 : 0x00; data[0] |= ext->i ? 0x20 : 0x00; data[0] |= ext->d ? 0x10 : 0x00; data[0] |= ext->b ? 0x08 : 0x00; data[0] |= ext->tid; if (ext->lid || ext->tl0_pic_idx) data[1] = (uint8_t)ext->lid; if (ext->tl0_pic_idx) data[2] = (uint8_t)ext->tl0_pic_idx; return len; }