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

📄 specrec.c

📁 the mpeg2/4 aac decoder
💻 C
📖 第 1 页 / 共 3 页
字号:
        REAL_CONST(0)    };    real_t x1, x2;#endif    int16_t sgn = 1;    if (q < 0)    {        q = -q;        sgn = -1;    }    if (q < IQ_TABLE_SIZE)    {//#define IQUANT_PRINT#ifdef IQUANT_PRINT        //printf("0x%.8X\n", sgn * tab[q]);        printf("%d\n", sgn * tab[q]);#endif        return sgn * tab[q];    }#ifndef BIG_IQ_TABLE    if (q >= 8192)    {        *error = 17;        return 0;    }    /* linear interpolation */    x1 = tab[q>>3];    x2 = tab[(q>>3) + 1];    return sgn * 16 * (MUL_R(errcorr[q&7],(x2-x1)) + x1);#else    *error = 17;    return 0;#endif#else    if (q < 0)    {        /* tab contains a value for all possible q [0,8192] */        if (-q < IQ_TABLE_SIZE)            return -tab[-q];        *error = 17;        return 0;    } else {        /* tab contains a value for all possible q [0,8192] */        if (q < IQ_TABLE_SIZE)            return tab[q];        *error = 17;        return 0;    }#endif}#ifndef FIXED_POINTALIGN static const real_t pow2sf_tab[] = {    2.9802322387695313E-008, 5.9604644775390625E-008, 1.1920928955078125E-007,    2.384185791015625E-007, 4.76837158203125E-007, 9.5367431640625E-007,    1.9073486328125E-006, 3.814697265625E-006, 7.62939453125E-006,    1.52587890625E-005, 3.0517578125E-005, 6.103515625E-005,    0.0001220703125, 0.000244140625, 0.00048828125,    0.0009765625, 0.001953125, 0.00390625,    0.0078125, 0.015625, 0.03125,    0.0625, 0.125, 0.25,    0.5, 1.0, 2.0,    4.0, 8.0, 16.0, 32.0,    64.0, 128.0, 256.0,    512.0, 1024.0, 2048.0,    4096.0, 8192.0, 16384.0,    32768.0, 65536.0, 131072.0,    262144.0, 524288.0, 1048576.0,    2097152.0, 4194304.0, 8388608.0,    16777216.0, 33554432.0, 67108864.0,    134217728.0, 268435456.0, 536870912.0,    1073741824.0, 2147483648.0, 4294967296.0,    8589934592.0, 17179869184.0, 34359738368.0,    68719476736.0, 137438953472.0, 274877906944.0};#endif/* quant_to_spec: perform dequantisation and scaling * and in case of short block it also does the deinterleaving *//*  For ONLY_LONG_SEQUENCE windows (num_window_groups = 1,  window_group_length[0] = 1) the spectral data is in ascending spectral  order.  For the EIGHT_SHORT_SEQUENCE window, the spectral order depends on the  grouping in the following manner:  - Groups are ordered sequentially  - Within a group, a scalefactor band consists of the spectral data of all    grouped SHORT_WINDOWs for the associated scalefactor window band. To    clarify via example, the length of a group is in the range of one to eight    SHORT_WINDOWs.  - If there are eight groups each with length one (num_window_groups = 8,    window_group_length[0..7] = 1), the result is a sequence of eight spectra,    each in ascending spectral order.  - If there is only one group with length eight (num_window_groups = 1,    window_group_length[0] = 8), the result is that spectral data of all eight    SHORT_WINDOWs is interleaved by scalefactor window bands.  - Within a scalefactor window band, the coefficients are in ascending    spectral order.*/static uint8_t quant_to_spec(NeAACDecHandle hDecoder,                             ic_stream *ics, int16_t *quant_data,                             real_t *spec_data, uint16_t frame_len){    ALIGN static const real_t pow2_table[] =    {        COEF_CONST(1.0),        COEF_CONST(1.1892071150027210667174999705605), /* 2^0.25 */        COEF_CONST(1.4142135623730950488016887242097), /* 2^0.5 */        COEF_CONST(1.6817928305074290860622509524664) /* 2^0.75 */    };    const real_t *tab = iq_table;    uint8_t g, sfb, win;    uint16_t width, bin, k, gindex, wa, wb;    uint8_t error = 0; /* Init error flag */#ifndef FIXED_POINT    real_t scf;#endif    k = 0;    gindex = 0;    for (g = 0; g < ics->num_window_groups; g++)    {        uint16_t j = 0;        uint16_t gincrease = 0;        uint16_t win_inc = ics->swb_offset[ics->num_swb];        for (sfb = 0; sfb < ics->num_swb; sfb++)        {            int32_t exp, frac;            width = ics->swb_offset[sfb+1] - ics->swb_offset[sfb];            /* this could be scalefactor for IS or PNS, those can be negative or bigger then 255 */            /* just ignore them */            if (ics->scale_factors[g][sfb] < 0 || ics->scale_factors[g][sfb] > 255)            {                exp = 0;                frac = 0;            } else {                /* ics->scale_factors[g][sfb] must be between 0 and 255 */                exp = (ics->scale_factors[g][sfb] /* - 100 */) >> 2;                /* frac must always be > 0 */                frac = (ics->scale_factors[g][sfb] /* - 100 */) & 3;            }#ifdef FIXED_POINT            exp -= 25;            /* IMDCT pre-scaling */            if (hDecoder->object_type == LD)            {                exp -= 6 /*9*/;            } else {                if (ics->window_sequence == EIGHT_SHORT_SEQUENCE)                    exp -= 4 /*7*/;                else                    exp -= 7 /*10*/;            }#endif            wa = gindex + j;#ifndef FIXED_POINT            scf = pow2sf_tab[exp/*+25*/] * pow2_table[frac];#endif            for (win = 0; win < ics->window_group_length[g]; win++)            {                for (bin = 0; bin < width; bin += 4)                {#ifndef FIXED_POINT                    wb = wa + bin;                    spec_data[wb+0] = iquant(quant_data[k+0], tab, &error) * scf;                    spec_data[wb+1] = iquant(quant_data[k+1], tab, &error) * scf;                                            spec_data[wb+2] = iquant(quant_data[k+2], tab, &error) * scf;                                            spec_data[wb+3] = iquant(quant_data[k+3], tab, &error) * scf;                        #else                    real_t iq0 = iquant(quant_data[k+0], tab, &error);                    real_t iq1 = iquant(quant_data[k+1], tab, &error);                    real_t iq2 = iquant(quant_data[k+2], tab, &error);                    real_t iq3 = iquant(quant_data[k+3], tab, &error);                    wb = wa + bin;                    if (exp < 0)                    {                        spec_data[wb+0] = iq0 >>= -exp;                        spec_data[wb+1] = iq1 >>= -exp;                        spec_data[wb+2] = iq2 >>= -exp;                        spec_data[wb+3] = iq3 >>= -exp;                    } else {                        spec_data[wb+0] = iq0 <<= exp;                        spec_data[wb+1] = iq1 <<= exp;                        spec_data[wb+2] = iq2 <<= exp;                        spec_data[wb+3] = iq3 <<= exp;                    }                    if (frac != 0)                    {                        spec_data[wb+0] = MUL_C(spec_data[wb+0],pow2_table[frac]);                        spec_data[wb+1] = MUL_C(spec_data[wb+1],pow2_table[frac]);                        spec_data[wb+2] = MUL_C(spec_data[wb+2],pow2_table[frac]);                        spec_data[wb+3] = MUL_C(spec_data[wb+3],pow2_table[frac]);                    }//#define SCFS_PRINT#ifdef SCFS_PRINT                    printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+0]);                    printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+1]);                    printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+2]);                    printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+3]);                    //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+0]);                    //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+1]);                    //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+2]);                    //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+3]);#endif#endif                    gincrease += 4;                    k += 4;                }                wa += win_inc;            }            j += width;        }        gindex += gincrease;    }    return error;}static uint8_t allocate_single_channel(NeAACDecHandle hDecoder, uint8_t channel,                                       uint8_t output_channels){    uint8_t mul = 1;#ifdef MAIN_DEC    /* MAIN object type prediction */    if (hDecoder->object_type == MAIN)    {        /* allocate the state only when needed */        if (hDecoder->pred_stat[channel] == NULL)        {            hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state));            reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength);        }    }#endif#ifdef LTP_DEC    if (is_ltp_ot(hDecoder->object_type))    {        /* allocate the state only when needed */        if (hDecoder->lt_pred_stat[channel] == NULL)        {            hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t));            memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t));        }    }#endif    if (hDecoder->time_out[channel] == NULL)    {        mul = 1;#ifdef SBR_DEC        hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0;        if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1))        {            /* SBR requires 2 times as much output data */            mul = 2;            hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1;        }#endif        hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t));        memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t));    }#if (defined(PS_DEC) || defined(DRM_PS))    if (output_channels == 2)    {        if (hDecoder->time_out[channel+1] == NULL)        {            hDecoder->time_out[channel+1] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t));            memset(hDecoder->time_out[channel+1], 0, mul*hDecoder->frameLength*sizeof(real_t));        }    }#endif    if (hDecoder->fb_intermed[channel] == NULL)    {        hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t));        memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t));    }#ifdef SSR_DEC    if (hDecoder->object_type == SSR)    {        if (hDecoder->ssr_overlap[channel] == NULL)        {            hDecoder->ssr_overlap[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t));            memset(hDecoder->ssr_overlap[channel], 0, 2*hDecoder->frameLength*sizeof(real_t));        }        if (hDecoder->prev_fmd[channel] == NULL)        {            uint16_t k;            hDecoder->prev_fmd[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t));            for (k = 0; k < 2*hDecoder->frameLength; k++)                hDecoder->prev_fmd[channel][k] = REAL_CONST(-1);        }    }#endif    return 0;}static uint8_t allocate_channel_pair(NeAACDecHandle hDecoder,                                     uint8_t channel, uint8_t paired_channel){    uint8_t mul = 1;#ifdef MAIN_DEC    /* MAIN object type prediction */    if (hDecoder->object_type == MAIN)    {        /* allocate the state only when needed */        if (hDecoder->pred_stat[channel] == NULL)        {            hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state));            reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength);        }        if (hDecoder->pred_stat[paired_channel] == NULL)        {            hDecoder->pred_stat[paired_channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state));            reset_all_predictors(hDecoder->pred_stat[paired_channel], hDecoder->frameLength);        }    }#endif#ifdef LTP_DEC    if (is_ltp_ot(hDecoder->object_type))    {        /* allocate the state only when needed */        if (hDecoder->lt_pred_stat[channel] == NULL)        {            hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t));            memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t));        }        if (hDecoder->lt_pred_stat[paired_channel] == NULL)        {            hDecoder->lt_pred_stat[paired_channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t));            memset(hDecoder->lt_pred_stat[paired_channel], 0, hDecoder->frameLength*4 * sizeof(int16_t));        }    }#endif    if (hDecoder->time_out[channel] == NULL)    {        mul = 1;#ifdef SBR_DEC        hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0;        if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1))        {            /* SBR requires 2 times as much output data */            mul = 2;            hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1;        }#endif        hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t));        memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t));    }    if (hDecoder->time_out[paired_channel] == NULL)    {        hDecoder->time_out[paired_channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t));        memset(hDecoder->time_out[paired_channel], 0, mul*hDecoder->frameLength*sizeof(real_t));    }    if (hDecoder->fb_intermed[channel] == NULL)    {        hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t));        memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t));    }    if (hDecoder->fb_intermed[paired_channel] == NULL)    {        hDecoder->fb_intermed[paired_channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t));        memset(hDecoder->fb_intermed[paired_channel], 0, hDecoder->frameLength*sizeof(real_t));    }#ifdef SSR_DEC    if (hDecoder->object_type == SSR)    {        if (hDecoder->ssr_overlap[cpe->channel] == NULL)        {            hDecoder->ssr_overlap[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t));            memset(hDecoder->ssr_overlap[cpe->channel], 0, 2*hDecoder->frameLength*sizeof(real_t));        }        if (hDecoder->ssr_overlap[cpe->paired_channel] == NULL)        {            hDecoder->ssr_overlap[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t));            memset(hDecoder->ssr_overlap[cpe->paired_channel], 0, 2*hDecoder->frameLength*sizeof(real_t));        }        if (hDecoder->prev_fmd[cpe->channel] == NULL)        {            uint16_t k;            hDecoder->prev_fmd[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t));            for (k = 0; k < 2*hDecoder->frameLength; k++)                hDecoder->prev_fmd[cpe->channel][k] = REAL_CONST(-1);        }        if (hDecoder->prev_fmd[cpe->paired_channel] == NULL)        {            uint16_t k;            hDecoder->prev_fmd[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t));            for (k = 0; k < 2*hDecoder->frameLength; k++)                hDecoder->prev_fmd[cpe->paired_channel][k] = REAL_CONST(-1);        }    }#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -