sst: add AAC decoding routines
diff --git a/sst/sst.cpp b/sst/sst.cpp
index f80232b..d07833a 100644
--- a/sst/sst.cpp
+++ b/sst/sst.cpp
@@ -261,7 +261,7 @@
aacportdefinition.bEnabled = OMX_TRUE;
aacportdefinition.bPopulated = OMX_FALSE;
aacportdefinition.eDomain = OMX_PortDomainAudio;
- aacportdefinition.format.audio.cMIMEType = "audio/mpeg";
+ aacportdefinition.format.audio.cMIMEType = (char *)"audio/mp4";
aacportdefinition.format.audio.pNativeRender = NULL;
aacportdefinition.format.audio.bFlagErrorConcealment = OMX_FALSE;
aacportdefinition.format.audio.eEncoding = OMX_AUDIO_CodingAAC;
@@ -870,18 +870,19 @@
if (coding_type == OMX_AUDIO_CodingMP3)
mret = ChangeAcpWithConfigHeader(mixio->data, &acp_changed);
- /*
else if (coding_type == OMX_AUDIO_CodingAAC) {
- ;
+ if (buffers[INPORT_INDEX]->nFlags & OMX_BUFFERFLAG_CODECCONFIG)
+ mret = ChangeAcpWithConfigHeader(mixio->data, &acp_changed);
+ else
+ mret = MIX_RESULT_SUCCESS;
}
- */
else {
LOGE("%s(),%d: exit, unknown coding type (0x%08x)\n",
__func__, __LINE__, coding_type);
- return;
+ mret = MIX_RESULT_FAIL;
}
- if (mret) {
+ if (!MIX_SUCCEEDED(mret)) {
LOGE("%s(),%d: exit, ret == 0x%08x\n", __func__, __LINE__, mret);
return;
}
@@ -914,6 +915,12 @@
}
if (codec_mode == MIX_CODING_DECODE) {
+ if (buffers[INPORT_INDEX]->nFlags & OMX_BUFFERFLAG_CODECCONFIG) {
+ outfilledlen = 0;
+ outtimestamp = 0;
+ goto out;
+ }
+
mret = mix_audio_decode(mix, (const MixIOVec *)mixio, 1, NULL, NULL);
if (!MIX_SUCCEEDED(mret)) {
LOGV("_decode returns fail. Error code:0x%08x", mret);
@@ -927,6 +934,7 @@
}
*/
+out:
buffers[OUTPORT_INDEX]->nFilledLen = outfilledlen;
buffers[OUTPORT_INDEX]->nTimeStamp = outtimestamp;
@@ -1055,6 +1063,63 @@
return MIX_RESULT_SUCCESS;
}
+static inline MIX_RESULT __AacChangeAcpWithConfigHeader(
+ MixAudioConfigParams *acp, const unsigned char *buffer, bool *acp_changed)
+{
+ int aot, frequency, channel;
+ int ret;
+
+ if (!acp_changed)
+ return MIX_RESULT_FAIL;
+
+ ret = audio_specific_config_parse(buffer,
+ &aot, &frequency, &channel);
+ if (ret)
+ return MIX_RESULT_FAIL;
+
+ if (aot < 1 || aot > 4)
+ return MIX_RESULT_FAIL;
+
+ if (MIX_ACP_NUM_CHANNELS(acp) != channel) {
+ LOGV("%s(): channel : %d != %d\n", __func__, MIX_ACP_NUM_CHANNELS(acp),
+ channel);
+
+ MIX_ACP_NUM_CHANNELS(acp) = channel;
+ *acp_changed = true;
+ }
+
+ if (MIX_ACP_SAMPLE_FREQ(acp) != frequency) {
+ LOGV("%s(): samplingrate : %d != %d\n", __func__,
+ MIX_ACP_SAMPLE_FREQ(acp), frequency);
+
+ MIX_ACP_SAMPLE_FREQ(acp) = frequency;
+ *acp_changed = true;
+ }
+
+ /* 0:MPEG-2, 1:MPEG-4 */
+ MIX_ACP_AAC_MPEG_FORMAT(acp) = 0;
+ MIX_ACP_AAC_CRC(acp) = 0; /* 0:disabled, 1:enabled */
+ MIX_ACP_AAC_AOT(acp) = aot; /* 1:Main, 2:LC, 3:SSR, 4:SBR */
+ mix_acp_aac_set_bit_stream_format(MIX_AUDIOCONFIGPARAMSAAC(acp),
+ MIX_AAC_BS_RAW);
+ /* 0:Main, 1:LC, 2:SSR, 3:SBR */
+ mix_acp_aac_set_aac_profile(MIX_AUDIOCONFIGPARAMSAAC(acp),
+ (MixAACProfile)(aot - 1));
+ /* 0:CBR, 1:VBR */
+ mix_acp_aac_set_bit_rate_type(MIX_AUDIOCONFIGPARAMSAAC(acp),
+ (MixACPBitrateType)0);
+
+ if (*acp_changed) {
+ LOGV("%s(): audio configration parameter has been chagned\n",
+ __func__);
+ LOGV("%s(): aot : %d\n", __func__, MIX_ACP_AAC_AOT(acp));
+ LOGV("%s(): frequency : %d\n", __func__, MIX_ACP_SAMPLE_FREQ(acp));
+ LOGV("%s(): channel : %d\n", __func__, MIX_ACP_NUM_CHANNELS(acp));
+ }
+
+ return MIX_RESULT_SUCCESS;
+}
+
MIX_RESULT MrstSstComponent::ChangeAcpWithConfigHeader(
const unsigned char *buffer,
bool *acp_changed)
@@ -1063,10 +1128,8 @@
if (coding_type == OMX_AUDIO_CodingMP3)
ret = __Mp3ChangeAcpWithConfigHeader(acp, buffer, acp_changed);
- /*
else if (coding_type == OMX_AUDIO_CodingAAC)
ret = __AacChangeAcpWithConfigHeader(acp, buffer, acp_changed);
- */
else
return -1;
@@ -1087,7 +1150,7 @@
static const OMX_STRING g_roles[] =
{
"audio_decoder.mp3",
- //"audio_decoder.aac",
+ "audio_decoder.aac",
};
static const OMX_STRING g_compname = "OMX.Intel.MrstSST";
diff --git a/sst/sst.h b/sst/sst.h
index 2c62ddc..9e852c1 100644
--- a/sst/sst.h
+++ b/sst/sst.h
@@ -95,9 +95,9 @@
const static OMX_U32 OUTPORT_MP3_ACTUAL_BUFFER_COUNT = 2;
const static OMX_U32 OUTPORT_MP3_MIN_BUFFER_COUNT = 1;
const static OMX_U32 OUTPORT_MP3_BUFFER_SIZE = 1024;
- const static OMX_U32 INPORT_AAC_ACTUAL_BUFFER_COUNT = 2;
+ const static OMX_U32 INPORT_AAC_ACTUAL_BUFFER_COUNT = 5;
const static OMX_U32 INPORT_AAC_MIN_BUFFER_COUNT = 1;
- const static OMX_U32 INPORT_AAC_BUFFER_SIZE = 1024;
+ const static OMX_U32 INPORT_AAC_BUFFER_SIZE = 4096;
const static OMX_U32 OUTPORT_AAC_ACTUAL_BUFFER_COUNT = 2;
const static OMX_U32 OUTPORT_AAC_MIN_BUFFER_COUNT = 1;
const static OMX_U32 OUTPORT_AAC_BUFFER_SIZE = 1024;