1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * RTP packetization for H.263 video 3cabdff1aSopenharmony_ci * Copyright (c) 2009 Luca Abeni 4cabdff1aSopenharmony_ci * Copyright (c) 2009 Martin Storsjo 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * This file is part of FFmpeg. 7cabdff1aSopenharmony_ci * 8cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 9cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 10cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 11cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 12cabdff1aSopenharmony_ci * 13cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 14cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 15cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16cabdff1aSopenharmony_ci * Lesser General Public License for more details. 17cabdff1aSopenharmony_ci * 18cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 19cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 20cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21cabdff1aSopenharmony_ci */ 22cabdff1aSopenharmony_ci 23cabdff1aSopenharmony_ci#include "avformat.h" 24cabdff1aSopenharmony_ci#include "rtpenc.h" 25cabdff1aSopenharmony_ci 26cabdff1aSopenharmony_ciconst uint8_t *ff_h263_find_resync_marker_reverse(const uint8_t *av_restrict start, 27cabdff1aSopenharmony_ci const uint8_t *av_restrict end) 28cabdff1aSopenharmony_ci{ 29cabdff1aSopenharmony_ci const uint8_t *p = end - 1; 30cabdff1aSopenharmony_ci start += 1; /* Make sure we never return the original start. */ 31cabdff1aSopenharmony_ci for (; p > start; p -= 2) { 32cabdff1aSopenharmony_ci if (!*p) { 33cabdff1aSopenharmony_ci if (!p[ 1] && p[2]) return p; 34cabdff1aSopenharmony_ci else if (!p[-1] && p[1]) return p - 1; 35cabdff1aSopenharmony_ci } 36cabdff1aSopenharmony_ci } 37cabdff1aSopenharmony_ci return end; 38cabdff1aSopenharmony_ci} 39cabdff1aSopenharmony_ci 40cabdff1aSopenharmony_ci/** 41cabdff1aSopenharmony_ci * Packetize H.263 frames into RTP packets according to RFC 4629 42cabdff1aSopenharmony_ci */ 43cabdff1aSopenharmony_civoid ff_rtp_send_h263(AVFormatContext *s1, const uint8_t *buf1, int size) 44cabdff1aSopenharmony_ci{ 45cabdff1aSopenharmony_ci RTPMuxContext *s = s1->priv_data; 46cabdff1aSopenharmony_ci int len, max_packet_size; 47cabdff1aSopenharmony_ci uint8_t *q; 48cabdff1aSopenharmony_ci 49cabdff1aSopenharmony_ci max_packet_size = s->max_payload_size; 50cabdff1aSopenharmony_ci 51cabdff1aSopenharmony_ci while (size > 0) { 52cabdff1aSopenharmony_ci q = s->buf; 53cabdff1aSopenharmony_ci if (size >= 2 && (buf1[0] == 0) && (buf1[1] == 0)) { 54cabdff1aSopenharmony_ci *q++ = 0x04; 55cabdff1aSopenharmony_ci buf1 += 2; 56cabdff1aSopenharmony_ci size -= 2; 57cabdff1aSopenharmony_ci } else { 58cabdff1aSopenharmony_ci *q++ = 0; 59cabdff1aSopenharmony_ci } 60cabdff1aSopenharmony_ci *q++ = 0; 61cabdff1aSopenharmony_ci 62cabdff1aSopenharmony_ci len = FFMIN(max_packet_size - 2, size); 63cabdff1aSopenharmony_ci 64cabdff1aSopenharmony_ci /* Look for a better place to split the frame into packets. */ 65cabdff1aSopenharmony_ci if (len < size) { 66cabdff1aSopenharmony_ci const uint8_t *end = ff_h263_find_resync_marker_reverse(buf1, 67cabdff1aSopenharmony_ci buf1 + len); 68cabdff1aSopenharmony_ci len = end - buf1; 69cabdff1aSopenharmony_ci } 70cabdff1aSopenharmony_ci 71cabdff1aSopenharmony_ci memcpy(q, buf1, len); 72cabdff1aSopenharmony_ci q += len; 73cabdff1aSopenharmony_ci 74cabdff1aSopenharmony_ci /* 90 KHz time stamp */ 75cabdff1aSopenharmony_ci s->timestamp = s->cur_timestamp; 76cabdff1aSopenharmony_ci ff_rtp_send_data(s1, s->buf, q - s->buf, (len == size)); 77cabdff1aSopenharmony_ci 78cabdff1aSopenharmony_ci buf1 += len; 79cabdff1aSopenharmony_ci size -= len; 80cabdff1aSopenharmony_ci } 81cabdff1aSopenharmony_ci} 82