]> rtime.felk.cvut.cz Git - frescor/ffmpeg.git/blob - libavformat/rtpenc.c
Use full path for #includes from another directory.
[frescor/ffmpeg.git] / libavformat / rtpenc.c
1 /*
2  * RTP output format
3  * Copyright (c) 2002 Fabrice Bellard.
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
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
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21
22 #include "libavcodec/bitstream.h"
23 #include "avformat.h"
24 #include "mpegts.h"
25
26 #include <unistd.h>
27 #include "network.h"
28
29 #include "rtp_internal.h"
30 #include "rtp_mpv.h"
31 #include "rtp_aac.h"
32 #include "rtp_h264.h"
33
34 //#define DEBUG
35
36 #define RTCP_SR_SIZE 28
37 #define NTP_OFFSET 2208988800ULL
38 #define NTP_OFFSET_US (NTP_OFFSET * 1000000ULL)
39
40 static uint64_t ntp_time(void)
41 {
42   return (av_gettime() / 1000) * 1000 + NTP_OFFSET_US;
43 }
44
45 static int rtp_write_header(AVFormatContext *s1)
46 {
47     RTPDemuxContext *s = s1->priv_data;
48     int payload_type, max_packet_size, n;
49     AVStream *st;
50
51     if (s1->nb_streams != 1)
52         return -1;
53     st = s1->streams[0];
54
55     payload_type = rtp_get_payload_type(st->codec);
56     if (payload_type < 0)
57         payload_type = RTP_PT_PRIVATE; /* private payload type */
58     s->payload_type = payload_type;
59
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
61     s->base_timestamp = 0; /* FIXME: was random(), what should this be? */
62     s->timestamp = s->base_timestamp;
63     s->cur_timestamp = 0;
64     s->ssrc = 0; /* FIXME: was random(), what should this be? */
65     s->first_packet = 1;
66     s->first_rtcp_ntp_time = AV_NOPTS_VALUE;
67
68     max_packet_size = url_fget_max_packet_size(s1->pb);
69     if (max_packet_size <= 12)
70         return AVERROR(EIO);
71     s->max_payload_size = max_packet_size - 12;
72
73     s->max_frames_per_packet = 0;
74     if (s1->max_delay) {
75         if (st->codec->codec_type == CODEC_TYPE_AUDIO) {
76             if (st->codec->frame_size == 0) {
77                 av_log(s1, AV_LOG_ERROR, "Cannot respect max delay: frame size = 0\n");
78             } else {
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);
80             }
81         }
82         if (st->codec->codec_type == CODEC_TYPE_VIDEO) {
83             /* FIXME: We should round down here... */
84             s->max_frames_per_packet = av_rescale_q(s1->max_delay, AV_TIME_BASE_Q, st->codec->time_base);
85         }
86     }
87
88     av_set_pts_info(st, 32, 1, 90000);
89     switch(st->codec->codec_id) {
90     case CODEC_ID_MP2:
91     case CODEC_ID_MP3:
92         s->buf_ptr = s->buf + 4;
93         break;
94     case CODEC_ID_MPEG1VIDEO:
95     case CODEC_ID_MPEG2VIDEO:
96         break;
97     case CODEC_ID_MPEG2TS:
98         n = s->max_payload_size / TS_PACKET_SIZE;
99         if (n < 1)
100             n = 1;
101         s->max_payload_size = n * TS_PACKET_SIZE;
102         s->buf_ptr = s->buf;
103         break;
104     case CODEC_ID_AAC:
105         s->read_buf_index = 0;
106     default:
107         if (st->codec->codec_type == CODEC_TYPE_AUDIO) {
108             av_set_pts_info(st, 32, 1, st->codec->sample_rate);
109         }
110         s->buf_ptr = s->buf;
111         break;
112     }
113
114     return 0;
115 }
116
117 /* send an rtcp sender report packet */
118 static void rtcp_send_sr(AVFormatContext *s1, int64_t ntp_time)
119 {
120     RTPDemuxContext *s = s1->priv_data;
121     uint32_t rtp_ts;
122
123 #if defined(DEBUG)
124     printf("RTCP: %02x %"PRIx64" %x\n", s->payload_type, ntp_time, s->timestamp);
125 #endif
126
127     if (s->first_rtcp_ntp_time == AV_NOPTS_VALUE) s->first_rtcp_ntp_time = ntp_time;
128     s->last_rtcp_ntp_time = ntp_time;
129     rtp_ts = av_rescale_q(ntp_time - s->first_rtcp_ntp_time, AV_TIME_BASE_Q,
130                           s1->streams[0]->time_base) + s->base_timestamp;
131     put_byte(s1->pb, (RTP_VERSION << 6));
132     put_byte(s1->pb, 200);
133     put_be16(s1->pb, 6); /* length in words - 1 */
134     put_be32(s1->pb, s->ssrc);
135     put_be32(s1->pb, ntp_time / 1000000);
136     put_be32(s1->pb, ((ntp_time % 1000000) << 32) / 1000000);
137     put_be32(s1->pb, rtp_ts);
138     put_be32(s1->pb, s->packet_count);
139     put_be32(s1->pb, s->octet_count);
140     put_flush_packet(s1->pb);
141 }
142
143 /* send an rtp packet. sequence number is incremented, but the caller
144    must update the timestamp itself */
145 void ff_rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m)
146 {
147     RTPDemuxContext *s = s1->priv_data;
148
149 #ifdef DEBUG
150     printf("rtp_send_data size=%d\n", len);
151 #endif
152
153     /* build the RTP header */
154     put_byte(s1->pb, (RTP_VERSION << 6));
155     put_byte(s1->pb, (s->payload_type & 0x7f) | ((m & 0x01) << 7));
156     put_be16(s1->pb, s->seq);
157     put_be32(s1->pb, s->timestamp);
158     put_be32(s1->pb, s->ssrc);
159
160     put_buffer(s1->pb, buf1, len);
161     put_flush_packet(s1->pb);
162
163     s->seq++;
164     s->octet_count += len;
165     s->packet_count++;
166 }
167
168 /* send an integer number of samples and compute time stamp and fill
169    the rtp send buffer before sending. */
170 static void rtp_send_samples(AVFormatContext *s1,
171                              const uint8_t *buf1, int size, int sample_size)
172 {
173     RTPDemuxContext *s = s1->priv_data;
174     int len, max_packet_size, n;
175
176     max_packet_size = (s->max_payload_size / sample_size) * sample_size;
177     /* not needed, but who nows */
178     if ((size % sample_size) != 0)
179         av_abort();
180     n = 0;
181     while (size > 0) {
182         s->buf_ptr = s->buf;
183         len = FFMIN(max_packet_size, size);
184
185         /* copy data */
186         memcpy(s->buf_ptr, buf1, len);
187         s->buf_ptr += len;
188         buf1 += len;
189         size -= len;
190         s->timestamp = s->cur_timestamp + n / sample_size;
191         ff_rtp_send_data(s1, s->buf, s->buf_ptr - s->buf, 0);
192         n += (s->buf_ptr - s->buf);
193     }
194 }
195
196 /* NOTE: we suppose that exactly one frame is given as argument here */
197 /* XXX: test it */
198 static void rtp_send_mpegaudio(AVFormatContext *s1,
199                                const uint8_t *buf1, int size)
200 {
201     RTPDemuxContext *s = s1->priv_data;
202     int len, count, max_packet_size;
203
204     max_packet_size = s->max_payload_size;
205
206     /* test if we must flush because not enough space */
207     len = (s->buf_ptr - s->buf);
208     if ((len + size) > max_packet_size) {
209         if (len > 4) {
210             ff_rtp_send_data(s1, s->buf, s->buf_ptr - s->buf, 0);
211             s->buf_ptr = s->buf + 4;
212         }
213     }
214     if (s->buf_ptr == s->buf + 4) {
215         s->timestamp = s->cur_timestamp;
216     }
217
218     /* add the packet */
219     if (size > max_packet_size) {
220         /* big packet: fragment */
221         count = 0;
222         while (size > 0) {
223             len = max_packet_size - 4;
224             if (len > size)
225                 len = size;
226             /* build fragmented packet */
227             s->buf[0] = 0;
228             s->buf[1] = 0;
229             s->buf[2] = count >> 8;
230             s->buf[3] = count;
231             memcpy(s->buf + 4, buf1, len);
232             ff_rtp_send_data(s1, s->buf, len + 4, 0);
233             size -= len;
234             buf1 += len;
235             count += len;
236         }
237     } else {
238         if (s->buf_ptr == s->buf + 4) {
239             /* no fragmentation possible */
240             s->buf[0] = 0;
241             s->buf[1] = 0;
242             s->buf[2] = 0;
243             s->buf[3] = 0;
244         }
245         memcpy(s->buf_ptr, buf1, size);
246         s->buf_ptr += size;
247     }
248 }
249
250 static void rtp_send_raw(AVFormatContext *s1,
251                          const uint8_t *buf1, int size)
252 {
253     RTPDemuxContext *s = s1->priv_data;
254     int len, max_packet_size;
255
256     max_packet_size = s->max_payload_size;
257
258     while (size > 0) {
259         len = max_packet_size;
260         if (len > size)
261             len = size;
262
263         s->timestamp = s->cur_timestamp;
264         ff_rtp_send_data(s1, buf1, len, (len == size));
265
266         buf1 += len;
267         size -= len;
268     }
269 }
270
271 /* NOTE: size is assumed to be an integer multiple of TS_PACKET_SIZE */
272 static void rtp_send_mpegts_raw(AVFormatContext *s1,
273                                 const uint8_t *buf1, int size)
274 {
275     RTPDemuxContext *s = s1->priv_data;
276     int len, out_len;
277
278     while (size >= TS_PACKET_SIZE) {
279         len = s->max_payload_size - (s->buf_ptr - s->buf);
280         if (len > size)
281             len = size;
282         memcpy(s->buf_ptr, buf1, len);
283         buf1 += len;
284         size -= len;
285         s->buf_ptr += len;
286
287         out_len = s->buf_ptr - s->buf;
288         if (out_len >= s->max_payload_size) {
289             ff_rtp_send_data(s1, s->buf, out_len, 0);
290             s->buf_ptr = s->buf;
291         }
292     }
293 }
294
295 /* write an RTP packet. 'buf1' must contain a single specific frame. */
296 static int rtp_write_packet(AVFormatContext *s1, AVPacket *pkt)
297 {
298     RTPDemuxContext *s = s1->priv_data;
299     AVStream *st = s1->streams[0];
300     int rtcp_bytes;
301     int size= pkt->size;
302     uint8_t *buf1= pkt->data;
303
304 #ifdef DEBUG
305     printf("%d: write len=%d\n", pkt->stream_index, size);
306 #endif
307
308     /* XXX: mpeg pts hardcoded. RTCP send every 0.5 seconds */
309     rtcp_bytes = ((s->octet_count - s->last_octet_count) * RTCP_TX_RATIO_NUM) /
310         RTCP_TX_RATIO_DEN;
311     if (s->first_packet || ((rtcp_bytes >= RTCP_SR_SIZE) &&
312                            (ntp_time() - s->last_rtcp_ntp_time > 5000000))) {
313         rtcp_send_sr(s1, ntp_time());
314         s->last_octet_count = s->octet_count;
315         s->first_packet = 0;
316     }
317     s->cur_timestamp = s->base_timestamp + pkt->pts;
318
319     switch(st->codec->codec_id) {
320     case CODEC_ID_PCM_MULAW:
321     case CODEC_ID_PCM_ALAW:
322     case CODEC_ID_PCM_U8:
323     case CODEC_ID_PCM_S8:
324         rtp_send_samples(s1, buf1, size, 1 * st->codec->channels);
325         break;
326     case CODEC_ID_PCM_U16BE:
327     case CODEC_ID_PCM_U16LE:
328     case CODEC_ID_PCM_S16BE:
329     case CODEC_ID_PCM_S16LE:
330         rtp_send_samples(s1, buf1, size, 2 * st->codec->channels);
331         break;
332     case CODEC_ID_MP2:
333     case CODEC_ID_MP3:
334         rtp_send_mpegaudio(s1, buf1, size);
335         break;
336     case CODEC_ID_MPEG1VIDEO:
337     case CODEC_ID_MPEG2VIDEO:
338         ff_rtp_send_mpegvideo(s1, buf1, size);
339         break;
340     case CODEC_ID_AAC:
341         ff_rtp_send_aac(s1, buf1, size);
342         break;
343     case CODEC_ID_MPEG2TS:
344         rtp_send_mpegts_raw(s1, buf1, size);
345         break;
346     case CODEC_ID_H264:
347         ff_rtp_send_h264(s1, buf1, size);
348         break;
349     default:
350         /* better than nothing : send the codec raw data */
351         rtp_send_raw(s1, buf1, size);
352         break;
353     }
354     return 0;
355 }
356
357 AVOutputFormat rtp_muxer = {
358     "rtp",
359     "RTP output format",
360     NULL,
361     NULL,
362     sizeof(RTPDemuxContext),
363     CODEC_ID_PCM_MULAW,
364     CODEC_ID_NONE,
365     rtp_write_header,
366     rtp_write_packet,
367 };