[FFmpeg-devel] [PATCH] Transpose filter

Michael Niedermayer michaelni
Sun Oct 17 11:07:45 CEST 2010


On Thu, Oct 14, 2010 at 01:29:22PM +0200, Stefano Sabatini wrote:
[...]
> +static void end_frame(AVFilterLink *inlink)
> +{
> +    TransContext *trans = inlink->dst->priv;
> +    AVFilterBufferRef *inpic  = inlink->cur_buf;
> +    AVFilterBufferRef *outpic = inlink->dst->outputs[0]->out_buf;
> +    AVFilterLink *outlink = inlink->dst->outputs[0];
> +    int plane;
> +
> +    for (plane = 0; plane < trans->nb_planes; plane++) {
> +        int hsub = plane == 1 || plane == 2 ? trans->hsub : 0;
> +        int vsub = plane == 1 || plane == 2 ? trans->vsub : 0;
> +        int pixstep = trans->pixsteps[plane];
> +        int inh  = inpic->video->h>>vsub;
> +        int outw = outpic->video->w>>hsub;
> +        int outh = outpic->video->h>>vsub;
> +        uint8_t *out, *in;
> +        int outlinesize, inlinesize;
> +        int x, y;
> +
> +        out = outpic->data[plane]; outlinesize = outpic->linesize[plane];
> +        in  = inpic ->data[plane]; inlinesize  = inpic ->linesize[plane];
> +
> +        if (trans->dir&1) {
> +            in +=  inpic->linesize[plane] * (inh-1);
> +            inlinesize *= -1;
> +        }
> +
> +        if (trans->dir&2) {
> +            out += outpic->linesize[plane] * (outh-1);
> +            outlinesize *= -1;
> +        }
> +
> +        for (y = 0; y < outh; y++) {
> +            for (x = 0; x < outw; x++) {
> +                int32_t v;
> +
> +                switch (pixstep) {
> +                case 1:
> +                    *(out + x) = *(in + x*inlinesize + y);
> +                    break;
> +                case 2:
> +                    *((uint16_t *)(out + 2*x)) = *((uint16_t *)(in + x*inlinesize + y*2));
> +                    break;
> +                case 3:
> +                    v = AV_RB24(in + x*inlinesize + y*3);
> +                    AV_WB24(out + 3*x, v);
> +                    break;
> +                case 4:
> +                    *((uint32_t *)(out + 4*x)) = *((uint32_t *)(in + x*inlinesize + y*4));
> +                    break;
> +                }

please put the for loop inside the switch


[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Opposition brings concord. Out of discord comes the fairest harmony.
-- Heraclitus
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20101017/8193c82d/attachment.pgp>



More information about the ffmpeg-devel mailing list