[FFmpeg-devel] rmdec.c: add SIPR codec try #2

Reimar Döffinger Reimar.Doeffinger
Tue Mar 17 17:56:41 CET 2009


On Tue, Mar 17, 2009 at 09:29:39AM -0400, Ronald S. Bultje wrote:
> +                for (n = 0; n < 38; n++) {
> +                    int j;
> +                    int i = bs * sipr_swaps[n][0];
> +                    int o = bs * sipr_swaps[n][1];
> +                    uint8_t *buf = ast->pkt.data;
> +
> +                    /* swap 4bit-nibbles of block 'i' with 'o' */
> +                    for (j = 0; j < bs; j++, i++, o++) {
> +                        int x = (buf[i >> 1] >> (4 * (i & 1))) & 0xF,
> +                            y = (buf[o >> 1] >> (4 * (o & 1))) & 0xF;
> +
> +                        buf[o >> 1] = (x << (4 * (o & 1))) |
> +                            (buf[o >> 1] & (0xF << (4 * !(o & 1))));
> +                        buf[i >> 1] = (y << (4 * (i & 1))) |
> +                            (buf[i >> 1] & (0xF << (4 * !(i & 1))));
> +                    }
> +                }
> +            }

Better make it an extra inline function I guess, but something like this might
do better, note that the outer if can be placed outside the loop, etc

if (!(i ^ o) & 1) {
  // both upper or both lower nibble
  int mask = 0xf << 4 * (i & 1);
  buf[i >> 1] ^= buf[o >> 1] & mask;
  buf[o >> 1] ^= buf[i >> 1] & mask;
  buf[i >> 1] ^= buf[o >> 1] & mask;
} else {
  if (o & 1) FFSWAP(int, i, o);
  // make sure i is the one we need the upper nibble from
  buf[i >> 1] ^= buf[o >> 1] << 4;
  buf[o >> 1] ^= buf[i >> 1] >> 4;
  buf[i >> 1] ^= buf[o >> 1] << 4;
}




More information about the ffmpeg-devel mailing list