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;