[FFmpeg-devel] [PATCH] avcodec/tiff: Try to fix subsampling default

Michael Niedermayer michael at niedermayer.cc
Thu Sep 26 10:06:28 EEST 2019


This ensures the default ycbcr_subsampling is 2 while also
ensuring the subsampling values are correct for all pixel formats.
This solution while it takes a few lines more code should be more
robust

Found-by: Skakov Pavel <pavelsx at gmail.com>
Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>
---
 libavcodec/tiff.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/libavcodec/tiff.c b/libavcodec/tiff.c
index 9f24796a88..13a38bd64f 100644
--- a/libavcodec/tiff.c
+++ b/libavcodec/tiff.c
@@ -74,6 +74,7 @@ typedef struct TiffContext {
     enum TiffPhotometric photometric;
     int planar;
     int subsampling[2];
+    int ycbcr_subsampling[2];
     int fax_opts;
     int predictor;
     int fill_order;
@@ -1101,6 +1102,8 @@ static int init_image(TiffContext *s, ThreadFrame *frame)
         break;
     case 243:
         if (s->photometric == TIFF_PHOTOMETRIC_YCBCR) {
+            s->subsampling[0] = s->ycbcr_subsampling[0];
+            s->subsampling[1] = s->ycbcr_subsampling[1];
             if (s->subsampling[0] == 1 && s->subsampling[1] == 1) {
                 s->avctx->pix_fmt = AV_PIX_FMT_YUV444P;
             } else if (s->subsampling[0] == 2 && s->subsampling[1] == 1) {
@@ -1511,10 +1514,10 @@ static int tiff_decode_tag(TiffContext *s, AVFrame *frame)
             return AVERROR_INVALIDDATA;
         }
         for (i = 0; i < count; i++) {
-            s->subsampling[i] = ff_tget(&s->gb, type, s->le);
-            if (s->subsampling[i] <= 0) {
-                av_log(s->avctx, AV_LOG_ERROR, "subsampling %d is invalid\n", s->subsampling[i]);
-                s->subsampling[i] = 1;
+            s->ycbcr_subsampling[i] = ff_tget(&s->gb, type, s->le);
+            if (s->ycbcr_subsampling[i] <= 0) {
+                av_log(s->avctx, AV_LOG_ERROR, "subsampling %d is invalid\n", s->ycbcr_subsampling[i]);
+                s->ycbcr_subsampling[i] = 1;
                 return AVERROR_INVALIDDATA;
             }
         }
@@ -2066,6 +2069,8 @@ static av_cold int tiff_init(AVCodecContext *avctx)
     s->height = 0;
     s->subsampling[0] =
     s->subsampling[1] = 1;
+    s->ycbcr_subsampling[0] = 2;
+    s->ycbcr_subsampling[1] = 2;
     s->avctx  = avctx;
     ff_lzw_decode_open(&s->lzw);
     if (!s->lzw)
-- 
2.23.0



More information about the ffmpeg-devel mailing list