Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

69 linhas
2.0KB

  1. #include "rtp-ext.h"
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <assert.h>
  5. // https://datatracker.ietf.org/doc/html/draft-ietf-avtext-framemarking-13
  6. /*
  7. * 0 1 2 3
  8. 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
  9. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  10. | ID=? | L=2 |S|E|I|D|B| TID | LID | TL0PICIDX |
  11. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  12. or
  13. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  14. | ID=? | L=1 |S|E|I|D|B| TID | LID | (TL0PICIDX omitted)
  15. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  16. or
  17. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  18. | ID=? | L=0 |S|E|I|D|B| TID | (LID and TL0PICIDX omitted)
  19. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  20. */
  21. int rtp_ext_frame_marking_parse(const uint8_t* data, int bytes, struct rtp_ext_frame_marking_t *ext)
  22. {
  23. memset(ext, 0, sizeof(*ext));
  24. if (bytes-- > 0)
  25. {
  26. ext->s = (data[0] >> 7) & 0x01;
  27. ext->e = (data[0] >> 6) & 0x01;
  28. ext->i = (data[0] >> 5) & 0x01;
  29. ext->d = (data[0] >> 4) & 0x01;
  30. ext->b = (data[0] >> 3) & 0x01;
  31. ext->tid = data[0] & 0x07;
  32. }
  33. if (bytes-- > 0)
  34. ext->lid = data[1];
  35. if (bytes > 0)
  36. ext->tl0_pic_idx = data[2];
  37. return 0;
  38. }
  39. int rtp_ext_frame_marking_write(uint8_t* data, int bytes, const struct rtp_ext_frame_marking_t* ext)
  40. {
  41. int len;
  42. len = 1 + ((ext->lid || ext->tl0_pic_idx) ? 1 : 0) + (ext->tl0_pic_idx ? 1 : 0);
  43. if (bytes < len)
  44. return -1;
  45. data[0] = ext->s ? 0x80 : 0x00;
  46. data[0] |= ext->e ? 0x40 : 0x00;
  47. data[0] |= ext->i ? 0x20 : 0x00;
  48. data[0] |= ext->d ? 0x10 : 0x00;
  49. data[0] |= ext->b ? 0x08 : 0x00;
  50. data[0] |= ext->tid;
  51. if (ext->lid || ext->tl0_pic_idx)
  52. data[1] = (uint8_t)ext->lid;
  53. if (ext->tl0_pic_idx)
  54. data[2] = (uint8_t)ext->tl0_pic_idx;
  55. return len;
  56. }