From f7813a5324be39d13ab536c245d15dfc602a7849 Mon Sep 17 00:00:00 2001 From: Tim Redfern Date: Sun, 29 Dec 2013 12:19:38 +0000 Subject: basic type mechanism working --- ffmpeg/libavcodec/imc.c | 192 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 132 insertions(+), 60 deletions(-) (limited to 'ffmpeg/libavcodec/imc.c') diff --git a/ffmpeg/libavcodec/imc.c b/ffmpeg/libavcodec/imc.c index eb7c255..cbd7041 100644 --- a/ffmpeg/libavcodec/imc.c +++ b/ffmpeg/libavcodec/imc.c @@ -101,6 +101,8 @@ typedef struct { DECLARE_ALIGNED(32, FFTComplex, samples)[COEFFS / 2]; float *out_samples; + int coef0_pos; + int8_t cyclTab[32], cyclTab2[32]; float weights1[31], weights2[31]; } IMCContext; @@ -337,6 +339,17 @@ static void imc_read_level_coeffs(IMCContext *q, int stream_format_code, } } +static void imc_read_level_coeffs_raw(IMCContext *q, int stream_format_code, + int *levlCoeffs) +{ + int i; + + q->coef0_pos = get_bits(&q->gb, 5); + levlCoeffs[0] = get_bits(&q->gb, 7); + for (i = 1; i < BANDS; i++) + levlCoeffs[i] = get_bits(&q->gb, 4); +} + static void imc_decode_level_coefficients(IMCContext *q, int *levlCoeffBuf, float *flcoeffs1, float *flcoeffs2) { @@ -391,6 +404,28 @@ static void imc_decode_level_coefficients2(IMCContext *q, int *levlCoeffBuf, } } +static void imc_decode_level_coefficients_raw(IMCContext *q, int *levlCoeffBuf, + float *flcoeffs1, float *flcoeffs2) +{ + int i, level, pos; + float tmp, tmp2; + + pos = q->coef0_pos; + flcoeffs1[pos] = 20000.0 / pow (2, levlCoeffBuf[0] * 0.18945); // 0.18945 = log2(10) * 0.05703125 + flcoeffs2[pos] = log2f(flcoeffs1[0]); + tmp = flcoeffs1[pos]; + tmp2 = flcoeffs2[pos]; + + levlCoeffBuf++; + for (i = 0; i < BANDS; i++) { + if (i == pos) + continue; + level = *levlCoeffBuf++; + flcoeffs1[i] = tmp * powf(10.0, -level * 0.4375); //todo tab + flcoeffs2[i] = tmp2 - 1.4533435415 * level; // 1.4533435415 = log2(10) * 0.4375 + } +} + /** * Perform bit allocation depending on bits available */ @@ -416,8 +451,13 @@ static int bit_allocation(IMCContext *q, IMCChannel *chctx, for (i = 0; i < BANDS; i++) highest = FFMAX(highest, chctx->flcoeffs1[i]); - for (i = 0; i < BANDS - 1; i++) + for (i = 0; i < BANDS - 1; i++) { + if (chctx->flcoeffs5[i] <= 0) { + av_log(NULL, AV_LOG_ERROR, "flcoeffs5 %f invalid\n", chctx->flcoeffs5[i]); + return AVERROR_INVALIDDATA; + } chctx->flcoeffs4[i] = chctx->flcoeffs3[i] - log2f(chctx->flcoeffs5[i]); + } chctx->flcoeffs4[BANDS - 1] = limit; highest = highest * 0.25; @@ -450,6 +490,10 @@ static int bit_allocation(IMCContext *q, IMCChannel *chctx, iacc += chctx->bandWidthT[i]; summa += chctx->bandWidthT[i] * chctx->flcoeffs4[i]; } + + if (!iacc) + return AVERROR_INVALIDDATA; + chctx->bandWidthT[BANDS - 1] = 0; summa = (summa * 0.5 - freebits) / iacc; @@ -759,12 +803,56 @@ static int imc_get_coeffs(IMCContext *q, IMCChannel *chctx) return 0; } +static void imc_refine_bit_allocation(IMCContext *q, IMCChannel *chctx) +{ + int i, j; + int bits, summer; + + for (i = 0; i < BANDS; i++) { + chctx->sumLenArr[i] = 0; + chctx->skipFlagRaw[i] = 0; + for (j = band_tab[i]; j < band_tab[i + 1]; j++) + chctx->sumLenArr[i] += chctx->CWlengthT[j]; + if (chctx->bandFlagsBuf[i]) + if ((((band_tab[i + 1] - band_tab[i]) * 1.5) > chctx->sumLenArr[i]) && (chctx->sumLenArr[i] > 0)) + chctx->skipFlagRaw[i] = 1; + } + + imc_get_skip_coeff(q, chctx); + + for (i = 0; i < BANDS; i++) { + chctx->flcoeffs6[i] = chctx->flcoeffs1[i]; + /* band has flag set and at least one coded coefficient */ + if (chctx->bandFlagsBuf[i] && (band_tab[i + 1] - band_tab[i]) != chctx->skipFlagCount[i]) { + chctx->flcoeffs6[i] *= q->sqrt_tab[ band_tab[i + 1] - band_tab[i]] / + q->sqrt_tab[(band_tab[i + 1] - band_tab[i] - chctx->skipFlagCount[i])]; + } + } + + /* calculate bits left, bits needed and adjust bit allocation */ + bits = summer = 0; + + for (i = 0; i < BANDS; i++) { + if (chctx->bandFlagsBuf[i]) { + for (j = band_tab[i]; j < band_tab[i + 1]; j++) { + if (chctx->skipFlags[j]) { + summer += chctx->CWlengthT[j]; + chctx->CWlengthT[j] = 0; + } + } + bits += chctx->skipFlagBits[i]; + summer -= chctx->skipFlagBits[i]; + } + } + imc_adjust_bit_allocation(q, chctx, summer); +} + static int imc_decode_block(AVCodecContext *avctx, IMCContext *q, int ch) { int stream_format_code; int imc_hdr, i, j, ret; int flag; - int bits, summer; + int bits; int counter, bitscount; IMCChannel *chctx = q->chctx + ch; @@ -778,11 +866,6 @@ static int imc_decode_block(AVCodecContext *avctx, IMCContext *q, int ch) } stream_format_code = get_bits(&q->gb, 3); - if (stream_format_code & 1) { - avpriv_request_sample(avctx, "Stream format %X", stream_format_code); - return AVERROR_PATCHWELCOME; - } - if (stream_format_code & 0x04) chctx->decoder_reset = 1; @@ -795,7 +878,13 @@ static int imc_decode_block(AVCodecContext *avctx, IMCContext *q, int ch) } flag = get_bits1(&q->gb); - imc_read_level_coeffs(q, stream_format_code, chctx->levlCoeffBuf); + if (stream_format_code & 0x1) + imc_decode_level_coefficients_raw(q, chctx->levlCoeffBuf, + chctx->flcoeffs1, chctx->flcoeffs2); + else if (stream_format_code & 0x1) + imc_read_level_coeffs_raw(q, stream_format_code, chctx->levlCoeffBuf); + else + imc_read_level_coeffs(q, stream_format_code, chctx->levlCoeffBuf); if (stream_format_code & 0x4) imc_decode_level_coefficients(q, chctx->levlCoeffBuf, @@ -814,20 +903,31 @@ static int imc_decode_block(AVCodecContext *avctx, IMCContext *q, int ch) memcpy(chctx->old_floor, chctx->flcoeffs1, 32 * sizeof(float)); counter = 0; - for (i = 0; i < BANDS; i++) { - if (chctx->levlCoeffBuf[i] == 16) { - chctx->bandWidthT[i] = 0; - counter++; - } else - chctx->bandWidthT[i] = band_tab[i + 1] - band_tab[i]; - } - 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); - } + if (stream_format_code & 0x1) { + for (i = 0; i < BANDS; i++) { + chctx->bandWidthT[i] = band_tab[i + 1] - band_tab[i]; + chctx->bandFlagsBuf[i] = 0; + chctx->flcoeffs3[i] = chctx->flcoeffs2[i] * 2; + chctx->flcoeffs5[i] = 1.0; + } + } else { + for (i = 0; i < BANDS; i++) { + if (chctx->levlCoeffBuf[i] == 16) { + chctx->bandWidthT[i] = 0; + counter++; + } else + chctx->bandWidthT[i] = band_tab[i + 1] - band_tab[i]; + } + + 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); - imc_calculate_coeffs(q, chctx->flcoeffs1, chctx->flcoeffs2, chctx->bandWidthT, chctx->flcoeffs3, chctx->flcoeffs5); + imc_calculate_coeffs(q, chctx->flcoeffs1, chctx->flcoeffs2, + chctx->bandWidthT, chctx->flcoeffs3, + chctx->flcoeffs5); + } bitscount = 0; /* first 4 bands will be assigned 5 bits per coefficient */ @@ -839,7 +939,10 @@ static int imc_decode_block(AVCodecContext *avctx, IMCContext *q, int ch) chctx->CWlengthT[1] = 5; chctx->CWlengthT[2] = 5; for (i = 1; i < 4; i++) { - bits = (chctx->levlCoeffBuf[i] == 16) ? 0 : 5; + if (stream_format_code & 0x1) + bits = 5; + else + bits = (chctx->levlCoeffBuf[i] == 16) ? 0 : 5; chctx->bitsBandT[i] = bits; for (j = band_tab[i]; j < band_tab[i + 1]; j++) { chctx->CWlengthT[j] = bits; @@ -861,43 +964,12 @@ static int imc_decode_block(AVCodecContext *avctx, IMCContext *q, int ch) return ret; } - for (i = 0; i < BANDS; i++) { - chctx->sumLenArr[i] = 0; - chctx->skipFlagRaw[i] = 0; - for (j = band_tab[i]; j < band_tab[i + 1]; j++) - chctx->sumLenArr[i] += chctx->CWlengthT[j]; - if (chctx->bandFlagsBuf[i]) - if ((((band_tab[i + 1] - band_tab[i]) * 1.5) > chctx->sumLenArr[i]) && (chctx->sumLenArr[i] > 0)) - chctx->skipFlagRaw[i] = 1; - } - - imc_get_skip_coeff(q, chctx); - - for (i = 0; i < BANDS; i++) { - chctx->flcoeffs6[i] = chctx->flcoeffs1[i]; - /* band has flag set and at least one coded coefficient */ - if (chctx->bandFlagsBuf[i] && (band_tab[i + 1] - band_tab[i]) != chctx->skipFlagCount[i]) { - chctx->flcoeffs6[i] *= q->sqrt_tab[ band_tab[i + 1] - band_tab[i]] / - q->sqrt_tab[(band_tab[i + 1] - band_tab[i] - chctx->skipFlagCount[i])]; - } - } - - /* calculate bits left, bits needed and adjust bit allocation */ - bits = summer = 0; - - for (i = 0; i < BANDS; i++) { - if (chctx->bandFlagsBuf[i]) { - for (j = band_tab[i]; j < band_tab[i + 1]; j++) { - if (chctx->skipFlags[j]) { - summer += chctx->CWlengthT[j]; - chctx->CWlengthT[j] = 0; - } - } - bits += chctx->skipFlagBits[i]; - summer -= chctx->skipFlagBits[i]; - } + if (stream_format_code & 0x1) { + for (i = 0; i < BANDS; i++) + chctx->skipFlags[i] = 0; + } else { + imc_refine_bit_allocation(q, chctx); } - imc_adjust_bit_allocation(q, chctx, summer); for (i = 0; i < BANDS; i++) { chctx->sumLenArr[i] = 0; @@ -994,6 +1066,7 @@ static av_cold void flush(AVCodecContext *avctx) #if CONFIG_IMC_DECODER AVCodec ff_imc_decoder = { .name = "imc", + .long_name = NULL_IF_CONFIG_SMALL("IMC (Intel Music Coder)"), .type = AVMEDIA_TYPE_AUDIO, .id = AV_CODEC_ID_IMC, .priv_data_size = sizeof(IMCContext), @@ -1002,7 +1075,6 @@ AVCodec ff_imc_decoder = { .decode = imc_decode_frame, .flush = flush, .capabilities = CODEC_CAP_DR1, - .long_name = NULL_IF_CONFIG_SMALL("IMC (Intel Music Coder)"), .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE }, }; @@ -1010,6 +1082,7 @@ AVCodec ff_imc_decoder = { #if CONFIG_IAC_DECODER AVCodec ff_iac_decoder = { .name = "iac", + .long_name = NULL_IF_CONFIG_SMALL("IAC (Indeo Audio Coder)"), .type = AVMEDIA_TYPE_AUDIO, .id = AV_CODEC_ID_IAC, .priv_data_size = sizeof(IMCContext), @@ -1018,7 +1091,6 @@ AVCodec ff_iac_decoder = { .decode = imc_decode_frame, .flush = flush, .capabilities = CODEC_CAP_DR1, - .long_name = NULL_IF_CONFIG_SMALL("IAC (Indeo Audio Coder)"), .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE }, }; -- cgit v1.2.3