diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-01-24 22:53:59 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-01-24 22:53:59 +0100 |
commit | 1d9569f9e8361c3be06b9732c0b80639a51b4b87 (patch) | |
tree | 95f5730b649726856ee2babd9c2bb30f9601f4b6 /libavcodec/adpcm.c | |
parent | 76c3e76eb35ce7cca5c912f0d21b736bb0be22fb (diff) | |
parent | efe68076dab56293168ffb66d7b6c1977b740098 (diff) | |
download | ffmpeg-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.c | 37 |
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"); |