sst: add aac port feature
diff --git a/sst/sst.cpp b/sst/sst.cpp
index aedf736..2a26b82 100644
--- a/sst/sst.cpp
+++ b/sst/sst.cpp
@@ -51,6 +51,8 @@
if (!strcmp(GetWorkingRole(), "audio_decoder.mp3"))
ret = __AllocateMp3RolePorts(false);
+ else if(!strcmp(GetWorkingRole(), "audio_decoder.aac"))
+ ret = __AllocateAacRolePorts(false);
LOGV("%s(): exit (ret = 0x%08x)\n", __func__, ret);
return ret;
@@ -119,6 +121,69 @@
return ret;
}
+
+OMX_ERRORTYPE MrstSstComponent::__AllocateAacRolePorts(bool isencoder)
+{
+ PortBase **ports;
+
+ OMX_U32 aac_port_index, pcm_port_index;
+ OMX_DIRTYPE aac_port_dir, pcm_port_dir;
+
+ OMX_PORT_PARAM_TYPE portparam;
+ OMX_U32 i;
+ OMX_ERRORTYPE ret;
+
+ LOGV("%s(): enter\n", __func__);
+
+ ports = new PortBase *[NR_PORTS];
+ if (!ports)
+ return OMX_ErrorInsufficientResources;
+ this->nr_ports = NR_PORTS;
+ this->ports = ports;
+
+ if (isencoder) {
+ pcm_port_index = INPORT_INDEX;
+ aac_port_index = OUTPORT_INDEX;
+ pcm_port_dir = OMX_DirInput;
+ aac_port_dir = OMX_DirOutput;
+ }
+ else {
+ aac_port_index = INPORT_INDEX;
+ pcm_port_index = OUTPORT_INDEX;
+ aac_port_dir = OMX_DirInput;
+ pcm_port_dir = OMX_DirOutput;
+ }
+
+ ret = __AllocateAacPort(aac_port_index, aac_port_dir);
+ if (ret != OMX_ErrorNone)
+ goto free_ports;
+
+ ret = __AllocatePcmPort(pcm_port_index, pcm_port_dir);
+ if (ret != OMX_ErrorNone)
+ goto free_aacport;
+
+ /* OMX_PORT_PARAM_TYPE */
+ memset(&portparam, 0, sizeof(portparam));
+ SetTypeHeader(&portparam, sizeof(portparam));
+ portparam.nPorts = NR_PORTS;
+ portparam.nStartPortNumber = INPORT_INDEX;
+
+ memcpy(&this->portparam, &portparam, sizeof(portparam));
+ /* end of OMX_PORT_PARAM_TYPE */
+
+ LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, OMX_ErrorNone);
+ return OMX_ErrorNone;
+
+free_aacport:
+ delete ports[aac_port_index];
+
+free_ports:
+ delete []ports;
+
+ LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
+ return ret;
+}
+
OMX_ERRORTYPE MrstSstComponent::__AllocateMp3Port(OMX_U32 port_index,
OMX_DIRTYPE dir)
{
@@ -186,6 +251,76 @@
return OMX_ErrorNone;
}
+OMX_ERRORTYPE MrstSstComponent::__AllocateAacPort(OMX_U32 port_index,
+ OMX_DIRTYPE dir)
+{
+ PortAac *aacport;
+
+ OMX_PARAM_PORTDEFINITIONTYPE aacportdefinition;
+ OMX_AUDIO_PARAM_AACPROFILETYPE aacportparam;
+ OMX_U32 i;
+
+ LOGV("%s(): enter\n", __func__);
+
+ ports[port_index] = new PortAac;
+ if (!ports[port_index]) {
+ LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
+ OMX_ErrorInsufficientResources);
+ return OMX_ErrorInsufficientResources;
+ }
+
+ aacport = static_cast<PortAac *>(this->ports[port_index]);
+
+ /* AAC - OMX_PARAM_PORTDEFINITIONTYPE */
+ memset(&aacportdefinition, 0, sizeof(aacportdefinition));
+ SetTypeHeader(&aacportdefinition, sizeof(aacportdefinition));
+ aacportdefinition.nPortIndex = port_index;
+ aacportdefinition.eDir = dir;
+ if (dir == OMX_DirInput) {
+ aacportdefinition.nBufferCountActual = INPORT_AAC_ACTUAL_BUFFER_COUNT;
+ aacportdefinition.nBufferCountMin = INPORT_AAC_MIN_BUFFER_COUNT;
+ aacportdefinition.nBufferSize = INPORT_AAC_BUFFER_SIZE;
+ }
+ else {
+ aacportdefinition.nBufferCountActual = OUTPORT_AAC_ACTUAL_BUFFER_COUNT;
+ aacportdefinition.nBufferCountMin = OUTPORT_AAC_MIN_BUFFER_COUNT;
+ aacportdefinition.nBufferSize = OUTPORT_AAC_BUFFER_SIZE;
+ }
+ aacportdefinition.bEnabled = OMX_TRUE;
+ aacportdefinition.bPopulated = OMX_FALSE;
+ aacportdefinition.eDomain = OMX_PortDomainAudio;
+ aacportdefinition.format.audio.cMIMEType = "audio/mpeg";
+ aacportdefinition.format.audio.pNativeRender = NULL;
+ aacportdefinition.format.audio.bFlagErrorConcealment = OMX_FALSE;
+ aacportdefinition.format.audio.eEncoding = OMX_AUDIO_CodingAAC;
+ aacportdefinition.bBuffersContiguous = OMX_FALSE;
+ aacportdefinition.nBufferAlignment = 0;
+
+ aacport->SetPortDefinition(&aacportdefinition, true);
+
+ /* end of AAC - OMX_PARAM_PORTDEFINITIONTYPE */
+
+ /* OMX_AUDIO_PARAM_AACPROFILETYPE */
+ memset(&aacportparam, 0, sizeof(aacportparam));
+ SetTypeHeader(&aacportparam, sizeof(aacportparam));
+ aacportparam.nPortIndex = port_index;
+ aacportparam.nChannels = 2;
+ aacportparam.nBitRate = 0;
+ aacportparam.nSampleRate = 0;
+ aacportparam.nAudioBandWidth = 0;
+ aacportparam.nFrameLength = 1024; /* default for LC */
+ aacportparam.nAACtools = OMX_AUDIO_AACToolNone;
+ aacportparam.nAACERtools = OMX_AUDIO_AACERNone;
+ aacportparam.eAACProfile = OMX_AUDIO_AACObjectLC;
+ aacportparam.eChannelMode = OMX_AUDIO_ChannelModeStereo;
+
+ aacport->SetPortAacParam(&aacportparam, true);
+ /* end of OMX_AUDIO_PARAM_AACPROFILETYPE */
+
+ LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, OMX_ErrorNone);
+ return OMX_ErrorNone;
+}
+
OMX_ERRORTYPE MrstSstComponent::__AllocatePcmPort(OMX_U32 port_index,
OMX_DIRTYPE dir)
{
@@ -299,7 +434,8 @@
OMX_U32 index = p->nPortIndex;
PortPcm *port = NULL;
- if (strcmp(GetWorkingRole(), "audio_decoder.mp3")) {
+ if (strcmp(GetWorkingRole(), "audio_decoder.mp3") &&
+ strcmp(GetWorkingRole(), "audio_decoder.aac")) {
LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
OMX_ErrorUnsupportedIndex);
return OMX_ErrorUnsupportedIndex;
@@ -353,6 +489,36 @@
memcpy(p, port->GetPortMp3Param(), sizeof(*p));
break;
}
+ case OMX_IndexParamAudioAac: {
+ OMX_AUDIO_PARAM_AACPROFILETYPE *p =
+ (OMX_AUDIO_PARAM_AACPROFILETYPE *)pComponentParameterStructure;
+ OMX_U32 index = p->nPortIndex;
+ PortAac *port = NULL;
+
+ if (strcmp(GetWorkingRole(), "audio_decoder.aac")) {
+ LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
+ OMX_ErrorUnsupportedIndex);
+ return OMX_ErrorUnsupportedIndex;
+ }
+
+ ret = CheckTypeHeader(p, sizeof(*p));
+ if (ret != OMX_ErrorNone) {
+ LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
+ return ret;
+ }
+
+ if (index < nr_ports)
+ port = static_cast<PortAac *>(ports[index]);
+
+ if (!port) {
+ LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
+ OMX_ErrorBadPortIndex);
+ return OMX_ErrorBadPortIndex;
+ }
+
+ memcpy(p, port->GetPortAacParam(), sizeof(*p));
+ break;
+ }
default:
ret = OMX_ErrorUnsupportedIndex;
} /* switch */
@@ -412,7 +578,8 @@
OMX_U32 index = p->nPortIndex;
PortPcm *port = NULL;
- if (strcmp(GetWorkingRole(), "audio_decoder.mp3")) {
+ if (strcmp(GetWorkingRole(), "audio_decoder.mp3") &&
+ strcmp(GetWorkingRole(), "audio_decoder.aac")) {
LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
OMX_ErrorUnsupportedIndex);
return OMX_ErrorUnsupportedIndex;
@@ -490,6 +657,48 @@
ret = port->SetPortMp3Param(p, false);
break;
}
+ case OMX_IndexParamAudioAac: {
+ OMX_AUDIO_PARAM_AACPROFILETYPE *p =
+ (OMX_AUDIO_PARAM_AACPROFILETYPE *)pComponentParameterStructure;
+ OMX_U32 index = p->nPortIndex;
+ PortAac *port = NULL;
+
+ if (strcmp(GetWorkingRole(), "audio_decoder.aac")) {
+ LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
+ OMX_ErrorUnsupportedIndex);
+ return OMX_ErrorUnsupportedIndex;
+ }
+
+ ret = CheckTypeHeader(p, sizeof(*p));
+ if (ret != OMX_ErrorNone) {
+ LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
+ return ret;
+ }
+
+ if (index < nr_ports)
+ port = static_cast<PortAac *>(ports[index]);
+
+ if (!port) {
+ LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
+ OMX_ErrorBadPortIndex);
+ return OMX_ErrorBadPortIndex;
+ }
+
+ if (port->IsEnabled()) {
+ OMX_STATETYPE state;
+
+ CBaseGetState((void *)GetComponentHandle(), &state);
+ if (state != OMX_StateLoaded &&
+ state != OMX_StateWaitForResources) {
+ LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
+ OMX_ErrorIncorrectStateOperation);
+ return OMX_ErrorIncorrectStateOperation;
+ }
+ }
+
+ ret = port->SetPortAacParam(p, false);
+ break;
+ }
default:
ret = OMX_ErrorUnsupportedIndex;
} /* switch */
@@ -603,6 +812,7 @@
static const OMX_STRING g_roles[] =
{
"audio_decoder.mp3",
+ "audio_decoder.aac",
};
static const OMX_STRING g_compname = "OMX.Intel.MrstSST";