[FFmpeg-devel] [PATCH 3/3] cllc: Implement ARGB support

Reimar Döffinger Reimar.Doeffinger at gmx.de
Sat Aug 11 14:41:54 CEST 2012


On Fri, Aug 10, 2012 at 01:07:11PM -0400, Derek Buitenhuis wrote:
> +        pred[0] += code;
> +        dst[0]   = pred[0];
> +
> +        /* Skip the components if they are  entirely transparent */
> +        if (dst[0]) {
> +            /* Red */
> +            UPDATE_CACHE(bits, gb);
> +            GET_VLC(code, bits, gb, vlc[1].table, 7, 2);
> +
> +            pred[1] += code;
> +            dst[1]   = pred[1];
> +
> +            /* Green */
> +            UPDATE_CACHE(bits, gb);
> +            GET_VLC(code, bits, gb, vlc[2].table, 7, 2);
> +
> +            pred[2] += code;
> +            dst[2]   = pred[2];
> +
> +            /* Blue */
> +            UPDATE_CACHE(bits, gb);
> +            GET_VLC(code, bits, gb, vlc[3].table, 7, 2);
> +
> +            pred[3] += code;
> +            dst[3]   = pred[3];
> +        } else {
> +            dst[1] = 0;
> +            dst[2] = 0;
> +            dst[3] = 0;

Those writes are not optimal.
You could use
AV_COPY32(dst, pred);
and
AV_ZERO(dst);
respectively.
However I admit the AV_COPY might needlessly make gcc write the data
out to stack...

> +    top_left[0]  = dst[0];
> +    
> +    /* Only stash components if they are not transparent */
> +    if (top_left[0]) {
> +        top_left[1] = dst[1];
> +        top_left[2] = dst[2];
> +        top_left[3] = dst[3];
> +    }

AV_COPY might make sense here as well:
if (dst[0]) AV_COPY32(top_left, dst);
else top_left[0] = 0;


More information about the ffmpeg-devel mailing list