rtpenc_h263_rfc2190.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. /*
  2. * RTP packetization for H.263 video
  3. * Copyright (c) 2012 Martin Storsjo
  4. *
  5. * This file is part of Libav.
  6. *
  7. * Libav is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * Libav is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with Libav; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. */
  21. #include "avformat.h"
  22. #include "rtpenc.h"
  23. #include "libavcodec/put_bits.h"
  24. #include "libavcodec/get_bits.h"
  25. struct H263Info {
  26. int src;
  27. int i;
  28. int u;
  29. int s;
  30. int a;
  31. int pb;
  32. int tr;
  33. };
  34. struct H263State {
  35. int gobn;
  36. int mba;
  37. int hmv1, vmv1, hmv2, vmv2;
  38. int quant;
  39. };
  40. static void send_mode_a(AVFormatContext *s1, const struct H263Info *info,
  41. const uint8_t *buf, int len, int ebits, int m)
  42. {
  43. RTPMuxContext *s = s1->priv_data;
  44. PutBitContext pb;
  45. init_put_bits(&pb, s->buf, 32);
  46. put_bits(&pb, 1, 0); /* F - 0, mode A */
  47. put_bits(&pb, 1, 0); /* P - 0, normal I/P */
  48. put_bits(&pb, 3, 0); /* SBIT - 0 bits */
  49. put_bits(&pb, 3, ebits); /* EBIT */
  50. put_bits(&pb, 3, info->src); /* SRC - source format */
  51. put_bits(&pb, 1, info->i); /* I - inter/intra */
  52. put_bits(&pb, 1, info->u); /* U - unrestricted motion vector */
  53. put_bits(&pb, 1, info->s); /* S - syntax-baesd arithmetic coding */
  54. put_bits(&pb, 1, info->a); /* A - advanced prediction */
  55. put_bits(&pb, 4, 0); /* R - reserved */
  56. put_bits(&pb, 2, 0); /* DBQ - 0 */
  57. put_bits(&pb, 3, 0); /* TRB - 0 */
  58. put_bits(&pb, 8, info->tr); /* TR */
  59. flush_put_bits(&pb);
  60. memcpy(s->buf + 4, buf, len);
  61. ff_rtp_send_data(s1, s->buf, len + 4, m);
  62. }
  63. static void send_mode_b(AVFormatContext *s1, const struct H263Info *info,
  64. const struct H263State *state, const uint8_t *buf,
  65. int len, int sbits, int ebits, int m)
  66. {
  67. RTPMuxContext *s = s1->priv_data;
  68. PutBitContext pb;
  69. init_put_bits(&pb, s->buf, 64);
  70. put_bits(&pb, 1, 1); /* F - 1, mode B */
  71. put_bits(&pb, 1, 0); /* P - 0, mode B */
  72. put_bits(&pb, 3, sbits); /* SBIT - 0 bits */
  73. put_bits(&pb, 3, ebits); /* EBIT - 0 bits */
  74. put_bits(&pb, 3, info->src); /* SRC - source format */
  75. put_bits(&pb, 5, state->quant); /* QUANT - quantizer for the first MB */
  76. put_bits(&pb, 5, state->gobn); /* GOBN - GOB number */
  77. put_bits(&pb, 9, state->mba); /* MBA - MB address */
  78. put_bits(&pb, 2, 0); /* R - reserved */
  79. put_bits(&pb, 1, info->i); /* I - inter/intra */
  80. put_bits(&pb, 1, info->u); /* U - unrestricted motion vector */
  81. put_bits(&pb, 1, info->s); /* S - syntax-baesd arithmetic coding */
  82. put_bits(&pb, 1, info->a); /* A - advanced prediction */
  83. put_bits(&pb, 7, state->hmv1); /* HVM1 - horizontal motion vector 1 */
  84. put_bits(&pb, 7, state->vmv1); /* VMV1 - vertical motion vector 1 */
  85. put_bits(&pb, 7, state->hmv2); /* HVM2 - horizontal motion vector 2 */
  86. put_bits(&pb, 7, state->vmv2); /* VMV2 - vertical motion vector 2 */
  87. flush_put_bits(&pb);
  88. memcpy(s->buf + 8, buf, len);
  89. ff_rtp_send_data(s1, s->buf, len + 8, m);
  90. }
  91. void ff_rtp_send_h263_rfc2190(AVFormatContext *s1, const uint8_t *buf, int size,
  92. const uint8_t *mb_info, int mb_info_size)
  93. {
  94. RTPMuxContext *s = s1->priv_data;
  95. int len, sbits = 0, ebits = 0;
  96. GetBitContext gb;
  97. struct H263Info info = { 0 };
  98. struct H263State state = { 0 };
  99. int mb_info_pos = 0, mb_info_count = mb_info_size / 12;
  100. const uint8_t *buf_base = buf;
  101. s->timestamp = s->cur_timestamp;
  102. init_get_bits(&gb, buf, size*8);
  103. if (get_bits(&gb, 22) == 0x20) { /* Picture Start Code */
  104. info.tr = get_bits(&gb, 8);
  105. skip_bits(&gb, 2); /* PTYPE start, H261 disambiguation */
  106. skip_bits(&gb, 3); /* Split screen, document camera, freeze picture release */
  107. info.src = get_bits(&gb, 3);
  108. info.i = get_bits(&gb, 1);
  109. info.u = get_bits(&gb, 1);
  110. info.s = get_bits(&gb, 1);
  111. info.a = get_bits(&gb, 1);
  112. info.pb = get_bits(&gb, 1);
  113. }
  114. while (size > 0) {
  115. struct H263State packet_start_state = state;
  116. len = FFMIN(s->max_payload_size - 8, size);
  117. /* Look for a better place to split the frame into packets. */
  118. if (len < size) {
  119. const uint8_t *end = ff_h263_find_resync_marker_reverse(buf,
  120. buf + len);
  121. len = end - buf;
  122. if (len == s->max_payload_size - 8) {
  123. /* Skip mb info prior to the start of the current ptr */
  124. while (mb_info_pos < mb_info_count) {
  125. uint32_t pos = AV_RL32(&mb_info[12*mb_info_pos])/8;
  126. if (pos >= buf - buf_base)
  127. break;
  128. mb_info_pos++;
  129. }
  130. /* Find the first mb info past the end pointer */
  131. while (mb_info_pos + 1 < mb_info_count) {
  132. uint32_t pos = AV_RL32(&mb_info[12*(mb_info_pos + 1)])/8;
  133. if (pos >= end - buf_base)
  134. break;
  135. mb_info_pos++;
  136. }
  137. if (mb_info_pos < mb_info_count) {
  138. const uint8_t *ptr = &mb_info[12*mb_info_pos];
  139. uint32_t bit_pos = AV_RL32(ptr);
  140. uint32_t pos = (bit_pos + 7)/8;
  141. if (pos <= end - buf_base) {
  142. state.quant = ptr[4];
  143. state.gobn = ptr[5];
  144. state.mba = AV_RL16(&ptr[6]);
  145. state.hmv1 = (int8_t) ptr[8];
  146. state.vmv1 = (int8_t) ptr[9];
  147. state.hmv2 = (int8_t) ptr[10];
  148. state.vmv2 = (int8_t) ptr[11];
  149. ebits = 8 * pos - bit_pos;
  150. len = pos - (buf - buf_base);
  151. mb_info_pos++;
  152. } else {
  153. av_log(s1, AV_LOG_ERROR,
  154. "Unable to split H263 packet, use -mb_info %d "
  155. "or lower.\n", s->max_payload_size - 8);
  156. }
  157. } else {
  158. av_log(s1, AV_LOG_ERROR, "Unable to split H263 packet, "
  159. "use -mb_info %d or -ps 1.\n",
  160. s->max_payload_size - 8);
  161. }
  162. }
  163. }
  164. if (size > 2 && !buf[0] && !buf[1])
  165. send_mode_a(s1, &info, buf, len, ebits, len == size);
  166. else
  167. send_mode_b(s1, &info, &packet_start_state, buf, len, sbits,
  168. ebits, len == size);
  169. if (ebits) {
  170. sbits = 8 - ebits;
  171. len--;
  172. } else {
  173. sbits = 0;
  174. }
  175. buf += len;
  176. size -= len;
  177. ebits = 0;
  178. }
  179. }