From d64b88d440bcd2121bce8e7b15505396f0f1d118 Mon Sep 17 00:00:00 2001 From: Benjamin Larsson Date: Wed, 11 Apr 2007 13:10:13 +0000 Subject: Per reference swf/flv adpcm encoder. Originally committed as revision 8713 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/adpcm.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'libavcodec/adpcm.c') diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c index 57281d137a..05cca3f43a 100644 --- a/libavcodec/adpcm.c +++ b/libavcodec/adpcm.c @@ -182,6 +182,9 @@ static int adpcm_encode_init(AVCodecContext *avctx) avctx->frame_size = BLKSIZE * avctx->channels; avctx->block_align = BLKSIZE; break; + case CODEC_ID_ADPCM_SWF: + avctx->frame_size = 4*BLKSIZE * avctx->channels; + break; default: return -1; break; @@ -513,6 +516,31 @@ static int adpcm_encode_frame(AVCodecContext *avctx, samples += 8 * avctx->channels; } break; + case CODEC_ID_ADPCM_SWF: + { + int i; + PutBitContext pb; + init_put_bits(&pb, dst, buf_size*8); + + //Store AdpcmCodeSize + put_bits(&pb, 2, 2); //Set 4bits flash adpcm format + + //Init the encoder state + for(i=0; ichannels; i++){ + put_bits(&pb, 16, samples[i] & 0xFFFF); + put_bits(&pb, 6, c->status[i].step_index & 0x3F); + c->status[i].prev_sample = (signed short)samples[i]; + } + + for (i=0 ; i<4096 ; i++) { + put_bits(&pb, 4, adpcm_ima_compress_sample(&c->status[0], samples[avctx->channels*i]) & 0xF); + if (avctx->channels == 2) + put_bits(&pb, 4, adpcm_ima_compress_sample(&c->status[1], samples[2*i+1]) & 0xF); + } + + dst += (3 + 2048) * avctx->channels; + break; + } case CODEC_ID_ADPCM_MS: for(i=0; ichannels; i++){ int predictor=0; -- cgit v1.2.1