X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Frtpenc.c;h=29fc2f4aa707ea0fbf5a32d0dec3bb742ea4d94c;hb=ed7bdd8647a3d0f534c2af0d244fc8744ff262a0;hp=41d584381ba5e5703e341f07cd9a21a8d6cab26e;hpb=984b914c55fe480985e702ce945e2f88835c21fe;p=ffmpeg diff --git a/libavformat/rtpenc.c b/libavformat/rtpenc.c index 41d584381ba..29fc2f4aa70 100644 --- a/libavformat/rtpenc.c +++ b/libavformat/rtpenc.c @@ -33,7 +33,6 @@ static const AVOption options[] = { FF_RTP_FLAG_OPTS(RTPMuxContext, flags) { "payload_type", "Specify RTP payload type", offsetof(RTPMuxContext, payload_type), AV_OPT_TYPE_INT, {.dbl = -1 }, -1, 127, AV_OPT_FLAG_ENCODING_PARAM }, - { "max_packet_size", "Max packet size", offsetof(RTPMuxContext, max_packet_size), AV_OPT_TYPE_INT, {.dbl = 0 }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM }, { NULL }, }; @@ -110,29 +109,36 @@ static int rtp_write_header(AVFormatContext *s1) s->first_rtcp_ntp_time = (s1->start_time_realtime / 1000) * 1000 + NTP_OFFSET_US; - if (s->max_packet_size) { + if (s1->packet_size) { if (s1->pb->max_packet_size) - s->max_packet_size = FFMIN(s->max_packet_size, - s1->pb->max_packet_size); + s1->packet_size = FFMIN(s1->packet_size, + s1->pb->max_packet_size); } else - s->max_packet_size = s1->pb->max_packet_size; - if (s->max_packet_size <= 12) { - av_log(s1, AV_LOG_ERROR, "Max packet size %d too low\n", s->max_packet_size); + s1->packet_size = s1->pb->max_packet_size; + if (s1->packet_size <= 12) { + av_log(s1, AV_LOG_ERROR, "Max packet size %d too low\n", s1->packet_size); return AVERROR(EIO); } - s->buf = av_malloc(s->max_packet_size); + s->buf = av_malloc(s1->packet_size); if (s->buf == NULL) { return AVERROR(ENOMEM); } - s->max_payload_size = s->max_packet_size - 12; + s->max_payload_size = s1->packet_size - 12; s->max_frames_per_packet = 0; - if (s1->max_delay) { + if (s1->max_delay > 0) { if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) { - if (st->codec->frame_size == 0) { + int frame_size = av_get_audio_frame_duration(st->codec, 0); + if (!frame_size) + frame_size = st->codec->frame_size; + if (frame_size == 0) { av_log(s1, AV_LOG_ERROR, "Cannot respect max delay: frame size = 0\n"); } else { - s->max_frames_per_packet = av_rescale_rnd(s1->max_delay, st->codec->sample_rate, AV_TIME_BASE * (int64_t)st->codec->frame_size, AV_ROUND_DOWN); + s->max_frames_per_packet = + av_rescale_q_rnd(s1->max_delay, + AV_TIME_BASE_Q, + (AVRational){ frame_size, st->codec->sample_rate }, + AV_ROUND_DOWN); } } if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) { @@ -497,5 +503,5 @@ AVOutputFormat ff_rtp_muxer = { .write_header = rtp_write_header, .write_packet = rtp_write_packet, .write_trailer = rtp_write_trailer, - .priv_class = &rtp_muxer_class, + .priv_class = &rtp_muxer_class, };