nodes[0]->step = c->step_index;
nodes[0]->sample1 = c->sample1;
nodes[0]->sample2 = c->sample2;
- if(version == CODEC_ID_ADPCM_IMA_WAV)
+ if((version == CODEC_ID_ADPCM_IMA_WAV) || (version == CODEC_ID_ADPCM_SWF))
nodes[0]->sample1 = c->prev_sample;
if(version == CODEC_ID_ADPCM_MS)
nodes[0]->step = c->idelta;
next_##NAME:;
STORE_NODE(ms, FFMAX(16, (AdaptationTable[nibble] * step) >> 8));
}
- } else if(version == CODEC_ID_ADPCM_IMA_WAV) {
+ } else if((version == CODEC_ID_ADPCM_IMA_WAV)|| (version == CODEC_ID_ADPCM_SWF)) {
#define LOOP_NODES(NAME, STEP_TABLE, STEP_INDEX)\
const int predictor = nodes[j]->sample1;\
const int div = (sample - predictor) * 4 / STEP_TABLE;\
PutBitContext pb;
init_put_bits(&pb, dst, buf_size*8);
+ n = avctx->frame_size-1;
+
//Store AdpcmCodeSize
put_bits(&pb, 2, 2); //Set 4bits flash adpcm format
c->status[i].prev_sample = (signed short)samples[i];
}
- for (i=1; i<avctx->frame_size; i++) {
- put_bits(&pb, 4, adpcm_ima_compress_sample(&c->status[0], samples[avctx->channels*i]) & 0xF);
+ if(avctx->trellis > 0) {
+ uint8_t buf[2][n];
+ adpcm_compress_trellis(avctx, samples+2, buf[0], &c->status[0], n);
if (avctx->channels == 2)
- put_bits(&pb, 4, adpcm_ima_compress_sample(&c->status[1], samples[2*i+1]) & 0xF);
+ adpcm_compress_trellis(avctx, samples+3, buf[1], &c->status[1], n);
+ for(i=0; i<n; i++) {
+ put_bits(&pb, 4, buf[0][i]);
+ if (avctx->channels == 2)
+ put_bits(&pb, 4, buf[1][i]);
+ }
+ } else {
+ for (i=1; i<avctx->frame_size; 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);
+ }
}
flush_put_bits(&pb);
dst += put_bits_count(&pb)>>3;
c->predictor = av_clip_int16(c->predictor);
/* calculate new step and clamp it to range 511..32767 */
new_step = (ct_adpcm_table[nibble & 7] * c->step) >> 8;
- c->step = new_step;
- if(c->step < 511)
- c->step = 511;
- if(c->step > 32767)
- c->step = 32767;
+ c->step = av_clip(new_step, 511, 32767);
return (short)c->predictor;
}
delta = nibble & ((1<<(size-1))-1);
diff = delta << (7 + c->step + shift);
- if (sign)
- c->predictor -= diff;
- else
- c->predictor += diff;
-
/* clamp result */
- if (c->predictor > 16256)
- c->predictor = 16256;
- else if (c->predictor < -16384)
- c->predictor = -16384;
+ c->predictor = av_clip(c->predictor + (sign ? -diff : diff), -16384,16256);
/* calculate new step */
if (delta >= (2*size - 3) && c->step < 3)