[FFmpeg-devel] [PATCH v4 3/9] lavc/libopenh264enc: add bit rate control select support

Martin Storsjö martin at martin.st
Mon Apr 27 22:35:03 EEST 2020


On Wed, 15 Apr 2020, Linjie Fu wrote:

> 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 at intel.com>
> ---
> libavcodec/libopenh264enc.c | 12 +++++++++++-
> 1 file changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/libavcodec/libopenh264enc.c b/libavcodec/libopenh264enc.c
> index 57313b1..f994f95 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 > 0 ? avctx->bit_rate : 2*1000*1000;
>     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;
> -- 
> 2.7.4

This looks ok, but I don't think all of these have been available since 
the beginning. We do support building with a few older versions of the 
library, so I think at least RC_TIMESTAMP_MODE appeared later. The lowest 
version that was supported originally was OpenH264 1.3, so for things that 
have appeared later, please add ifdefs (or consistently bump the minimum 
version somewhere and remove redundant checks for lower versions).

// Martin



More information about the ffmpeg-devel mailing list