Mercurial > libavformat.hg
annotate rtpdec.c @ 5966:9a86b49201bb libavformat
Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext
In order to sync RTP streams that get their initial RTCP timestamp at
different times, propagate the NTP timestamp of the first RTCP packet
to all other streams.
This makes the timestamps of returned packets start at (near) zero instead
of at any random offset.
author | mstorsjo |
---|---|
date | Tue, 20 Apr 2010 07:34:28 +0000 |
parents | 97fce92200b5 |
children | c5a3e1951fc6 |
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" |
5918
e3b4d7181606
Rename rtpdec_theora.[ch] to rtpdec_xiph.[ch], as a preparation for merging
rbultje
parents:
5910
diff
changeset
|
37 #include "rtpdec_xiph.h" |
1419 | 38 |
0 | 39 //#define DEBUG |
40 | |
41 /* TODO: - add RTCP statistics reporting (should be optional). | |
42 | |
43 - add support for h263/mpeg4 packetized output : IDEA: send a | |
44 buffer to 'rtp_write_packet' contains all the packets for ONE | |
45 frame. Each packet should have a four byte header containing | |
46 the length in big endian format (same trick as | |
885 | 47 'url_open_dyn_packet_buf') |
0 | 48 */ |
49 | |
1419 | 50 /* statistics functions */ |
51 RTPDynamicProtocolHandler *RTPFirstDynamicPayloadHandler= NULL; | |
52 | |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5866
diff
changeset
|
53 static RTPDynamicProtocolHandler mp4v_es_handler= {"MP4V-ES", AVMEDIA_TYPE_VIDEO, CODEC_ID_MPEG4}; |
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5866
diff
changeset
|
54 static RTPDynamicProtocolHandler mpeg4_generic_handler= {"mpeg4-generic", AVMEDIA_TYPE_AUDIO, CODEC_ID_AAC}; |
0 | 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 { |
3901
f936c4b8b96d
Give register_dynamic_payload_handler() in rtpdec.c a ff_ prefix and export
rbultje
parents:
3750
diff
changeset
|
64 ff_register_dynamic_payload_handler(&mp4v_es_handler); |
f936c4b8b96d
Give register_dynamic_payload_handler() in rtpdec.c a ff_ prefix and export
rbultje
parents:
3750
diff
changeset
|
65 ff_register_dynamic_payload_handler(&mpeg4_generic_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); |
4754
c78617194786
Assign the x-pf-asf payload string to be decoded by rtp_asf.c, and add a
rbultje
parents:
4633
diff
changeset
|
73 |
c78617194786
Assign the x-pf-asf payload string to be decoded by rtp_asf.c, and add a
rbultje
parents:
4633
diff
changeset
|
74 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
|
75 ff_register_dynamic_payload_handler(&ff_ms_rtp_asf_pfa_handler); |
1419 | 76 } |
0 | 77 |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
78 static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf, int len) |
0 | 79 { |
80 if (buf[1] != 200) | |
81 return -1; | |
2167
c4244900f986
remove decode_be32/64 and replace them by AV_RB32/64
benoit
parents:
2164
diff
changeset
|
82 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
|
83 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
|
84 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
|
85 s->last_rtcp_timestamp = AV_RB32(buf + 16); |
0 | 86 return 0; |
87 } | |
88 | |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
89 #define RTP_SEQ_MOD (1<<16) |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
90 |
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 * 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 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
|
95 { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
96 memset(s, 0, sizeof(RTPStatistics)); |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
97 s->max_seq= base_sequence; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
98 s->probation= 1; |
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 |
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 * 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
|
103 */ |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
104 static void rtp_init_sequence(RTPStatistics *s, uint16_t seq) |
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 s->max_seq= seq; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
107 s->cycles= 0; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
108 s->base_seq= seq -1; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
109 s->bad_seq= RTP_SEQ_MOD + 1; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
110 s->received= 0; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
111 s->expected_prior= 0; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
112 s->received_prior= 0; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
113 s->jitter= 0; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
114 s->transit= 0; |
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 |
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 * returns 1 if we should handle this packet. |
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 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
|
121 { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
122 uint16_t udelta= seq - s->max_seq; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
123 const int MAX_DROPOUT= 3000; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
124 const int MAX_MISORDER = 100; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
125 const int MIN_SEQUENTIAL = 2; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
126 |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
127 /* 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
|
128 if(s->probation) |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
129 { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
130 if(seq==s->max_seq + 1) { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
131 s->probation--; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
132 s->max_seq= seq; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
133 if(s->probation==0) { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
134 rtp_init_sequence(s, seq); |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
135 s->received++; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
136 return 1; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
137 } |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
138 } else { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
139 s->probation= MIN_SEQUENTIAL - 1; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
140 s->max_seq = seq; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
141 } |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
142 } else if (udelta < MAX_DROPOUT) { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
143 // in order, with permissible gap |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
144 if(seq < s->max_seq) { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
145 //sequence number wrapped; count antother 64k cycles |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
146 s->cycles += RTP_SEQ_MOD; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
147 } |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
148 s->max_seq= seq; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
149 } else if (udelta <= RTP_SEQ_MOD - MAX_MISORDER) { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
150 // sequence made a large jump... |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
151 if(seq==s->bad_seq) { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
152 // 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
|
153 rtp_init_sequence(s, seq); |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
154 } else { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
155 s->bad_seq= (seq + 1) & (RTP_SEQ_MOD-1); |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
156 return 0; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
157 } |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
158 } else { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
159 // duplicate or reordered packet... |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
160 } |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
161 s->received++; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
162 return 1; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
163 } |
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 #if 0 |
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 * 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
|
168 * 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
|
169 * 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
|
170 */ |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
171 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
|
172 { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
173 uint32_t transit= arrival_timestamp - sent_timestamp; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
174 int d; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
175 s->transit= transit; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
176 d= FFABS(transit - s->transit); |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
177 s->jitter += d - ((s->jitter + 8)>>4); |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
178 } |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
179 #endif |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
180 |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
181 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
|
182 { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
183 ByteIOContext *pb; |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
184 uint8_t *buf; |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
185 int len; |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
186 int rtcp_bytes; |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
187 RTPStatistics *stats= &s->statistics; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
188 uint32_t lost; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
189 uint32_t extended_max; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
190 uint32_t expected_interval; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
191 uint32_t received_interval; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
192 uint32_t lost_interval; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
193 uint32_t expected; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
194 uint32_t fraction; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
195 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
|
196 |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
197 if (!s->rtp_ctx || (count < 1)) |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
198 return -1; |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
199 |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
200 /* 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
|
201 /* 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
|
202 s->octet_count += count; |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
203 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
|
204 RTCP_TX_RATIO_DEN; |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
205 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
|
206 if (rtcp_bytes < 28) |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
207 return -1; |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
208 s->last_octet_count = s->octet_count; |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
209 |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
210 if (url_open_dyn_buf(&pb) < 0) |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
211 return -1; |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
212 |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
213 // Receiver Report |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
214 put_byte(pb, (RTP_VERSION << 6) + 1); /* 1 report block */ |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
215 put_byte(pb, 201); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
216 put_be16(pb, 7); /* length in words - 1 */ |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
217 put_be32(pb, s->ssrc); // our own SSRC |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
218 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
|
219 // some placeholders we should really fill... |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
220 // RFC 1889/p64 |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
221 extended_max= stats->cycles + stats->max_seq; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
222 expected= extended_max - stats->base_seq + 1; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
223 lost= expected - stats->received; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
224 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
|
225 expected_interval= expected - stats->expected_prior; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
226 stats->expected_prior= expected; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
227 received_interval= stats->received - stats->received_prior; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
228 stats->received_prior= stats->received; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
229 lost_interval= expected_interval - received_interval; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
230 if (expected_interval==0 || lost_interval<=0) fraction= 0; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
231 else fraction = (lost_interval<<8)/expected_interval; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
232 |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
233 fraction= (fraction<<24) | lost; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
234 |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
235 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
|
236 put_be32(pb, extended_max); /* max sequence received */ |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
237 put_be32(pb, stats->jitter>>4); /* jitter */ |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
238 |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
239 if(s->last_rtcp_ntp_time==AV_NOPTS_VALUE) |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
240 { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
241 put_be32(pb, 0); /* last SR timestamp */ |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
242 put_be32(pb, 0); /* delay since last SR */ |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
243 } else { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
244 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
|
245 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
|
246 |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
247 put_be32(pb, middle_32_bits); /* last SR timestamp */ |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
248 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
|
249 } |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
250 |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
251 // CNAME |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
252 put_byte(pb, (RTP_VERSION << 6) + 1); /* 1 report block */ |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
253 put_byte(pb, 202); |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
254 len = strlen(s->hostname); |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
255 put_be16(pb, (6 + len + 3) / 4); /* length in words - 1 */ |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
256 put_be32(pb, s->ssrc); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
257 put_byte(pb, 0x01); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
258 put_byte(pb, len); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
259 put_buffer(pb, s->hostname, len); |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
260 // padding |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
261 for (len = (6 + len) % 4; len % 4; len++) { |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
262 put_byte(pb, 0); |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
263 } |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
264 |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
265 put_flush_packet(pb); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
266 len = url_close_dyn_buf(pb, &buf); |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
267 if ((len > 0) && buf) { |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
268 int result; |
3579 | 269 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
|
270 result= url_write(s->rtp_ctx, buf, len); |
3579 | 271 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
|
272 av_free(buf); |
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 return 0; |
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 |
5665
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
277 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
|
278 { |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
279 ByteIOContext *pb; |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
280 uint8_t *buf; |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
281 int len; |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
282 |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
283 /* Send a small RTP packet */ |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
284 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
|
285 return; |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
286 |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
287 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
|
288 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
|
289 put_be16(pb, 0); /* Seq */ |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
290 put_be32(pb, 0); /* Timestamp */ |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
291 put_be32(pb, 0); /* SSRC */ |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
292 |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
293 put_flush_packet(pb); |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
294 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
|
295 if ((len > 0) && buf) |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
296 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
|
297 av_free(buf); |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
298 |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
299 /* Send a minimal RTCP RR */ |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
300 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
|
301 return; |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
302 |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
303 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
|
304 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
|
305 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
|
306 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
|
307 |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
308 put_flush_packet(pb); |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
309 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
|
310 if ((len > 0) && buf) |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
311 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
|
312 av_free(buf); |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
313 } |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
314 |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5643
diff
changeset
|
315 |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
316 /** |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
317 * 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
|
318 * MPEG2TS streams to indicate that they should be demuxed inside the |
885 | 319 * rtp demux (otherwise CODEC_ID_MPEG2TS packets are returned) |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
320 * TODO: change this to not take rtp_payload data, and use the new dynamic payload system. |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
321 */ |
4101
af2c0aef892b
Rename rtp_payload_data_t to avoid clashes with the POSIX namespace
lucabe
parents:
3977
diff
changeset
|
322 RTPDemuxContext *rtp_parse_open(AVFormatContext *s1, AVStream *st, URLContext *rtpc, int payload_type, RTPPayloadData *rtp_payload_data) |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
323 { |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
324 RTPDemuxContext *s; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
325 |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
326 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
|
327 if (!s) |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
328 return NULL; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
329 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
|
330 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
|
331 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
|
332 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
|
333 s->st = st; |
774 | 334 s->rtp_payload_data = rtp_payload_data; |
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 |
774 | 375 static int rtp_parse_mp4_au(RTPDemuxContext *s, const uint8_t *buf) |
376 { | |
377 int au_headers_length, au_header_size, i; | |
378 GetBitContext getbitcontext; | |
4101
af2c0aef892b
Rename rtp_payload_data_t to avoid clashes with the POSIX namespace
lucabe
parents:
3977
diff
changeset
|
379 RTPPayloadData *infos; |
774 | 380 |
381 infos = s->rtp_payload_data; | |
382 | |
383 if (infos == NULL) | |
384 return -1; | |
385 | |
3142 | 386 /* decode the first 2 bytes where the AUHeader sections are stored |
774 | 387 length in bits */ |
1673 | 388 au_headers_length = AV_RB16(buf); |
774 | 389 |
390 if (au_headers_length > RTP_MAX_PACKET_LENGTH) | |
391 return -1; | |
392 | |
393 infos->au_headers_length_bytes = (au_headers_length + 7) / 8; | |
394 | |
395 /* skip AU headers length section (2 bytes) */ | |
396 buf += 2; | |
397 | |
398 init_get_bits(&getbitcontext, buf, infos->au_headers_length_bytes * 8); | |
399 | |
400 /* XXX: Wrong if optionnal additional sections are present (cts, dts etc...) */ | |
401 au_header_size = infos->sizelength + infos->indexlength; | |
402 if (au_header_size <= 0 || (au_headers_length % au_header_size != 0)) | |
403 return -1; | |
404 | |
405 infos->nb_au_headers = au_headers_length / au_header_size; | |
5936 | 406 if (!infos->au_headers || infos->au_headers_allocated < infos->nb_au_headers) { |
407 av_free(infos->au_headers); | |
5937 | 408 infos->au_headers = av_malloc(sizeof(struct AUHeaders) * infos->nb_au_headers); |
5936 | 409 infos->au_headers_allocated = infos->nb_au_headers; |
410 } | |
774 | 411 |
412 /* XXX: We handle multiple AU Section as only one (need to fix this for interleaving) | |
2164 | 413 In my test, the FAAD decoder does not behave correctly when sending each AU one by one |
774 | 414 but does when sending the whole as one big packet... */ |
415 infos->au_headers[0].size = 0; | |
416 infos->au_headers[0].index = 0; | |
417 for (i = 0; i < infos->nb_au_headers; ++i) { | |
418 infos->au_headers[0].size += get_bits_long(&getbitcontext, infos->sizelength); | |
419 infos->au_headers[0].index = get_bits_long(&getbitcontext, infos->indexlength); | |
420 } | |
421 | |
422 infos->nb_au_headers = 1; | |
423 | |
424 return 0; | |
425 } | |
426 | |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
427 /** |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
428 * 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
|
429 */ |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
430 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
|
431 { |
3535 | 432 if (s->last_rtcp_ntp_time != AV_NOPTS_VALUE) { |
433 int64_t addend; | |
434 int delta_timestamp; | |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
435 |
3535 | 436 /* compute pts from timestamp with received ntp_time */ |
437 delta_timestamp = timestamp - s->last_rtcp_timestamp; | |
438 /* convert to the PTS timebase */ | |
5966
9a86b49201bb
Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext
mstorsjo
parents:
5937
diff
changeset
|
439 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); |
3535 | 440 pkt->pts = addend + delta_timestamp; |
441 } | |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
442 } |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
443 |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
444 /** |
885 | 445 * 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
|
446 * @param s RTP parse context. |
0 | 447 * @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
|
448 * @param buf input buffer or NULL to read the next packets |
0 | 449 * @param len buffer len |
885 | 450 * @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
|
451 * (use buf as NULL to read the next). -1 if no packet (error or no more packet). |
0 | 452 */ |
885 | 453 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
|
454 const uint8_t *buf, int len) |
0 | 455 { |
456 unsigned int ssrc, h; | |
2941
6da0564c9d02
Add a flags field to the RTPDynamicPayloadPacketHandlerProc (PKT_FLAG_*).
rbultje
parents:
2918
diff
changeset
|
457 int payload_type, seq, ret, flags = 0; |
0 | 458 AVStream *st; |
65 | 459 uint32_t timestamp; |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
460 int rv= 0; |
885 | 461 |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
462 if (!buf) { |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
463 /* return the next packets, if any */ |
1419 | 464 if(s->st && s->parse_packet) { |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
465 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
|
466 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
|
467 s->st, pkt, ×tamp, NULL, 0, flags); |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
468 finalize_packet(s, pkt, timestamp); |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
469 return rv; |
1419 | 470 } else { |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
471 // 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
|
472 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
|
473 return -1; |
5619
072cb3a1d4a7
Fix warnings about implicit function declaration when compiling rtpdec.c
cehoyos
parents:
5601
diff
changeset
|
474 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
|
475 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
|
476 if (ret < 0) |
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
477 return -1; |
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
478 s->read_buf_index += ret; |
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
479 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
|
480 return 1; |
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
481 else |
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
482 return 0; |
1419 | 483 } |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
484 } |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
485 |
0 | 486 if (len < 12) |
487 return -1; | |
488 | |
489 if ((buf[0] & 0xc0) != (RTP_VERSION << 6)) | |
490 return -1; | |
491 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
|
492 rtcp_parse_packet(s, buf, len); |
0 | 493 return -1; |
494 } | |
495 payload_type = buf[1] & 0x7f; | |
4590
85c7d517d556
Implement marker bit, which is used for several RTP payloads currently
rbultje
parents:
4388
diff
changeset
|
496 if (buf[1] & 0x80) |
85c7d517d556
Implement marker bit, which is used for several RTP payloads currently
rbultje
parents:
4388
diff
changeset
|
497 flags |= RTP_FLAG_MARKER; |
2222 | 498 seq = AV_RB16(buf + 2); |
2167
c4244900f986
remove decode_be32/64 and replace them by AV_RB32/64
benoit
parents:
2164
diff
changeset
|
499 timestamp = AV_RB32(buf + 4); |
c4244900f986
remove decode_be32/64 and replace them by AV_RB32/64
benoit
parents:
2164
diff
changeset
|
500 ssrc = AV_RB32(buf + 8); |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
501 /* store the ssrc in the RTPDemuxContext */ |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
502 s->ssrc = ssrc; |
885 | 503 |
0 | 504 /* NOTE: we can handle only one payload type */ |
505 if (s->payload_type != payload_type) | |
506 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
|
507 |
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
|
508 st = s->st; |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
509 // 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
|
510 if(!rtp_valid_packet_in_sequence(&s->statistics, seq)) |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
511 { |
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
|
512 av_log(st?st->codec:NULL, AV_LOG_ERROR, "RTP: PT=%02x: bad cseq %04x expected=%04x\n", |
0 | 513 payload_type, seq, ((s->seq + 1) & 0xffff)); |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
514 return -1; |
0 | 515 } |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
516 |
0 | 517 s->seq = seq; |
518 len -= 12; | |
519 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
|
520 |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
521 if (!st) { |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
522 /* specific MPEG2TS demux support */ |
5619
072cb3a1d4a7
Fix warnings about implicit function declaration when compiling rtpdec.c
cehoyos
parents:
5601
diff
changeset
|
523 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
|
524 if (ret < 0) |
0 | 525 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
|
526 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
|
527 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
|
528 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
|
529 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
|
530 return 1; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
531 } |
4631
4bbf1fe0796b
In the current implementation of rtp_parse_packet(), finalize_packet() is
rbultje
parents:
4590
diff
changeset
|
532 return 0; |
2917
62ff44e23c10
Make rtp_parse_packet() always call the vfunc of the dynamic payload handler
rbultje
parents:
2891
diff
changeset
|
533 } else if (s->parse_packet) { |
4387
5c42816e12c6
Add "AVFormatContext *ctx" (that being the RTSP demuxer's) as first argument
rbultje
parents:
4291
diff
changeset
|
534 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
|
535 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
|
536 } else { |
1419 | 537 // 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
|
538 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
|
539 case CODEC_ID_MP2: |
5472 | 540 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
|
541 /* better than nothing: skip mpeg audio RTP header */ |
0 | 542 if (len <= 4) |
543 return -1; | |
2167
c4244900f986
remove decode_be32/64 and replace them by AV_RB32/64
benoit
parents:
2164
diff
changeset
|
544 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
|
545 len -= 4; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
546 buf += 4; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
547 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
|
548 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
|
549 break; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
550 case CODEC_ID_MPEG1VIDEO: |
2760 | 551 case CODEC_ID_MPEG2VIDEO: |
305 | 552 /* 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
|
553 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
|
554 return -1; |
2167
c4244900f986
remove decode_be32/64 and replace them by AV_RB32/64
benoit
parents:
2164
diff
changeset
|
555 h = AV_RB32(buf); |
0 | 556 buf += 4; |
557 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
|
558 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
|
559 /* mpeg2 */ |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
560 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
|
561 return -1; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
562 buf += 4; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
563 len -= 4; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
564 } |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
565 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
|
566 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
|
567 break; |
1427
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
568 // moved from below, verbatim. this is because this section handles packets, and the lower switch handles |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
569 // timestamps. |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
570 // TODO: Put this into a dynamic packet handler... |
1472
49d5a5ca2987
get rid of CODEC_ID_MPEG4AAC after next version bump, and change it to CODEC_ID_AAC where used
bcoudurier
parents:
1460
diff
changeset
|
571 case CODEC_ID_AAC: |
1427
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
572 if (rtp_parse_mp4_au(s, buf)) |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
573 return -1; |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
574 { |
4101
af2c0aef892b
Rename rtp_payload_data_t to avoid clashes with the POSIX namespace
lucabe
parents:
3977
diff
changeset
|
575 RTPPayloadData *infos = s->rtp_payload_data; |
1427
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
576 if (infos == NULL) |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
577 return -1; |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
578 buf += infos->au_headers_length_bytes + 2; |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
579 len -= infos->au_headers_length_bytes + 2; |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
580 |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
581 /* XXX: Fixme we only handle the case where rtp_parse_mp4_au define |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
582 one au_header */ |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
583 av_new_packet(pkt, infos->au_headers[0].size); |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
584 memcpy(pkt->data, buf, infos->au_headers[0].size); |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
585 buf += infos->au_headers[0].size; |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
586 len -= infos->au_headers[0].size; |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
587 } |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
588 s->read_buf_size = len; |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
589 rv= 0; |
1427
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
590 break; |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
591 default: |
2918
9e85e46922b5
Reindent after r11493 (always use parse_packet() vfunc in rtp_parse_packet()),
rbultje
parents:
2917
diff
changeset
|
592 av_new_packet(pkt, len); |
9e85e46922b5
Reindent after r11493 (always use parse_packet() vfunc in rtp_parse_packet()),
rbultje
parents:
2917
diff
changeset
|
593 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
|
594 break; |
0 | 595 } |
4633
0c69b895a01f
Don't let finalize_packet() touch pkt->stream_index. Instead, let individual
rbultje
parents:
4632
diff
changeset
|
596 |
0c69b895a01f
Don't let finalize_packet() touch pkt->stream_index. Instead, let individual
rbultje
parents:
4632
diff
changeset
|
597 pkt->stream_index = st->index; |
4631
4bbf1fe0796b
In the current implementation of rtp_parse_packet(), finalize_packet() is
rbultje
parents:
4590
diff
changeset
|
598 } |
885 | 599 |
4632 | 600 // now perform timestamp things.... |
601 finalize_packet(s, pkt, timestamp); | |
4631
4bbf1fe0796b
In the current implementation of rtp_parse_packet(), finalize_packet() is
rbultje
parents:
4590
diff
changeset
|
602 |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
603 return rv; |
0 | 604 } |
605 | |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
606 void rtp_parse_close(RTPDemuxContext *s) |
0 | 607 { |
1419 | 608 // TODO: fold this into the protocol specific data fields. |
5936 | 609 av_free(s->rtp_payload_data->mode); |
610 av_free(s->rtp_payload_data->au_headers); | |
2759
b252e318023a
Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents:
2706
diff
changeset
|
611 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
|
612 ff_mpegts_parse_close(s->ts); |
0 | 613 } |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
614 av_free(s); |
0 | 615 } |