[vlc-commits] codec: avcodec: fix chroma compare

Zhao Zhili git at videolan.org
Mon Jul 23 10:30:48 CEST 2018


vlc | branch: master | Zhao Zhili <quinkblack at foxmail.com> | Tue Jul 17 19:27:01 2018 +0800| [3b83d151cfbec2762c275f195cabc5c140632e19] | committer: Thomas Guillem

codec: avcodec: fix chroma compare

Due to d3c6ad0b, pictures may have different chroma. All frames are
dropped.

Signed-off-by: Thomas Guillem <thomas at gllm.fr>

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=3b83d151cfbec2762c275f195cabc5c140632e19
---

 modules/codec/avcodec/video.c | 22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/modules/codec/avcodec/video.c b/modules/codec/avcodec/video.c
index 375b9d1b33..ba51a42961 100644
--- a/modules/codec/avcodec/video.c
+++ b/modules/codec/avcodec/video.c
@@ -369,6 +369,26 @@ static int lavc_UpdateVideoFormat(decoder_t *dec, AVCodecContext *ctx,
     return decoder_UpdateVideoFormat(dec);
 }
 
+static bool chroma_compatible(vlc_fourcc_t a, vlc_fourcc_t b)
+{
+    static const vlc_fourcc_t compat_lists[][2] = {
+        {VLC_CODEC_J420, VLC_CODEC_I420},
+        {VLC_CODEC_J422, VLC_CODEC_I422},
+        {VLC_CODEC_J440, VLC_CODEC_I440},
+        {VLC_CODEC_J444, VLC_CODEC_I444},
+    };
+
+    if (a == b)
+        return true;
+
+    for (size_t i = 0; i < ARRAY_SIZE(compat_lists); i++) {
+        if ((a == compat_lists[i][0] || a == compat_lists[i][1]) &&
+            (b == compat_lists[i][0] || b == compat_lists[i][1]))
+            return true;
+    }
+    return false;
+}
+
 /**
  * Copies a picture from the libavcodec-allocate buffer to a picture_t.
  * This is used when not in direct rendering mode.
@@ -385,7 +405,7 @@ static int lavc_CopyPicture(decoder_t *dec, picture_t *pic, AVFrame *frame)
         msg_Err(dec, "Unsupported decoded output format %d (%s)",
                 sys->p_context->pix_fmt, (name != NULL) ? name : "unknown");
         return VLC_EGENERIC;
-    } else if (fourcc != pic->format.i_chroma
+    } else if (!chroma_compatible(fourcc, pic->format.i_chroma)
      || frame->width > (int) pic->format.i_width
      || frame->height > (int) pic->format.i_height)
     {



More information about the vlc-commits mailing list