Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

rtp-mp4v-es-pack.c 3.6KB

vor 10 Monaten
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /// RFC6416 RTP Payload Format for MPEG-4 Audio/Visual Streams
  2. ///
  3. /// 5.1. Use of RTP Header Fields for MPEG-4 Visual (p9)
  4. /// Marker (M) bit: The marker bit is set to 1 to indicate the last RTP
  5. /// packet(or only RTP packet) of a VOP.When multiple VOPs are carried
  6. /// in the same RTP packet, the marker bit is set to 1.
  7. ///
  8. /// 5.2. Fragmentation of MPEG-4 Visual Bitstream
  9. /// A fragmented MPEG-4 Visual bitstream is mapped directly onto the RTP
  10. /// payload without any addition of extra header fields or any removal of
  11. /// Visual syntax elements.
  12. ///
  13. /// 6.2. Use of RTP Header Fields for MPEG-4 Audio (p16)
  14. /// Marker (M) bit: The marker bit indicates audioMuxElement boundaries.
  15. /// It is set to 1 to indicate that the RTP packet contains a complete
  16. /// audioMuxElement or the last fragment of an audioMuxElement
  17. ///
  18. /// 6.3. Fragmentation of MPEG-4 Audio Bitstream
  19. /// It is RECOMMENDED to put one audioMuxElement in each RTP packet.
  20. #include "rtp-packet.h"
  21. #include "rtp-profile.h"
  22. #include "rtp-payload-internal.h"
  23. #include <stdlib.h>
  24. #include <string.h>
  25. #include <assert.h>
  26. #include <errno.h>
  27. #define KHz 90 // 90000Hz
  28. struct rtp_encode_mp4v_es_t
  29. {
  30. struct rtp_packet_t pkt;
  31. struct rtp_payload_t handler;
  32. void* cbparam;
  33. int size;
  34. };
  35. static void* rtp_mp4v_es_encode_create(int size, uint8_t pt, uint16_t seq, uint32_t ssrc, struct rtp_payload_t *handler, void* cbparam)
  36. {
  37. struct rtp_encode_mp4v_es_t *packer;
  38. packer = (struct rtp_encode_mp4v_es_t *)calloc(1, sizeof(*packer));
  39. if (!packer) return NULL;
  40. memcpy(&packer->handler, handler, sizeof(packer->handler));
  41. packer->cbparam = cbparam;
  42. packer->size = size;
  43. packer->pkt.rtp.v = RTP_VERSION;
  44. packer->pkt.rtp.pt = pt;
  45. packer->pkt.rtp.seq = seq;
  46. packer->pkt.rtp.ssrc = ssrc;
  47. return packer;
  48. }
  49. static void rtp_mp4v_es_encode_destroy(void* pack)
  50. {
  51. struct rtp_encode_mp4v_es_t *packer;
  52. packer = (struct rtp_encode_mp4v_es_t *)pack;
  53. #if defined(_DEBUG) || defined(DEBUG)
  54. memset(packer, 0xCC, sizeof(*packer));
  55. #endif
  56. free(packer);
  57. }
  58. static void rtp_mp4v_es_encode_get_info(void* pack, uint16_t* seq, uint32_t* timestamp)
  59. {
  60. struct rtp_encode_mp4v_es_t *packer;
  61. packer = (struct rtp_encode_mp4v_es_t *)pack;
  62. *seq = (uint16_t)packer->pkt.rtp.seq;
  63. *timestamp = packer->pkt.rtp.timestamp;
  64. }
  65. static int rtp_mp4v_es_encode_input(void* pack, const void* data, int bytes, uint32_t timestamp)
  66. {
  67. int r, n;
  68. uint8_t *rtp;
  69. const uint8_t *ptr;
  70. struct rtp_encode_mp4v_es_t *packer;
  71. packer = (struct rtp_encode_mp4v_es_t *)pack;
  72. assert(packer->pkt.rtp.timestamp != timestamp || !packer->pkt.payload /*first packet*/);
  73. packer->pkt.rtp.timestamp = timestamp; //(uint32_t)(time * KHz);
  74. r = 0;
  75. for (ptr = (const uint8_t *)data; 0 == r && bytes > 0; ++packer->pkt.rtp.seq)
  76. {
  77. packer->pkt.payload = ptr;
  78. packer->pkt.payloadlen = (bytes + RTP_FIXED_HEADER) <= packer->size ? bytes : (packer->size - RTP_FIXED_HEADER);
  79. ptr += packer->pkt.payloadlen;
  80. bytes -= packer->pkt.payloadlen;
  81. n = RTP_FIXED_HEADER + packer->pkt.payloadlen;
  82. rtp = (uint8_t*)packer->handler.alloc(packer->cbparam, n);
  83. if (!rtp) return -ENOMEM;
  84. packer->pkt.rtp.m = (0 == bytes) ? 1 : 0;
  85. n = rtp_packet_serialize(&packer->pkt, rtp, n);
  86. if (n != RTP_FIXED_HEADER + packer->pkt.payloadlen)
  87. {
  88. assert(0);
  89. return -1;
  90. }
  91. r = packer->handler.packet(packer->cbparam, rtp, n, packer->pkt.rtp.timestamp, 0);
  92. packer->handler.free(packer->cbparam, rtp);
  93. }
  94. return r;
  95. }
  96. struct rtp_payload_encode_t *rtp_mp4v_es_encode()
  97. {
  98. static struct rtp_payload_encode_t encode = {
  99. rtp_mp4v_es_encode_create,
  100. rtp_mp4v_es_encode_destroy,
  101. rtp_mp4v_es_encode_get_info,
  102. rtp_mp4v_es_encode_input,
  103. };
  104. return &encode;
  105. }