[FFmpeg-devel] [PATCH] lavc/vp8: Fix HWAccel VP8 decoder can't support resolution change.
Jun Zhao
mypopydev at gmail.com
Tue Nov 28 07:20:59 EET 2017
-------------- next part --------------
From 94d511d93fdb83103fdafbd9ca0d02abfbd2e305 Mon Sep 17 00:00:00 2001
From: Jun Zhao <jun.zhao at intel.com>
Date: Tue, 28 Nov 2017 21:05:18 +0800
Subject: [PATCH] lavc/vp8: Fix HWAccel VP8 decoder can't support resolution
change.
Use the following command to reproduce this issue:
make fate-vp8-size-change HWACCEL="vaapi -vaapi_device \
/dev/dri/renderD128 -hwaccel_output_format yuv420p"
SAMPLES=../fate-suite/.
At the same time, reconstruct the public logic as a function.
Signed-off-by: Yun Zhou <yunx.z.zhou at intel.com>
Signed-off-by: Jun Zhao <jun.zhao at intel.com>
---
libavcodec/vp8.c | 46 ++++++++++++++++++++++++++++++++++------------
1 file changed, 34 insertions(+), 12 deletions(-)
diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c
index 471c0bb89e..5bf00a44f9 100644
--- a/libavcodec/vp8.c
+++ b/libavcodec/vp8.c
@@ -167,6 +167,30 @@ static VP8Frame *vp8_find_free_buffer(VP8Context *s)
return frame;
}
+static enum AVPixelFormat get_pixel_format(VP8Context *s)
+{
+ enum AVPixelFormat fmt;
+ enum AVPixelFormat pix_fmts[] = {
+#if CONFIG_VP8_VAAPI_HWACCEL
+ AV_PIX_FMT_VAAPI,
+#endif
+#if CONFIG_VP8_NVDEC_HWACCEL
+ AV_PIX_FMT_CUDA,
+#endif
+ AV_PIX_FMT_YUV420P,
+ AV_PIX_FMT_NONE,
+ };
+
+ fmt = ff_get_format(s->avctx, pix_fmts);
+ if (fmt < 0) {
+ fmt = AV_PIX_FMT_NONE;
+ av_log(s->avctx, AV_LOG_ERROR,
+ "Can not support the format. \n");
+ }
+
+ return fmt;
+}
+
static av_always_inline
int update_dimensions(VP8Context *s, int width, int height, int is_vp7)
{
@@ -182,6 +206,15 @@ int update_dimensions(VP8Context *s, int width, int height, int is_vp7)
return ret;
}
+ if (!is_vp7) {
+ s->pix_fmt = get_pixel_format(s);
+ if (s->pix_fmt < 0) {
+ ret = AVERROR(EINVAL);
+ return ret;
+ }
+ avctx->pix_fmt = s->pix_fmt;
+ }
+
s->mb_width = (s->avctx->coded_width + 15) / 16;
s->mb_height = (s->avctx->coded_height + 15) / 16;
@@ -2598,18 +2631,7 @@ int vp78_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
if (s->actually_webp) {
// avctx->pix_fmt already set in caller.
} else if (!is_vp7 && s->pix_fmt == AV_PIX_FMT_NONE) {
- enum AVPixelFormat pix_fmts[] = {
-#if CONFIG_VP8_VAAPI_HWACCEL
- AV_PIX_FMT_VAAPI,
-#endif
-#if CONFIG_VP8_NVDEC_HWACCEL
- AV_PIX_FMT_CUDA,
-#endif
- AV_PIX_FMT_YUV420P,
- AV_PIX_FMT_NONE,
- };
-
- s->pix_fmt = ff_get_format(s->avctx, pix_fmts);
+ s->pix_fmt = get_pixel_format(s);
if (s->pix_fmt < 0) {
ret = AVERROR(EINVAL);
goto err;
--
2.14.1
More information about the ffmpeg-devel
mailing list