Mercurial > libavformat.hg
annotate rtpenc.c @ 6260:5c17c20dd67a libavformat
In ogg muxer, use dyn buffer to compute crc of the page, fix muxing with pipe
when page buffer is bigger than default buffer size. Max page is 65k.
| author | bcoudurier |
|---|---|
| date | Wed, 14 Jul 2010 23:21:18 +0000 |
| parents | 956f2e2cd288 |
| children | 93c7a56fa912 |
| 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" |
|
5807
f4ca0041b4f4
Make the ntp_time function available to other parts of libavformat, as ff_ntp_time
mstorsjo
parents:
5646
diff
changeset
|
24 #include "internal.h" |
|
5901
7028f9476da4
Initialize ssrc and base_timestamp using ff_random_get_seed()
mstorsjo
parents:
5842
diff
changeset
|
25 #include "libavutil/random_seed.h" |
| 0 | 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 |
| 0 | 32 |
|
4796
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
33 static int is_supported(enum CodecID id) |
|
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
34 { |
|
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
35 switch(id) { |
| 4814 | 36 case CODEC_ID_H263: |
| 37 case CODEC_ID_H263P: | |
|
4796
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
38 case CODEC_ID_H264: |
|
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
39 case CODEC_ID_MPEG1VIDEO: |
|
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
40 case CODEC_ID_MPEG2VIDEO: |
|
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
41 case CODEC_ID_MPEG4: |
|
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
42 case CODEC_ID_AAC: |
|
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
43 case CODEC_ID_MP2: |
|
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
44 case CODEC_ID_MP3: |
|
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
45 case CODEC_ID_PCM_ALAW: |
|
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
46 case CODEC_ID_PCM_MULAW: |
|
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
47 case CODEC_ID_PCM_S8: |
|
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
48 case CODEC_ID_PCM_S16BE: |
|
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
49 case CODEC_ID_PCM_S16LE: |
|
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
50 case CODEC_ID_PCM_U16BE: |
|
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
51 case CODEC_ID_PCM_U16LE: |
|
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
52 case CODEC_ID_PCM_U8: |
|
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
53 case CODEC_ID_MPEG2TS: |
| 4836 | 54 case CODEC_ID_AMR_NB: |
| 55 case CODEC_ID_AMR_WB: | |
|
4796
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
56 return 1; |
|
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
57 default: |
|
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
58 return 0; |
|
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
59 } |
|
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
60 } |
|
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
61 |
| 0 | 62 static int rtp_write_header(AVFormatContext *s1) |
| 63 { | |
| 4388 | 64 RTPMuxContext *s = s1->priv_data; |
| 5477 | 65 int max_packet_size, n; |
| 0 | 66 AVStream *st; |
| 67 | |
| 68 if (s1->nb_streams != 1) | |
| 69 return -1; | |
| 70 st = s1->streams[0]; | |
|
4796
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
71 if (!is_supported(st->codec->codec_id)) { |
|
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
72 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
|
73 |
|
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
74 return -1; |
|
f48c56ac46c2
Make rtp_write_header() fail in case of unsupported payload type
lucabe
parents:
4502
diff
changeset
|
75 } |
| 0 | 76 |
| 5477 | 77 s->payload_type = ff_rtp_get_payload_type(st->codec); |
| 78 if (s->payload_type < 0) | |
|
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5901
diff
changeset
|
79 s->payload_type = RTP_PT_PRIVATE + (st->codec->codec_type == AVMEDIA_TYPE_AUDIO); |
| 0 | 80 |
|
6036
201152a121b5
Make ff_random_get_seed public, rename to av_get_random_seed, export the header
mstorsjo
parents:
5910
diff
changeset
|
81 s->base_timestamp = av_get_random_seed(); |
| 0 | 82 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
|
83 s->cur_timestamp = 0; |
|
6036
201152a121b5
Make ff_random_get_seed public, rename to av_get_random_seed, export the header
mstorsjo
parents:
5910
diff
changeset
|
84 s->ssrc = av_get_random_seed(); |
| 0 | 85 s->first_packet = 1; |
|
5807
f4ca0041b4f4
Make the ntp_time function available to other parts of libavformat, as ff_ntp_time
mstorsjo
parents:
5646
diff
changeset
|
86 s->first_rtcp_ntp_time = ff_ntp_time(); |
|
5842
cc35562d3747
Use AVFormatContext.start_time_realtime in the RTP muxer
mstorsjo
parents:
5807
diff
changeset
|
87 if (s1->start_time_realtime) |
|
cc35562d3747
Use AVFormatContext.start_time_realtime in the RTP muxer
mstorsjo
parents:
5807
diff
changeset
|
88 /* Round the NTP time to whole milliseconds. */ |
|
cc35562d3747
Use AVFormatContext.start_time_realtime in the RTP muxer
mstorsjo
parents:
5807
diff
changeset
|
89 s->first_rtcp_ntp_time = (s1->start_time_realtime / 1000) * 1000 + |
|
cc35562d3747
Use AVFormatContext.start_time_realtime in the RTP muxer
mstorsjo
parents:
5807
diff
changeset
|
90 NTP_OFFSET_US; |
| 0 | 91 |
|
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
92 max_packet_size = url_fget_max_packet_size(s1->pb); |
| 0 | 93 if (max_packet_size <= 12) |
|
2274
b21c2af60bc9
Replace all occurrences of AVERROR_IO with AVERROR(EIO).
takis
parents:
2222
diff
changeset
|
94 return AVERROR(EIO); |
| 4391 | 95 s->buf = av_malloc(max_packet_size); |
| 96 if (s->buf == NULL) { | |
| 97 return AVERROR(ENOMEM); | |
| 98 } | |
| 0 | 99 s->max_payload_size = max_packet_size - 12; |
| 100 | |
|
2587
d751acab2622
Allow to set the maximum number of frames per RTP packet (and add support for
lucabe
parents:
2569
diff
changeset
|
101 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
|
102 if (s1->max_delay) { |
|
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5901
diff
changeset
|
103 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) { |
|
2587
d751acab2622
Allow to set the maximum number of frames per RTP packet (and add support for
lucabe
parents:
2569
diff
changeset
|
104 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
|
105 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
|
106 } else { |
|
d751acab2622
Allow to set the maximum number of frames per RTP packet (and add support for
lucabe
parents:
2569
diff
changeset
|
107 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
|
108 } |
|
d751acab2622
Allow to set the maximum number of frames per RTP packet (and add support for
lucabe
parents:
2569
diff
changeset
|
109 } |
|
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5901
diff
changeset
|
110 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) { |
|
2587
d751acab2622
Allow to set the maximum number of frames per RTP packet (and add support for
lucabe
parents:
2569
diff
changeset
|
111 /* FIXME: We should round down here... */ |
| 3500 | 112 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
|
113 } |
|
d751acab2622
Allow to set the maximum number of frames per RTP packet (and add support for
lucabe
parents:
2569
diff
changeset
|
114 } |
|
d751acab2622
Allow to set the maximum number of frames per RTP packet (and add support for
lucabe
parents:
2569
diff
changeset
|
115 |
|
2540
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
116 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
|
117 switch(st->codec->codec_id) { |
| 0 | 118 case CODEC_ID_MP2: |
| 232 | 119 case CODEC_ID_MP3: |
| 0 | 120 s->buf_ptr = s->buf + 4; |
| 121 break; | |
| 122 case CODEC_ID_MPEG1VIDEO: | |
| 2760 | 123 case CODEC_ID_MPEG2VIDEO: |
| 0 | 124 break; |
|
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
125 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
|
126 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
|
127 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
|
128 n = 1; |
|
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
129 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
|
130 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
|
131 break; |
|
6136
6c0e0ad77315
If the video stream is H.264 with MP4 syntax, store the NAL lenght size in
lucabe
parents:
6036
diff
changeset
|
132 case CODEC_ID_H264: |
|
6c0e0ad77315
If the video stream is H.264 with MP4 syntax, store the NAL lenght size in
lucabe
parents:
6036
diff
changeset
|
133 /* check for H.264 MP4 syntax */ |
|
6139
397ef451b549
Simplify (no need to check for st->codec->extradata) and correct
lucabe
parents:
6136
diff
changeset
|
134 if (st->codec->extradata_size > 4 && st->codec->extradata[0] == 1) { |
|
6136
6c0e0ad77315
If the video stream is H.264 with MP4 syntax, store the NAL lenght size in
lucabe
parents:
6036
diff
changeset
|
135 s->nal_length_size = (st->codec->extradata[4] & 0x03) + 1; |
|
6c0e0ad77315
If the video stream is H.264 with MP4 syntax, store the NAL lenght size in
lucabe
parents:
6036
diff
changeset
|
136 } |
|
6c0e0ad77315
If the video stream is H.264 with MP4 syntax, store the NAL lenght size in
lucabe
parents:
6036
diff
changeset
|
137 break; |
| 4836 | 138 case CODEC_ID_AMR_NB: |
| 139 case CODEC_ID_AMR_WB: | |
| 140 if (!s->max_frames_per_packet) | |
| 141 s->max_frames_per_packet = 12; | |
| 142 if (st->codec->codec_id == CODEC_ID_AMR_NB) | |
| 143 n = 31; | |
| 144 else | |
| 145 n = 61; | |
| 146 /* max_header_toc_size + the largest AMR payload must fit */ | |
| 147 if (1 + s->max_frames_per_packet + n > s->max_payload_size) { | |
| 148 av_log(s1, AV_LOG_ERROR, "RTP max payload size too small for AMR\n"); | |
| 149 return -1; | |
| 150 } | |
| 151 if (st->codec->channels != 1) { | |
| 152 av_log(s1, AV_LOG_ERROR, "Only mono is supported\n"); | |
| 153 return -1; | |
| 154 } | |
|
2550
e9c34ec665c6
Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
2540
diff
changeset
|
155 case CODEC_ID_AAC: |
|
4380
1b695f013cd3
Introduce a new num_frames field in RTPDemuxContext so that rtp_aac.c
lucabe
parents:
4291
diff
changeset
|
156 s->num_frames = 0; |
| 0 | 157 default: |
|
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5901
diff
changeset
|
158 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) { |
|
2539
ba933dfa4833
Properly set RTP and NTP timestamps in RTCP SR packets
lucabe
parents:
2406
diff
changeset
|
159 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
|
160 } |
| 0 | 161 s->buf_ptr = s->buf; |
| 162 break; | |
| 163 } | |
| 164 | |
| 165 return 0; | |
| 166 } | |
| 167 | |
| 168 /* send an rtcp sender report packet */ | |
| 65 | 169 static void rtcp_send_sr(AVFormatContext *s1, int64_t ntp_time) |
| 0 | 170 { |
| 4388 | 171 RTPMuxContext *s = s1->priv_data; |
|
2539
ba933dfa4833
Properly set RTP and NTP timestamps in RTCP SR packets
lucabe
parents:
2406
diff
changeset
|
172 uint32_t rtp_ts; |
|
ba933dfa4833
Properly set RTP and NTP timestamps in RTCP SR packets
lucabe
parents:
2406
diff
changeset
|
173 |
| 3579 | 174 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
|
175 |
|
2706
b1723b8da595
Do not send too many RTCP packets (according to RFC 3550, the minimum
lucabe
parents:
2705
diff
changeset
|
176 s->last_rtcp_ntp_time = ntp_time; |
| 3500 | 177 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
|
178 s1->streams[0]->time_base) + s->base_timestamp; |
|
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
179 put_byte(s1->pb, (RTP_VERSION << 6)); |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
180 put_byte(s1->pb, 200); |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
181 put_be16(s1->pb, 6); /* length in words - 1 */ |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
182 put_be32(s1->pb, s->ssrc); |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
183 put_be32(s1->pb, ntp_time / 1000000); |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
184 put_be32(s1->pb, ((ntp_time % 1000000) << 32) / 1000000); |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
185 put_be32(s1->pb, rtp_ts); |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
186 put_be32(s1->pb, s->packet_count); |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
187 put_be32(s1->pb, s->octet_count); |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
188 put_flush_packet(s1->pb); |
| 0 | 189 } |
| 190 | |
| 191 /* send an rtp packet. sequence number is incremented, but the caller | |
| 192 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
|
193 void ff_rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m) |
| 0 | 194 { |
| 4388 | 195 RTPMuxContext *s = s1->priv_data; |
| 0 | 196 |
| 3579 | 197 dprintf(s1, "rtp_send_data size=%d\n", len); |
| 0 | 198 |
| 199 /* build the RTP header */ | |
|
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
200 put_byte(s1->pb, (RTP_VERSION << 6)); |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
201 put_byte(s1->pb, (s->payload_type & 0x7f) | ((m & 0x01) << 7)); |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
202 put_be16(s1->pb, s->seq); |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
203 put_be32(s1->pb, s->timestamp); |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
204 put_be32(s1->pb, s->ssrc); |
| 885 | 205 |
|
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
206 put_buffer(s1->pb, buf1, len); |
|
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2760
diff
changeset
|
207 put_flush_packet(s1->pb); |
| 885 | 208 |
| 0 | 209 s->seq++; |
| 210 s->octet_count += len; | |
| 211 s->packet_count++; | |
| 212 } | |
| 213 | |
| 214 /* send an integer number of samples and compute time stamp and fill | |
| 215 the rtp send buffer before sending. */ | |
| 216 static void rtp_send_samples(AVFormatContext *s1, | |
| 241 | 217 const uint8_t *buf1, int size, int sample_size) |
| 0 | 218 { |
| 4388 | 219 RTPMuxContext *s = s1->priv_data; |
| 0 | 220 int len, max_packet_size, n; |
| 221 | |
| 222 max_packet_size = (s->max_payload_size / sample_size) * sample_size; | |
| 223 /* not needed, but who nows */ | |
| 224 if ((size % sample_size) != 0) | |
| 225 av_abort(); | |
|
2540
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
226 n = 0; |
| 0 | 227 while (size > 0) { |
|
2540
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
228 s->buf_ptr = s->buf; |
|
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
229 len = FFMIN(max_packet_size, size); |
| 0 | 230 |
| 231 /* copy data */ | |
| 232 memcpy(s->buf_ptr, buf1, len); | |
| 233 s->buf_ptr += len; | |
| 234 buf1 += len; | |
| 235 size -= len; | |
|
2540
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
236 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
|
237 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
|
238 n += (s->buf_ptr - s->buf); |
| 0 | 239 } |
| 885 | 240 } |
| 0 | 241 |
| 242 static void rtp_send_mpegaudio(AVFormatContext *s1, | |
| 241 | 243 const uint8_t *buf1, int size) |
| 0 | 244 { |
| 4388 | 245 RTPMuxContext *s = s1->priv_data; |
| 0 | 246 int len, count, max_packet_size; |
| 247 | |
| 248 max_packet_size = s->max_payload_size; | |
| 249 | |
| 250 /* test if we must flush because not enough space */ | |
| 251 len = (s->buf_ptr - s->buf); | |
| 252 if ((len + size) > max_packet_size) { | |
| 253 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
|
254 ff_rtp_send_data(s1, s->buf, s->buf_ptr - s->buf, 0); |
| 0 | 255 s->buf_ptr = s->buf + 4; |
| 256 } | |
| 257 } | |
|
2540
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
258 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
|
259 s->timestamp = s->cur_timestamp; |
|
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
260 } |
| 0 | 261 |
| 262 /* add the packet */ | |
| 263 if (size > max_packet_size) { | |
| 264 /* big packet: fragment */ | |
| 265 count = 0; | |
| 266 while (size > 0) { | |
| 267 len = max_packet_size - 4; | |
| 268 if (len > size) | |
| 269 len = size; | |
| 270 /* build fragmented packet */ | |
| 271 s->buf[0] = 0; | |
| 272 s->buf[1] = 0; | |
| 273 s->buf[2] = count >> 8; | |
| 274 s->buf[3] = count; | |
| 275 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
|
276 ff_rtp_send_data(s1, s->buf, len + 4, 0); |
| 0 | 277 size -= len; |
| 278 buf1 += len; | |
| 279 count += len; | |
| 280 } | |
| 281 } else { | |
| 282 if (s->buf_ptr == s->buf + 4) { | |
| 283 /* no fragmentation possible */ | |
| 284 s->buf[0] = 0; | |
| 285 s->buf[1] = 0; | |
| 286 s->buf[2] = 0; | |
| 287 s->buf[3] = 0; | |
| 288 } | |
| 289 memcpy(s->buf_ptr, buf1, size); | |
| 290 s->buf_ptr += size; | |
| 291 } | |
| 292 } | |
| 293 | |
| 294 static void rtp_send_raw(AVFormatContext *s1, | |
| 241 | 295 const uint8_t *buf1, int size) |
| 0 | 296 { |
| 4388 | 297 RTPMuxContext *s = s1->priv_data; |
| 0 | 298 int len, max_packet_size; |
| 299 | |
| 300 max_packet_size = s->max_payload_size; | |
| 301 | |
| 302 while (size > 0) { | |
| 303 len = max_packet_size; | |
| 304 if (len > size) | |
| 305 len = size; | |
| 306 | |
|
2540
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
307 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
|
308 ff_rtp_send_data(s1, buf1, len, (len == size)); |
| 0 | 309 |
| 310 buf1 += len; | |
| 311 size -= len; | |
| 312 } | |
| 313 } | |
| 314 | |
|
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
315 /* 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
|
316 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
|
317 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
|
318 { |
| 4388 | 319 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
|
320 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
|
321 |
|
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
322 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
|
323 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
|
324 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
|
325 len = size; |
|
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
326 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
|
327 buf1 += len; |
|
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
328 size -= len; |
|
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
329 s->buf_ptr += len; |
| 885 | 330 |
|
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
331 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
|
332 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
|
333 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
|
334 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
|
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 } |
|
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
338 |
| 468 | 339 static int rtp_write_packet(AVFormatContext *s1, AVPacket *pkt) |
| 0 | 340 { |
| 4388 | 341 RTPMuxContext *s = s1->priv_data; |
| 0 | 342 AVStream *st = s1->streams[0]; |
| 343 int rtcp_bytes; | |
| 468 | 344 int size= pkt->size; |
| 885 | 345 |
| 3579 | 346 dprintf(s1, "%d: write len=%d\n", pkt->stream_index, size); |
| 0 | 347 |
| 885 | 348 rtcp_bytes = ((s->octet_count - s->last_octet_count) * RTCP_TX_RATIO_NUM) / |
| 0 | 349 RTCP_TX_RATIO_DEN; |
|
2706
b1723b8da595
Do not send too many RTCP packets (according to RFC 3550, the minimum
lucabe
parents:
2705
diff
changeset
|
350 if (s->first_packet || ((rtcp_bytes >= RTCP_SR_SIZE) && |
|
5807
f4ca0041b4f4
Make the ntp_time function available to other parts of libavformat, as ff_ntp_time
mstorsjo
parents:
5646
diff
changeset
|
351 (ff_ntp_time() - s->last_rtcp_ntp_time > 5000000))) { |
|
f4ca0041b4f4
Make the ntp_time function available to other parts of libavformat, as ff_ntp_time
mstorsjo
parents:
5646
diff
changeset
|
352 rtcp_send_sr(s1, ff_ntp_time()); |
| 0 | 353 s->last_octet_count = s->octet_count; |
| 354 s->first_packet = 0; | |
| 355 } | |
|
2540
ca3cba9c641f
Fix timestamps in RTP packets (now, MPEG1 video with B frames works correctly)
lucabe
parents:
2539
diff
changeset
|
356 s->cur_timestamp = s->base_timestamp + pkt->pts; |
| 0 | 357 |
|
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
777
diff
changeset
|
358 switch(st->codec->codec_id) { |
| 0 | 359 case CODEC_ID_PCM_MULAW: |
| 360 case CODEC_ID_PCM_ALAW: | |
| 361 case CODEC_ID_PCM_U8: | |
| 362 case CODEC_ID_PCM_S8: | |
| 5479 | 363 rtp_send_samples(s1, pkt->data, size, 1 * st->codec->channels); |
| 0 | 364 break; |
| 365 case CODEC_ID_PCM_U16BE: | |
| 366 case CODEC_ID_PCM_U16LE: | |
| 367 case CODEC_ID_PCM_S16BE: | |
| 368 case CODEC_ID_PCM_S16LE: | |
| 5479 | 369 rtp_send_samples(s1, pkt->data, size, 2 * st->codec->channels); |
| 0 | 370 break; |
| 371 case CODEC_ID_MP2: | |
| 232 | 372 case CODEC_ID_MP3: |
| 5479 | 373 rtp_send_mpegaudio(s1, pkt->data, size); |
| 0 | 374 break; |
| 375 case CODEC_ID_MPEG1VIDEO: | |
| 2760 | 376 case CODEC_ID_MPEG2VIDEO: |
| 5479 | 377 ff_rtp_send_mpegvideo(s1, pkt->data, size); |
| 0 | 378 break; |
|
2550
e9c34ec665c6
Support for AAC streaming over RTP. Fragmentation is not implemented yet
lucabe
parents:
2540
diff
changeset
|
379 case CODEC_ID_AAC: |
| 5479 | 380 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
|
381 break; |
| 4836 | 382 case CODEC_ID_AMR_NB: |
| 383 case CODEC_ID_AMR_WB: | |
| 5479 | 384 ff_rtp_send_amr(s1, pkt->data, size); |
| 4836 | 385 break; |
|
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
241
diff
changeset
|
386 case CODEC_ID_MPEG2TS: |
| 5479 | 387 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
|
388 break; |
| 2960 | 389 case CODEC_ID_H264: |
| 5479 | 390 ff_rtp_send_h264(s1, pkt->data, size); |
| 2960 | 391 break; |
| 4814 | 392 case CODEC_ID_H263: |
| 393 case CODEC_ID_H263P: | |
| 5479 | 394 ff_rtp_send_h263(s1, pkt->data, size); |
| 4814 | 395 break; |
| 0 | 396 default: |
| 397 /* better than nothing : send the codec raw data */ | |
| 5479 | 398 rtp_send_raw(s1, pkt->data, size); |
| 0 | 399 break; |
| 400 } | |
| 401 return 0; | |
| 402 } | |
| 403 | |
| 4391 | 404 static int rtp_write_trailer(AVFormatContext *s1) |
| 405 { | |
| 406 RTPMuxContext *s = s1->priv_data; | |
| 407 | |
| 408 av_freep(&s->buf); | |
| 409 | |
| 410 return 0; | |
| 411 } | |
| 412 | |
| 1167 | 413 AVOutputFormat rtp_muxer = { |
| 0 | 414 "rtp", |
|
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3286
diff
changeset
|
415 NULL_IF_CONFIG_SMALL("RTP output format"), |
| 0 | 416 NULL, |
| 417 NULL, | |
| 4388 | 418 sizeof(RTPMuxContext), |
| 0 | 419 CODEC_ID_PCM_MULAW, |
| 420 CODEC_ID_NONE, | |
| 421 rtp_write_header, | |
| 422 rtp_write_packet, | |
| 4391 | 423 rtp_write_trailer, |
| 0 | 424 }; |
