⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imc.c.svn-base

📁 mediastreamer2是开源的网络传输媒体流的库
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
        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 + -