sst: add moorestown SST audio hw codec component
diff --git a/sst/sst.cpp b/sst/sst.cpp
new file mode 100644
index 0000000..5931feb
--- /dev/null
+++ b/sst/sst.cpp
@@ -0,0 +1,634 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <OMX_Core.h>
+
+#include <cmodule.h>
+#include <portaudio.h>
+#include <componentbase.h>
+
+#include "sst.h"
+
+#define LOG_NDEBUG 1
+
+#define LOG_TAG "mrst_sst"
+#include <log.h>
+
+/*
+ * constructor & destructor
+ */
+MrstSstComponent::MrstSstComponent()
+{
+    LOGV("%s(): enter\n", __func__);
+
+    LOGV("%s(),%d: exit (ret = void)\n", __func__, __LINE__);
+}
+
+MrstSstComponent::~MrstSstComponent()
+{
+    LOGV("%s(): enter\n", __func__);
+
+    LOGV("%s(),%d: exit (ret = void)\n", __func__, __LINE__);
+}
+
+/* end of constructor & destructor */
+
+/* core methods & helpers */
+OMX_ERRORTYPE MrstSstComponent::ComponentAllocatePorts(void)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorUndefined;
+
+    LOGV("%s(): enter\n", __func__);
+
+    if (!strcmp(GetWorkingRole(), "audio_decoder.mp3"))
+        ret = __AllocateMp3RolePorts(false);
+
+    LOGV("%s(): exit (ret = 0x%08x)\n", __func__, ret);
+    return ret;
+}
+
+
+OMX_ERRORTYPE MrstSstComponent::__AllocateMp3RolePorts(bool isencoder)
+{
+    PortBase **ports;
+
+    OMX_U32 mp3_port_index, pcm_port_index;
+    OMX_DIRTYPE mp3_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;
+        mp3_port_index = OUTPORT_INDEX;
+        pcm_port_dir = OMX_DirInput;
+        mp3_port_dir = OMX_DirOutput;
+    }
+    else {
+        mp3_port_index = INPORT_INDEX;
+        pcm_port_index = OUTPORT_INDEX;
+        mp3_port_dir = OMX_DirInput;
+        pcm_port_dir = OMX_DirOutput;
+    }
+
+    ret = __AllocateMp3Port(mp3_port_index, mp3_port_dir);
+    if (ret != OMX_ErrorNone)
+        goto free_ports;
+
+    ret = __AllocatePcmPort(pcm_port_index, pcm_port_dir);
+    if (ret != OMX_ErrorNone)
+        goto free_mp3port;
+
+    /* 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_mp3port:
+    delete ports[mp3_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)
+{
+    PortMp3 *mp3port;
+
+    OMX_PARAM_PORTDEFINITIONTYPE mp3portdefinition;
+    OMX_AUDIO_PARAM_MP3TYPE mp3portparam;
+    OMX_U32 i;
+
+    LOGV("%s(): enter\n", __func__);
+
+    ports[port_index] = new PortMp3;
+    if (!ports[port_index]) {
+        LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
+             OMX_ErrorInsufficientResources);
+        return OMX_ErrorInsufficientResources;
+    }
+
+    mp3port = static_cast<PortMp3 *>(this->ports[port_index]);
+
+    /* MP3 - OMX_PARAM_PORTDEFINITIONTYPE */
+    memset(&mp3portdefinition, 0, sizeof(mp3portdefinition));
+    SetTypeHeader(&mp3portdefinition, sizeof(mp3portdefinition));
+    mp3portdefinition.nPortIndex = port_index;
+    mp3portdefinition.eDir = dir;
+    if (dir == OMX_DirInput) {
+        mp3portdefinition.nBufferCountActual = INPORT_MP3_ACTUAL_BUFFER_COUNT;
+        mp3portdefinition.nBufferCountMin = INPORT_MP3_MIN_BUFFER_COUNT;
+        mp3portdefinition.nBufferSize = INPORT_MP3_BUFFER_SIZE;
+    }
+    else {
+        mp3portdefinition.nBufferCountActual = OUTPORT_MP3_ACTUAL_BUFFER_COUNT;
+        mp3portdefinition.nBufferCountMin = OUTPORT_MP3_MIN_BUFFER_COUNT;
+        mp3portdefinition.nBufferSize = OUTPORT_MP3_BUFFER_SIZE;
+    }
+    mp3portdefinition.bEnabled = OMX_TRUE;
+    mp3portdefinition.bPopulated = OMX_FALSE;
+    mp3portdefinition.eDomain = OMX_PortDomainAudio;
+    mp3portdefinition.format.audio.cMIMEType = "audio/mpeg";
+    mp3portdefinition.format.audio.pNativeRender = NULL;
+    mp3portdefinition.format.audio.bFlagErrorConcealment = OMX_FALSE;
+    mp3portdefinition.format.audio.eEncoding = OMX_AUDIO_CodingMP3;
+    mp3portdefinition.bBuffersContiguous = OMX_FALSE;
+    mp3portdefinition.nBufferAlignment = 0;
+
+    mp3port->SetPortDefinition(&mp3portdefinition, true);
+
+    /* end of MP3 - OMX_PARAM_PORTDEFINITIONTYPE */
+
+    /* OMX_AUDIO_PARAM_MP3TYPE */
+    memset(&mp3portparam, 0, sizeof(mp3portparam));
+    SetTypeHeader(&mp3portparam, sizeof(mp3portparam));
+    mp3portparam.nPortIndex = port_index;
+    mp3portparam.nChannels = 2;
+    mp3portparam.nBitRate = 0;
+    mp3portparam.nSampleRate = 0;
+    mp3portparam.nAudioBandWidth = 0;
+    mp3portparam.eChannelMode = OMX_AUDIO_ChannelModeStereo;
+    mp3portparam.eFormat = OMX_AUDIO_MP3StreamFormatMP1Layer3;
+
+    mp3port->SetPortMp3Param(&mp3portparam, true);
+    /* end of OMX_AUDIO_PARAM_MP3TYPE */
+
+    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)
+{
+    PortPcm *pcmport;
+
+    OMX_PARAM_PORTDEFINITIONTYPE pcmportdefinition;
+    OMX_AUDIO_PARAM_PCMMODETYPE pcmportparam;
+    OMX_U32 i;
+
+    LOGV("%s(): enter\n", __func__);
+
+    ports[port_index] = new PortPcm;
+    if (!ports[port_index]) {
+        LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
+             OMX_ErrorInsufficientResources);
+        return OMX_ErrorInsufficientResources;
+    }
+    pcmport = static_cast<PortPcm *>(this->ports[port_index]);
+
+    /* PCM - OMX_PARAM_PORTDEFINITIONTYPE */
+    memset(&pcmportdefinition, 0, sizeof(pcmportdefinition));
+    SetTypeHeader(&pcmportdefinition, sizeof(pcmportdefinition));
+    pcmportdefinition.nPortIndex = port_index;
+    pcmportdefinition.eDir = dir;
+    if (dir == OMX_DirInput) {
+        pcmportdefinition.nBufferCountActual = INPORT_PCM_ACTUAL_BUFFER_COUNT;
+        pcmportdefinition.nBufferCountMin = INPORT_PCM_MIN_BUFFER_COUNT;
+        pcmportdefinition.nBufferSize = INPORT_PCM_BUFFER_SIZE;
+    }
+    else {
+        pcmportdefinition.nBufferCountActual = OUTPORT_PCM_ACTUAL_BUFFER_COUNT;
+        pcmportdefinition.nBufferCountMin = OUTPORT_PCM_MIN_BUFFER_COUNT;
+        pcmportdefinition.nBufferSize = OUTPORT_PCM_BUFFER_SIZE;
+    }
+    pcmportdefinition.bEnabled = OMX_TRUE;
+    pcmportdefinition.bPopulated = OMX_FALSE;
+    pcmportdefinition.eDomain = OMX_PortDomainAudio;
+    pcmportdefinition.format.audio.cMIMEType = "raw";
+    pcmportdefinition.format.audio.pNativeRender = NULL;
+    pcmportdefinition.format.audio.bFlagErrorConcealment = OMX_FALSE;
+    pcmportdefinition.format.audio.eEncoding = OMX_AUDIO_CodingPCM;
+    pcmportdefinition.bBuffersContiguous = OMX_FALSE;
+    pcmportdefinition.nBufferAlignment = 0;
+
+    pcmport->SetPortDefinition(&pcmportdefinition, true);
+    /* end of PCM - OMX_PARAM_PORTDEFINITIONTYPE */
+
+    /* OMX_AUDIO_PARAM_PCMMODETYPE */
+    memset(&pcmportparam, 0, sizeof(pcmportparam));
+    SetTypeHeader(&pcmportparam, sizeof(pcmportparam));
+    pcmportparam.nPortIndex = port_index;
+    pcmportparam.nChannels = 2;
+    pcmportparam.eNumData = OMX_NumericalDataUnsigned;
+    pcmportparam.eEndian = OMX_EndianLittle;
+    pcmportparam.bInterleaved = OMX_FALSE;
+    pcmportparam.nBitPerSample = 16;
+    pcmportparam.nSamplingRate = 44100;
+    pcmportparam.ePCMMode = OMX_AUDIO_PCMModeLinear;
+    pcmportparam.eChannelMapping[0] = OMX_AUDIO_ChannelLF;
+    pcmportparam.eChannelMapping[1] = OMX_AUDIO_ChannelRF;
+
+    pcmport->SetPortPcmParam(&pcmportparam, true);
+    /* end of OMX_AUDIO_PARAM_PCMMODETYPE */
+
+    LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, OMX_ErrorNone);
+    return OMX_ErrorNone;
+}
+
+/* end of core methods & helpers */
+
+/*
+ * component methods & helpers
+ */
+/* Get/SetParameter */
+OMX_ERRORTYPE MrstSstComponent::ComponentGetParameter(
+    OMX_INDEXTYPE nParamIndex,
+    OMX_PTR pComponentParameterStructure)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+
+    LOGV("%s(): enter (index = 0x%08x)\n", __func__, nParamIndex);
+
+    switch (nParamIndex) {
+    case OMX_IndexParamAudioPortFormat: {
+        OMX_AUDIO_PARAM_PORTFORMATTYPE *p =
+            (OMX_AUDIO_PARAM_PORTFORMATTYPE *)pComponentParameterStructure;
+        OMX_U32 index = p->nPortIndex;
+        PortAudio *port = NULL;
+
+        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<PortAudio *>(ports[index]);
+
+        if (!port) {
+            LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
+                 OMX_ErrorBadPortIndex);
+            return OMX_ErrorBadPortIndex;
+        }
+
+        memcpy(p, port->GetPortAudioParam(), sizeof(*p));
+        break;
+    }
+    case OMX_IndexParamAudioPcm: {
+        OMX_AUDIO_PARAM_PCMMODETYPE *p =
+            (OMX_AUDIO_PARAM_PCMMODETYPE *)pComponentParameterStructure;
+        OMX_U32 index = p->nPortIndex;
+        PortPcm *port = NULL;
+
+        if (strcmp(GetWorkingRole(), "audio_decoder.mp3")) {
+            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<PortPcm *>(ports[index]);
+
+        if (!port) {
+            LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
+                 OMX_ErrorBadPortIndex);
+            return OMX_ErrorBadPortIndex;
+        }
+
+        memcpy(p, port->GetPortPcmParam(), sizeof(*p));
+        break;
+    }
+    case OMX_IndexParamAudioMp3: {
+        OMX_AUDIO_PARAM_MP3TYPE *p =
+            (OMX_AUDIO_PARAM_MP3TYPE *)pComponentParameterStructure;
+        OMX_U32 index = p->nPortIndex;
+        PortMp3 *port = NULL;
+
+        if (strcmp(GetWorkingRole(), "audio_decoder.mp3")) {
+            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<PortMp3 *>(ports[index]);
+
+        if (!port) {
+            LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
+                 OMX_ErrorBadPortIndex);
+            return OMX_ErrorBadPortIndex;
+        }
+
+        memcpy(p, port->GetPortMp3Param(), sizeof(*p));
+        break;
+    }
+    default:
+        ret = OMX_ErrorUnsupportedIndex;
+    } /* switch */
+
+    LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
+    return ret;
+}
+
+OMX_ERRORTYPE MrstSstComponent::ComponentSetParameter(
+    OMX_INDEXTYPE nIndex,
+    OMX_PTR pComponentParameterStructure)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+
+    LOGV("%s(): enter (index = 0x%08x)\n", __func__, nIndex);
+
+    switch (nIndex) {
+    case OMX_IndexParamAudioPortFormat: {
+        OMX_AUDIO_PARAM_PORTFORMATTYPE *p =
+            (OMX_AUDIO_PARAM_PORTFORMATTYPE *)pComponentParameterStructure;
+        OMX_U32 index = p->nPortIndex;
+        PortAudio *port = NULL;
+
+        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<PortPcm *>(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->SetPortAudioParam(p, false);
+        break;
+    }
+    case OMX_IndexParamAudioPcm: {
+        OMX_AUDIO_PARAM_PCMMODETYPE *p =
+            (OMX_AUDIO_PARAM_PCMMODETYPE *)pComponentParameterStructure;
+        OMX_U32 index = p->nPortIndex;
+        PortPcm *port = NULL;
+
+        if (strcmp(GetWorkingRole(), "audio_decoder.mp3")) {
+            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<PortPcm *>(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->SetPortPcmParam(p, false);
+        break;
+    }
+    case OMX_IndexParamAudioMp3: {
+        OMX_AUDIO_PARAM_MP3TYPE *p =
+            (OMX_AUDIO_PARAM_MP3TYPE *)pComponentParameterStructure;
+        OMX_U32 index = p->nPortIndex;
+        PortMp3 *port = NULL;
+
+        if (strcmp(GetWorkingRole(), "audio_decoder.mp3")) {
+            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<PortMp3 *>(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->SetPortMp3Param(p, false);
+        break;
+    }
+    default:
+        ret = OMX_ErrorUnsupportedIndex;
+    } /* switch */
+
+    LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
+    return ret;
+}
+
+/* Get/SetConfig */
+OMX_ERRORTYPE MrstSstComponent::ComponentGetConfig(
+    OMX_INDEXTYPE nIndex,
+    OMX_PTR pComponentConfigStructure)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorUnsupportedIndex;
+    LOGV("%s(): enter\n", __func__);
+
+    LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
+    return ret;
+}
+
+OMX_ERRORTYPE MrstSstComponent::ComponentSetConfig(
+    OMX_INDEXTYPE nParamIndex,
+    OMX_PTR pComponentConfigStructure)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorUnsupportedIndex;
+    LOGV("%s(): enter\n", __func__);
+
+    LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
+    return ret;
+}
+
+/* implement ComponentBase::Processor[*] */
+OMX_ERRORTYPE MrstSstComponent::ProcessorInit(void)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    LOGV("%s(): enter\n", __func__);
+
+    LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
+    return ret;
+}
+
+OMX_ERRORTYPE MrstSstComponent::ProcessorDeinit(void)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    LOGV("%s(): enter\n", __func__);
+
+    LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
+    return ret;
+}
+
+OMX_ERRORTYPE MrstSstComponent::ProcessorStart(void)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    LOGV("%s(): enter\n", __func__);
+
+    LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
+    return ret;
+}
+
+OMX_ERRORTYPE MrstSstComponent::ProcessorStop(void)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    LOGV("%s(): enter\n", __func__);
+
+    LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
+    return ret;
+}
+
+OMX_ERRORTYPE MrstSstComponent::ProcessorPause(void)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    LOGV("%s(): enter\n", __func__);
+
+    LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
+    return ret;
+}
+
+OMX_ERRORTYPE MrstSstComponent::ProcessorResume(void)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    LOGV("%s(): enter\n", __func__);
+
+    LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
+    return ret;
+}
+
+/* implement ComponentBase::ProcessorProcess */
+void MrstSstComponent::ProcessorProcess(
+    OMX_BUFFERHEADERTYPE **buffers,
+    bool *retain,
+    OMX_U32 nr_buffers)
+{
+    LOGV("%s(): enter\n", __func__);
+
+    /* dummy processing */
+    buffers[OUTPORT_INDEX]->nFilledLen = buffers[OUTPORT_INDEX]->nAllocLen;
+    buffers[OUTPORT_INDEX]->nTimeStamp = buffers[INPORT_INDEX]->nTimeStamp;
+
+    buffers[INPORT_INDEX]->nFilledLen = 0;
+
+    LOGV("%s(),%d: exit (ret = void)\n", __func__, __LINE__);
+}
+
+/* end of implement ComponentBase::Processor[*] */
+
+/* end of component methods & helpers */
+
+/*
+ * CModule Interface
+ */
+static const OMX_STRING g_roles[] =
+{
+    "audio_decoder.mp3",
+};
+
+static const OMX_STRING g_compname = "OMX.Intel.MrstSST";
+
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
+
+OMX_ERRORTYPE omx_component_module_instantiate(OMX_PTR *instance)
+{
+    ComponentBase *cbase;
+
+    cbase = new MrstSstComponent;
+    if (!cbase) {
+        *instance = NULL;
+        return OMX_ErrorInsufficientResources;
+    }
+
+    *instance = cbase;
+    return OMX_ErrorNone;
+}
+
+OMX_ERRORTYPE omx_component_module_query_name(OMX_STRING name, OMX_U32 len)
+{
+    if (!name)
+        return OMX_ErrorBadParameter;
+
+    strncpy(name, g_compname, len);
+    return OMX_ErrorNone;
+}
+
+OMX_ERRORTYPE omx_component_module_query_roles(OMX_U32 *nr_roles,
+                                               OMX_U8 **roles)
+{
+    return ComponentBase::QueryRolesHelper(ARRAY_SIZE(g_roles),
+                                           (const OMX_U8 **)g_roles,
+                                           nr_roles, roles);
+}