Mercurial > libavformat.hg
annotate rtpenc.c @ 5644:95e016b6158c libavformat
Don't forget to set known audio parameters (samplerate, etc.) if the codec is
not supported in FFmpeg. This will cause crashes later because the samplerate
is used to initialize the timebase.
author | rbultje |
---|---|
date | Wed, 10 Feb 2010 18:30:55 +0000 |
parents | f9d233143854 |
children | 7826bf683210 |
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 |
4251
77e0c7511d41
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
3579
diff
changeset
|
3 * Copyright (c) 2002 Fabrice Bellard |
0 | 4 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1332
diff
changeset
|
5 * This file is part of FFmpeg. |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1332
diff
changeset
|
6 * |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1332
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
0 | 8 * modify it under the terms of the GNU Lesser General Public |
9 * License as published by the Free Software Foundation; either | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1332
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
0 | 11 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1332
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
0 | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1332
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
896
edbe5c3717f9
Update licensing information: The FSF changed postal address.
diego
parents:
885
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 20 */ |
3286 | 21 |
0 | 22 #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
|
23 #include "mpegts.h" |
0 | 24 |
25 #include <unistd.h> | |
26 | |
4388 | 27 #include "rtpenc.h" |
1419 | 28 |
0 | 29 //#define DEBUG |
30 | |
2705
cc693f9e80ee
Use a symbolic name for the payload size of an RTCP Sender Report packet
lucabe
parents:
2587
diff
changeset
|
31 #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
|
32 #define NTP_OFFSET 2208988800ULL |
b2853b499660
Fix computation of the "NTP time" field in RTCP SR packets, and do not
lucabe
parents:
2960
diff
changeset
|
33 #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
|
34 |
b2853b499660
Fix computation of the "NTP time" field in RTCP SR packets, and do not
lucabe
parents:
2960
diff
changeset
|
35 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
|
36 { |
b2853b499660
Fix computation of the "NTP time" field in RTCP SR packets, and do not
lucabe
parents:
2960
diff
changeset
|
37 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
|
38 } |
0 | 39 |
4796
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
40 static int is_supported(enum CodecID id) |
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
41 { |
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
42 switch(id) { |
4814 | 43 case CODEC_ID_H263: |
44 case CODEC_ID_H263P: | |
4796
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
45 case CODEC_ID_H264: |
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
46 case CODEC_ID_MPEG1VIDEO: |
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
47 case CODEC_ID_MPEG2VIDEO: |
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
48 case CODEC_ID_MPEG4: |
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
49 case CODEC_ID_AAC: |
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
50 case CODEC_ID_MP2: |
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
51 case CODEC_ID_MP3: |
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
52 case CODEC_ID_PCM_ALAW: |
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
53 case CODEC_ID_PCM_MULAW: |
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
54 case CODEC_ID_PCM_S8: |
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
55 case CODEC_ID_PCM_S16BE: |
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
56 case CODEC_ID_PCM_S16LE: |
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
57 case CODEC_ID_PCM_U16BE: |
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
58 case CODEC_ID_PCM_U16LE: |
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
59 case CODEC_ID_PCM_U8: |
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
60 case CODEC_ID_MPEG2TS: |
4836 | 61 case CODEC_ID_AMR_NB: |
62 case CODEC_ID_AMR_WB: | |
4796
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
63 return 1; |
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
64 default: |
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
65 return 0; |
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
66 } |
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
67 } |
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
68 |
0 | 69 static int rtp_write_header(AVFormatContext *s1) |
70 { | |
4388 | 71 RTPMuxContext *s = s1->priv_data; |
5477 | 72 int max_packet_size, n; |
0 | 73 AVStream *st; |
74 | |
75 if (s1->nb_streams != 1) | |
76 return -1; | |
77 st = s1->streams[0]; | |
4796
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
78 if (!is_supported(st->codec->codec_id)) { |
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
79 av_log(s1, AV_LOG_ERROR, "Unsupported codec %x\n", st->codec->codec_id); |
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
80 |
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
81 return -1; |
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
82 } |
0 | 83 |
5477 | 84 s->payload_type = ff_rtp_get_payload_type(st->codec); |
85 if (s->payload_type < 0) | |
86 s->payload_type = RTP_PT_PRIVATE + (st->codec->codec_type == CODEC_TYPE_AUDIO); | |
0 | 87 |
2790 | 88 // 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
|
89 s->base_timestamp = 0; /* FIXME: was random(), what should this be? */ |
0 | 90 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
|
91 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
|
92 s->ssrc = 0; /* FIXME: was random(), what should this be? */ |
0 | 93 s->first_packet = 1; |
2539
ba933dfa4833
Properly set RTP and NTP timestamps in RTCP SR packets
lucabe
parents:
2406
diff
changeset
|
94 s->first_rtcp_ntp_time = AV_NOPTS_VALUE; |
0 | 95 |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
96 max_packet_size = url_fget_max_packet_size(s1->pb); |
0 | 97 if (max_packet_size <= 12) |
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2222
diff
changeset
|
98 return AVERROR(EIO); |
4391 | 99 s->buf = av_malloc(max_packet_size); |
100 if (s->buf == NULL) { | |
101 return AVERROR(ENOMEM); | |
102 } | |
0 | 103 s->max_payload_size = max_packet_size - 12; |
104 | |
2587
d751acab2622
Allow to set the maximum number of frames per RTP packet (and add support for
lucabe
parents:
2569
diff
changeset
|
105 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
|
106 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
|
107 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
|
108 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
|
109 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
|
110 } else { |
d751acab2622
Allow to set the maximum number of frames per RTP packet (and add support for
lucabe
parents:
2569
diff
changeset
|
111 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
|
112 } |
d751acab2622
Allow to set the maximum number of frames per RTP packet (and add support for
lucabe
parents:
2569
diff
changeset
|
113 } |
d751acab2622
Allow to set the maximum number of frames per RTP packet (and add support for
lucabe
parents:
2569
diff
changeset
|
114 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
|
115 /* FIXME: We should round down here... */ |
3500 | 116 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
|
117 } |
d751acab2622
Allow to set the maximum number of frames per RTP packet (and add support for
lucabe
parents:
2569
diff
changeset
|
118 } |
d751acab2622
Allow to set the maximum number of frames per RTP packet (and add support for
lucabe
parents:
2569
diff
changeset
|
119 |
2540
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
120 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
|
121 switch(st->codec->codec_id) { |
0 | 122 case CODEC_ID_MP2: |
232 | 123 case CODEC_ID_MP3: |
0 | 124 s->buf_ptr = s->buf + 4; |
125 break; | |
126 case CODEC_ID_MPEG1VIDEO: | |
2760 | 127 case CODEC_ID_MPEG2VIDEO: |
0 | 128 break; |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
129 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
|
130 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
|
131 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
|
132 n = 1; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
133 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
|
134 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
|
135 break; |
4836 | 136 case CODEC_ID_AMR_NB: |
137 case CODEC_ID_AMR_WB: | |
138 if (!s->max_frames_per_packet) | |
139 s->max_frames_per_packet = 12; | |
140 if (st->codec->codec_id == CODEC_ID_AMR_NB) | |
141 n = 31; | |
142 else | |
143 n = 61; | |
144 /* max_header_toc_size + the largest AMR payload must fit */ | |
145 if (1 + s->max_frames_per_packet + n > s->max_payload_size) { | |
146 av_log(s1, AV_LOG_ERROR, "RTP max payload size too small for AMR\n"); | |
147 return -1; | |
148 } | |
149 if (st->codec->channels != 1) { | |
150 av_log(s1, AV_LOG_ERROR, "Only mono is supported\n"); | |
151 return -1; | |
152 } | |
2550
e9c34ec665c6
Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
2540
diff
changeset
|
153 case CODEC_ID_AAC: |
4380
1b695f013cd3
Introduce a new num_frames field in RTPDemuxContext so that rtp_aac.c
lucabe
parents:
4291
diff
changeset
|
154 s->num_frames = 0; |
0 | 155 default: |
2539
ba933dfa4833
Properly set RTP and NTP timestamps in RTCP SR packets
lucabe
parents:
2406
diff
changeset
|
156 if (st->codec->codec_type == CODEC_TYPE_AUDIO) { |
ba933dfa4833
Properly set RTP and NTP timestamps in RTCP SR packets
lucabe
parents:
2406
diff
changeset
|
157 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
|
158 } |
0 | 159 s->buf_ptr = s->buf; |
160 break; | |
161 } | |
162 | |
163 return 0; | |
164 } | |
165 | |
166 /* send an rtcp sender report packet */ | |
65 | 167 static void rtcp_send_sr(AVFormatContext *s1, int64_t ntp_time) |
0 | 168 { |
4388 | 169 RTPMuxContext *s = s1->priv_data; |
2539
ba933dfa4833
Properly set RTP and NTP timestamps in RTCP SR packets
lucabe
parents:
2406
diff
changeset
|
170 uint32_t rtp_ts; |
ba933dfa4833
Properly set RTP and NTP timestamps in RTCP SR packets
lucabe
parents:
2406
diff
changeset
|
171 |
3579 | 172 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
|
173 |
ba933dfa4833
Properly set RTP and NTP timestamps in RTCP SR packets
lucabe
parents:
2406
diff
changeset
|
174 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
|
175 s->last_rtcp_ntp_time = ntp_time; |
3500 | 176 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
|
177 s1->streams[0]->time_base) + s->base_timestamp; |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
178 put_byte(s1->pb, (RTP_VERSION << 6)); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
179 put_byte(s1->pb, 200); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
180 put_be16(s1->pb, 6); /* length in words - 1 */ |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
181 put_be32(s1->pb, s->ssrc); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
182 put_be32(s1->pb, ntp_time / 1000000); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
183 put_be32(s1->pb, ((ntp_time % 1000000) << 32) / 1000000); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
184 put_be32(s1->pb, rtp_ts); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
185 put_be32(s1->pb, s->packet_count); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
186 put_be32(s1->pb, s->octet_count); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
187 put_flush_packet(s1->pb); |
0 | 188 } |
189 | |
190 /* send an rtp packet. sequence number is incremented, but the caller | |
191 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
|
192 void ff_rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m) |
0 | 193 { |
4388 | 194 RTPMuxContext *s = s1->priv_data; |
0 | 195 |
3579 | 196 dprintf(s1, "rtp_send_data size=%d\n", len); |
0 | 197 |
198 /* build the RTP header */ | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
199 put_byte(s1->pb, (RTP_VERSION << 6)); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
200 put_byte(s1->pb, (s->payload_type & 0x7f) | ((m & 0x01) << 7)); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
201 put_be16(s1->pb, s->seq); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
202 put_be32(s1->pb, s->timestamp); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
203 put_be32(s1->pb, s->ssrc); |
885 | 204 |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
205 put_buffer(s1->pb, buf1, len); |
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
206 put_flush_packet(s1->pb); |
885 | 207 |
0 | 208 s->seq++; |
209 s->octet_count += len; | |
210 s->packet_count++; | |
211 } | |
212 | |
213 /* send an integer number of samples and compute time stamp and fill | |
214 the rtp send buffer before sending. */ | |
215 static void rtp_send_samples(AVFormatContext *s1, | |
241 | 216 const uint8_t *buf1, int size, int sample_size) |
0 | 217 { |
4388 | 218 RTPMuxContext *s = s1->priv_data; |
0 | 219 int len, max_packet_size, n; |
220 | |
221 max_packet_size = (s->max_payload_size / sample_size) * sample_size; | |
222 /* not needed, but who nows */ | |
223 if ((size % sample_size) != 0) | |
224 av_abort(); | |
2540
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
225 n = 0; |
0 | 226 while (size > 0) { |
2540
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
227 s->buf_ptr = s->buf; |
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
228 len = FFMIN(max_packet_size, size); |
0 | 229 |
230 /* copy data */ | |
231 memcpy(s->buf_ptr, buf1, len); | |
232 s->buf_ptr += len; | |
233 buf1 += len; | |
234 size -= len; | |
2540
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
235 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
|
236 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
|
237 n += (s->buf_ptr - s->buf); |
0 | 238 } |
885 | 239 } |
0 | 240 |
241 static void rtp_send_mpegaudio(AVFormatContext *s1, | |
241 | 242 const uint8_t *buf1, int size) |
0 | 243 { |
4388 | 244 RTPMuxContext *s = s1->priv_data; |
0 | 245 int len, count, max_packet_size; |
246 | |
247 max_packet_size = s->max_payload_size; | |
248 | |
249 /* test if we must flush because not enough space */ | |
250 len = (s->buf_ptr - s->buf); | |
251 if ((len + size) > max_packet_size) { | |
252 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
|
253 ff_rtp_send_data(s1, s->buf, s->buf_ptr - s->buf, 0); |
0 | 254 s->buf_ptr = s->buf + 4; |
255 } | |
256 } | |
2540
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
257 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
|
258 s->timestamp = s->cur_timestamp; |
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
259 } |
0 | 260 |
261 /* add the packet */ | |
262 if (size > max_packet_size) { | |
263 /* big packet: fragment */ | |
264 count = 0; | |
265 while (size > 0) { | |
266 len = max_packet_size - 4; | |
267 if (len > size) | |
268 len = size; | |
269 /* build fragmented packet */ | |
270 s->buf[0] = 0; | |
271 s->buf[1] = 0; | |
272 s->buf[2] = count >> 8; | |
273 s->buf[3] = count; | |
274 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
|
275 ff_rtp_send_data(s1, s->buf, len + 4, 0); |
0 | 276 size -= len; |
277 buf1 += len; | |
278 count += len; | |
279 } | |
280 } else { | |
281 if (s->buf_ptr == s->buf + 4) { | |
282 /* no fragmentation possible */ | |
283 s->buf[0] = 0; | |
284 s->buf[1] = 0; | |
285 s->buf[2] = 0; | |
286 s->buf[3] = 0; | |
287 } | |
288 memcpy(s->buf_ptr, buf1, size); | |
289 s->buf_ptr += size; | |
290 } | |
291 } | |
292 | |
293 static void rtp_send_raw(AVFormatContext *s1, | |
241 | 294 const uint8_t *buf1, int size) |
0 | 295 { |
4388 | 296 RTPMuxContext *s = s1->priv_data; |
0 | 297 int len, max_packet_size; |
298 | |
299 max_packet_size = s->max_payload_size; | |
300 | |
301 while (size > 0) { | |
302 len = max_packet_size; | |
303 if (len > size) | |
304 len = size; | |
305 | |
2540
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
306 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
|
307 ff_rtp_send_data(s1, buf1, len, (len == size)); |
0 | 308 |
309 buf1 += len; | |
310 size -= len; | |
311 } | |
312 } | |
313 | |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
314 /* 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
|
315 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
|
316 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
|
317 { |
4388 | 318 RTPMuxContext *s = s1->priv_data; |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
319 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
|
320 |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
321 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
|
322 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
|
323 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
|
324 len = size; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
325 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
|
326 buf1 += len; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
327 size -= len; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
328 s->buf_ptr += len; |
885 | 329 |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
330 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
|
331 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
|
332 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
|
333 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
|
334 } |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
335 } |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
336 } |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
337 |
468 | 338 static int rtp_write_packet(AVFormatContext *s1, AVPacket *pkt) |
0 | 339 { |
4388 | 340 RTPMuxContext *s = s1->priv_data; |
0 | 341 AVStream *st = s1->streams[0]; |
342 int rtcp_bytes; | |
468 | 343 int size= pkt->size; |
885 | 344 |
3579 | 345 dprintf(s1, "%d: write len=%d\n", pkt->stream_index, size); |
0 | 346 |
885 | 347 rtcp_bytes = ((s->octet_count - s->last_octet_count) * RTCP_TX_RATIO_NUM) / |
0 | 348 RTCP_TX_RATIO_DEN; |
2706
b1723b8da595
Do not send too many RTCP packets (according to RFC 3550, the minimum
lucabe
parents:
2705
diff
changeset
|
349 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
|
350 (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
|
351 rtcp_send_sr(s1, ntp_time()); |
0 | 352 s->last_octet_count = s->octet_count; |
353 s->first_packet = 0; | |
354 } | |
2540
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
355 s->cur_timestamp = s->base_timestamp + pkt->pts; |
0 | 356 |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
777
diff
changeset
|
357 switch(st->codec->codec_id) { |
0 | 358 case CODEC_ID_PCM_MULAW: |
359 case CODEC_ID_PCM_ALAW: | |
360 case CODEC_ID_PCM_U8: | |
361 case CODEC_ID_PCM_S8: | |
5479 | 362 rtp_send_samples(s1, pkt->data, size, 1 * st->codec->channels); |
0 | 363 break; |
364 case CODEC_ID_PCM_U16BE: | |
365 case CODEC_ID_PCM_U16LE: | |
366 case CODEC_ID_PCM_S16BE: | |
367 case CODEC_ID_PCM_S16LE: | |
5479 | 368 rtp_send_samples(s1, pkt->data, size, 2 * st->codec->channels); |
0 | 369 break; |
370 case CODEC_ID_MP2: | |
232 | 371 case CODEC_ID_MP3: |
5479 | 372 rtp_send_mpegaudio(s1, pkt->data, size); |
0 | 373 break; |
374 case CODEC_ID_MPEG1VIDEO: | |
2760 | 375 case CODEC_ID_MPEG2VIDEO: |
5479 | 376 ff_rtp_send_mpegvideo(s1, pkt->data, size); |
0 | 377 break; |
2550
e9c34ec665c6
Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
2540
diff
changeset
|
378 case CODEC_ID_AAC: |
5479 | 379 ff_rtp_send_aac(s1, pkt->data, size); |
2550
e9c34ec665c6
Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
2540
diff
changeset
|
380 break; |
4836 | 381 case CODEC_ID_AMR_NB: |
382 case CODEC_ID_AMR_WB: | |
5479 | 383 ff_rtp_send_amr(s1, pkt->data, size); |
4836 | 384 break; |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
385 case CODEC_ID_MPEG2TS: |
5479 | 386 rtp_send_mpegts_raw(s1, pkt->data, size); |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
387 break; |
2960 | 388 case CODEC_ID_H264: |
5479 | 389 ff_rtp_send_h264(s1, pkt->data, size); |
2960 | 390 break; |
4814 | 391 case CODEC_ID_H263: |
392 case CODEC_ID_H263P: | |
5479 | 393 ff_rtp_send_h263(s1, pkt->data, size); |
4814 | 394 break; |
0 | 395 default: |
396 /* better than nothing : send the codec raw data */ | |
5479 | 397 rtp_send_raw(s1, pkt->data, size); |
0 | 398 break; |
399 } | |
400 return 0; | |
401 } | |
402 | |
4391 | 403 static int rtp_write_trailer(AVFormatContext *s1) |
404 { | |
405 RTPMuxContext *s = s1->priv_data; | |
406 | |
407 av_freep(&s->buf); | |
408 | |
409 return 0; | |
410 } | |
411 | |
1167 | 412 AVOutputFormat rtp_muxer = { |
0 | 413 "rtp", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3286
diff
changeset
|
414 NULL_IF_CONFIG_SMALL("RTP output format"), |
0 | 415 NULL, |
416 NULL, | |
4388 | 417 sizeof(RTPMuxContext), |
0 | 418 CODEC_ID_PCM_MULAW, |
419 CODEC_ID_NONE, | |
420 rtp_write_header, | |
421 rtp_write_packet, | |
4391 | 422 rtp_write_trailer, |
0 | 423 }; |