[FFmpeg-devel] [PATCH] X-Face image encoder and decoder

Clément Bœsch ubitux at gmail.com
Sun Oct 14 01:46:39 CEST 2012


On Sun, Oct 14, 2012 at 01:30:33AM +0200, Stefano Sabatini wrote:
[...]
> > > +            return AVERROR(EINVAL);
> > > +        }
> > > +    }
> > > +    avctx->width  = XFACE_WIDTH;
> > > +    avctx->height = XFACE_HEIGHT;
> > > +
> > > +    /* convert image from MONOWHITE to 1=black 0=white bitmap */
> > > +    buf = frame->data[0];
> > > +    for (i = 0, j = 0; i < XFACE_PIXELS; ) {
> > > +        for (k = 0; k < 8; k++)
> > > +            xface->bitmap[i++] = !!((1<<(7-k)) & buf[j]);
> > 
> > Wouldn't it be faster/simpler to do something like (untested):
> > 
> >   xface->bitmap[i++] = buf[j]>>(7-k) & 1;
> > 
> > ?
> 
> changed to:
>     xface->bitmap[i++] = !!(buf[j] & (0x80>>k));
> 
> which I consider a bit more intelligible (and consistent with what I
> did in xface.c).
> 

FYI, it seems your original code and my proposal outputs the same assembler
with gcc (-O2), but your proposition adds a test:

uint8_t f1(uint8_t b, int k) { return !!((1<<(7-k)) & b); }
uint8_t f2(uint8_t b, int k) { return b>>(7-k) & 1;       }
uint8_t f3(uint8_t b, int k) { return !!(b & 0x80>>k);    }


0000000000000000 <f1>:
   0:   b9 07 00 00 00          mov    ecx,0x7
   5:   40 0f b6 c7             movzx  eax,dil
   9:   29 f1                   sub    ecx,esi
   b:   d3 f8                   sar    eax,cl
   d:   83 e0 01                and    eax,0x1
  10:   c3                      ret    

0000000000000020 <f2>:
  20:   b9 07 00 00 00          mov    ecx,0x7
  25:   40 0f b6 c7             movzx  eax,dil
  29:   29 f1                   sub    ecx,esi
  2b:   d3 f8                   sar    eax,cl
  2d:   83 e0 01                and    eax,0x1
  30:   c3                      ret    

0000000000000040 <f3>:
  40:   89 f1                   mov    ecx,esi
  42:   b8 80 00 00 00          mov    eax,0x80
  47:   40 0f b6 ff             movzx  edi,dil
  4b:   d3 f8                   sar    eax,cl
  4d:   85 f8                   test   eax,edi
  4f:   0f 95 c0                setne  al
  52:   c3                      ret    

(I'm not trying to argue about any solution, just found that funny)

Ah and BTW, I think you can make buf const.

[...]

-- 
Clément B.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 490 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20121014/dcb8d60d/attachment.asc>


More information about the ffmpeg-devel mailing list