📄 imc.c.svn-base
字号:
for(i = 0; i < BANDS; i++) { workT[i] = q->bitsBandT[i] ? (q->bitsBandT[i] * -2 + q->flcoeffs4[i] + 1.585) : 1.e20; } if (stream_format_code & 0x2) { workT[0] = 1.e20; workT[1] = 1.e20; workT[2] = 1.e20; workT[3] = 1.e20; } while (freebits < summer){ lowest = 1.e10; low_indx = 0; for(i = 0; i < BANDS; i++) { if (workT[i] < lowest) { lowest = workT[i]; low_indx = i; } } //if(lowest >= 1.e10) break; workT[low_indx] = lowest + 2.0; if (!(--q->bitsBandT[low_indx])) workT[low_indx] = 1.e20; for(j = band_tab[low_indx]; j < band_tab[low_indx+1] && (freebits < summer); j++){ if(q->CWlengthT[j] > 0){ q->CWlengthT[j]--; summer--; } } } } return 0;}static void imc_get_skip_coeff(IMCContext* q) { int i, j; memset(q->skipFlagBits, 0, sizeof(q->skipFlagBits)); memset(q->skipFlagCount, 0, sizeof(q->skipFlagCount)); for(i = 0; i < BANDS; i++) { if (!q->bandFlagsBuf[i] || !q->bandWidthT[i]) continue; if (!q->skipFlagRaw[i]) { q->skipFlagBits[i] = band_tab[i+1] - band_tab[i]; for(j = band_tab[i]; j < band_tab[i+1]; j++) { if ((q->skipFlags[j] = get_bits1(&q->gb))) q->skipFlagCount[i]++; } } else { for(j = band_tab[i]; j < (band_tab[i+1]-1); j += 2) { if(!get_bits1(&q->gb)){//0 q->skipFlagBits[i]++; q->skipFlags[j]=1; q->skipFlags[j+1]=1; q->skipFlagCount[i] += 2; }else{ if(get_bits1(&q->gb)){//11 q->skipFlagBits[i] +=2; q->skipFlags[j]=0; q->skipFlags[j+1]=1; q->skipFlagCount[i]++; }else{ q->skipFlagBits[i] +=3; q->skipFlags[j+1]=0; if(!get_bits1(&q->gb)){//100 q->skipFlags[j]=1; q->skipFlagCount[i]++; }else{//101 q->skipFlags[j]=0; } } } } if (j < band_tab[i+1]) { q->skipFlagBits[i]++; if ((q->skipFlags[j] = get_bits1(&q->gb))) q->skipFlagCount[i]++; } } }}/** * Increase highest' band coefficient sizes as some bits won't be used */static void imc_adjust_bit_allocation (IMCContext* q, int summer) { float workT[32]; int corrected = 0; int i, j; float highest = 0; int found_indx=0; for(i = 0; i < BANDS; i++) { workT[i] = (q->bitsBandT[i] == 6) ? -1.e20 : (q->bitsBandT[i] * -2 + q->flcoeffs4[i] - 0.415); } while (corrected < summer) { if(highest <= -1.e20) break; highest = -1.e20; for(i = 0; i < BANDS; i++) { if (workT[i] > highest) { highest = workT[i]; found_indx = i; } } if (highest > -1.e20) { workT[found_indx] -= 2.0; if (++(q->bitsBandT[found_indx]) == 6) workT[found_indx] = -1.e20; for(j = band_tab[found_indx]; j < band_tab[found_indx+1] && (corrected < summer); j++) { if (!q->skipFlags[j] && (q->CWlengthT[j] < 6)) { q->CWlengthT[j]++; corrected++; } } } }}static void imc_imdct256(IMCContext *q) { int i; float re, im; /* prerotation */ for(i=0; i < COEFFS/2; i++){ q->samples[i].re = -(q->pre_coef1[i] * q->CWdecoded[COEFFS-1-i*2]) - (q->pre_coef2[i] * q->CWdecoded[i*2]); q->samples[i].im = (q->pre_coef2[i] * q->CWdecoded[COEFFS-1-i*2]) - (q->pre_coef1[i] * q->CWdecoded[i*2]); } /* FFT */ ff_fft_permute(&q->fft, q->samples); ff_fft_calc (&q->fft, q->samples); /* postrotation, window and reorder */ for(i = 0; i < COEFFS/2; i++){ re = (q->samples[i].re * q->post_cos[i]) + (-q->samples[i].im * q->post_sin[i]); im = (-q->samples[i].im * q->post_cos[i]) - (q->samples[i].re * q->post_sin[i]); q->out_samples[i*2] = (q->mdct_sine_window[COEFFS-1-i*2] * q->last_fft_im[i]) + (q->mdct_sine_window[i*2] * re); q->out_samples[COEFFS-1-i*2] = (q->mdct_sine_window[i*2] * q->last_fft_im[i]) - (q->mdct_sine_window[COEFFS-1-i*2] * re); q->last_fft_im[i] = im; }}static int inverse_quant_coeff (IMCContext* q, int stream_format_code) { int i, j; int middle_value, cw_len, max_size; const float* quantizer; for(i = 0; i < BANDS; i++) { for(j = band_tab[i]; j < band_tab[i+1]; j++) { q->CWdecoded[j] = 0; cw_len = q->CWlengthT[j]; if (cw_len <= 0 || q->skipFlags[j]) continue; max_size = 1 << cw_len; middle_value = max_size >> 1; if (q->codewords[j] >= max_size || q->codewords[j] < 0) return -1; if (cw_len >= 4){ quantizer = imc_quantizer2[(stream_format_code & 2) >> 1]; if (q->codewords[j] >= middle_value) q->CWdecoded[j] = quantizer[q->codewords[j] - 8] * q->flcoeffs6[i]; else q->CWdecoded[j] = -quantizer[max_size - q->codewords[j] - 8 - 1] * q->flcoeffs6[i]; }else{ quantizer = imc_quantizer1[((stream_format_code & 2) >> 1) | (q->bandFlagsBuf[i] << 1)]; if (q->codewords[j] >= middle_value) q->CWdecoded[j] = quantizer[q->codewords[j] - 1] * q->flcoeffs6[i]; else q->CWdecoded[j] = -quantizer[max_size - 2 - q->codewords[j]] * q->flcoeffs6[i]; } } } return 0;}static int imc_get_coeffs (IMCContext* q) { int i, j, cw_len, cw; for(i = 0; i < BANDS; i++) { if(!q->sumLenArr[i]) continue; if (q->bandFlagsBuf[i] || q->bandWidthT[i]) { for(j = band_tab[i]; j < band_tab[i+1]; j++) { cw_len = q->CWlengthT[j]; cw = 0; if (get_bits_count(&q->gb) + cw_len > 512){//av_log(NULL,0,"Band %i coeff %i cw_len %i\n",i,j,cw_len); return -1; } if(cw_len && (!q->bandFlagsBuf[i] || !q->skipFlags[j])) cw = get_bits(&q->gb, cw_len); q->codewords[j] = cw; } } } return 0;}static int imc_decode_frame(AVCodecContext * avctx, void *data, int *data_size, const uint8_t * buf, int buf_size){ IMCContext *q = avctx->priv_data; int stream_format_code; int imc_hdr, i, j; int flag; int bits, summer; int counter, bitscount; uint16_t buf16[IMC_BLOCK_SIZE / 2]; if (buf_size < IMC_BLOCK_SIZE) { av_log(avctx, AV_LOG_ERROR, "imc frame too small!\n"); return -1; } for(i = 0; i < IMC_BLOCK_SIZE / 2; i++) buf16[i] = bswap_16(((const uint16_t*)buf)[i]); init_get_bits(&q->gb, (const uint8_t*)buf16, IMC_BLOCK_SIZE * 8); /* Check the frame header */ imc_hdr = get_bits(&q->gb, 9); if (imc_hdr != IMC_FRAME_ID) { av_log(avctx, AV_LOG_ERROR, "imc frame header check failed!\n"); av_log(avctx, AV_LOG_ERROR, "got %x instead of 0x21.\n", imc_hdr); return -1; } stream_format_code = get_bits(&q->gb, 3); if(stream_format_code & 1){ av_log(avctx, AV_LOG_ERROR, "Stream code format %X is not supported\n", stream_format_code); return -1; }// av_log(avctx, AV_LOG_DEBUG, "stream_format_code = %d\n", stream_format_code); if (stream_format_code & 0x04) q->decoder_reset = 1; if(q->decoder_reset) { memset(q->out_samples, 0, sizeof(q->out_samples)); for(i = 0; i < BANDS; i++)q->old_floor[i] = 1.0; for(i = 0; i < COEFFS; i++)q->CWdecoded[i] = 0; q->decoder_reset = 0; } flag = get_bits1(&q->gb); imc_read_level_coeffs(q, stream_format_code, q->levlCoeffBuf); if (stream_format_code & 0x4) imc_decode_level_coefficients(q, q->levlCoeffBuf, q->flcoeffs1, q->flcoeffs2); else imc_decode_level_coefficients2(q, q->levlCoeffBuf, q->old_floor, q->flcoeffs1, q->flcoeffs2); memcpy(q->old_floor, q->flcoeffs1, 32 * sizeof(float)); counter = 0; for (i=0 ; i<BANDS ; i++) { if (q->levlCoeffBuf[i] == 16) { q->bandWidthT[i] = 0; counter++; } else q->bandWidthT[i] = band_tab[i+1] - band_tab[i]; } memset(q->bandFlagsBuf, 0, BANDS * sizeof(int)); for(i = 0; i < BANDS-1; i++) { if (q->bandWidthT[i]) q->bandFlagsBuf[i] = get_bits1(&q->gb); } imc_calculate_coeffs(q, q->flcoeffs1, q->flcoeffs2, q->bandWidthT, q->flcoeffs3, q->flcoeffs5); bitscount = 0; /* first 4 bands will be assigned 5 bits per coefficient */ if (stream_format_code & 0x2) { bitscount += 15; q->bitsBandT[0] = 5; q->CWlengthT[0] = 5; q->CWlengthT[1] = 5; q->CWlengthT[2] = 5; for(i = 1; i < 4; i++){ bits = (q->levlCoeffBuf[i] == 16) ? 0 : 5; q->bitsBandT[i] = bits; for(j = band_tab[i]; j < band_tab[i+1]; j++) { q->CWlengthT[j] = bits; bitscount += bits; } } } if(bit_allocation (q, stream_format_code, 512 - bitscount - get_bits_count(&q->gb), flag) < 0) { av_log(avctx, AV_LOG_ERROR, "Bit allocations failed\n"); q->decoder_reset = 1; return -1; } for(i = 0; i < BANDS; i++) { q->sumLenArr[i] = 0; q->skipFlagRaw[i] = 0; for(j = band_tab[i]; j < band_tab[i+1]; j++) q->sumLenArr[i] += q->CWlengthT[j]; if (q->bandFlagsBuf[i]) if( (((band_tab[i+1] - band_tab[i]) * 1.5) > q->sumLenArr[i]) && (q->sumLenArr[i] > 0)) q->skipFlagRaw[i] = 1; } imc_get_skip_coeff(q); for(i = 0; i < BANDS; i++) { q->flcoeffs6[i] = q->flcoeffs1[i]; /* band has flag set and at least one coded coefficient */ if (q->bandFlagsBuf[i] && (band_tab[i+1] - band_tab[i]) != q->skipFlagCount[i]){ q->flcoeffs6[i] *= q->sqrt_tab[band_tab[i+1] - band_tab[i]] / q->sqrt_tab[(band_tab[i+1] - band_tab[i] - q->skipFlagCount[i])]; } } /* calculate bits left, bits needed and adjust bit allocation */ bits = summer = 0; for(i = 0; i < BANDS; i++) { if (q->bandFlagsBuf[i]) { for(j = band_tab[i]; j < band_tab[i+1]; j++) { if(q->skipFlags[j]) { summer += q->CWlengthT[j]; q->CWlengthT[j] = 0; } } bits += q->skipFlagBits[i]; summer -= q->skipFlagBits[i]; } } imc_adjust_bit_allocation(q, summer); for(i = 0; i < BANDS; i++) { q->sumLenArr[i] = 0; for(j = band_tab[i]; j < band_tab[i+1]; j++) if (!q->skipFlags[j]) q->sumLenArr[i] += q->CWlengthT[j]; } memset(q->codewords, 0, sizeof(q->codewords)); if(imc_get_coeffs(q) < 0) { av_log(avctx, AV_LOG_ERROR, "Read coefficients failed\n"); q->decoder_reset = 1; return 0; } if(inverse_quant_coeff(q, stream_format_code) < 0) { av_log(avctx, AV_LOG_ERROR, "Inverse quantization of coefficients failed\n"); q->decoder_reset = 1; return 0; } memset(q->skipFlags, 0, sizeof(q->skipFlags)); imc_imdct256(q); q->dsp.float_to_int16(data, q->out_samples, COEFFS); *data_size = COEFFS * sizeof(int16_t); return IMC_BLOCK_SIZE;}static int imc_decode_close(AVCodecContext * avctx){ IMCContext *q = avctx->priv_data; ff_fft_end(&q->fft); return 0;}AVCodec imc_decoder = { .name = "imc", .type = CODEC_TYPE_AUDIO, .id = CODEC_ID_IMC, .priv_data_size = sizeof(IMCContext), .init = imc_decode_init, .close = imc_decode_close, .decode = imc_decode_frame,};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -