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, {.i64 = -1 }, -1, 127, AV_OPT_FLAG_ENCODING_PARAM },
00036 { "ssrc", "Stream identifier", offsetof(RTPMuxContext, ssrc), AV_OPT_TYPE_INT, { .i64 = 0 }, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
00037 { NULL },
00038 };
00039
00040 static const AVClass rtp_muxer_class = {
00041 .class_name = "RTP muxer",
00042 .item_name = av_default_item_name,
00043 .option = options,
00044 .version = LIBAVUTIL_VERSION_INT,
00045 };
00046
00047 #define RTCP_SR_SIZE 28
00048
00049 static int is_supported(enum AVCodecID id)
00050 {
00051 switch(id) {
00052 case AV_CODEC_ID_H263:
00053 case AV_CODEC_ID_H263P:
00054 case AV_CODEC_ID_H264:
00055 case AV_CODEC_ID_MPEG1VIDEO:
00056 case AV_CODEC_ID_MPEG2VIDEO:
00057 case AV_CODEC_ID_MPEG4:
00058 case AV_CODEC_ID_AAC:
00059 case AV_CODEC_ID_MP2:
00060 case AV_CODEC_ID_MP3:
00061 case AV_CODEC_ID_PCM_ALAW:
00062 case AV_CODEC_ID_PCM_MULAW:
00063 case AV_CODEC_ID_PCM_S8:
00064 case AV_CODEC_ID_PCM_S16BE:
00065 case AV_CODEC_ID_PCM_S16LE:
00066 case AV_CODEC_ID_PCM_U16BE:
00067 case AV_CODEC_ID_PCM_U16LE:
00068 case AV_CODEC_ID_PCM_U8:
00069 case AV_CODEC_ID_MPEG2TS:
00070 case AV_CODEC_ID_AMR_NB:
00071 case AV_CODEC_ID_AMR_WB:
00072 case AV_CODEC_ID_VORBIS:
00073 case AV_CODEC_ID_THEORA:
00074 case AV_CODEC_ID_VP8:
00075 case AV_CODEC_ID_ADPCM_G722:
00076 case AV_CODEC_ID_ADPCM_G726:
00077 case AV_CODEC_ID_ILBC:
00078 case AV_CODEC_ID_MJPEG:
00079 case AV_CODEC_ID_SPEEX:
00080 case AV_CODEC_ID_OPUS:
00081 return 1;
00082 default:
00083 return 0;
00084 }
00085 }
00086
00087 static int rtp_write_header(AVFormatContext *s1)
00088 {
00089 RTPMuxContext *s = s1->priv_data;
00090 int n;
00091 AVStream *st;
00092
00093 if (s1->nb_streams != 1) {
00094 av_log(s1, AV_LOG_ERROR, "Only one stream supported in the RTP muxer\n");
00095 return AVERROR(EINVAL);
00096 }
00097 st = s1->streams[0];
00098 if (!is_supported(st->codec->codec_id)) {
00099 av_log(s1, AV_LOG_ERROR, "Unsupported codec %s\n", avcodec_get_name(st->codec->codec_id));
00100
00101 return -1;
00102 }
00103
00104 if (s->payload_type < 0) {
00105
00106 if (st->id < RTP_PT_PRIVATE)
00107 st->id = ff_rtp_get_payload_type(s1, st->codec, -1);
00108
00109 s->payload_type = st->id;
00110 } else {
00111
00112 st->id = s->payload_type;
00113 }
00114
00115 s->base_timestamp = av_get_random_seed();
00116 s->timestamp = s->base_timestamp;
00117 s->cur_timestamp = 0;
00118 if (!s->ssrc)
00119 s->ssrc = av_get_random_seed();
00120 s->first_packet = 1;
00121 s->first_rtcp_ntp_time = ff_ntp_time();
00122 if (s1->start_time_realtime)
00123
00124 s->first_rtcp_ntp_time = (s1->start_time_realtime / 1000) * 1000 +
00125 NTP_OFFSET_US;
00126
00127 if (s1->packet_size) {
00128 if (s1->pb->max_packet_size)
00129 s1->packet_size = FFMIN(s1->packet_size,
00130 s1->pb->max_packet_size);
00131 } else
00132 s1->packet_size = s1->pb->max_packet_size;
00133 if (s1->packet_size <= 12) {
00134 av_log(s1, AV_LOG_ERROR, "Max packet size %d too low\n", s1->packet_size);
00135 return AVERROR(EIO);
00136 }
00137 s->buf = av_malloc(s1->packet_size);
00138 if (s->buf == NULL) {
00139 return AVERROR(ENOMEM);
00140 }
00141 s->max_payload_size = s1->packet_size - 12;
00142
00143 s->max_frames_per_packet = 0;
00144 if (s1->max_delay > 0) {
00145 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
00146 int frame_size = av_get_audio_frame_duration(st->codec, 0);
00147 if (!frame_size)
00148 frame_size = st->codec->frame_size;
00149 if (frame_size == 0) {
00150 av_log(s1, AV_LOG_ERROR, "Cannot respect max delay: frame size = 0\n");
00151 } else {
00152 s->max_frames_per_packet =
00153 av_rescale_q_rnd(s1->max_delay,
00154 AV_TIME_BASE_Q,
00155 (AVRational){ frame_size, st->codec->sample_rate },
00156 AV_ROUND_DOWN);
00157 }
00158 }
00159 if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
00160
00161 s->max_frames_per_packet = av_rescale_q(s1->max_delay, (AVRational){1, 1000000}, st->codec->time_base);
00162 }
00163 }
00164
00165 avpriv_set_pts_info(st, 32, 1, 90000);
00166 switch(st->codec->codec_id) {
00167 case AV_CODEC_ID_MP2:
00168 case AV_CODEC_ID_MP3:
00169 s->buf_ptr = s->buf + 4;
00170 break;
00171 case AV_CODEC_ID_MPEG1VIDEO:
00172 case AV_CODEC_ID_MPEG2VIDEO:
00173 break;
00174 case AV_CODEC_ID_MPEG2TS:
00175 n = s->max_payload_size / TS_PACKET_SIZE;
00176 if (n < 1)
00177 n = 1;
00178 s->max_payload_size = n * TS_PACKET_SIZE;
00179 s->buf_ptr = s->buf;
00180 break;
00181 case AV_CODEC_ID_H264:
00182
00183 if (st->codec->extradata_size > 4 && st->codec->extradata[0] == 1) {
00184 s->nal_length_size = (st->codec->extradata[4] & 0x03) + 1;
00185 }
00186 break;
00187 case AV_CODEC_ID_VORBIS:
00188 case AV_CODEC_ID_THEORA:
00189 if (!s->max_frames_per_packet) s->max_frames_per_packet = 15;
00190 s->max_frames_per_packet = av_clip(s->max_frames_per_packet, 1, 15);
00191 s->max_payload_size -= 6;
00192 s->num_frames = 0;
00193 goto defaultcase;
00194 case AV_CODEC_ID_ADPCM_G722:
00195
00196
00197 avpriv_set_pts_info(st, 32, 1, 8000);
00198 break;
00199 case AV_CODEC_ID_OPUS:
00200 if (st->codec->channels > 2) {
00201 av_log(s1, AV_LOG_ERROR, "Multistream opus not supported in RTP\n");
00202 goto fail;
00203 }
00204
00205
00206
00207 avpriv_set_pts_info(st, 32, 1, 48000);
00208 break;
00209 case AV_CODEC_ID_ILBC:
00210 if (st->codec->block_align != 38 && st->codec->block_align != 50) {
00211 av_log(s1, AV_LOG_ERROR, "Incorrect iLBC block size specified\n");
00212 goto fail;
00213 }
00214 if (!s->max_frames_per_packet)
00215 s->max_frames_per_packet = 1;
00216 s->max_frames_per_packet = FFMIN(s->max_frames_per_packet,
00217 s->max_payload_size / st->codec->block_align);
00218 goto defaultcase;
00219 case AV_CODEC_ID_AMR_NB:
00220 case AV_CODEC_ID_AMR_WB:
00221 if (!s->max_frames_per_packet)
00222 s->max_frames_per_packet = 12;
00223 if (st->codec->codec_id == AV_CODEC_ID_AMR_NB)
00224 n = 31;
00225 else
00226 n = 61;
00227
00228 if (1 + s->max_frames_per_packet + n > s->max_payload_size) {
00229 av_log(s1, AV_LOG_ERROR, "RTP max payload size too small for AMR\n");
00230 goto fail;
00231 }
00232 if (st->codec->channels != 1) {
00233 av_log(s1, AV_LOG_ERROR, "Only mono is supported\n");
00234 goto fail;
00235 }
00236 case AV_CODEC_ID_AAC:
00237 s->num_frames = 0;
00238 default:
00239 defaultcase:
00240 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
00241 avpriv_set_pts_info(st, 32, 1, st->codec->sample_rate);
00242 }
00243 s->buf_ptr = s->buf;
00244 break;
00245 }
00246
00247 return 0;
00248
00249 fail:
00250 av_freep(&s->buf);
00251 return AVERROR(EINVAL);
00252 }
00253
00254
00255 static void rtcp_send_sr(AVFormatContext *s1, int64_t ntp_time)
00256 {
00257 RTPMuxContext *s = s1->priv_data;
00258 uint32_t rtp_ts;
00259
00260 av_dlog(s1, "RTCP: %02x %"PRIx64" %x\n", s->payload_type, ntp_time, s->timestamp);
00261
00262 s->last_rtcp_ntp_time = ntp_time;
00263 rtp_ts = av_rescale_q(ntp_time - s->first_rtcp_ntp_time, (AVRational){1, 1000000},
00264 s1->streams[0]->time_base) + s->base_timestamp;
00265 avio_w8(s1->pb, (RTP_VERSION << 6));
00266 avio_w8(s1->pb, RTCP_SR);
00267 avio_wb16(s1->pb, 6);
00268 avio_wb32(s1->pb, s->ssrc);
00269 avio_wb32(s1->pb, ntp_time / 1000000);
00270 avio_wb32(s1->pb, ((ntp_time % 1000000) << 32) / 1000000);
00271 avio_wb32(s1->pb, rtp_ts);
00272 avio_wb32(s1->pb, s->packet_count);
00273 avio_wb32(s1->pb, s->octet_count);
00274 avio_flush(s1->pb);
00275 }
00276
00277
00278
00279 void ff_rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m)
00280 {
00281 RTPMuxContext *s = s1->priv_data;
00282
00283 av_dlog(s1, "rtp_send_data size=%d\n", len);
00284
00285
00286 avio_w8(s1->pb, (RTP_VERSION << 6));
00287 avio_w8(s1->pb, (s->payload_type & 0x7f) | ((m & 0x01) << 7));
00288 avio_wb16(s1->pb, s->seq);
00289 avio_wb32(s1->pb, s->timestamp);
00290 avio_wb32(s1->pb, s->ssrc);
00291
00292 avio_write(s1->pb, buf1, len);
00293 avio_flush(s1->pb);
00294
00295 s->seq++;
00296 s->octet_count += len;
00297 s->packet_count++;
00298 }
00299
00300
00301
00302 static int rtp_send_samples(AVFormatContext *s1,
00303 const uint8_t *buf1, int size, int sample_size_bits)
00304 {
00305 RTPMuxContext *s = s1->priv_data;
00306 int len, max_packet_size, n;
00307
00308 int aligned_samples_size = sample_size_bits/av_gcd(sample_size_bits, 8);
00309
00310 max_packet_size = (s->max_payload_size / aligned_samples_size) * aligned_samples_size;
00311
00312 if ((sample_size_bits % 8) == 0 && ((8 * size) % sample_size_bits) != 0)
00313 return AVERROR(EINVAL);
00314 n = 0;
00315 while (size > 0) {
00316 s->buf_ptr = s->buf;
00317 len = FFMIN(max_packet_size, size);
00318
00319
00320 memcpy(s->buf_ptr, buf1, len);
00321 s->buf_ptr += len;
00322 buf1 += len;
00323 size -= len;
00324 s->timestamp = s->cur_timestamp + n * 8 / sample_size_bits;
00325 ff_rtp_send_data(s1, s->buf, s->buf_ptr - s->buf, 0);
00326 n += (s->buf_ptr - s->buf);
00327 }
00328 return 0;
00329 }
00330
00331 static void rtp_send_mpegaudio(AVFormatContext *s1,
00332 const uint8_t *buf1, int size)
00333 {
00334 RTPMuxContext *s = s1->priv_data;
00335 int len, count, max_packet_size;
00336
00337 max_packet_size = s->max_payload_size;
00338
00339
00340 len = (s->buf_ptr - s->buf);
00341 if ((len + size) > max_packet_size) {
00342 if (len > 4) {
00343 ff_rtp_send_data(s1, s->buf, s->buf_ptr - s->buf, 0);
00344 s->buf_ptr = s->buf + 4;
00345 }
00346 }
00347 if (s->buf_ptr == s->buf + 4) {
00348 s->timestamp = s->cur_timestamp;
00349 }
00350
00351
00352 if (size > max_packet_size) {
00353
00354 count = 0;
00355 while (size > 0) {
00356 len = max_packet_size - 4;
00357 if (len > size)
00358 len = size;
00359
00360 s->buf[0] = 0;
00361 s->buf[1] = 0;
00362 s->buf[2] = count >> 8;
00363 s->buf[3] = count;
00364 memcpy(s->buf + 4, buf1, len);
00365 ff_rtp_send_data(s1, s->buf, len + 4, 0);
00366 size -= len;
00367 buf1 += len;
00368 count += len;
00369 }
00370 } else {
00371 if (s->buf_ptr == s->buf + 4) {
00372
00373 s->buf[0] = 0;
00374 s->buf[1] = 0;
00375 s->buf[2] = 0;
00376 s->buf[3] = 0;
00377 }
00378 memcpy(s->buf_ptr, buf1, size);
00379 s->buf_ptr += size;
00380 }
00381 }
00382
00383 static void rtp_send_raw(AVFormatContext *s1,
00384 const uint8_t *buf1, int size)
00385 {
00386 RTPMuxContext *s = s1->priv_data;
00387 int len, max_packet_size;
00388
00389 max_packet_size = s->max_payload_size;
00390
00391 while (size > 0) {
00392 len = max_packet_size;
00393 if (len > size)
00394 len = size;
00395
00396 s->timestamp = s->cur_timestamp;
00397 ff_rtp_send_data(s1, buf1, len, (len == size));
00398
00399 buf1 += len;
00400 size -= len;
00401 }
00402 }
00403
00404
00405 static void rtp_send_mpegts_raw(AVFormatContext *s1,
00406 const uint8_t *buf1, int size)
00407 {
00408 RTPMuxContext *s = s1->priv_data;
00409 int len, out_len;
00410
00411 while (size >= TS_PACKET_SIZE) {
00412 len = s->max_payload_size - (s->buf_ptr - s->buf);
00413 if (len > size)
00414 len = size;
00415 memcpy(s->buf_ptr, buf1, len);
00416 buf1 += len;
00417 size -= len;
00418 s->buf_ptr += len;
00419
00420 out_len = s->buf_ptr - s->buf;
00421 if (out_len >= s->max_payload_size) {
00422 ff_rtp_send_data(s1, s->buf, out_len, 0);
00423 s->buf_ptr = s->buf;
00424 }
00425 }
00426 }
00427
00428 static int rtp_send_ilbc(AVFormatContext *s1, const uint8_t *buf, int size)
00429 {
00430 RTPMuxContext *s = s1->priv_data;
00431 AVStream *st = s1->streams[0];
00432 int frame_duration = av_get_audio_frame_duration(st->codec, 0);
00433 int frame_size = st->codec->block_align;
00434 int frames = size / frame_size;
00435
00436 while (frames > 0) {
00437 int n = FFMIN(s->max_frames_per_packet - s->num_frames, frames);
00438
00439 if (!s->num_frames) {
00440 s->buf_ptr = s->buf;
00441 s->timestamp = s->cur_timestamp;
00442 }
00443 memcpy(s->buf_ptr, buf, n * frame_size);
00444 frames -= n;
00445 s->num_frames += n;
00446 s->buf_ptr += n * frame_size;
00447 buf += n * frame_size;
00448 s->cur_timestamp += n * frame_duration;
00449
00450 if (s->num_frames == s->max_frames_per_packet) {
00451 ff_rtp_send_data(s1, s->buf, s->buf_ptr - s->buf, 1);
00452 s->num_frames = 0;
00453 }
00454 }
00455 return 0;
00456 }
00457
00458 static int rtp_write_packet(AVFormatContext *s1, AVPacket *pkt)
00459 {
00460 RTPMuxContext *s = s1->priv_data;
00461 AVStream *st = s1->streams[0];
00462 int rtcp_bytes;
00463 int size= pkt->size;
00464
00465 av_dlog(s1, "%d: write len=%d\n", pkt->stream_index, size);
00466
00467 rtcp_bytes = ((s->octet_count - s->last_octet_count) * RTCP_TX_RATIO_NUM) /
00468 RTCP_TX_RATIO_DEN;
00469 if ((s->first_packet || ((rtcp_bytes >= RTCP_SR_SIZE) &&
00470 (ff_ntp_time() - s->last_rtcp_ntp_time > 5000000))) &&
00471 !(s->flags & FF_RTP_FLAG_SKIP_RTCP)) {
00472 rtcp_send_sr(s1, ff_ntp_time());
00473 s->last_octet_count = s->octet_count;
00474 s->first_packet = 0;
00475 }
00476 s->cur_timestamp = s->base_timestamp + pkt->pts;
00477
00478 switch(st->codec->codec_id) {
00479 case AV_CODEC_ID_PCM_MULAW:
00480 case AV_CODEC_ID_PCM_ALAW:
00481 case AV_CODEC_ID_PCM_U8:
00482 case AV_CODEC_ID_PCM_S8:
00483 return rtp_send_samples(s1, pkt->data, size, 8 * st->codec->channels);
00484 case AV_CODEC_ID_PCM_U16BE:
00485 case AV_CODEC_ID_PCM_U16LE:
00486 case AV_CODEC_ID_PCM_S16BE:
00487 case AV_CODEC_ID_PCM_S16LE:
00488 return rtp_send_samples(s1, pkt->data, size, 16 * st->codec->channels);
00489 case AV_CODEC_ID_ADPCM_G722:
00490
00491
00492
00493
00494 return rtp_send_samples(s1, pkt->data, size, 8 * st->codec->channels);
00495 case AV_CODEC_ID_ADPCM_G726:
00496 return rtp_send_samples(s1, pkt->data, size,
00497 st->codec->bits_per_coded_sample * st->codec->channels);
00498 case AV_CODEC_ID_MP2:
00499 case AV_CODEC_ID_MP3:
00500 rtp_send_mpegaudio(s1, pkt->data, size);
00501 break;
00502 case AV_CODEC_ID_MPEG1VIDEO:
00503 case AV_CODEC_ID_MPEG2VIDEO:
00504 ff_rtp_send_mpegvideo(s1, pkt->data, size);
00505 break;
00506 case AV_CODEC_ID_AAC:
00507 if (s->flags & FF_RTP_FLAG_MP4A_LATM)
00508 ff_rtp_send_latm(s1, pkt->data, size);
00509 else
00510 ff_rtp_send_aac(s1, pkt->data, size);
00511 break;
00512 case AV_CODEC_ID_AMR_NB:
00513 case AV_CODEC_ID_AMR_WB:
00514 ff_rtp_send_amr(s1, pkt->data, size);
00515 break;
00516 case AV_CODEC_ID_MPEG2TS:
00517 rtp_send_mpegts_raw(s1, pkt->data, size);
00518 break;
00519 case AV_CODEC_ID_H264:
00520 ff_rtp_send_h264(s1, pkt->data, size);
00521 break;
00522 case AV_CODEC_ID_H263:
00523 if (s->flags & FF_RTP_FLAG_RFC2190) {
00524 int mb_info_size = 0;
00525 const uint8_t *mb_info =
00526 av_packet_get_side_data(pkt, AV_PKT_DATA_H263_MB_INFO,
00527 &mb_info_size);
00528 ff_rtp_send_h263_rfc2190(s1, pkt->data, size, mb_info, mb_info_size);
00529 break;
00530 }
00531
00532 case AV_CODEC_ID_H263P:
00533 ff_rtp_send_h263(s1, pkt->data, size);
00534 break;
00535 case AV_CODEC_ID_VORBIS:
00536 case AV_CODEC_ID_THEORA:
00537 ff_rtp_send_xiph(s1, pkt->data, size);
00538 break;
00539 case AV_CODEC_ID_VP8:
00540 ff_rtp_send_vp8(s1, pkt->data, size);
00541 break;
00542 case AV_CODEC_ID_ILBC:
00543 rtp_send_ilbc(s1, pkt->data, size);
00544 break;
00545 case AV_CODEC_ID_MJPEG:
00546 ff_rtp_send_jpeg(s1, pkt->data, size);
00547 break;
00548 case AV_CODEC_ID_OPUS:
00549 if (size > s->max_payload_size) {
00550 av_log(s1, AV_LOG_ERROR,
00551 "Packet size %d too large for max RTP payload size %d\n",
00552 size, s->max_payload_size);
00553 return AVERROR(EINVAL);
00554 }
00555
00556 default:
00557
00558 rtp_send_raw(s1, pkt->data, size);
00559 break;
00560 }
00561 return 0;
00562 }
00563
00564 static int rtp_write_trailer(AVFormatContext *s1)
00565 {
00566 RTPMuxContext *s = s1->priv_data;
00567
00568 av_freep(&s->buf);
00569
00570 return 0;
00571 }
00572
00573 AVOutputFormat ff_rtp_muxer = {
00574 .name = "rtp",
00575 .long_name = NULL_IF_CONFIG_SMALL("RTP output"),
00576 .priv_data_size = sizeof(RTPMuxContext),
00577 .audio_codec = AV_CODEC_ID_PCM_MULAW,
00578 .video_codec = AV_CODEC_ID_MPEG4,
00579 .write_header = rtp_write_header,
00580 .write_packet = rtp_write_packet,
00581 .write_trailer = rtp_write_trailer,
00582 .priv_class = &rtp_muxer_class,
00583 };