|
|
|
@ -37,9 +37,10 @@ |
|
|
|
|
#include "libavutil/channel_layout.h" |
|
|
|
|
#include "libavutil/float_dsp.h" |
|
|
|
|
#include "libavutil/internal.h" |
|
|
|
|
|
|
|
|
|
#include "avcodec.h" |
|
|
|
|
#include "bitstream.h" |
|
|
|
|
#include "bswapdsp.h" |
|
|
|
|
#include "get_bits.h" |
|
|
|
|
#include "fft.h" |
|
|
|
|
#include "internal.h" |
|
|
|
|
#include "sinewin.h" |
|
|
|
@ -91,7 +92,7 @@ typedef struct IMCContext { |
|
|
|
|
//@}
|
|
|
|
|
|
|
|
|
|
float sqrt_tab[30]; |
|
|
|
|
GetBitContext gb; |
|
|
|
|
BitstreamContext bc; |
|
|
|
|
|
|
|
|
|
BswapDSPContext bdsp; |
|
|
|
|
AVFloatDSPContext fdsp; |
|
|
|
@ -328,12 +329,12 @@ static void imc_read_level_coeffs(IMCContext *q, int stream_format_code, |
|
|
|
|
if (stream_format_code & 4) |
|
|
|
|
start = 1; |
|
|
|
|
if (start) |
|
|
|
|
levlCoeffs[0] = get_bits(&q->gb, 7); |
|
|
|
|
levlCoeffs[0] = bitstream_read(&q->bc, 7); |
|
|
|
|
for (i = start; i < BANDS; i++) { |
|
|
|
|
levlCoeffs[i] = get_vlc2(&q->gb, hufftab[cb_sel[i]]->table, |
|
|
|
|
hufftab[cb_sel[i]]->bits, 2); |
|
|
|
|
levlCoeffs[i] = bitstream_read_vlc(&q->bc, hufftab[cb_sel[i]]->table, |
|
|
|
|
hufftab[cb_sel[i]]->bits, 2); |
|
|
|
|
if (levlCoeffs[i] == 17) |
|
|
|
|
levlCoeffs[i] += get_bits(&q->gb, 4); |
|
|
|
|
levlCoeffs[i] += bitstream_read(&q->bc, 4); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -342,10 +343,10 @@ static void imc_read_level_coeffs_raw(IMCContext *q, int stream_format_code, |
|
|
|
|
{ |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
q->coef0_pos = get_bits(&q->gb, 5); |
|
|
|
|
levlCoeffs[0] = get_bits(&q->gb, 7); |
|
|
|
|
q->coef0_pos = bitstream_read(&q->bc, 5); |
|
|
|
|
levlCoeffs[0] = bitstream_read(&q->bc, 7); |
|
|
|
|
for (i = 1; i < BANDS; i++) |
|
|
|
|
levlCoeffs[i] = get_bits(&q->gb, 4); |
|
|
|
|
levlCoeffs[i] = bitstream_read(&q->bc, 4); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void imc_decode_level_coefficients(IMCContext *q, int *levlCoeffBuf, |
|
|
|
@ -612,19 +613,19 @@ static void imc_get_skip_coeff(IMCContext *q, IMCChannel *chctx) |
|
|
|
|
chctx->skipFlagBits[i] = band_tab[i + 1] - band_tab[i]; |
|
|
|
|
|
|
|
|
|
for (j = band_tab[i]; j < band_tab[i + 1]; j++) { |
|
|
|
|
chctx->skipFlags[j] = get_bits1(&q->gb); |
|
|
|
|
chctx->skipFlags[j] = bitstream_read_bit(&q->bc); |
|
|
|
|
if (chctx->skipFlags[j]) |
|
|
|
|
chctx->skipFlagCount[i]++; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
for (j = band_tab[i]; j < band_tab[i + 1] - 1; j += 2) { |
|
|
|
|
if (!get_bits1(&q->gb)) { // 0
|
|
|
|
|
if (!bitstream_read_bit(&q->bc)) { // 0
|
|
|
|
|
chctx->skipFlagBits[i]++; |
|
|
|
|
chctx->skipFlags[j] = 1; |
|
|
|
|
chctx->skipFlags[j + 1] = 1; |
|
|
|
|
chctx->skipFlagCount[i] += 2; |
|
|
|
|
} else { |
|
|
|
|
if (get_bits1(&q->gb)) { // 11
|
|
|
|
|
if (bitstream_read_bit(&q->bc)) { // 11
|
|
|
|
|
chctx->skipFlagBits[i] += 2; |
|
|
|
|
chctx->skipFlags[j] = 0; |
|
|
|
|
chctx->skipFlags[j + 1] = 1; |
|
|
|
@ -632,7 +633,7 @@ static void imc_get_skip_coeff(IMCContext *q, IMCChannel *chctx) |
|
|
|
|
} else { |
|
|
|
|
chctx->skipFlagBits[i] += 3; |
|
|
|
|
chctx->skipFlags[j + 1] = 0; |
|
|
|
|
if (!get_bits1(&q->gb)) { // 100
|
|
|
|
|
if (!bitstream_read_bit(&q->bc)) { // 100
|
|
|
|
|
chctx->skipFlags[j] = 1; |
|
|
|
|
chctx->skipFlagCount[i]++; |
|
|
|
|
} else { // 101
|
|
|
|
@ -644,7 +645,7 @@ static void imc_get_skip_coeff(IMCContext *q, IMCChannel *chctx) |
|
|
|
|
|
|
|
|
|
if (j < band_tab[i + 1]) { |
|
|
|
|
chctx->skipFlagBits[i]++; |
|
|
|
|
if ((chctx->skipFlags[j] = get_bits1(&q->gb))) |
|
|
|
|
if ((chctx->skipFlags[j] = bitstream_read_bit(&q->bc))) |
|
|
|
|
chctx->skipFlagCount[i]++; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -781,13 +782,13 @@ static int imc_get_coeffs(IMCContext *q, IMCChannel *chctx) |
|
|
|
|
cw_len = chctx->CWlengthT[j]; |
|
|
|
|
cw = 0; |
|
|
|
|
|
|
|
|
|
if (get_bits_count(&q->gb) + cw_len > 512) { |
|
|
|
|
if (bitstream_tell(&q->bc) + cw_len > 512) { |
|
|
|
|
ff_dlog(NULL, "Band %i coeff %i cw_len %i\n", i, j, cw_len); |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (cw_len && (!chctx->bandFlagsBuf[i] || !chctx->skipFlags[j])) |
|
|
|
|
cw = get_bits(&q->gb, cw_len); |
|
|
|
|
cw = bitstream_read(&q->bc, cw_len); |
|
|
|
|
|
|
|
|
|
chctx->codewords[j] = cw; |
|
|
|
|
} |
|
|
|
@ -851,13 +852,13 @@ static int imc_decode_block(AVCodecContext *avctx, IMCContext *q, int ch) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Check the frame header */ |
|
|
|
|
imc_hdr = get_bits(&q->gb, 9); |
|
|
|
|
imc_hdr = bitstream_read(&q->bc, 9); |
|
|
|
|
if (imc_hdr & 0x18) { |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "frame header check failed!\n"); |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "got %X.\n", imc_hdr); |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
} |
|
|
|
|
stream_format_code = get_bits(&q->gb, 3); |
|
|
|
|
stream_format_code = bitstream_read(&q->bc, 3); |
|
|
|
|
|
|
|
|
|
if (stream_format_code & 0x04) |
|
|
|
|
chctx->decoder_reset = 1; |
|
|
|
@ -870,7 +871,7 @@ static int imc_decode_block(AVCodecContext *avctx, IMCContext *q, int ch) |
|
|
|
|
chctx->decoder_reset = 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
flag = get_bits1(&q->gb); |
|
|
|
|
flag = bitstream_read_bit(&q->bc); |
|
|
|
|
if (stream_format_code & 0x1) |
|
|
|
|
imc_read_level_coeffs_raw(q, stream_format_code, chctx->levlCoeffBuf); |
|
|
|
|
else |
|
|
|
@ -908,7 +909,7 @@ static int imc_decode_block(AVCodecContext *avctx, IMCContext *q, int ch) |
|
|
|
|
memset(chctx->bandFlagsBuf, 0, BANDS * sizeof(int)); |
|
|
|
|
for (i = 0; i < BANDS - 1; i++) |
|
|
|
|
if (chctx->bandWidthT[i]) |
|
|
|
|
chctx->bandFlagsBuf[i] = get_bits1(&q->gb); |
|
|
|
|
chctx->bandFlagsBuf[i] = bitstream_read_bit(&q->bc); |
|
|
|
|
|
|
|
|
|
imc_calculate_coeffs(q, chctx->flcoeffs1, chctx->flcoeffs2, |
|
|
|
|
chctx->bandWidthT, chctx->flcoeffs3, |
|
|
|
@ -943,7 +944,7 @@ static int imc_decode_block(AVCodecContext *avctx, IMCContext *q, int ch) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ((ret = bit_allocation(q, chctx, stream_format_code, |
|
|
|
|
512 - bitscount - get_bits_count(&q->gb), |
|
|
|
|
512 - bitscount - bitstream_tell(&q->bc), |
|
|
|
|
flag)) < 0) { |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "Bit allocations failed\n"); |
|
|
|
|
chctx->decoder_reset = 1; |
|
|
|
@ -1015,7 +1016,7 @@ static int imc_decode_frame(AVCodecContext *avctx, void *data, |
|
|
|
|
|
|
|
|
|
q->bdsp.bswap16_buf(buf16, (const uint16_t *) buf, IMC_BLOCK_SIZE / 2); |
|
|
|
|
|
|
|
|
|
init_get_bits(&q->gb, (const uint8_t*)buf16, IMC_BLOCK_SIZE * 8); |
|
|
|
|
bitstream_init(&q->bc, (const uint8_t*)buf16, IMC_BLOCK_SIZE * 8); |
|
|
|
|
|
|
|
|
|
buf += IMC_BLOCK_SIZE; |
|
|
|
|
|
|
|
|
|