[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