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