Message ID | 1586171693-7836-5-git-send-email-linjie.fu@intel.com |
---|---|
State | Superseded |
Headers | show |
Series | Patch set for the enhancement of libopenh264 encoder | expand |
Context | Check | Description |
---|---|---|
andriy/ffmpeg-patchwork | success | Make fate finished |
Quoting Linjie Fu (2020-04-06 13:14:47) > RC_BITRATE_MODE: > set BITS_EXCEEDED to iCurrentBitsLevel and allows QP adjust > in RcCalculatePictureQp(). > > RC_BUFFERBASED_MODE: > use buffer status to adjust the video quality. > > RC_TIMESTAMP_MODE: > bit rate control based on timestamp. > > Default to use RC_QUALITY_MODE. > > Signed-off-by: Linjie Fu <linjie.fu@intel.com> > --- > libavcodec/libopenh264enc.c | 12 +++++++++++- > 1 file changed, 11 insertions(+), 1 deletion(-) > Doesn't this functionality depend on what variables the user specified explicitly (like qscale, max/min/avg bitrates, buffer sizes etc.). Wouldn't it be better to choose the default RC type based on those, like vaapi does it?
> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of > Anton Khirnov > Sent: Friday, April 10, 2020 18:20 > To: FFmpeg development discussions and patches <ffmpeg- > devel@ffmpeg.org> > Subject: Re: [FFmpeg-devel] [PATCH 04/10] lavc/libopenh264enc: add bit > rate control select support > > Quoting Linjie Fu (2020-04-06 13:14:47) > > RC_BITRATE_MODE: > > set BITS_EXCEEDED to iCurrentBitsLevel and allows QP adjust > > in RcCalculatePictureQp(). > > > > RC_BUFFERBASED_MODE: > > use buffer status to adjust the video quality. > > > > RC_TIMESTAMP_MODE: > > bit rate control based on timestamp. > > > > Default to use RC_QUALITY_MODE. > > > > Signed-off-by: Linjie Fu <linjie.fu@intel.com> > > --- > > libavcodec/libopenh264enc.c | 12 +++++++++++- > > 1 file changed, 11 insertions(+), 1 deletion(-) > > > > Doesn't this functionality depend on what variables the user specified > explicitly (like qscale, max/min/avg bitrates, buffer sizes etc.). > Wouldn't it be better to choose the default RC type based on those, like > vaapi does it? > Judging rc_mode by specific variables makes great sense. And I'm planning to add this in later patches, because libopenh264enc currently lacks the supports for avctx->global_quality, avctx->flags & AV_CODEC_FLAG_QSCALE, or a specific qp. They should be added firstly. This patch is the first step for user to determined it by explicit rc_mode, like vaapi does. - Linjie
diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c index 3ff5be7..dab8244 100644 --- a/libavcodec/libopenh264enc.c +++ b/libavcodec/libopenh264enc.c @@ -47,6 +47,9 @@ typedef struct SVCContext { int skip_frames; int skipped; int cabac; + + // rate control mode + int rc_mode; } SVCContext; #define OFFSET(x) offsetof(SVCContext, x) @@ -71,6 +74,13 @@ static const AVOption options[] = { { "max_nal_size", "set maximum NAL size in bytes", OFFSET(max_nal_size), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE }, { "allow_skip_frames", "allow skipping frames to hit the target bitrate", OFFSET(skip_frames), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, { "cabac", "Enable cabac", OFFSET(cabac), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE }, + + { "rc_mode", "Select rate control mode", OFFSET(rc_mode), AV_OPT_TYPE_INT, { .i64 = RC_QUALITY_MODE }, RC_OFF_MODE, RC_TIMESTAMP_MODE, VE, "rc_mode" }, + { "off", "bit rate control off", 0, AV_OPT_TYPE_CONST, { .i64 = RC_OFF_MODE }, 0, 0, VE, "rc_mode" }, + { "quality", "quality mode", 0, AV_OPT_TYPE_CONST, { .i64 = RC_QUALITY_MODE }, 0, 0, VE, "rc_mode" }, + { "bitrate", "bitrate mode", 0, AV_OPT_TYPE_CONST, { .i64 = RC_BITRATE_MODE }, 0, 0, VE, "rc_mode" }, + { "buffer", "using buffer status to adjust the video quality (no bitrate control)", 0, AV_OPT_TYPE_CONST, { .i64 = RC_BUFFERBASED_MODE }, 0, 0, VE, "rc_mode" }, + { "timestamp", "bit rate control based on timestamp", 0, AV_OPT_TYPE_CONST, { .i64 = RC_TIMESTAMP_MODE }, 0, 0, VE, "rc_mode" }, { NULL } }; @@ -134,7 +144,7 @@ FF_ENABLE_DEPRECATION_WARNINGS param.iPicHeight = avctx->height; param.iTargetBitrate = avctx->bit_rate; param.iMaxBitrate = FFMAX(avctx->rc_max_rate, avctx->bit_rate); - param.iRCMode = RC_QUALITY_MODE; + param.iRCMode = s->rc_mode; // QP = 0 is not well supported, so default to (1, 51) param.iMaxQp = avctx->qmax >= 0 ? av_clip(avctx->qmax, 1, 51) : 51; param.iMinQp = avctx->qmin >= 0 ? av_clip(avctx->qmin, 1, param.iMaxQp) : 1;
RC_BITRATE_MODE: set BITS_EXCEEDED to iCurrentBitsLevel and allows QP adjust in RcCalculatePictureQp(). RC_BUFFERBASED_MODE: use buffer status to adjust the video quality. RC_TIMESTAMP_MODE: bit rate control based on timestamp. Default to use RC_QUALITY_MODE. Signed-off-by: Linjie Fu <linjie.fu@intel.com> --- libavcodec/libopenh264enc.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)