adpcm: simplify and speed up several ADPCM decoders.

This commit is contained in:
Justin Ruggles 2011-09-08 16:03:44 -04:00
parent 5a9ed7c110
commit de0b586a87
1 changed files with 21 additions and 65 deletions

View File

@ -527,21 +527,9 @@ static int adpcm_decode_frame(AVCodecContext *avctx,
*samples++ = c->status[1].predictor; *samples++ = c->status[1].predictor;
} }
while (src < buf + buf_size) { while (src < buf + buf_size) {
uint8_t v = *src++;
/* take care of the top nibble (always left or mono channel) */ *samples++ = adpcm_ima_expand_nibble(&c->status[0 ], v >> 4 , 3);
*samples++ = adpcm_ima_expand_nibble(&c->status[0], *samples++ = adpcm_ima_expand_nibble(&c->status[st], v & 0x0F, 3);
src[0] >> 4, 3);
/* take care of the bottom nibble, which is right sample for
* stereo, or another mono sample */
if (st)
*samples++ = adpcm_ima_expand_nibble(&c->status[1],
src[0] & 0x0F, 3);
else
*samples++ = adpcm_ima_expand_nibble(&c->status[0],
src[0] & 0x0F, 3);
src++;
} }
break; break;
case CODEC_ID_ADPCM_IMA_DK3: case CODEC_ID_ADPCM_IMA_DK3:
@ -600,39 +588,25 @@ static int adpcm_decode_frame(AVCodecContext *avctx,
} }
while (src < buf + buf_size) { while (src < buf + buf_size) {
uint8_t v1, v2;
uint8_t v = *src++;
/* nibbles are swapped for mono */
if (st) { if (st) {
*samples++ = adpcm_ima_expand_nibble(&c->status[0], v1 = v >> 4;
src[0] >> 4 , 3); v2 = v & 0x0F;
*samples++ = adpcm_ima_expand_nibble(&c->status[1],
src[0] & 0x0F, 3);
} else { } else {
*samples++ = adpcm_ima_expand_nibble(&c->status[0], v2 = v >> 4;
src[0] & 0x0F, 3); v1 = v & 0x0F;
*samples++ = adpcm_ima_expand_nibble(&c->status[0],
src[0] >> 4 , 3);
} }
*samples++ = adpcm_ima_expand_nibble(&c->status[0 ], v1, 3);
src++; *samples++ = adpcm_ima_expand_nibble(&c->status[st], v2, 3);
} }
break; break;
case CODEC_ID_ADPCM_IMA_WS: case CODEC_ID_ADPCM_IMA_WS:
/* no per-block initialization; just start decoding the data */
while (src < buf + buf_size) { while (src < buf + buf_size) {
uint8_t v = *src++;
if (st) { *samples++ = adpcm_ima_expand_nibble(&c->status[0], v >> 4 , 3);
*samples++ = adpcm_ima_expand_nibble(&c->status[0], *samples++ = adpcm_ima_expand_nibble(&c->status[st], v & 0x0F, 3);
src[0] >> 4 , 3);
*samples++ = adpcm_ima_expand_nibble(&c->status[1],
src[0] & 0x0F, 3);
} else {
*samples++ = adpcm_ima_expand_nibble(&c->status[0],
src[0] >> 4 , 3);
*samples++ = adpcm_ima_expand_nibble(&c->status[0],
src[0] & 0x0F, 3);
}
src++;
} }
break; break;
case CODEC_ID_ADPCM_XA: case CODEC_ID_ADPCM_XA:
@ -886,18 +860,9 @@ static int adpcm_decode_frame(AVCodecContext *avctx,
break; break;
case CODEC_ID_ADPCM_CT: case CODEC_ID_ADPCM_CT:
while (src < buf + buf_size) { while (src < buf + buf_size) {
if (st) { uint8_t v = *src++;
*samples++ = adpcm_ct_expand_nibble(&c->status[0], *samples++ = adpcm_ct_expand_nibble(&c->status[0 ], v >> 4 );
src[0] >> 4); *samples++ = adpcm_ct_expand_nibble(&c->status[st], v & 0x0F);
*samples++ = adpcm_ct_expand_nibble(&c->status[1],
src[0] & 0x0F);
} else {
*samples++ = adpcm_ct_expand_nibble(&c->status[0],
src[0] >> 4);
*samples++ = adpcm_ct_expand_nibble(&c->status[0],
src[0] & 0x0F);
}
src++;
} }
break; break;
case CODEC_ID_ADPCM_SBPRO_4: case CODEC_ID_ADPCM_SBPRO_4:
@ -1005,18 +970,9 @@ static int adpcm_decode_frame(AVCodecContext *avctx,
} }
case CODEC_ID_ADPCM_YAMAHA: case CODEC_ID_ADPCM_YAMAHA:
while (src < buf + buf_size) { while (src < buf + buf_size) {
if (st) { uint8_t v = *src++;
*samples++ = adpcm_yamaha_expand_nibble(&c->status[0], *samples++ = adpcm_yamaha_expand_nibble(&c->status[0 ], v & 0x0F);
src[0] & 0x0F); *samples++ = adpcm_yamaha_expand_nibble(&c->status[st], v >> 4 );
*samples++ = adpcm_yamaha_expand_nibble(&c->status[1],
src[0] >> 4 );
} else {
*samples++ = adpcm_yamaha_expand_nibble(&c->status[0],
src[0] & 0x0F);
*samples++ = adpcm_yamaha_expand_nibble(&c->status[0],
src[0] >> 4 );
}
src++;
} }
break; break;
case CODEC_ID_ADPCM_THP: case CODEC_ID_ADPCM_THP: