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

📄 decoder.c

📁 tcpmp.src.0.72RC1 优秀的多媒体播放器TCPMP的源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
        hDecoder->forceUpSampling = mp4ASC.forceUpSampling;    else        hDecoder->forceUpSampling = 0;    /* AAC core decoder samplerate is 2 times as low */    if (((hDecoder->sbr_present_flag == 1)&&(!hDecoder->downSampledSBR)) || hDecoder->forceUpSampling == 1)    {        hDecoder->sf_index = get_sr_index(mp4ASC.samplingFrequency / 2);    }#endif    if (rc != 0)    {        return rc;    }    hDecoder->channelConfiguration = mp4ASC.channelsConfiguration;    if (mp4ASC.frameLengthFlag)#ifdef ALLOW_SMALL_FRAMELENGTH        hDecoder->frameLength = 960;#else        return -1;#endif    /* must be done before frameLength is divided by 2 for LD */#ifdef SSR_DEC    if (hDecoder->object_type == SSR)        hDecoder->fb = ssr_filter_bank_init(hDecoder->frameLength/SSR_BANDS);    else#endif#ifdef LIBPAAC
		AAC_Filter_Init(&hDecoder->Lib,hDecoder->frameLength);
#else
        hDecoder->fb = filter_bank_init(hDecoder->frameLength);#endif
#ifdef LD_DEC    if (hDecoder->object_type == LD)        hDecoder->frameLength >>= 1;#endif    return 0;}#ifdef DRMint8_t NEAACDECAPI NeAACDecInitDRM(NeAACDecHandle *hDecoder, uint32_t samplerate,                                   uint8_t channels){    if (hDecoder == NULL)        return 1; /* error */    NeAACDecClose(*hDecoder);    *hDecoder = NeAACDecOpen();    /* Special object type defined for DRM */    (*hDecoder)->config.defObjectType = DRM_ER_LC;    (*hDecoder)->config.defSampleRate = samplerate;#ifdef ERROR_RESILIENCE // This shoudl always be defined for DRM    (*hDecoder)->aacSectionDataResilienceFlag = 1; /* VCB11 */    (*hDecoder)->aacScalefactorDataResilienceFlag = 0; /* no RVLC */    (*hDecoder)->aacSpectralDataResilienceFlag = 1; /* HCR */#endif    (*hDecoder)->frameLength = 960;    (*hDecoder)->sf_index = get_sr_index((*hDecoder)->config.defSampleRate);    (*hDecoder)->object_type = (*hDecoder)->config.defObjectType;    if ((channels == DRMCH_STEREO) || (channels == DRMCH_SBR_STEREO))        (*hDecoder)->channelConfiguration = 2;    else        (*hDecoder)->channelConfiguration = 1;#ifdef SBR_DEC    if ((channels == DRMCH_MONO) || (channels == DRMCH_STEREO))        (*hDecoder)->sbr_present_flag = 0;    else        (*hDecoder)->sbr_present_flag = 1;    #endif        #ifdef LIBPAAC
	AAC_Filter_Init(&hDecoder->Lib,hDecoder->frameLength);
#else
    (*hDecoder)->fb = filter_bank_init((*hDecoder)->frameLength);#endif

    return 0;}#endifvoid NEAACDECAPI NeAACDecClose(NeAACDecHandle hDecoder){    uint8_t i;    if (hDecoder == NULL)        return;#ifdef PROFILE    printf("AAC decoder total:  %I64d cycles\n", hDecoder->cycles);    printf("requant:            %I64d cycles\n", hDecoder->requant_cycles);    printf("spectral_data:      %I64d cycles\n", hDecoder->spectral_cycles);    printf("scalefactors:       %I64d cycles\n", hDecoder->scalefac_cycles);    printf("output:             %I64d cycles\n", hDecoder->output_cycles);#endif    for (i = 0; i < MAX_CHANNELS; i++)    {        if (hDecoder->time_out[i]) faad_free(hDecoder->time_out[i]);        if (hDecoder->fb_intermed[i]) faad_free(hDecoder->fb_intermed[i]);#ifdef SSR_DEC        if (hDecoder->ssr_overlap[i]) faad_free(hDecoder->ssr_overlap[i]);        if (hDecoder->prev_fmd[i]) faad_free(hDecoder->prev_fmd[i]);#endif#ifdef MAIN_DEC        if (hDecoder->pred_stat[i]) faad_free(hDecoder->pred_stat[i]);#endif#ifdef LTP_DEC        if (hDecoder->lt_pred_stat[i]) faad_free(hDecoder->lt_pred_stat[i]);#endif    }
#ifdef SSR_DEC    if (hDecoder->object_type == SSR)        ssr_filter_bank_end(hDecoder->fb);    else#endif
#ifndef LIBPAAC        filter_bank_end(hDecoder->fb);
#endif    drc_end(hDecoder->drc);    if (hDecoder->sample_buffer) faad_free(hDecoder->sample_buffer);#ifdef SBR_DEC    for (i = 0; i < MAX_SYNTAX_ELEMENTS; i++)    {        if (hDecoder->sbr[i])            sbrDecodeEnd(hDecoder->sbr[i]);    }#endif

	if (hDecoder->stack)
		faad_free(hDecoder->stack);    if (hDecoder) faad_free(hDecoder);}void NEAACDECAPI NeAACDecPostSeekReset(NeAACDecHandle hDecoder, int32_t frame){    if (hDecoder)    {        hDecoder->postSeekResetFlag = 1;        if (frame != -1)            hDecoder->frame = frame;    }}static void create_channel_config(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo){    hInfo->num_front_channels = 0;    hInfo->num_side_channels = 0;    hInfo->num_back_channels = 0;    hInfo->num_lfe_channels = 0;    memset(hInfo->channel_position, 0, MAX_CHANNELS*sizeof(uint8_t));    if (hDecoder->downMatrix)    {        hInfo->num_front_channels = 2;        hInfo->channel_position[0] = FRONT_CHANNEL_LEFT;        hInfo->channel_position[1] = FRONT_CHANNEL_RIGHT;        return;    }    /* check if there is a PCE */    if (hDecoder->pce_set)    {        uint8_t i, chpos = 0;        uint8_t chdir, back_center = 0;        hInfo->num_front_channels = hDecoder->pce.num_front_channels;        hInfo->num_side_channels = hDecoder->pce.num_side_channels;        hInfo->num_back_channels = hDecoder->pce.num_back_channels;        hInfo->num_lfe_channels = hDecoder->pce.num_lfe_channels;        chdir = hInfo->num_front_channels;        if (chdir & 1)        {            hInfo->channel_position[chpos++] = FRONT_CHANNEL_CENTER;            chdir--;        }        for (i = 0; i < chdir; i += 2)        {            hInfo->channel_position[chpos++] = FRONT_CHANNEL_LEFT;            hInfo->channel_position[chpos++] = FRONT_CHANNEL_RIGHT;        }        for (i = 0; i < hInfo->num_side_channels; i += 2)        {            hInfo->channel_position[chpos++] = SIDE_CHANNEL_LEFT;            hInfo->channel_position[chpos++] = SIDE_CHANNEL_RIGHT;        }        chdir = hInfo->num_back_channels;        if (chdir & 1)        {            back_center = 1;            chdir--;        }        for (i = 0; i < chdir; i += 2)        {            hInfo->channel_position[chpos++] = BACK_CHANNEL_LEFT;            hInfo->channel_position[chpos++] = BACK_CHANNEL_RIGHT;        }        if (back_center)        {            hInfo->channel_position[chpos++] = BACK_CHANNEL_CENTER;        }        for (i = 0; i < hInfo->num_lfe_channels; i++)        {            hInfo->channel_position[chpos++] = LFE_CHANNEL;        }    } else {        switch (hDecoder->channelConfiguration)        {        case 1:            hInfo->num_front_channels = 1;            hInfo->channel_position[0] = FRONT_CHANNEL_CENTER;            break;        case 2:            hInfo->num_front_channels = 2;            hInfo->channel_position[0] = FRONT_CHANNEL_LEFT;            hInfo->channel_position[1] = FRONT_CHANNEL_RIGHT;            break;        case 3:            hInfo->num_front_channels = 3;            hInfo->channel_position[0] = FRONT_CHANNEL_CENTER;            hInfo->channel_position[1] = FRONT_CHANNEL_LEFT;            hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT;            break;        case 4:            hInfo->num_front_channels = 3;            hInfo->num_back_channels = 1;            hInfo->channel_position[0] = FRONT_CHANNEL_CENTER;            hInfo->channel_position[1] = FRONT_CHANNEL_LEFT;            hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT;            hInfo->channel_position[3] = BACK_CHANNEL_CENTER;            break;        case 5:            hInfo->num_front_channels = 3;            hInfo->num_back_channels = 2;            hInfo->channel_position[0] = FRONT_CHANNEL_CENTER;            hInfo->channel_position[1] = FRONT_CHANNEL_LEFT;            hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT;            hInfo->channel_position[3] = BACK_CHANNEL_LEFT;            hInfo->channel_position[4] = BACK_CHANNEL_RIGHT;            break;        case 6:            hInfo->num_front_channels = 3;            hInfo->num_back_channels = 2;            hInfo->num_lfe_channels = 1;            hInfo->channel_position[0] = FRONT_CHANNEL_CENTER;            hInfo->channel_position[1] = FRONT_CHANNEL_LEFT;            hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT;            hInfo->channel_position[3] = BACK_CHANNEL_LEFT;            hInfo->channel_position[4] = BACK_CHANNEL_RIGHT;            hInfo->channel_position[5] = LFE_CHANNEL;            break;        case 7:            hInfo->num_front_channels = 3;            hInfo->num_side_channels = 2;            hInfo->num_back_channels = 2;            hInfo->num_lfe_channels = 1;            hInfo->channel_position[0] = FRONT_CHANNEL_CENTER;            hInfo->channel_position[1] = FRONT_CHANNEL_LEFT;            hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT;            hInfo->channel_position[3] = SIDE_CHANNEL_LEFT;            hInfo->channel_position[4] = SIDE_CHANNEL_RIGHT;            hInfo->channel_position[5] = BACK_CHANNEL_LEFT;            hInfo->channel_position[6] = BACK_CHANNEL_RIGHT;            hInfo->channel_position[7] = LFE_CHANNEL;            break;        default: /* channelConfiguration == 0 || channelConfiguration > 7 */            {                uint8_t i;                uint8_t ch = hDecoder->fr_channels - hDecoder->has_lfe;                if (ch & 1) /* there's either a center front or a center back channel */                {                    uint8_t ch1 = (ch-1)/2;                    if (hDecoder->first_syn_ele == ID_SCE)                    {                        hInfo->num_front_channels = ch1 + 1;                        hInfo->num_back_channels = ch1;                        hInfo->channel_position[0] = FRONT_CHANNEL_CENTER;                        for (i = 1; i <= ch1; i+=2)                        {                            hInfo->channel_position[i] = FRONT_CHANNEL_LEFT;                            hInfo->channel_position[i+1] = FRONT_CHANNEL_RIGHT;                        }                        for (i = ch1+1; i < ch; i+=2)                        {                            hInfo->channel_position[i] = BACK_CHANNEL_LEFT;                            hInfo->channel_position[i+1] = BACK_CHANNEL_RIGHT;                        }                    } else {                        hInfo->num_front_channels = ch1;                        hInfo->num_back_channels = ch1 + 1;                        for (i = 0; i < ch1; i+=2)                        {                            hInfo->channel_position[i] = FRONT_CHANNEL_LEFT;                            hInfo->channel_position[i+1] = FRONT_CHANNEL_RIGHT;                        }                        for (i = ch1; i < ch-1; i+=2)                        {                            hInfo->channel_position[i] = BACK_CHANNEL_LEFT;                            hInfo->channel_position[i+1] = BACK_CHANNEL_RIGHT;                        }                        hInfo->channel_position[ch-1] = BACK_CHANNEL_CENTER;                    }                } else {                    uint8_t ch1 = (ch)/2;                    hInfo->num_front_channels = ch1;                    hInfo->num_back_channels = ch1;                    if (ch1 & 1)                    {                        hInfo->channel_position[0] = FRONT_CHANNEL_CENTER;                        for (i = 1; i <= ch1; i+=2)                        {                            hInfo->channel_position[i] = FRONT_CHANNEL_LEFT;                            hInfo->channel_position[i+1] = FRONT_CHANNEL_RIGHT;                        }                        for (i = ch1+1; i < ch-1; i+=2)                        {                            hInfo->channel_position[i] = BACK_CHANNEL_LEFT;                            hInfo->channel_position[i+1] = BACK_CHANNEL_RIGHT;                        }                        hInfo->channel_position[ch-1] = BACK_CHANNEL_CENTER;                    } else {                        for (i = 0; i < ch1; i+=2)                        {                            hInfo->channel_position[i] = FRONT_CHANNEL_LEFT;                            hInfo->channel_position[i+1] = FRONT_CHANNEL_RIGHT;                        }                        for (i = ch1; i < ch; i+=2)                        {                            hInfo->channel_position[i] = BACK_CHANNEL_LEFT;                            hInfo->channel_position[i+1] = BACK_CHANNEL_RIGHT;                        }                    }                }                hInfo->num_lfe_channels = hDecoder->has_lfe;                for (i = ch; i < hDecoder->fr_channels; i++)                {                    hInfo->channel_position[i] = LFE_CHANNEL;                }

⌨️ 快捷键说明

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