2
* RTP packetization for MPEG video
3
* Copyright (c) 2002 Fabrice Bellard.
4
* Copyright (c) 2007 Luca Abeni.
6
* This file is part of FFmpeg.
8
* FFmpeg is free software; you can redistribute it and/or
9
* modify it under the terms of the GNU Lesser General Public
10
* License as published by the Free Software Foundation; either
11
* version 2.1 of the License, or (at your option) any later version.
13
* FFmpeg is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
* Lesser General Public License for more details.
18
* You should have received a copy of the GNU Lesser General Public
19
* License along with FFmpeg; if not, write to the Free Software
20
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23
#include "libavcodec/mpegvideo.h"
25
#include "rtp_internal.h"
27
/* NOTE: a single frame must be passed with sequence header if
28
needed. XXX: use slices. */
29
void ff_rtp_send_mpegvideo(AVFormatContext *s1, const uint8_t *buf1, int size)
31
RTPDemuxContext *s = s1->priv_data;
32
int len, h, max_packet_size;
34
int begin_of_slice, end_of_slice, frame_type, temporal_reference;
36
max_packet_size = s->max_payload_size;
40
temporal_reference = 0;
43
int begin_of_sequence;
45
begin_of_sequence = 0;
46
len = max_packet_size - 4;
52
const uint8_t *r, *r1;
58
r = ff_find_start_code(r1, buf1 + size, &start_code);
59
if((start_code & 0xFFFFFF00) == 0x100) {
60
/* New start code found */
61
if (start_code == 0x100) {
62
frame_type = (r[1] & 0x38) >> 3;
63
temporal_reference = (int)r[0] << 2 | r[1] >> 6;
65
if (start_code == 0x1B8) {
66
begin_of_sequence = 1;
70
/* The current slice fits in the packet */
71
if (begin_of_slice == 0) {
72
/* no slice at the beginning of the packet... */
79
if (r - r1 < max_packet_size) {
92
h |= temporal_reference << 16;
93
h |= begin_of_sequence << 13;
94
h |= begin_of_slice << 12;
95
h |= end_of_slice << 11;
104
memcpy(q, buf1, len);
107
/* 90 KHz time stamp */
108
s->timestamp = s->cur_timestamp;
109
ff_rtp_send_data(s1, s->buf, q - s->buf, (len == size));
113
begin_of_slice = end_of_slice;