[FFmpeg-devel] [PATCH, RFC, v2 3/3] lavc/libvpxenc: add dynamic resolution encode support for libvpx

James Zern jzern at google.com
Wed Aug 14 02:37:27 EEST 2019


Hi,

On Tue, Aug 13, 2019 at 2:30 AM Linjie Fu <linjie.fu at intel.com> wrote:
>
> According to spec, libvpx should support dynamic resolution changes.
>
> Add dynamic resolution encoding support in libvpx.
>
> Only single pass mode with no look ahead is supported for variable
> resolution encoding without initialization.
>

Do you mean /reinitialization/?

> cmdline:
> ffmpeg -noautoscale -y -i ./reinit-large_420_8-to-small_420_8.h264
>      -pix_fmt yuv420p -c:v libvpx-vp9 lena.ivf
>

Do you have a reference command line for creating the source content?

> Filed an issue in https://bugs.chromium.org/p/webm/issues/detail?id=1642
> to fix some memory problem.
>

It may be worth getting that bug resolved before landing this change
if existing library versions are buggy.

> Signed-off-by: Linjie Fu <linjie.fu at intel.com>
> ---
>  libavcodec/libvpxenc.c | 24 ++++++++++++++++++++++++
>  1 file changed, 24 insertions(+)
>
> diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c
> index feb52ea..3d2295d 100644
> --- a/libavcodec/libvpxenc.c
> +++ b/libavcodec/libvpxenc.c
> @@ -1067,6 +1067,28 @@ static int vpx_encode(AVCodecContext *avctx, AVPacket *pkt,
>      int res, coded_size;
>      vpx_enc_frame_flags_t flags = 0;
>
> +    if (frame && (avctx->width != frame->width ||
> +                  avctx->height != frame->height)) {
> +        avctx->width  = frame->width;
> +        avctx->height = frame->height;
> +
> +        struct vpx_codec_enc_cfg new_cfg = { 0 };
> +        memcpy(&new_cfg, ctx->encoder.config.enc,
> +                            sizeof(struct vpx_codec_enc_cfg));
> +
> +        new_cfg.g_w = frame->width;
> +        new_cfg.g_h = frame->height;
> +        if (new_cfg.g_lag_in_frames > 1 ||
> +            new_cfg.g_pass != VPX_RC_ONE_PASS) {
> +            av_log(avctx, AV_LOG_WARNING, "Only single pass mode "
> +                   "with no look ahead is supported for variable "
> +                   "resolution encoding without initialization.\n");

Would it be better to warn and reinitialize as in your earlier patch
rather than changing the settings from the user?

> +            new_cfg.g_pass          = VPX_RC_ONE_PASS;
> +            new_cfg.g_lag_in_frames = 0;
> +        }
> +        vpx_codec_enc_config_set(&ctx->encoder, &new_cfg);
> +    }
> +
>      if (frame) {
>          rawimg                      = &ctx->rawimg;
>          rawimg->planes[VPX_PLANE_Y] = frame->data[0];
> @@ -1075,6 +1097,8 @@ static int vpx_encode(AVCodecContext *avctx, AVPacket *pkt,
>          rawimg->stride[VPX_PLANE_Y] = frame->linesize[0];
>          rawimg->stride[VPX_PLANE_U] = frame->linesize[1];
>          rawimg->stride[VPX_PLANE_V] = frame->linesize[2];
> +        rawimg->d_w                 = frame->width;
> +        rawimg->d_h                 = frame->height;
>          if (ctx->is_alpha) {
>              uint8_t *u_plane, *v_plane;
>              rawimg_alpha = &ctx->rawimg_alpha;
> --
> 2.7.4


More information about the ffmpeg-devel mailing list