changeset 4840:a743c46500d4 libavcodec

Per reference swf/flv adpcm encoder.
author banan
date Wed, 11 Apr 2007 13:10:13 +0000
parents 1a5c08c07cfb
children 861ff463ac61
files adpcm.c
diffstat 1 files changed, 28 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/adpcm.c	Wed Apr 11 06:59:09 2007 +0000
+++ b/adpcm.c	Wed Apr 11 13:10:13 2007 +0000
@@ -182,6 +182,9 @@
         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 @@
                 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;