]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
media: vicodec: improve handling of uncompressable planes
authorHans Verkuil <hans.verkuil@cisco.com>
Tue, 21 Aug 2018 07:09:02 +0000 (03:09 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Fri, 31 Aug 2018 12:27:01 +0000 (08:27 -0400)
Exit the loop immediately once it is clear that the plane
cannot be compressed. Also clear the PCODED bit and fix the
PCODED check (it should check for the bit) in the caller code.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/platform/vicodec/vicodec-codec.c
drivers/media/platform/vicodec/vicodec-core.c

index e402d988f2ada94bfb54de973374c84ef0ce6e73..3547129c1163fba86b76ae5ef6af8152a74dbfab 100644 (file)
@@ -685,9 +685,6 @@ static u32 encode_plane(u8 *input, u8 *refp, __be16 **rlco, __be16 *rlco_max,
                        input += 8 * input_step;
                        refp += 8 * 8;
 
-                       if (encoding & FRAME_UNENCODED)
-                               continue;
-
                        size = rlc(cf->coeffs, *rlco, blocktype);
                        if (last_size == size &&
                            !memcmp(*rlco + 1, *rlco - size + 1, 2 * size - 2)) {
@@ -702,12 +699,16 @@ static u32 encode_plane(u8 *input, u8 *refp, __be16 **rlco, __be16 *rlco_max,
                        } else {
                                *rlco += size;
                        }
-                       if (*rlco >= rlco_max)
+                       if (*rlco >= rlco_max) {
                                encoding |= FRAME_UNENCODED;
+                               goto exit_loop;
+                       }
                        last_size = size;
                }
                input += width * 7 * input_step;
        }
+
+exit_loop:
        if (encoding & FRAME_UNENCODED) {
                u8 *out = (u8 *)rlco_start;
 
@@ -721,6 +722,7 @@ static u32 encode_plane(u8 *input, u8 *refp, __be16 **rlco, __be16 *rlco_max,
                for (i = 0; i < height * width; i++, input += input_step)
                        *out++ = (*input == 0xff) ? 0xfe : *input;
                *rlco = (__be16 *)out;
+               encoding &= ~FRAME_PCODED;
        }
        return encoding;
 }
index 4680b3c9b9b2fd1d1044ef2217ba88bb07b3c705..caff521d94c6a8d64ec89fe53531636a704c786e 100644 (file)
@@ -281,7 +281,7 @@ static void encode(struct vicodec_ctx *ctx,
 
        encoding = encode_frame(&rf, &ctx->ref_frame, &cf, !ctx->gop_cnt,
                                ctx->gop_cnt == ctx->gop_size - 1);
-       if (encoding != FRAME_PCODED)
+       if (!(encoding & FRAME_PCODED))
                ctx->gop_cnt = 0;
        if (++ctx->gop_cnt >= ctx->gop_size)
                ctx->gop_cnt = 0;