Mercurial > libavformat.hg
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 |
rev | line source |
---|---|
0 | 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 | 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 | 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 | 9 * modify it under the terms of the GNU Lesser General Public |
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 | 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 | 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. | |
17 * | |
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 | 21 */ |
3286 | 22 |
23 #include "libavcodec/mpegvideo.h" | |
0 | 24 #include "avformat.h" |
1419 | 25 #include "rtp_internal.h" |
0 | 26 |
27 /* NOTE: a single frame must be passed with sequence header if | |
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 | 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 | 32 int len, h, max_packet_size; |
65 | 33 uint8_t *q; |
2419 | 34 int begin_of_slice, end_of_slice, frame_type, temporal_reference; |
0 | 35 |
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 | 39 frame_type = 0; |
2419 | 40 temporal_reference = 0; |
0 | 41 |
42 while (size > 0) { | |
2420 | 43 int begin_of_sequence; |
44 | |
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 | 61 if (start_code == 0x100) { |
62 frame_type = (r[1] & 0x38) >> 3; | |
2419 | 63 temporal_reference = (int)r[0] << 2 | r[1] >> 6; |
2418 | 64 } |
2420 | 65 if (start_code == 0x1B8) { |
66 begin_of_sequence = 1; | |
67 } | |
2418 | 68 |
3557 | 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 | 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 | 91 h = 0; |
2419 | 92 h |= temporal_reference << 16; |
2420 | 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 | 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 | 98 q = s->buf; |
99 *q++ = h >> 24; | |
100 *q++ = h >> 16; | |
101 *q++ = h >> 8; | |
102 *q++ = h; | |
103 | |
104 memcpy(q, buf1, len); | |
105 q += len; | |
106 | |
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 | 110 |
111 buf1 += len; | |
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 | 115 } |
116 } | |
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 |