diff mbox series

[FFmpeg-devel,04/10] lavc/libopenh264enc: add bit rate control select support

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

Checks

Context Check Description
andriy/ffmpeg-patchwork success Make fate finished

Commit Message

Fu, Linjie April 6, 2020, 11:14 a.m. UTC
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(-)

Comments

Anton Khirnov April 10, 2020, 10:19 a.m. UTC | #1
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?
Fu, Linjie April 11, 2020, 9:51 a.m. UTC | #2
> 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 mbox series

Patch

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;