Mercurial > libavformat.hg
annotate rtp.c @ 1960:c0289552590f libavformat
Change the vhook code to send real timestamps to the filters instead of the
current time of day, which is useless, and which the filters could just as
easily query for themselves.
patch by Bobby Bingham, uhmmmm gmail com
author | diego |
---|---|
date | Thu, 29 Mar 2007 05:24:35 +0000 |
parents | 17893fe08372 |
children | fbc66bf1f15d |
rev | line source |
---|---|
0 | 1 /* |
2 * RTP input/output format | |
3 * Copyright (c) 2002 Fabrice Bellard. | |
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 */ |
21 #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
|
22 #include "mpegts.h" |
774 | 23 #include "bitstream.h" |
0 | 24 |
25 #include <unistd.h> | |
1754 | 26 #include "network.h" |
0 | 27 |
1419 | 28 #include "rtp_internal.h" |
1460 | 29 #include "rtp_h264.h" |
1419 | 30 |
0 | 31 //#define DEBUG |
32 | |
33 | |
34 /* TODO: - add RTCP statistics reporting (should be optional). | |
35 | |
36 - add support for h263/mpeg4 packetized output : IDEA: send a | |
37 buffer to 'rtp_write_packet' contains all the packets for ONE | |
38 frame. Each packet should have a four byte header containing | |
39 the length in big endian format (same trick as | |
885 | 40 'url_open_dyn_packet_buf') |
0 | 41 */ |
42 | |
774 | 43 /* from http://www.iana.org/assignments/rtp-parameters last updated 05 January 2005 */ |
44 AVRtpPayloadType_t AVRtpPayloadTypes[]= | |
45 { | |
46 {0, "PCMU", CODEC_TYPE_AUDIO, CODEC_ID_PCM_MULAW, 8000, 1}, | |
47 {1, "Reserved", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
48 {2, "Reserved", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
49 {3, "GSM", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1}, | |
50 {4, "G723", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1}, | |
51 {5, "DVI4", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1}, | |
52 {6, "DVI4", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 16000, 1}, | |
53 {7, "LPC", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1}, | |
54 {8, "PCMA", CODEC_TYPE_AUDIO, CODEC_ID_PCM_ALAW, 8000, 1}, | |
55 {9, "G722", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1}, | |
56 {10, "L16", CODEC_TYPE_AUDIO, CODEC_ID_PCM_S16BE, 44100, 2}, | |
57 {11, "L16", CODEC_TYPE_AUDIO, CODEC_ID_PCM_S16BE, 44100, 1}, | |
1259 | 58 {12, "QCELP", CODEC_TYPE_AUDIO, CODEC_ID_QCELP, 8000, 1}, |
774 | 59 {13, "CN", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1}, |
60 {14, "MPA", CODEC_TYPE_AUDIO, CODEC_ID_MP2, 90000, -1}, | |
61 {15, "G728", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1}, | |
62 {16, "DVI4", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 11025, 1}, | |
63 {17, "DVI4", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 22050, 1}, | |
64 {18, "G729", CODEC_TYPE_AUDIO, CODEC_ID_NONE, 8000, 1}, | |
65 {19, "reserved", CODEC_TYPE_AUDIO, CODEC_ID_NONE, -1, -1}, | |
66 {20, "unassigned", CODEC_TYPE_AUDIO, CODEC_ID_NONE, -1, -1}, | |
67 {21, "unassigned", CODEC_TYPE_AUDIO, CODEC_ID_NONE, -1, -1}, | |
68 {22, "unassigned", CODEC_TYPE_AUDIO, CODEC_ID_NONE, -1, -1}, | |
69 {23, "unassigned", CODEC_TYPE_AUDIO, CODEC_ID_NONE, -1, -1}, | |
70 {24, "unassigned", CODEC_TYPE_VIDEO, CODEC_ID_NONE, -1, -1}, | |
71 {25, "CelB", CODEC_TYPE_VIDEO, CODEC_ID_NONE, 90000, -1}, | |
72 {26, "JPEG", CODEC_TYPE_VIDEO, CODEC_ID_MJPEG, 90000, -1}, | |
73 {27, "unassigned", CODEC_TYPE_VIDEO, CODEC_ID_NONE, -1, -1}, | |
74 {28, "nv", CODEC_TYPE_VIDEO, CODEC_ID_NONE, 90000, -1}, | |
75 {29, "unassigned", CODEC_TYPE_VIDEO, CODEC_ID_NONE, -1, -1}, | |
76 {30, "unassigned", CODEC_TYPE_VIDEO, CODEC_ID_NONE, -1, -1}, | |
77 {31, "H261", CODEC_TYPE_VIDEO, CODEC_ID_H261, 90000, -1}, | |
78 {32, "MPV", CODEC_TYPE_VIDEO, CODEC_ID_MPEG1VIDEO, 90000, -1}, | |
79 {33, "MP2T", CODEC_TYPE_DATA, CODEC_ID_MPEG2TS, 90000, -1}, | |
80 {34, "H263", CODEC_TYPE_VIDEO, CODEC_ID_H263, 90000, -1}, | |
81 {35, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
82 {36, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
83 {37, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
84 {38, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
85 {39, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
86 {40, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
87 {41, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
88 {42, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
89 {43, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
90 {44, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
91 {45, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
92 {46, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
93 {47, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
94 {48, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
95 {49, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
96 {50, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
97 {51, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
98 {52, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
99 {53, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
100 {54, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
101 {55, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
102 {56, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
103 {57, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
104 {58, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
105 {59, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
106 {60, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
107 {61, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
108 {62, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
109 {63, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
110 {64, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
111 {65, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
112 {66, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
113 {67, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
114 {68, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
115 {69, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
116 {70, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
117 {71, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
118 {72, "reserved for RTCP conflict avoidance", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
119 {73, "reserved for RTCP conflict avoidance", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
120 {74, "reserved for RTCP conflict avoidance", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
121 {75, "reserved for RTCP conflict avoidance", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
122 {76, "reserved for RTCP conflict avoidance", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
123 {77, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
124 {78, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
125 {79, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
126 {80, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
127 {81, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
128 {82, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
129 {83, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
130 {84, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
131 {85, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
132 {86, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
133 {87, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
134 {88, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
135 {89, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
136 {90, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
137 {91, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
138 {92, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
139 {93, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
140 {94, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
141 {95, "unassigned", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
142 {96, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
143 {97, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
144 {98, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
145 {99, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
146 {100, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
147 {101, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
148 {102, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
149 {103, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
150 {104, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
151 {105, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
152 {106, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
153 {107, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
154 {108, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
155 {109, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
156 {110, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
157 {111, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
158 {112, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
159 {113, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
160 {114, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
161 {115, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
162 {116, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
163 {117, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
164 {118, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
165 {119, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
166 {120, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
167 {121, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
168 {122, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
169 {123, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
170 {124, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
171 {125, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
172 {126, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
173 {127, "dynamic", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1}, | |
174 {-1, "", CODEC_TYPE_UNKNOWN, CODEC_ID_NONE, -1, -1} | |
175 }; | |
0 | 176 |
1419 | 177 /* statistics functions */ |
178 RTPDynamicProtocolHandler *RTPFirstDynamicPayloadHandler= NULL; | |
179 | |
180 static RTPDynamicProtocolHandler mp4v_es_handler= {"MP4V-ES", CODEC_TYPE_VIDEO, CODEC_ID_MPEG4}; | |
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
|
181 static RTPDynamicProtocolHandler mpeg4_generic_handler= {"mpeg4-generic", CODEC_TYPE_AUDIO, CODEC_ID_AAC}; |
0 | 182 |
1419 | 183 static void register_dynamic_payload_handler(RTPDynamicProtocolHandler *handler) |
184 { | |
185 handler->next= RTPFirstDynamicPayloadHandler; | |
186 RTPFirstDynamicPayloadHandler= handler; | |
187 } | |
885 | 188 |
1419 | 189 void av_register_rtp_dynamic_payload_handlers() |
190 { | |
191 register_dynamic_payload_handler(&mp4v_es_handler); | |
192 register_dynamic_payload_handler(&mpeg4_generic_handler); | |
193 register_dynamic_payload_handler(&ff_h264_dynamic_handler); | |
194 } | |
0 | 195 |
196 int rtp_get_codec_info(AVCodecContext *codec, int payload_type) | |
197 { | |
774 | 198 if (AVRtpPayloadTypes[payload_type].codec_id != CODEC_ID_NONE) { |
199 codec->codec_type = AVRtpPayloadTypes[payload_type].codec_type; | |
1116 | 200 codec->codec_id = AVRtpPayloadTypes[payload_type].codec_id; |
774 | 201 if (AVRtpPayloadTypes[payload_type].audio_channels > 0) |
202 codec->channels = AVRtpPayloadTypes[payload_type].audio_channels; | |
203 if (AVRtpPayloadTypes[payload_type].clock_rate > 0) | |
204 codec->sample_rate = AVRtpPayloadTypes[payload_type].clock_rate; | |
205 return 0; | |
0 | 206 } |
774 | 207 return -1; |
0 | 208 } |
209 | |
210 int rtp_get_payload_type(AVCodecContext *codec) | |
211 { | |
774 | 212 int i, payload_type; |
0 | 213 |
214 /* compute the payload type */ | |
774 | 215 for (payload_type = -1, i = 0; AVRtpPayloadTypes[i].pt >= 0; ++i) |
216 if (AVRtpPayloadTypes[i].codec_id == codec->codec_id) { | |
217 if (codec->codec_id == CODEC_ID_PCM_S16BE) | |
218 if (codec->channels != AVRtpPayloadTypes[i].audio_channels) | |
219 continue; | |
220 payload_type = AVRtpPayloadTypes[i].pt; | |
0 | 221 } |
222 return payload_type; | |
223 } | |
224 | |
65 | 225 static inline uint32_t decode_be32(const uint8_t *p) |
0 | 226 { |
227 return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]; | |
228 } | |
229 | |
173 | 230 static inline uint64_t decode_be64(const uint8_t *p) |
0 | 231 { |
65 | 232 return ((uint64_t)decode_be32(p) << 32) | decode_be32(p + 4); |
0 | 233 } |
234 | |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
235 static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf, int len) |
0 | 236 { |
237 if (buf[1] != 200) | |
238 return -1; | |
239 s->last_rtcp_ntp_time = decode_be64(buf + 8); | |
173 | 240 if (s->first_rtcp_ntp_time == AV_NOPTS_VALUE) |
241 s->first_rtcp_ntp_time = s->last_rtcp_ntp_time; | |
0 | 242 s->last_rtcp_timestamp = decode_be32(buf + 16); |
243 return 0; | |
244 } | |
245 | |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
246 #define RTP_SEQ_MOD (1<<16) |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
247 |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
248 /** |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
249 * called on parse open packet |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
250 */ |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
251 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
|
252 { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
253 memset(s, 0, sizeof(RTPStatistics)); |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
254 s->max_seq= base_sequence; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
255 s->probation= 1; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
256 } |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
257 |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
258 /** |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
259 * 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
|
260 */ |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
261 static void rtp_init_sequence(RTPStatistics *s, uint16_t seq) |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
262 { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
263 s->max_seq= seq; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
264 s->cycles= 0; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
265 s->base_seq= seq -1; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
266 s->bad_seq= RTP_SEQ_MOD + 1; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
267 s->received= 0; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
268 s->expected_prior= 0; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
269 s->received_prior= 0; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
270 s->jitter= 0; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
271 s->transit= 0; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
272 } |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
273 |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
274 /** |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
275 * returns 1 if we should handle this packet. |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
276 */ |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
277 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
|
278 { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
279 uint16_t udelta= seq - s->max_seq; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
280 const int MAX_DROPOUT= 3000; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
281 const int MAX_MISORDER = 100; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
282 const int MIN_SEQUENTIAL = 2; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
283 |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
284 /* 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
|
285 if(s->probation) |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
286 { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
287 if(seq==s->max_seq + 1) { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
288 s->probation--; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
289 s->max_seq= seq; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
290 if(s->probation==0) { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
291 rtp_init_sequence(s, seq); |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
292 s->received++; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
293 return 1; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
294 } |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
295 } else { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
296 s->probation= MIN_SEQUENTIAL - 1; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
297 s->max_seq = seq; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
298 } |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
299 } else if (udelta < MAX_DROPOUT) { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
300 // in order, with permissible gap |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
301 if(seq < s->max_seq) { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
302 //sequence number wrapped; count antother 64k cycles |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
303 s->cycles += RTP_SEQ_MOD; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
304 } |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
305 s->max_seq= seq; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
306 } else if (udelta <= RTP_SEQ_MOD - MAX_MISORDER) { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
307 // sequence made a large jump... |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
308 if(seq==s->bad_seq) { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
309 // 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
|
310 rtp_init_sequence(s, seq); |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
311 } else { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
312 s->bad_seq= (seq + 1) & (RTP_SEQ_MOD-1); |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
313 return 0; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
314 } |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
315 } else { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
316 // duplicate or reordered packet... |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
317 } |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
318 s->received++; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
319 return 1; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
320 } |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
321 |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
322 #if 0 |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
323 /** |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
324 * 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
|
325 * 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
|
326 * 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
|
327 */ |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
328 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
|
329 { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
330 uint32_t transit= arrival_timestamp - sent_timestamp; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
331 int d; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
332 s->transit= transit; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
333 d= FFABS(transit - s->transit); |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
334 s->jitter += d - ((s->jitter + 8)>>4); |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
335 } |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
336 #endif |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
337 |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
338 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
|
339 { |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
340 ByteIOContext pb; |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
341 uint8_t *buf; |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
342 int len; |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
343 int rtcp_bytes; |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
344 RTPStatistics *stats= &s->statistics; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
345 uint32_t lost; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
346 uint32_t extended_max; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
347 uint32_t expected_interval; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
348 uint32_t received_interval; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
349 uint32_t lost_interval; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
350 uint32_t expected; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
351 uint32_t fraction; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
352 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
|
353 |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
354 if (!s->rtp_ctx || (count < 1)) |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
355 return -1; |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
356 |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
357 /* 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
|
358 /* 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
|
359 s->octet_count += count; |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
360 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
|
361 RTCP_TX_RATIO_DEN; |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
362 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
|
363 if (rtcp_bytes < 28) |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
364 return -1; |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
365 s->last_octet_count = s->octet_count; |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
366 |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
367 if (url_open_dyn_buf(&pb) < 0) |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
368 return -1; |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
369 |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
370 // Receiver Report |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
371 put_byte(&pb, (RTP_VERSION << 6) + 1); /* 1 report block */ |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
372 put_byte(&pb, 201); |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
373 put_be16(&pb, 7); /* length in words - 1 */ |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
374 put_be32(&pb, s->ssrc); // our own SSRC |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
375 put_be32(&pb, s->ssrc); // XXX: should be the server's here! |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
376 // some placeholders we should really fill... |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
377 // RFC 1889/p64 |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
378 extended_max= stats->cycles + stats->max_seq; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
379 expected= extended_max - stats->base_seq + 1; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
380 lost= expected - stats->received; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
381 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
|
382 expected_interval= expected - stats->expected_prior; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
383 stats->expected_prior= expected; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
384 received_interval= stats->received - stats->received_prior; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
385 stats->received_prior= stats->received; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
386 lost_interval= expected_interval - received_interval; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
387 if (expected_interval==0 || lost_interval<=0) fraction= 0; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
388 else fraction = (lost_interval<<8)/expected_interval; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
389 |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
390 fraction= (fraction<<24) | lost; |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
391 |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
392 put_be32(&pb, fraction); /* 8 bits of fraction, 24 bits of total packets lost */ |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
393 put_be32(&pb, extended_max); /* max sequence received */ |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
394 put_be32(&pb, stats->jitter>>4); /* jitter */ |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
395 |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
396 if(s->last_rtcp_ntp_time==AV_NOPTS_VALUE) |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
397 { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
398 put_be32(&pb, 0); /* last SR timestamp */ |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
399 put_be32(&pb, 0); /* delay since last SR */ |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
400 } else { |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
401 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
|
402 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
|
403 |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
404 put_be32(&pb, middle_32_bits); /* last SR timestamp */ |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
405 put_be32(&pb, delay_since_last); /* delay since last SR */ |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
406 } |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
407 |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
408 // CNAME |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
409 put_byte(&pb, (RTP_VERSION << 6) + 1); /* 1 report block */ |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
410 put_byte(&pb, 202); |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
411 len = strlen(s->hostname); |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
412 put_be16(&pb, (6 + len + 3) / 4); /* length in words - 1 */ |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
413 put_be32(&pb, s->ssrc); |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
414 put_byte(&pb, 0x01); |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
415 put_byte(&pb, len); |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
416 put_buffer(&pb, s->hostname, len); |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
417 // padding |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
418 for (len = (6 + len) % 4; len % 4; len++) { |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
419 put_byte(&pb, 0); |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
420 } |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
421 |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
422 put_flush_packet(&pb); |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
423 len = url_close_dyn_buf(&pb, &buf); |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
424 if ((len > 0) && buf) { |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
425 int result; |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
426 #if defined(DEBUG) |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
427 printf("sending %d bytes of RR\n", len); |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
428 #endif |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
429 result= url_write(s->rtp_ctx, buf, len); |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
430 #if defined(DEBUG) |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
431 printf("result from url_write: %d\n", result); |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
432 #endif |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
433 av_free(buf); |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
434 } |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
435 return 0; |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
436 } |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
437 |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
438 /** |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
439 * 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
|
440 * MPEG2TS streams to indicate that they should be demuxed inside the |
885 | 441 * 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
|
442 * 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
|
443 */ |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
444 RTPDemuxContext *rtp_parse_open(AVFormatContext *s1, AVStream *st, URLContext *rtpc, int payload_type, rtp_payload_data_t *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
|
445 { |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
446 RTPDemuxContext *s; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
447 |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
448 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
|
449 if (!s) |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
450 return NULL; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
451 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
|
452 s->last_rtcp_ntp_time = AV_NOPTS_VALUE; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
453 s->first_rtcp_ntp_time = AV_NOPTS_VALUE; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
454 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
|
455 s->st = st; |
774 | 456 s->rtp_payload_data = rtp_payload_data; |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
457 rtp_init_statistics(&s->statistics, 0); // do we know the initial sequence from sdp? |
774 | 458 if (!strcmp(AVRtpPayloadTypes[payload_type].enc_name, "MP2T")) { |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
459 s->ts = mpegts_parse_open(s->ic); |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
460 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
|
461 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
|
462 return NULL; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
463 } |
305 | 464 } else { |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
777
diff
changeset
|
465 switch(st->codec->codec_id) { |
305 | 466 case CODEC_ID_MPEG1VIDEO: |
467 case CODEC_ID_MPEG2VIDEO: | |
468 case CODEC_ID_MP2: | |
469 case CODEC_ID_MP3: | |
470 case CODEC_ID_MPEG4: | |
1419 | 471 case CODEC_ID_H264: |
305 | 472 st->need_parsing = 1; |
473 break; | |
474 default: | |
475 break; | |
476 } | |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
477 } |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
478 // 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
|
479 s->rtp_ctx = rtpc; |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
480 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
|
481 return s; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
482 } |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
483 |
774 | 484 static int rtp_parse_mp4_au(RTPDemuxContext *s, const uint8_t *buf) |
485 { | |
486 int au_headers_length, au_header_size, i; | |
487 GetBitContext getbitcontext; | |
488 rtp_payload_data_t *infos; | |
489 | |
490 infos = s->rtp_payload_data; | |
491 | |
492 if (infos == NULL) | |
493 return -1; | |
494 | |
495 /* decode the first 2 bytes where are stored the AUHeader sections | |
496 length in bits */ | |
1673 | 497 au_headers_length = AV_RB16(buf); |
774 | 498 |
499 if (au_headers_length > RTP_MAX_PACKET_LENGTH) | |
500 return -1; | |
501 | |
502 infos->au_headers_length_bytes = (au_headers_length + 7) / 8; | |
503 | |
504 /* skip AU headers length section (2 bytes) */ | |
505 buf += 2; | |
506 | |
507 init_get_bits(&getbitcontext, buf, infos->au_headers_length_bytes * 8); | |
508 | |
509 /* XXX: Wrong if optionnal additional sections are present (cts, dts etc...) */ | |
510 au_header_size = infos->sizelength + infos->indexlength; | |
511 if (au_header_size <= 0 || (au_headers_length % au_header_size != 0)) | |
512 return -1; | |
513 | |
514 infos->nb_au_headers = au_headers_length / au_header_size; | |
515 infos->au_headers = av_malloc(sizeof(struct AUHeaders) * infos->nb_au_headers); | |
516 | |
517 /* XXX: We handle multiple AU Section as only one (need to fix this for interleaving) | |
518 In my test, the faad decoder doesnt behave correctly when sending each AU one by one | |
519 but does when sending the whole as one big packet... */ | |
520 infos->au_headers[0].size = 0; | |
521 infos->au_headers[0].index = 0; | |
522 for (i = 0; i < infos->nb_au_headers; ++i) { | |
523 infos->au_headers[0].size += get_bits_long(&getbitcontext, infos->sizelength); | |
524 infos->au_headers[0].index = get_bits_long(&getbitcontext, infos->indexlength); | |
525 } | |
526 | |
527 infos->nb_au_headers = 1; | |
528 | |
529 return 0; | |
530 } | |
531 | |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
532 /** |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
533 * 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
|
534 */ |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
535 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
|
536 { |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
537 switch(s->st->codec->codec_id) { |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
538 case CODEC_ID_MP2: |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
539 case CODEC_ID_MPEG1VIDEO: |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
540 if (s->last_rtcp_ntp_time != AV_NOPTS_VALUE) { |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
541 int64_t addend; |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
542 |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
543 int delta_timestamp; |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
544 /* XXX: is it really necessary to unify the timestamp base ? */ |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
545 /* compute pts from timestamp with received ntp_time */ |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
546 delta_timestamp = timestamp - s->last_rtcp_timestamp; |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
547 /* convert to 90 kHz without overflow */ |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
548 addend = (s->last_rtcp_ntp_time - s->first_rtcp_ntp_time) >> 14; |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
549 addend = (addend * 5625) >> 14; |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
550 pkt->pts = addend + delta_timestamp; |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
551 } |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
552 break; |
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
|
553 case CODEC_ID_AAC: |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
554 case CODEC_ID_H264: |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
555 case CODEC_ID_MPEG4: |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
556 pkt->pts = timestamp; |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
557 break; |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
558 default: |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
559 /* no timestamp info yet */ |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
560 break; |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
561 } |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
562 pkt->stream_index = s->st->index; |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
563 } |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
564 |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
565 /** |
885 | 566 * 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
|
567 * @param s RTP parse context. |
0 | 568 * @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
|
569 * @param buf input buffer or NULL to read the next packets |
0 | 570 * @param len buffer len |
885 | 571 * @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
|
572 * (use buf as NULL to read the next). -1 if no packet (error or no more packet). |
0 | 573 */ |
885 | 574 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
|
575 const uint8_t *buf, int len) |
0 | 576 { |
577 unsigned int ssrc, h; | |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
578 int payload_type, seq, ret; |
0 | 579 AVStream *st; |
65 | 580 uint32_t timestamp; |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
581 int rv= 0; |
885 | 582 |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
583 if (!buf) { |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
584 /* return the next packets, if any */ |
1419 | 585 if(s->st && s->parse_packet) { |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
586 timestamp= 0; ///< Should not be used if buf is NULL, but should be set to the timestamp of the packet returned.... |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
587 rv= s->parse_packet(s, pkt, ×tamp, NULL, 0); |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
588 finalize_packet(s, pkt, timestamp); |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
589 return rv; |
1419 | 590 } else { |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
591 // 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
|
592 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
|
593 return -1; |
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
594 ret = mpegts_parse_packet(s->ts, pkt, s->buf + s->read_buf_index, |
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
595 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
|
596 if (ret < 0) |
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
597 return -1; |
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
598 s->read_buf_index += ret; |
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
599 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
|
600 return 1; |
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
601 else |
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
602 return 0; |
1419 | 603 } |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
604 } |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
605 |
0 | 606 if (len < 12) |
607 return -1; | |
608 | |
609 if ((buf[0] & 0xc0) != (RTP_VERSION << 6)) | |
610 return -1; | |
611 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
|
612 rtcp_parse_packet(s, buf, len); |
0 | 613 return -1; |
614 } | |
615 payload_type = buf[1] & 0x7f; | |
616 seq = (buf[2] << 8) | buf[3]; | |
617 timestamp = decode_be32(buf + 4); | |
618 ssrc = decode_be32(buf + 8); | |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
619 /* store the ssrc in the RTPDemuxContext */ |
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
620 s->ssrc = ssrc; |
885 | 621 |
0 | 622 /* NOTE: we can handle only one payload type */ |
623 if (s->payload_type != payload_type) | |
624 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
|
625 |
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
|
626 st = s->st; |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
627 // 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
|
628 if(!rtp_valid_packet_in_sequence(&s->statistics, seq)) |
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
629 { |
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
|
630 av_log(st?st->codec:NULL, AV_LOG_ERROR, "RTP: PT=%02x: bad cseq %04x expected=%04x\n", |
0 | 631 payload_type, seq, ((s->seq + 1) & 0xffff)); |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
632 return -1; |
0 | 633 } |
1445
db97355877b1
add valid statistics for the RTCP receiver report.
gpoirier
parents:
1443
diff
changeset
|
634 |
0 | 635 s->seq = seq; |
636 len -= 12; | |
637 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
|
638 |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
639 if (!st) { |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
640 /* specific MPEG2TS demux support */ |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
641 ret = mpegts_parse_packet(s->ts, pkt, buf, len); |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
642 if (ret < 0) |
0 | 643 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
|
644 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
|
645 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
|
646 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
|
647 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
|
648 return 1; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
649 } |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
650 } else { |
1419 | 651 // 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
|
652 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
|
653 case CODEC_ID_MP2: |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
654 /* better than nothing: skip mpeg audio RTP header */ |
0 | 655 if (len <= 4) |
656 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
|
657 h = decode_be32(buf); |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
658 len -= 4; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
659 buf += 4; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
660 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
|
661 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
|
662 break; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
663 case CODEC_ID_MPEG1VIDEO: |
305 | 664 /* 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
|
665 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
|
666 return -1; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
667 h = decode_be32(buf); |
0 | 668 buf += 4; |
669 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
|
670 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
|
671 /* mpeg2 */ |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
672 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
|
673 return -1; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
674 buf += 4; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
675 len -= 4; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
676 } |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
677 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
|
678 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
|
679 break; |
1427
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
680 // 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
|
681 // timestamps. |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
682 // 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
|
683 case CODEC_ID_AAC: |
1427
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
684 if (rtp_parse_mp4_au(s, buf)) |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
685 return -1; |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
686 { |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
687 rtp_payload_data_t *infos = s->rtp_payload_data; |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
688 if (infos == NULL) |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
689 return -1; |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
690 buf += infos->au_headers_length_bytes + 2; |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
691 len -= infos->au_headers_length_bytes + 2; |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
692 |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
693 /* 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
|
694 one au_header */ |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
695 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
|
696 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
|
697 buf += infos->au_headers[0].size; |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
698 len -= infos->au_headers[0].size; |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
699 } |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
700 s->read_buf_size = len; |
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
701 s->buf_ptr = buf; |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
702 rv= 0; |
1427
f1614c754d5b
move up (in the file) AAC audio handling moved from below
gpoirier
parents:
1425
diff
changeset
|
703 break; |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
704 default: |
1419 | 705 if(s->parse_packet) { |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
706 rv= s->parse_packet(s, pkt, ×tamp, buf, len); |
1419 | 707 } else { |
1424
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
708 av_new_packet(pkt, len); |
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
709 memcpy(pkt->data, buf, len); |
1419 | 710 } |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
711 break; |
0 | 712 } |
885 | 713 |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
714 // now perform timestamp things.... |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
715 finalize_packet(s, pkt, timestamp); |
0 | 716 } |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1427
diff
changeset
|
717 return rv; |
0 | 718 } |
719 | |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
720 void rtp_parse_close(RTPDemuxContext *s) |
0 | 721 { |
1419 | 722 // TODO: fold this into the protocol specific data fields. |
774 | 723 if (!strcmp(AVRtpPayloadTypes[s->payload_type].enc_name, "MP2T")) { |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
724 mpegts_parse_close(s->ts); |
0 | 725 } |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
726 av_free(s); |
0 | 727 } |
728 | |
729 /* rtp output */ | |
730 | |
731 static int rtp_write_header(AVFormatContext *s1) | |
732 { | |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
733 RTPDemuxContext *s = s1->priv_data; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
734 int payload_type, max_packet_size, n; |
0 | 735 AVStream *st; |
736 | |
737 if (s1->nb_streams != 1) | |
738 return -1; | |
739 st = s1->streams[0]; | |
740 | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
777
diff
changeset
|
741 payload_type = rtp_get_payload_type(st->codec); |
0 | 742 if (payload_type < 0) |
743 payload_type = RTP_PT_PRIVATE; /* private payload type */ | |
744 s->payload_type = payload_type; | |
745 | |
1099 | 746 // following 2 FIXMies could be set based on the current time, theres normaly no info leak, as rtp will likely be transmitted immedeatly |
1045
7f1b7f811f01
fix constraint violation: libavformat is not allowed to modify state of caller, including rng state
rfelker
parents:
986
diff
changeset
|
747 s->base_timestamp = 0; /* FIXME: was random(), what should this be? */ |
0 | 748 s->timestamp = s->base_timestamp; |
1045
7f1b7f811f01
fix constraint violation: libavformat is not allowed to modify state of caller, including rng state
rfelker
parents:
986
diff
changeset
|
749 s->ssrc = 0; /* FIXME: was random(), what should this be? */ |
0 | 750 s->first_packet = 1; |
751 | |
752 max_packet_size = url_fget_max_packet_size(&s1->pb); | |
753 if (max_packet_size <= 12) | |
754 return AVERROR_IO; | |
755 s->max_payload_size = max_packet_size - 12; | |
756 | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
777
diff
changeset
|
757 switch(st->codec->codec_id) { |
0 | 758 case CODEC_ID_MP2: |
232 | 759 case CODEC_ID_MP3: |
0 | 760 s->buf_ptr = s->buf + 4; |
761 s->cur_timestamp = 0; | |
762 break; | |
763 case CODEC_ID_MPEG1VIDEO: | |
764 s->cur_timestamp = 0; | |
765 break; | |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
766 case CODEC_ID_MPEG2TS: |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
767 n = s->max_payload_size / TS_PACKET_SIZE; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
768 if (n < 1) |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
769 n = 1; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
770 s->max_payload_size = n * TS_PACKET_SIZE; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
771 s->buf_ptr = s->buf; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
772 break; |
0 | 773 default: |
774 s->buf_ptr = s->buf; | |
775 break; | |
776 } | |
777 | |
778 return 0; | |
779 } | |
780 | |
781 /* send an rtcp sender report packet */ | |
65 | 782 static void rtcp_send_sr(AVFormatContext *s1, int64_t ntp_time) |
0 | 783 { |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
784 RTPDemuxContext *s = s1->priv_data; |
0 | 785 #if defined(DEBUG) |
1443
404048ea11bc
Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents:
1431
diff
changeset
|
786 printf("RTCP: %02x %"PRIx64" %x\n", s->payload_type, ntp_time, s->timestamp); |
0 | 787 #endif |
788 put_byte(&s1->pb, (RTP_VERSION << 6)); | |
789 put_byte(&s1->pb, 200); | |
790 put_be16(&s1->pb, 6); /* length in words - 1 */ | |
791 put_be32(&s1->pb, s->ssrc); | |
792 put_be64(&s1->pb, ntp_time); | |
793 put_be32(&s1->pb, s->timestamp); | |
794 put_be32(&s1->pb, s->packet_count); | |
795 put_be32(&s1->pb, s->octet_count); | |
796 put_flush_packet(&s1->pb); | |
797 } | |
798 | |
799 /* send an rtp packet. sequence number is incremented, but the caller | |
800 must update the timestamp itself */ | |
826
ee7ba4017c8d
MPEG4 streaming over RTP patch by (Luca Abeni: lucabe72, email it)
michael
parents:
820
diff
changeset
|
801 static void rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m) |
0 | 802 { |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
803 RTPDemuxContext *s = s1->priv_data; |
0 | 804 |
805 #ifdef DEBUG | |
806 printf("rtp_send_data size=%d\n", len); | |
807 #endif | |
808 | |
809 /* build the RTP header */ | |
810 put_byte(&s1->pb, (RTP_VERSION << 6)); | |
826
ee7ba4017c8d
MPEG4 streaming over RTP patch by (Luca Abeni: lucabe72, email it)
michael
parents:
820
diff
changeset
|
811 put_byte(&s1->pb, (s->payload_type & 0x7f) | ((m & 0x01) << 7)); |
0 | 812 put_be16(&s1->pb, s->seq); |
813 put_be32(&s1->pb, s->timestamp); | |
814 put_be32(&s1->pb, s->ssrc); | |
885 | 815 |
0 | 816 put_buffer(&s1->pb, buf1, len); |
817 put_flush_packet(&s1->pb); | |
885 | 818 |
0 | 819 s->seq++; |
820 s->octet_count += len; | |
821 s->packet_count++; | |
822 } | |
823 | |
824 /* send an integer number of samples and compute time stamp and fill | |
825 the rtp send buffer before sending. */ | |
826 static void rtp_send_samples(AVFormatContext *s1, | |
241 | 827 const uint8_t *buf1, int size, int sample_size) |
0 | 828 { |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
829 RTPDemuxContext *s = s1->priv_data; |
0 | 830 int len, max_packet_size, n; |
831 | |
832 max_packet_size = (s->max_payload_size / sample_size) * sample_size; | |
833 /* not needed, but who nows */ | |
834 if ((size % sample_size) != 0) | |
835 av_abort(); | |
836 while (size > 0) { | |
837 len = (max_packet_size - (s->buf_ptr - s->buf)); | |
838 if (len > size) | |
839 len = size; | |
840 | |
841 /* copy data */ | |
842 memcpy(s->buf_ptr, buf1, len); | |
843 s->buf_ptr += len; | |
844 buf1 += len; | |
845 size -= len; | |
846 n = (s->buf_ptr - s->buf); | |
847 /* if buffer full, then send it */ | |
848 if (n >= max_packet_size) { | |
826
ee7ba4017c8d
MPEG4 streaming over RTP patch by (Luca Abeni: lucabe72, email it)
michael
parents:
820
diff
changeset
|
849 rtp_send_data(s1, s->buf, n, 0); |
0 | 850 s->buf_ptr = s->buf; |
851 /* update timestamp */ | |
852 s->timestamp += n / sample_size; | |
853 } | |
854 } | |
885 | 855 } |
0 | 856 |
857 /* NOTE: we suppose that exactly one frame is given as argument here */ | |
858 /* XXX: test it */ | |
859 static void rtp_send_mpegaudio(AVFormatContext *s1, | |
241 | 860 const uint8_t *buf1, int size) |
0 | 861 { |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
862 RTPDemuxContext *s = s1->priv_data; |
0 | 863 AVStream *st = s1->streams[0]; |
864 int len, count, max_packet_size; | |
865 | |
866 max_packet_size = s->max_payload_size; | |
867 | |
868 /* test if we must flush because not enough space */ | |
869 len = (s->buf_ptr - s->buf); | |
870 if ((len + size) > max_packet_size) { | |
871 if (len > 4) { | |
826
ee7ba4017c8d
MPEG4 streaming over RTP patch by (Luca Abeni: lucabe72, email it)
michael
parents:
820
diff
changeset
|
872 rtp_send_data(s1, s->buf, s->buf_ptr - s->buf, 0); |
0 | 873 s->buf_ptr = s->buf + 4; |
874 /* 90 KHz time stamp */ | |
885 | 875 s->timestamp = s->base_timestamp + |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
777
diff
changeset
|
876 (s->cur_timestamp * 90000LL) / st->codec->sample_rate; |
0 | 877 } |
878 } | |
879 | |
880 /* add the packet */ | |
881 if (size > max_packet_size) { | |
882 /* big packet: fragment */ | |
883 count = 0; | |
884 while (size > 0) { | |
885 len = max_packet_size - 4; | |
886 if (len > size) | |
887 len = size; | |
888 /* build fragmented packet */ | |
889 s->buf[0] = 0; | |
890 s->buf[1] = 0; | |
891 s->buf[2] = count >> 8; | |
892 s->buf[3] = count; | |
893 memcpy(s->buf + 4, buf1, len); | |
826
ee7ba4017c8d
MPEG4 streaming over RTP patch by (Luca Abeni: lucabe72, email it)
michael
parents:
820
diff
changeset
|
894 rtp_send_data(s1, s->buf, len + 4, 0); |
0 | 895 size -= len; |
896 buf1 += len; | |
897 count += len; | |
898 } | |
899 } else { | |
900 if (s->buf_ptr == s->buf + 4) { | |
901 /* no fragmentation possible */ | |
902 s->buf[0] = 0; | |
903 s->buf[1] = 0; | |
904 s->buf[2] = 0; | |
905 s->buf[3] = 0; | |
906 } | |
907 memcpy(s->buf_ptr, buf1, size); | |
908 s->buf_ptr += size; | |
909 } | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
777
diff
changeset
|
910 s->cur_timestamp += st->codec->frame_size; |
0 | 911 } |
912 | |
913 /* NOTE: a single frame must be passed with sequence header if | |
914 needed. XXX: use slices. */ | |
915 static void rtp_send_mpegvideo(AVFormatContext *s1, | |
241 | 916 const uint8_t *buf1, int size) |
0 | 917 { |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
918 RTPDemuxContext *s = s1->priv_data; |
0 | 919 AVStream *st = s1->streams[0]; |
920 int len, h, max_packet_size; | |
65 | 921 uint8_t *q; |
0 | 922 |
923 max_packet_size = s->max_payload_size; | |
924 | |
925 while (size > 0) { | |
926 /* XXX: more correct headers */ | |
927 h = 0; | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
777
diff
changeset
|
928 if (st->codec->sub_id == 2) |
0 | 929 h |= 1 << 26; /* mpeg 2 indicator */ |
930 q = s->buf; | |
931 *q++ = h >> 24; | |
932 *q++ = h >> 16; | |
933 *q++ = h >> 8; | |
934 *q++ = h; | |
935 | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
777
diff
changeset
|
936 if (st->codec->sub_id == 2) { |
0 | 937 h = 0; |
938 *q++ = h >> 24; | |
939 *q++ = h >> 16; | |
940 *q++ = h >> 8; | |
941 *q++ = h; | |
942 } | |
885 | 943 |
0 | 944 len = max_packet_size - (q - s->buf); |
945 if (len > size) | |
946 len = size; | |
947 | |
948 memcpy(q, buf1, len); | |
949 q += len; | |
950 | |
951 /* 90 KHz time stamp */ | |
885 | 952 s->timestamp = s->base_timestamp + |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
777
diff
changeset
|
953 av_rescale((int64_t)s->cur_timestamp * st->codec->time_base.num, 90000, st->codec->time_base.den); //FIXME pass timestamps |
827
d064b7d0899d
mpeg1video m bit fix by (Luca Abeni: lucabe72, email it)
michael
parents:
826
diff
changeset
|
954 rtp_send_data(s1, s->buf, q - s->buf, (len == size)); |
0 | 955 |
956 buf1 += len; | |
957 size -= len; | |
958 } | |
959 s->cur_timestamp++; | |
960 } | |
961 | |
962 static void rtp_send_raw(AVFormatContext *s1, | |
241 | 963 const uint8_t *buf1, int size) |
0 | 964 { |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
965 RTPDemuxContext *s = s1->priv_data; |
0 | 966 AVStream *st = s1->streams[0]; |
967 int len, max_packet_size; | |
968 | |
969 max_packet_size = s->max_payload_size; | |
970 | |
971 while (size > 0) { | |
972 len = max_packet_size; | |
973 if (len > size) | |
974 len = size; | |
975 | |
976 /* 90 KHz time stamp */ | |
885 | 977 s->timestamp = s->base_timestamp + |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
777
diff
changeset
|
978 av_rescale((int64_t)s->cur_timestamp * st->codec->time_base.num, 90000, st->codec->time_base.den); //FIXME pass timestamps |
826
ee7ba4017c8d
MPEG4 streaming over RTP patch by (Luca Abeni: lucabe72, email it)
michael
parents:
820
diff
changeset
|
979 rtp_send_data(s1, buf1, len, (len == size)); |
0 | 980 |
981 buf1 += len; | |
982 size -= len; | |
983 } | |
984 s->cur_timestamp++; | |
985 } | |
986 | |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
987 /* NOTE: size is assumed to be an integer multiple of TS_PACKET_SIZE */ |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
988 static void rtp_send_mpegts_raw(AVFormatContext *s1, |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
989 const uint8_t *buf1, int size) |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
990 { |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
991 RTPDemuxContext *s = s1->priv_data; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
992 int len, out_len; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
993 |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
994 while (size >= TS_PACKET_SIZE) { |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
995 len = s->max_payload_size - (s->buf_ptr - s->buf); |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
996 if (len > size) |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
997 len = size; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
998 memcpy(s->buf_ptr, buf1, len); |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
999 buf1 += len; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
1000 size -= len; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
1001 s->buf_ptr += len; |
885 | 1002 |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
1003 out_len = s->buf_ptr - s->buf; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
1004 if (out_len >= s->max_payload_size) { |
826
ee7ba4017c8d
MPEG4 streaming over RTP patch by (Luca Abeni: lucabe72, email it)
michael
parents:
820
diff
changeset
|
1005 rtp_send_data(s1, s->buf, out_len, 0); |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
1006 s->buf_ptr = s->buf; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
1007 } |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
1008 } |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
1009 } |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
1010 |
0 | 1011 /* write an RTP packet. 'buf1' must contain a single specific frame. */ |
468 | 1012 static int rtp_write_packet(AVFormatContext *s1, AVPacket *pkt) |
0 | 1013 { |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
1014 RTPDemuxContext *s = s1->priv_data; |
0 | 1015 AVStream *st = s1->streams[0]; |
1016 int rtcp_bytes; | |
65 | 1017 int64_t ntp_time; |
468 | 1018 int size= pkt->size; |
1019 uint8_t *buf1= pkt->data; | |
885 | 1020 |
0 | 1021 #ifdef DEBUG |
468 | 1022 printf("%d: write len=%d\n", pkt->stream_index, size); |
0 | 1023 #endif |
1024 | |
1025 /* XXX: mpeg pts hardcoded. RTCP send every 0.5 seconds */ | |
885 | 1026 rtcp_bytes = ((s->octet_count - s->last_octet_count) * RTCP_TX_RATIO_NUM) / |
0 | 1027 RTCP_TX_RATIO_DEN; |
1028 if (s->first_packet || rtcp_bytes >= 28) { | |
1029 /* compute NTP time */ | |
173 | 1030 /* XXX: 90 kHz timestamp hardcoded */ |
468 | 1031 ntp_time = (pkt->pts << 28) / 5625; |
885 | 1032 rtcp_send_sr(s1, ntp_time); |
0 | 1033 s->last_octet_count = s->octet_count; |
1034 s->first_packet = 0; | |
1035 } | |
1036 | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
777
diff
changeset
|
1037 switch(st->codec->codec_id) { |
0 | 1038 case CODEC_ID_PCM_MULAW: |
1039 case CODEC_ID_PCM_ALAW: | |
1040 case CODEC_ID_PCM_U8: | |
1041 case CODEC_ID_PCM_S8: | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
777
diff
changeset
|
1042 rtp_send_samples(s1, buf1, size, 1 * st->codec->channels); |
0 | 1043 break; |
1044 case CODEC_ID_PCM_U16BE: | |
1045 case CODEC_ID_PCM_U16LE: | |
1046 case CODEC_ID_PCM_S16BE: | |
1047 case CODEC_ID_PCM_S16LE: | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
777
diff
changeset
|
1048 rtp_send_samples(s1, buf1, size, 2 * st->codec->channels); |
0 | 1049 break; |
1050 case CODEC_ID_MP2: | |
232 | 1051 case CODEC_ID_MP3: |
0 | 1052 rtp_send_mpegaudio(s1, buf1, size); |
1053 break; | |
1054 case CODEC_ID_MPEG1VIDEO: | |
1055 rtp_send_mpegvideo(s1, buf1, size); | |
1056 break; | |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
1057 case CODEC_ID_MPEG2TS: |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
1058 rtp_send_mpegts_raw(s1, buf1, size); |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
1059 break; |
0 | 1060 default: |
1061 /* better than nothing : send the codec raw data */ | |
1062 rtp_send_raw(s1, buf1, size); | |
1063 break; | |
1064 } | |
1065 return 0; | |
1066 } | |
1067 | |
1068 static int rtp_write_trailer(AVFormatContext *s1) | |
1069 { | |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
1070 // RTPDemuxContext *s = s1->priv_data; |
0 | 1071 return 0; |
1072 } | |
1073 | |
1167 | 1074 AVOutputFormat rtp_muxer = { |
0 | 1075 "rtp", |
1076 "RTP output format", | |
1077 NULL, | |
1078 NULL, | |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
1079 sizeof(RTPDemuxContext), |
0 | 1080 CODEC_ID_PCM_MULAW, |
1081 CODEC_ID_NONE, | |
1082 rtp_write_header, | |
1083 rtp_write_packet, | |
1084 rtp_write_trailer, | |
1085 }; |