summaryrefslogtreecommitdiff
path: root/libavcodec/adpcm.c
diff options
context:
space:
mode:
authorBenjamin Larsson <banan@ludd.ltu.se>2007-04-11 13:10:13 +0000
committerBenjamin Larsson <banan@ludd.ltu.se>2007-04-11 13:10:13 +0000
commitd64b88d440bcd2121bce8e7b15505396f0f1d118 (patch)
treeb698e5bb0f9947e1368d3f209f680de93e709830 /libavcodec/adpcm.c
parent3011c6f62e3cd670601f6f70b75dc177dc9a6ffb (diff)
Per reference swf/flv adpcm encoder.
Originally committed as revision 8713 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/adpcm.c')
-rw-r--r--libavcodec/adpcm.c28
1 files changed, 28 insertions, 0 deletions
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; i<avctx->channels; 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; i<avctx->channels; i++){
int predictor=0;