Browse code

pgssubdec: fix subpicture output colorspace and range

Functionality used before didn't widen the values from limited to
full range. Additionally, now the decoder uses BT.709 where it
should be used according to the video resolution.

Default for not yet set colorimetry is BT.709 due to most observed
HDMV content being HD.

BT.709 coefficients were gathered from the first two parts of BT.709
to BT.2020 conversion guide in ARIB STD-B62 (Pt. 1, Chapter 6.2.2).
They were additionally confirmed by manually calculating values.

Fixes #4637
(cherry picked from commit 9779b6262471d553c1ed811ff7312564e39d8adf)

Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>

Jan Ekström authored on 2016/04/24 23:30:56
Showing 2 changed files
... ...
@@ -354,8 +354,14 @@ static int parse_palette_segment(AVCodecContext *avctx,
354 354
         cb        = bytestream_get_byte(&buf);
355 355
         alpha     = bytestream_get_byte(&buf);
356 356
 
357
-        YUV_TO_RGB1(cb, cr);
358
-        YUV_TO_RGB2(r, g, b, y);
357
+        /* Default to BT.709 colorimetry. In case of <= 576 height use BT.601 */
358
+        if (avctx->height <= 0 || avctx->height > 576) {
359
+            YUV_TO_RGB1_CCIR_BT709(cb, cr);
360
+        } else {
361
+            YUV_TO_RGB1_CCIR(cb, cr);
362
+        }
363
+
364
+        YUV_TO_RGB2_CCIR(r, g, b, y);
359 365
 
360 366
         ff_dlog(avctx, "Color %d := (%d,%d,%d,%d)\n", color_id, r, g, b, alpha);
361 367
 
... ...
@@ -41,6 +41,16 @@
41 41
     b_add = FIX(1.77200*255.0/224.0) * cb + ONE_HALF;\
42 42
 }
43 43
 
44
+#define YUV_TO_RGB1_CCIR_BT709(cb1, cr1)\
45
+{\
46
+    cb = (cb1) - 128;\
47
+    cr = (cr1) - 128;\
48
+    r_add = FIX(1.5747*255.0/224.0) * cr + ONE_HALF;\
49
+    g_add = - FIX(0.1873*255.0/224.0) * cb - FIX(0.4682*255.0/224.0) * cr + \
50
+            ONE_HALF;\
51
+    b_add = FIX(1.8556*255.0/224.0) * cb + ONE_HALF;\
52
+}
53
+
44 54
 #define YUV_TO_RGB2_CCIR(r, g, b, y1)\
45 55
 {\
46 56
     y = ((y1) - 16) * FIX(255.0/219.0);\