[media] vivid: Fix YUV555 and YUV565 handling
authorRicardo Ribalda Delgado <[email protected]>
Sat, 16 Jul 2016 09:26:23 +0000 (06:26 -0300)
committerMauro Carvalho Chehab <[email protected]>
Fri, 21 Oct 2016 17:50:58 +0000 (15:50 -0200)
precalculate_color() had a optimization that avoided duplicated
conversion for YUV formats. This optimization did not take into
consideration YUV444, YUV555, YUV565 or limited range quantization.

This patch keeps the optimization, but fixes the wrong handling.

Signed-off-by: Ricardo Ribalda Delgado <[email protected]>
Acked-by: Hans Verkuil <[email protected]>
Signed-off-by: Mauro Carvalho Chehab <[email protected]>
drivers/media/common/v4l2-tpg/v4l2-tpg-core.c

index 920c8495f3dd4e4a1d4223f7056e5544bfb1982f..7364ced09abc058f733545ce173217b1cb5dd005 100644 (file)
@@ -795,6 +795,8 @@ static void precalculate_color(struct tpg_data *tpg, int k)
        int r = tpg_colors[col].r;
        int g = tpg_colors[col].g;
        int b = tpg_colors[col].b;
+       int y, cb, cr;
+       bool ycbcr_valid = false;
 
        if (k == TPG_COLOR_TEXTBG) {
                col = tpg_get_textbg_color(tpg);
@@ -871,7 +873,6 @@ static void precalculate_color(struct tpg_data *tpg, int k)
             tpg->saturation != 128 || tpg->hue) &&
            tpg->color_enc != TGP_COLOR_ENC_LUMA) {
                /* Implement these operations */
-               int y, cb, cr;
                int tmp_cb, tmp_cr;
 
                /* First convert to YCbCr */
@@ -888,13 +889,10 @@ static void precalculate_color(struct tpg_data *tpg, int k)
 
                cb = (128 << 4) + (tmp_cb * tpg->contrast * tpg->saturation) / (128 * 128);
                cr = (128 << 4) + (tmp_cr * tpg->contrast * tpg->saturation) / (128 * 128);
-               if (tpg->color_enc == TGP_COLOR_ENC_YCBCR) {
-                       tpg->colors[k][0] = clamp(y >> 4, 1, 254);
-                       tpg->colors[k][1] = clamp(cb >> 4, 1, 254);
-                       tpg->colors[k][2] = clamp(cr >> 4, 1, 254);
-                       return;
-               }
-               ycbcr_to_color(tpg, y, cb, cr, &r, &g, &b);
+               if (tpg->color_enc == TGP_COLOR_ENC_YCBCR)
+                       ycbcr_valid = true;
+               else
+                       ycbcr_to_color(tpg, y, cb, cr, &r, &g, &b);
        } else if ((tpg->brightness != 128 || tpg->contrast != 128) &&
                   tpg->color_enc == TGP_COLOR_ENC_LUMA) {
                r = (16 << 4) + ((r - (16 << 4)) * tpg->contrast) / 128;
@@ -915,9 +913,8 @@ static void precalculate_color(struct tpg_data *tpg, int k)
        case TGP_COLOR_ENC_YCBCR:
        {
                /* Convert to YCbCr */
-               int y, cb, cr;
-
-               color_to_ycbcr(tpg, r, g, b, &y, &cb, &cr);
+               if (!ycbcr_valid)
+                       color_to_ycbcr(tpg, r, g, b, &y, &cb, &cr);
 
                if (tpg->real_quantization == V4L2_QUANTIZATION_LIM_RANGE) {
                        y = clamp(y, 16 << 4, 235 << 4);