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.

68 linhas
1.6KB

  1. /// RFC2250 3. Encapsulation of MPEG Elementary Streams (p4)
  2. #include "rtp-packet.h"
  3. #include "rtp-profile.h"
  4. #include "rtp-payload-helper.h"
  5. #include "rtp-payload-internal.h"
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <assert.h>
  9. #include <errno.h>
  10. #define MPEG2VIDEO_EXTENSION_HEADER 0x04
  11. static int rtp_decode_mpeg2es(void* p, const void* packet, int bytes)
  12. {
  13. int n;
  14. struct rtp_packet_t pkt;
  15. struct rtp_payload_helper_t *helper;
  16. helper = (struct rtp_payload_helper_t *)p;
  17. if (!helper || 0 != rtp_packet_deserialize(&pkt, packet, bytes) || pkt.payloadlen < 4)
  18. return -EINVAL;
  19. if (RTP_PAYLOAD_MP3 != pkt.rtp.pt && RTP_PAYLOAD_MPV != pkt.rtp.pt)
  20. {
  21. assert(0);
  22. return -EINVAL;
  23. }
  24. rtp_payload_check(helper, &pkt);
  25. // save payload
  26. if (!helper->lost)
  27. {
  28. n = 4; // skip 3.4 MPEG Video-specific header
  29. if (RTP_PAYLOAD_MPV == pkt.rtp.pt && (((uint8_t*)pkt.payload)[4] & MPEG2VIDEO_EXTENSION_HEADER))
  30. n += 4; // 3.4.1 MPEG-2 Video-specific header extension
  31. assert(pkt.payloadlen > 4);
  32. if (pkt.payload && pkt.payloadlen > n)
  33. {
  34. pkt.payload = (uint8_t*)pkt.payload + n;
  35. pkt.payloadlen -= n;
  36. rtp_payload_write(helper, &pkt);
  37. }
  38. }
  39. // M bit: For video, set to 1 on packet containing MPEG frame end code, 0 otherwise.
  40. // For audio, set to 1 on first packet of a "talk-spurt," 0 otherwise.
  41. if (pkt.rtp.m && RTP_PAYLOAD_MPV == pkt.rtp.pt)
  42. {
  43. rtp_payload_onframe(helper);
  44. }
  45. return helper->lost ? 0 : 1; // packet handled
  46. }
  47. struct rtp_payload_decode_t *rtp_mpeg1or2es_decode()
  48. {
  49. static struct rtp_payload_decode_t unpacker = {
  50. rtp_payload_helper_create,
  51. rtp_payload_helper_destroy,
  52. rtp_decode_mpeg2es,
  53. };
  54. return &unpacker;
  55. }