summaryrefslogtreecommitdiff
path: root/libavcodec/adpcm.c
diff options
context:
space:
mode:
authorJustin Ruggles <justin.ruggles@gmail.com>2011-09-08 16:03:44 -0400
committerJustin Ruggles <justin.ruggles@gmail.com>2011-09-29 16:54:00 -0400
commitde0b586a87c510685bd9a32ca832007c422d7cd8 (patch)
treeafe94ad819a68c5caddedc47cc70cb916de596f3 /libavcodec/adpcm.c
parent5a9ed7c110d78ddcced94525b5181a2463dc009f (diff)
adpcm: simplify and speed up several ADPCM decoders.
Diffstat (limited to 'libavcodec/adpcm.c')
-rw-r--r--libavcodec/adpcm.c86
1 files changed, 21 insertions, 65 deletions
diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
index 25432f6160..c6b0aaa399 100644
--- a/libavcodec/adpcm.c
+++ b/libavcodec/adpcm.c
@@ -527,21 +527,9 @@ static int adpcm_decode_frame(AVCodecContext *avctx,
*samples++ = c->status[1].predictor;
}
while (src < buf + buf_size) {
-
- /* take care of the top nibble (always left or mono channel) */
- *samples++ = adpcm_ima_expand_nibble(&c->status[0],
- 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++;
+ uint8_t v = *src++;
+ *samples++ = adpcm_ima_expand_nibble(&c->status[0 ], v >> 4 , 3);
+ *samples++ = adpcm_ima_expand_nibble(&c->status[st], v & 0x0F, 3);
}
break;
case CODEC_ID_ADPCM_IMA_DK3:
@@ -600,39 +588,25 @@ static int adpcm_decode_frame(AVCodecContext *avctx,
}
while (src < buf + buf_size) {
-
+ uint8_t v1, v2;
+ uint8_t v = *src++;
+ /* nibbles are swapped for mono */
if (st) {
- *samples++ = adpcm_ima_expand_nibble(&c->status[0],
- src[0] >> 4 , 3);
- *samples++ = adpcm_ima_expand_nibble(&c->status[1],
- src[0] & 0x0F, 3);
+ v1 = v >> 4;
+ v2 = v & 0x0F;
} else {
- *samples++ = adpcm_ima_expand_nibble(&c->status[0],
- src[0] & 0x0F, 3);
- *samples++ = adpcm_ima_expand_nibble(&c->status[0],
- src[0] >> 4 , 3);
+ v2 = v >> 4;
+ v1 = v & 0x0F;
}
-
- src++;
+ *samples++ = adpcm_ima_expand_nibble(&c->status[0 ], v1, 3);
+ *samples++ = adpcm_ima_expand_nibble(&c->status[st], v2, 3);
}
break;
case CODEC_ID_ADPCM_IMA_WS:
- /* no per-block initialization; just start decoding the data */
while (src < buf + buf_size) {
-
- if (st) {
- *samples++ = adpcm_ima_expand_nibble(&c->status[0],
- 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++;
+ uint8_t v = *src++;
+ *samples++ = adpcm_ima_expand_nibble(&c->status[0], v >> 4 , 3);
+ *samples++ = adpcm_ima_expand_nibble(&c->status[st], v & 0x0F, 3);
}
break;
case CODEC_ID_ADPCM_XA:
@@ -886,18 +860,9 @@ static int adpcm_decode_frame(AVCodecContext *avctx,
break;
case CODEC_ID_ADPCM_CT:
while (src < buf + buf_size) {
- if (st) {
- *samples++ = adpcm_ct_expand_nibble(&c->status[0],
- src[0] >> 4);
- *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++;
+ uint8_t v = *src++;
+ *samples++ = adpcm_ct_expand_nibble(&c->status[0 ], v >> 4 );
+ *samples++ = adpcm_ct_expand_nibble(&c->status[st], v & 0x0F);
}
break;
case CODEC_ID_ADPCM_SBPRO_4:
@@ -1005,18 +970,9 @@ static int adpcm_decode_frame(AVCodecContext *avctx,
}
case CODEC_ID_ADPCM_YAMAHA:
while (src < buf + buf_size) {
- if (st) {
- *samples++ = adpcm_yamaha_expand_nibble(&c->status[0],
- src[0] & 0x0F);
- *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++;
+ uint8_t v = *src++;
+ *samples++ = adpcm_yamaha_expand_nibble(&c->status[0 ], v & 0x0F);
+ *samples++ = adpcm_yamaha_expand_nibble(&c->status[st], v >> 4 );
}
break;
case CODEC_ID_ADPCM_THP: