| @@ -284,116 +284,116 @@ static int tta_decode_frame(AVCodecContext *avctx, | |||
| init_get_bits(&s->gb, buf, buf_size*8); | |||
| // FIXME: seeking | |||
| s->total_frames--; | |||
| if (!s->total_frames && s->last_frame_length) | |||
| framelen = s->last_frame_length; | |||
| // FIXME: seeking | |||
| s->total_frames--; | |||
| if (!s->total_frames && s->last_frame_length) | |||
| framelen = s->last_frame_length; | |||
| if (*data_size < (framelen * s->channels * 2)) { | |||
| av_log(avctx, AV_LOG_ERROR, "Output buffer size is too small.\n"); | |||
| return -1; | |||
| } | |||
| if (*data_size < (framelen * s->channels * 2)) { | |||
| av_log(avctx, AV_LOG_ERROR, "Output buffer size is too small.\n"); | |||
| return -1; | |||
| } | |||
| // init per channel states | |||
| for (i = 0; i < s->channels; i++) { | |||
| s->ch_ctx[i].predictor = 0; | |||
| ttafilter_init(&s->ch_ctx[i].filter, ttafilter_configs[s->bps-1][0], ttafilter_configs[s->bps-1][1]); | |||
| rice_init(&s->ch_ctx[i].rice, 10, 10); | |||
| } | |||
| // init per channel states | |||
| for (i = 0; i < s->channels; i++) { | |||
| s->ch_ctx[i].predictor = 0; | |||
| ttafilter_init(&s->ch_ctx[i].filter, ttafilter_configs[s->bps-1][0], ttafilter_configs[s->bps-1][1]); | |||
| rice_init(&s->ch_ctx[i].rice, 10, 10); | |||
| for (p = s->decode_buffer; p < s->decode_buffer + (framelen * s->channels); p++) { | |||
| int32_t *predictor = &s->ch_ctx[cur_chan].predictor; | |||
| TTAFilter *filter = &s->ch_ctx[cur_chan].filter; | |||
| TTARice *rice = &s->ch_ctx[cur_chan].rice; | |||
| uint32_t unary, depth, k; | |||
| int32_t value; | |||
| unary = tta_get_unary(&s->gb); | |||
| if (unary == 0) { | |||
| depth = 0; | |||
| k = rice->k0; | |||
| } else { | |||
| depth = 1; | |||
| k = rice->k1; | |||
| unary--; | |||
| } | |||
| for (p = s->decode_buffer; p < s->decode_buffer + (framelen * s->channels); p++) { | |||
| int32_t *predictor = &s->ch_ctx[cur_chan].predictor; | |||
| TTAFilter *filter = &s->ch_ctx[cur_chan].filter; | |||
| TTARice *rice = &s->ch_ctx[cur_chan].rice; | |||
| uint32_t unary, depth, k; | |||
| int32_t value; | |||
| unary = tta_get_unary(&s->gb); | |||
| if (unary == 0) { | |||
| depth = 0; | |||
| k = rice->k0; | |||
| } else { | |||
| depth = 1; | |||
| k = rice->k1; | |||
| unary--; | |||
| } | |||
| if (get_bits_left(&s->gb) < k) | |||
| return -1; | |||
| if (get_bits_left(&s->gb) < k) | |||
| if (k) { | |||
| if (k > MIN_CACHE_BITS) | |||
| return -1; | |||
| value = (unary << k) + get_bits(&s->gb, k); | |||
| } else | |||
| value = unary; | |||
| // FIXME: copy paste from original | |||
| switch (depth) { | |||
| case 1: | |||
| rice->sum1 += value - (rice->sum1 >> 4); | |||
| if (rice->k1 > 0 && rice->sum1 < shift_16[rice->k1]) | |||
| rice->k1--; | |||
| else if(rice->sum1 > shift_16[rice->k1 + 1]) | |||
| rice->k1++; | |||
| value += shift_1[rice->k0]; | |||
| default: | |||
| rice->sum0 += value - (rice->sum0 >> 4); | |||
| if (rice->k0 > 0 && rice->sum0 < shift_16[rice->k0]) | |||
| rice->k0--; | |||
| else if(rice->sum0 > shift_16[rice->k0 + 1]) | |||
| rice->k0++; | |||
| } | |||
| if (k) { | |||
| if (k > MIN_CACHE_BITS) | |||
| return -1; | |||
| value = (unary << k) + get_bits(&s->gb, k); | |||
| } else | |||
| value = unary; | |||
| // FIXME: copy paste from original | |||
| switch (depth) { | |||
| case 1: | |||
| rice->sum1 += value - (rice->sum1 >> 4); | |||
| if (rice->k1 > 0 && rice->sum1 < shift_16[rice->k1]) | |||
| rice->k1--; | |||
| else if(rice->sum1 > shift_16[rice->k1 + 1]) | |||
| rice->k1++; | |||
| value += shift_1[rice->k0]; | |||
| default: | |||
| rice->sum0 += value - (rice->sum0 >> 4); | |||
| if (rice->k0 > 0 && rice->sum0 < shift_16[rice->k0]) | |||
| rice->k0--; | |||
| else if(rice->sum0 > shift_16[rice->k0 + 1]) | |||
| rice->k0++; | |||
| } | |||
| // extract coded value | |||
| // extract coded value | |||
| #define UNFOLD(x) (((x)&1) ? (++(x)>>1) : (-(x)>>1)) | |||
| *p = UNFOLD(value); | |||
| *p = UNFOLD(value); | |||
| // run hybrid filter | |||
| ttafilter_process(filter, p, 0); | |||
| // run hybrid filter | |||
| ttafilter_process(filter, p, 0); | |||
| // fixed order prediction | |||
| // fixed order prediction | |||
| #define PRED(x, k) (int32_t)((((uint64_t)x << k) - x) >> k) | |||
| switch (s->bps) { | |||
| case 1: *p += PRED(*predictor, 4); break; | |||
| case 2: | |||
| case 3: *p += PRED(*predictor, 5); break; | |||
| case 4: *p += *predictor; break; | |||
| } | |||
| *predictor = *p; | |||
| // flip channels | |||
| if (cur_chan < (s->channels-1)) | |||
| cur_chan++; | |||
| else { | |||
| // decorrelate in case of stereo integer | |||
| if (s->channels > 1) { | |||
| int32_t *r = p - 1; | |||
| for (*p += *r / 2; r > p - s->channels; r--) | |||
| *r = *(r + 1) - *r; | |||
| } | |||
| cur_chan = 0; | |||
| switch (s->bps) { | |||
| case 1: *p += PRED(*predictor, 4); break; | |||
| case 2: | |||
| case 3: *p += PRED(*predictor, 5); break; | |||
| case 4: *p += *predictor; break; | |||
| } | |||
| *predictor = *p; | |||
| // flip channels | |||
| if (cur_chan < (s->channels-1)) | |||
| cur_chan++; | |||
| else { | |||
| // decorrelate in case of stereo integer | |||
| if (s->channels > 1) { | |||
| int32_t *r = p - 1; | |||
| for (*p += *r / 2; r > p - s->channels; r--) | |||
| *r = *(r + 1) - *r; | |||
| } | |||
| cur_chan = 0; | |||
| } | |||
| } | |||
| if (get_bits_left(&s->gb) < 32) | |||
| return -1; | |||
| skip_bits(&s->gb, 32); // frame crc | |||
| // convert to output buffer | |||
| switch(s->bps) { | |||
| case 2: { | |||
| uint16_t *samples = data; | |||
| for (p = s->decode_buffer; p < s->decode_buffer + (framelen * s->channels); p++) { | |||
| *samples++ = *p; | |||
| } | |||
| *data_size = (uint8_t *)samples - (uint8_t *)data; | |||
| break; | |||
| if (get_bits_left(&s->gb) < 32) | |||
| return -1; | |||
| skip_bits(&s->gb, 32); // frame crc | |||
| // convert to output buffer | |||
| switch(s->bps) { | |||
| case 2: { | |||
| uint16_t *samples = data; | |||
| for (p = s->decode_buffer; p < s->decode_buffer + (framelen * s->channels); p++) { | |||
| *samples++ = *p; | |||
| } | |||
| default: | |||
| av_log(s->avctx, AV_LOG_ERROR, "Error, only 16bit samples supported!\n"); | |||
| *data_size = (uint8_t *)samples - (uint8_t *)data; | |||
| break; | |||
| } | |||
| default: | |||
| av_log(s->avctx, AV_LOG_ERROR, "Error, only 16bit samples supported!\n"); | |||
| } | |||
| return buf_size; | |||
| } | |||