Mercurial > libavformat.hg
annotate rtpdec.c @ 6187:c4c35a9d4ab5 libavformat
rtpdec: Add generic function for iterating over FMTP configuration lines
This will be used for cleaning up code that is common among RTP depacketizers.
Patch by Josh Allmann, joshua dot allmann at gmail
author | mstorsjo |
---|---|
date | Mon, 28 Jun 2010 11:24:12 +0000 |
parents | 736165b749f8 |
children | da9998b48dff |
rev | line source |
---|---|
0 | 1 /* |
2891
a6c922b05571
Split the RTP demuxing functions out of rtp.c, to simplify the RTP muxer's dependencies
lucabe
parents:
2790
diff
changeset
|
2 * RTP input format |
4251
77e0c7511d41
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
4101
diff
changeset
|
3 * Copyright (c) 2002 Fabrice Bellard |
0 | 4 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1332
diff
changeset
|
5 * This file is part of FFmpeg. |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1332
diff
changeset
|
6 * |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1332
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
0 | 8 * modify it under the terms of the GNU Lesser General Public |
9 * 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
|
10 * version 2.1 of the License, or (at your option) any later version. |
0 | 11 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1332
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
0 | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * 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
|
18 * 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
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 20 */ |
3286 | 21 |
3722
68749aaea50f
ensure we get explicit definition of various _XOPEN_SOURCE functions we use
aurel
parents:
3579
diff
changeset
|
22 /* needed for gethostname() */ |
3955 | 23 #define _XOPEN_SOURCE 600 |
3722
68749aaea50f
ensure we get explicit definition of various _XOPEN_SOURCE functions we use
aurel
parents:
3579
diff
changeset
|
24 |
4872 | 25 #include "libavcodec/get_bits.h" |
0 | 26 #include "avformat.h" |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
27 #include "mpegts.h" |
0 | 28 |
29 #include <unistd.h> | |
1754 | 30 #include "network.h" |
0 | 31 |
4388 | 32 #include "rtpdec.h" |
5643
457efbf56d15
RTP/AMR depacketizer, by Martin Storsj <$firstname at $firstname dot st>.
rbultje
parents:
5619
diff
changeset
|
33 #include "rtpdec_amr.h" |
5726
04b39763b51b
Rename RTP depacketizer files from rtp_* to rtpdec_*
mstorsjo
parents:
5666
diff
changeset
|
34 #include "rtpdec_asf.h" |
5601
96d885709963
Add RTP/H.263 depacketizer by Martin Storsj <$firstname () $firstname st>.
rbultje
parents:
5472
diff
changeset
|
35 #include "rtpdec_h263.h" |
5726
04b39763b51b
Rename RTP depacketizer files from rtp_* to rtpdec_*
mstorsjo
parents:
5666
diff
changeset
|
36 #include "rtpdec_h264.h" |
6176
5708c6d4223d
RTSP: Decouple MPEG-4 and AAC specific parts from rtsp.c
mstorsjo
parents:
5967
diff
changeset
|
37 #include "rtpdec_mpeg4.h" |
5918
e3b4d7181606
Rename rtpdec_theora.[ch] to rtpdec_xiph.[ch], as a preparation for merging
rbultje
parents:
5910
diff
changeset
|
38 #include "rtpdec_xiph.h" |
1419 | 39 |
0 | 40 //#define DEBUG |
41 | |
42 /* TODO: - add RTCP statistics reporting (should be optional). | |
43 | |
44 - add support for h263/mpeg4 packetized output : IDEA: send a | |
45 buffer to 'rtp_write_packet' contains all the packets for ONE | |
46 frame. Each packet should have a four byte header containing | |
47 the length in big endian format (same trick as | |
885 | 48 'url_open_dyn_packet_buf') |
0 | 49 */ |
50 | |
1419 | 51 /* statistics functions */ |
52 RTPDynamicProtocolHandler *RTPFirstDynamicPayloadHandler= NULL; | |
53 | |
3901
f936c4b8b96d
Give register_dynamic_payload_handler() in rtpdec.c a ff_ prefix and export
rbultje
parents:
3750
diff
changeset
|
54 void ff_register_dynamic_payload_handler(RTPDynamicProtocolHandler *handler) |
1419 | 55 { |
56 handler->next= RTPFirstDynamicPayloadHandler; | |
57 RTPFirstDynamicPayloadHandler= handler; | |
58 } | |
885 | 59 |
1983
fbc66bf1f15d
changes some function declarations from () to (void) as per ansi c.
gpoirier
parents:
1857
diff
changeset
|
60 void av_register_rtp_dynamic_payload_handlers(void) |
1419 | 61 { |
6176
5708c6d4223d
RTSP: Decouple MPEG-4 and AAC specific parts from rtsp.c
mstorsjo
parents:
5967
diff
changeset
|
62 ff_register_dynamic_payload_handler(&ff_mp4v_es_dynamic_handler); |
5708c6d4223d
RTSP: Decouple MPEG-4 and AAC specific parts from rtsp.c
mstorsjo
parents:
5967
diff
changeset
|
63 ff_register_dynamic_payload_handler(&ff_mpeg4_generic_dynamic_handler); |
5643
457efbf56d15
RTP/AMR depacketizer, by Martin Storsj <$firstname at $firstname dot st>.
rbultje
parents:
5619
diff
changeset
|
64 ff_register_dynamic_payload_handler(&ff_amr_nb_dynamic_handler); |
457efbf56d15
RTP/AMR depacketizer, by Martin Storsj <$firstname at $firstname dot st>.
rbultje
parents:
5619
diff
changeset
|
65 ff_register_dynamic_payload_handler(&ff_amr_wb_dynamic_handler); |
5601
96d885709963
Add RTP/H.263 depacketizer by Martin Storsj <$firstname () $firstname st>.
rbultje
parents:
5472
diff
changeset
|
66 ff_register_dynamic_payload_handler(&ff_h263_1998_dynamic_handler); |
96d885709963
Add RTP/H.263 depacketizer by Martin Storsj <$firstname () $firstname st>.
rbultje
parents:
5472
diff
changeset
|
67 ff_register_dynamic_payload_handler(&ff_h263_2000_dynamic_handler); |
3901
f936c4b8b96d
Give register_dynamic_payload_handler() in rtpdec.c a ff_ prefix and export
rbultje
parents:
3750
diff
changeset
|
68 ff_register_dynamic_payload_handler(&ff_h264_dynamic_handler); |
4875
13a2a1a475d5
Add a Vorbis payload parser. Implemented by Colin McQuillan as a GSoC
rbultje
parents:
4872
diff
changeset
|
69 ff_register_dynamic_payload_handler(&ff_vorbis_dynamic_handler); |
5866 | 70 ff_register_dynamic_payload_handler(&ff_theora_dynamic_handler); |
4754
c78617194786
Assign the x-pf-asf payload string to be decoded by rtp_asf.c, and add a
rbultje
parents:
4633
diff
changeset
|
71 |
c78617194786
Assign the x-pf-asf payload string to be decoded by rtp_asf.c, and add a
rbultje
parents:
4633
diff
changeset
|
72 ff_register_dynamic_payload_handler(&ff_ms_rtp_asf_pfv_handler); |
c78617194786
Assign the x-pf-asf payload string to be decoded by rtp_asf.c, and add a
rbultje
parents:
4633
diff
changeset
|
73 ff_register_dynamic_payload_handler(&ff_ms_rtp_asf_pfa_handler); |
1419 | 74 } |
0 | 75 |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
76 static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf, int len) |
0 | 77 { |
78 if (buf[1] != 200) | |
79 return -1; | |
2167
c4244900f986
remove decode_be32/64 and replace them by AV_RB32/64
benoit
parents:
2164
diff
changeset
|
80 s->last_rtcp_ntp_time = AV_RB64(buf + 8); |
5966
9a86b49201bb
Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext
mstorsjo
parents:
5937
diff
changeset
|
81 if (s->first_rtcp_ntp_time == AV_NOPTS_VALUE) |
9a86b49201bb
Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext
mstorsjo
parents:
5937
diff
changeset
|
82 s->first_rtcp_ntp_time = s->last_rtcp_ntp_time; |
2167
c4244900f986
remove decode_be32/64 and replace them by AV_RB32/64
benoit
parents:
2164
diff
changeset
|
83 s->last_rtcp_timestamp = AV_RB32(buf + 16); |
0 | 84 return 0; |
85 } | |
86 | |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
87 #define RTP_SEQ_MOD (1<<16) |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
88 |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
89 /** |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
90 * called on parse open packet |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
91 */ |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
92 static void rtp_init_statistics(RTPStatistics *s, uint16_t base_sequence) // called on parse open packet. |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
93 { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
94 memset(s, 0, sizeof(RTPStatistics)); |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
95 s->max_seq= base_sequence; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
96 s->probation= 1; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
97 } |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
98 |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
99 /** |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
100 * called whenever there is a large jump in sequence numbers, or when they get out of probation... |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
101 */ |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
102 static void rtp_init_sequence(RTPStatistics *s, uint16_t seq) |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
103 { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
104 s->max_seq= seq; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
105 s->cycles= 0; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
106 s->base_seq= seq -1; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
107 s->bad_seq= RTP_SEQ_MOD + 1; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
108 s->received= 0; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
109 s->expected_prior= 0; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
110 s->received_prior= 0; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
111 s->jitter= 0; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
112 s->transit= 0; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
113 } |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
114 |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
115 /** |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
116 * returns 1 if we should handle this packet. |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
117 */ |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
118 static int rtp_valid_packet_in_sequence(RTPStatistics *s, uint16_t seq) |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
119 { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
120 uint16_t udelta= seq - s->max_seq; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
121 const int MAX_DROPOUT= 3000; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
122 const int MAX_MISORDER = 100; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
123 const int MIN_SEQUENTIAL = 2; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
124 |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
125 /* source not valid until MIN_SEQUENTIAL packets with sequence seq. numbers have been received */ |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
126 if(s->probation) |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
127 { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
128 if(seq==s->max_seq + 1) { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
129 s->probation--; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
130 s->max_seq= seq; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
131 if(s->probation==0) { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
132 rtp_init_sequence(s, seq); |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
133 s->received++; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
134 return 1; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
135 } |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
136 } else { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
137 s->probation= MIN_SEQUENTIAL - 1; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
138 s->max_seq = seq; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
139 } |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
140 } else if (udelta < MAX_DROPOUT) { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
141 // in order, with permissible gap |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
142 if(seq < s->max_seq) { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
143 //sequence number wrapped; count antother 64k cycles |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
144 s->cycles += RTP_SEQ_MOD; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
145 } |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
146 s->max_seq= seq; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
147 } else if (udelta <= RTP_SEQ_MOD - MAX_MISORDER) { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
148 // sequence made a large jump... |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
149 if(seq==s->bad_seq) { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
150 // two sequential packets-- assume that the other side restarted without telling us; just resync. |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
151 rtp_init_sequence(s, seq); |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
152 } else { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
153 s->bad_seq= (seq + 1) & (RTP_SEQ_MOD-1); |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
154 return 0; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
155 } |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
156 } else { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
157 // duplicate or reordered packet... |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
158 } |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
159 s->received++; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
160 return 1; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
161 } |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
162 |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
163 #if 0 |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
164 /** |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
165 * This function is currently unused; without a valid local ntp time, I don't see how we could calculate the |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
166 * difference between the arrival and sent timestamp. As a result, the jitter and transit statistics values |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
167 * never change. I left this in in case someone else can see a way. (rdm) |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
168 */ |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
169 static void rtcp_update_jitter(RTPStatistics *s, uint32_t sent_timestamp, uint32_t arrival_timestamp) |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
170 { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
171 uint32_t transit= arrival_timestamp - sent_timestamp; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
172 int d; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
173 s->transit= transit; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
174 d= FFABS(transit - s->transit); |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
175 s->jitter += d - ((s->jitter + 8)>>4); |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
176 } |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
177 #endif |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
178 |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
179 int rtp_check_and_send_back_rr(RTPDemuxContext *s, int count) |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
180 { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
181 ByteIOContext *pb; |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
182 uint8_t *buf; |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
183 int len; |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
184 int rtcp_bytes; |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
185 RTPStatistics *stats= &s->statistics; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
186 uint32_t lost; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
187 uint32_t extended_max; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
188 uint32_t expected_interval; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
189 uint32_t received_interval; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
190 uint32_t lost_interval; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
191 uint32_t expected; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
192 uint32_t fraction; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
193 uint64_t ntp_time= s->last_rtcp_ntp_time; // TODO: Get local ntp time? |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
194 |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
195 if (!s->rtp_ctx || (count < 1)) |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
196 return -1; |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
197 |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
198 /* TODO: I think this is way too often; RFC 1889 has algorithm for this */ |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
199 /* XXX: mpeg pts hardcoded. RTCP send every 0.5 seconds */ |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
200 s->octet_count += count; |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
201 rtcp_bytes = ((s->octet_count - s->last_octet_count) * RTCP_TX_RATIO_NUM) / |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
202 RTCP_TX_RATIO_DEN; |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
203 rtcp_bytes /= 50; // mmu_man: that's enough for me... VLC sends much less btw !? |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
204 if (rtcp_bytes < 28) |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
205 return -1; |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
206 s->last_octet_count = s->octet_count; |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
207 |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
208 if (url_open_dyn_buf(&pb) < 0) |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
209 return -1; |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
210 |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
211 // Receiver Report |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
212 put_byte(pb, (RTP_VERSION << 6) + 1); /* 1 report block */ |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
213 put_byte(pb, 201); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
214 put_be16(pb, 7); /* length in words - 1 */ |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
215 put_be32(pb, s->ssrc); // our own SSRC |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
216 put_be32(pb, s->ssrc); // XXX: should be the server's here! |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
217 // some placeholders we should really fill... |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
218 // RFC 1889/p64 |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
219 extended_max= stats->cycles + stats->max_seq; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
220 expected= extended_max - stats->base_seq + 1; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
221 lost= expected - stats->received; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
222 lost= FFMIN(lost, 0xffffff); // clamp it since it's only 24 bits... |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
223 expected_interval= expected - stats->expected_prior; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
224 stats->expected_prior= expected; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
225 received_interval= stats->received - stats->received_prior; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
226 stats->received_prior= stats->received; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
227 lost_interval= expected_interval - received_interval; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
228 if (expected_interval==0 || lost_interval<=0) fraction= 0; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
229 else fraction = (lost_interval<<8)/expected_interval; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
230 |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
231 fraction= (fraction<<24) | lost; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
232 |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
233 put_be32(pb, fraction); /* 8 bits of fraction, 24 bits of total packets lost */ |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
234 put_be32(pb, extended_max); /* max sequence received */ |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
235 put_be32(pb, stats->jitter>>4); /* jitter */ |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
236 |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
237 if(s->last_rtcp_ntp_time==AV_NOPTS_VALUE) |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
238 { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
239 put_be32(pb, 0); /* last SR timestamp */ |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
240 put_be32(pb, 0); /* delay since last SR */ |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
241 } else { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
242 uint32_t middle_32_bits= s->last_rtcp_ntp_time>>16; // this is valid, right? do we need to handle 64 bit values special? |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
243 uint32_t delay_since_last= ntp_time - s->last_rtcp_ntp_time; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
244 |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
245 put_be32(pb, middle_32_bits); /* last SR timestamp */ |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
246 put_be32(pb, delay_since_last); /* delay since last SR */ |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
247 } |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
248 |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
249 // CNAME |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
250 put_byte(pb, (RTP_VERSION << 6) + 1); /* 1 report block */ |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
251 put_byte(pb, 202); |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
252 len = strlen(s->hostname); |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
253 put_be16(pb, (6 + len + 3) / 4); /* length in words - 1 */ |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
254 put_be32(pb, s->ssrc); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
255 put_byte(pb, 0x01); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
256 put_byte(pb, len); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
257 put_buffer(pb, s->hostname, len); |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
258 // padding |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
259 for (len = (6 + len) % 4; len % 4; len++) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
260 put_byte(pb, 0); |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
261 } |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
262 |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
263 put_flush_packet(pb); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
264 len = url_close_dyn_buf(pb, &buf); |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
265 if ((len > 0) && buf) { |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
266 int result; |
3579 | 267 dprintf(s->ic, "sending %d bytes of RR\n", len); |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
268 result= url_write(s->rtp_ctx, buf, len); |
3579 | 269 dprintf(s->ic, "result from url_write: %d\n", result); |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
270 av_free(buf); |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
271 } |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
272 return 0; |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
273 } |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
274 |
5665
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
275 void rtp_send_punch_packets(URLContext* rtp_handle) |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
276 { |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
277 ByteIOContext *pb; |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
278 uint8_t *buf; |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
279 int len; |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
280 |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
281 /* Send a small RTP packet */ |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
282 if (url_open_dyn_buf(&pb) < 0) |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
283 return; |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
284 |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
285 put_byte(pb, (RTP_VERSION << 6)); |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
286 put_byte(pb, 0); /* Payload type */ |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
287 put_be16(pb, 0); /* Seq */ |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
288 put_be32(pb, 0); /* Timestamp */ |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
289 put_be32(pb, 0); /* SSRC */ |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
290 |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
291 put_flush_packet(pb); |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
292 len = url_close_dyn_buf(pb, &buf); |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
293 if ((len > 0) && buf) |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
294 url_write(rtp_handle, buf, len); |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
295 av_free(buf); |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
296 |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
297 /* Send a minimal RTCP RR */ |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
298 if (url_open_dyn_buf(&pb) < 0) |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
299 return; |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
300 |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
301 put_byte(pb, (RTP_VERSION << 6)); |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
302 put_byte(pb, 201); /* receiver report */ |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
303 put_be16(pb, 1); /* length in words - 1 */ |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
304 put_be32(pb, 0); /* our own SSRC */ |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
305 |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
306 put_flush_packet(pb); |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
307 len = url_close_dyn_buf(pb, &buf); |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
308 if ((len > 0) && buf) |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
309 url_write(rtp_handle, buf, len); |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
310 av_free(buf); |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
311 } |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
312 |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
313 |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
314 /** |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
315 * open a new RTP parse context for stream 'st'. 'st' can be NULL for |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
316 * MPEG2TS streams to indicate that they should be demuxed inside the |
885 | 317 * rtp demux (otherwise CODEC_ID_MPEG2TS packets are returned) |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
318 */ |
6179
736165b749f8
RTSP, rtpdec: Move RTPPayloadData into rtpdec_mpeg4 and remove all references to rtp_payload_data in rtpdec and rtsp
mstorsjo
parents:
6178
diff
changeset
|
319 RTPDemuxContext *rtp_parse_open(AVFormatContext *s1, AVStream *st, URLContext *rtpc, int payload_type) |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
320 { |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
321 RTPDemuxContext *s; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
322 |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
323 s = av_mallocz(sizeof(RTPDemuxContext)); |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
324 if (!s) |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
325 return NULL; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
326 s->payload_type = payload_type; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
327 s->last_rtcp_ntp_time = AV_NOPTS_VALUE; |
5966
9a86b49201bb
Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext
mstorsjo
parents:
5937
diff
changeset
|
328 s->first_rtcp_ntp_time = AV_NOPTS_VALUE; |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
329 s->ic = s1; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
330 s->st = st; |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
331 rtp_init_statistics(&s->statistics, 0); // do we know the initial sequence from sdp? |
2759
b252e318023a
Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents:
2706
diff
changeset
|
332 if (!strcmp(ff_rtp_enc_name(payload_type), "MP2T")) { |
5619
072cb3a1d4a7
Fix warnings about implicit function declaration when compiling rtpdec.c
cehoyos
parents:
5601
diff
changeset
|
333 s->ts = ff_mpegts_parse_open(s->ic); |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
334 if (s->ts == NULL) { |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
335 av_free(s); |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
336 return NULL; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
337 } |
305 | 338 } else { |
3750
ff6f5f6d55e6
Do not set timestamp information for a non existing AVStream
lucabe
parents:
3722
diff
changeset
|
339 av_set_pts_info(st, 32, 1, 90000); |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
777
diff
changeset
|
340 switch(st->codec->codec_id) { |
305 | 341 case CODEC_ID_MPEG1VIDEO: |
342 case CODEC_ID_MPEG2VIDEO: | |
343 case CODEC_ID_MP2: | |
344 case CODEC_ID_MP3: | |
345 case CODEC_ID_MPEG4: | |
5601
96d885709963
Add RTP/H.263 depacketizer by Martin Storsj <$firstname () $firstname st>.
rbultje
parents:
5472
diff
changeset
|
346 case CODEC_ID_H263: |
1419 | 347 case CODEC_ID_H264: |
2023 | 348 st->need_parsing = AVSTREAM_PARSE_FULL; |
305 | 349 break; |
350 default: | |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5866
diff
changeset
|
351 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) { |
3534
e04ae2357e66
Fix A/V synch for RTP streams that do not contain MPEG1 or 2
lucabe
parents:
3286
diff
changeset
|
352 av_set_pts_info(st, 32, 1, st->codec->sample_rate); |
e04ae2357e66
Fix A/V synch for RTP streams that do not contain MPEG1 or 2
lucabe
parents:
3286
diff
changeset
|
353 } |
305 | 354 break; |
355 } | |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
356 } |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
357 // needed to send back RTCP RR in RTSP sessions |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
358 s->rtp_ctx = rtpc; |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
359 gethostname(s->hostname, sizeof(s->hostname)); |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
360 return s; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
361 } |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
362 |
3977
1f1c4535f421
Remove access into RTPDemuxContext in rtsp.c, which allows making it opaque
rbultje
parents:
3976
diff
changeset
|
363 void |
1f1c4535f421
Remove access into RTPDemuxContext in rtsp.c, which allows making it opaque
rbultje
parents:
3976
diff
changeset
|
364 rtp_parse_set_dynamic_protocol(RTPDemuxContext *s, PayloadContext *ctx, |
1f1c4535f421
Remove access into RTPDemuxContext in rtsp.c, which allows making it opaque
rbultje
parents:
3976
diff
changeset
|
365 RTPDynamicProtocolHandler *handler) |
1f1c4535f421
Remove access into RTPDemuxContext in rtsp.c, which allows making it opaque
rbultje
parents:
3976
diff
changeset
|
366 { |
1f1c4535f421
Remove access into RTPDemuxContext in rtsp.c, which allows making it opaque
rbultje
parents:
3976
diff
changeset
|
367 s->dynamic_protocol_context = ctx; |
1f1c4535f421
Remove access into RTPDemuxContext in rtsp.c, which allows making it opaque
rbultje
parents:
3976
diff
changeset
|
368 s->parse_packet = handler->parse_packet; |
1f1c4535f421
Remove access into RTPDemuxContext in rtsp.c, which allows making it opaque
rbultje
parents:
3976
diff
changeset
|
369 } |
1f1c4535f421
Remove access into RTPDemuxContext in rtsp.c, which allows making it opaque
rbultje
parents:
3976
diff
changeset
|
370 |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
371 /** |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
372 * This was the second switch in rtp_parse packet. Normalizes time, if required, sets stream_index, etc. |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
373 */ |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
374 static void finalize_packet(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestamp) |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
375 { |
3535 | 376 if (s->last_rtcp_ntp_time != AV_NOPTS_VALUE) { |
377 int64_t addend; | |
378 int delta_timestamp; | |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
379 |
3535 | 380 /* compute pts from timestamp with received ntp_time */ |
381 delta_timestamp = timestamp - s->last_rtcp_timestamp; | |
382 /* convert to the PTS timebase */ | |
5966
9a86b49201bb
Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext
mstorsjo
parents:
5937
diff
changeset
|
383 addend = av_rescale(s->last_rtcp_ntp_time - s->first_rtcp_ntp_time, s->st->time_base.den, (uint64_t)s->st->time_base.num << 32); |
5967
c5a3e1951fc6
Reset RTCP timestamps after seeking, add range start offset to the packets timestamps
mstorsjo
parents:
5966
diff
changeset
|
384 pkt->pts = s->range_start_offset + addend + delta_timestamp; |
3535 | 385 } |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
386 } |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
387 |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
388 /** |
885 | 389 * Parse an RTP or RTCP packet directly sent as a buffer. |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
390 * @param s RTP parse context. |
0 | 391 * @param pkt returned packet |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
392 * @param buf input buffer or NULL to read the next packets |
0 | 393 * @param len buffer len |
885 | 394 * @return 0 if a packet is returned, 1 if a packet is returned and more can follow |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
395 * (use buf as NULL to read the next). -1 if no packet (error or no more packet). |
0 | 396 */ |
885 | 397 int rtp_parse_packet(RTPDemuxContext *s, AVPacket *pkt, |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
398 const uint8_t *buf, int len) |
0 | 399 { |
400 unsigned int ssrc, h; | |
2941
6da0564c9d02
Add a flags field to the RTPDynamicPayloadPacketHandlerProc (PKT_FLAG_*).
rbultje
parents:
2918
diff
changeset
|
401 int payload_type, seq, ret, flags = 0; |
0 | 402 AVStream *st; |
65 | 403 uint32_t timestamp; |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
404 int rv= 0; |
885 | 405 |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
406 if (!buf) { |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
407 /* return the next packets, if any */ |
1419 | 408 if(s->st && s->parse_packet) { |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
409 timestamp= 0; ///< Should not be used if buf is NULL, but should be set to the timestamp of the packet returned.... |
4387
5c42816e12c6
Add "AVFormatContext *ctx" (that being the RTSP demuxer's) as first argument
rbultje
parents:
4291
diff
changeset
|
410 rv= s->parse_packet(s->ic, s->dynamic_protocol_context, |
3976
64056a0c38ce
Change function prototype of RTPDynamicPayloadHandler.parse_packet() to
rbultje
parents:
3955
diff
changeset
|
411 s->st, pkt, ×tamp, NULL, 0, flags); |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
412 finalize_packet(s, pkt, timestamp); |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
413 return rv; |
1419 | 414 } else { |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
415 // TODO: Move to a dynamic packet handler (like above) |
1424
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
416 if (s->read_buf_index >= s->read_buf_size) |
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
417 return -1; |
5619
072cb3a1d4a7
Fix warnings about implicit function declaration when compiling rtpdec.c
cehoyos
parents:
5601
diff
changeset
|
418 ret = ff_mpegts_parse_packet(s->ts, pkt, s->buf + s->read_buf_index, |
1424
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
419 s->read_buf_size - s->read_buf_index); |
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
420 if (ret < 0) |
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
421 return -1; |
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
422 s->read_buf_index += ret; |
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
423 if (s->read_buf_index < s->read_buf_size) |
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
424 return 1; |
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
425 else |
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
426 return 0; |
1419 | 427 } |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
428 } |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
429 |
0 | 430 if (len < 12) |
431 return -1; | |
432 | |
433 if ((buf[0] & 0xc0) != (RTP_VERSION << 6)) | |
434 return -1; | |
435 if (buf[1] >= 200 && buf[1] <= 204) { | |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
436 rtcp_parse_packet(s, buf, len); |
0 | 437 return -1; |
438 } | |
439 payload_type = buf[1] & 0x7f; | |
4590
85c7d517d556
Implement marker bit, which is used for several RTP payloads currently
rbultje
parents:
4388
diff
changeset
|
440 if (buf[1] & 0x80) |
85c7d517d556
Implement marker bit, which is used for several RTP payloads currently
rbultje
parents:
4388
diff
changeset
|
441 flags |= RTP_FLAG_MARKER; |
2222 | 442 seq = AV_RB16(buf + 2); |
2167
c4244900f986
remove decode_be32/64 and replace them by AV_RB32/64
benoit
parents:
2164
diff
changeset
|
443 timestamp = AV_RB32(buf + 4); |
c4244900f986
remove decode_be32/64 and replace them by AV_RB32/64
benoit
parents:
2164
diff
changeset
|
444 ssrc = AV_RB32(buf + 8); |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
445 /* store the ssrc in the RTPDemuxContext */ |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
446 s->ssrc = ssrc; |
885 | 447 |
0 | 448 /* NOTE: we can handle only one payload type */ |
449 if (s->payload_type != payload_type) | |
450 return -1; | |
986
f5194ed612b5
fix debug code: do not try to take st->codec if st is NULL. This makes ffplay give me pics from FreeBoxTV \o/
mmu_man
parents:
896
diff
changeset
|
451 |
f5194ed612b5
fix debug code: do not try to take st->codec if st is NULL. This makes ffplay give me pics from FreeBoxTV \o/
mmu_man
parents:
896
diff
changeset
|
452 st = s->st; |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
453 // only do something with this if all the rtp checks pass... |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
454 if(!rtp_valid_packet_in_sequence(&s->statistics, seq)) |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
455 { |
986
f5194ed612b5
fix debug code: do not try to take st->codec if st is NULL. This makes ffplay give me pics from FreeBoxTV \o/
mmu_man
parents:
896
diff
changeset
|
456 av_log(st?st->codec:NULL, AV_LOG_ERROR, "RTP: PT=%02x: bad cseq %04x expected=%04x\n", |
0 | 457 payload_type, seq, ((s->seq + 1) & 0xffff)); |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
458 return -1; |
0 | 459 } |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
460 |
0 | 461 s->seq = seq; |
462 len -= 12; | |
463 buf += 12; | |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
464 |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
465 if (!st) { |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
466 /* specific MPEG2TS demux support */ |
5619
072cb3a1d4a7
Fix warnings about implicit function declaration when compiling rtpdec.c
cehoyos
parents:
5601
diff
changeset
|
467 ret = ff_mpegts_parse_packet(s->ts, pkt, buf, len); |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
468 if (ret < 0) |
0 | 469 return -1; |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
470 if (ret < len) { |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
471 s->read_buf_size = len - ret; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
472 memcpy(s->buf, buf + ret, s->read_buf_size); |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
473 s->read_buf_index = 0; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
474 return 1; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
475 } |
4631
4bbf1fe0796b
In the current implementation of rtp_parse_packet(), finalize_packet() is
rbultje
parents:
4590
diff
changeset
|
476 return 0; |
2917
62ff44e23c10
Make rtp_parse_packet() always call the vfunc of the dynamic payload handler
rbultje
parents:
2891
diff
changeset
|
477 } else if (s->parse_packet) { |
4387
5c42816e12c6
Add "AVFormatContext *ctx" (that being the RTSP demuxer's) as first argument
rbultje
parents:
4291
diff
changeset
|
478 rv = s->parse_packet(s->ic, s->dynamic_protocol_context, |
3976
64056a0c38ce
Change function prototype of RTPDynamicPayloadHandler.parse_packet() to
rbultje
parents:
3955
diff
changeset
|
479 s->st, pkt, ×tamp, buf, len, flags); |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
480 } else { |
1419 | 481 // at this point, the RTP header has been stripped; This is ASSUMING that there is only 1 CSRC, which in't wise. |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
777
diff
changeset
|
482 switch(st->codec->codec_id) { |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
483 case CODEC_ID_MP2: |
5472 | 484 case CODEC_ID_MP3: |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
485 /* better than nothing: skip mpeg audio RTP header */ |
0 | 486 if (len <= 4) |
487 return -1; | |
2167
c4244900f986
remove decode_be32/64 and replace them by AV_RB32/64
benoit
parents:
2164
diff
changeset
|
488 h = AV_RB32(buf); |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
489 len -= 4; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
490 buf += 4; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
491 av_new_packet(pkt, len); |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
492 memcpy(pkt->data, buf, len); |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
493 break; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
494 case CODEC_ID_MPEG1VIDEO: |
2760 | 495 case CODEC_ID_MPEG2VIDEO: |
305 | 496 /* better than nothing: skip mpeg video RTP header */ |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
497 if (len <= 4) |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
498 return -1; |
2167
c4244900f986
remove decode_be32/64 and replace them by AV_RB32/64
benoit
parents:
2164
diff
changeset
|
499 h = AV_RB32(buf); |
0 | 500 buf += 4; |
501 len -= 4; | |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
502 if (h & (1 << 26)) { |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
503 /* mpeg2 */ |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
504 if (len <= 4) |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
505 return -1; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
506 buf += 4; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
507 len -= 4; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
508 } |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
509 av_new_packet(pkt, len); |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
510 memcpy(pkt->data, buf, len); |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
511 break; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
512 default: |
2918
9e85e46922b5
Reindent after r11493 (always use parse_packet() vfunc in rtp_parse_packet()),
rbultje
parents:
2917
diff
changeset
|
513 av_new_packet(pkt, len); |
9e85e46922b5
Reindent after r11493 (always use parse_packet() vfunc in rtp_parse_packet()),
rbultje
parents:
2917
diff
changeset
|
514 memcpy(pkt->data, buf, len); |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
515 break; |
0 | 516 } |
4633
0c69b895a01f
Don't let finalize_packet() touch pkt->stream_index. Instead, let individual
rbultje
parents:
4632
diff
changeset
|
517 |
0c69b895a01f
Don't let finalize_packet() touch pkt->stream_index. Instead, let individual
rbultje
parents:
4632
diff
changeset
|
518 pkt->stream_index = st->index; |
4631
4bbf1fe0796b
In the current implementation of rtp_parse_packet(), finalize_packet() is
rbultje
parents:
4590
diff
changeset
|
519 } |
885 | 520 |
4632 | 521 // now perform timestamp things.... |
522 finalize_packet(s, pkt, timestamp); | |
4631
4bbf1fe0796b
In the current implementation of rtp_parse_packet(), finalize_packet() is
rbultje
parents:
4590
diff
changeset
|
523 |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
524 return rv; |
0 | 525 } |
526 | |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
527 void rtp_parse_close(RTPDemuxContext *s) |
0 | 528 { |
2759
b252e318023a
Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents:
2706
diff
changeset
|
529 if (!strcmp(ff_rtp_enc_name(s->payload_type), "MP2T")) { |
5619
072cb3a1d4a7
Fix warnings about implicit function declaration when compiling rtpdec.c
cehoyos
parents:
5601
diff
changeset
|
530 ff_mpegts_parse_close(s->ts); |
0 | 531 } |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
532 av_free(s); |
0 | 533 } |
6187
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
534 |
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
535 int ff_parse_fmtp(AVStream *stream, PayloadContext *data, const char *p, |
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
536 int (*parse_fmtp)(AVStream *stream, |
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
537 PayloadContext *data, |
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
538 char *attr, char *value)) |
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
539 { |
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
540 char attr[256]; |
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
541 char value[4096]; |
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
542 int res; |
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
543 |
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
544 // remove protocol identifier |
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
545 while (*p && *p == ' ') p++; // strip spaces |
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
546 while (*p && *p != ' ') p++; // eat protocol identifier |
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
547 while (*p && *p == ' ') p++; // strip trailing spaces |
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
548 |
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
549 while (ff_rtsp_next_attr_and_value(&p, |
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
550 attr, sizeof(attr), |
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
551 value, sizeof(value))) { |
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
552 |
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
553 res = parse_fmtp(stream, data, attr, value); |
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
554 if (res < 0) |
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
555 return res; |
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
556 } |
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
557 return 0; |
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
558 } |