00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "avformat.h"
00023 #include "mpegts.h"
00024 #include "internal.h"
00025 #include "libavutil/mathematics.h"
00026 #include "libavutil/random_seed.h"
00027 #include "libavutil/opt.h"
00028
00029 #include "rtpenc.h"
00030
00031
00032
00033 static const AVOption options[] = {
00034 FF_RTP_FLAG_OPTS(RTPMuxContext, flags)
00035 { "payload_type", "Specify RTP payload type", offsetof(RTPMuxContext, payload_type), AV_OPT_TYPE_INT, {.dbl = -1 }, -1, 127, AV_OPT_FLAG_ENCODING_PARAM },
00036 { NULL },
00037 };
00038
00039 static const AVClass rtp_muxer_class = {
00040 .class_name = "RTP muxer",
00041 .item_name = av_default_item_name,
00042 .option = options,
00043 .version = LIBAVUTIL_VERSION_INT,
00044 };
00045
00046 #define RTCP_SR_SIZE 28
00047
00048 static int is_supported(enum CodecID id)
00049 {
00050 switch(id) {
00051 case CODEC_ID_H263:
00052 case CODEC_ID_H263P:
00053 case CODEC_ID_H264:
00054 case CODEC_ID_MPEG1VIDEO:
00055 case CODEC_ID_MPEG2VIDEO:
00056 case CODEC_ID_MPEG4:
00057 case CODEC_ID_AAC:
00058 case CODEC_ID_MP2:
00059 case CODEC_ID_MP3:
00060 case CODEC_ID_PCM_ALAW:
00061 case CODEC_ID_PCM_MULAW:
00062 case CODEC_ID_PCM_S8:
00063 case CODEC_ID_PCM_S16BE:
00064 case CODEC_ID_PCM_S16LE:
00065 case CODEC_ID_PCM_U16BE:
00066 case CODEC_ID_PCM_U16LE:
00067 case CODEC_ID_PCM_U8:
00068 case CODEC_ID_MPEG2TS:
00069 case CODEC_ID_AMR_NB:
00070 case CODEC_ID_AMR_WB:
00071 case CODEC_ID_VORBIS:
00072 case CODEC_ID_THEORA:
00073 case CODEC_ID_VP8:
00074 case CODEC_ID_ADPCM_G722:
00075 case CODEC_ID_ADPCM_G726:
00076 return 1;
00077 default:
00078 return 0;
00079 }
00080 }
00081
00082 static int rtp_write_header(AVFormatContext *s1)
00083 {
00084 RTPMuxContext *s = s1->priv_data;
00085 int n;
00086 AVStream *st;
00087
00088 if (s1->nb_streams != 1) {
00089 av_log(s1, AV_LOG_ERROR, "Only one stream supported in the RTP muxer\n");
00090 return AVERROR(EINVAL);
00091 }
00092 st = s1->streams[0];
00093 if (!is_supported(st->codec->codec_id)) {
00094 av_log(s1, AV_LOG_ERROR, "Unsupported codec %s\n", avcodec_get_name(st->codec->codec_id));
00095
00096 return -1;
00097 }
00098
00099 if (s->payload_type < 0)
00100 s->payload_type = ff_rtp_get_payload_type(s1, st->codec);
00101 s->base_timestamp = av_get_random_seed();
00102 s->timestamp = s->base_timestamp;
00103 s->cur_timestamp = 0;
00104 s->ssrc = av_get_random_seed();
00105 s->first_packet = 1;
00106 s->first_rtcp_ntp_time = ff_ntp_time();
00107 if (s1->start_time_realtime)
00108
00109 s->first_rtcp_ntp_time = (s1->start_time_realtime / 1000) * 1000 +
00110 NTP_OFFSET_US;
00111
00112 if (s1->packet_size) {
00113 if (s1->pb->max_packet_size)
00114 s1->packet_size = FFMIN(s1->packet_size,
00115 s1->pb->max_packet_size);
00116 } else
00117 s1->packet_size = s1->pb->max_packet_size;
00118 if (s1->packet_size <= 12) {
00119 av_log(s1, AV_LOG_ERROR, "Max packet size %d too low\n", s1->packet_size);
00120 return AVERROR(EIO);
00121 }
00122 s->buf = av_malloc(s1->packet_size);
00123 if (s->buf == NULL) {
00124 return AVERROR(ENOMEM);
00125 }
00126 s->max_payload_size = s1->packet_size - 12;
00127
00128 s->max_frames_per_packet = 0;
00129 if (s1->max_delay > 0) {
00130 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
00131 int frame_size = av_get_audio_frame_duration(st->codec, 0);
00132 if (!frame_size)
00133 frame_size = st->codec->frame_size;
00134 if (frame_size == 0) {
00135 av_log(s1, AV_LOG_ERROR, "Cannot respect max delay: frame size = 0\n");
00136 } else {
00137 s->max_frames_per_packet =
00138 av_rescale_q_rnd(s1->max_delay,
00139 AV_TIME_BASE_Q,
00140 (AVRational){ frame_size, st->codec->sample_rate },
00141 AV_ROUND_DOWN);
00142 }
00143 }
00144 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
00145
00146 s->max_frames_per_packet = av_rescale_q(s1->max_delay, (AVRational){1, 1000000}, st->codec->time_base);
00147 }
00148 }
00149
00150 avpriv_set_pts_info(st, 32, 1, 90000);
00151 switch(st->codec->codec_id) {
00152 case CODEC_ID_MP2:
00153 case CODEC_ID_MP3:
00154 s->buf_ptr = s->buf + 4;
00155 break;
00156 case CODEC_ID_MPEG1VIDEO:
00157 case CODEC_ID_MPEG2VIDEO:
00158 break;
00159 case CODEC_ID_MPEG2TS:
00160 n = s->max_payload_size / TS_PACKET_SIZE;
00161 if (n < 1)
00162 n = 1;
00163 s->max_payload_size = n * TS_PACKET_SIZE;
00164 s->buf_ptr = s->buf;
00165 break;
00166 case CODEC_ID_H264:
00167
00168 if (st->codec->extradata_size > 4 && st->codec->extradata[0] == 1) {
00169 s->nal_length_size = (st->codec->extradata[4] & 0x03) + 1;
00170 }
00171 break;
00172 case CODEC_ID_VORBIS:
00173 case CODEC_ID_THEORA:
00174 if (!s->max_frames_per_packet) s->max_frames_per_packet = 15;
00175 s->max_frames_per_packet = av_clip(s->max_frames_per_packet, 1, 15);
00176 s->max_payload_size -= 6;
00177 s->num_frames = 0;
00178 goto defaultcase;
00179 case CODEC_ID_VP8:
00180 av_log(s1, AV_LOG_ERROR, "RTP VP8 payload implementation is "
00181 "incompatible with the latest spec drafts.\n");
00182 break;
00183 case CODEC_ID_ADPCM_G722:
00184
00185
00186 avpriv_set_pts_info(st, 32, 1, 8000);
00187 break;
00188 case CODEC_ID_AMR_NB:
00189 case CODEC_ID_AMR_WB:
00190 if (!s->max_frames_per_packet)
00191 s->max_frames_per_packet = 12;
00192 if (st->codec->codec_id == CODEC_ID_AMR_NB)
00193 n = 31;
00194 else
00195 n = 61;
00196
00197 if (1 + s->max_frames_per_packet + n > s->max_payload_size) {
00198 av_log(s1, AV_LOG_ERROR, "RTP max payload size too small for AMR\n");
00199 return -1;
00200 }
00201 if (st->codec->channels != 1) {
00202 av_log(s1, AV_LOG_ERROR, "Only mono is supported\n");
00203 return -1;
00204 }
00205 case CODEC_ID_AAC:
00206 s->num_frames = 0;
00207 default:
00208 defaultcase:
00209 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
00210 avpriv_set_pts_info(st, 32, 1, st->codec->sample_rate);
00211 }
00212 s->buf_ptr = s->buf;
00213 break;
00214 }
00215
00216 return 0;
00217 }
00218
00219
00220 static void rtcp_send_sr(AVFormatContext *s1, int64_t ntp_time)
00221 {
00222 RTPMuxContext *s = s1->priv_data;
00223 uint32_t rtp_ts;
00224
00225 av_dlog(s1, "RTCP: %02x %"PRIx64" %x\n", s->payload_type, ntp_time, s->timestamp);
00226
00227 s->last_rtcp_ntp_time = ntp_time;
00228 rtp_ts = av_rescale_q(ntp_time - s->first_rtcp_ntp_time, (AVRational){1, 1000000},
00229 s1->streams[0]->time_base) + s->base_timestamp;
00230 avio_w8(s1->pb, (RTP_VERSION << 6));
00231 avio_w8(s1->pb, RTCP_SR);
00232 avio_wb16(s1->pb, 6);
00233 avio_wb32(s1->pb, s->ssrc);
00234 avio_wb32(s1->pb, ntp_time / 1000000);
00235 avio_wb32(s1->pb, ((ntp_time % 1000000) << 32) / 1000000);
00236 avio_wb32(s1->pb, rtp_ts);
00237 avio_wb32(s1->pb, s->packet_count);
00238 avio_wb32(s1->pb, s->octet_count);
00239 avio_flush(s1->pb);
00240 }
00241
00242
00243
00244 void ff_rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m)
00245 {
00246 RTPMuxContext *s = s1->priv_data;
00247
00248 av_dlog(s1, "rtp_send_data size=%d\n", len);
00249
00250
00251 avio_w8(s1->pb, (RTP_VERSION << 6));
00252 avio_w8(s1->pb, (s->payload_type & 0x7f) | ((m & 0x01) << 7));
00253 avio_wb16(s1->pb, s->seq);
00254 avio_wb32(s1->pb, s->timestamp);
00255 avio_wb32(s1->pb, s->ssrc);
00256
00257 avio_write(s1->pb, buf1, len);
00258 avio_flush(s1->pb);
00259
00260 s->seq++;
00261 s->octet_count += len;
00262 s->packet_count++;
00263 }
00264
00265
00266
00267 static void rtp_send_samples(AVFormatContext *s1,
00268 const uint8_t *buf1, int size, int sample_size_bits)
00269 {
00270 RTPMuxContext *s = s1->priv_data;
00271 int len, max_packet_size, n;
00272
00273 int aligned_samples_size = sample_size_bits/av_gcd(sample_size_bits, 8);
00274
00275 max_packet_size = (s->max_payload_size / aligned_samples_size) * aligned_samples_size;
00276
00277 if ((sample_size_bits % 8) == 0 && ((8 * size) % sample_size_bits) != 0)
00278 av_abort();
00279 n = 0;
00280 while (size > 0) {
00281 s->buf_ptr = s->buf;
00282 len = FFMIN(max_packet_size, size);
00283
00284
00285 memcpy(s->buf_ptr, buf1, len);
00286 s->buf_ptr += len;
00287 buf1 += len;
00288 size -= len;
00289 s->timestamp = s->cur_timestamp + n * 8 / sample_size_bits;
00290 ff_rtp_send_data(s1, s->buf, s->buf_ptr - s->buf, 0);
00291 n += (s->buf_ptr - s->buf);
00292 }
00293 }
00294
00295 static void rtp_send_mpegaudio(AVFormatContext *s1,
00296 const uint8_t *buf1, int size)
00297 {
00298 RTPMuxContext *s = s1->priv_data;
00299 int len, count, max_packet_size;
00300
00301 max_packet_size = s->max_payload_size;
00302
00303
00304 len = (s->buf_ptr - s->buf);
00305 if ((len + size) > max_packet_size) {
00306 if (len > 4) {
00307 ff_rtp_send_data(s1, s->buf, s->buf_ptr - s->buf, 0);
00308 s->buf_ptr = s->buf + 4;
00309 }
00310 }
00311 if (s->buf_ptr == s->buf + 4) {
00312 s->timestamp = s->cur_timestamp;
00313 }
00314
00315
00316 if (size > max_packet_size) {
00317
00318 count = 0;
00319 while (size > 0) {
00320 len = max_packet_size - 4;
00321 if (len > size)
00322 len = size;
00323
00324 s->buf[0] = 0;
00325 s->buf[1] = 0;
00326 s->buf[2] = count >> 8;
00327 s->buf[3] = count;
00328 memcpy(s->buf + 4, buf1, len);
00329 ff_rtp_send_data(s1, s->buf, len + 4, 0);
00330 size -= len;
00331 buf1 += len;
00332 count += len;
00333 }
00334 } else {
00335 if (s->buf_ptr == s->buf + 4) {
00336
00337 s->buf[0] = 0;
00338 s->buf[1] = 0;
00339 s->buf[2] = 0;
00340 s->buf[3] = 0;
00341 }
00342 memcpy(s->buf_ptr, buf1, size);
00343 s->buf_ptr += size;
00344 }
00345 }
00346
00347 static void rtp_send_raw(AVFormatContext *s1,
00348 const uint8_t *buf1, int size)
00349 {
00350 RTPMuxContext *s = s1->priv_data;
00351 int len, max_packet_size;
00352
00353 max_packet_size = s->max_payload_size;
00354
00355 while (size > 0) {
00356 len = max_packet_size;
00357 if (len > size)
00358 len = size;
00359
00360 s->timestamp = s->cur_timestamp;
00361 ff_rtp_send_data(s1, buf1, len, (len == size));
00362
00363 buf1 += len;
00364 size -= len;
00365 }
00366 }
00367
00368
00369 static void rtp_send_mpegts_raw(AVFormatContext *s1,
00370 const uint8_t *buf1, int size)
00371 {
00372 RTPMuxContext *s = s1->priv_data;
00373 int len, out_len;
00374
00375 while (size >= TS_PACKET_SIZE) {
00376 len = s->max_payload_size - (s->buf_ptr - s->buf);
00377 if (len > size)
00378 len = size;
00379 memcpy(s->buf_ptr, buf1, len);
00380 buf1 += len;
00381 size -= len;
00382 s->buf_ptr += len;
00383
00384 out_len = s->buf_ptr - s->buf;
00385 if (out_len >= s->max_payload_size) {
00386 ff_rtp_send_data(s1, s->buf, out_len, 0);
00387 s->buf_ptr = s->buf;
00388 }
00389 }
00390 }
00391
00392 static int rtp_write_packet(AVFormatContext *s1, AVPacket *pkt)
00393 {
00394 RTPMuxContext *s = s1->priv_data;
00395 AVStream *st = s1->streams[0];
00396 int rtcp_bytes;
00397 int size= pkt->size;
00398
00399 av_dlog(s1, "%d: write len=%d\n", pkt->stream_index, size);
00400
00401 rtcp_bytes = ((s->octet_count - s->last_octet_count) * RTCP_TX_RATIO_NUM) /
00402 RTCP_TX_RATIO_DEN;
00403 if ((s->first_packet || ((rtcp_bytes >= RTCP_SR_SIZE) &&
00404 (ff_ntp_time() - s->last_rtcp_ntp_time > 5000000))) &&
00405 !(s->flags & FF_RTP_FLAG_SKIP_RTCP)) {
00406 rtcp_send_sr(s1, ff_ntp_time());
00407 s->last_octet_count = s->octet_count;
00408 s->first_packet = 0;
00409 }
00410 s->cur_timestamp = s->base_timestamp + pkt->pts;
00411
00412 switch(st->codec->codec_id) {
00413 case CODEC_ID_PCM_MULAW:
00414 case CODEC_ID_PCM_ALAW:
00415 case CODEC_ID_PCM_U8:
00416 case CODEC_ID_PCM_S8:
00417 rtp_send_samples(s1, pkt->data, size, 8 * st->codec->channels);
00418 break;
00419 case CODEC_ID_PCM_U16BE:
00420 case CODEC_ID_PCM_U16LE:
00421 case CODEC_ID_PCM_S16BE:
00422 case CODEC_ID_PCM_S16LE:
00423 rtp_send_samples(s1, pkt->data, size, 16 * st->codec->channels);
00424 break;
00425 case CODEC_ID_ADPCM_G722:
00426
00427
00428
00429
00430 rtp_send_samples(s1, pkt->data, size, 8 * st->codec->channels);
00431 break;
00432 case CODEC_ID_ADPCM_G726:
00433 rtp_send_samples(s1, pkt->data, size,
00434 st->codec->bits_per_coded_sample * st->codec->channels);
00435 break;
00436 case CODEC_ID_MP2:
00437 case CODEC_ID_MP3:
00438 rtp_send_mpegaudio(s1, pkt->data, size);
00439 break;
00440 case CODEC_ID_MPEG1VIDEO:
00441 case CODEC_ID_MPEG2VIDEO:
00442 ff_rtp_send_mpegvideo(s1, pkt->data, size);
00443 break;
00444 case CODEC_ID_AAC:
00445 if (s->flags & FF_RTP_FLAG_MP4A_LATM)
00446 ff_rtp_send_latm(s1, pkt->data, size);
00447 else
00448 ff_rtp_send_aac(s1, pkt->data, size);
00449 break;
00450 case CODEC_ID_AMR_NB:
00451 case CODEC_ID_AMR_WB:
00452 ff_rtp_send_amr(s1, pkt->data, size);
00453 break;
00454 case CODEC_ID_MPEG2TS:
00455 rtp_send_mpegts_raw(s1, pkt->data, size);
00456 break;
00457 case CODEC_ID_H264:
00458 ff_rtp_send_h264(s1, pkt->data, size);
00459 break;
00460 case CODEC_ID_H263:
00461 if (s->flags & FF_RTP_FLAG_RFC2190) {
00462 int mb_info_size = 0;
00463 const uint8_t *mb_info =
00464 av_packet_get_side_data(pkt, AV_PKT_DATA_H263_MB_INFO,
00465 &mb_info_size);
00466 ff_rtp_send_h263_rfc2190(s1, pkt->data, size, mb_info, mb_info_size);
00467 break;
00468 }
00469
00470 case CODEC_ID_H263P:
00471 ff_rtp_send_h263(s1, pkt->data, size);
00472 break;
00473 case CODEC_ID_VORBIS:
00474 case CODEC_ID_THEORA:
00475 ff_rtp_send_xiph(s1, pkt->data, size);
00476 break;
00477 case CODEC_ID_VP8:
00478 ff_rtp_send_vp8(s1, pkt->data, size);
00479 break;
00480 default:
00481
00482 rtp_send_raw(s1, pkt->data, size);
00483 break;
00484 }
00485 return 0;
00486 }
00487
00488 static int rtp_write_trailer(AVFormatContext *s1)
00489 {
00490 RTPMuxContext *s = s1->priv_data;
00491
00492 av_freep(&s->buf);
00493
00494 return 0;
00495 }
00496
00497 AVOutputFormat ff_rtp_muxer = {
00498 .name = "rtp",
00499 .long_name = NULL_IF_CONFIG_SMALL("RTP output format"),
00500 .priv_data_size = sizeof(RTPMuxContext),
00501 .audio_codec = CODEC_ID_PCM_MULAW,
00502 .video_codec = CODEC_ID_MPEG4,
00503 .write_header = rtp_write_header,
00504 .write_packet = rtp_write_packet,
00505 .write_trailer = rtp_write_trailer,
00506 .priv_class = &rtp_muxer_class,
00507 };