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