psb: add psb video codec skull component
diff --git a/AUTHORS b/AUTHORS
index 48d02bb..5f68f21 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,2 +1,5 @@
 Smart Sound Technology OMX-IL Component (sst)
   Ho-Eun Ryu <ho-eun.ryu@windriver.com>
+
+Poulsbo OMX-IL Component
+  Ho-Eun Ryu <ho-eun.ryu@windriver.com>
diff --git a/Android.mk b/Android.mk
index f7c168b..f09e859 100644
--- a/Android.mk
+++ b/Android.mk
@@ -29,3 +29,6 @@
 
 # mrst sst audio
 -include $(VENDORS_INTEL_MRST_COMPONENTS_ROOT)/sst/Android.mk
+
+# poulsbo
+-include $(VENDORS_INTEL_MRST_COMPONENTS_ROOT)/psb/Android.mk
diff --git a/psb/Android.mk b/psb/Android.mk
new file mode 100644
index 0000000..232652f
--- /dev/null
+++ b/psb/Android.mk
@@ -0,0 +1,25 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+WRS_OMXIL_CORE_ROOT := vendor/wrs/addon/libs/wrs-omxil-core
+
+LOCAL_SRC_FILES := \
+	psb.cpp
+
+LOCAL_MODULE := libwrs_omxil_intel_mrst_psb
+
+LOCAL_CPPFLAGS :=
+
+LOCAL_LDFLAGS :=
+
+LOCAL_SHARED_LIBRARIES := \
+	libwrs_omxil_common \
+	liblog
+
+LOCAL_C_INCLUDES := \
+	$(WRS_OMXIL_CORE_ROOT)/utils/inc \
+	$(WRS_OMXIL_CORE_ROOT)/base/inc \
+	$(WRS_OMXIL_CORE_ROOT)/core/inc/khronos/openmax/include \
+	$(PV_INCLUDES)
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/psb/ebuild.mk b/psb/ebuild.mk
new file mode 100644
index 0000000..06a4106
--- /dev/null
+++ b/psb/ebuild.mk
@@ -0,0 +1,21 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := \
+	psb.cpp
+
+LOCAL_MODULE := libwrs_omxil_intel_mrst_psb
+
+LOCAL_CPPFLAGS :=
+
+LOCAL_LDFLAGS :=
+
+LOCAL_SHARED_LIBRARIES := \
+	libwrs_omxil_common
+
+LOCAL_C_INCLUDES := \
+	$(WRS_OMXIL_CORE_ROOT)/utils/inc \
+	$(WRS_OMXIL_CORE_ROOT)/base/inc \
+	$(WRS_OMXIL_CORE_ROOT)/core/inc/khronos/openmax/include
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/psb/psb.cpp b/psb/psb.cpp
new file mode 100644
index 0000000..c45cf69
--- /dev/null
+++ b/psb/psb.cpp
@@ -0,0 +1,655 @@
+/*
+ * Copyright (c) 2009 Wind River Systems, Inc.
+ *
+ * The right to copy, distribute, modify, or otherwise make use
+ * of this software may be licensed only pursuant to the terms
+ * of an applicable Wind River license agreement.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <OMX_Core.h>
+
+#include <cmodule.h>
+#include <portvideo.h>
+#include <componentbase.h>
+
+#include <pv_omxcore.h>
+
+#include "psb.h"
+
+#define LOG_NDEBUG 0
+
+#define LOG_TAG "mrst_psb"
+#include <log.h>
+
+/*
+ * constructor & destructor
+ */
+MrstPsbComponent::MrstPsbComponent()
+{
+    LOGV("%s(): enter\n", __func__);
+
+    LOGV("%s(),%d: exit (ret = void)\n", __func__, __LINE__);
+}
+
+MrstPsbComponent::~MrstPsbComponent()
+{
+    LOGV("%s(): enter\n", __func__);
+
+    LOGV("%s(),%d: exit (ret = void)\n", __func__, __LINE__);
+}
+
+/* end of constructor & destructor */
+
+/* core methods & helpers */
+OMX_ERRORTYPE MrstPsbComponent::ComponentAllocatePorts(void)
+{
+    PortBase **ports;
+
+    OMX_U32 codec_port_index, raw_port_index;
+    OMX_DIRTYPE codec_port_dir, raw_port_dir;
+
+    OMX_PORT_PARAM_TYPE portparam;
+
+    const char *working_role;
+
+    OMX_ERRORTYPE ret = OMX_ErrorUndefined;
+
+    LOGV("%s(): enter\n", __func__);
+
+    ports = new PortBase *[NR_PORTS];
+    if (!ports)
+        return OMX_ErrorInsufficientResources;
+
+    this->nr_ports = NR_PORTS;
+    this->ports = ports;
+
+    /* video_[encoder/decoder].[avc/whatever] */
+    working_role = GetWorkingRole();
+    working_role = strpbrk(working_role, "_");
+
+    if (!strncmp(working_role, "_encoder", strlen("_encoder")))
+        isencoder = true;
+    else
+        isencoder = false;
+
+    working_role = strpbrk(working_role, ".");
+    if (!strcmp(working_role, ".avc"))
+        coding_type = OMX_VIDEO_CodingAVC;
+
+    if (isencoder) {
+        raw_port_index = INPORT_INDEX;
+        codec_port_index = OUTPORT_INDEX;
+        raw_port_dir = OMX_DirInput;
+        codec_port_dir = OMX_DirOutput;
+    }
+    else {
+        codec_port_index = INPORT_INDEX;
+        raw_port_index = OUTPORT_INDEX;
+        codec_port_dir = OMX_DirInput;
+        raw_port_dir = OMX_DirOutput;
+    }
+
+    if (coding_type == OMX_VIDEO_CodingAVC)
+        ret = __AllocateAvcPort(codec_port_index, codec_port_dir);
+
+    if (ret != OMX_ErrorNone)
+        goto free_ports;
+
+    ret = __AllocateRawPort(raw_port_index, raw_port_dir);
+    if (ret != OMX_ErrorNone)
+        goto free_codecport;
+
+    /* 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_codecport:
+    delete ports[codec_port_index];
+    ports[codec_port_index] = NULL;
+
+free_ports:
+    coding_type = OMX_VIDEO_CodingUnused;
+
+    delete []ports;
+    ports = NULL;
+
+    this->ports = NULL;
+    this->nr_ports = 0;
+
+    LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
+    return ret;
+}
+
+OMX_ERRORTYPE MrstPsbComponent::__AllocateAvcPort(OMX_U32 port_index,
+                                                  OMX_DIRTYPE dir)
+{
+    PortAvc *avcport;
+
+    OMX_PARAM_PORTDEFINITIONTYPE avcportdefinition;
+    OMX_VIDEO_PARAM_AVCTYPE avcportparam;
+
+    LOGV("%s(): enter\n", __func__);
+
+    ports[port_index] = new PortAvc;
+    if (!ports[port_index]) {
+        LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
+             OMX_ErrorInsufficientResources);
+        return OMX_ErrorInsufficientResources;
+    }
+
+    avcport = static_cast<PortAvc *>(this->ports[port_index]);
+
+    /* OMX_PARAM_PORTDEFINITIONTYPE */
+    memset(&avcportdefinition, 0, sizeof(avcportdefinition));
+    SetTypeHeader(&avcportdefinition, sizeof(avcportdefinition));
+    avcportdefinition.nPortIndex = port_index;
+    avcportdefinition.eDir = dir;
+    if (dir == OMX_DirInput) {
+        avcportdefinition.nBufferCountActual = INPORT_AVC_ACTUAL_BUFFER_COUNT;
+        avcportdefinition.nBufferCountMin = INPORT_AVC_MIN_BUFFER_COUNT;
+        avcportdefinition.nBufferSize = INPORT_AVC_BUFFER_SIZE;
+    }
+    else {
+        avcportdefinition.nBufferCountActual = OUTPORT_AVC_ACTUAL_BUFFER_COUNT;
+        avcportdefinition.nBufferCountMin = OUTPORT_AVC_MIN_BUFFER_COUNT;
+        avcportdefinition.nBufferSize = OUTPORT_AVC_BUFFER_SIZE;
+    }
+    avcportdefinition.bEnabled = OMX_TRUE;
+    avcportdefinition.bPopulated = OMX_FALSE;
+    avcportdefinition.eDomain = OMX_PortDomainVideo;
+    avcportdefinition.format.video.cMIMEType = (char *)"video/h264";
+    avcportdefinition.format.video.pNativeRender = NULL;
+    avcportdefinition.format.video.nFrameWidth = 176;
+    avcportdefinition.format.video.nFrameHeight = 144;
+    avcportdefinition.format.video.nStride = 0;
+    avcportdefinition.format.video.nSliceHeight = 0;
+    avcportdefinition.format.video.nBitrate = 64000;
+    avcportdefinition.format.video.xFramerate = 15 << 16;
+    avcportdefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
+    avcportdefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingAVC;
+    avcportdefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
+    avcportdefinition.format.video.pNativeWindow = NULL;
+    avcportdefinition.bBuffersContiguous = OMX_FALSE;
+    avcportdefinition.nBufferAlignment = 0;
+
+    avcport->SetPortDefinition(&avcportdefinition, true);
+
+    /* end of OMX_PARAM_PORTDEFINITIONTYPE */
+
+    /* OMX_VIDEO_PARAM_AVCTYPE */
+    memset(&avcportparam, 0, sizeof(avcportparam));
+    SetTypeHeader(&avcportparam, sizeof(avcportparam));
+    avcportparam.nPortIndex = port_index;
+    avcportparam.eProfile = OMX_VIDEO_AVCProfileBaseline;
+    avcportparam.eLevel = OMX_VIDEO_AVCLevel1;
+
+    avcport->SetPortAvcParam(&avcportparam, true);
+    /* end of OMX_VIDEO_PARAM_AVCTYPE */
+
+    LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, OMX_ErrorNone);
+    return OMX_ErrorNone;
+}
+
+OMX_ERRORTYPE MrstPsbComponent::__AllocateRawPort(OMX_U32 port_index,
+                                                  OMX_DIRTYPE dir)
+{
+    PortVideo *rawport;
+
+    OMX_PARAM_PORTDEFINITIONTYPE rawportdefinition;
+    OMX_VIDEO_PARAM_PORTFORMATTYPE rawvideoparam;
+
+    LOGV("%s(): enter\n", __func__);
+
+    ports[port_index] = new PortVideo;
+    if (!ports[port_index]) {
+        LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
+             OMX_ErrorInsufficientResources);
+        return OMX_ErrorInsufficientResources;
+    }
+
+    rawport = static_cast<PortVideo *>(this->ports[port_index]);
+
+    /* OMX_PARAM_PORTDEFINITIONTYPE */
+    memset(&rawportdefinition, 0, sizeof(rawportdefinition));
+    SetTypeHeader(&rawportdefinition, sizeof(rawportdefinition));
+    rawportdefinition.nPortIndex = port_index;
+    rawportdefinition.eDir = dir;
+    if (dir == OMX_DirInput) {
+        rawportdefinition.nBufferCountActual = INPORT_RAW_ACTUAL_BUFFER_COUNT;
+        rawportdefinition.nBufferCountMin = INPORT_RAW_MIN_BUFFER_COUNT;
+        rawportdefinition.nBufferSize = INPORT_RAW_BUFFER_SIZE;
+    }
+    else {
+        rawportdefinition.nBufferCountActual = OUTPORT_RAW_ACTUAL_BUFFER_COUNT;
+        rawportdefinition.nBufferCountMin = OUTPORT_RAW_MIN_BUFFER_COUNT;
+        rawportdefinition.nBufferSize = OUTPORT_RAW_BUFFER_SIZE;
+    }
+    rawportdefinition.bEnabled = OMX_TRUE;
+    rawportdefinition.bPopulated = OMX_FALSE;
+    rawportdefinition.eDomain = OMX_PortDomainVideo;
+    rawportdefinition.format.video.cMIMEType = (char *)"video/raw";
+    rawportdefinition.format.video.pNativeRender = NULL;
+    rawportdefinition.format.video.nFrameWidth = 176;
+    rawportdefinition.format.video.nFrameHeight = 144;
+    rawportdefinition.format.video.nStride = 0;
+    rawportdefinition.format.video.nSliceHeight = 0;
+    rawportdefinition.format.video.nBitrate = 64000;
+    rawportdefinition.format.video.xFramerate = 15 << 16;
+    rawportdefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
+    rawportdefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
+    rawportdefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
+    rawportdefinition.format.video.pNativeWindow = NULL;
+    rawportdefinition.bBuffersContiguous = OMX_FALSE;
+    rawportdefinition.nBufferAlignment = 0;
+
+    rawport->SetPortDefinition(&rawportdefinition, true);
+
+    /* end of OMX_PARAM_PORTDEFINITIONTYPE */
+
+    /* OMX_VIDEO_PARAM_PORTFORMATTYPE */
+    rawvideoparam.nPortIndex = port_index;
+    rawvideoparam.nIndex = 0;
+    rawvideoparam.eCompressionFormat = OMX_VIDEO_CodingUnused;
+    rawvideoparam.eColorFormat = OMX_COLOR_FormatYUV420Planar;
+
+    rawport->SetPortVideoParam(&rawvideoparam, true);
+
+    /* end of OMX_VIDEO_PARAM_PORTFORMATTYPE */
+
+    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 MrstPsbComponent::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_IndexParamVideoPortFormat: {
+        OMX_VIDEO_PARAM_PORTFORMATTYPE *p =
+            (OMX_VIDEO_PARAM_PORTFORMATTYPE *)pComponentParameterStructure;
+        OMX_U32 index = p->nPortIndex;
+        PortVideo *port = NULL;
+
+        LOGV("%s(): port index : %lu\n", __func__, index);
+
+        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<PortVideo *>(ports[index]);
+
+        if (!port) {
+            LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
+                 OMX_ErrorBadPortIndex);
+            return OMX_ErrorBadPortIndex;
+        }
+
+        memcpy(p, port->GetPortVideoParam(), sizeof(*p));
+        break;
+    }
+    case OMX_IndexParamVideoAvc: {
+        OMX_VIDEO_PARAM_AVCTYPE *p =
+            (OMX_VIDEO_PARAM_AVCTYPE *)pComponentParameterStructure;
+        OMX_U32 index = p->nPortIndex;
+        PortAvc *port = NULL;
+
+        if (strcmp(GetWorkingRole(), "video_decoder.avc")) {
+            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<PortAvc *>(ports[index]);
+
+        if (!port) {
+            LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__,
+                 OMX_ErrorBadPortIndex);
+            return OMX_ErrorBadPortIndex;
+        }
+
+        memcpy(p, port->GetPortAvcParam(), sizeof(*p));
+        break;
+    }
+    case (OMX_INDEXTYPE) PV_OMX_COMPONENT_CAPABILITY_TYPE_INDEX: {
+        PV_OMXComponentCapabilityFlagsType *p =
+            (PV_OMXComponentCapabilityFlagsType *)pComponentParameterStructure;
+
+        p->iIsOMXComponentMultiThreaded = OMX_TRUE;
+        p->iOMXComponentSupportsExternalInputBufferAlloc = OMX_TRUE;
+        p->iOMXComponentSupportsExternalOutputBufferAlloc = OMX_TRUE;
+#ifdef PV_FULL_AVC_FRAME_MODE
+        p->iOMXComponentSupportsMovableInputBuffers = OMX_FALSE;
+        p->iOMXComponentUsesNALStartCodes = OMX_FALSE;
+        p->iOMXComponentSupportsPartialFrames = OMX_FALSE;
+        p->iOMXComponentCanHandleIncompleteFrames = OMX_TRUE;
+        p->iOMXComponentUsesFullAVCFrames = OMX_TRUE;
+#else
+        p->iOMXComponentSupportsMovableInputBuffers = OMX_TRUE;
+        p->iOMXComponentUsesNALStartCodes = OMX_FALSE;
+        p->iOMXComponentSupportsPartialFrames = OMX_TRUE;
+        p->iOMXComponentCanHandleIncompleteFrames = OMX_TRUE;
+        p->iOMXComponentUsesFullAVCFrames = OMX_FALSE;
+#endif
+        break;
+    }
+    default:
+        ret = OMX_ErrorUnsupportedIndex;
+    } /* switch */
+
+    LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
+    return ret;
+}
+
+OMX_ERRORTYPE MrstPsbComponent::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_IndexParamVideoPortFormat: {
+        OMX_VIDEO_PARAM_PORTFORMATTYPE *p =
+            (OMX_VIDEO_PARAM_PORTFORMATTYPE *)pComponentParameterStructure;
+        OMX_U32 index = p->nPortIndex;
+        PortVideo *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<PortVideo *>(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->SetPortVideoParam(p, false);
+        break;
+    }
+    case OMX_IndexParamVideoAvc: {
+        OMX_VIDEO_PARAM_AVCTYPE *p =
+            (OMX_VIDEO_PARAM_AVCTYPE *)pComponentParameterStructure;
+        OMX_U32 index = p->nPortIndex;
+        PortAvc *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<PortAvc *>(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->SetPortAvcParam(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 MrstPsbComponent::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 MrstPsbComponent::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 MrstPsbComponent::ProcessorInit(void)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+
+    LOGV("%s(): enter\n", __func__);
+
+    if (coding_type == OMX_VIDEO_CodingAVC) {
+        /*
+         * avc decoder specific code
+         */
+    }
+
+    /* decoder */
+    if (!isencoder) {
+        /*
+         * decoder specific code
+         */
+    }
+
+    /*
+     * common codes
+     */
+
+    LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret);
+    return ret;
+}
+
+OMX_ERRORTYPE MrstPsbComponent::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 MrstPsbComponent::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 MrstPsbComponent::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 MrstPsbComponent::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 MrstPsbComponent::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 MrstPsbComponent::ProcessorProcess(
+    OMX_BUFFERHEADERTYPE **buffers,
+    bool *retain,
+    OMX_U32 nr_buffers)
+{
+    OMX_U32 outfilledlen = 0;
+    OMX_S64 outtimestamp = 0;
+
+    LOGV("%s(): enter\n", __func__);
+
+    DumpBuffer(buffers[INPORT_INDEX]);
+
+    if (!buffers[INPORT_INDEX]->nFilledLen) {
+        LOGE("%s(),%d: exit, input buffer's nFilledLen is zero (ret = void)\n",
+             __func__, __LINE__);
+        return;
+    }
+
+    /* decoder */
+    if (!isencoder) {
+        if ((buffers[INPORT_INDEX]->nFlags & OMX_BUFFERFLAG_ENDOFFRAME) &&
+            (buffers[INPORT_INDEX]->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) {
+
+            /*
+             * processing codec data
+             */
+
+            retain[OUTPORT_INDEX] = true;
+        }
+
+        if (coding_type == OMX_VIDEO_CodingAVC) {
+            /*
+             * avc decoding specific code
+             */
+        }
+
+        /*
+         * decoding common code
+         */
+
+        outfilledlen = buffers[OUTPORT_INDEX]->nAllocLen;
+        outtimestamp = buffers[INPORT_INDEX]->nTimeStamp;
+    }
+
+    buffers[OUTPORT_INDEX]->nFilledLen = outfilledlen;
+    buffers[OUTPORT_INDEX]->nTimeStamp = outtimestamp;
+
+    //if (!retain[OUTPORT_INDEX])
+    //    DumpBuffer(buffers[OUTPORT_INDEX]);
+
+    LOGV("%s(),%d: exit (ret = void)\n", __func__, __LINE__);
+}
+
+/* end of implement ComponentBase::Processor[*] */
+
+/* end of component methods & helpers */
+
+/*
+ * CModule Interface
+ */
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
+
+static const char *g_name = (const char *)"OMX.Intel.Mrst.PSB";
+
+static const char *g_roles[] =
+{
+    (const char *)"video_decoder.avc",
+};
+
+OMX_ERRORTYPE wrs_omxil_cmodule_ops_instantiate(OMX_PTR *instance)
+{
+    ComponentBase *cbase;
+
+    cbase = new MrstPsbComponent;
+    if (!cbase) {
+        *instance = NULL;
+        return OMX_ErrorInsufficientResources;
+    }
+
+    *instance = cbase;
+    return OMX_ErrorNone;
+}
+
+struct wrs_omxil_cmodule_ops_s cmodule_ops = {
+    instantiate: wrs_omxil_cmodule_ops_instantiate,
+};
+
+struct wrs_omxil_cmodule_s WRS_OMXIL_CMODULE_SYMBOL = {
+    name: g_name,
+    roles: &g_roles[0],
+    nr_roles: ARRAY_SIZE(g_roles),
+    ops: &cmodule_ops,
+};
diff --git a/psb/psb.h b/psb/psb.h
new file mode 100644
index 0000000..6c5ad9d
--- /dev/null
+++ b/psb/psb.h
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2009 Wind River Systems, Inc.
+ *
+ * The right to copy, distribute, modify, or otherwise make use
+ * of this software may be licensed only pursuant to the terms
+ * of an applicable Wind River license agreement.
+ */
+
+#ifndef __WRS_OMXIL_INTEL_MRST_PSB
+#define __WRS_OMXIL_INTEL_MRST_PSB
+
+#include <OMX_Core.h>
+#include <OMX_Component.h>
+
+#include <cmodule.h>
+#include <portbase.h>
+#include <componentbase.h>
+
+//#defind PV_FULL_AVC_FRAME_MODE
+
+class MrstPsbComponent : public ComponentBase
+{
+public:
+    /*
+     * constructor & destructor
+     */
+    MrstPsbComponent();
+    ~MrstPsbComponent();
+
+private:
+    /*
+     * component methods & helpers
+     */
+    /* implement ComponentBase::ComponentAllocatePorts */
+    virtual OMX_ERRORTYPE ComponentAllocatePorts(void);
+
+    OMX_ERRORTYPE __AllocateAvcPort(OMX_U32 port_index, OMX_DIRTYPE dir);
+    OMX_ERRORTYPE __AllocateRawPort(OMX_U32 port_index, OMX_DIRTYPE dir);
+
+    /* implement ComponentBase::ComponentGet/SetPatameter */
+    virtual OMX_ERRORTYPE
+        ComponentGetParameter(OMX_INDEXTYPE nParamIndex,
+                              OMX_PTR pComponentParameterStructure);
+    virtual OMX_ERRORTYPE
+        ComponentSetParameter(OMX_INDEXTYPE nIndex,
+                              OMX_PTR pComponentParameterStructure);
+
+    /* implement ComponentBase::ComponentGet/SetConfig */
+    virtual OMX_ERRORTYPE
+        ComponentGetConfig(OMX_INDEXTYPE nIndex,
+                           OMX_PTR pComponentConfigStructure);
+    virtual OMX_ERRORTYPE
+        ComponentSetConfig(OMX_INDEXTYPE nIndex,
+                           OMX_PTR pComponentConfigStructure);
+
+    /* implement ComponentBase::Processor[*] */
+    virtual OMX_ERRORTYPE ProcessorInit(void);  /* Loaded to Idle */
+    virtual OMX_ERRORTYPE ProcessorDeinit(void);/* Idle to Loaded */
+    virtual OMX_ERRORTYPE ProcessorStart(void); /* Idle to Executing/Pause */
+    virtual OMX_ERRORTYPE ProcessorStop(void);  /* Executing/Pause to Idle */
+    virtual OMX_ERRORTYPE ProcessorPause(void); /* Executing to Pause */
+    virtual OMX_ERRORTYPE ProcessorResume(void);/* Pause to Executing */
+    virtual void ProcessorProcess(OMX_BUFFERHEADERTYPE **buffers,
+                                  bool *retain,
+                                  OMX_U32 nr_buffers);
+
+    /* end of component methods & helpers */
+
+    OMX_VIDEO_CODINGTYPE coding_type;
+    bool isencoder;
+
+    /* constant */
+    /* ports */
+    const static OMX_U32 NR_PORTS = 2;
+    const static OMX_U32 INPORT_INDEX = 0;
+    const static OMX_U32 OUTPORT_INDEX = 1;
+
+    /* buffer */
+    /* FIXME */
+    const static OMX_U32 INPORT_AVC_ACTUAL_BUFFER_COUNT = 5;
+    const static OMX_U32 INPORT_AVC_MIN_BUFFER_COUNT = 1;
+    const static OMX_U32 INPORT_AVC_BUFFER_SIZE = 4096;
+    const static OMX_U32 OUTPORT_RAW_ACTUAL_BUFFER_COUNT = 2;
+    const static OMX_U32 OUTPORT_RAW_MIN_BUFFER_COUNT = 1;
+    const static OMX_U32 OUTPORT_RAW_BUFFER_SIZE = 40960;
+    const static OMX_U32 INPORT_RAW_ACTUAL_BUFFER_COUNT = 2;
+    const static OMX_U32 INPORT_RAW_MIN_BUFFER_COUNT = 1;
+    const static OMX_U32 INPORT_RAW_BUFFER_SIZE = 40960;
+    const static OMX_U32 OUTPORT_AVC_ACTUAL_BUFFER_COUNT = 5;
+    const static OMX_U32 OUTPORT_AVC_MIN_BUFFER_COUNT = 1;
+    const static OMX_U32 OUTPORT_AVC_BUFFER_SIZE = 4096;
+};
+
+#endif /* __WRS_OMXIL_INTEL_MRST_PSB */
diff --git a/wrs_omxil_components.list b/wrs_omxil_components.list
index fd9235c..d38f587 100644
--- a/wrs_omxil_components.list
+++ b/wrs_omxil_components.list
@@ -1 +1,2 @@
 libwrs_omxil_intel_mrst_sst.so
+libwrs_omxil_intel_mrst_psb.so