Mercurial > libavformat.hg
annotate rtpenc.c @ 3754:8d267b43eaba libavformat
Move malloc() down until after all initializations, so that the resource is
only allocated if initialization worked. This means that on failure, we
don't have to deallocate it.
author | rbultje |
---|---|
date | Sat, 23 Aug 2008 18:46:30 +0000 |
parents | e6a42f4e5429 |
children | 77e0c7511d41 |
rev | line source |
---|---|
0 | 1 /* |
2892
0d82fdf4fa94
Split the RTP muxer out of rtp.c, to simplify the RTSP demuxer's dependencies
lucabe
parents:
2891
diff
changeset
|
2 * RTP output format |
0 | 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 */ |
3286 | 21 |
22 #include "libavcodec/bitstream.h" | |
0 | 23 #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
|
24 #include "mpegts.h" |
0 | 25 |
26 #include <unistd.h> | |
1754 | 27 #include "network.h" |
0 | 28 |
1419 | 29 #include "rtp_internal.h" |
2406
18e94e5989d8
Move the RTP packetization code for MPEG12 video in its own file (rtp_mpv.c)
lucabe
parents:
2274
diff
changeset
|
30 #include "rtp_mpv.h" |
2550
e9c34ec665c6
Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
2540
diff
changeset
|
31 #include "rtp_aac.h" |
2960 | 32 #include "rtp_h264.h" |
1419 | 33 |
0 | 34 //#define DEBUG |
35 | |
2705
cc693f9e80ee
Use a symbolic name for the payload size of an RTCP Sender Report packet
lucabe
parents:
2587
diff
changeset
|
36 #define RTCP_SR_SIZE 28 |
3057
b2853b499660
Fix computation of the "NTP time" field in RTCP SR packets, and do not
lucabe
parents:
2960
diff
changeset
|
37 #define NTP_OFFSET 2208988800ULL |
b2853b499660
Fix computation of the "NTP time" field in RTCP SR packets, and do not
lucabe
parents:
2960
diff
changeset
|
38 #define NTP_OFFSET_US (NTP_OFFSET * 1000000ULL) |
b2853b499660
Fix computation of the "NTP time" field in RTCP SR packets, and do not
lucabe
parents:
2960
diff
changeset
|
39 |
b2853b499660
Fix computation of the "NTP time" field in RTCP SR packets, and do not
lucabe
parents:
2960
diff
changeset
|
40 static uint64_t ntp_time(void) |
b2853b499660
Fix computation of the "NTP time" field in RTCP SR packets, and do not
lucabe
parents:
2960
diff
changeset
|
41 { |
b2853b499660
Fix computation of the "NTP time" field in RTCP SR packets, and do not
lucabe
parents:
2960
diff
changeset
|
42 return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US; |
b2853b499660
Fix computation of the "NTP time" field in RTCP SR packets, and do not
lucabe
parents:
2960
diff
changeset
|
43 } |
0 | 44 |
45 static int rtp_write_header(AVFormatContext *s1) | |
46 { | |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
47 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
|
48 int payload_type, max_packet_size, n; |
0 | 49 AVStream *st; |
50 | |
51 if (s1->nb_streams != 1) | |
52 return -1; | |
53 st = s1->streams[0]; | |
54 | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
777
diff
changeset
|
55 payload_type = rtp_get_payload_type(st->codec); |
0 | 56 if (payload_type < 0) |
57 payload_type = RTP_PT_PRIVATE; /* private payload type */ | |
58 s->payload_type = payload_type; | |
59 | |
2790 | 60 // following 2 FIXMEs could be set based on the current time, there is normally no info leak, as RTP will likely be transmitted immediately |
1045
7f1b7f811f01
fix constraint violation: libavformat is not allowed to modify state of caller, including rng state
rfelker
parents:
986
diff
changeset
|
61 s->base_timestamp = 0; /* FIXME: was random(), what should this be? */ |
0 | 62 s->timestamp = s->base_timestamp; |
2540
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
63 s->cur_timestamp = 0; |
1045
7f1b7f811f01
fix constraint violation: libavformat is not allowed to modify state of caller, including rng state
rfelker
parents:
986
diff
changeset
|
64 s->ssrc = 0; /* FIXME: was random(), what should this be? */ |
0 | 65 s->first_packet = 1; |
2539
ba933dfa4833
Properly set RTP and NTP timestamps in RTCP SR packets
lucabe
parents:
2406
diff
changeset
|
66 s->first_rtcp_ntp_time = AV_NOPTS_VALUE; |
0 | 67 |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
68 max_packet_size = url_fget_max_packet_size(s1->pb); |
0 | 69 if (max_packet_size <= 12) |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2222
diff
changeset
|
70 return AVERROR(EIO); |
0 | 71 s->max_payload_size = max_packet_size - 12; |
72 | |
2587
d751acab2622
Allow to set the maximum number of frames per RTP packet (and add support for
lucabe
parents:
2569
diff
changeset
|
73 s->max_frames_per_packet = 0; |
d751acab2622
Allow to set the maximum number of frames per RTP packet (and add support for
lucabe
parents:
2569
diff
changeset
|
74 if (s1->max_delay) { |
d751acab2622
Allow to set the maximum number of frames per RTP packet (and add support for
lucabe
parents:
2569
diff
changeset
|
75 if (st->codec->codec_type == CODEC_TYPE_AUDIO) { |
d751acab2622
Allow to set the maximum number of frames per RTP packet (and add support for
lucabe
parents:
2569
diff
changeset
|
76 if (st->codec->frame_size == 0) { |
d751acab2622
Allow to set the maximum number of frames per RTP packet (and add support for
lucabe
parents:
2569
diff
changeset
|
77 av_log(s1, AV_LOG_ERROR, "Cannot respect max delay: frame size = 0\n"); |
d751acab2622
Allow to set the maximum number of frames per RTP packet (and add support for
lucabe
parents:
2569
diff
changeset
|
78 } else { |
d751acab2622
Allow to set the maximum number of frames per RTP packet (and add support for
lucabe
parents:
2569
diff
changeset
|
79 s->max_frames_per_packet = av_rescale_rnd(s1->max_delay, st->codec->sample_rate, AV_TIME_BASE * st->codec->frame_size, AV_ROUND_DOWN); |
d751acab2622
Allow to set the maximum number of frames per RTP packet (and add support for
lucabe
parents:
2569
diff
changeset
|
80 } |
d751acab2622
Allow to set the maximum number of frames per RTP packet (and add support for
lucabe
parents:
2569
diff
changeset
|
81 } |
d751acab2622
Allow to set the maximum number of frames per RTP packet (and add support for
lucabe
parents:
2569
diff
changeset
|
82 if (st->codec->codec_type == CODEC_TYPE_VIDEO) { |
d751acab2622
Allow to set the maximum number of frames per RTP packet (and add support for
lucabe
parents:
2569
diff
changeset
|
83 /* FIXME: We should round down here... */ |
3500 | 84 s->max_frames_per_packet = av_rescale_q(s1->max_delay, (AVRational){1, 1000000}, st->codec->time_base); |
2587
d751acab2622
Allow to set the maximum number of frames per RTP packet (and add support for
lucabe
parents:
2569
diff
changeset
|
85 } |
d751acab2622
Allow to set the maximum number of frames per RTP packet (and add support for
lucabe
parents:
2569
diff
changeset
|
86 } |
d751acab2622
Allow to set the maximum number of frames per RTP packet (and add support for
lucabe
parents:
2569
diff
changeset
|
87 |
2540
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
88 av_set_pts_info(st, 32, 1, 90000); |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
777
diff
changeset
|
89 switch(st->codec->codec_id) { |
0 | 90 case CODEC_ID_MP2: |
232 | 91 case CODEC_ID_MP3: |
0 | 92 s->buf_ptr = s->buf + 4; |
93 break; | |
94 case CODEC_ID_MPEG1VIDEO: | |
2760 | 95 case CODEC_ID_MPEG2VIDEO: |
0 | 96 break; |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
97 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
|
98 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
|
99 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
|
100 n = 1; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
101 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
|
102 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
|
103 break; |
2550
e9c34ec665c6
Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
2540
diff
changeset
|
104 case CODEC_ID_AAC: |
e9c34ec665c6
Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
2540
diff
changeset
|
105 s->read_buf_index = 0; |
0 | 106 default: |
2539
ba933dfa4833
Properly set RTP and NTP timestamps in RTCP SR packets
lucabe
parents:
2406
diff
changeset
|
107 if (st->codec->codec_type == CODEC_TYPE_AUDIO) { |
ba933dfa4833
Properly set RTP and NTP timestamps in RTCP SR packets
lucabe
parents:
2406
diff
changeset
|
108 av_set_pts_info(st, 32, 1, st->codec->sample_rate); |
ba933dfa4833
Properly set RTP and NTP timestamps in RTCP SR packets
lucabe
parents:
2406
diff
changeset
|
109 } |
0 | 110 s->buf_ptr = s->buf; |
111 break; | |
112 } | |
113 | |
114 return 0; | |
115 } | |
116 | |
117 /* send an rtcp sender report packet */ | |
65 | 118 static void rtcp_send_sr(AVFormatContext *s1, int64_t ntp_time) |
0 | 119 { |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
120 RTPDemuxContext *s = s1->priv_data; |
2539
ba933dfa4833
Properly set RTP and NTP timestamps in RTCP SR packets
lucabe
parents:
2406
diff
changeset
|
121 uint32_t rtp_ts; |
ba933dfa4833
Properly set RTP and NTP timestamps in RTCP SR packets
lucabe
parents:
2406
diff
changeset
|
122 |
3579 | 123 dprintf(s1, "RTCP: %02x %"PRIx64" %x\n", s->payload_type, ntp_time, s->timestamp); |
2539
ba933dfa4833
Properly set RTP and NTP timestamps in RTCP SR packets
lucabe
parents:
2406
diff
changeset
|
124 |
ba933dfa4833
Properly set RTP and NTP timestamps in RTCP SR packets
lucabe
parents:
2406
diff
changeset
|
125 if (s->first_rtcp_ntp_time == AV_NOPTS_VALUE) s->first_rtcp_ntp_time = ntp_time; |
2706
b1723b8da595
Do not send too many RTCP packets (according to RFC 3550, the minimum
lucabe
parents:
2705
diff
changeset
|
126 s->last_rtcp_ntp_time = ntp_time; |
3500 | 127 rtp_ts = av_rescale_q(ntp_time - s->first_rtcp_ntp_time, (AVRational){1, 1000000}, |
2539
ba933dfa4833
Properly set RTP and NTP timestamps in RTCP SR packets
lucabe
parents:
2406
diff
changeset
|
128 s1->streams[0]->time_base) + s->base_timestamp; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
129 put_byte(s1->pb, (RTP_VERSION << 6)); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
130 put_byte(s1->pb, 200); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
131 put_be16(s1->pb, 6); /* length in words - 1 */ |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
132 put_be32(s1->pb, s->ssrc); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
133 put_be32(s1->pb, ntp_time / 1000000); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
134 put_be32(s1->pb, ((ntp_time % 1000000) << 32) / 1000000); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
135 put_be32(s1->pb, rtp_ts); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
136 put_be32(s1->pb, s->packet_count); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
137 put_be32(s1->pb, s->octet_count); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
138 put_flush_packet(s1->pb); |
0 | 139 } |
140 | |
141 /* send an rtp packet. sequence number is incremented, but the caller | |
142 must update the timestamp itself */ | |
2406
18e94e5989d8
Move the RTP packetization code for MPEG12 video in its own file (rtp_mpv.c)
lucabe
parents:
2274
diff
changeset
|
143 void ff_rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m) |
0 | 144 { |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
145 RTPDemuxContext *s = s1->priv_data; |
0 | 146 |
3579 | 147 dprintf(s1, "rtp_send_data size=%d\n", len); |
0 | 148 |
149 /* build the RTP header */ | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
150 put_byte(s1->pb, (RTP_VERSION << 6)); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
151 put_byte(s1->pb, (s->payload_type & 0x7f) | ((m & 0x01) << 7)); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
152 put_be16(s1->pb, s->seq); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
153 put_be32(s1->pb, s->timestamp); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
154 put_be32(s1->pb, s->ssrc); |
885 | 155 |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
156 put_buffer(s1->pb, buf1, len); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
157 put_flush_packet(s1->pb); |
885 | 158 |
0 | 159 s->seq++; |
160 s->octet_count += len; | |
161 s->packet_count++; | |
162 } | |
163 | |
164 /* send an integer number of samples and compute time stamp and fill | |
165 the rtp send buffer before sending. */ | |
166 static void rtp_send_samples(AVFormatContext *s1, | |
241 | 167 const uint8_t *buf1, int size, int sample_size) |
0 | 168 { |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
169 RTPDemuxContext *s = s1->priv_data; |
0 | 170 int len, max_packet_size, n; |
171 | |
172 max_packet_size = (s->max_payload_size / sample_size) * sample_size; | |
173 /* not needed, but who nows */ | |
174 if ((size % sample_size) != 0) | |
175 av_abort(); | |
2540
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
176 n = 0; |
0 | 177 while (size > 0) { |
2540
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
178 s->buf_ptr = s->buf; |
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
179 len = FFMIN(max_packet_size, size); |
0 | 180 |
181 /* copy data */ | |
182 memcpy(s->buf_ptr, buf1, len); | |
183 s->buf_ptr += len; | |
184 buf1 += len; | |
185 size -= len; | |
2540
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
186 s->timestamp = s->cur_timestamp + n / sample_size; |
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
187 ff_rtp_send_data(s1, s->buf, s->buf_ptr - s->buf, 0); |
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
188 n += (s->buf_ptr - s->buf); |
0 | 189 } |
885 | 190 } |
0 | 191 |
192 /* NOTE: we suppose that exactly one frame is given as argument here */ | |
193 /* XXX: test it */ | |
194 static void rtp_send_mpegaudio(AVFormatContext *s1, | |
241 | 195 const uint8_t *buf1, int size) |
0 | 196 { |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
197 RTPDemuxContext *s = s1->priv_data; |
0 | 198 int len, count, max_packet_size; |
199 | |
200 max_packet_size = s->max_payload_size; | |
201 | |
202 /* test if we must flush because not enough space */ | |
203 len = (s->buf_ptr - s->buf); | |
204 if ((len + size) > max_packet_size) { | |
205 if (len > 4) { | |
2406
18e94e5989d8
Move the RTP packetization code for MPEG12 video in its own file (rtp_mpv.c)
lucabe
parents:
2274
diff
changeset
|
206 ff_rtp_send_data(s1, s->buf, s->buf_ptr - s->buf, 0); |
0 | 207 s->buf_ptr = s->buf + 4; |
208 } | |
209 } | |
2540
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
210 if (s->buf_ptr == s->buf + 4) { |
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
211 s->timestamp = s->cur_timestamp; |
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
212 } |
0 | 213 |
214 /* add the packet */ | |
215 if (size > max_packet_size) { | |
216 /* big packet: fragment */ | |
217 count = 0; | |
218 while (size > 0) { | |
219 len = max_packet_size - 4; | |
220 if (len > size) | |
221 len = size; | |
222 /* build fragmented packet */ | |
223 s->buf[0] = 0; | |
224 s->buf[1] = 0; | |
225 s->buf[2] = count >> 8; | |
226 s->buf[3] = count; | |
227 memcpy(s->buf + 4, buf1, len); | |
2406
18e94e5989d8
Move the RTP packetization code for MPEG12 video in its own file (rtp_mpv.c)
lucabe
parents:
2274
diff
changeset
|
228 ff_rtp_send_data(s1, s->buf, len + 4, 0); |
0 | 229 size -= len; |
230 buf1 += len; | |
231 count += len; | |
232 } | |
233 } else { | |
234 if (s->buf_ptr == s->buf + 4) { | |
235 /* no fragmentation possible */ | |
236 s->buf[0] = 0; | |
237 s->buf[1] = 0; | |
238 s->buf[2] = 0; | |
239 s->buf[3] = 0; | |
240 } | |
241 memcpy(s->buf_ptr, buf1, size); | |
242 s->buf_ptr += size; | |
243 } | |
244 } | |
245 | |
246 static void rtp_send_raw(AVFormatContext *s1, | |
241 | 247 const uint8_t *buf1, int size) |
0 | 248 { |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
249 RTPDemuxContext *s = s1->priv_data; |
0 | 250 int len, max_packet_size; |
251 | |
252 max_packet_size = s->max_payload_size; | |
253 | |
254 while (size > 0) { | |
255 len = max_packet_size; | |
256 if (len > size) | |
257 len = size; | |
258 | |
2540
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
259 s->timestamp = s->cur_timestamp; |
2406
18e94e5989d8
Move the RTP packetization code for MPEG12 video in its own file (rtp_mpv.c)
lucabe
parents:
2274
diff
changeset
|
260 ff_rtp_send_data(s1, buf1, len, (len == size)); |
0 | 261 |
262 buf1 += len; | |
263 size -= len; | |
264 } | |
265 } | |
266 | |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
267 /* 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
|
268 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
|
269 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
|
270 { |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
271 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
|
272 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
|
273 |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
274 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
|
275 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
|
276 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
|
277 len = size; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
278 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
|
279 buf1 += len; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
280 size -= len; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
281 s->buf_ptr += len; |
885 | 282 |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
283 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
|
284 if (out_len >= s->max_payload_size) { |
2406
18e94e5989d8
Move the RTP packetization code for MPEG12 video in its own file (rtp_mpv.c)
lucabe
parents:
2274
diff
changeset
|
285 ff_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
|
286 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
|
287 } |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
288 } |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
289 } |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
290 |
0 | 291 /* write an RTP packet. 'buf1' must contain a single specific frame. */ |
468 | 292 static int rtp_write_packet(AVFormatContext *s1, AVPacket *pkt) |
0 | 293 { |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
294 RTPDemuxContext *s = s1->priv_data; |
0 | 295 AVStream *st = s1->streams[0]; |
296 int rtcp_bytes; | |
468 | 297 int size= pkt->size; |
298 uint8_t *buf1= pkt->data; | |
885 | 299 |
3579 | 300 dprintf(s1, "%d: write len=%d\n", pkt->stream_index, size); |
0 | 301 |
885 | 302 rtcp_bytes = ((s->octet_count - s->last_octet_count) * RTCP_TX_RATIO_NUM) / |
0 | 303 RTCP_TX_RATIO_DEN; |
2706
b1723b8da595
Do not send too many RTCP packets (according to RFC 3550, the minimum
lucabe
parents:
2705
diff
changeset
|
304 if (s->first_packet || ((rtcp_bytes >= RTCP_SR_SIZE) && |
3057
b2853b499660
Fix computation of the "NTP time" field in RTCP SR packets, and do not
lucabe
parents:
2960
diff
changeset
|
305 (ntp_time() - s->last_rtcp_ntp_time > 5000000))) { |
b2853b499660
Fix computation of the "NTP time" field in RTCP SR packets, and do not
lucabe
parents:
2960
diff
changeset
|
306 rtcp_send_sr(s1, ntp_time()); |
0 | 307 s->last_octet_count = s->octet_count; |
308 s->first_packet = 0; | |
309 } | |
2540
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
310 s->cur_timestamp = s->base_timestamp + pkt->pts; |
0 | 311 |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
777
diff
changeset
|
312 switch(st->codec->codec_id) { |
0 | 313 case CODEC_ID_PCM_MULAW: |
314 case CODEC_ID_PCM_ALAW: | |
315 case CODEC_ID_PCM_U8: | |
316 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
|
317 rtp_send_samples(s1, buf1, size, 1 * st->codec->channels); |
0 | 318 break; |
319 case CODEC_ID_PCM_U16BE: | |
320 case CODEC_ID_PCM_U16LE: | |
321 case CODEC_ID_PCM_S16BE: | |
322 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
|
323 rtp_send_samples(s1, buf1, size, 2 * st->codec->channels); |
0 | 324 break; |
325 case CODEC_ID_MP2: | |
232 | 326 case CODEC_ID_MP3: |
0 | 327 rtp_send_mpegaudio(s1, buf1, size); |
328 break; | |
329 case CODEC_ID_MPEG1VIDEO: | |
2760 | 330 case CODEC_ID_MPEG2VIDEO: |
2406
18e94e5989d8
Move the RTP packetization code for MPEG12 video in its own file (rtp_mpv.c)
lucabe
parents:
2274
diff
changeset
|
331 ff_rtp_send_mpegvideo(s1, buf1, size); |
0 | 332 break; |
2550
e9c34ec665c6
Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
2540
diff
changeset
|
333 case CODEC_ID_AAC: |
e9c34ec665c6
Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
2540
diff
changeset
|
334 ff_rtp_send_aac(s1, buf1, size); |
e9c34ec665c6
Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
2540
diff
changeset
|
335 break; |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
336 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
|
337 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
|
338 break; |
2960 | 339 case CODEC_ID_H264: |
340 ff_rtp_send_h264(s1, buf1, size); | |
341 break; | |
0 | 342 default: |
343 /* better than nothing : send the codec raw data */ | |
344 rtp_send_raw(s1, buf1, size); | |
345 break; | |
346 } | |
347 return 0; | |
348 } | |
349 | |
1167 | 350 AVOutputFormat rtp_muxer = { |
0 | 351 "rtp", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3286
diff
changeset
|
352 NULL_IF_CONFIG_SMALL("RTP output format"), |
0 | 353 NULL, |
354 NULL, | |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
355 sizeof(RTPDemuxContext), |
0 | 356 CODEC_ID_PCM_MULAW, |
357 CODEC_ID_NONE, | |
358 rtp_write_header, | |
359 rtp_write_packet, | |
360 }; |