📄 decoder.c
字号:
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 DRM
int8_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;
}
#endif
void 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 + -