📄 ac3_dec_api_fp.c
字号:
*decodedBytes >>= 3;
} else {
*decodedBytes = state->syncinfo.frame_size * 2;
}
state->m_frame_number++;
return AC3_OK;
}
/********************************************************************/
AC3Status GetSynch(sBitsreamBuffer *pBS,
Ipp32s inDataSize)
{
Ipp32s syncw, tmp;
inDataSize *= 8;
GET_BITS_COUNT(pBS, tmp)
tmp = inDataSize - tmp;
if (tmp < 16)
return AC3_NOT_FIND_SYNCWORD;
GET_BITS(pBS, syncw, 16, Ipp32s)
for (;;) {
if ((syncw & 0xffff) == 0x0b77)
break;
GET_BITS_COUNT(pBS, tmp)
tmp = inDataSize - tmp;
if (tmp < 8)
return AC3_NOT_FIND_SYNCWORD;
GET_BITS(pBS, tmp, 8, Ipp32s)
syncw = (syncw << 8) | tmp;
}
return AC3_OK;
}
/********************************************************************/
AC3Status ac3decSetOutAcmod(Ipp32s out_acmod,
AC3Dec *state)
{
if (!state)
return AC3_NULL_PTR;
if ((out_acmod < 0) || (out_acmod > 8))
return AC3_FLAGS_ERROR;
state->as_input = 0;
if (8 == out_acmod) {
state->as_input = 1;
state->out_acmod = 7; /* Doesn't matter */
} else {
state->out_acmod = out_acmod;
}
state->nChannelOut = NFCHANS[state->out_acmod] +
state->outlfeon;
return AC3_OK;
}
/********************************************************************/
AC3Status ac3decSetOuLfeOn(Ipp32s outlfeon,
AC3Dec *state)
{
if (!state)
return AC3_NULL_PTR;
if ((outlfeon < 0) || (outlfeon > 1))
return AC3_FLAGS_ERROR;
state->outlfeon = outlfeon;
state->nChannelOut = NFCHANS[state->out_acmod] +
state->outlfeon;
return AC3_OK;
}
/********************************************************************/
AC3Status ac3decSetDualMonoMode(Ipp32s dualmonomode,
AC3Dec *state)
{
if (!state)
return AC3_NULL_PTR;
if ((dualmonomode < 0) || (dualmonomode > 3))
return AC3_FLAGS_ERROR;
state->dualmonomode = dualmonomode;
return AC3_OK;
}
/********************************************************************/
AC3Status ac3decSetDrcScaleLow(Ipp32f drc_scaleLow,
AC3Dec *state)
{
if (!state)
return AC3_NULL_PTR;
if ((drc_scaleLow < 0) || (drc_scaleLow > 1))
return AC3_FLAGS_ERROR;
state->drc_scaleLow = drc_scaleLow;
return AC3_OK;
}
/********************************************************************/
AC3Status ac3decSetDrcScaleHigh(Ipp32f drc_scaleHigh,
AC3Dec *state)
{
if (!state)
return AC3_NULL_PTR;
if ((drc_scaleHigh < 0) || (drc_scaleHigh > 1))
return AC3_FLAGS_ERROR;
state->drc_scaleHigh = drc_scaleHigh;
return AC3_OK;
}
/********************************************************************/
AC3Status ac3decSetOutCompMod(Ipp32s out_compmod,
AC3Dec *state)
{
if (!state)
return AC3_NULL_PTR;
if ((out_compmod < 0) || (out_compmod > 3))
return AC3_FLAGS_ERROR;
state->out_compmod = out_compmod;
return AC3_OK;
}
/********************************************************************/
AC3Status ac3decSetKaraokeCapable(Ipp32s karaokeCapable,
AC3Dec *state)
{
if (!state)
return AC3_NULL_PTR;
if ((karaokeCapable < -1) || (karaokeCapable > 3))
return AC3_FLAGS_ERROR;
state->karaokeCapable = karaokeCapable;
return AC3_OK;
}
/********************************************************************/
AC3Status ac3decSetCrcMute(Ipp32s crc_mute,
AC3Dec *state)
{
if (!state)
return AC3_NULL_PTR;
if ((crc_mute < 0) || (crc_mute > 1))
return AC3_FLAGS_ERROR;
state->crc_mute = crc_mute;
return AC3_OK;
}
/********************************************************************/
AC3Status ac3decSetGainScale(Ipp32f gainScale,
AC3Dec *state)
{
if (!state)
return AC3_NULL_PTR;
if (gainScale < 0)
return AC3_FLAGS_ERROR;
state->gainScale = gainScale;
return AC3_OK;
}
/********************************************************************/
AC3Status ac3decGetNumChannelOut(Ipp32s *nChannelOut,
AC3Dec *state)
{
if (!state)
return AC3_NULL_PTR;
*nChannelOut = state->nChannelOut;
return AC3_OK;
}
/********************************************************************/
AC3Status ac3decGetSampleFrequency(Ipp32s *SampleRate,
AC3Dec *state)
{
if (!state)
return AC3_NULL_PTR;
*SampleRate = state->syncinfo.SampleRate;
return AC3_OK;
}
/********************************************************************/
AC3Status ac3decGetInfo(cAudioCodecParams *a_info,
AC3Dec *state)
{
if (!a_info)
return AC3_NULL_PTR;
a_info->m_SuggestedInputSize = AC3_FRAME_SIZE;
a_info->m_SuggestedOutputSize = 6 * (256 * 6) * sizeof(Ipp16s);
a_info->m_info_in.stream_type = AC3_AUD;
a_info->m_info_out.stream_type = PCM_AUD;
a_info->m_info_in.channels = state->nChannelOut;
a_info->m_info_out.channels = state->nChannelOut;
a_info->is_valid = 0;
if (!state)
return AC3_OK;
if (state->m_frame_number > 0) {
a_info->m_info_in.bitPerSample = 0;
a_info->m_info_out.bitPerSample = 16;
a_info->m_info_in.bitrate = state->syncinfo.bit_rate * 1000;
a_info->m_info_out.bitrate = 0;
a_info->m_info_in.sample_frequency = state->syncinfo.SampleRate;
a_info->m_info_out.sample_frequency = state->syncinfo.SampleRate;
a_info->m_frame_num = state->m_frame_number;
a_info->is_valid = 1;
switch (state->bsi.acmod) {
case ACMOD_0:
a_info->m_info_in.channel_mask = AC3_CHANNEL_FRONT_LEFT;
a_info->m_info_in.channel_mask |= AC3_CHANNEL_FRONT_RIGHT;
break;
case ACMOD_10:
a_info->m_info_in.channel_mask = AC3_CHANNEL_FRONT_CENTER;
break;
case ACMOD_20:
a_info->m_info_in.channel_mask = AC3_CHANNEL_FRONT_LEFT;
a_info->m_info_in.channel_mask |= AC3_CHANNEL_FRONT_RIGHT;
break;
case ACMOD_30:
a_info->m_info_in.channel_mask = AC3_CHANNEL_FRONT_CENTER;
a_info->m_info_in.channel_mask |= AC3_CHANNEL_FRONT_LEFT;
a_info->m_info_in.channel_mask |= AC3_CHANNEL_FRONT_RIGHT;
break;
case ACMOD_21:
a_info->m_info_in.channel_mask |= AC3_CHANNEL_FRONT_LEFT;
a_info->m_info_in.channel_mask |= AC3_CHANNEL_FRONT_RIGHT;
a_info->m_info_in.channel_mask |= AC3_CHANNEL_BACK_CENTER;
break;
case ACMOD_31:
a_info->m_info_in.channel_mask = AC3_CHANNEL_FRONT_CENTER;
a_info->m_info_in.channel_mask |= AC3_CHANNEL_FRONT_LEFT;
a_info->m_info_in.channel_mask |= AC3_CHANNEL_FRONT_RIGHT;
a_info->m_info_in.channel_mask |= AC3_CHANNEL_BACK_CENTER;
break;
case ACMOD_22:
a_info->m_info_in.channel_mask |= AC3_CHANNEL_FRONT_LEFT;
a_info->m_info_in.channel_mask |= AC3_CHANNEL_FRONT_RIGHT;
a_info->m_info_in.channel_mask |= AC3_CHANNEL_BACK_LEFT;
a_info->m_info_in.channel_mask |= AC3_CHANNEL_BACK_RIGHT;
break;
case ACMOD_32:
a_info->m_info_in.channel_mask = AC3_CHANNEL_FRONT_CENTER;
a_info->m_info_in.channel_mask |= AC3_CHANNEL_FRONT_LEFT;
a_info->m_info_in.channel_mask |= AC3_CHANNEL_FRONT_RIGHT;
a_info->m_info_in.channel_mask |= AC3_CHANNEL_BACK_LEFT;
a_info->m_info_in.channel_mask |= AC3_CHANNEL_BACK_RIGHT;
break;
default:
break;
}
if (state->bsi.lfeon) {
a_info->m_info_in.channel_mask |= AC3_CHANNEL_LOW_FREQUENCY;
}
switch (state->out_acmod) {
case ACMOD_0:
a_info->m_info_out.channel_mask = AC3_CHANNEL_FRONT_LEFT;
a_info->m_info_out.channel_mask |= AC3_CHANNEL_FRONT_RIGHT;
break;
case ACMOD_10:
a_info->m_info_out.channel_mask = AC3_CHANNEL_FRONT_CENTER;
break;
case ACMOD_20:
a_info->m_info_out.channel_mask = AC3_CHANNEL_FRONT_LEFT;
a_info->m_info_out.channel_mask |= AC3_CHANNEL_FRONT_RIGHT;
break;
case ACMOD_30:
a_info->m_info_out.channel_mask = AC3_CHANNEL_FRONT_CENTER;
a_info->m_info_out.channel_mask |= AC3_CHANNEL_FRONT_LEFT;
a_info->m_info_out.channel_mask |= AC3_CHANNEL_FRONT_RIGHT;
break;
case ACMOD_21:
a_info->m_info_out.channel_mask |= AC3_CHANNEL_FRONT_LEFT;
a_info->m_info_out.channel_mask |= AC3_CHANNEL_FRONT_RIGHT;
a_info->m_info_out.channel_mask |= AC3_CHANNEL_BACK_CENTER;
break;
case ACMOD_31:
a_info->m_info_out.channel_mask = AC3_CHANNEL_FRONT_CENTER;
a_info->m_info_out.channel_mask |= AC3_CHANNEL_FRONT_LEFT;
a_info->m_info_out.channel_mask |= AC3_CHANNEL_FRONT_RIGHT;
a_info->m_info_out.channel_mask |= AC3_CHANNEL_BACK_CENTER;
break;
case ACMOD_22:
a_info->m_info_out.channel_mask |= AC3_CHANNEL_FRONT_LEFT;
a_info->m_info_out.channel_mask |= AC3_CHANNEL_FRONT_RIGHT;
a_info->m_info_out.channel_mask |= AC3_CHANNEL_BACK_LEFT;
a_info->m_info_out.channel_mask |= AC3_CHANNEL_BACK_RIGHT;
break;
case ACMOD_32:
a_info->m_info_out.channel_mask = AC3_CHANNEL_FRONT_CENTER;
a_info->m_info_out.channel_mask |= AC3_CHANNEL_FRONT_LEFT;
a_info->m_info_out.channel_mask |= AC3_CHANNEL_FRONT_RIGHT;
a_info->m_info_out.channel_mask |= AC3_CHANNEL_BACK_LEFT;
a_info->m_info_out.channel_mask |= AC3_CHANNEL_BACK_RIGHT;
break;
default:
break;
}
if (state->outlfeon) {
a_info->m_info_out.channel_mask |= AC3_CHANNEL_LOW_FREQUENCY;
}
}
return AC3_OK;
}
/********************************************************************/
AC3Status ac3decGetDuration(Ipp32f *p_duration,
AC3Dec *state)
{
Ipp32f duration;
duration = (Ipp32f)(state->m_frame_number) * 6 * 256;
*p_duration = duration / (Ipp32f)(state->syncinfo.SampleRate);
return AC3_OK;
}
/********************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -