Mercurial > libavcodec.hg
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;