aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/adpcm.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-01-24 22:53:59 +0100
committerMichael Niedermayer <michaelni@gmx.at>2012-01-24 22:53:59 +0100
commit1d9569f9e8361c3be06b9732c0b80639a51b4b87 (patch)
tree95f5730b649726856ee2babd9c2bb30f9601f4b6 /libavcodec/adpcm.c
parent76c3e76eb35ce7cca5c912f0d21b736bb0be22fb (diff)
parentefe68076dab56293168ffb66d7b6c1977b740098 (diff)
downloadffmpeg-1d9569f9e8361c3be06b9732c0b80639a51b4b87.tar.gz
Merge remote-tracking branch 'qatar/master'
* qatar/master: (23 commits) aacenc: Fix identification padding when the bitstream is already aligned. aacenc: Write correct length for long identification strings. aud: remove unneeded field, audio_stream_index from context aud: fix time stamp calculation for ADPCM IMA WS aud: simplify header parsing aud: set pts_wrap_bits to 64. cosmetics: indentation aud: support Westwood SND1 audio in AUD files. adpcm_ima_ws: fix stereo decoding avcodec: add a new codec_id for CRYO APC IMA ADPCM. vqa: remove unused context fields, audio_samplerate and audio_bits vqa: clean up audio header parsing vqa: set time base to frame rate as coded in the header. vqa: set packet duration. vqa: use 1/sample_rate as the audio stream time base vqa: set stream start_time to 0. lavc: postpone the removal of AVCodecContext.request_channels. lavf: postpone removing av_close_input_file(). lavc: postpone removing old audio encoding and decoding API avplay: remove the -er option. ... Conflicts: Changelog libavcodec/version.h libavdevice/v4l.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/adpcm.c')
-rw-r--r--libavcodec/adpcm.c37
1 files changed, 34 insertions, 3 deletions
diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
index c176b5e03d..c21753af48 100644
--- a/libavcodec/adpcm.c
+++ b/libavcodec/adpcm.c
@@ -86,6 +86,7 @@ static const int swf_index_tables[4][16] = {
typedef struct ADPCMDecodeContext {
AVFrame frame;
ADPCMChannelStatus status[6];
+ int vqa_version; /**< VQA version. Used for ADPCM_IMA_WS */
} ADPCMDecodeContext;
static av_cold int adpcm_decode_init(AVCodecContext * avctx)
@@ -120,12 +121,16 @@ static av_cold int adpcm_decode_init(AVCodecContext * avctx)
return -1;
}
break;
- case CODEC_ID_ADPCM_IMA_WS:
- if (avctx->extradata && avctx->extradata_size == 2 * 4) {
+ case CODEC_ID_ADPCM_IMA_APC:
+ if (avctx->extradata && avctx->extradata_size >= 8) {
c->status[0].predictor = AV_RL32(avctx->extradata);
c->status[1].predictor = AV_RL32(avctx->extradata + 4);
}
break;
+ case CODEC_ID_ADPCM_IMA_WS:
+ if (avctx->extradata && avctx->extradata_size >= 42)
+ c->vqa_version = AV_RL16(avctx->extradata);
+ break;
default:
break;
}
@@ -362,6 +367,7 @@ static int get_nb_samples(AVCodecContext *avctx, const uint8_t *buf,
break;
/* simple 4-bit adpcm */
case CODEC_ID_ADPCM_CT:
+ case CODEC_ID_ADPCM_IMA_APC:
case CODEC_ID_ADPCM_IMA_EA_SEAD:
case CODEC_ID_ADPCM_IMA_WS:
case CODEC_ID_ADPCM_YAMAHA:
@@ -776,13 +782,37 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
*samples++ = adpcm_ima_expand_nibble(&c->status[st], v2, 3);
}
break;
- case CODEC_ID_ADPCM_IMA_WS:
+ case CODEC_ID_ADPCM_IMA_APC:
while (src < buf + buf_size) {
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_WS:
+ for (channel = 0; channel < avctx->channels; channel++) {
+ const uint8_t *src0;
+ int src_stride;
+ int16_t *smp = samples + channel;
+
+ if (c->vqa_version == 3) {
+ src0 = src + channel * buf_size / 2;
+ src_stride = 1;
+ } else {
+ src0 = src + channel;
+ src_stride = avctx->channels;
+ }
+ for (n = nb_samples / 2; n > 0; n--) {
+ uint8_t v = *src0;
+ src0 += src_stride;
+ *smp = adpcm_ima_expand_nibble(&c->status[channel], v >> 4 , 3);
+ smp += avctx->channels;
+ *smp = adpcm_ima_expand_nibble(&c->status[channel], v & 0x0F, 3);
+ smp += avctx->channels;
+ }
+ }
+ src = buf + buf_size;
+ break;
case CODEC_ID_ADPCM_XA:
while (buf_size >= 128) {
xa_decode(samples, src, &c->status[0], &c->status[1],
@@ -1226,6 +1256,7 @@ ADPCM_DECODER(CODEC_ID_ADPCM_EA_R2, adpcm_ea_r2, "ADPCM Electronic Arts R2");
ADPCM_DECODER(CODEC_ID_ADPCM_EA_R3, adpcm_ea_r3, "ADPCM Electronic Arts R3");
ADPCM_DECODER(CODEC_ID_ADPCM_EA_XAS, adpcm_ea_xas, "ADPCM Electronic Arts XAS");
ADPCM_DECODER(CODEC_ID_ADPCM_IMA_AMV, adpcm_ima_amv, "ADPCM IMA AMV");
+ADPCM_DECODER(CODEC_ID_ADPCM_IMA_APC, adpcm_ima_apc, "ADPCM IMA CRYO APC");
ADPCM_DECODER(CODEC_ID_ADPCM_IMA_DK3, adpcm_ima_dk3, "ADPCM IMA Duck DK3");
ADPCM_DECODER(CODEC_ID_ADPCM_IMA_DK4, adpcm_ima_dk4, "ADPCM IMA Duck DK4");
ADPCM_DECODER(CODEC_ID_ADPCM_IMA_EA_EACS, adpcm_ima_ea_eacs, "ADPCM IMA Electronic Arts EACS");