[FFmpeg-cvslog] avcodec/nvenc: use framerate if available
Zachariah Brown
git at videolan.org
Fri May 15 01:51:46 EEST 2020
ffmpeg | branch: master | Zachariah Brown <zachariah at renewedvision.com> | Thu May 14 14:15:33 2020 -0400| [b18fd2b95b2fea10f0b5381333a1b4c032f010bc] | committer: Timo Rothenpieler
avcodec/nvenc: use framerate if available
The h264_nvenc and hevc_nvenc encoders aren't respecting the framerate in the codec context.
Instead it was using the timebase which in our use-case was 1/1000 so the encoder was behaving
as if we wanted 1000fps. This resulted in poor encoding results due to an extremely low bitrate.
Both the amf and qsv encoders already contain similar logic to first check the framerate before
falling back to the timebase.
Signed-off-by: Zachariah Brown <zachariah at renewedvision.com>
Signed-off-by: Timo Rothenpieler <timo at rothenpieler.org>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=b18fd2b95b2fea10f0b5381333a1b4c032f010bc
---
libavcodec/nvenc.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c
index 068d469ae6..cbdddd33f9 100644
--- a/libavcodec/nvenc.c
+++ b/libavcodec/nvenc.c
@@ -1209,8 +1209,13 @@ static av_cold int nvenc_setup_encoder(AVCodecContext *avctx)
ctx->init_encode_params.darHeight = dh;
ctx->init_encode_params.darWidth = dw;
- ctx->init_encode_params.frameRateNum = avctx->time_base.den;
- ctx->init_encode_params.frameRateDen = avctx->time_base.num * avctx->ticks_per_frame;
+ if (avctx->framerate.num > 0 && avctx->framerate.den > 0) {
+ ctx->init_encode_params.frameRateNum = avctx->framerate.num;
+ ctx->init_encode_params.frameRateDen = avctx->framerate.den;
+ } else {
+ ctx->init_encode_params.frameRateNum = avctx->time_base.den;
+ ctx->init_encode_params.frameRateDen = avctx->time_base.num * avctx->ticks_per_frame;
+ }
ctx->init_encode_params.enableEncodeAsync = 0;
ctx->init_encode_params.enablePTD = 1;
More information about the ffmpeg-cvslog
mailing list