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.

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

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

Signed-off-by: Linjie Fu <linjie...@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");
+            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

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to