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

📄 specrec.c

📁 这是著名的TCPMP播放器在WINDWOWS,和WINCE下编译通过的源程序.笔者对其中的LIBMAD库做了针对ARM MPU的优化. 并增加了词幕功能.
💻 C
📖 第 1 页 / 共 4 页
字号:
    count = faad_get_ts() - count;
    hDecoder->requant_cycles += count;
#endif


    /* pns decoding */
    pns_decode(ics, NULL, hDecoder->frameLength, 0, hDecoder->object_type);

#ifdef MAIN_DEC
    /* MAIN object type prediction */
    if (hDecoder->object_type == MAIN)
    {
        /* intra channel prediction */
        ic_prediction(ics, hDecoder->pred_stat[channel], hDecoder->frameLength,
            hDecoder->sf_index);

        /* In addition, for scalefactor bands coded by perceptual
           noise substitution the predictors belonging to the
           corresponding spectral coefficients are reset.
        */
        pns_reset_pred_state(ics, hDecoder->pred_stat[channel]);
    }
#endif

#ifdef LTP_DEC
    if (is_ltp_ot(hDecoder->object_type))
    {
#ifdef LD_DEC
        if (hDecoder->object_type == LD)
        {
            if (ics->ltp.data_present)
            {
                if (ics->ltp.lag_update)
                    hDecoder->ltp_lag[channel] = ics->ltp.lag;
            }
            ics->ltp.lag = hDecoder->ltp_lag[channel];
        }
#endif

        /* long term prediction */
        lt_prediction(ics, &(ics->ltp), hDecoder->lt_pred_stat[channel], hDecoder->fb,
            ics->window_shape, hDecoder->window_shape_prev[channel],
            hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength);
    }
#endif

    /* tns decoding */
    tns_decode_frame(ics, &(ics->tns), hDecoder->sf_index, hDecoder->object_type,
        hDecoder->frameLength);

    /* drc decoding */
    if (hDecoder->drc->present)
    {
        if (!hDecoder->drc->exclude_mask[channel] || !hDecoder->drc->excluded_chns_present)
            drc_decode(hDecoder->drc, ics->buffer);
    }

    /* filter bank */
#ifdef SSR_DEC
    if (hDecoder->object_type != SSR)
    {
#endif
#ifdef LIBPAAC
        hDecoder->Lib.Filter(&hDecoder->Lib, ics->window_sequence, ics->window_shape,
            hDecoder->window_shape_prev[channel], 
            hDecoder->time_out[channel], hDecoder->fb_intermed[channel], hDecoder->d.buffer);
#else
        ifilter_bank(hDecoder->fb, ics->window_sequence, ics->window_shape,
            hDecoder->window_shape_prev[channel], ics->buffer,
            hDecoder->time_out[channel], hDecoder->fb_intermed[channel], hDecoder->d.buffer,
            hDecoder->object_type, hDecoder->frameLength);
#endif
#ifdef SSR_DEC
    } else {
        ssr_decode(&(ics->ssr), hDecoder->fb, ics->window_sequence, ics->window_shape,
            hDecoder->window_shape_prev[channel], ics->buffer, hDecoder->time_out[channel],
            hDecoder->ssr_overlap[channel], hDecoder->ipqf_buffer[channel], hDecoder->prev_fmd[channel],
            hDecoder->frameLength);
    }
#endif

    /* save window shape for next frame */
    hDecoder->window_shape_prev[channel] = ics->window_shape;

#ifdef LTP_DEC
    if (is_ltp_ot(hDecoder->object_type))
    {
        lt_update_state(hDecoder->lt_pred_stat[channel], hDecoder->time_out[channel],
            hDecoder->fb_intermed[channel], hDecoder->frameLength, hDecoder->object_type);
    }
#endif

#ifdef SBR_DEC
    if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1))
        && hDecoder->sbr_alloced[hDecoder->fr_ch_ele])
    {
		retval = safestack(sbrDecode,hDecoder,ics,&hDecoder->stack);
        if (retval > 0)
            return retval;
    } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1))
        && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele])
    {
        return 23;
    }
#endif

    /* copy L to R when no PS is used */
#if (defined(PS_DEC) || defined(DRM_PS))
    if ((hDecoder->ps_used[hDecoder->fr_ch_ele] == 0) &&
        (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2))
    {
        uint8_t ele = hDecoder->fr_ch_ele;
        uint16_t frame_size = (hDecoder->sbr_alloced[ele]) ? 2 : 1;
        frame_size *= hDecoder->frameLength*sizeof(real_t);

        memcpy(hDecoder->time_out[channel+1], hDecoder->time_out[channel], frame_size);
    }
#endif

    return 0;
}

uint8_t reconstruct_channel_pair(NeAACDecHandle hDecoder, ic_stream *ics1, ic_stream *ics2)
{
    uint8_t retval;
	uint8_t channel = hDecoder->channel;
	uint8_t paired_channel = hDecoder->paired_channel;

#ifdef PROFILE
    int64_t count = faad_get_ts();
#endif

    if (hDecoder->element_alloced[hDecoder->fr_ch_ele] == 0)
    {
        retval = allocate_channel_pair(hDecoder, channel, paired_channel);
        if (retval > 0)
            return retval;

        hDecoder->element_alloced[hDecoder->fr_ch_ele] = 1;
    }

	ics1->buffer = hDecoder->time_out[channel];
	ics2->buffer = hDecoder->time_out[paired_channel];

    /* dequantisation and scaling */
    retval = quant_to_spec(hDecoder, ics1, hDecoder->d.spec_data[0], hDecoder->frameLength);
    if (retval > 0)
        return retval;
    retval = quant_to_spec(hDecoder, ics2, hDecoder->d.spec_data[1], hDecoder->frameLength);
    if (retval > 0)
        return retval;

#ifdef PROFILE
    count = faad_get_ts() - count;
    hDecoder->requant_cycles += count;
#endif


    /* pns decoding */
    if (ics1->ms_mask_present)
    {
        pns_decode(ics1, ics2, hDecoder->frameLength, 1, hDecoder->object_type);
    } else {
        pns_decode(ics1, NULL, hDecoder->frameLength, 0, hDecoder->object_type);
        pns_decode(ics2, NULL, hDecoder->frameLength, 0, hDecoder->object_type);
    }

    /* mid/side decoding */
    ms_decode(ics1, ics2, hDecoder->frameLength);

#if 0
    {
        int i;
        for (i = 0; i < 1024; i++)
        {
            //printf("%d\n", ics1->buffer[i]);
            printf("0x%.8X\n", ics1->buffer[i]);
        }
        for (i = 0; i < 1024; i++)
        {
            //printf("%d\n", ics2->buffer[i]);
            printf("0x%.8X\n", ics2->buffer[i]);
        }
    }
#endif

    /* intensity stereo decoding */
    is_decode(ics1, ics2, hDecoder->frameLength);

#if 0
    {
        int i;
        for (i = 0; i < 1024; i++)
        {
            printf("%d\n", ics1->buffer[i]);
            //printf("0x%.8X\n", ics1->buffer[i]);
        }
        for (i = 0; i < 1024; i++)
        {
            printf("%d\n", ics2->buffer[i]);
            //printf("0x%.8X\n", ics2->buffer[i]);
        }
    }
#endif

#ifdef MAIN_DEC
    /* MAIN object type prediction */
    if (hDecoder->object_type == MAIN)
    {
        /* intra channel prediction */
        ic_prediction(ics1, hDecoder->pred_stat[channel], hDecoder->frameLength,
            hDecoder->sf_index);
        ic_prediction(ics2, hDecoder->pred_stat[paired_channel], hDecoder->frameLength,
            hDecoder->sf_index);

        /* In addition, for scalefactor bands coded by perceptual
           noise substitution the predictors belonging to the
           corresponding spectral coefficients are reset.
        */
        pns_reset_pred_state(ics1, hDecoder->pred_stat[channel]);
        pns_reset_pred_state(ics2, hDecoder->pred_stat[paired_channel]);
    }
#endif

#ifdef LTP_DEC
    if (is_ltp_ot(hDecoder->object_type))
    {
        ltp_info *ltp1 = &(ics1->ltp);
        ltp_info *ltp2 = (hDecoder->common_window) ? &(ics2->ltp2) : &(ics2->ltp);
#ifdef LD_DEC
        if (hDecoder->object_type == LD)
        {
            if (ltp1->data_present)
            {
                if (ltp1->lag_update)
                    hDecoder->ltp_lag[channel] = ltp1->lag;
            }
            ltp1->lag = hDecoder->ltp_lag[channel];
            if (ltp2->data_present)
            {
                if (ltp2->lag_update)
                    hDecoder->ltp_lag[paired_channel] = ltp2->lag;
            }
            ltp2->lag = hDecoder->ltp_lag[paired_channel];
        }
#endif

        /* long term prediction */
        lt_prediction(ics1, ltp1, hDecoder->lt_pred_stat[channel], hDecoder->fb,
            ics1->window_shape, hDecoder->window_shape_prev[channel],
            hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength);
        lt_prediction(ics2, ltp2, hDecoder->lt_pred_stat[paired_channel], hDecoder->fb,
            ics2->window_shape, hDecoder->window_shape_prev[paired_channel],
            hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength);
    }
#endif

    /* tns decoding */
    tns_decode_frame(ics1, &(ics1->tns), hDecoder->sf_index, hDecoder->object_type,
        hDecoder->frameLength);
    tns_decode_frame(ics2, &(ics2->tns), hDecoder->sf_index, hDecoder->object_type,
        hDecoder->frameLength);

    /* drc decoding */
    if (hDecoder->drc->present)
    {
        if (!hDecoder->drc->exclude_mask[channel] || !hDecoder->drc->excluded_chns_present)
            drc_decode(hDecoder->drc, ics1->buffer);
        if (!hDecoder->drc->exclude_mask[paired_channel] || !hDecoder->drc->excluded_chns_present)
            drc_decode(hDecoder->drc, ics1->buffer);
    }

    /* filter bank */
#ifdef SSR_DEC
    if (hDecoder->object_type != SSR)
    {
#endif
#ifdef LIBPAAC
        hDecoder->Lib.Filter(&hDecoder->Lib, ics1->window_sequence, ics1->window_shape,
            hDecoder->window_shape_prev[channel],
            hDecoder->time_out[channel], hDecoder->fb_intermed[channel], hDecoder->d.buffer);
        hDecoder->Lib.Filter(&hDecoder->Lib, ics2->window_sequence, ics2->window_shape,
            hDecoder->window_shape_prev[paired_channel], 
            hDecoder->time_out[paired_channel], hDecoder->fb_intermed[paired_channel], hDecoder->d.buffer);
#else
        ifilter_bank(hDecoder->fb, ics1->window_sequence, ics1->window_shape,
            hDecoder->window_shape_prev[channel], ics1->buffer,
            hDecoder->time_out[channel], hDecoder->fb_intermed[channel], hDecoder->d.buffer,
            hDecoder->object_type, hDecoder->frameLength);
        ifilter_bank(hDecoder->fb, ics2->window_sequence, ics2->window_shape,
            hDecoder->window_shape_prev[paired_channel], ics2->buffer,
            hDecoder->time_out[paired_channel], hDecoder->fb_intermed[paired_channel], hDecoder->d.buffer,
            hDecoder->object_type, hDecoder->frameLength);
#endif
#ifdef SSR_DEC
    } else {
        ssr_decode(&(ics1->ssr), hDecoder->fb, ics1->window_sequence, ics1->window_shape,
            hDecoder->window_shape_prev[channel], ics1->buffer, hDecoder->time_out[channel],
            hDecoder->ssr_overlap[channel], hDecoder->ipqf_buffer[channel],
            hDecoder->prev_fmd[channel], hDecoder->frameLength);
        ssr_decode(&(ics2->ssr), hDecoder->fb, ics2->window_sequence, ics2->window_shape,
            hDecoder->window_shape_prev[paired_channel], ics2->buffer, hDecoder->time_out[paired_channel],
            hDecoder->ssr_overlap[paired_channel], hDecoder->ipqf_buffer[paired_channel],
            hDecoder->prev_fmd[paired_channel], hDecoder->frameLength);
    }
#endif

    /* save window shape for next frame */
    hDecoder->window_shape_prev[channel] = ics1->window_shape;
    hDecoder->window_shape_prev[paired_channel] = ics2->window_shape;

#ifdef LTP_DEC
    if (is_ltp_ot(hDecoder->object_type))
    {
        lt_update_state(hDecoder->lt_pred_stat[channel], hDecoder->time_out[channel],
            hDecoder->fb_intermed[channel], hDecoder->frameLength, hDecoder->object_type);
        lt_update_state(hDecoder->lt_pred_stat[paired_channel], hDecoder->time_out[paired_channel],
            hDecoder->fb_intermed[paired_channel], hDecoder->frameLength, hDecoder->object_type);
    }
#endif

#ifdef SBR_DEC
    if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1))
        && hDecoder->sbr_alloced[hDecoder->fr_ch_ele])
    {
		retval = safestack(sbrDecodeCouple,hDecoder,ics1,&hDecoder->stack);
        if (retval > 0)
            return retval;
    } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1))
        && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele])
    {
        return 23;
    }
#endif

    return 0;
}

⌨️ 快捷键说明

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