Mercurial > libavformat.hg
annotate rtpdec.c @ 6260:5c17c20dd67a libavformat
In ogg muxer, use dyn buffer to compute crc of the page, fix muxing with pipe
when page buffer is bigger than default buffer size. Max page is 65k.
| author | bcoudurier |
|---|---|
| date | Wed, 14 Jul 2010 23:21:18 +0000 |
| parents | 0689434db2c6 |
| children | 491eea5c52d6 |
| 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" |
| 6257 | 38 #include "rtpdec_qdm2.h" |
| 6208 | 39 #include "rtpdec_svq3.h" |
|
5918
e3b4d7181606
Rename rtpdec_theora.[ch] to rtpdec_xiph.[ch], as a preparation for merging
rbultje
parents:
5910
diff
changeset
|
40 #include "rtpdec_xiph.h" |
| 1419 | 41 |
| 0 | 42 //#define DEBUG |
| 43 | |
| 44 /* TODO: - add RTCP statistics reporting (should be optional). | |
| 45 | |
| 46 - add support for h263/mpeg4 packetized output : IDEA: send a | |
| 47 buffer to 'rtp_write_packet' contains all the packets for ONE | |
| 48 frame. Each packet should have a four byte header containing | |
| 49 the length in big endian format (same trick as | |
| 885 | 50 'url_open_dyn_packet_buf') |
| 0 | 51 */ |
| 52 | |
| 1419 | 53 /* statistics functions */ |
| 54 RTPDynamicProtocolHandler *RTPFirstDynamicPayloadHandler= NULL; | |
| 55 | |
|
3901
f936c4b8b96d
Give register_dynamic_payload_handler() in rtpdec.c a ff_ prefix and export
rbultje
parents:
3750
diff
changeset
|
56 void ff_register_dynamic_payload_handler(RTPDynamicProtocolHandler *handler) |
| 1419 | 57 { |
| 58 handler->next= RTPFirstDynamicPayloadHandler; | |
| 59 RTPFirstDynamicPayloadHandler= handler; | |
| 60 } | |
| 885 | 61 |
|
1983
fbc66bf1f15d
changes some function declarations from () to (void) as per ansi c.
gpoirier
parents:
1857
diff
changeset
|
62 void av_register_rtp_dynamic_payload_handlers(void) |
| 1419 | 63 { |
|
6176
5708c6d4223d
RTSP: Decouple MPEG-4 and AAC specific parts from rtsp.c
mstorsjo
parents:
5967
diff
changeset
|
64 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
|
65 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
|
66 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
|
67 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
|
68 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
|
69 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
|
70 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
|
71 ff_register_dynamic_payload_handler(&ff_vorbis_dynamic_handler); |
| 5866 | 72 ff_register_dynamic_payload_handler(&ff_theora_dynamic_handler); |
| 6257 | 73 ff_register_dynamic_payload_handler(&ff_qdm2_dynamic_handler); |
| 6208 | 74 ff_register_dynamic_payload_handler(&ff_svq3_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
|
75 |
|
c78617194786
Assign the x-pf-asf payload string to be decoded by rtp_asf.c, and add a
rbultje
parents:
4633
diff
changeset
|
76 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
|
77 ff_register_dynamic_payload_handler(&ff_ms_rtp_asf_pfa_handler); |
| 1419 | 78 } |
| 0 | 79 |
|
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
80 static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf, int len) |
| 0 | 81 { |
| 82 if (buf[1] != 200) | |
| 83 return -1; | |
|
2167
c4244900f986
remove decode_be32/64 and replace them by AV_RB32/64
benoit
parents:
2164
diff
changeset
|
84 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
|
85 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
|
86 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
|
87 s->last_rtcp_timestamp = AV_RB32(buf + 16); |
| 0 | 88 return 0; |
| 89 } | |
| 90 | |
|
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
91 #define RTP_SEQ_MOD (1<<16) |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
92 |
|
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 * called on parse open packet |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
95 */ |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
96 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
|
97 { |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
98 memset(s, 0, sizeof(RTPStatistics)); |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
99 s->max_seq= base_sequence; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
100 s->probation= 1; |
|
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 |
|
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 * 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
|
105 */ |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
106 static void rtp_init_sequence(RTPStatistics *s, uint16_t seq) |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
107 { |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
108 s->max_seq= seq; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
109 s->cycles= 0; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
110 s->base_seq= seq -1; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
111 s->bad_seq= RTP_SEQ_MOD + 1; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
112 s->received= 0; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
113 s->expected_prior= 0; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
114 s->received_prior= 0; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
115 s->jitter= 0; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
116 s->transit= 0; |
|
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 |
|
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 * returns 1 if we should handle this packet. |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
121 */ |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
122 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
|
123 { |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
124 uint16_t udelta= seq - s->max_seq; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
125 const int MAX_DROPOUT= 3000; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
126 const int MAX_MISORDER = 100; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
127 const int MIN_SEQUENTIAL = 2; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
128 |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
129 /* 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
|
130 if(s->probation) |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
131 { |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
132 if(seq==s->max_seq + 1) { |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
133 s->probation--; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
134 s->max_seq= seq; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
135 if(s->probation==0) { |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
136 rtp_init_sequence(s, seq); |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
137 s->received++; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
138 return 1; |
|
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 { |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
141 s->probation= MIN_SEQUENTIAL - 1; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
142 s->max_seq = seq; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
143 } |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
144 } else if (udelta < MAX_DROPOUT) { |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
145 // in order, with permissible gap |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
146 if(seq < s->max_seq) { |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
147 //sequence number wrapped; count antother 64k cycles |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
148 s->cycles += RTP_SEQ_MOD; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
149 } |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
150 s->max_seq= seq; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
151 } else if (udelta <= RTP_SEQ_MOD - MAX_MISORDER) { |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
152 // sequence made a large jump... |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
153 if(seq==s->bad_seq) { |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
154 // 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
|
155 rtp_init_sequence(s, seq); |
|
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 s->bad_seq= (seq + 1) & (RTP_SEQ_MOD-1); |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
158 return 0; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
159 } |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
160 } else { |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
161 // duplicate or reordered packet... |
|
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 s->received++; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
164 return 1; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
165 } |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
166 |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
167 #if 0 |
|
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 * 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
|
170 * 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
|
171 * 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
|
172 */ |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
173 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
|
174 { |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
175 uint32_t transit= arrival_timestamp - sent_timestamp; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
176 int d; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
177 s->transit= transit; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
178 d= FFABS(transit - s->transit); |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
179 s->jitter += d - ((s->jitter + 8)>>4); |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
180 } |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
181 #endif |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
182 |
|
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
183 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
|
184 { |
|
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
185 ByteIOContext *pb; |
|
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
186 uint8_t *buf; |
|
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
187 int len; |
|
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
188 int rtcp_bytes; |
|
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
189 RTPStatistics *stats= &s->statistics; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
190 uint32_t lost; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
191 uint32_t extended_max; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
192 uint32_t expected_interval; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
193 uint32_t received_interval; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
194 uint32_t lost_interval; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
195 uint32_t expected; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
196 uint32_t fraction; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
197 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
|
198 |
|
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
199 if (!s->rtp_ctx || (count < 1)) |
|
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
200 return -1; |
|
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
201 |
|
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
202 /* 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
|
203 /* 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
|
204 s->octet_count += count; |
|
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
205 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
|
206 RTCP_TX_RATIO_DEN; |
|
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
207 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
|
208 if (rtcp_bytes < 28) |
|
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 s->last_octet_count = s->octet_count; |
|
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
211 |
|
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
212 if (url_open_dyn_buf(&pb) < 0) |
|
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
213 return -1; |
|
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
214 |
|
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
215 // Receiver Report |
|
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
216 put_byte(pb, (RTP_VERSION << 6) + 1); /* 1 report block */ |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
217 put_byte(pb, 201); |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
218 put_be16(pb, 7); /* length in words - 1 */ |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
219 put_be32(pb, s->ssrc); // our own SSRC |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
220 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
|
221 // some placeholders we should really fill... |
|
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
222 // RFC 1889/p64 |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
223 extended_max= stats->cycles + stats->max_seq; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
224 expected= extended_max - stats->base_seq + 1; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
225 lost= expected - stats->received; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
226 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
|
227 expected_interval= expected - stats->expected_prior; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
228 stats->expected_prior= expected; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
229 received_interval= stats->received - stats->received_prior; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
230 stats->received_prior= stats->received; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
231 lost_interval= expected_interval - received_interval; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
232 if (expected_interval==0 || lost_interval<=0) fraction= 0; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
233 else fraction = (lost_interval<<8)/expected_interval; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
234 |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
235 fraction= (fraction<<24) | lost; |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
236 |
|
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
237 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
|
238 put_be32(pb, extended_max); /* max sequence received */ |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
239 put_be32(pb, stats->jitter>>4); /* jitter */ |
|
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
240 |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
241 if(s->last_rtcp_ntp_time==AV_NOPTS_VALUE) |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
242 { |
|
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
243 put_be32(pb, 0); /* last SR timestamp */ |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
244 put_be32(pb, 0); /* delay since last SR */ |
|
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
245 } else { |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
246 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
|
247 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
|
248 |
|
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
249 put_be32(pb, middle_32_bits); /* last SR timestamp */ |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
250 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
|
251 } |
|
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
252 |
|
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
253 // CNAME |
|
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
254 put_byte(pb, (RTP_VERSION << 6) + 1); /* 1 report block */ |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
255 put_byte(pb, 202); |
|
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
256 len = strlen(s->hostname); |
|
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
257 put_be16(pb, (6 + len + 3) / 4); /* length in words - 1 */ |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
258 put_be32(pb, s->ssrc); |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
259 put_byte(pb, 0x01); |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
260 put_byte(pb, len); |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
261 put_buffer(pb, s->hostname, len); |
|
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
262 // padding |
|
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
263 for (len = (6 + len) % 4; len % 4; len++) { |
|
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
264 put_byte(pb, 0); |
|
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
265 } |
|
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
266 |
|
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
267 put_flush_packet(pb); |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
268 len = url_close_dyn_buf(pb, &buf); |
|
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
269 if ((len > 0) && buf) { |
|
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
270 int result; |
| 3579 | 271 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
|
272 result= url_write(s->rtp_ctx, buf, len); |
| 3579 | 273 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
|
274 av_free(buf); |
|
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
275 } |
|
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
276 return 0; |
|
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
277 } |
|
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
278 |
|
5665
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
279 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
|
280 { |
|
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
281 ByteIOContext *pb; |
|
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
282 uint8_t *buf; |
|
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
283 int len; |
|
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 /* Send a small RTP packet */ |
|
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
286 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
|
287 return; |
|
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
288 |
|
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
289 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
|
290 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
|
291 put_be16(pb, 0); /* Seq */ |
|
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
292 put_be32(pb, 0); /* Timestamp */ |
|
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
293 put_be32(pb, 0); /* SSRC */ |
|
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
294 |
|
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
295 put_flush_packet(pb); |
|
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
296 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
|
297 if ((len > 0) && buf) |
|
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
298 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
|
299 av_free(buf); |
|
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 /* Send a minimal RTCP RR */ |
|
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
302 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
|
303 return; |
|
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
304 |
|
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
305 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
|
306 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
|
307 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
|
308 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
|
309 |
|
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
310 put_flush_packet(pb); |
|
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
311 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
|
312 if ((len > 0) && buf) |
|
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
313 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
|
314 av_free(buf); |
|
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
315 } |
|
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
316 |
|
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
317 |
|
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
318 /** |
|
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
319 * 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
|
320 * MPEG2TS streams to indicate that they should be demuxed inside the |
| 885 | 321 * 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
|
322 */ |
|
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
|
323 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
|
324 { |
|
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
325 RTPDemuxContext *s; |
|
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
326 |
|
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
327 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
|
328 if (!s) |
|
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
329 return NULL; |
|
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
330 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
|
331 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
|
332 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
|
333 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
|
334 s->st = st; |
|
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
335 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
|
336 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
|
337 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
|
338 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
|
339 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
|
340 return NULL; |
|
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
341 } |
| 305 | 342 } else { |
|
3750
ff6f5f6d55e6
Do not set timestamp information for a non existing AVStream
lucabe
parents:
3722
diff
changeset
|
343 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
|
344 switch(st->codec->codec_id) { |
| 305 | 345 case CODEC_ID_MPEG1VIDEO: |
| 346 case CODEC_ID_MPEG2VIDEO: | |
| 347 case CODEC_ID_MP2: | |
| 348 case CODEC_ID_MP3: | |
| 349 case CODEC_ID_MPEG4: | |
|
5601
96d885709963
Add RTP/H.263 depacketizer by Martin Storsj? <$firstname () $firstname st>.
rbultje
parents:
5472
diff
changeset
|
350 case CODEC_ID_H263: |
| 1419 | 351 case CODEC_ID_H264: |
| 2023 | 352 st->need_parsing = AVSTREAM_PARSE_FULL; |
| 305 | 353 break; |
| 354 default: | |
|
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5866
diff
changeset
|
355 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
|
356 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
|
357 } |
| 305 | 358 break; |
| 359 } | |
|
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
360 } |
|
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
361 // 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
|
362 s->rtp_ctx = rtpc; |
|
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
363 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
|
364 return s; |
|
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
365 } |
|
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
366 |
|
3977
1f1c4535f421
Remove access into RTPDemuxContext in rtsp.c, which allows making it opaque
rbultje
parents:
3976
diff
changeset
|
367 void |
|
1f1c4535f421
Remove access into RTPDemuxContext in rtsp.c, which allows making it opaque
rbultje
parents:
3976
diff
changeset
|
368 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
|
369 RTPDynamicProtocolHandler *handler) |
|
1f1c4535f421
Remove access into RTPDemuxContext in rtsp.c, which allows making it opaque
rbultje
parents:
3976
diff
changeset
|
370 { |
|
1f1c4535f421
Remove access into RTPDemuxContext in rtsp.c, which allows making it opaque
rbultje
parents:
3976
diff
changeset
|
371 s->dynamic_protocol_context = ctx; |
|
1f1c4535f421
Remove access into RTPDemuxContext in rtsp.c, which allows making it opaque
rbultje
parents:
3976
diff
changeset
|
372 s->parse_packet = handler->parse_packet; |
|
1f1c4535f421
Remove access into RTPDemuxContext in rtsp.c, which allows making it opaque
rbultje
parents:
3976
diff
changeset
|
373 } |
|
1f1c4535f421
Remove access into RTPDemuxContext in rtsp.c, which allows making it opaque
rbultje
parents:
3976
diff
changeset
|
374 |
|
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
375 /** |
|
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
376 * 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
|
377 */ |
|
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
378 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
|
379 { |
|
6255
e87b379e8816
rtpdec: Allow depacketizers to specify that pkt->pts should be left as AV_NOPTS_VALUE
mstorsjo
parents:
6208
diff
changeset
|
380 if (s->last_rtcp_ntp_time != AV_NOPTS_VALUE && timestamp != RTP_NOTS_VALUE) { |
| 3535 | 381 int64_t addend; |
| 382 int delta_timestamp; | |
|
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
383 |
| 3535 | 384 /* compute pts from timestamp with received ntp_time */ |
| 385 delta_timestamp = timestamp - s->last_rtcp_timestamp; | |
| 386 /* convert to the PTS timebase */ | |
|
5966
9a86b49201bb
Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext
mstorsjo
parents:
5937
diff
changeset
|
387 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
|
388 pkt->pts = s->range_start_offset + addend + delta_timestamp; |
| 3535 | 389 } |
|
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
390 } |
|
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
391 |
|
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
392 /** |
| 885 | 393 * 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
|
394 * @param s RTP parse context. |
| 0 | 395 * @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
|
396 * @param buf input buffer or NULL to read the next packets |
| 0 | 397 * @param len buffer len |
| 885 | 398 * @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
|
399 * (use buf as NULL to read the next). -1 if no packet (error or no more packet). |
| 0 | 400 */ |
| 885 | 401 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
|
402 const uint8_t *buf, int len) |
| 0 | 403 { |
| 404 unsigned int ssrc, h; | |
|
2941
6da0564c9d02
Add a flags field to the RTPDynamicPayloadPacketHandlerProc (PKT_FLAG_*).
rbultje
parents:
2918
diff
changeset
|
405 int payload_type, seq, ret, flags = 0; |
| 0 | 406 AVStream *st; |
| 65 | 407 uint32_t timestamp; |
|
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
408 int rv= 0; |
| 885 | 409 |
|
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
410 if (!buf) { |
|
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
411 /* return the next packets, if any */ |
| 1419 | 412 if(s->st && s->parse_packet) { |
|
6255
e87b379e8816
rtpdec: Allow depacketizers to specify that pkt->pts should be left as AV_NOPTS_VALUE
mstorsjo
parents:
6208
diff
changeset
|
413 /* timestamp should be overwritten by parse_packet, if not, |
|
e87b379e8816
rtpdec: Allow depacketizers to specify that pkt->pts should be left as AV_NOPTS_VALUE
mstorsjo
parents:
6208
diff
changeset
|
414 * the packet is left with pts == AV_NOPTS_VALUE */ |
|
e87b379e8816
rtpdec: Allow depacketizers to specify that pkt->pts should be left as AV_NOPTS_VALUE
mstorsjo
parents:
6208
diff
changeset
|
415 timestamp = RTP_NOTS_VALUE; |
|
4387
5c42816e12c6
Add "AVFormatContext *ctx" (that being the RTSP demuxer's) as first argument
rbultje
parents:
4291
diff
changeset
|
416 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
|
417 s->st, pkt, ×tamp, NULL, 0, flags); |
|
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
418 finalize_packet(s, pkt, timestamp); |
|
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
419 return rv; |
| 1419 | 420 } else { |
|
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
421 // 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
|
422 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
|
423 return -1; |
|
5619
072cb3a1d4a7
Fix warnings about implicit function declaration when compiling rtpdec.c
cehoyos
parents:
5601
diff
changeset
|
424 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
|
425 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
|
426 if (ret < 0) |
|
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
427 return -1; |
|
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
428 s->read_buf_index += ret; |
|
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
429 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
|
430 return 1; |
|
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
431 else |
|
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
432 return 0; |
| 1419 | 433 } |
|
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
434 } |
|
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
435 |
| 0 | 436 if (len < 12) |
| 437 return -1; | |
| 438 | |
| 439 if ((buf[0] & 0xc0) != (RTP_VERSION << 6)) | |
| 440 return -1; | |
| 441 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
|
442 rtcp_parse_packet(s, buf, len); |
| 0 | 443 return -1; |
| 444 } | |
| 445 payload_type = buf[1] & 0x7f; | |
|
4590
85c7d517d556
Implement marker bit, which is used for several RTP payloads currently
rbultje
parents:
4388
diff
changeset
|
446 if (buf[1] & 0x80) |
|
85c7d517d556
Implement marker bit, which is used for several RTP payloads currently
rbultje
parents:
4388
diff
changeset
|
447 flags |= RTP_FLAG_MARKER; |
| 2222 | 448 seq = AV_RB16(buf + 2); |
|
2167
c4244900f986
remove decode_be32/64 and replace them by AV_RB32/64
benoit
parents:
2164
diff
changeset
|
449 timestamp = AV_RB32(buf + 4); |
|
c4244900f986
remove decode_be32/64 and replace them by AV_RB32/64
benoit
parents:
2164
diff
changeset
|
450 ssrc = AV_RB32(buf + 8); |
|
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
451 /* store the ssrc in the RTPDemuxContext */ |
|
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
452 s->ssrc = ssrc; |
| 885 | 453 |
| 0 | 454 /* NOTE: we can handle only one payload type */ |
| 455 if (s->payload_type != payload_type) | |
| 456 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
|
457 |
|
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
|
458 st = s->st; |
|
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
459 // 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
|
460 if(!rtp_valid_packet_in_sequence(&s->statistics, seq)) |
|
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
461 { |
|
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
|
462 av_log(st?st->codec:NULL, AV_LOG_ERROR, "RTP: PT=%02x: bad cseq %04x expected=%04x\n", |
| 0 | 463 payload_type, seq, ((s->seq + 1) & 0xffff)); |
|
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
464 return -1; |
| 0 | 465 } |
|
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
466 |
| 0 | 467 s->seq = seq; |
| 468 len -= 12; | |
| 469 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
|
470 |
|
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
471 if (!st) { |
|
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
472 /* specific MPEG2TS demux support */ |
|
5619
072cb3a1d4a7
Fix warnings about implicit function declaration when compiling rtpdec.c
cehoyos
parents:
5601
diff
changeset
|
473 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
|
474 if (ret < 0) |
| 0 | 475 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
|
476 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
|
477 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
|
478 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
|
479 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
|
480 return 1; |
|
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
481 } |
|
4631
4bbf1fe0796b
In the current implementation of rtp_parse_packet(), finalize_packet() is
rbultje
parents:
4590
diff
changeset
|
482 return 0; |
|
2917
62ff44e23c10
Make rtp_parse_packet() always call the vfunc of the dynamic payload handler
rbultje
parents:
2891
diff
changeset
|
483 } else if (s->parse_packet) { |
|
4387
5c42816e12c6
Add "AVFormatContext *ctx" (that being the RTSP demuxer's) as first argument
rbultje
parents:
4291
diff
changeset
|
484 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
|
485 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
|
486 } else { |
| 1419 | 487 // 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
|
488 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
|
489 case CODEC_ID_MP2: |
| 5472 | 490 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
|
491 /* better than nothing: skip mpeg audio RTP header */ |
| 0 | 492 if (len <= 4) |
| 493 return -1; | |
|
2167
c4244900f986
remove decode_be32/64 and replace them by AV_RB32/64
benoit
parents:
2164
diff
changeset
|
494 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
|
495 len -= 4; |
|
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
496 buf += 4; |
|
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
497 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
|
498 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
|
499 break; |
|
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
500 case CODEC_ID_MPEG1VIDEO: |
| 2760 | 501 case CODEC_ID_MPEG2VIDEO: |
| 305 | 502 /* 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
|
503 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
|
504 return -1; |
|
2167
c4244900f986
remove decode_be32/64 and replace them by AV_RB32/64
benoit
parents:
2164
diff
changeset
|
505 h = AV_RB32(buf); |
| 0 | 506 buf += 4; |
| 507 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
|
508 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
|
509 /* mpeg2 */ |
|
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
510 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
|
511 return -1; |
|
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
512 buf += 4; |
|
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
513 len -= 4; |
|
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
514 } |
|
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
515 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
|
516 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
|
517 break; |
|
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
518 default: |
|
2918
9e85e46922b5
Reindent after r11493 (always use parse_packet() vfunc in rtp_parse_packet()),
rbultje
parents:
2917
diff
changeset
|
519 av_new_packet(pkt, len); |
|
9e85e46922b5
Reindent after r11493 (always use parse_packet() vfunc in rtp_parse_packet()),
rbultje
parents:
2917
diff
changeset
|
520 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
|
521 break; |
| 0 | 522 } |
|
4633
0c69b895a01f
Don't let finalize_packet() touch pkt->stream_index. Instead, let individual
rbultje
parents:
4632
diff
changeset
|
523 |
|
0c69b895a01f
Don't let finalize_packet() touch pkt->stream_index. Instead, let individual
rbultje
parents:
4632
diff
changeset
|
524 pkt->stream_index = st->index; |
|
4631
4bbf1fe0796b
In the current implementation of rtp_parse_packet(), finalize_packet() is
rbultje
parents:
4590
diff
changeset
|
525 } |
| 885 | 526 |
| 4632 | 527 // now perform timestamp things.... |
| 528 finalize_packet(s, pkt, timestamp); | |
|
4631
4bbf1fe0796b
In the current implementation of rtp_parse_packet(), finalize_packet() is
rbultje
parents:
4590
diff
changeset
|
529 |
|
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
530 return rv; |
| 0 | 531 } |
| 532 | |
|
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
533 void rtp_parse_close(RTPDemuxContext *s) |
| 0 | 534 { |
|
2759
b252e318023a
Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents:
2706
diff
changeset
|
535 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
|
536 ff_mpegts_parse_close(s->ts); |
| 0 | 537 } |
|
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
538 av_free(s); |
| 0 | 539 } |
|
6187
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
540 |
|
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
541 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
|
542 int (*parse_fmtp)(AVStream *stream, |
|
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
543 PayloadContext *data, |
|
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
544 char *attr, char *value)) |
|
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
545 { |
|
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
546 char attr[256]; |
| 6193 | 547 char *value; |
|
6187
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
548 int res; |
| 6193 | 549 int value_size = strlen(p) + 1; |
| 550 | |
| 551 if (!(value = av_malloc(value_size))) { | |
| 552 av_log(stream, AV_LOG_ERROR, "Failed to allocate data for FMTP."); | |
| 553 return AVERROR(ENOMEM); | |
| 554 } | |
|
6187
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
555 |
|
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
556 // remove protocol identifier |
|
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
557 while (*p && *p == ' ') p++; // strip spaces |
|
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
558 while (*p && *p != ' ') p++; // eat protocol identifier |
|
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
559 while (*p && *p == ' ') p++; // strip trailing spaces |
|
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
560 |
|
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
561 while (ff_rtsp_next_attr_and_value(&p, |
|
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
562 attr, sizeof(attr), |
| 6193 | 563 value, value_size)) { |
|
6187
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
564 |
|
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
565 res = parse_fmtp(stream, data, attr, value); |
| 6193 | 566 if (res < 0 && res != AVERROR_PATCHWELCOME) { |
| 567 av_free(value); | |
|
6187
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
568 return res; |
| 6193 | 569 } |
|
6187
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
570 } |
| 6193 | 571 av_free(value); |
|
6187
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
572 return 0; |
|
c4c35a9d4ab5
rtpdec: Add generic function for iterating over FMTP configuration lines
mstorsjo
parents:
6179
diff
changeset
|
573 } |
