📄 umc_aac_decoder_int.cpp
字号:
Byte_alignment(&BS); GET_BITS_COUNT(&BS, tmp_decodedBytes) tmp_decodedBytes >>= 3; nDecodedBytes = 0; result = aacdecGetFrame(inPointer + tmp_decodedBytes, &nDecodedBytes, (Ipp16s *)out->GetDataPointer(), state); nDecodedBytes += tmp_decodedBytes; aacdecGetSbrFlagPresent(&SbrFlagPresent, state); aacdecGetFrameSize(&frameSize, state); aacdecGetSampleFrequency(&freq, state); aacdecGetChannels(&ch, state); if ((0 == initSubtype) && (1 == SbrFlagPresent)) { initSubtype = 1; if (m_info.m_stream_subtype == AAC_MAIN_PROFILE) { m_info.m_stream_subtype = (UMC::AudioStreamSubType) (AAC_MAIN_PROFILE | AAC_HE_PROFILE); } else if (m_info.m_stream_subtype == AAC_LC_PROFILE) { m_info.m_stream_subtype = (UMC::AudioStreamSubType) (AAC_LC_PROFILE | AAC_HE_PROFILE); } else if (m_info.m_stream_subtype == AAC_SSR_PROFILE) { m_info.m_stream_subtype = (UMC::AudioStreamSubType) (AAC_SSR_PROFILE | AAC_HE_PROFILE); } else if (m_info.m_stream_subtype == AAC_LTP_PROFILE) { m_info.m_stream_subtype = (UMC::AudioStreamSubType) (AAC_LTP_PROFILE | AAC_HE_PROFILE); } } if (AAC_MPEG4_STREAM == m_info.m_init_stream_type) { in->MoveDataPointer(in->GetDataSize()); } else { in->MoveDataPointer(nDecodedBytes); } out->SetDataSize(frameSize * sizeof(short) * ch); if (pts_start < 0) pts_start = m_pts_prev; m_pts_prev = pts_end = pts_start + (1024.0 / (double)freq); in->SetTime(pts_end); out->SetTime(pts_start, pts_end); m_info.m_frame_number++; if (AAC_OK == result) { AudioData* pAudio = DynamicCast<AudioData,MediaData>(out); if (pAudio) { pAudio->m_info.bitPerSample = 16; pAudio->m_info.bitrate = 0; pAudio->m_info.channels = ch; pAudio->m_info.sample_frequency = freq; pAudio->m_info.stream_type = PCM_AUDIO; switch (pAudio->m_info.channels) { case 1: pAudio->m_info.channel_mask = CHANNEL_FRONT_CENTER; break; case 2: pAudio->m_info.channel_mask = CHANNEL_FRONT_LEFT; pAudio->m_info.channel_mask |= CHANNEL_FRONT_RIGHT; break; case 3: pAudio->m_info.channel_mask = CHANNEL_FRONT_CENTER; pAudio->m_info.channel_mask |= CHANNEL_FRONT_LEFT; pAudio->m_info.channel_mask |= CHANNEL_FRONT_RIGHT; break; case 4: pAudio->m_info.channel_mask = CHANNEL_FRONT_CENTER; pAudio->m_info.channel_mask |= CHANNEL_FRONT_LEFT; pAudio->m_info.channel_mask |= CHANNEL_FRONT_RIGHT; pAudio->m_info.channel_mask |= CHANNEL_LOW_FREQUENCY; break; case 5: pAudio->m_info.channel_mask = CHANNEL_FRONT_CENTER; pAudio->m_info.channel_mask |= CHANNEL_FRONT_LEFT; pAudio->m_info.channel_mask |= CHANNEL_FRONT_RIGHT; pAudio->m_info.channel_mask |= CHANNEL_BACK_LEFT; pAudio->m_info.channel_mask |= CHANNEL_BACK_RIGHT; break; case 6: pAudio->m_info.channel_mask = CHANNEL_FRONT_CENTER; pAudio->m_info.channel_mask |= CHANNEL_FRONT_LEFT; pAudio->m_info.channel_mask |= CHANNEL_FRONT_RIGHT; pAudio->m_info.channel_mask |= CHANNEL_BACK_LEFT; pAudio->m_info.channel_mask |= CHANNEL_BACK_RIGHT; pAudio->m_info.channel_mask |= CHANNEL_LOW_FREQUENCY; break; default: break; } } } return StatusAAC_2_UMC(result); }/********************************************************************/ AACDecoderInt::~AACDecoderInt() { Close(); }/********************************************************************/ Status AACDecoderInt::Close() { aacdecClose(state); state = NULL; return UMC_OK; }/********************************************************************/ Status AACDecoderInt::Reset() { aacdecReset(state); return UMC_OK; }/********************************************************************/ Status AACDecoderInt::GetInfo(BaseCodecParams * info) { if (!info) return UMC_NULL_PTR; AudioCodecParams *p_info = DynamicCast < AudioCodecParams, BaseCodecParams > (info); aacdecGetInfo(¶ms, state); info->m_SuggestedInputSize = params.m_SuggestedInputSize; if (params.is_valid) { p_info->m_info_in.bitPerSample = params.m_info_in.bitPerSample; p_info->m_info_out.bitPerSample = params.m_info_out.bitPerSample; p_info->m_info_in.channels = params.m_info_in.channels; p_info->m_info_out.channels = params.m_info_out.channels; p_info->m_info_in.stream_type = AAC_AUDIO; p_info->m_info_out.stream_type = PCM_AUDIO; p_info->m_info_in.sample_frequency = params.m_info_in.sample_frequency; p_info->m_info_out.sample_frequency = params.m_info_out.sample_frequency; p_info->m_frame_num = m_info.m_frame_number; p_info->m_info_in.bitrate = params.m_info_in.bitrate; p_info->m_info_out.bitrate = params.m_info_out.bitrate; p_info->m_info_in.stream_subtype = m_info.m_stream_subtype; switch (p_info->m_info_in.channels) { case 1: p_info->m_info_in.channel_mask = CHANNEL_FRONT_CENTER; break; case 2: p_info->m_info_in.channel_mask = CHANNEL_FRONT_LEFT; p_info->m_info_in.channel_mask |= CHANNEL_FRONT_RIGHT; break; case 3: p_info->m_info_in.channel_mask = CHANNEL_FRONT_CENTER; p_info->m_info_in.channel_mask |= CHANNEL_FRONT_LEFT; p_info->m_info_in.channel_mask |= CHANNEL_FRONT_RIGHT; break; case 4: p_info->m_info_in.channel_mask = CHANNEL_FRONT_CENTER; p_info->m_info_in.channel_mask |= CHANNEL_FRONT_LEFT; p_info->m_info_in.channel_mask |= CHANNEL_FRONT_RIGHT; p_info->m_info_in.channel_mask |= CHANNEL_LOW_FREQUENCY; break; case 5: p_info->m_info_in.channel_mask = CHANNEL_FRONT_CENTER; p_info->m_info_in.channel_mask |= CHANNEL_FRONT_LEFT; p_info->m_info_in.channel_mask |= CHANNEL_FRONT_RIGHT; p_info->m_info_in.channel_mask |= CHANNEL_BACK_LEFT; p_info->m_info_in.channel_mask |= CHANNEL_BACK_RIGHT; break; case 6: p_info->m_info_in.channel_mask = CHANNEL_FRONT_CENTER; p_info->m_info_in.channel_mask |= CHANNEL_FRONT_LEFT; p_info->m_info_in.channel_mask |= CHANNEL_FRONT_RIGHT; p_info->m_info_in.channel_mask |= CHANNEL_BACK_LEFT; p_info->m_info_in.channel_mask |= CHANNEL_BACK_RIGHT; p_info->m_info_in.channel_mask |= CHANNEL_LOW_FREQUENCY; break; default: break; } p_info->m_info_out.channel_mask = p_info->m_info_in.channel_mask; } return UMC_OK; }/********************************************************************/ Status AACDecoderInt::GetDuration(float *p_duration) { aacdecGetDuration(p_duration, state); return UMC_OK; }/********************************************************************/ Status AACDecoderInt::StatusAAC_2_UMC(AACStatus st) { Status res; if (st == AAC_OK) res = UMC_OK; else if (st == AAC_NOT_ENOUGH_DATA) res = UMC_NOT_ENOUGH_DATA; else if (st == AAC_BAD_FORMAT) res = UMC_BAD_FORMAT; else if (st == AAC_ALLOC) res = UMC_ALLOC; else if (st == AAC_BAD_STREAM) res = UMC_BAD_STREAM; else if (st == AAC_NULL_PTR) res = UMC_NULL_PTR; else if (st == AAC_NOT_FIND_SYNCWORD) res = UMC_NOT_FIND_SYNCWORD; else if (st == AAC_UNSUPPORTED) res = UMC_UNSUPPORTED; else if (st == AAC_BAD_PARAMETER) res = UMC_UNSUPPORTED; else res = UMC_UNSUPPORTED; return res; }}; // namespace UMC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -