diff --git a/src/media/media_encoder.cpp b/src/media/media_encoder.cpp index bbc8a64fcd674d659d474d0b1589079de5e25dc0..94edf737bed5099c7f94fbd685333e5b0993bb82 100644 --- a/src/media/media_encoder.cpp +++ b/src/media/media_encoder.cpp @@ -84,7 +84,7 @@ void MediaEncoder::setOptions(const MediaDescription& args) codec_ = args.codec; av_dict_set(&options_, "payload_type", ring::to_string(args.payload_type).c_str(), 0); - av_dict_set(&options_, "bitrate", ring::to_string(args.codec->bitrate).c_str(), 0); + av_dict_set(&options_, "max_rate", ring::to_string(args.codec->bitrate).c_str(), 0); if (args.codec->systemCodecInfo.mediaType == MEDIA_AUDIO) { auto accountAudioCodec = std::static_pointer_cast<AccountAudioCodecInfo>(args.codec); @@ -149,11 +149,16 @@ MediaEncoder::openOutput(const char *filename, } prepareEncoderContext(args.codec->systemCodecInfo.mediaType == MEDIA_VIDEO); + auto maxBitrate = 1000 * atoi(av_dict_get(options_, "max_rate", NULL, 0)->value); + RING_DBG("Using max bitrate %d", maxBitrate ); /* let x264 preset override our encoder settings */ if (args.codec->systemCodecInfo.avcodecId == AV_CODEC_ID_H264) { extractProfileLevelID(args.parameters, encoderCtx_); forcePresetX264(); + // For H264 : define max bitrate in rc_max_rate + encoderCtx_->rc_max_rate = maxBitrate; + } else if (args.codec->systemCodecInfo.avcodecId == AV_CODEC_ID_VP8) { // Using information given on this page: // http://www.webmproject.org/docs/encoder-parameters/ @@ -164,8 +169,11 @@ MediaEncoder::openOutput(const char *filename, encoderCtx_->qmin = 4; encoderCtx_->qmax = 56; encoderCtx_->gop_size = 999999; + // For VP8 : define max bitrate in bit_rate + encoderCtx_->bit_rate = maxBitrate; } else if (args.codec->systemCodecInfo.avcodecId == AV_CODEC_ID_MPEG4) { - encoderCtx_->rc_buffer_size = encoderCtx_->bit_rate; + // For MPEG4 : define max bitrate in bit_rate + encoderCtx_->bit_rate = maxBitrate; } int ret; @@ -529,21 +537,12 @@ void MediaEncoder::prepareEncoderContext(bool is_video) if (encoderName == nullptr) encoderName = "encoder?"; - // set some encoder settings here - encoderCtx_->bit_rate = 1000 * atoi(av_dict_get(options_, "bitrate", - NULL, 0)->value); - RING_DBG("[%s] Using bitrate %d", encoderName, encoderCtx_->bit_rate); - - // Use constant bitrate (video only) - if (is_video) { - RING_DBG("[%s] Using CBR", encoderName); - encoderCtx_->rc_min_rate = \ - encoderCtx_->rc_max_rate = encoderCtx_->bit_rate; - } encoderCtx_->thread_count = std::thread::hardware_concurrency(); RING_DBG("[%s] Using %d threads", encoderName, encoderCtx_->thread_count); + encoderCtx_->rc_buffer_size = encoderCtx_->rc_max_rate; + if (is_video) { // resolution must be a multiple of two encoderCtx_->width = device_.width;