[PATCH 15/18] avcodec/h264dec: refuse multiview with hardware acceleration

Dom Cobley via ffmpeg-devel <[email protected]>
Newsgroups gmane.comp.video.ffmpeg.devel
Message-ID <[email protected]>
No h264 hwaccel knows about views. They all build the accelerator's
picture list from short_ref and long_ref and skip pictures whose
H264Picture.reference is 0 -- see fill_vaapi_ReferenceFrames() and its
equivalents in the vdpau, dxva2, nvdec and vulkan code.

An inter-view reference is in neither list, and reference == 0 is normal
for it, because inter_view_flag makes a picture available for inter-view
prediction independently of whether it is a temporal reference. The
per-slice reference list is filled from sl->ref_list[] regardless, so a
dependent view slice would name a surface the accelerator was never
given.

Decode the base view only and log a warning, rather than submit that.

Signed-off-by: Dom Cobley <[email protected]>
---
 libavcodec/h264_slice.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c
index 3217e43205..81c275f9c8 100644
--- a/libavcodec/h264_slice.c
+++ b/libavcodec/h264_slice.c
@@ -994,6 +994,19 @@ static int setup_multiview(H264Context *h, const SPS *mvc_sps)
         return AVERROR_BUG;
     }
 
+    /* No hwaccel knows about views. They all build the accelerator's picture
+     * list from short_ref/long_ref, skipping anything with reference == 0, while
+     * an inter-view reference lives in sl->ref_list[] alone and need not be a
+     * temporal reference at all. A dependent view slice would therefore point at
+     * a surface the accelerator was never told about. Decode the base view only
+     * rather than submit that. */
+    if (views_active_output != 1 && h->avctx->hwaccel) {
+        av_log(h->avctx, AV_LOG_WARNING,
+               "Multiview decoding is not supported with hardware acceleration; "
+               "decoding the base view only.\n");
+        return 0;
+    }
+
     highest_view = av_log2(views_active_output);
     if (highest_view >= H264_MAX_MVC_VIEWS) {
         av_log(h->avctx, AV_LOG_ERROR, "Too many views requested: %x\n",
-- 
2.53.0

_______________________________________________
ffmpeg-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.