annotate rtp_mpv.c @ 3902:5f9bec099c69 libavformat

Add dynamic payload handlers to rdt.c. These follow the same API as the ones in rtpdec.c, so that they can be shared and used in the same way in rtsp.c. The handlers, since they are specific for RDT, are registered in rdt.c and a new registration function is thus called from allformats.c. The dynamic payload handler also implements RDT-specific SDP-line parsing for OpaqueData and StartTime, which are specific for RDT and needed for proper playback. OpaqueData contains one or a list ("MLTI") of "MDPR" chunks that can be parsed by the rmdec.c function ff_rm_read_mdpr_codecdata(). To use this function, we create a new rdt_demuxer, which has the same private data as the rm_demuxer. The resulting AVFormatContext created with _open_stream() can thus be used to call functions in the RM demuxer. See discussion in "Realmedia patch" thread on ML.
author rbultje
date Sun, 07 Sep 2008 01:21:24 +0000
parents 1489d89efd77
children bf1b4748cd2e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1 /*
2406
18e94e5989d8 Move the RTP packetization code for MPEG12 video in its own file (rtp_mpv.c)
lucabe
parents: 2274
diff changeset
2 * RTP packetization for MPEG video
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
3 * Copyright (c) 2002 Fabrice Bellard.
2570
b0a253d7d0f7 Add my name to the copyright header, since rtp_mpv now contains
lucabe
parents: 2540
diff changeset
4 * Copyright (c) 2007 Luca Abeni.
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
5 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1332
diff changeset
6 * This file is part of FFmpeg.
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1332
diff changeset
7 *
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1332
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1332
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
12 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1332
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
16 * Lesser General Public License for more details.
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
17 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1332
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
896
edbe5c3717f9 Update licensing information: The FSF changed postal address.
diego
parents: 885
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
21 */
3286
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 2570
diff changeset
22
6f61c3b36632 Use full path for #includes from another directory.
diego
parents: 2570
diff changeset
23 #include "libavcodec/mpegvideo.h"
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
24 #include "avformat.h"
1419
8fb4910bdcc0 Add support for H264 over RTP
gpoirier
parents: 1358
diff changeset
25 #include "rtp_internal.h"
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
26
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
27 /* NOTE: a single frame must be passed with sequence header if
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
28 needed. XXX: use slices. */
2406
18e94e5989d8 Move the RTP packetization code for MPEG12 video in its own file (rtp_mpv.c)
lucabe
parents: 2274
diff changeset
29 void ff_rtp_send_mpegvideo(AVFormatContext *s1, const uint8_t *buf1, int size)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
30 {
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 241
diff changeset
31 RTPDemuxContext *s = s1->priv_data;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
32 int len, h, max_packet_size;
65
a58a8a53eb46 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 0
diff changeset
33 uint8_t *q;
2419
584898b8189e Set the "TR" field in the payload header
lucabe
parents: 2418
diff changeset
34 int begin_of_slice, end_of_slice, frame_type, temporal_reference;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
35
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
36 max_packet_size = s->max_payload_size;
2413
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
37 begin_of_slice = 1;
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
38 end_of_slice = 0;
2418
c13c82994800 Correctly set the "P" field in the payload header
lucabe
parents: 2413
diff changeset
39 frame_type = 0;
2419
584898b8189e Set the "TR" field in the payload header
lucabe
parents: 2418
diff changeset
40 temporal_reference = 0;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
41
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
42 while (size > 0) {
2420
4ca7ed628eff Set the "B" flag in the payload header
lucabe
parents: 2419
diff changeset
43 int begin_of_sequence;
4ca7ed628eff Set the "B" flag in the payload header
lucabe
parents: 2419
diff changeset
44
4ca7ed628eff Set the "B" flag in the payload header
lucabe
parents: 2419
diff changeset
45 begin_of_sequence = 0;
2411
9134c5f663bd Backport fix for mpegvideo rtp, fixes Issue119, original fix from Dario Gallucci <dariodotgallucciatpolito.it> in feng
lu_zero
parents: 2406
diff changeset
46 len = max_packet_size - 4;
9134c5f663bd Backport fix for mpegvideo rtp, fixes Issue119, original fix from Dario Gallucci <dariodotgallucciatpolito.it> in feng
lu_zero
parents: 2406
diff changeset
47
9134c5f663bd Backport fix for mpegvideo rtp, fixes Issue119, original fix from Dario Gallucci <dariodotgallucciatpolito.it> in feng
lu_zero
parents: 2406
diff changeset
48 if (len >= size) {
9134c5f663bd Backport fix for mpegvideo rtp, fixes Issue119, original fix from Dario Gallucci <dariodotgallucciatpolito.it> in feng
lu_zero
parents: 2406
diff changeset
49 len = size;
2413
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
50 end_of_slice = 1;
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
51 } else {
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
52 const uint8_t *r, *r1;
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
53 int start_code;
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
54
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
55 r1 = buf1;
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
56 while (1) {
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
57 start_code = -1;
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
58 r = ff_find_start_code(r1, buf1 + size, &start_code);
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
59 if((start_code & 0xFFFFFF00) == 0x100) {
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
60 /* New start code found */
2418
c13c82994800 Correctly set the "P" field in the payload header
lucabe
parents: 2413
diff changeset
61 if (start_code == 0x100) {
c13c82994800 Correctly set the "P" field in the payload header
lucabe
parents: 2413
diff changeset
62 frame_type = (r[1] & 0x38) >> 3;
2419
584898b8189e Set the "TR" field in the payload header
lucabe
parents: 2418
diff changeset
63 temporal_reference = (int)r[0] << 2 | r[1] >> 6;
2418
c13c82994800 Correctly set the "P" field in the payload header
lucabe
parents: 2413
diff changeset
64 }
2420
4ca7ed628eff Set the "B" flag in the payload header
lucabe
parents: 2419
diff changeset
65 if (start_code == 0x1B8) {
4ca7ed628eff Set the "B" flag in the payload header
lucabe
parents: 2419
diff changeset
66 begin_of_sequence = 1;
4ca7ed628eff Set the "B" flag in the payload header
lucabe
parents: 2419
diff changeset
67 }
2418
c13c82994800 Correctly set the "P" field in the payload header
lucabe
parents: 2413
diff changeset
68
3557
1489d89efd77 Fix MPEG video packetization for RTP
lucabe
parents: 3480
diff changeset
69 if (r - buf1 - 4 <= len) {
2413
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
70 /* The current slice fits in the packet */
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
71 if (begin_of_slice == 0) {
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
72 /* no slice at the beginning of the packet... */
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
73 end_of_slice = 1;
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
74 len = r - buf1 - 4;
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
75 break;
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
76 }
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
77 r1 = r;
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
78 } else {
3557
1489d89efd77 Fix MPEG video packetization for RTP
lucabe
parents: 3480
diff changeset
79 if ((r1 - buf1 > 4) && (r - r1 < max_packet_size)) {
2413
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
80 len = r1 - buf1 - 4;
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
81 end_of_slice = 1;
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
82 }
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
83 break;
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
84 }
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
85 } else {
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
86 break;
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
87 }
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
88 }
2411
9134c5f663bd Backport fix for mpegvideo rtp, fixes Issue119, original fix from Dario Gallucci <dariodotgallucciatpolito.it> in feng
lu_zero
parents: 2406
diff changeset
89 }
9134c5f663bd Backport fix for mpegvideo rtp, fixes Issue119, original fix from Dario Gallucci <dariodotgallucciatpolito.it> in feng
lu_zero
parents: 2406
diff changeset
90
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
91 h = 0;
2419
584898b8189e Set the "TR" field in the payload header
lucabe
parents: 2418
diff changeset
92 h |= temporal_reference << 16;
2420
4ca7ed628eff Set the "B" flag in the payload header
lucabe
parents: 2419
diff changeset
93 h |= begin_of_sequence << 13;
2413
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
94 h |= begin_of_slice << 12;
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
95 h |= end_of_slice << 11;
2418
c13c82994800 Correctly set the "P" field in the payload header
lucabe
parents: 2413
diff changeset
96 h |= frame_type << 8;
2411
9134c5f663bd Backport fix for mpegvideo rtp, fixes Issue119, original fix from Dario Gallucci <dariodotgallucciatpolito.it> in feng
lu_zero
parents: 2406
diff changeset
97
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
98 q = s->buf;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
99 *q++ = h >> 24;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
100 *q++ = h >> 16;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
101 *q++ = h >> 8;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
102 *q++ = h;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
103
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
104 memcpy(q, buf1, len);
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
105 q += len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
106
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
107 /* 90 KHz time stamp */
2540
ca3cba9c641f Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents: 2420
diff changeset
108 s->timestamp = s->cur_timestamp;
2406
18e94e5989d8 Move the RTP packetization code for MPEG12 video in its own file (rtp_mpv.c)
lucabe
parents: 2274
diff changeset
109 ff_rtp_send_data(s1, s->buf, q - s->buf, (len == size));
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
110
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
111 buf1 += len;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
112 size -= len;
2413
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
113 begin_of_slice = end_of_slice;
0b5863b939d3 Correct packetization for MPEG video frames, and correct setting of the
lucabe
parents: 2412
diff changeset
114 end_of_slice = 0;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
115 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
116 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
117
294
6091b76cfc2a added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents: 241
diff changeset
118