diff options
| -rw-r--r-- | Android.mk | 15 | ||||
| -rw-r--r-- | avc-enc/Android.mk | 52 | ||||
| -rw-r--r-- | avc-enc/ebuild.mk | 21 | ||||
| -rw-r--r-- | avc-enc/psb_avc.cpp | 2725 | ||||
| -rw-r--r-- | avc-enc/psb_avc.h | 201 | ||||
| -rw-r--r-- | avc-enc/vabuffer.h | 29 | ||||
| -rw-r--r-- | ebuild.mk | 2 | ||||
| -rw-r--r-- | h263-enc/Android.mk | 53 | ||||
| -rw-r--r-- | h263-enc/ebuild.mk | 21 | ||||
| -rw-r--r-- | h263-enc/h263.cpp | 289 | ||||
| -rw-r--r-- | h263-enc/h263.h | 44 | ||||
| -rw-r--r-- | h263-enc/psb_h263.cpp | 1766 | ||||
| -rw-r--r-- | h263-enc/psb_h263.h | 173 | ||||
| -rw-r--r-- | h263-enc/vabuffer.h | 30 | ||||
| -rw-r--r-- | m4v-enc/Android.mk | 52 | ||||
| -rw-r--r-- | m4v-enc/ebuild.mk | 21 | ||||
| -rw-r--r-- | m4v-enc/psb_m4v.cpp | 1968 | ||||
| -rw-r--r-- | m4v-enc/psb_m4v.h | 198 | ||||
| -rw-r--r-- | m4v-enc/vabuffer.h | 29 | ||||
| -rw-r--r-- | psb-dec/Android.mk | 50 | ||||
| -rw-r--r-- | psb-dec/ebuild.mk | 21 | ||||
| -rw-r--r-- | psb-dec/h263.cpp | 283 | ||||
| -rw-r--r-- | psb-dec/h263.h | 44 | ||||
| -rw-r--r-- | psb-dec/psb.cpp | 3186 | ||||
| -rw-r--r-- | psb-dec/psb.h | 198 | ||||
| -rw-r--r-- | psb-dec/vabuffer.h | 30 | ||||
| -rw-r--r-- | sst/Android.mk | 27 | ||||
| -rw-r--r-- | sst/ebuild.mk | 21 | ||||
| -rw-r--r-- | sst/sst.cpp | 1790 | ||||
| -rw-r--r-- | sst/sst.h | 174 | ||||
| -rw-r--r-- | videocodec/OMXComponentCodecBase.cpp | 2 | ||||
| -rw-r--r-- | wrs_omxil_components.list | 21 |
32 files changed, 1 insertions, 13535 deletions
@@ -5,22 +5,7 @@ include $(CLEAR_VARS) VENDORS_INTEL_MRST_COMPONENTS_ROOT := $(LOCAL_PATH) -$(info WARNING: PRODUCT_COPY_FILES disabled in $(LOCAL_PATH)) -#PRODUCT_COPY_FILES += \ -# $(LOCAL_PATH)/wrs_omxil_components.list:system/etc/wrs_omxil_components.list -#$(call add-prebuilt-files, ETC, wrs_omxil_components.list) - -# mrst sst audio -#-include $(VENDORS_INTEL_MRST_COMPONENTS_ROOT)/sst/Android.mk - #intel video codecs -include $(VENDORS_INTEL_MRST_COMPONENTS_ROOT)/psb-dec/Android.mk -include $(VENDORS_INTEL_MRST_COMPONENTS_ROOT)/avc-enc/Android.mk -include $(VENDORS_INTEL_MRST_COMPONENTS_ROOT)/h263-enc/Android.mk -include $(VENDORS_INTEL_MRST_COMPONENTS_ROOT)/m4v-enc/Android.mk include $(VENDORS_INTEL_MRST_COMPONENTS_ROOT)/videocodec/Android.mk -#intel audio codecs -#-include $(VENDORS_INTEL_MRST_COMPONENTS_ROOT)/sst-stub-base/Android.mk - endif #BOARD_USES_MRST_OMX diff --git a/avc-enc/Android.mk b/avc-enc/Android.mk deleted file mode 100644 index 2fdc093..0000000 --- a/avc-enc/Android.mk +++ /dev/null @@ -1,52 +0,0 @@ -ifeq ($(strip $(BOARD_USES_WRS_OMXIL_CORE)),true) -LOCAL_PATH := $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := \ - psb_avc.cpp - -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE := libwrs_omxil_intel_mrst_psb_avc_enc - -LOCAL_CPPFLAGS := -DMIXVIDEO_ENCODE_ENABLE=0 - -LOCAL_LDFLAGS := - -LOCAL_STATIC_LIBRARIES := - -LOCAL_SHARED_LIBRARIES := \ - libwrs_omxil_common \ - liblog \ - libmixcommon \ - libmixvideo \ - libmixvbp \ - libva \ - libva-android \ - libva-tpi \ - libutils \ - libsharedbuffer - - -VENDORS_INTEL_MRST_MIXVBP_ROOT := $(VENDORS_INTEL_MRST_LIBMIX_ROOT)/mix_vbp - -LOCAL_C_INCLUDES := \ - $(TARGET_OUT_HEADERS)/wrs_omxil_core \ - $(TARGET_OUT_HEADERS)/khronos/openmax \ - $(TARGET_OUT_HEADERS)/libmixcommon \ - $(TARGET_OUT_HEADERS)/libmixvideo \ - $(TARGET_OUT_HEADERS)/libva \ - $(TARGET_OUT_HEADERS)/libdrm \ - $(TARGET_OUT_HEADERS)/libdrm/shared-core \ - $(TARGET_OUT_HEADERS)/libmixvbp \ - $(TARGET_OUT_HEADERS)/libpsb_drm \ - $(TARGET_OUT_HEADERS)/libsharedbuffer - -LOCAL_COPY_HEADERS_TO := libwrs_omxil_intel_mrst_psb_avc_enc -LOCAL_COPY_HEADERS := vabuffer.h - -ifeq ($(ENABLE_BUFFER_SHARE_MODE),true) -LOCAL_CPPFLAGS += -DENABLE_BUFFER_SHARE_MODE=1 -endif - -include $(BUILD_SHARED_LIBRARY) -endif diff --git a/avc-enc/ebuild.mk b/avc-enc/ebuild.mk deleted file mode 100644 index 06a4106..0000000 --- a/avc-enc/ebuild.mk +++ /dev/null @@ -1,21 +0,0 @@ -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/avc-enc/psb_avc.cpp b/avc-enc/psb_avc.cpp deleted file mode 100644 index 0406fb6..0000000 --- a/avc-enc/psb_avc.cpp +++ /dev/null @@ -1,2725 +0,0 @@ -/* - * psb.cpp, omx psb component file - * - * Copyright (c) 2009-2010 Wind River Systems, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -//#define LOG_NDEBUG 0 -#undef LOG_TAG -#define LOG_TAG "intel-avc-encoder" -#include <utils/Log.h> - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include <sys/time.h> - -#include <OMX_Core.h> -#include <OMX_IndexExt.h> -#include <OMX_VideoExt.h> -#include <OMX_IntelErrorTypes.h> - -#include <cmodule.h> -#include <portvideo.h> -#include <componentbase.h> - -#include <mixdisplayandroid.h> -#include <mixvideo.h> -#include <mixvideoconfigparamsenc_h264.h> - -#ifdef __cplusplus -extern "C" { -#endif - -#include <va/va.h> - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#include <va/va_android.h> - -#include "psb_avc.h" - -#define Display unsigned int - -#define SHOW_FPS 0 - -#include "vabuffer.h" - -#include <IntelBufferSharing.h> - -/* - * constructor & destructor - */ -MrstPsbComponent::MrstPsbComponent() -{ - LOGV("%s(): enter\n", __func__); - - buffer_sharing_state = BUFFER_SHARING_INVALID; - - OMX_ERRORTYPE oret = RequestToEnableBufferSharingMode(); - - if (oret != OMX_ErrorNone) { - LOGE("%s(),%d: set buffer sharing mode failed", __func__, __LINE__); - RequestToDisableBufferSharingMode(); - } - - LOGV("%s(),%d: exit\n", __func__, __LINE__); -} - -MrstPsbComponent::~MrstPsbComponent() -{ - LOGV("%s(): enter\n", __func__); - - OMX_ERRORTYPE oret = RequestToDisableBufferSharingMode(); - if (oret != OMX_ErrorNone) { - LOGE("%s(),%d: DisableBufferSharingMode failed", __func__, __LINE__); - } - - LOGV("%s(),%d: exit\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; - - 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; - - raw_port_index = INPORT_INDEX; - codec_port_index = OUTPORT_INDEX; - raw_port_dir = OMX_DirInput; - codec_port_dir = OMX_DirOutput; - - ret = __AllocateAvcPort(codec_port_index, codec_port_dir); - - if (ret != OMX_ErrorNone) - goto free_ports; - - LOGV("---- prepare to call __AllocateRawPort() ----\n"); - 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: - - 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]) { - LOGE("%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; - - 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 */ - - /* encoder */ - /* OMX_VIDEO_PARAM_BITRATETYPE */ - OMX_VIDEO_PARAM_BITRATETYPE bitrateparam; - - memset(&bitrateparam, 0, sizeof(bitrateparam)); - SetTypeHeader(&bitrateparam, sizeof(bitrateparam)); - - bitrateparam.nPortIndex = port_index; - bitrateparam.eControlRate = OMX_Video_ControlRateConstant; - bitrateparam.nTargetBitrate = 192000; - - avcport->SetPortBitrateParam(&bitrateparam, true); - /* end of OMX_VIDEO_PARAM_BITRATETYPE */ - - /* OMX_VIDEO_CONFIG_PRI_INFOTYPE */ - OMX_VIDEO_CONFIG_PRI_INFOTYPE privateinfoparam; - - memset(&privateinfoparam, 0, sizeof(privateinfoparam)); - SetTypeHeader(&privateinfoparam, sizeof(privateinfoparam)); - - privateinfoparam.nPortIndex = port_index; - privateinfoparam.nCapacity = 0; - privateinfoparam.nHolder = NULL; - - avcport->SetPortPrivateInfoParam(&privateinfoparam, true); - /* end of OMX_VIDEO_CONFIG_PRI_INFOTYPE */ - - avcEncIDRPeriod = 0; - avcEncPFrames = 0; - avcEncNaluFormatType = OMX_NaluFormatStartCodesSeparateFirstHeader; - - avcEncParamIntelBitrateType.nPortIndex = port_index; - avcEncParamIntelBitrateType.eControlRate = OMX_Video_Intel_ControlRateMax; - avcEncParamIntelBitrateType.nTargetBitrate = 0; - SetTypeHeader(&avcEncParamIntelBitrateType, sizeof(avcEncParamIntelBitrateType)); - - avcEncConfigNalSize.nPortIndex = port_index; - avcEncConfigNalSize.nNaluBytes = 0; - SetTypeHeader(&avcEncConfigNalSize, sizeof(avcEncConfigNalSize)); - - avcEncConfigSliceNumbers.nPortIndex = port_index; - avcEncConfigSliceNumbers.nISliceNumber = 2; - avcEncConfigSliceNumbers.nPSliceNumber = 2; - SetTypeHeader(&avcEncConfigSliceNumbers, sizeof(avcEncConfigSliceNumbers)); - - avcEncConfigAir.nPortIndex = port_index; - avcEncConfigAir.bAirEnable = OMX_FALSE; - avcEncConfigAir.bAirAuto = OMX_FALSE; - avcEncConfigAir.nAirMBs = 0; - avcEncConfigAir.nAirThreshold = 0; - SetTypeHeader(&avcEncConfigAir, sizeof(avcEncConfigAir)); - - avcEncFramerate.nPortIndex = port_index; - avcEncFramerate.xEncodeFramerate = 0; // Q16 format - SetTypeHeader(&avcEncFramerate, sizeof(avcEncFramerate)); - - 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]) { - LOGE("%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; - - rawportdefinition.nBufferCountActual = INPORT_RAW_ACTUAL_BUFFER_COUNT; - rawportdefinition.nBufferCountMin = INPORT_RAW_MIN_BUFFER_COUNT; - rawportdefinition.nBufferSize = INPORT_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 = 176; - rawportdefinition.format.video.nSliceHeight = 144; - 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_FormatYUV420SemiPlanar; - 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_FormatYUV420SemiPlanar; - 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; -} - -/* - Add OMX_COLOR_FormatVendorStartUnused + 0xA00E00 -> PVMF_MIME_RAWVA in file - external/opencore/nodes/pvomxvideodecnode/src/pvmf_omx_videodec_node.cpp - -*/ - -#define AVC_ENCODE_ERROR_CHECKING(p) \ -if (!p) { \ - LOGE("%s(), NULL pointer", __func__); \ - return OMX_ErrorBadParameter; \ -} \ -ret = CheckTypeHeader(p, sizeof(*p)); \ -if (ret != OMX_ErrorNone) { \ - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); \ - return ret; \ -} \ -OMX_U32 index = p->nPortIndex; \ -if (index != OUTPORT_INDEX) { \ - LOGE("%s(), wrong port index", __func__); \ - return OMX_ErrorBadPortIndex; \ -} \ -PortAvc *port = static_cast<PortAvc *> (ports[index]); \ -if (!port) { \ - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, \ - OMX_ErrorBadPortIndex); \ - return OMX_ErrorBadPortIndex; \ -} \ -LOGV("%s(), about to get native or supported nal format", __func__); \ -if (!port->IsEnabled()) { \ - LOGE("%s() : port is not enabled", __func__); \ - return OMX_ErrorNotReady; \ -} \ - -/* - * 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) { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortVideo *>(ports[index]); - - if (!port) { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, - OMX_ErrorBadPortIndex); - return OMX_ErrorBadPortIndex; - } - if(index == INPORT_INDEX ) { - if(p->nIndex < 1) { - p->eColorFormat = port->GetPortVideoParam()->eColorFormat; - p->eCompressionFormat = OMX_VIDEO_CodingUnused; - } - else { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__,OMX_ErrorNoMore); - return OMX_ErrorNoMore; - } - } - else if(index == OUTPORT_INDEX) { - if(p->nIndex < 1) { - p->eCompressionFormat= port->GetPortVideoParam()->eCompressionFormat; - p->eColorFormat = OMX_COLOR_FormatUnused; - } - else { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__,OMX_ErrorNoMore); - return OMX_ErrorNoMore; - } - } - else { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__,OMX_ErrorBadPortIndex); - return OMX_ErrorBadPortIndex; - } - LOGV("%s(), p->eColorFormat = %x\n", __func__, p->eColorFormat); - break; - } - case OMX_IndexParamVideoAvc: { - OMX_VIDEO_PARAM_AVCTYPE *p = - (OMX_VIDEO_PARAM_AVCTYPE *)pComponentParameterStructure; - OMX_U32 index = p->nPortIndex; - PortAvc *port = NULL; - - LOGV("%s(): port index : %lu\n", __func__, index); - - ret = CheckTypeHeader(p, sizeof(*p)); - if (ret != OMX_ErrorNone) { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortAvc *>(ports[index]); - - if (!port) { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, - OMX_ErrorBadPortIndex); - return OMX_ErrorBadPortIndex; - } - - memcpy(p, port->GetPortAvcParam(), sizeof(*p)); - break; - } - case OMX_IndexParamVideoBitrate: { - - if (avcEncParamIntelBitrateType.eControlRate - != OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_VIDEO_PARAM_BITRATETYPE *p = - (OMX_VIDEO_PARAM_BITRATETYPE *)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) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortVideo *>(ports[index]); - - if (!port) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, - OMX_ErrorBadPortIndex); - return OMX_ErrorBadPortIndex; - } - - memcpy(p, port->GetPortBitrateParam(), sizeof(*p)); - break; - } - case OMX_IndexParamNalStreamFormat: - case OMX_IndexParamNalStreamFormatSupported: { - OMX_NALSTREAMFORMATTYPE *p = - (OMX_NALSTREAMFORMATTYPE *)pComponentParameterStructure; - - LOGV("%s(), OMX_IndexParamNalStreamFormat or OMX_IndexParamNalStreamFormatSupported", __func__); - - AVC_ENCODE_ERROR_CHECKING(p) - - if(nParamIndex == OMX_IndexParamNalStreamFormat) { - p->eNaluFormat = OMX_NaluFormatStartCodesSeparateFirstHeader; - LOGV("%s(), OMX_IndexParamNalStreamFormat 0x%x", __func__, - p->eNaluFormat); - } else { - p->eNaluFormat = (OMX_NALUFORMATSTYPE)(OMX_NaluFormatStartCodes | - OMX_NaluFormatStartCodesSeparateFirstHeader); - LOGV("%s(), OMX_IndexParamNalStreamFormatSupported 0x%x", - __func__, p->eNaluFormat); - } - break; - } - - case OMX_IndexConfigVideoAVCIntraPeriod: { - OMX_VIDEO_CONFIG_AVCINTRAPERIOD *pVideoIDRInterval = - (OMX_VIDEO_CONFIG_AVCINTRAPERIOD *) pComponentParameterStructure; - - LOGV("%s(), OMX_IndexConfigVideoAVCIntraPeriod", __func__); - - if(!vcp) { - LOGE("%s(), vcp is NULL", __func__); - return OMX_ErrorNotReady; - } - - AVC_ENCODE_ERROR_CHECKING(pVideoIDRInterval) - ret = ComponentGetConfig(OMX_IndexConfigVideoAVCIntraPeriod, - pComponentParameterStructure); - - break; - } - case OMX_IndexParamIntelBitrate: { - - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - LOGV("%s(), OMX_IndexParamIntelBitrate", __func__); - - OMX_VIDEO_PARAM_INTEL_BITRATETYPE *pIntelBitrate = - (OMX_VIDEO_PARAM_INTEL_BITRATETYPE *) pComponentParameterStructure; - - AVC_ENCODE_ERROR_CHECKING(pIntelBitrate) - - *pIntelBitrate = avcEncParamIntelBitrateType; - - break; - } - - case OMX_IndexConfigIntelBitrate: { - - LOGV("%s(), OMX_IndexConfigIntelBitrate", __func__); - ret = ComponentGetConfig((OMX_INDEXTYPE)OMX_IndexConfigIntelBitrate, - (OMX_PTR)pComponentParameterStructure); - break; - - } - - case OMX_IndexConfigVideoNalSize: { - - LOGV("%s(), OMX_IndexConfigVideoNalSize", __func__); - ret = ComponentGetConfig(OMX_IndexConfigVideoNalSize, - pComponentParameterStructure); - - break; - } - - case OMX_IndexConfigIntelSliceNumbers: { - - LOGV("%s(), OMX_IndexConfigIntelSliceNumbers", __func__); - ret = ComponentGetConfig((OMX_INDEXTYPE)OMX_IndexConfigIntelSliceNumbers, - pComponentParameterStructure); - - break; - } - - case OMX_IndexConfigIntelAIR: { - - LOGV("%s(), OMX_IndexConfigIntelAIR", __func__); - ret = ComponentGetConfig((OMX_INDEXTYPE)OMX_IndexConfigIntelAIR, - pComponentParameterStructure); - - break; - } - - case OMX_IndexConfigVideoFramerate: { - - LOGV("%s(), OMX_IndexConfigVideoFramerate", __func__); - ret = ComponentGetConfig((OMX_INDEXTYPE)OMX_IndexConfigVideoFramerate, - pComponentParameterStructure); - - break; - } - - case OMX_IndexParamVideoProfileLevelQuerySupported: - { - OMX_VIDEO_PARAM_PROFILELEVELTYPE *p = - (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure; - PortAvc *port = NULL; - - OMX_U32 index = p->nPortIndex; - - LOGV("%s(): port index : %lu\n", __func__, index); - - ret = CheckTypeHeader(p, sizeof(*p)); - if (ret != OMX_ErrorNone) - { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - { - port = static_cast<PortAvc *>(ports[index]); - } - else - { - return OMX_ErrorBadParameter; - } - - const OMX_VIDEO_PARAM_AVCTYPE *avcParam = port->GetPortAvcParam(); - - p->eProfile = avcParam->eProfile; - p->eLevel = avcParam->eLevel; - - 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; - - LOGV("%s(): port index : %lu\n", __func__, index); - - ret = CheckTypeHeader(p, sizeof(*p)); - if (ret != OMX_ErrorNone) { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortVideo *>(ports[index]); - - if (!port) { - LOGE("%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) { - LOGE("%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; - - LOGV("%s(): port index : %lu\n", __func__, index); - - ret = CheckTypeHeader(p, sizeof(*p)); - if (ret != OMX_ErrorNone) { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortAvc *>(ports[index]); - - if (!port) { - LOGE("%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) { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, - OMX_ErrorIncorrectStateOperation); - return OMX_ErrorIncorrectStateOperation; - } - } - - ret = port->SetPortAvcParam(p, false); - break; - } - case OMX_IndexParamVideoBitrate: { - - LOGV("%s(), OMX_IndexParamVideoBitrate", __func__); - avcEncParamIntelBitrateType.eControlRate = OMX_Video_Intel_ControlRateMax; - - OMX_VIDEO_PARAM_BITRATETYPE *p = - (OMX_VIDEO_PARAM_BITRATETYPE *)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) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortVideo *>(ports[index]); - - if (!port) { - LOGE("%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) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, - OMX_ErrorIncorrectStateOperation); - return OMX_ErrorIncorrectStateOperation; - } - } - - ret = port->SetPortBitrateParam(p, false); - break; - } - case OMX_IndexParamVideoBytestream: { - - LOGV("%s(), OMX_IndexParamVideoBytestream", __func__); - - OMX_VIDEO_PARAM_BYTESTREAMTYPE *p = - (OMX_VIDEO_PARAM_BYTESTREAMTYPE *) pComponentParameterStructure; - - AVC_ENCODE_ERROR_CHECKING(p) - - OMX_STATETYPE state; - CBaseGetState((void *) GetComponentHandle(), &state); - if (state != OMX_StateLoaded && state != OMX_StateWaitForResources) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, - OMX_ErrorIncorrectStateOperation); - return OMX_ErrorIncorrectStateOperation; - } - - if (p->bBytestream == OMX_TRUE) { - avcEncNaluFormatType = OMX_NaluFormatStartCodes; - } else { - avcEncNaluFormatType = OMX_NaluFormatStartCodesSeparateFirstHeader; - } - - break; - } - case OMX_IndexParamNalStreamFormatSelect: { - - LOGV("%s() : OMX_IndexParamNalStreamFormatSelect", __func__); - OMX_NALSTREAMFORMATTYPE *p = - (OMX_NALSTREAMFORMATTYPE *) pComponentParameterStructure; - - AVC_ENCODE_ERROR_CHECKING(p) - - if (p->eNaluFormat == OMX_NaluFormatStartCodes || p->eNaluFormat - == OMX_NaluFormatStartCodesSeparateFirstHeader) { - OMX_STATETYPE state; - CBaseGetState((void *) GetComponentHandle(), &state); - if (state != OMX_StateLoaded && state != OMX_StateWaitForResources) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, - OMX_ErrorIncorrectStateOperation); - return OMX_ErrorIncorrectStateOperation; - } - - avcEncNaluFormatType = p->eNaluFormat; - LOGE("%s(), OMX_IndexParamNalStreamFormatSelect : 0x%x", - __func__, avcEncNaluFormatType); - } - break; - } - - case OMX_IndexConfigVideoAVCIntraPeriod: { - - LOGV("%s() : OMX_IndexConfigVideoAVCIntraPeriod", __func__); - - OMX_VIDEO_CONFIG_AVCINTRAPERIOD *pVideoIDRInterval = - (OMX_VIDEO_CONFIG_AVCINTRAPERIOD *) pComponentParameterStructure; - - AVC_ENCODE_ERROR_CHECKING(pVideoIDRInterval) - - avcEncIDRPeriod = pVideoIDRInterval->nIDRPeriod; - avcEncPFrames = pVideoIDRInterval->nPFrames; - LOGV("%s(), OMX_IndexConfigVideoAVCIntraPeriod : avcEncIDRPeriod = %d avcEncPFrames = %d", - __func__, avcEncIDRPeriod, avcEncPFrames); - break; - } - case OMX_IndexParamIntelBitrate: { - OMX_VIDEO_PARAM_INTEL_BITRATETYPE *pIntelBitrate = - (OMX_VIDEO_PARAM_INTEL_BITRATETYPE *) pComponentParameterStructure; - - LOGV("%s(), OMX_IndexParamIntelBitrate", __func__); - - AVC_ENCODE_ERROR_CHECKING(pIntelBitrate) - avcEncParamIntelBitrateType = *pIntelBitrate; - - break; - } - - case OMX_IndexConfigIntelBitrate: { - - LOGV("%s(), OMX_IndexParamIntelBitrate", __func__); - - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_VIDEO_CONFIG_INTEL_BITRATETYPE *pIntelBitrate = - (OMX_VIDEO_CONFIG_INTEL_BITRATETYPE *) pComponentParameterStructure; - - AVC_ENCODE_ERROR_CHECKING(pIntelBitrate) - avcEncConfigIntelBitrateType = *pIntelBitrate; - - break; - } - case OMX_IndexConfigVideoNalSize: { - - LOGV("%s() : OMX_IndexConfigVideoNalSize", __func__); - - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_VIDEO_CONFIG_NALSIZE *pNalSize = - (OMX_VIDEO_CONFIG_NALSIZE *) pComponentParameterStructure; - - AVC_ENCODE_ERROR_CHECKING(pNalSize) - - avcEncConfigNalSize = *pNalSize; - - break; - } - - case OMX_IndexConfigIntelSliceNumbers: { - - LOGV("%s() : OMX_IndexConfigIntelSliceNumbers", __func__); - - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_VIDEO_CONFIG_INTEL_SLICE_NUMBERS *pSliceNumbers = - (OMX_VIDEO_CONFIG_INTEL_SLICE_NUMBERS *) pComponentParameterStructure; - - AVC_ENCODE_ERROR_CHECKING(pSliceNumbers) - - avcEncConfigSliceNumbers = *pSliceNumbers; - - LOGV("%s(), nISliceNumber = %d nPSliceNumber = %d", __func__, - pSliceNumbers->nISliceNumber, pSliceNumbers->nPSliceNumber); - - break; - } - - case OMX_IndexConfigIntelAIR: { - - LOGV("%s() : OMX_IndexConfigIntelAIR", __func__); - - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_VIDEO_CONFIG_INTEL_AIR *pIntelAir = - (OMX_VIDEO_CONFIG_INTEL_AIR *) pComponentParameterStructure; - - AVC_ENCODE_ERROR_CHECKING(pIntelAir) - - avcEncConfigAir = *pIntelAir; - - break; - } - - case OMX_IndexConfigVideoFramerate: { - - LOGV("%s() : OMX_IndexConfigVideoFramerate", __func__); - - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_CONFIG_FRAMERATETYPE *pxFramerate = - (OMX_CONFIG_FRAMERATETYPE *) pComponentParameterStructure; - - AVC_ENCODE_ERROR_CHECKING(pxFramerate) - - avcEncFramerate = *pxFramerate; - - break; - } - - case OMX_IndexParamIntelAVCDecodeSettings: { - OMX_VIDEO_PARAM_INTEL_AVC_DECODE_SETTINGS *pAvcDecodeSettings = - (OMX_VIDEO_PARAM_INTEL_AVC_DECODE_SETTINGS *) pComponentParameterStructure; - - LOGV("%s(), OMX_IndexParamIntelAVCDecodeSettings", __func__); - - ret = CheckTypeHeader(pAvcDecodeSettings, sizeof(*pAvcDecodeSettings)); - if (ret != OMX_ErrorNone) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - LOGE("%s(), wrong codec mode", __func__); - return OMX_ErrorUnsupportedIndex; - - 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; - OMX_CONFIG_INTRAREFRESHVOPTYPE* pVideoIFrame; - OMX_VIDEO_CONFIG_AVCINTRAPERIOD *pVideoIDRInterval; - - LOGV("%s(): enter\n", __func__); - LOGV("%s() : nIndex = %d\n", __func__, nIndex); - - switch (nIndex) - { - case OMX_IndexConfigVideoAVCIntraPeriod: - { - if(!vcp) { - return OMX_ErrorNotReady; - } - pVideoIDRInterval = (OMX_VIDEO_CONFIG_AVCINTRAPERIOD *) pComponentConfigStructure; - if(!pVideoIDRInterval) { - LOGE("%s(), NULL pointer", __func__); - return OMX_ErrorBadParameter; - } - - AVC_ENCODE_ERROR_CHECKING(pVideoIDRInterval) - - if(!mix) { - LOGE("%s(), MixVideo is not created", __func__); - return OMX_ErrorUndefined; - } - - MixVideoConfigParams *mixbaseconfig = NULL; - MIX_RESULT mret = mix_video_get_config(mix, &mixbaseconfig); - if(mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), failed to get config", __func__); - return OMX_ErrorUndefined; - } - - uint intra_period = 0; - mret = mix_videoconfigparamsenc_get_intra_period(MIX_VIDEOCONFIGPARAMSENC(mixbaseconfig), &intra_period); - if(mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), failed to get intra period", __func__); - return OMX_ErrorUndefined; - } - - uint idr_interval = 0; - mret = mix_videoconfigparamsenc_h264_get_IDR_interval(MIX_VIDEOCONFIGPARAMSENC_H264(mixbaseconfig), &idr_interval); - if(mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), failed to get IDR interval", __func__); - return OMX_ErrorUndefined; - } - - mix_videoconfigparams_unref(mixbaseconfig); - - pVideoIDRInterval->nIDRPeriod = idr_interval; - pVideoIDRInterval->nPFrames = intra_period; - - LOGV("%s(), OMX_IndexConfigVideoAVCIntraPeriod : nIDRPeriod = %d, nPFrames = %d", - __func__, pVideoIDRInterval->nIDRPeriod, pVideoIDRInterval->nPFrames); - - SetTypeHeader(pVideoIDRInterval, sizeof(OMX_VIDEO_CONFIG_AVCINTRAPERIOD)); - } - break; - - case OMX_IndexConfigIntelBitrate: { - - LOGV("%s() : OMX_IndexParamIntelBitrate", __func__); - - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_VIDEO_CONFIG_INTEL_BITRATETYPE *pIntelBitrate = - (OMX_VIDEO_CONFIG_INTEL_BITRATETYPE *) pComponentConfigStructure; - - AVC_ENCODE_ERROR_CHECKING(pIntelBitrate) - - *pIntelBitrate = avcEncConfigIntelBitrateType; - - break; - } - case OMX_IndexConfigVideoNalSize: { - - LOGV("%s() : OMX_IndexConfigVideoNalSize", __func__); - - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_VIDEO_CONFIG_NALSIZE *pNalSize = - (OMX_VIDEO_CONFIG_NALSIZE *) pComponentConfigStructure; - - AVC_ENCODE_ERROR_CHECKING(pNalSize) - - *pNalSize = avcEncConfigNalSize; - break; - } - - case OMX_IndexConfigIntelSliceNumbers: { - - LOGV("%s() : OMX_IndexConfigIntelSliceNumbers", __func__); - - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_VIDEO_CONFIG_INTEL_SLICE_NUMBERS *pSliceNumbers = - (OMX_VIDEO_CONFIG_INTEL_SLICE_NUMBERS *) pComponentConfigStructure; - - AVC_ENCODE_ERROR_CHECKING(pSliceNumbers) - - *pSliceNumbers = avcEncConfigSliceNumbers; - break; - } - - case OMX_IndexConfigIntelAIR: { - - LOGV("%s() : OMX_IndexConfigIntelAIR", __func__); - - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_VIDEO_CONFIG_INTEL_AIR *pIntelAir = - (OMX_VIDEO_CONFIG_INTEL_AIR *) pComponentConfigStructure; - - AVC_ENCODE_ERROR_CHECKING(pIntelAir) - - *pIntelAir = avcEncConfigAir; - break; - } - case OMX_IndexConfigVideoFramerate: { - - LOGV("%s() : OMX_IndexConfigVideoFramerate", __func__); - - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_CONFIG_FRAMERATETYPE *pxFramerate = - (OMX_CONFIG_FRAMERATETYPE *) pComponentConfigStructure; - - AVC_ENCODE_ERROR_CHECKING(pxFramerate) - - *pxFramerate = avcEncFramerate; - break; - } - case OMX_IndexIntelPrivateInfo: { - OMX_VIDEO_CONFIG_PRI_INFOTYPE *p = - (OMX_VIDEO_CONFIG_PRI_INFOTYPE *)pComponentConfigStructure; - 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) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortVideo *>(ports[index]); - - if (!port) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, - OMX_ErrorBadPortIndex); - return OMX_ErrorBadPortIndex; - } - - memcpy(p, port->GetPortPrivateInfoParam(), sizeof(*p)); - break; - } - default: - { - return OMX_ErrorUnsupportedIndex; - } - } - LOGV("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, ret); - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstPsbComponent::ComponentSetConfig( - OMX_INDEXTYPE nParamIndex, - OMX_PTR pComponentConfigStructure) -{ - OMX_ERRORTYPE ret = OMX_ErrorUnsupportedIndex; - OMX_CONFIG_INTRAREFRESHVOPTYPE* pVideoIFrame; - OMX_VIDEO_CONFIG_AVCINTRAPERIOD *pVideoIDRInterval; - MIX_RESULT mret; - - LOGV("%s(): enter\n", __func__); - LOGV("%s() : nIndex = %d\n", __func__, nParamIndex); - - switch (nParamIndex) - { - case OMX_IndexConfigVideoIntraVOPRefresh: - { - LOGV("%s(), OMX_IndexConfigVideoIntraVOPRefresh", __func__); - - pVideoIFrame = (OMX_CONFIG_INTRAREFRESHVOPTYPE*) pComponentConfigStructure; - - AVC_ENCODE_ERROR_CHECKING(pVideoIFrame) - - LOGV("%s(), OMX_IndexConfigVideoIntraVOPRefresh", __func__); - if(pVideoIFrame->IntraRefreshVOP == OMX_TRUE) { - LOGV("%s(), pVideoIFrame->IntraRefreshVOP == OMX_TRUE", __func__); - - MixEncDynamicParams encdynareq; - memset(&encdynareq, 0, sizeof(encdynareq)); - encdynareq.force_idr = TRUE; - if(mix) { - mret = mix_video_set_dynamic_enc_config (mix, - MIX_ENC_PARAMS_FORCE_KEY_FRAME, &encdynareq); - if(mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), failed to set IDR interval", __func__); - } - } - } - } - break; - - case OMX_IndexConfigVideoAVCIntraPeriod: - { - LOGV("%s(), OMX_IndexConfigVideoAVCIntraPeriod", __func__); - - pVideoIDRInterval = (OMX_VIDEO_CONFIG_AVCINTRAPERIOD *) pComponentConfigStructure; - - AVC_ENCODE_ERROR_CHECKING(pVideoIDRInterval) - - LOGV("%s(), OMX_IndexConfigVideoAVCIntraPeriod : nIDRPeriod = %d, nPFrames = %d", - __func__, pVideoIDRInterval->nIDRPeriod, pVideoIDRInterval->nPFrames); - - MixEncDynamicParams encdynareq; - memset(&encdynareq, 0, sizeof(encdynareq)); - encdynareq.idr_interval = pVideoIDRInterval->nIDRPeriod; - encdynareq.intra_period = pVideoIDRInterval->nPFrames; - if(mix) { - - // Ignore the return code - mret = mix_video_set_dynamic_enc_config (mix, MIX_ENC_PARAMS_IDR_INTERVAL, &encdynareq); - if(mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), failed to set IDR interval", __func__); - } - - mret = mix_video_set_dynamic_enc_config (mix, MIX_ENC_PARAMS_GOP_SIZE, &encdynareq); - if(mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), failed to set GOP size", __func__); - } - } - } - break; - case OMX_IndexConfigIntelBitrate: { - - LOGV("%s(), OMX_IndexConfigIntelBitrate", __func__); - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - LOGV("%s(), eControlRate == OMX_Video_Intel_ControlRateMax"); - break; - } - - OMX_VIDEO_CONFIG_INTEL_BITRATETYPE *pIntelBitrate = - (OMX_VIDEO_CONFIG_INTEL_BITRATETYPE *) pComponentConfigStructure; - - AVC_ENCODE_ERROR_CHECKING(pIntelBitrate) - - avcEncConfigIntelBitrateType = *pIntelBitrate; - - if (mix && avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateVideoConferencingMode) { - - LOGV("%s(), avcEncConfigIntelBitrateType.nInitialQP = %d", __func__, - avcEncConfigIntelBitrateType.nInitialQP); - - LOGV("%s(), avcEncConfigIntelBitrateType.nMinQP = %d", __func__, - avcEncConfigIntelBitrateType.nMinQP); - - LOGV("%s(), avcEncConfigIntelBitrateType.nMaxEncodeBitrate = %d", __func__, - avcEncConfigIntelBitrateType.nMaxEncodeBitrate); - - LOGV("%s(), avcEncConfigIntelBitrateType.nTargetPercentage = %d", __func__, - avcEncConfigIntelBitrateType.nTargetPercentage); - - LOGV("%s(), avcEncConfigIntelBitrateType.nWindowSize = %d", __func__, - avcEncConfigIntelBitrateType.nWindowSize); - - MixEncParamsType params_type; - MixEncDynamicParams dynamic_params; - memset(&dynamic_params, 0, sizeof(dynamic_params)); - - - params_type = MIX_ENC_PARAMS_INIT_QP; - dynamic_params.init_QP = avcEncConfigIntelBitrateType.nInitialQP; - mret = mix_video_set_dynamic_enc_config(mix, params_type, - &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - - params_type = MIX_ENC_PARAMS_MIN_QP; - dynamic_params.min_QP = avcEncConfigIntelBitrateType.nMinQP; - mret = mix_video_set_dynamic_enc_config(mix, params_type, - &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - - params_type = MIX_ENC_PARAMS_BITRATE; - dynamic_params.bitrate - = avcEncConfigIntelBitrateType.nMaxEncodeBitrate; - mret = mix_video_set_dynamic_enc_config(mix, params_type, - &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - - params_type = MIX_ENC_PARAMS_TARGET_PERCENTAGE; - dynamic_params.target_percentage - = avcEncConfigIntelBitrateType.nTargetPercentage; - mret = mix_video_set_dynamic_enc_config(mix, params_type, - &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - - params_type = MIX_ENC_PARAMS_WINDOW_SIZE; - dynamic_params.window_size - = avcEncConfigIntelBitrateType.nWindowSize; - mret = mix_video_set_dynamic_enc_config(mix, params_type, - &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - } - break; - } - - case OMX_IndexConfigVideoNalSize: { - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_VIDEO_CONFIG_NALSIZE *pNalSize = - (OMX_VIDEO_CONFIG_NALSIZE *) pComponentConfigStructure; - - AVC_ENCODE_ERROR_CHECKING(pNalSize) - - avcEncConfigNalSize = *pNalSize; - - if (mix && avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateVideoConferencingMode) { - - MixEncParamsType params_type; - MixEncDynamicParams dynamic_params; - memset(&dynamic_params, 0, sizeof(dynamic_params)); - - params_type = MIX_ENC_PARAMS_MTU_SLICE_SIZE; - dynamic_params.max_slice_size = avcEncConfigNalSize.nNaluBytes * 8; // bits - mret = mix_video_set_dynamic_enc_config (mix, - params_type, &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - } - break; - } - - case OMX_IndexConfigIntelSliceNumbers: { - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_VIDEO_CONFIG_INTEL_SLICE_NUMBERS *pSliceNumbers = - (OMX_VIDEO_CONFIG_INTEL_SLICE_NUMBERS *) pComponentConfigStructure; - - AVC_ENCODE_ERROR_CHECKING(pSliceNumbers) - - avcEncConfigSliceNumbers = *pSliceNumbers; - - LOGV("%s(), OMX_IndexConfigIntelSliceNumbers", __func__); - LOGV("%s(), nISliceNumber = %d nPSliceNumber = %d", __func__, - pSliceNumbers->nISliceNumber, pSliceNumbers->nPSliceNumber); - - if (mix && avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateVideoConferencingMode) { - - MixEncParamsType params_type; - MixEncDynamicParams dynamic_params; - memset(&dynamic_params, 0, sizeof(dynamic_params)); - - params_type = MIX_ENC_PARAMS_I_SLICE_NUM; - dynamic_params.I_slice_num = pSliceNumbers->nISliceNumber; - mret = mix_video_set_dynamic_enc_config (mix, - params_type, &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - params_type = MIX_ENC_PARAMS_P_SLICE_NUM; - dynamic_params.P_slice_num = pSliceNumbers->nPSliceNumber; - mret = mix_video_set_dynamic_enc_config (mix, - params_type, &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - } - break; - } - case OMX_IndexConfigIntelAIR: { - - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - OMX_VIDEO_CONFIG_INTEL_AIR *pIntelAir = - (OMX_VIDEO_CONFIG_INTEL_AIR *) pComponentConfigStructure; - - AVC_ENCODE_ERROR_CHECKING(pIntelAir) - - avcEncConfigAir = *pIntelAir; - - if (mix && avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateVideoConferencingMode) { - - MixEncParamsType params_type; - MixEncDynamicParams dynamic_params; - memset(&dynamic_params, 0, sizeof(dynamic_params)); - - if(pIntelAir->bAirEnable) { - - params_type = MIX_ENC_PARAMS_REFRESH_TYPE; - dynamic_params.refresh_type = MIX_VIDEO_AIR; - mret = mix_video_set_dynamic_enc_config (mix, params_type, &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - - params_type = MIX_ENC_PARAMS_AIR; - dynamic_params.air_params.air_auto = pIntelAir->bAirAuto; - dynamic_params.air_params.air_MBs = pIntelAir->nAirMBs; - dynamic_params.air_params.air_threshold = pIntelAir->nAirThreshold; - mret = mix_video_set_dynamic_enc_config (mix, params_type, &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - - } else { - - params_type = MIX_ENC_PARAMS_REFRESH_TYPE; - dynamic_params.refresh_type = MIX_VIDEO_NONIR; - mret = mix_video_set_dynamic_enc_config (mix, params_type, &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - } - } - break; - } - - case OMX_IndexConfigVideoFramerate: { - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_CONFIG_FRAMERATETYPE *pxFramerate = - (OMX_CONFIG_FRAMERATETYPE *) pComponentConfigStructure; - - AVC_ENCODE_ERROR_CHECKING(pxFramerate) - - avcEncFramerate = *pxFramerate; - - if (mix && avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateVideoConferencingMode) { - - MixEncParamsType params_type; - MixEncDynamicParams dynamic_params; - memset(&dynamic_params, 0, sizeof(dynamic_params)); - - params_type = MIX_ENC_PARAMS_FRAME_RATE; - dynamic_params.frame_rate_denom = 1; - dynamic_params.frame_rate_num = avcEncFramerate.xEncodeFramerate >> 16; // Q16 format - mret = mix_video_set_dynamic_enc_config (mix, params_type, &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - } - break; - } - - default: - { - return OMX_ErrorUnsupportedIndex; - } - } - LOGV("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, ret); - return OMX_ErrorNone; -} -/* end of component methods & helpers */ - -/* - * implement ComponentBase::Processor[*] - */ -OMX_ERRORTYPE MrstPsbComponent::ProcessorInit(void) -{ - MixVideo *mix = NULL; - MixVideoInitParams *vip = NULL; - MixParams *mvp = NULL; - MixVideoConfigParams *vcp = NULL; - MixDisplayAndroid *display = NULL; - - temp_coded_data_buffer = NULL; - b_sync_frame = false; - - uint major, minor; - - OMX_ERRORTYPE oret = OMX_ErrorNone; - MIX_RESULT mret; - - LOGV("%s(): enter\n", __func__); - - mix = mix_video_new(); - LOGV("%s(): called to mix_video_new()", __func__); - - if (!mix) { - LOGE("%s(),%d: exit, mix_video_new failed", __func__, __LINE__); - goto error_out; - } - - mix_video_get_version(mix, &major, &minor); - LOGV("MixVideo version: %d.%d", major, minor); - - /* encoder */ - vcp = MIX_VIDEOCONFIGPARAMS(mix_videoconfigparamsenc_h264_new()); - - mvp = MIX_PARAMS(mix_videoencodeparams_new()); - - if (!vcp || !mvp ) { - LOGE("%s(),%d: exit, failed to allocate vcp, mvp\n", - __func__, __LINE__); - goto error_out; - } - - oret = ChangeVcpWithPortParam(vcp, - static_cast<PortVideo *>(ports[INPORT_INDEX]), - static_cast<PortVideo *>(ports[OUTPORT_INDEX]), - NULL); - if (oret != OMX_ErrorNone) { - LOGE("%s(),%d: exit, ChangeVcpWithPortParam failed (ret == 0x%08x)\n", - __func__, __LINE__, oret); - goto error_out; - } - - display = mix_displayandroid_new(); - if (!display) { - LOGE("%s(),%d: exit, mix_displayandroid_new failed", __func__, __LINE__); - goto error_out; - } - - vip = mix_videoinitparams_new(); - if (!vip) { - LOGE("%s(),%d: exit, mix_videoinitparams_new failed", __func__, - __LINE__); - goto error_out; - } - - { - Display *android_display = (Display*)malloc(sizeof(Display)); - *(android_display) = 0x18c34078; - - LOGV("*android_display = %d", *android_display); - - mret = mix_displayandroid_set_display(display, android_display); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(),%d: exit, mix_displayandroid_set_display failed " - "(ret == 0x%08x)", __func__, __LINE__, mret); - goto error_out; - } - } - - mret = mix_videoinitparams_set_display(vip, MIX_DISPLAY(display)); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(),%d: exit, mix_videoinitparams_set_display failed " - "(ret == 0x%08x)", __func__, __LINE__, mret); - goto error_out; - } - - mret = mix_video_initialize(mix, MIX_CODEC_MODE_ENCODE, vip, NULL); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(),%d: exit, mix_video_initialize failed (ret == 0x%08x)", - __func__, __LINE__, mret); - goto error_out; - } - - oret = CheckAndEnableBufferSharingMode(); - if (oret != OMX_ErrorNone) { - LOGE("%s(), %d: CheckAndEnableBufferSharingMode() failed ", __func__, __LINE__); - goto error_out; - } - - oret = RequestShareBuffers(mix, - MIX_VIDEOCONFIGPARAMSENC(vcp)->picture_width, - MIX_VIDEOCONFIGPARAMSENC(vcp)->picture_height); - if (oret != OMX_ErrorNone) { - LOGE("%s(), %d: RequestShareBuffers() failed ", __func__, __LINE__); - goto error_out; - } - - mix_videoconfigparamsenc_set_share_buf_mode(MIX_VIDEOCONFIGPARAMSENC(vcp), FALSE); - - LOGV("mix_video_configure"); - mret = mix_video_configure(mix, vcp, NULL); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), %d: exit, mix_video_configure failed " - "(ret:0x%08x)", __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - if(mret == MIX_RESULT_NO_MEMORY) { - oret = OMX_ErrorInsufficientResources; - } else if(mret == MIX_RESULT_NOT_PERMITTED) { - oret = (OMX_ERRORTYPE)OMX_ErrorIntelVideoNotPermitted; - } - goto error_out; - } - - LOGV("%s(): mix video configured", __func__); - - this->mix = mix; - this->vip = vip; - this->mvp = mvp; - this->vcp = vcp; - this->display = display; - this->mixbuffer_in[0] = NULL; - - inframe_counter = 0; - outframe_counter = 0; - is_mixvideodec_configured = OMX_FALSE; - - last_ts = 0; - last_fps = 0.0; - - b_config_sent = false; - - video_len = 0; - video_data = NULL; - - LOGV("temp coded buffer %dx%d", MIX_VIDEOCONFIGPARAMSENC(vcp)->picture_width, - MIX_VIDEOCONFIGPARAMSENC(vcp)->picture_height); - temp_coded_data_buffer_size = MIX_VIDEOCONFIGPARAMSENC(vcp)->picture_width * - MIX_VIDEOCONFIGPARAMSENC(vcp)->picture_height * 400 / 16 / 16; - temp_coded_data_buffer = new OMX_U8 [temp_coded_data_buffer_size]; - - oret = RegisterShareBuffersToPort(); - if (oret != OMX_ErrorNone) { - LOGE("%s(), %d RegisterShareBufferToPort() failed", __func__, __LINE__); - oret = OMX_ErrorUndefined; - goto error_out; - } - - oret = RegisterShareBuffersToLib(); - if (oret != OMX_ErrorNone) { - LOGE("%s(), %d register Share Buffering Mode failed", __func__, __LINE__); - goto error_out; - } - - oret = EnterBufferSharingMode(); - if (oret != OMX_ErrorNone) { - LOGE("%s(), %d EnterShareBufferingMode() failed", __func__, __LINE__); - goto error_out; - } - - LOGV("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, oret); - return oret; - -error_out: - if (buffer_sharing_state == BUFFER_SHARING_EXECUTING) { - ExitBufferSharingMode(); - } - mix_params_unref(mvp); - mix_videoconfigparams_unref(vcp); - mix_displayandroid_unref(display); - mix_videoinitparams_unref(vip); - mix_video_unref(mix); - - if (temp_coded_data_buffer != NULL) { - delete [] temp_coded_data_buffer; - temp_coded_data_buffer = NULL; - } - - return OMX_ErrorUndefined; -} - -OMX_ERRORTYPE MrstPsbComponent::ProcessorDeinit(void) -{ - OMX_ERRORTYPE oret = OMX_ErrorNone; - MIX_RESULT mret; - - LOGV("%s(): enter\n", __func__); - - if (buffer_sharing_state == BUFFER_SHARING_EXECUTING) { - oret = ExitBufferSharingMode(); - if (oret != OMX_ErrorNone) { - LOGE("%s(),%d: ExitShareBufferingMode failed", __func__, __LINE__); - } - } - - mix_video_eos(mix); - mix_video_flush(mix); - - mix_params_unref(mvp); - mix_videoconfigparams_unref(vcp); - mix_displayandroid_unref(display); - mix_videoinitparams_unref(vip); - - if (mixbuffer_in[0]) { - mix_video_release_mixbuffer(mix, mixbuffer_in[0]); - mixbuffer_in[0] = NULL; - } - - mix_video_deinitialize(mix); - mix_video_unref(mix); - - //delete temp coded buffer - if (temp_coded_data_buffer != NULL) { - delete [] temp_coded_data_buffer; - temp_coded_data_buffer = NULL; - } - - LOGV("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, oret); - return oret; -} - -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__); - - ports[INPORT_INDEX]->ReturnAllRetainedBuffers(); - - 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; -} - -// The function is based on mix_videofmtenc_h264_AnnexB_to_length_prefixed() -OMX_ERRORTYPE MrstPsbComponent::ParserConfigData(OMX_U8* coded_buf,OMX_U32 coded_len,OMX_U8** config_buf, OMX_U32* config_len) -{ - unsigned int pos = 0; - unsigned int last_pos = 0; - - unsigned int zero_byte_count = 0; - unsigned int prefix_length = 0; - unsigned int leading_zero_count = 0; - int nal_size = 0; - unsigned int nal_type = 0; - unsigned int length = 0; - - *config_buf = NULL; - *config_len = 0; - - LOGV ("Begin\n"); - - if (coded_buf == NULL || coded_len == 0) { - - LOGE("input arguments is not valid\n"); - return OMX_ErrorUndefined; - } - - while ((coded_buf[pos++] == 0x00)) { - zero_byte_count ++; - if (pos >= coded_len) //to make sure the buffer to be accessed is valid - break; - } - - if (coded_buf[pos - 1] != 0x01 || zero_byte_count < 2) - { - LOGE("The stream is not AnnexB format \n"); - return OMX_ErrorUndefined; ; //not AnnexB, we won't process it - } - - /* - * First NAL Unit - */ - nal_type = (*(coded_buf + pos)) & 0x1F; - LOGV ("First nal_type = 0x%x\n", nal_type); - - - if(nal_type != SPS && nal_type != PPS) { - - *config_len = 0; - return OMX_ErrorNone; - } - - zero_byte_count = 0; - last_pos = pos; - - while (pos < coded_len) { - - while (coded_buf[pos++] == 0) { - zero_byte_count ++; - if (pos >= coded_len) //to make sure the buffer to be accessed is valid - break; - } - - if (coded_buf[pos - 1] == 0x01 && zero_byte_count >= 2) { - if (zero_byte_count == 2) { - prefix_length = 3; - } - else { - prefix_length = 4; - leading_zero_count = zero_byte_count - 3; - } - - LOGV("leading_zero_count = %d\n", leading_zero_count); - - nal_size = pos - last_pos - prefix_length - leading_zero_count; - if (nal_size < 0) { - LOGE ("something wrong in the stream\n"); - return OMX_ErrorUndefined; //not AnnexB, we won't process it - } - - nal_type = (*(coded_buf + pos)) & 0x1F; - - LOGV ("nal_size = %d\n", nal_size); - LOGV ("nal_type = 0x%x\n", nal_type); - - if(nal_type != SPS && nal_type != PPS) { - length = pos - prefix_length - leading_zero_count; - LOGV ("config length = %d\n", length); - break; - } - - zero_byte_count = 0; - leading_zero_count = 0; - last_pos = pos; - } - else if (pos == coded_len) { - - LOGV ("Only header found\n"); - length = coded_len; - } - else { - zero_byte_count = 0; - leading_zero_count = 0; - } - } - - *config_len = length; - *config_buf = coded_buf; - LOGV ("End\n"); - return OMX_ErrorNone; -} - - -/* implement ComponentBase::ProcessorProcess */ -OMX_ERRORTYPE MrstPsbComponent::ProcessorProcess( - OMX_BUFFERHEADERTYPE ***pBuffers, - buffer_retain_t *retain, - OMX_U32 nr_buffers) -{ - MixIOVec buffer_in, buffer_out; - OMX_U32 outfilledlen = 0; - OMX_S64 outtimestamp = 0; - OMX_U32 outflags = 0; - - OMX_U8* config_data = NULL; - OMX_U32 config_len = 0; - - OMX_ERRORTYPE oret = OMX_ErrorNone; - MIX_RESULT mret; - - LOGV("%s(): <******avc******> enter encode\n", __func__); - - LOGV_IF((*pBuffers[INPORT_INDEX])->nFlags & OMX_BUFFERFLAG_EOS, - "%s(),%d: got OMX_BUFFERFLAG_EOS\n", __func__, __LINE__); - - if (!(*pBuffers[INPORT_INDEX])->nFilledLen) { - LOGV("%s(),%d: input buffer's nFilledLen is zero\n", - __func__, __LINE__); - goto out; - } - - if (buffer_sharing_state != BUFFER_SHARING_INVALID) { - buffer_in.data_size = buffer_sharing_info[0].dataSize; - buffer_in.buffer_size = buffer_sharing_info[0].allocatedSize; - buffer_in.data = - *(reinterpret_cast<uchar**>((*pBuffers[INPORT_INDEX])->pBuffer + (*pBuffers[INPORT_INDEX])->nOffset)); - } else { - buffer_in.data = - (*pBuffers[INPORT_INDEX])->pBuffer + (*pBuffers[INPORT_INDEX])->nOffset; - buffer_in.data_size = (*pBuffers[INPORT_INDEX])->nFilledLen; - buffer_in.buffer_size = (*pBuffers[INPORT_INDEX])->nFilledLen; - } - - LOGV("buffer_in.data=%x, data_size=%d, buffer_size=%d", - (unsigned)buffer_in.data, buffer_in.data_size, buffer_in.buffer_size); - - buffer_out.data = (*pBuffers[OUTPORT_INDEX])->pBuffer +(*pBuffers[OUTPORT_INDEX])->nOffset; - buffer_out.data_size = 0; - buffer_out.buffer_size = (*pBuffers[OUTPORT_INDEX])->nAllocLen - (*pBuffers[OUTPORT_INDEX])->nOffset; - mixiovec_out[0] = &buffer_out; - -normal_start: - /* get MixBuffer */ - mret = mix_video_get_mixbuffer(mix, &mixbuffer_in[0]); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), %d: exit, mix_video_get_mixbuffer failed (ret:0x%08x)", - __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - goto out; - } - - /* fill MixBuffer */ - mret = mix_buffer_set_data(mixbuffer_in[0], - buffer_in.data, buffer_in.data_size, - (ulong)this, AvcEncMixBufferCallback); - - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), %d: exit, mix_buffer_set_data failed (ret:0x%08x)", - __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - goto out; - } - - /* encoder */ - LOGV("in buffer = 0x%x ts = %lld", - (*pBuffers[INPORT_INDEX])->pBuffer + (*pBuffers[INPORT_INDEX])->nOffset, - (*pBuffers[INPORT_INDEX])->nTimeStamp); - - switch(avcEncNaluFormatType) { - - case OMX_NaluFormatStartCodes: //CAUTION: this case not tested yet - LOGV("begin to call mix_video_encode()"); - mret = mix_video_encode(mix, mixbuffer_in, 1, mixiovec_out, 1, - MIX_VIDEOENCODEPARAMS(mvp)); - - LOGV("%s(), mret = 0x%08x", __func__, mret); - LOGV("output data size = %d", mixiovec_out[0]->data_size); - - outtimestamp = (*pBuffers[INPORT_INDEX])->nTimeStamp; - - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), %d: exit, mix_video_encode failed (ret == 0x%08x)\n", - __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - goto out; - } - - if (mixiovec_out[0]-> data_size == 0) { - retain[OUTPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; - retain[INPORT_INDEX] = BUFFER_RETAIN_ACCUMULATE; - goto out; - } - outfilledlen = mixiovec_out[0]-> data_size; - break; - case OMX_NaluFormatStartCodesSeparateFirstHeader: - /* - FIXME: Stagefright requires: - 1. SPS and PPS are packed together in single output buffer; - 2. Only 1 SPS & PPS buffer is sent in one session; - */ - if (video_len == 0) { - - LOGV("begin to call mix_video_encode()"); - mret = mix_video_encode(mix, mixbuffer_in, 1, mixiovec_out, 1, - MIX_VIDEOENCODEPARAMS(mvp)); - - LOGV("%s(), mret = 0x%08x", __func__, mret); - LOGV("output data size = %d", mixiovec_out[0]->data_size); - - outtimestamp = (*pBuffers[INPORT_INDEX])->nTimeStamp; - - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), %d: exit, mix_video_encode failed (ret == 0x%08x)\n", - __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - goto out; - } - - if (mixiovec_out[0]-> data_size== 0) { - retain[OUTPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; - retain[INPORT_INDEX] = BUFFER_RETAIN_ACCUMULATE; - goto out; - } - b_sync_frame = false; - oret = ParserConfigData(mixiovec_out[0]->data,mixiovec_out[0]->data_size,&config_data, &config_len); - video_data = mixiovec_out[0]->data; - video_len = mixiovec_out[0]->data_size; - if(OMX_ErrorNone != oret ) { - LOGE("%s(), %d: exit, ParserConfigData() failed (ret == 0x%08x)\n",__func__, __LINE__, oret); - goto out; - } - - } - //IDR frame - if( config_len != 0) { - //Need send SPS+PPS NAL unit since stagefright want this as codec config data - if(!b_config_sent) { - outfilledlen = config_len; - outflags |= OMX_BUFFERFLAG_CODECCONFIG; - b_config_sent = true; - if(config_data == NULL) { - LOGE("%s()exit config_data is NULL.",__func__); - oret = OMX_ErrorUndefined; - goto out; - } - if ((*pBuffers[OUTPORT_INDEX])->pBuffer + (*pBuffers[OUTPORT_INDEX])->nOffset != config_data) { - memcpy((*pBuffers[OUTPORT_INDEX])->pBuffer + (*pBuffers[OUTPORT_INDEX])->nOffset, config_data, config_len); - } - // Separate SPS+PPS data from first IDR frame - video_len = mixiovec_out[0]->data_size - config_len; - if(video_len > temp_coded_data_buffer_size) { - LOGE("temp_coded_data_buffer_size is too small %s",__LINE__); - return OMX_ErrorUndefined; - } - memcpy(temp_coded_data_buffer,mixiovec_out[0]->data + config_len,video_len); - video_data = temp_coded_data_buffer; - } - else { - //send SPS+PPS+IDR frame data - if ((*pBuffers[OUTPORT_INDEX])->pBuffer + (*pBuffers[OUTPORT_INDEX])->nOffset != video_data) { - memcpy((*pBuffers[OUTPORT_INDEX])->pBuffer + (*pBuffers[OUTPORT_INDEX])->nOffset, video_data,video_len); - } - outfilledlen = video_len; - video_data = NULL; - video_len = 0; - } - outflags |= OMX_BUFFERFLAG_SYNCFRAME; - outflags |= OMX_BUFFERFLAG_ENDOFFRAME; - b_sync_frame = true; - } - else { - //NAL frame - outfilledlen = video_len; - if (b_sync_frame) { - //first IDR frame NAL data has been separated. It's a sync frame - outflags |= OMX_BUFFERFLAG_SYNCFRAME; - } - - if ((*pBuffers[OUTPORT_INDEX])->pBuffer + (*pBuffers[OUTPORT_INDEX])->nOffset != video_data) { - memcpy((*pBuffers[OUTPORT_INDEX])->pBuffer + (*pBuffers[OUTPORT_INDEX])->nOffset, video_data, video_len); - } - - video_data = NULL; - video_len = 0; - - outflags |= OMX_BUFFERFLAG_ENDOFFRAME; - } - - if (outfilledlen > 0) { - retain[OUTPORT_INDEX] = BUFFER_RETAIN_NOT_RETAIN; - } else { - retain[OUTPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; - } - - if (video_len == 0) { - retain[INPORT_INDEX] = BUFFER_RETAIN_ACCUMULATE; //release by callback - } else { - retain[INPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; //get again - } - break; - - default: - LOGE("Unsupported Nalu format.%s",__LINE__); - oret = OMX_ErrorUndefined; - break; - - } - -#if SHOW_FPS - { - struct timeval t; - OMX_TICKS current_ts, interval_ts; - float current_fps, average_fps; - - t.tv_sec = t.tv_usec = 0; - gettimeofday(&t, NULL); - - current_ts = - (nsecs_t)t.tv_sec * 1000000000 + (nsecs_t)t.tv_usec * 1000; - interval_ts = current_ts - last_ts; - last_ts = current_ts; - - current_fps = (float)1000000000 / (float)interval_ts; - average_fps = (current_fps + last_fps) / 2; - last_fps = current_fps; - - LOGV("FPS = %2.1f\n", average_fps); - } -#endif - -out: - if (mixbuffer_in[0]) { - mix_video_release_mixbuffer(mix, mixbuffer_in[0]); - mixbuffer_in[0] = NULL; - } - - LOGV("output buffers = %p:%d, flag = %x", - (*pBuffers[OUTPORT_INDEX])->pBuffer, - outfilledlen, - outflags); - - if(retain[OUTPORT_INDEX] != BUFFER_RETAIN_GETAGAIN) { - (*pBuffers[OUTPORT_INDEX])->nFilledLen = outfilledlen; - (*pBuffers[OUTPORT_INDEX])->nTimeStamp = outtimestamp; - (*pBuffers[OUTPORT_INDEX])->nFlags = outflags; - } - - if (retain[INPORT_INDEX] == BUFFER_RETAIN_NOT_RETAIN || - retain[INPORT_INDEX] == BUFFER_RETAIN_ACCUMULATE ) { - inframe_counter++; - } - - if (retain[OUTPORT_INDEX] == BUFFER_RETAIN_NOT_RETAIN) - outframe_counter++; - - if (avcEncParamIntelBitrateType.eControlRate != OMX_Video_Intel_ControlRateVideoConferencingMode) { - if (oret == (OMX_ERRORTYPE) OMX_ErrorIntelExtSliceSizeOverflow) { - oret = OMX_ErrorNone; - } - } - - LOGV_IF(oret == OMX_ErrorNone, - "%s(),%d: exit, encode is done\n", __func__, __LINE__); - - return oret; -} -/* end of implement ComponentBase::Processor[*] */ - -OMX_ERRORTYPE MrstPsbComponent::__AvcChangeVcpWithPortParam( - MixVideoConfigParams *vcp, PortAvc *port, bool *vcp_changed) -{ - OMX_ERRORTYPE ret = OMX_ErrorNone; - - /* encoder */ - MixVideoConfigParamsEnc *config = MIX_VIDEOCONFIGPARAMSENC(vcp); - mix_videoconfigparamsenc_set_encode_format( - config, MIX_ENCODE_TARGET_FORMAT_H264); - mix_videoconfigparamsenc_set_profile(config, MIX_PROFILE_H264BASELINE); - mix_videoconfigparamsenc_set_mime_type(config, "video/x-h264"); - mix_videoconfigparamsenc_h264_set_bus( - MIX_VIDEOCONFIGPARAMSENC_H264(config), 0); - mix_videoconfigparamsenc_h264_set_dlk( - MIX_VIDEOCONFIGPARAMSENC_H264(config), FALSE); - - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateVideoConferencingMode) { - - LOGV("%s(), avcEncConfigSliceNumbers.nISliceNumber = %d", __func__, avcEncConfigSliceNumbers.nISliceNumber); - LOGV("%s(), calls to mix_videoconfigparamsenc_h264_set_I_slice_num()", __func__); - - mix_videoconfigparamsenc_h264_set_I_slice_num( - MIX_VIDEOCONFIGPARAMSENC_H264(config), - avcEncConfigSliceNumbers.nISliceNumber); - - LOGV("%s(), avcEncConfigSliceNumbers.nPSliceNumber = %d", __func__, avcEncConfigSliceNumbers.nPSliceNumber); - LOGV("%s(), calls to mix_videoconfigparamsenc_h264_set_P_slice_num()", __func__); - - mix_videoconfigparamsenc_h264_set_P_slice_num( - MIX_VIDEOCONFIGPARAMSENC_H264(config), - avcEncConfigSliceNumbers.nPSliceNumber); - - if(avcEncConfigAir.bAirEnable == OMX_TRUE) { - mix_videoconfigparamsenc_set_refresh_type(config, MIX_VIDEO_AIR); - - MixAIRParams mixairparam; - mixairparam.air_auto = avcEncConfigAir.bAirAuto; - mixairparam.air_MBs = avcEncConfigAir.nAirMBs; - mixairparam.air_threshold = avcEncConfigAir.nAirThreshold; - mix_videoconfigparamsenc_set_AIR_params(config, mixairparam); - - } else { - mix_videoconfigparamsenc_set_refresh_type(config, MIX_VIDEO_NONIR); - } - - } else { - - mix_videoconfigparamsenc_h264_set_I_slice_num( - MIX_VIDEOCONFIGPARAMSENC_H264(config), - avcEncConfigSliceNumbers.nISliceNumber); - - mix_videoconfigparamsenc_h264_set_P_slice_num( - MIX_VIDEOCONFIGPARAMSENC_H264(config), - avcEncConfigSliceNumbers.nPSliceNumber); - - } - - - if (avcEncNaluFormatType == OMX_NaluFormatStartCodes || - avcEncNaluFormatType ==OMX_NaluFormatStartCodesSeparateFirstHeader) { - mix_videoconfigparamsenc_h264_set_delimiter_type( - MIX_VIDEOCONFIGPARAMSENC_H264(config), MIX_DELIMITER_ANNEXB); - LOGV("%s(), use MIX_DELIMITER_ANNEXB", __func__); - } else { - mix_videoconfigparamsenc_h264_set_delimiter_type( - MIX_VIDEOCONFIGPARAMSENC_H264(config), - MIX_DELIMITER_LENGTHPREFIX); - LOGV("%s(), use MIX_DELIMITER_LENGTHPREFIX", __func__); - } - - if(avcEncIDRPeriod == 0) //FIXME: avcEncIDRPeriod should be set dynamic - avcEncIDRPeriod = 1; - - LOGV("%s() : avcEncIDRPeriod = %d", __func__, avcEncIDRPeriod); - mix_videoconfigparamsenc_h264_set_IDR_interval( - MIX_VIDEOCONFIGPARAMSENC_H264(config), avcEncIDRPeriod); - - return ret; -} - -OMX_ERRORTYPE MrstPsbComponent::ChangeVcpWithPortParam( - MixVideoConfigParams *vcp, - PortVideo *port_in, - PortVideo *port_out, - bool *vcp_changed) -{ - const OMX_PARAM_PORTDEFINITIONTYPE *pd_out = port_out->GetPortDefinition(); - const OMX_PARAM_PORTDEFINITIONTYPE *pd_in = port_in->GetPortDefinition(); - OMX_ERRORTYPE ret; - - ret = __AvcChangeVcpWithPortParam(vcp, - static_cast<PortAvc *>(port_out), - vcp_changed); - /* encoder */ - - MixVideoConfigParamsEnc *config = MIX_VIDEOCONFIGPARAMSENC(vcp); - const OMX_VIDEO_PARAM_BITRATETYPE *bitrate = - port_out->GetPortBitrateParam(); - OMX_VIDEO_CONTROLRATETYPE controlrate; - - if ((config->picture_width != pd_out->format.video.nFrameWidth) || - (config->picture_height != pd_out->format.video.nFrameHeight)) { - LOGV("%s(): width : %d != %ld", __func__, - config->picture_width, pd_out->format.video.nFrameWidth); - LOGV("%s(): height : %d != %ld", __func__, - config->picture_height, pd_out->format.video.nFrameHeight); - - mix_videoconfigparamsenc_set_picture_res(config, - pd_out->format.video.nFrameWidth, - pd_out->format.video.nFrameHeight); - if (vcp_changed) - *vcp_changed = true; - } - - if (config->frame_rate_num != (pd_in->format.video.xFramerate >> 16)) { - LOGV("%s(): framerate : %u != %ld", __func__, - config->frame_rate_num, pd_in->format.video.xFramerate >> 16); - - mix_videoconfigparamsenc_set_frame_rate(config, - pd_in->format.video.xFramerate >> 16, - 1); - - - if(avcEncFramerate.xEncodeFramerate != 0) { - mix_videoconfigparamsenc_set_frame_rate(config, - avcEncFramerate.xEncodeFramerate >> 16, 1); - } else { - avcEncFramerate.xEncodeFramerate = pd_in->format.video.xFramerate; - } - - if (vcp_changed) - *vcp_changed = true; - } - - if(avcEncPFrames == 0) { - avcEncPFrames = config->frame_rate_num / 2; - } - - LOGV("%s() : avcEncPFrames = %d", __func__, avcEncPFrames); - mix_videoconfigparamsenc_set_intra_period(config, avcEncPFrames); - - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - - LOGV("%s(), eControlRate == OMX_Video_Intel_ControlRateMax", __func__); - - if (config->bitrate != bitrate->nTargetBitrate) { - LOGV("%s(): bitrate : %d != %ld", __func__, - config->bitrate, bitrate->nTargetBitrate); - - mix_videoconfigparamsenc_set_bit_rate(config, - bitrate->nTargetBitrate); - - if (vcp_changed) - *vcp_changed = true; - } - - if (config->rate_control == MIX_RATE_CONTROL_CBR) - controlrate = OMX_Video_ControlRateConstant; - else if (config->rate_control == MIX_RATE_CONTROL_VBR) - controlrate = OMX_Video_ControlRateVariable; - else - controlrate = OMX_Video_ControlRateDisable; - - if (controlrate != bitrate->eControlRate) { - LOGV("%s(): ratecontrol : %d != %d", __func__, - controlrate, bitrate->eControlRate); - - if ((bitrate->eControlRate == OMX_Video_ControlRateVariable) || - (bitrate->eControlRate == - OMX_Video_ControlRateVariableSkipFrames)) - config->rate_control = MIX_RATE_CONTROL_VBR; - else if ((bitrate->eControlRate == - OMX_Video_ControlRateConstant) || - (bitrate->eControlRate == - OMX_Video_ControlRateConstantSkipFrames)) - config->rate_control = MIX_RATE_CONTROL_CBR; - else - config->rate_control = MIX_RATE_CONTROL_NONE; - - if (vcp_changed) - *vcp_changed = true; - } - - /* hard coding */ - mix_videoconfigparamsenc_set_raw_format(config, - MIX_RAW_TARGET_FORMAT_NV12); - - mix_videoconfigparamsenc_set_init_qp(config, 24); - mix_videoconfigparamsenc_set_min_qp(config, 1); - mix_videoconfigparamsenc_set_buffer_pool_size(config, 8); - mix_videoconfigparamsenc_set_drawable(config, 0x0); - mix_videoconfigparamsenc_set_need_display(config, FALSE); - - } else { - - LOGV("%s(), eControlRate != OMX_Video_Intel_ControlRateMax, AVC", __func__); - config->rate_control = MIX_RATE_CONTROL_VCM; - - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateConstant - || avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateVariable) { - - if (config->bitrate - != avcEncParamIntelBitrateType.nTargetBitrate) { - LOGV("%s(): bitrate : %d != %ld", __func__, - config->bitrate, - avcEncParamIntelBitrateType.nTargetBitrate); - - mix_videoconfigparamsenc_set_bit_rate(config, - avcEncParamIntelBitrateType.nTargetBitrate); - - if (vcp_changed) - *vcp_changed = true; - } - } else if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateVideoConferencingMode) { - - LOGV("%s(), VCM mode", __func__); - - // call mix api to set the following - - mix_videoconfigparamsenc_set_bit_rate(config, - avcEncConfigIntelBitrateType.nMaxEncodeBitrate); - - LOGV("%s(), nMaxEncodeBitrate = %d", __func__, - avcEncConfigIntelBitrateType.nMaxEncodeBitrate); - - mix_videoconfigparamsenc_set_target_percentage(config, - avcEncConfigIntelBitrateType.nTargetPercentage); - - LOGV("%s(), nTargetPercentage = %d", __func__, - avcEncConfigIntelBitrateType.nTargetPercentage); - - mix_videoconfigparamsenc_set_window_size(config, - avcEncConfigIntelBitrateType.nWindowSize); - - LOGV("%s(), nWindowSize = %d", __func__, - avcEncConfigIntelBitrateType.nWindowSize); - - mix_videoconfigparamsenc_set_init_qp(config, - avcEncConfigIntelBitrateType.nInitialQP); - - LOGV("%s(), nInitialQP = %d", __func__, - avcEncConfigIntelBitrateType.nInitialQP); - - mix_videoconfigparamsenc_set_min_qp(config, - avcEncConfigIntelBitrateType.nMinQP); - - LOGV("%s(), nMinQP = %d", __func__, - avcEncConfigIntelBitrateType.nMinQP); - - mix_videoconfigparamsenc_set_max_slice_size(config, - avcEncConfigNalSize.nNaluBytes * 8); // bits - - LOGV("%s(), nNaluBytes = %d", __func__, - avcEncConfigNalSize.nNaluBytes); - - } - - /* hard coding */ - mix_videoconfigparamsenc_set_raw_format(config, - MIX_RAW_TARGET_FORMAT_YUV420); - mix_videoconfigparamsenc_set_buffer_pool_size(config, 8); - mix_videoconfigparamsenc_set_drawable(config, 0x0); - mix_videoconfigparamsenc_set_need_display(config, FALSE); - } - - return ret; -} - -/* end of vcp setting helpers */ - -/* share buffer setting */ -OMX_ERRORTYPE MrstPsbComponent::RequestToEnableBufferSharingMode() -{ - BufferShareStatus bsret; - - if (buffer_sharing_state != BUFFER_SHARING_INVALID) { - LOGE("%s(),%d: invoke %s failed (incorrect state).", __func__, __LINE__, __func__); - return OMX_ErrorUndefined; - } - - buffer_sharing_count = 7; - buffer_sharing_info = NULL; - buffer_sharing_lib = BufferShareRegistry::getInstance(); - - bsret = buffer_sharing_lib->encoderRequestToEnableSharingMode(); - if (bsret != BS_SUCCESS) { - LOGE("%s(),%d: encoder request to enable buffer sharing mode failed:%d", __func__, __LINE__, bsret); - return OMX_ErrorUndefined; - } - - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstPsbComponent::CheckAndEnableBufferSharingMode() -{ - BufferShareStatus bsret; - - if (buffer_sharing_state != BUFFER_SHARING_INVALID) { - LOGE("%s(),%d: invoke %s failed (incorrect state).", __func__, __LINE__, __func__); - return OMX_ErrorUndefined; - } - - if (buffer_sharing_lib->isBufferSharingModeEnabled()) { - LOGW("Buffer sharing is enabled (video source does support)"); - buffer_sharing_state = BUFFER_SHARING_LOADED; - } else { - LOGW("Buffer sharing is disabled (video source doesn't support)"); - } - - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstPsbComponent::RequestToDisableBufferSharingMode() -{ - BufferShareStatus bsret; - - if ((buffer_sharing_state != BUFFER_SHARING_INVALID) && - (buffer_sharing_state != BUFFER_SHARING_LOADED)) { - LOGE("%s(),%d: invoke %s failed (incorrect state).", __func__, __LINE__, __func__); - return OMX_ErrorUndefined; - } - - if (buffer_sharing_state == BUFFER_SHARING_INVALID) { - LOGW("%s(),%d: buffer sharing already in invalid state.", __func__, __LINE__); - return OMX_ErrorNone; - } - - if (buffer_sharing_info) { - delete [] buffer_sharing_info; - } - buffer_sharing_info = NULL; - - bsret = buffer_sharing_lib->encoderRequestToDisableSharingMode(); - if (bsret != BS_SUCCESS) { - LOGE("%s(),%d: request to disable sharing mode failed.", __func__, __LINE__); - return OMX_ErrorUndefined; - } - - buffer_sharing_state = BUFFER_SHARING_INVALID; - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstPsbComponent::RequestShareBuffers(MixVideo* mix, int width, int height) -{ - int i; - int buf_width, buf_height, buf_size; - MIX_RESULT mret; - bool is_request_ok = true; - - if (width <= 0 || height <= 0) { - LOGE("%s(),%d: width and height incorrect", __func__, __LINE__); - return OMX_ErrorUndefined; - } - - if ((buffer_sharing_state != BUFFER_SHARING_INVALID) && - (buffer_sharing_state != BUFFER_SHARING_LOADED)) { - LOGE("%s(),%d: invoke %s failed (incorrect state:%d).", __func__, __LINE__, __func__, buffer_sharing_state); - return OMX_ErrorUndefined; - } - - if (buffer_sharing_state == BUFFER_SHARING_INVALID) { - LOGW("%s(),%d: buffer sharing not enabled, do nothing.", __func__, __LINE__); - return OMX_ErrorNone; - } - - if (buffer_sharing_info != NULL) { - delete [] buffer_sharing_info; - buffer_sharing_info = NULL; - } - - buffer_sharing_info = new SharedBufferType[buffer_sharing_count]; - //query mix for share buffer info. - for (i = 0; i < buffer_sharing_count; i++) { - buf_width = width; - buf_height = height; - buf_size = SHARE_PTR_ALIGN(buf_width) * buf_height * 3 / 2; - mret = mix_video_get_new_userptr_for_surface_buffer(mix, - (uint)buf_width, - (uint)buf_height, - MIX_STRING_TO_FOURCC("NV12"), - (uint)buf_size, - (uint*)&buffer_sharing_info[i].allocatedSize, - (uint*)&buffer_sharing_info[i].stride, - (uint8**)&buffer_sharing_info[i].pointer); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(),%d: mix_video_get_new_userptr_for_surface_buffer failed", __func__, __LINE__); - is_request_ok = false; - break; - } - buffer_sharing_info[i].width = buf_width; - buffer_sharing_info[i].height = buf_height; - buffer_sharing_info[i].dataSize = buffer_sharing_info[i].stride * buf_height * 3 / 2; - - LOGD("width:%d, Height:%d, stride:%d, pointer:%p", buffer_sharing_info[i].width, - buffer_sharing_info[i].height, buffer_sharing_info[i].stride, - buffer_sharing_info[i].pointer); - } - - if (!is_request_ok) { - delete []buffer_sharing_info; - buffer_sharing_info = NULL; - LOGE("%s(),%d: %s failed", __func__, __LINE__,"get usr ptr for surface buffer"); - return OMX_ErrorUndefined; - } - - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstPsbComponent::RegisterShareBuffersToLib() -{ - if ((buffer_sharing_state != BUFFER_SHARING_INVALID) && - (buffer_sharing_state != BUFFER_SHARING_LOADED)) { - LOGE("%s(),%d: invoke %s failed (incorrect state).", __func__, __LINE__, __func__); - return OMX_ErrorUndefined; - } - - if (buffer_sharing_state == BUFFER_SHARING_INVALID) { - LOGW("%s(),%d: buffer sharing not enabled, do nothing.", __func__, __LINE__); - return OMX_ErrorNone; - } - - BufferShareStatus bsret = buffer_sharing_lib->encoderSetSharedBuffer(buffer_sharing_info, buffer_sharing_count); - if (bsret != BS_SUCCESS) { - LOGE("%s(),%d: encoder set shared buffer failed", __func__, __LINE__); - return OMX_ErrorUndefined; - } - - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstPsbComponent::RegisterShareBuffersToPort() -{ - if ((buffer_sharing_state != BUFFER_SHARING_INVALID) && - (buffer_sharing_state != BUFFER_SHARING_LOADED)) { - LOGE("%s(),%d: invoke %s failed (incorrect state).", __func__, __LINE__, __func__); - return OMX_ErrorUndefined; - } - - OMX_VIDEO_CONFIG_PRI_INFOTYPE privateinfoparam; - memset(&privateinfoparam, 0, sizeof(privateinfoparam)); - SetTypeHeader(&privateinfoparam, sizeof(privateinfoparam)); - - //caution: buffer-sharing info stored in INPORT (raw port) - privateinfoparam.nPortIndex = INPORT_INDEX; - if (buffer_sharing_state == BUFFER_SHARING_INVALID) { - privateinfoparam.nCapacity = 0; - privateinfoparam.nHolder = NULL; - } else { - privateinfoparam.nCapacity = buffer_sharing_count; - privateinfoparam.nHolder = buffer_sharing_info; - } - OMX_ERRORTYPE ret = static_cast<PortVideo*>(ports[privateinfoparam.nPortIndex])->SetPortPrivateInfoParam(&privateinfoparam, false); - - return ret; -} - -OMX_ERRORTYPE MrstPsbComponent::EnterBufferSharingMode() -{ - if ((buffer_sharing_state != BUFFER_SHARING_INVALID) && - (buffer_sharing_state != BUFFER_SHARING_LOADED)) { - LOGE("%s(),%d: invoke %s failed (incorrect state).", __func__, __LINE__, __func__); - return OMX_ErrorUndefined; - } - - if (buffer_sharing_state == BUFFER_SHARING_INVALID) { - LOGW("%s(),%d: buffer sharing not enabled, do nothing.", __func__, __LINE__); - return OMX_ErrorNone; - } - - BufferShareStatus bsret = buffer_sharing_lib->encoderEnterSharingMode(); - if (bsret != BS_SUCCESS) { - LOGE("%s(),%d: encoderEnterSharingMode failed", __func__, __LINE__); - if (bsret == BS_PEER_DOWN) { - LOGE("%s(), %d: camera down during buffer sharing state transition.",__func__, __LINE__); - } - return OMX_ErrorUndefined; - } - - buffer_sharing_state = BUFFER_SHARING_EXECUTING; - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstPsbComponent::ExitBufferSharingMode() -{ - if ((buffer_sharing_state != BUFFER_SHARING_INVALID) && - (buffer_sharing_state != BUFFER_SHARING_EXECUTING)) { - LOGE("%s(),%d: invoke %s failed (incorrect state).", __func__, __LINE__, __func__); - return OMX_ErrorUndefined; - } - - if (buffer_sharing_state == BUFFER_SHARING_INVALID) { - LOGW("%s(),%d: buffer sharing not enabled, do nothing.", __func__, __LINE__); - return OMX_ErrorNone; - } - - BufferShareStatus bsret = buffer_sharing_lib->encoderExitSharingMode(); - if (bsret != BS_SUCCESS) { - LOGE("%s(),%d: encoderEnterSharingMode failed", __func__, __LINE__); - if (bsret == BS_PEER_DOWN) { - LOGE("%s(), %d: camera down during buffer sharing state transition.",__func__, __LINE__); - } - return OMX_ErrorUndefined; - } - - buffer_sharing_state = BUFFER_SHARING_LOADED; - return OMX_ErrorNone; -} -/* end of share buffer setting */ - -OMX_ERRORTYPE MrstPsbComponent::ProcessorFlush(OMX_U32 port_index) { - - LOGV("port_index = %d Flushed!\n", port_index); - - if ((port_index == INPORT_INDEX || port_index == OMX_ALL)) { - ports[INPORT_INDEX]->ReturnAllRetainedBuffers(); - mix_video_flush( mix); - } - return OMX_ErrorNone; -} - -void MrstPsbComponent::AvcEncMixBufferCallback(ulong token, uchar *data) { - MrstPsbComponent *_this = (MrstPsbComponent *) token; - - LOGV("AvcEncMixBufferCallback Begin\n"); - - if(_this) { - _this->ports[_this->INPORT_INDEX]->ReturnAllRetainedBuffers(); - } - - LOGV("AvcEncMixBufferCallback End\n"); -} - -/* - * CModule Interface - */ -#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) - -static const char *g_name = (const char *)"OMX.Intel.Mrst.PSB.AVC.Enc"; - -static const char *g_roles[] = -{ - (const char *)"video_encoder.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/avc-enc/psb_avc.h b/avc-enc/psb_avc.h deleted file mode 100644 index e55062d..0000000 --- a/avc-enc/psb_avc.h +++ /dev/null @@ -1,201 +0,0 @@ -/* - * psb.h, omx psb component header - * - * Copyright (c) 2009-2010 Wind River Systems, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#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> - -#include <IntelBufferSharing.h> - -using android::sp; -using android::BufferShareRegistry; - -typedef enum -{ - UNSPECIFIED = 0, - CODED_SLICE_NON_IDR, - CODED_SLICE_PARTITION_A, - CODED_SLICE_PARTITION_B, - CODED_SLICE_PARTITION_C, - CODED_SLICE_IDR, - SEI, - SPS, - PPS, - AU_DELIMITER, - END_OF_SEQ, - END_OF_STREAM, - FILLER_DATA, - SPS_EXT, - CODED_SLICE_AUX_PIC_NO_PARTITION = 19, - INVALID_NAL_TYPE = 64 -} AvcNaluType; - -typedef enum -{ - BUFFER_SHARING_INVALID, - BUFFER_SHARING_LOADED, - BUFFER_SHARING_EXECUTING -} BufferSharingState; - -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 OMX_ERRORTYPE ProcessorFlush(OMX_U32 port_index); - virtual OMX_ERRORTYPE ProcessorProcess(OMX_BUFFERHEADERTYPE ***pBuffers, - buffer_retain_t *retain, - OMX_U32 nr_buffers); - - /* end of component methods & helpers */ - - /* encoders */ - OMX_ERRORTYPE __AvcChangeVcpWithPortParam(MixVideoConfigParams *vcp, - PortAvc *port, bool *vcp_changed); - OMX_ERRORTYPE ChangeVcpWithPortParam(MixVideoConfigParams *vcp, - PortVideo *port_in, - PortVideo *port_out, - bool *vcp_changed); - - static void AvcEncMixBufferCallback(ulong token, uchar *data); - OMX_ERRORTYPE ParserConfigData(OMX_U8* coded_buf, OMX_U32 coded_len,OMX_U8** config_buf, OMX_U32* config_len); - - /* end of vcp setting helpers */ - - /* share buffer setting */ - OMX_ERRORTYPE EnterBufferSharingMode(void); - OMX_ERRORTYPE ExitBufferSharingMode(void); - OMX_ERRORTYPE RequestToEnableBufferSharingMode(void); - OMX_ERRORTYPE RequestToDisableBufferSharingMode(void); - OMX_ERRORTYPE CheckAndEnableBufferSharingMode(void); - OMX_ERRORTYPE RequestShareBuffers(MixVideo* mix, int width, int height); - OMX_ERRORTYPE RegisterShareBuffersToPort(void); - OMX_ERRORTYPE RegisterShareBuffersToLib(void); - /* end of share buffer setting */ - /* mix video */ - MixVideo *mix; - MixVideoInitParams *vip; - MixParams *mvp; - MixVideoConfigParams *vcp; - MixDisplayAndroid *display; - MixBuffer *mixbuffer_in[1]; - MixIOVec *mixiovec_out[1]; - - OMX_BOOL is_mixvideodec_configured; - - OMX_U32 inframe_counter; - OMX_U32 outframe_counter; - - /* for fps */ - OMX_TICKS last_ts; - float last_fps; - - /* for buffer sharing */ - sp<BufferShareRegistry> buffer_sharing_lib; - int buffer_sharing_count; - SharedBufferType* buffer_sharing_info; - BufferSharingState buffer_sharing_state; - - /* for Nalu format encapsulation and config data setting*/ - bool b_config_sent; - bool b_sync_frame; - OMX_U8* video_data; - OMX_U32 video_len; - - OMX_U8 *temp_coded_data_buffer; - OMX_U32 temp_coded_data_buffer_size; - - OMX_NALUFORMATSTYPE avcEncNaluFormatType; - OMX_U32 avcEncIDRPeriod; - OMX_U32 avcEncPFrames; - - OMX_VIDEO_PARAM_INTEL_BITRATETYPE avcEncParamIntelBitrateType; - OMX_VIDEO_CONFIG_INTEL_BITRATETYPE avcEncConfigIntelBitrateType; - OMX_VIDEO_CONFIG_NALSIZE avcEncConfigNalSize; - OMX_VIDEO_CONFIG_INTEL_SLICE_NUMBERS avcEncConfigSliceNumbers; - OMX_VIDEO_CONFIG_INTEL_AIR avcEncConfigAir; - OMX_CONFIG_FRAMERATETYPE avcEncFramerate; - - /* constant */ - /* ports */ - const static OMX_U32 NR_PORTS = 2; - const static OMX_U32 INPORT_INDEX = 0; - const static OMX_U32 OUTPORT_INDEX = 1; - - /* default buffer */ - const static OMX_U32 INPORT_RAW_ACTUAL_BUFFER_COUNT = 2; //FIXME: must be set as 2 - const static OMX_U32 INPORT_RAW_MIN_BUFFER_COUNT = 1; - const static OMX_U32 INPORT_RAW_BUFFER_SIZE = 614400; - 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 = 38016; - - const static OMX_U32 INPORT_AVC_ACTUAL_BUFFER_COUNT = 256; - const static OMX_U32 INPORT_AVC_MIN_BUFFER_COUNT = 1; - const static OMX_U32 INPORT_AVC_BUFFER_SIZE = 614400; - const static OMX_U32 OUTPORT_AVC_ACTUAL_BUFFER_COUNT = 10; - const static OMX_U32 OUTPORT_AVC_MIN_BUFFER_COUNT = 1; - const static OMX_U32 OUTPORT_AVC_BUFFER_SIZE = 3240000; - - -}; - -#endif /* __WRS_OMXIL_INTEL_MRST_PSB */ diff --git a/avc-enc/vabuffer.h b/avc-enc/vabuffer.h deleted file mode 100644 index ea0b56a..0000000 --- a/avc-enc/vabuffer.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * vabuffer.h, vabuffer structure header - * - * Copyright (c) 2009-2010 Wind River Systems, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __VA_BUFFER_H__ -#define __VA_BUFFER_H__ - -struct VABuffer -{ - VASurfaceID surface; - VADisplay display; - unsigned int frame_structure; -}; - -#endif /* __VA_BUFFER_H__ */ @@ -3,5 +3,3 @@ include $(CLEAR_VARS) VENDORS_INTEL_MRST_COMPONENTS_ROOT := $(LOCAL_PATH) -# mrst sst audio --include $(VENDORS_INTEL_MRST_COMPONENTS_ROOT)/sst/ebuild.mk diff --git a/h263-enc/Android.mk b/h263-enc/Android.mk deleted file mode 100644 index 57f8bbf..0000000 --- a/h263-enc/Android.mk +++ /dev/null @@ -1,53 +0,0 @@ -ifeq ($(strip $(BOARD_USES_WRS_OMXIL_CORE)),true) -LOCAL_PATH := $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := \ - psb_h263.cpp \ - h263.cpp - -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE := libwrs_omxil_intel_mrst_psb_h263_enc - -LOCAL_CPPFLAGS := -DMIXVIDEO_ENCODE_ENABLE=0 - -LOCAL_LDFLAGS := - -LOCAL_STATIC_LIBRARIES := \ - -LOCAL_SHARED_LIBRARIES := \ - libwrs_omxil_common \ - liblog \ - libmixcommon \ - libmixvideo \ - libmixvbp \ - libva \ - libva-android \ - libva-tpi \ - libutils \ - libsharedbuffer - - -VENDORS_INTEL_MRST_MIXVBP_ROOT := $(VENDORS_INTEL_MRST_LIBMIX_ROOT)/mix_vbp - -LOCAL_C_INCLUDES := \ - $(TARGET_OUT_HEADERS)/wrs_omxil_core \ - $(TARGET_OUT_HEADERS)/khronos/openmax \ - $(TARGET_OUT_HEADERS)/libmixcommon \ - $(TARGET_OUT_HEADERS)/libmixvideo \ - $(TARGET_OUT_HEADERS)/libva \ - $(TARGET_OUT_HEADERS)/libdrm \ - $(TARGET_OUT_HEADERS)/libdrm/shared-core \ - $(TARGET_OUT_HEADERS)/libmixvbp \ - $(TARGET_OUT_HEADERS)/libpsb_drm \ - $(TARGET_OUT_HEADERS)/libsharedbuffer - -LOCAL_COPY_HEADERS_TO := libwrs_omxil_intel_mrst_psb_h263_enc -LOCAL_COPY_HEADERS := vabuffer.h - -ifeq ($(ENABLE_BUFFER_SHARE_MODE),true) -LOCAL_CPPFLAGS += -DENABLE_BUFFER_SHARE_MODE=1 -endif - -include $(BUILD_SHARED_LIBRARY) -endif diff --git a/h263-enc/ebuild.mk b/h263-enc/ebuild.mk deleted file mode 100644 index 06a4106..0000000 --- a/h263-enc/ebuild.mk +++ /dev/null @@ -1,21 +0,0 @@ -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/h263-enc/h263.cpp b/h263-enc/h263.cpp deleted file mode 100644 index 6558f51..0000000 --- a/h263-enc/h263.cpp +++ /dev/null @@ -1,289 +0,0 @@ -/* ------------------------------------------------------------------ - * Copyright (C) 1998-2009 PacketVideo - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. - * See the License for the specific language governing permissions - * and limitations under the License. - * ------------------------------------------------------------------- - */ -/* - * Portions Copyright 2011, Intel Corportion - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include <sys/time.h> -#include <OMX_Core.h> - -#include "h263.h" - -OMX_BOOL H263HeaderParser::DecodeH263Header(OMX_U8* aInputBuffer, int32 *width, - int32 *height, int32 *display_width, int32 *display_height, bool* b_intra) { - uint32 codeword; - int32 extended_PTYPE = 0; - int32 UFEP = 0; - int32 custom_PFMT = 0; - - //Reset the data bit position to the start of the stream - iH263DataBitPos = 0; - iH263BitPos = 0; - //BitBuf contains the first 4 bytes of the aInputBuffer - iH263BitBuf = (aInputBuffer[0] << 24) | (aInputBuffer[1] << 16) | (aInputBuffer[2] << 8) | aInputBuffer[3]; - - - ReadBits(aInputBuffer, 22, &codeword); //Check PSC - if (codeword != 0x20) - { - return OMX_FALSE; - } - - ReadBits(aInputBuffer, 8, &codeword); //Skip TR - - //Check PTYPE starts - ReadBits(aInputBuffer, 1, &codeword); //Check bit1 - if (codeword == 0) return OMX_FALSE; - - ReadBits(aInputBuffer, 1, &codeword); //Check bit2 - if (codeword == 1) return OMX_FALSE; - - ReadBits(aInputBuffer, 1, &codeword); //Check bit3 - if (codeword == 1) return OMX_FALSE; - - ReadBits(aInputBuffer, 1, &codeword); //Check bit4 - if (codeword == 1) return OMX_FALSE; - - ReadBits(aInputBuffer, 1, &codeword); //Check bit6 - if (codeword == 1) return OMX_FALSE; - - ReadBits(aInputBuffer, 3, &codeword); //Check source format - switch (codeword) - { - case 1: - *width = 128; //sub QCIF - *height = 96; - break; - - case 2: - *width = 176; //QCIF - *height = 144; - break; - - case 3: - *width = 352; //CIF - *height = 288; - break; - - case 4: - *width = 704; //4CIF - *height = 576; - break; - - case 5: - *width = 1408; //16CIF - *height = 1152; - break; - - case 7: //reserved (extended by vendor) - extended_PTYPE = 1; - break; - default: - /* Msg("H.263 source format not legal\n"); */ - return OMX_FALSE; - } - - if (extended_PTYPE == 0) - { - *display_width = *width; - *display_height = *height; - - ReadBits(aInputBuffer, 1, &codeword); //Check intra/inter type - if (codeword == 0) { - *b_intra = true; - } else { - *b_intra = false; - } - - return OMX_TRUE; - } - - //Check UFEP - ReadBits(aInputBuffer, 3, &codeword); - UFEP = codeword; - if (UFEP == 1) - { - //Check source format - ReadBits(aInputBuffer, 3, &codeword); - switch (codeword) - { - case 1: - *width = 128; - *height = 96; - - break; - - case 2: - *width = 176; - *height = 144; - - break; - - case 3: - *width = 352; - *height = 288; - - break; - - case 4: - *width = 704; - *height = 576; - - break; - - case 5: - *width = 1408; - *height = 1152; - - break; - - case 6: - custom_PFMT = 1; - break; - default: - /* Msg("H.263 source format not legal\n"); */ - return OMX_FALSE; - } - if (custom_PFMT == 0) - { - *display_width = *width; - *display_height = *height; - } - - ReadBits(aInputBuffer, 1, &codeword); //Check PCF - ReadBits(aInputBuffer, 1, &codeword); //UMV - if (codeword) return OMX_FALSE; - ReadBits(aInputBuffer, 1, &codeword); //SAC - if (codeword) return OMX_FALSE; - ReadBits(aInputBuffer, 1, &codeword); //AP - if (codeword) return OMX_FALSE; - ReadBits(aInputBuffer, 3, &codeword); //AIC, DF, SS - ReadBits(aInputBuffer, 3, &codeword); //RPS, ISD, AIV - if (codeword) return OMX_FALSE; - ReadBits(aInputBuffer, 1, &codeword); //MQ - ReadBits(aInputBuffer, 4, &codeword); //1, Reserved, Reserved, Reserved - if (codeword != 8) return OMX_FALSE; - } - - //Check MPPTYPE - if (UFEP == 0 || UFEP == 1) - { - ReadBits(aInputBuffer, 3, &codeword); //Check intra/inter type - switch (codeword) { - case 0: - *b_intra = true; - break; - case 1: - *b_intra = false; - break; - default: - *b_intra = false; - return OMX_FALSE; - } - - ReadBits(aInputBuffer, 1, &codeword); //Check RPR - if (codeword) return OMX_FALSE; - ReadBits(aInputBuffer, 1, &codeword); //Check RRU - if (codeword) return OMX_FALSE; - ReadBits(aInputBuffer, 1, &codeword); //Check RTYPE - ReadBits(aInputBuffer, 3, &codeword); //Reserved, Reserved, 1 - if (codeword != 1) return OMX_FALSE; - } - else - { - return OMX_FALSE; - } - - ReadBits(aInputBuffer, 1, &codeword); - if (codeword) return OMX_FALSE; /* CPM */ - if (custom_PFMT == 1 && UFEP == 1) - { - OMX_U32 DisplayWidth, Width, DisplayHeight, Height, Resolution; - - ReadBits(aInputBuffer, 4, &codeword); - if (codeword == 0) return OMX_FALSE; - if (codeword == 0xf) - { - ReadBits(aInputBuffer, 8, &codeword); - ReadBits(aInputBuffer, 8, &codeword); - } - ReadBits(aInputBuffer, 9, &codeword); - DisplayWidth = (codeword + 1) << 2; - Width = (DisplayWidth + 15) & -16; - - ReadBits(aInputBuffer, 1, &codeword); - if (codeword != 1) return OMX_FALSE; - ReadBits(aInputBuffer, 9, &codeword); - if (codeword == 0) return OMX_FALSE; - DisplayHeight = codeword << 2; - Height = (DisplayHeight + 15) & -16; - - Resolution = Width * Height; - - *width = Width; - *height = Height; - *display_width = DisplayWidth; - *display_height = DisplayHeight; - } - - return OMX_TRUE; -} - -static const uint32 mask[33] = -{ - 0x00000000, 0x00000001, 0x00000003, 0x00000007, - 0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f, - 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff, - 0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff, - 0x0000ffff, 0x0001ffff, 0x0003ffff, 0x0007ffff, - 0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff, - 0x00ffffff, 0x01ffffff, 0x03ffffff, 0x07ffffff, - 0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff, - 0xffffffff -}; - -void H263HeaderParser::ReadBits(OMX_U8* aStream, /* Input Stream */ - uint8 aNumBits, /* nr of bits to read */ - uint32* aOutData /* output target */ - ) -{ - uint8 *bits; - uint32 dataBitPos = iH263DataBitPos; - uint32 bitPos = iH263BitPos; - uint32 dataBytePos; - - if (aNumBits > (32 - bitPos)) /* not enough bits */ - { - dataBytePos = dataBitPos >> 3; /* Byte Aligned Position */ - bitPos = dataBitPos & 7; /* update bit position */ - bits = &aStream[dataBytePos]; - iH263BitBuf = (bits[0] << 24) | (bits[1] << 16) | (bits[2] << 8) | bits[3]; - } - - iH263DataBitPos += aNumBits; - iH263BitPos = (unsigned char)(bitPos + aNumBits); - - *aOutData = (iH263BitBuf >> (32 - iH263BitPos)) & mask[(uint16)aNumBits]; - - return; -} diff --git a/h263-enc/h263.h b/h263-enc/h263.h deleted file mode 100644 index 41afebb..0000000 --- a/h263-enc/h263.h +++ /dev/null @@ -1,44 +0,0 @@ -/* ------------------------------------------------------------------ - * Copyright (C) 1998-2009 PacketVideo - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. - * See the License for the specific language governing permissions - * and limitations under the License. - * ------------------------------------------------------------------- - */ -/* - * Portions Copyright 2011, Intel Corportion - */ - -#ifndef __OMXIL_INTEL_H263__ -#define __OMXIL_INTEL_H263__ - -typedef int int32; -typedef unsigned int uint32; -typedef unsigned char uint8; -typedef unsigned short uint16; - -class H263HeaderParser { - -private: - OMX_U32 iH263DataBitPos; - OMX_U32 iH263BitPos; - OMX_U32 iH263BitBuf; - -public: - - OMX_BOOL DecodeH263Header(OMX_U8* aInputBuffer, int32 *width, - int32 *height, int32 *display_width, int32 *display_height, bool *b_intra); - void ReadBits(OMX_U8* aStream, uint8 aNumBits, uint32* aOutData); -}; - -#endif /* __OMXIL_INTEL_H263__ */ diff --git a/h263-enc/psb_h263.cpp b/h263-enc/psb_h263.cpp deleted file mode 100644 index 6ca7ca7..0000000 --- a/h263-enc/psb_h263.cpp +++ /dev/null @@ -1,1766 +0,0 @@ -/* - * psb.cpp, omx psb component file - * - * Copyright (c) 2009-2010 Wind River Systems, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -//#define LOG_NDEBUG 0 -#undef LOG_TAG -#define LOG_TAG "intel-h263-encoder" -#include <utils/Log.h> - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include <sys/time.h> - -#include <OMX_Core.h> -#include <OMX_IndexExt.h> -#include <OMX_VideoExt.h> -#include <OMX_IntelErrorTypes.h> - -#include <cmodule.h> -#include <portvideo.h> -#include <componentbase.h> - -#include <mixdisplayandroid.h> -#include <mixvideo.h> -#include <mixvideoconfigparamsenc_h263.h> - -#ifdef __cplusplus -extern "C" { -#endif - -#include <va/va.h> - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#include <va/va_android.h> - -#include "h263.h" -#include "psb_h263.h" - -#define Display unsigned int -#define SHOW_FPS 0 -#include "vabuffer.h" - -#include <IntelBufferSharing.h> - -/* - * constructor & destructor - */ -MrstPsbComponent::MrstPsbComponent() -{ - LOGV("%s(): enter\n", __func__); - - buffer_sharing_state = BUFFER_SHARING_INVALID; - - OMX_ERRORTYPE oret = RequestToEnableBufferSharingMode(); - - if (oret != OMX_ErrorNone) { - LOGE("%s(),%d: set buffer sharing mode failed", __func__, __LINE__); - RequestToDisableBufferSharingMode(); - } - - LOGV("%s(),%d: exit\n", __func__, __LINE__); -} - -MrstPsbComponent::~MrstPsbComponent() -{ - LOGV("%s(): enter\n", __func__); - - OMX_ERRORTYPE oret = RequestToDisableBufferSharingMode(); - if (oret != OMX_ErrorNone) { - LOGE("%s(),%d: DisableBufferSharingMode failed", __func__, __LINE__); - } - - LOGV("%s(),%d: exit\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, "_"); - - raw_port_index = INPORT_INDEX; - codec_port_index = OUTPORT_INDEX; - raw_port_dir = OMX_DirInput; - codec_port_dir = OMX_DirOutput; - - working_role = strpbrk(working_role, "."); - if (!working_role) - return OMX_ErrorUndefined; - working_role++; - - ret = __AllocateH263Port(codec_port_index, codec_port_dir); - - if (ret != OMX_ErrorNone) - goto free_ports; - - LOGV("---- prepare to call __AllocateRawPort() ----\n"); - 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: - - 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::__AllocateH263Port(OMX_U32 port_index, OMX_DIRTYPE dir) { - - PortH263 *h263port; - - OMX_PARAM_PORTDEFINITIONTYPE h263portdefinition; - OMX_VIDEO_PARAM_H263TYPE h263portparam; - - LOGV("%s(): enter\n", __func__); - - ports[port_index] = new PortH263; - if (!ports[port_index]) { - LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, - OMX_ErrorInsufficientResources); - return OMX_ErrorInsufficientResources; - } - - h263port = static_cast<PortH263 *>(this->ports[port_index]); - - /* OMX_PARAM_PORTDEFINITIONTYPE */ - memset(&h263portdefinition, 0, sizeof(h263portdefinition)); - SetTypeHeader(&h263portdefinition, sizeof(h263portdefinition)); - h263portdefinition.nPortIndex = port_index; - h263portdefinition.eDir = dir; - - h263portdefinition.nBufferCountActual =OUTPORT_H263_ACTUAL_BUFFER_COUNT; - h263portdefinition.nBufferCountMin = OUTPORT_H263_MIN_BUFFER_COUNT; - h263portdefinition.nBufferSize = OUTPORT_H263_BUFFER_SIZE; - - h263portdefinition.bEnabled = OMX_TRUE; - h263portdefinition.bPopulated = OMX_FALSE; - h263portdefinition.eDomain = OMX_PortDomainVideo; - h263portdefinition.format.video.cMIMEType = (OMX_STRING)"video/h263"; - h263portdefinition.format.video.pNativeRender = NULL; - h263portdefinition.format.video.nFrameWidth = 176; - h263portdefinition.format.video.nFrameHeight = 144; - h263portdefinition.format.video.nStride = 0; - h263portdefinition.format.video.nSliceHeight = 0; - h263portdefinition.format.video.nBitrate = 64000; - h263portdefinition.format.video.xFramerate = 15 << 16; - h263portdefinition.format.video.bFlagErrorConcealment = OMX_FALSE; - h263portdefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingH263; - h263portdefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused; - h263portdefinition.format.video.pNativeWindow = NULL; - h263portdefinition.bBuffersContiguous = OMX_FALSE; - h263portdefinition.nBufferAlignment = 0; - h263port->SetPortDefinition(&h263portdefinition, true); - /* end of OMX_PARAM_PORTDEFINITIONTYPE */ - - /* OMX_VIDEO_PARAM_H263TYPE */ - memset(&h263portparam, 0, sizeof(h263portparam)); - SetTypeHeader(&h263portparam, sizeof(h263portparam)); - h263portparam.nPortIndex = port_index; - h263portparam.eProfile = OMX_VIDEO_H263ProfileBaseline; - h263portparam.eLevel = OMX_VIDEO_H263Level70; - h263port->SetPortH263Param(&h263portparam, true); - /* end of OMX_VIDEO_PARAM_H263TYPE */ - - /* encoder */ - - /* OMX_VIDEO_PARAM_BITRATETYPE */ - OMX_VIDEO_PARAM_BITRATETYPE bitrateparam; - - memset(&bitrateparam, 0, sizeof(bitrateparam)); - SetTypeHeader(&bitrateparam, sizeof(bitrateparam)); - - bitrateparam.nPortIndex = port_index; - bitrateparam.eControlRate = OMX_Video_ControlRateConstant; - bitrateparam.nTargetBitrate = 64000; - - h263port->SetPortBitrateParam(&bitrateparam, true); - /* end of OMX_VIDEO_PARAM_BITRATETYPE */ - - /* OMX_VIDEO_CONFIG_PRI_INFOTYPE */ - OMX_VIDEO_CONFIG_PRI_INFOTYPE privateinfoparam; - memset(&privateinfoparam, 0, sizeof(privateinfoparam)); - SetTypeHeader(&privateinfoparam, sizeof(privateinfoparam)); - privateinfoparam.nPortIndex = port_index; - privateinfoparam.nCapacity = 0; - privateinfoparam.nHolder = NULL; - h263port->SetPortPrivateInfoParam(&privateinfoparam, true); - /* end of OMX_VIDEO_CONFIG_PRI_INFOTYPE */ - - h263EncPFrames = 0; - h263EncParamIntelBitrateType.nPortIndex = port_index; - h263EncParamIntelBitrateType.eControlRate = OMX_Video_Intel_ControlRateMax; - h263EncParamIntelBitrateType.nTargetBitrate = 0; - SetTypeHeader(&h263EncParamIntelBitrateType, sizeof(h263EncParamIntelBitrateType)); - - h263EncConfigIntelBitrateType.nPortIndex = port_index; - h263EncConfigIntelBitrateType.nMaxEncodeBitrate = 4000 * 1024; // Maximum bitrate - h263EncConfigIntelBitrateType.nTargetPercentage = 95; // Target bitrate as percentage of maximum bitrate; e.g. 95 is 95% - h263EncConfigIntelBitrateType.nWindowSize = 1000; // Window size in milliseconds allowed for bitrate to reach target - h263EncConfigIntelBitrateType.nInitialQP = 36; // Initial QP for I frames - h263EncConfigIntelBitrateType.nMinQP = 18; - SetTypeHeader(&h263EncConfigIntelBitrateType, sizeof(h263EncConfigIntelBitrateType)); - - 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; - - rawportdefinition.nBufferCountActual = INPORT_RAW_ACTUAL_BUFFER_COUNT; - rawportdefinition.nBufferCountMin = INPORT_RAW_MIN_BUFFER_COUNT; - rawportdefinition.nBufferSize = INPORT_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 = 176; - rawportdefinition.format.video.nSliceHeight = 144; - 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_FormatYUV420SemiPlanar; - 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_FormatYUV420SemiPlanar; - 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; -} - -#define H263_ENCODE_ERROR_CHECKING(p) \ -if (!p) { \ - LOGV("%s(), NULL pointer", __func__); \ - return OMX_ErrorBadParameter; \ -} \ -ret = CheckTypeHeader(p, sizeof(*p)); \ -if (ret != OMX_ErrorNone) { \ - LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); \ - return ret; \ -} \ -OMX_U32 index = p->nPortIndex; \ -if (index != OUTPORT_INDEX) { \ - LOGV("%s(), wrong port index", __func__); \ - return OMX_ErrorBadPortIndex; \ -} \ -PortH263*port = static_cast<PortH263 *> (ports[index]); \ -if (!port) { \ - LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, \ - OMX_ErrorBadPortIndex); \ - return OMX_ErrorBadPortIndex; \ -} \ -LOGV("%s(), about to get native or supported nal format", __func__); \ -if (!port->IsEnabled()) { \ - LOGV("%s() : port is not enabled", __func__); \ - return OMX_ErrorNotReady; \ -} \ - -/* - * 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) { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortVideo *>(ports[index]); - - if (!port) { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, - OMX_ErrorBadPortIndex); - return OMX_ErrorBadPortIndex; - } - - if(index == INPORT_INDEX ) { - if(p->nIndex < 1) { - p->eColorFormat = port->GetPortVideoParam()->eColorFormat; - p->eCompressionFormat = OMX_VIDEO_CodingUnused; - } - else { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__,OMX_ErrorNoMore); - return OMX_ErrorNoMore; - } - } - else if(index == OUTPORT_INDEX) { - if(p->nIndex < 1) { - p->eCompressionFormat= port->GetPortVideoParam()->eCompressionFormat; - p->eColorFormat = OMX_COLOR_FormatUnused; - } - else { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__,OMX_ErrorNoMore); - return OMX_ErrorNoMore; - } - } - else { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__,OMX_ErrorBadPortIndex); - return OMX_ErrorBadPortIndex; - } - - LOGV("%s(), p->eColorFormat = %x\n", __func__, p->eColorFormat); - break; - } - case OMX_IndexParamVideoH263: { - OMX_VIDEO_PARAM_H263TYPE *p = - (OMX_VIDEO_PARAM_H263TYPE *)pComponentParameterStructure; - OMX_U32 index = p->nPortIndex; - PortH263 *port = NULL; - - LOGV("%s(): port index : %lu\n", __func__, index); - - ret = CheckTypeHeader(p, sizeof(*p)); - if (ret != OMX_ErrorNone) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortH263 *>(ports[index]); - - if (!port) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, - OMX_ErrorBadPortIndex); - return OMX_ErrorBadPortIndex; - } - - memcpy(p, port->GetPortH263Param(), sizeof(*p)); - break; - } - case OMX_IndexParamVideoBitrate: { - - OMX_VIDEO_PARAM_BITRATETYPE *p = - (OMX_VIDEO_PARAM_BITRATETYPE *)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) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortVideo *>(ports[index]); - - if (!port) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, - OMX_ErrorBadPortIndex); - return OMX_ErrorBadPortIndex; - } - - memcpy(p, port->GetPortBitrateParam(), sizeof(*p)); - break; - } - case OMX_IndexParamVideoProfileLevelQuerySupported: - { - OMX_VIDEO_PARAM_PROFILELEVELTYPE *p = - (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure; - PortH263 *port = NULL; - - OMX_U32 index = p->nPortIndex; - - LOGV("%s(): port index : %lu\n", __func__, index); - - ret = CheckTypeHeader(p, sizeof(*p)); - if (ret != OMX_ErrorNone) - { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - { - port = static_cast<PortH263 *>(ports[index]); - } - else - { - return OMX_ErrorBadParameter; - } - - const OMX_VIDEO_PARAM_H263TYPE *H263Param = port->GetPortH263Param(); - - p->eProfile = H263Param->eProfile; - p->eLevel = H263Param->eLevel; - - 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; - - LOGV("%s(): port index : %lu\n", __func__, index); - - ret = CheckTypeHeader(p, sizeof(*p)); - if (ret != OMX_ErrorNone) { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortVideo *>(ports[index]); - - if (!port) { - LOGE("%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_IndexParamVideoH263: { - OMX_VIDEO_PARAM_H263TYPE *p = - (OMX_VIDEO_PARAM_H263TYPE *)pComponentParameterStructure; - OMX_U32 index = p->nPortIndex; - PortH263 *port = NULL; - - LOGV("%s(): port index : %lu\n", __func__, index); - - ret = CheckTypeHeader(p, sizeof(*p)); - if (ret != OMX_ErrorNone) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortH263 *>(ports[index]); - - if (!port) { - LOGE("%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) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, - OMX_ErrorIncorrectStateOperation); - return OMX_ErrorIncorrectStateOperation; - } - } - - ret = port->SetPortH263Param(p, false); - break; - } - case OMX_IndexParamVideoBitrate: { - - LOGV("%s(), OMX_IndexParamVideoBitrate", __func__); - h263EncParamIntelBitrateType.eControlRate - = OMX_Video_Intel_ControlRateMax; - - OMX_VIDEO_PARAM_BITRATETYPE *p = - (OMX_VIDEO_PARAM_BITRATETYPE *)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) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortVideo *>(ports[index]); - - if (!port) { - LOGE("%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) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, - OMX_ErrorIncorrectStateOperation); - return OMX_ErrorIncorrectStateOperation; - } - } - - ret = port->SetPortBitrateParam(p, false); - break; - } - case OMX_IndexParamVideoBytestream: { - - LOGV("%s(), OMX_IndexParamVideoBytestream", __func__); - - OMX_VIDEO_PARAM_BYTESTREAMTYPE *p = - (OMX_VIDEO_PARAM_BYTESTREAMTYPE *) pComponentParameterStructure; - - H263_ENCODE_ERROR_CHECKING(p) - - 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; - } - 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; - OMX_CONFIG_INTRAREFRESHVOPTYPE* pVideoIFrame; - OMX_VIDEO_CONFIG_AVCINTRAPERIOD *pVideoIDRInterval; - - LOGV("%s(): enter\n", __func__); - - LOGV("%s() : nIndex = %d\n", __func__, nIndex); - - switch (nIndex) - { - case OMX_IndexConfigIntelBitrate: { - - LOGV("%s() : OMX_IndexParamIntelBitrate", __func__); - - if (h263EncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_VIDEO_CONFIG_INTEL_BITRATETYPE *pIntelBitrate = - (OMX_VIDEO_CONFIG_INTEL_BITRATETYPE *) pComponentConfigStructure; - - H263_ENCODE_ERROR_CHECKING(pIntelBitrate) - - *pIntelBitrate = h263EncConfigIntelBitrateType; - - break; - } - - case OMX_IndexConfigVideoFramerate: { - - LOGV("%s() : OMX_IndexConfigVideoFramerate", __func__); - - if (h263EncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_CONFIG_FRAMERATETYPE *pxFramerate = - (OMX_CONFIG_FRAMERATETYPE *) pComponentConfigStructure; - - H263_ENCODE_ERROR_CHECKING(pxFramerate) - - *pxFramerate = h263EncFramerate; - break; - } - case OMX_IndexIntelPrivateInfo: { - - OMX_VIDEO_CONFIG_PRI_INFOTYPE *p = - (OMX_VIDEO_CONFIG_PRI_INFOTYPE *)pComponentConfigStructure; - 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) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortVideo *>(ports[index]); - - if (!port) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, - OMX_ErrorBadPortIndex); - return OMX_ErrorBadPortIndex; - } - - memcpy(p, port->GetPortPrivateInfoParam(), sizeof(*p)); - break; - } - default: - { - return OMX_ErrorUnsupportedIndex; - } - } - LOGV("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, ret); - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstPsbComponent::ComponentSetConfig( - OMX_INDEXTYPE nParamIndex, - OMX_PTR pComponentConfigStructure) -{ - OMX_ERRORTYPE ret = OMX_ErrorUnsupportedIndex; - OMX_CONFIG_INTRAREFRESHVOPTYPE* pVideoIFrame; - - MIX_RESULT mret; - - LOGV("%s(): enter\n", __func__); - - LOGV("%s() : nIndex = %d\n", __func__, nParamIndex); - - switch (nParamIndex) - { - case OMX_IndexConfigVideoIntraVOPRefresh: - { - LOGV("%s(), OMX_IndexConfigVideoIntraVOPRefresh", __func__); - - pVideoIFrame = (OMX_CONFIG_INTRAREFRESHVOPTYPE*) pComponentConfigStructure; - - H263_ENCODE_ERROR_CHECKING(pVideoIFrame) - - LOGV("%s(), OMX_IndexConfigVideoIntraVOPRefresh", __func__); - if(pVideoIFrame->IntraRefreshVOP == OMX_TRUE) { - LOGV("%s(), pVideoIFrame->IntraRefreshVOP == OMX_TRUE", __func__); - - MixEncDynamicParams encdynareq; - memset(&encdynareq, 0, sizeof(encdynareq)); - encdynareq.force_idr = TRUE; - if(mix) { - mret = mix_video_set_dynamic_enc_config (mix, - MIX_ENC_PARAMS_FORCE_KEY_FRAME, &encdynareq); - if(mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), failed to set IDR interval", __func__); - } - } - } - } - break; - - case OMX_IndexConfigIntelBitrate: { - - LOGV("%s(), OMX_IndexConfigIntelBitrate", __func__); - if (h263EncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - LOGV("%s(), eControlRate == OMX_Video_Intel_ControlRateMax"); - break; - } - - OMX_VIDEO_CONFIG_INTEL_BITRATETYPE *pIntelBitrate = - (OMX_VIDEO_CONFIG_INTEL_BITRATETYPE *) pComponentConfigStructure; - - H263_ENCODE_ERROR_CHECKING(pIntelBitrate); - - h263EncConfigIntelBitrateType = *pIntelBitrate; - - if (mix && h263EncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateVideoConferencingMode) { - - LOGV("%s(), h263EncConfigIntelBitrateType.nInitialQP = %d", __func__, - h263EncConfigIntelBitrateType.nInitialQP); - - LOGV("%s(), h263EncConfigIntelBitrateType.nMinQP = %d", __func__, - h263EncConfigIntelBitrateType.nMinQP); - - LOGV("%s(), h263EncConfigIntelBitrateType.nMaxEncodeBitrate = %d", __func__, - h263EncConfigIntelBitrateType.nMaxEncodeBitrate); - - LOGV("%s(), h263EncConfigIntelBitrateType.nTargetPercentage = %d", __func__, - h263EncConfigIntelBitrateType.nTargetPercentage); - - LOGV("%s(), h263EncConfigIntelBitrateType.nWindowSize = %d", __func__, - h263EncConfigIntelBitrateType.nWindowSize); - - MixEncParamsType params_type; - MixEncDynamicParams dynamic_params; - memset(&dynamic_params, 0, sizeof(dynamic_params)); - - params_type = MIX_ENC_PARAMS_INIT_QP; - dynamic_params.init_QP = h263EncConfigIntelBitrateType.nInitialQP; - mret = mix_video_set_dynamic_enc_config(mix, params_type, - &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - - params_type = MIX_ENC_PARAMS_MIN_QP; - dynamic_params.min_QP = h263EncConfigIntelBitrateType.nMinQP; - mret = mix_video_set_dynamic_enc_config(mix, params_type, - &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - - params_type = MIX_ENC_PARAMS_BITRATE; - dynamic_params.bitrate - = h263EncConfigIntelBitrateType.nMaxEncodeBitrate; - mret = mix_video_set_dynamic_enc_config(mix, params_type, - &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - - params_type = MIX_ENC_PARAMS_TARGET_PERCENTAGE; - dynamic_params.target_percentage - = h263EncConfigIntelBitrateType.nTargetPercentage; - mret = mix_video_set_dynamic_enc_config(mix, params_type, - &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - - params_type = MIX_ENC_PARAMS_WINDOW_SIZE; - dynamic_params.window_size - = h263EncConfigIntelBitrateType.nWindowSize; - mret = mix_video_set_dynamic_enc_config(mix, params_type, - &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - } - break; - } - - case OMX_IndexConfigVideoFramerate: { - if (h263EncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_CONFIG_FRAMERATETYPE *pxFramerate = - (OMX_CONFIG_FRAMERATETYPE *) pComponentConfigStructure; - - H263_ENCODE_ERROR_CHECKING(pxFramerate); - - h263EncFramerate = *pxFramerate; - - if (mix && h263EncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateVideoConferencingMode) { - - MixEncParamsType params_type; - MixEncDynamicParams dynamic_params; - memset(&dynamic_params, 0, sizeof(dynamic_params)); - - params_type = MIX_ENC_PARAMS_FRAME_RATE; - dynamic_params.frame_rate_denom = 1; - dynamic_params.frame_rate_num = h263EncFramerate.xEncodeFramerate >> 16; // Q16 format - mret = mix_video_set_dynamic_enc_config (mix, params_type, &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - } - break; - } - - default: - { - return OMX_ErrorUnsupportedIndex; - } - } - LOGV("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, ret); - return OMX_ErrorNone; -} -/* end of component methods & helpers */ - -/* - * implement ComponentBase::Processor[*] - */ -OMX_ERRORTYPE MrstPsbComponent::ProcessorInit(void) -{ - MixVideo *mix = NULL; - MixVideoInitParams *vip = NULL; - MixParams *mvp = NULL; - MixVideoConfigParams *vcp = NULL; - MixDisplayAndroid *display = NULL; - MixVideoConfigParamsEnc * pMixParam = NULL; - uint major, minor; - OMX_ERRORTYPE oret = OMX_ErrorNone; - MIX_RESULT mret; - - LOGV("%s(): enter\n", __func__); - - mix = mix_video_new(); - LOGV("%s(): called to mix_video_new()", __func__); - - if (!mix) { - LOGE("%s(),%d: exit, mix_video_new failed", __func__, __LINE__); - goto error_out; - } - - mix_video_get_version(mix, &major, &minor); - LOGV("MixVideo version: %d.%d", major, minor); - - /* encoder */ - vcp = MIX_VIDEOCONFIGPARAMS(mix_videoconfigparamsenc_h263_new()); - mvp = MIX_PARAMS(mix_videoencodeparams_new()); - - if (!vcp || !mvp ) { - LOGE("%s(),%d: exit, failed to allocate vcp, mvp\n", - __func__, __LINE__); - goto error_out; - } - - oret = ChangeVcpWithPortParam(vcp, - static_cast<PortVideo *>(ports[INPORT_INDEX]), - static_cast<PortVideo *>(ports[OUTPORT_INDEX]), - NULL); - if (oret != OMX_ErrorNone) { - LOGE("%s(),%d: exit, ChangeVcpWithPortParam failed (ret == 0x%08x)\n", - __func__, __LINE__, oret); - goto error_out; - } - - display = mix_displayandroid_new(); - if (!display) { - LOGE("%s(),%d: exit, mix_displayandroid_new failed", __func__, __LINE__); - goto error_out; - } - - vip = mix_videoinitparams_new(); - if (!vip) { - LOGE("%s(),%d: exit, mix_videoinitparams_new failed", __func__, - __LINE__); - goto error_out; - } - - { - Display *android_display = (Display*)malloc(sizeof(Display)); - *(android_display) = 0x18c34078; - - LOGV("*android_display = %d", *android_display); - - mret = mix_displayandroid_set_display(display, android_display); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(),%d: exit, mix_displayandroid_set_display failed " - "(ret == 0x%08x)", __func__, __LINE__, mret); - goto error_out; - } - } - - mret = mix_videoinitparams_set_display(vip, MIX_DISPLAY(display)); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(),%d: exit, mix_videoinitparams_set_display failed " - "(ret == 0x%08x)", __func__, __LINE__, mret); - goto error_out; - } - - mret = mix_video_initialize(mix, MIX_CODEC_MODE_ENCODE, vip, NULL); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(),%d: exit, mix_video_initialize failed (ret == 0x%08x)", - __func__, __LINE__, mret); - goto error_out; - } - - oret = CheckAndEnableBufferSharingMode(); - if (oret != OMX_ErrorNone) { - LOGE("%s(), %d: CheckAndEnableBufferSharingMode() failed ", __func__, __LINE__); - goto error_out; - } - - oret = RequestShareBuffers(mix, - MIX_VIDEOCONFIGPARAMSENC(vcp)->picture_width, - MIX_VIDEOCONFIGPARAMSENC(vcp)->picture_height); - if (oret != OMX_ErrorNone) { - LOGE("%s(), %d: RequestShareBuffers() failed ", __func__, __LINE__); - goto error_out; - } - - mix_videoconfigparamsenc_set_share_buf_mode(MIX_VIDEOCONFIGPARAMSENC(vcp), FALSE); - - LOGV("mix_video_configure"); - mret = mix_video_configure(mix, vcp, NULL); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), %d: exit, mix_video_configure failed " - "(ret:0x%08x)", __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - if(mret == MIX_RESULT_NO_MEMORY) { - oret = OMX_ErrorInsufficientResources; - } else if(mret == MIX_RESULT_NOT_PERMITTED) { - oret = (OMX_ERRORTYPE)OMX_ErrorIntelVideoNotPermitted;; - } - goto error_out; - } - - LOGV("%s(): mix video configured", __func__); - - this->mix = mix; - this->vip = vip; - this->mvp = mvp; - this->vcp = vcp; - this->display = display; - this->mixbuffer_in[0] = NULL; - - inframe_counter = 0; - outframe_counter = 0; - is_mixvideodec_configured = OMX_FALSE; - - last_ts = 0; - last_fps = 0.0; - - oret = RegisterShareBuffersToPort(); - if (oret != OMX_ErrorNone) { - LOGE("%s(), %d RegisterShareBufferToPort() failed", __func__, __LINE__); - oret = OMX_ErrorUndefined; - goto error_out; - } - - oret = RegisterShareBuffersToLib(); - if (oret != OMX_ErrorNone) { - LOGE("%s(), %d register Share Buffering Mode failed", __func__, __LINE__); - goto error_out; - } - - oret = EnterBufferSharingMode(); - if (oret != OMX_ErrorNone) { - LOGE("%s(), %d EnterShareBufferingMode() failed", __func__, __LINE__); - goto error_out; - } - - LOGV("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, oret); - return oret; - -error_out: - if (buffer_sharing_state == BUFFER_SHARING_EXECUTING) { - ExitBufferSharingMode(); - } - mix_params_unref(mvp); - mix_videoconfigparams_unref(vcp); - mix_displayandroid_unref(display); - mix_videoinitparams_unref(vip); - mix_video_unref(mix); - - return OMX_ErrorUndefined; -} - -OMX_ERRORTYPE MrstPsbComponent::ProcessorDeinit(void) -{ - OMX_ERRORTYPE oret = OMX_ErrorNone; - MIX_RESULT mret; - - LOGV("%s(): enter\n", __func__); - if (buffer_sharing_state == BUFFER_SHARING_EXECUTING) { - oret = ExitBufferSharingMode(); - if (oret != OMX_ErrorNone) { - LOGE("%s(),%d: ExitShareBufferingMode failed", __func__, __LINE__); - } - } - - mix_video_eos(mix); - mix_video_flush(mix); - - mix_params_unref(mvp); - mix_videoconfigparams_unref(vcp); - mix_displayandroid_unref(display); - mix_videoinitparams_unref(vip); - - if (mixbuffer_in[0]) { - mix_video_release_mixbuffer(mix, mixbuffer_in[0]); - mixbuffer_in[0] = NULL; - } - - mix_video_deinitialize(mix); - mix_video_unref(mix); - - LOGV("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, oret); - return oret; -} - -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__); - - ports[INPORT_INDEX]->ReturnAllRetainedBuffers(); - - 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 */ -OMX_ERRORTYPE MrstPsbComponent::ProcessorProcess( - OMX_BUFFERHEADERTYPE ***pBuffers, - buffer_retain_t *retain, - OMX_U32 nr_buffers) -{ - MixIOVec buffer_in, buffer_out; - OMX_U32 outfilledlen = 0; - OMX_S64 outtimestamp = 0; - OMX_U32 outflags = 0; - OMX_ERRORTYPE oret = OMX_ErrorNone; - MIX_RESULT mret; - - LOGV("%s(): enter encode\n", __func__); - - LOGV_IF((*pBuffers[INPORT_INDEX])->nFlags & OMX_BUFFERFLAG_EOS, - "%s(),%d: got OMX_BUFFERFLAG_EOS\n", __func__, __LINE__); - - if (!(*pBuffers[INPORT_INDEX])->nFilledLen) { - LOGE("%s(),%d: input buffer's nFilledLen is zero\n", - __func__, __LINE__); - goto out; - } - - if (buffer_sharing_state != BUFFER_SHARING_INVALID) { - buffer_in.data_size = buffer_sharing_info[0].dataSize; - buffer_in.buffer_size = buffer_sharing_info[0].allocatedSize; - buffer_in.data = *(reinterpret_cast<uchar**>((*pBuffers[INPORT_INDEX])->pBuffer + (*pBuffers[INPORT_INDEX])->nOffset)); - } else { - buffer_in.data = (*pBuffers[INPORT_INDEX])->pBuffer + (*pBuffers[INPORT_INDEX])->nOffset; - buffer_in.data_size = (*pBuffers[INPORT_INDEX])->nFilledLen; - buffer_in.buffer_size = (*pBuffers[INPORT_INDEX])->nFilledLen; - } - - LOGV("buffer_in.data=%x, data_size=%d, buffer_size=%d", - (unsigned)buffer_in.data, buffer_in.data_size, buffer_in.buffer_size); - - buffer_out.data = - (*pBuffers[OUTPORT_INDEX])->pBuffer + (*pBuffers[OUTPORT_INDEX])->nOffset; - buffer_out.data_size = 0; - buffer_out.buffer_size = (*pBuffers[OUTPORT_INDEX])->nAllocLen - (*pBuffers[OUTPORT_INDEX])->nOffset; - mixiovec_out[0] = &buffer_out; - -normal_start: - /* get MixBuffer */ - mret = mix_video_get_mixbuffer(mix, &mixbuffer_in[0]); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), %d: exit, mix_video_get_mixbuffer failed (ret:0x%08x)", - __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - goto out; - } - - /* fill MixBuffer */ - mret = mix_buffer_set_data(mixbuffer_in[0], - buffer_in.data, buffer_in.data_size, - (ulong)this, H263EncMixBufferCallback); - - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), %d: exit, mix_buffer_set_data failed (ret:0x%08x)", - __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - goto out; - } - - /* encoder */ - mret = mix_video_encode(mix, mixbuffer_in, 1, mixiovec_out, 1, - MIX_VIDEOENCODEPARAMS(mvp)); - - LOGV("%s(), mret = 0x%08x", __func__, mret); - - if (mret != MIX_RESULT_SUCCESS && - mret != MIX_RESULT_VIDEO_ENC_SLICESIZE_OVERFLOW) { - LOGE("%s(), %d: exit, mix_video_encode failed (ret == 0x%08x)\n", - __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - goto out; - } - - outfilledlen = mixiovec_out[0]->data_size; - outtimestamp = (*pBuffers[INPORT_INDEX])->nTimeStamp; - outflags |= OMX_BUFFERFLAG_ENDOFFRAME; - - int32 width; - int32 height; - int32 display_width; - int32 display_height; - bool b_intra; - - h263_parser.DecodeH263Header(mixiovec_out[0]->data, &width, - &height, &display_width, &display_height, &b_intra); - - if (b_intra) { - LOGV("%s(), syncframe", __func__); - outflags |= OMX_BUFFERFLAG_SYNCFRAME; - } - - LOGV("********** output buffer: len=%d, ts=%ld, flags=%x", - outfilledlen, - outtimestamp, - outflags); - - // The buffer will be relaseed in H263EncMixBufferCallback() - - retain[INPORT_INDEX] = BUFFER_RETAIN_ACCUMULATE; - - if(mret == MIX_RESULT_VIDEO_ENC_SLICESIZE_OVERFLOW) { - LOGV("%s(), mix_video_encode returns MIX_RESULT_VIDEO_ENC_SLICESIZE_OVERFLOW" - , __func__); - oret = (OMX_ERRORTYPE)OMX_ErrorIntelExtSliceSizeOverflow; - } -#if SHOW_FPS - { - struct timeval t; - OMX_TICKS current_ts, interval_ts; - float current_fps, average_fps; - - t.tv_sec = t.tv_usec = 0; - gettimeofday(&t, NULL); - - current_ts = - (nsecs_t)t.tv_sec * 1000000000 + (nsecs_t)t.tv_usec * 1000; - interval_ts = current_ts - last_ts; - last_ts = current_ts; - - current_fps = (float)1000000000 / (float)interval_ts; - average_fps = (current_fps + last_fps) / 2; - last_fps = current_fps; - - LOGD("FPS = %2.1f\n", average_fps); - } -#endif - -out: - if (mixbuffer_in[0]) { - mix_video_release_mixbuffer(mix, mixbuffer_in[0]); - mixbuffer_in[0] = NULL; - } - - if(retain[OUTPORT_INDEX] != BUFFER_RETAIN_GETAGAIN) { - (*pBuffers[OUTPORT_INDEX])->nFilledLen = outfilledlen; - (*pBuffers[OUTPORT_INDEX])->nTimeStamp = outtimestamp; - (*pBuffers[OUTPORT_INDEX])->nFlags = outflags; - - LOGV("********** output buffer: len=%d, ts=%ld, flags=%x", - outfilledlen, - outtimestamp, - outflags); - } - - if (retain[INPORT_INDEX] == BUFFER_RETAIN_NOT_RETAIN || - retain[INPORT_INDEX] == BUFFER_RETAIN_ACCUMULATE ) { - inframe_counter++; - } - - if (retain[OUTPORT_INDEX] == BUFFER_RETAIN_NOT_RETAIN) - outframe_counter++; - - LOGV_IF(oret == OMX_ErrorNone, - "%s(),%d: exit, encode is done\n", __func__, __LINE__); - - return oret; -} - -OMX_ERRORTYPE MrstPsbComponent::__H263ChangeVcpWithPortParam( - MixVideoConfigParams *vcp, PortH263 *port, bool *vcp_changed) -{ - OMX_ERRORTYPE ret = OMX_ErrorNone; - - MixVideoConfigParamsEnc *config = MIX_VIDEOCONFIGPARAMSENC(vcp); - - mix_videoconfigparamsenc_set_encode_format( - config, MIX_ENCODE_TARGET_FORMAT_H263); - mix_videoconfigparamsenc_set_profile(config, MIX_PROFILE_H263BASELINE); - mix_videoconfigparamsenc_set_mime_type(config, "video/x-h263"); - mix_videoconfigparamsenc_h263_set_dlk( - MIX_VIDEOCONFIGPARAMSENC_H263(config), FALSE); - - return ret; -} - -OMX_ERRORTYPE MrstPsbComponent::ChangeVcpWithPortParam( - MixVideoConfigParams *vcp, - PortVideo *port_in, - PortVideo *port_out, - bool *vcp_changed) -{ - const OMX_PARAM_PORTDEFINITIONTYPE *pd_out = port_out->GetPortDefinition(); - const OMX_PARAM_PORTDEFINITIONTYPE *pd_in = port_in->GetPortDefinition(); - OMX_ERRORTYPE ret; - - ret = __H263ChangeVcpWithPortParam(vcp, - static_cast<PortH263 *>(port_out), - vcp_changed); - - /* encoder */ - MixVideoConfigParamsEnc *config = MIX_VIDEOCONFIGPARAMSENC(vcp); - const OMX_VIDEO_PARAM_BITRATETYPE *bitrate = - port_out->GetPortBitrateParam(); - OMX_VIDEO_CONTROLRATETYPE controlrate; - - if ((config->picture_width != pd_out->format.video.nFrameWidth) || - (config->picture_height != pd_out->format.video.nFrameHeight)) { - LOGV("%s(): width : %d != %ld", __func__, - config->picture_width, pd_out->format.video.nFrameWidth); - LOGV("%s(): height : %d != %ld", __func__, - config->picture_height, pd_out->format.video.nFrameHeight); - - mix_videoconfigparamsenc_set_picture_res(config, - pd_out->format.video.nFrameWidth, - pd_out->format.video.nFrameHeight); - if (vcp_changed) - *vcp_changed = true; - } - - PortVideo *input_port = static_cast<PortVideo*>(ports[INPORT_INDEX]); - const OMX_PARAM_PORTDEFINITIONTYPE *input_pd = input_port->GetPortDefinition(); - - if (config->frame_rate_num != (input_pd->format.video.xFramerate >> 16)) { - LOGV("%s(): framerate : %u != %ld", __func__, - config->frame_rate_num, input_pd->format.video.xFramerate >> 16); - - mix_videoconfigparamsenc_set_frame_rate(config, - input_pd->format.video.xFramerate >> 16, - 1); - - if (vcp_changed) - *vcp_changed = true; - } - - if(h263EncPFrames == 0) { - h263EncPFrames = config->frame_rate_num/2 ; - } - - LOGV("%s() : h263EncPFrames = %d", __func__, h263EncPFrames); - mix_videoconfigparamsenc_set_intra_period(config,h263EncPFrames); - - if (h263EncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - - LOGV("%s(), eControlRate == OMX_Video_Intel_ControlRateMax", __func__); - - if (config->bitrate != bitrate->nTargetBitrate) { - LOGV("%s(): bitrate : %d != %ld", __func__, - config->bitrate, bitrate->nTargetBitrate); - - mix_videoconfigparamsenc_set_bit_rate(config, - bitrate->nTargetBitrate); - if (vcp_changed) - *vcp_changed = true; - } - - if (config->rate_control == MIX_RATE_CONTROL_CBR) - controlrate = OMX_Video_ControlRateConstant; - else if (config->rate_control == MIX_RATE_CONTROL_VBR) - controlrate = OMX_Video_ControlRateVariable; - else - controlrate = OMX_Video_ControlRateDisable; - - if (controlrate != bitrate->eControlRate) { - LOGV("%s(): ratecontrol : %d != %d", __func__, - controlrate, bitrate->eControlRate); - - if ((bitrate->eControlRate == OMX_Video_ControlRateVariable) || - (bitrate->eControlRate == - OMX_Video_ControlRateVariableSkipFrames)) - config->rate_control = MIX_RATE_CONTROL_VBR; - else if ((bitrate->eControlRate == - OMX_Video_ControlRateConstant) || - (bitrate->eControlRate == - OMX_Video_ControlRateConstantSkipFrames)) - config->rate_control = MIX_RATE_CONTROL_CBR; - else - config->rate_control = MIX_RATE_CONTROL_NONE; - - if (vcp_changed) - *vcp_changed = true; - } - - /* hard coding */ - mix_videoconfigparamsenc_set_raw_format(config, - MIX_RAW_TARGET_FORMAT_NV12); - mix_videoconfigparamsenc_set_init_qp(config, 15); - mix_videoconfigparamsenc_set_min_qp(config, 1); - mix_videoconfigparamsenc_set_buffer_pool_size(config, 8); - mix_videoconfigparamsenc_set_drawable(config, 0x0); - mix_videoconfigparamsenc_set_need_display(config, FALSE); - - } - - return ret; -} -/* end of vcp setting helpers */ - -/* share buffer setting */ -OMX_ERRORTYPE MrstPsbComponent::RequestToEnableBufferSharingMode() -{ - BufferShareStatus bsret; - - if (buffer_sharing_state != BUFFER_SHARING_INVALID) { - LOGE("%s(),%d: invoke %s failed (incorrect state).", __func__, __LINE__, __func__); - return OMX_ErrorUndefined; - } - - buffer_sharing_count = 7; - buffer_sharing_info = NULL; - buffer_sharing_lib = BufferShareRegistry::getInstance(); - - bsret = buffer_sharing_lib->encoderRequestToEnableSharingMode(); - if (bsret != BS_SUCCESS) { - LOGE("%s(),%d: encoder request to enable buffer sharing mode failed:%d", __func__, __LINE__, bsret); - return OMX_ErrorUndefined; - } - - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstPsbComponent::CheckAndEnableBufferSharingMode() -{ - BufferShareStatus bsret; - - if (buffer_sharing_state != BUFFER_SHARING_INVALID) { - LOGE("%s(),%d: invoke %s failed (incorrect state).", __func__, __LINE__, __func__); - return OMX_ErrorUndefined; - } - - if (buffer_sharing_lib->isBufferSharingModeEnabled()) { - LOGW("Buffer sharing is enabled (video source does support)"); - buffer_sharing_state = BUFFER_SHARING_LOADED; - } else { - LOGW("Buffer sharing is disabled (video source doesn't support)"); - } - - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstPsbComponent::RequestToDisableBufferSharingMode() -{ - BufferShareStatus bsret; - - if ((buffer_sharing_state != BUFFER_SHARING_INVALID) && - (buffer_sharing_state != BUFFER_SHARING_LOADED)) { - LOGE("%s(),%d: invoke %s failed (incorrect state).", __func__, __LINE__, __func__); - return OMX_ErrorUndefined; - } - - if (buffer_sharing_state == BUFFER_SHARING_INVALID) { - LOGW("%s(),%d: buffer sharing already in invalid state.", __func__, __LINE__); - return OMX_ErrorNone; - } - - if (buffer_sharing_info) { - delete [] buffer_sharing_info; - } - buffer_sharing_info = NULL; - - bsret = buffer_sharing_lib->encoderRequestToDisableSharingMode(); - if (bsret != BS_SUCCESS) { - LOGE("%s(),%d: request to disable sharing mode failed.", __func__, __LINE__); - return OMX_ErrorUndefined; - } - - buffer_sharing_state = BUFFER_SHARING_INVALID; - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstPsbComponent::RequestShareBuffers(MixVideo* mix, int width, int height) -{ - int i; - int buf_width, buf_height, buf_size; - MIX_RESULT mret; - bool is_request_ok = true; - - if (width <= 0 || height <= 0) { - LOGE("%s(),%d: width and height incorrect", __func__, __LINE__); - return OMX_ErrorUndefined; - } - - if ((buffer_sharing_state != BUFFER_SHARING_INVALID) && - (buffer_sharing_state != BUFFER_SHARING_LOADED)) { - LOGE("%s(),%d: invoke %s failed (incorrect state:%d).", __func__, __LINE__, __func__, buffer_sharing_state); - return OMX_ErrorUndefined; - } - - if (buffer_sharing_state == BUFFER_SHARING_INVALID) { - LOGW("%s(),%d: buffer sharing not enabled, do nothing.", __func__, __LINE__); - return OMX_ErrorNone; - } - - if (buffer_sharing_info != NULL) { - delete [] buffer_sharing_info; - buffer_sharing_info = NULL; - } - - buffer_sharing_info = new SharedBufferType[buffer_sharing_count]; - //query mix for share buffer info. - for (i = 0; i < buffer_sharing_count; i++) { - buf_width = width; - buf_height = height; - buf_size = SHARE_PTR_ALIGN(buf_width) * buf_height * 3 / 2; - mret = mix_video_get_new_userptr_for_surface_buffer(mix, - (uint)buf_width, - (uint)buf_height, - MIX_STRING_TO_FOURCC("NV12"), - (uint)buf_size, - (uint*)&buffer_sharing_info[i].allocatedSize, - (uint*)&buffer_sharing_info[i].stride, - (uint8**)&buffer_sharing_info[i].pointer); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(),%d: mix_video_get_new_userptr_for_surface_buffer failed", __func__, __LINE__); - is_request_ok = false; - break; - } - buffer_sharing_info[i].width = buf_width; - buffer_sharing_info[i].height = buf_height; - buffer_sharing_info[i].dataSize = buffer_sharing_info[i].stride * buf_height * 3 / 2; - - LOGD("width:%d, Height:%d, stride:%d, pointer:%p", buffer_sharing_info[i].width, - buffer_sharing_info[i].height, buffer_sharing_info[i].stride, - buffer_sharing_info[i].pointer); - } - - if (!is_request_ok) { - delete []buffer_sharing_info; - buffer_sharing_info = NULL; - LOGE("%s(),%d: %s failed", __func__, __LINE__,"get usr ptr for surface buffer"); - return OMX_ErrorUndefined; - } - - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstPsbComponent::RegisterShareBuffersToLib() -{ - if ((buffer_sharing_state != BUFFER_SHARING_INVALID) && - (buffer_sharing_state != BUFFER_SHARING_LOADED)) { - LOGE("%s(),%d: invoke %s failed (incorrect state).", __func__, __LINE__, __func__); - return OMX_ErrorUndefined; - } - - if (buffer_sharing_state == BUFFER_SHARING_INVALID) { - LOGW("%s(),%d: buffer sharing not enabled, do nothing.", __func__, __LINE__); - return OMX_ErrorNone; - } - - BufferShareStatus bsret = buffer_sharing_lib->encoderSetSharedBuffer(buffer_sharing_info, buffer_sharing_count); - if (bsret != BS_SUCCESS) { - LOGE("%s(),%d: encoder set shared buffer failed", __func__, __LINE__); - return OMX_ErrorUndefined; - } - - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstPsbComponent::RegisterShareBuffersToPort() -{ - if ((buffer_sharing_state != BUFFER_SHARING_INVALID) && - (buffer_sharing_state != BUFFER_SHARING_LOADED)) { - LOGE("%s(),%d: invoke %s failed (incorrect state).", __func__, __LINE__, __func__); - return OMX_ErrorUndefined; - } - - OMX_VIDEO_CONFIG_PRI_INFOTYPE privateinfoparam; - memset(&privateinfoparam, 0, sizeof(privateinfoparam)); - SetTypeHeader(&privateinfoparam, sizeof(privateinfoparam)); - - //caution: buffer-sharing info stored in INPORT (raw port) - privateinfoparam.nPortIndex = INPORT_INDEX; - if (buffer_sharing_state == BUFFER_SHARING_INVALID) { - privateinfoparam.nCapacity = 0; - privateinfoparam.nHolder = NULL; - } else { - privateinfoparam.nCapacity = buffer_sharing_count; - privateinfoparam.nHolder = buffer_sharing_info; - } - OMX_ERRORTYPE ret = static_cast<PortVideo*>(ports[privateinfoparam.nPortIndex])->SetPortPrivateInfoParam(&privateinfoparam, false); - - return ret; -} - -OMX_ERRORTYPE MrstPsbComponent::EnterBufferSharingMode() -{ - if ((buffer_sharing_state != BUFFER_SHARING_INVALID) && - (buffer_sharing_state != BUFFER_SHARING_LOADED)) { - LOGE("%s(),%d: invoke %s failed (incorrect state).", __func__, __LINE__, __func__); - return OMX_ErrorUndefined; - } - - if (buffer_sharing_state == BUFFER_SHARING_INVALID) { - LOGW("%s(),%d: buffer sharing not enabled, do nothing.", __func__, __LINE__); - return OMX_ErrorNone; - } - - BufferShareStatus bsret = buffer_sharing_lib->encoderEnterSharingMode(); - if (bsret != BS_SUCCESS) { - LOGE("%s(),%d: encoderEnterSharingMode failed", __func__, __LINE__); - if (bsret == BS_PEER_DOWN) { - LOGE("%s(), %d: camera down during buffer sharing state transition.",__func__, __LINE__); - } - return OMX_ErrorUndefined; - } - - buffer_sharing_state = BUFFER_SHARING_EXECUTING; - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstPsbComponent::ExitBufferSharingMode() -{ - if ((buffer_sharing_state != BUFFER_SHARING_INVALID) && - (buffer_sharing_state != BUFFER_SHARING_EXECUTING)) { - LOGE("%s(),%d: invoke %s failed (incorrect state).", __func__, __LINE__, __func__); - return OMX_ErrorUndefined; - } - - if (buffer_sharing_state == BUFFER_SHARING_INVALID) { - LOGW("%s(),%d: buffer sharing not enabled, do nothing.", __func__, __LINE__); - return OMX_ErrorNone; - } - - BufferShareStatus bsret = buffer_sharing_lib->encoderExitSharingMode(); - if (bsret != BS_SUCCESS) { - LOGE("%s(),%d: encoderEnterSharingMode failed", __func__, __LINE__); - if (bsret == BS_PEER_DOWN) { - LOGE("%s(), %d: camera down during buffer sharing state transition.",__func__, __LINE__); - } - return OMX_ErrorUndefined; - } - - buffer_sharing_state = BUFFER_SHARING_LOADED; - return OMX_ErrorNone; -} -/* end of share buffer setting */ - - - -OMX_ERRORTYPE MrstPsbComponent::ProcessorFlush(OMX_U32 port_index) { - - LOGV("port_index = %d Flushed!\n", port_index); - - if ((port_index == INPORT_INDEX || port_index == OMX_ALL)) { - ports[INPORT_INDEX]->ReturnAllRetainedBuffers(); - mix_video_flush( mix); - } - return OMX_ErrorNone; -} - -void MrstPsbComponent::H263EncMixBufferCallback(ulong token, uchar *data) { - MrstPsbComponent *_this = (MrstPsbComponent *) token; - - LOGV("H263EncMixBufferCallback Begin\n"); - - if(_this) { - _this->ports[_this->INPORT_INDEX]->ReturnAllRetainedBuffers(); - } - - LOGV("H263EncMixBufferCallback End\n"); -} - -/* - * CModule Interface - */ -#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) - -static const char *g_name = (const char *)"OMX.Intel.Mrst.PSB.H263.Enc"; - -static const char *g_roles[] = -{ - (const char *)"video_encoder.h263", -}; - -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/h263-enc/psb_h263.h b/h263-enc/psb_h263.h deleted file mode 100644 index e9cc627..0000000 --- a/h263-enc/psb_h263.h +++ /dev/null @@ -1,173 +0,0 @@ -/* - * psb.h, omx psb component header - * - * Copyright (c) 2009-2010 Wind River Systems, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#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> - -#include <IntelBufferSharing.h> - -using android::sp; -using android::BufferShareRegistry; - -typedef enum -{ - BUFFER_SHARING_INVALID, - BUFFER_SHARING_LOADED, - BUFFER_SHARING_EXECUTING -} BufferSharingState; - -class MrstPsbComponent : public ComponentBase -{ -public: - /* - * constructor & destructor - */ - MrstPsbComponent(); - ~MrstPsbComponent(); - -private: - /* - * component methods & helpers - */ - /* implement ComponentBase::ComponentAllocatePorts */ - virtual OMX_ERRORTYPE ComponentAllocatePorts(void); - OMX_ERRORTYPE __AllocateH263Port(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 OMX_ERRORTYPE ProcessorFlush(OMX_U32 port_index); - virtual OMX_ERRORTYPE ProcessorProcess(OMX_BUFFERHEADERTYPE ***pBuffers, - buffer_retain_t *retain, - OMX_U32 nr_buffers); - - /* end of component methods & helpers */ - - /* - * vcp setting helpers - */ - OMX_ERRORTYPE __RawChangePortParamWithVcp(MixVideoConfigParams *vcp, - PortVideo *port); - OMX_ERRORTYPE ChangePortParamWithVcp(void); - - /* encoders */ - OMX_ERRORTYPE __H263ChangeVcpWithPortParam(MixVideoConfigParams *vcp, - PortH263 *port, bool *vcp_changed); - OMX_ERRORTYPE ChangeVcpWithPortParam(MixVideoConfigParams *vcp, - PortVideo *port_in, - PortVideo *port_out, - bool *vcp_changed); - - static void H263EncMixBufferCallback(ulong token, uchar *data); - - /* end of vcp setting helpers */ - - /* share buffer setting */ - OMX_ERRORTYPE EnterBufferSharingMode(void); - OMX_ERRORTYPE ExitBufferSharingMode(void); - OMX_ERRORTYPE RequestToEnableBufferSharingMode(void); - OMX_ERRORTYPE RequestToDisableBufferSharingMode(void); - OMX_ERRORTYPE CheckAndEnableBufferSharingMode(void); - OMX_ERRORTYPE RequestShareBuffers(MixVideo* mix, int width, int height); - OMX_ERRORTYPE RegisterShareBuffersToPort(void); - OMX_ERRORTYPE RegisterShareBuffersToLib(void); - /* end of share buffer setting */ - - - /* mix video */ - MixVideo *mix; - MixVideoInitParams *vip; - MixParams *mvp; - MixVideoConfigParams *vcp; - MixDisplayAndroid *display; - MixBuffer *mixbuffer_in[1]; - MixIOVec *mixiovec_out[1]; - - OMX_BOOL is_mixvideodec_configured; - - OMX_U32 inframe_counter; - OMX_U32 outframe_counter; - - /* for buffer sharing */ - sp<BufferShareRegistry> buffer_sharing_lib; - int buffer_sharing_count; - SharedBufferType* buffer_sharing_info; - BufferSharingState buffer_sharing_state; - - /* for fps */ - OMX_TICKS last_ts; - float last_fps; - - OMX_U32 h263EncPFrames; - /* for H263 format detect */ - H263HeaderParser h263_parser; - - OMX_VIDEO_PARAM_INTEL_BITRATETYPE h263EncParamIntelBitrateType; - OMX_VIDEO_CONFIG_INTEL_BITRATETYPE h263EncConfigIntelBitrateType; - OMX_CONFIG_FRAMERATETYPE h263EncFramerate; - - /* constant */ - /* ports */ - const static OMX_U32 NR_PORTS = 2; - const static OMX_U32 INPORT_INDEX = 0; - const static OMX_U32 OUTPORT_INDEX = 1; - - /* default buffer */ - const static OMX_U32 INPORT_RAW_ACTUAL_BUFFER_COUNT = 2; //FIXME, must be set to 2 - const static OMX_U32 INPORT_RAW_MIN_BUFFER_COUNT = 1; - const static OMX_U32 INPORT_RAW_BUFFER_SIZE = 614400; - 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 = 38016; - - const static OMX_U32 INPORT_H263_ACTUAL_BUFFER_COUNT = 10; - const static OMX_U32 INPORT_H263_MIN_BUFFER_COUNT = 1; - const static OMX_U32 INPORT_H263_BUFFER_SIZE = 614400; - const static OMX_U32 OUTPORT_H263_ACTUAL_BUFFER_COUNT = 2; - const static OMX_U32 OUTPORT_H263_MIN_BUFFER_COUNT = 1; - const static OMX_U32 OUTPORT_H263_BUFFER_SIZE = 614400; -}; -#endif /* __WRS_OMXIL_INTEL_MRST_PSB */ diff --git a/h263-enc/vabuffer.h b/h263-enc/vabuffer.h deleted file mode 100644 index 1b0196c..0000000 --- a/h263-enc/vabuffer.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * vabuffer.h, vabuffer structure header - * - * Copyright (c) 2009-2010 Wind River Systems, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __VA_BUFFER_H__ -#define __VA_BUFFER_H__ - -struct VABuffer -{ - VASurfaceID surface; - VADisplay display; - unsigned int frame_structure; -}; - -#endif /* __VA_BUFFER_H__ */ - diff --git a/m4v-enc/Android.mk b/m4v-enc/Android.mk deleted file mode 100644 index 43bb590..0000000 --- a/m4v-enc/Android.mk +++ /dev/null @@ -1,52 +0,0 @@ -ifeq ($(strip $(BOARD_USES_WRS_OMXIL_CORE)),true) -LOCAL_PATH := $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := \ - psb_m4v.cpp - -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE := libwrs_omxil_intel_mrst_psb_m4v_enc - -LOCAL_CPPFLAGS := -DMIXVIDEO_ENCODE_ENABLE=0 - -LOCAL_LDFLAGS := - -LOCAL_STATIC_LIBRARIES := - -LOCAL_SHARED_LIBRARIES := \ - libwrs_omxil_common \ - liblog \ - libmixcommon \ - libmixvideo \ - libmixvbp \ - libva \ - libva-android \ - libva-tpi \ - libutils \ - libsharedbuffer - -VENDORS_INTEL_MRST_MIXVBP_ROOT := $(VENDORS_INTEL_MRST_LIBMIX_ROOT)/mix_vbp - -LOCAL_C_INCLUDES := \ - $(TARGET_OUT_HEADERS)/khronos/openmax \ - $(TARGET_OUT_HEADERS)/wrs_omxil_core \ - $(TARGET_OUT_HEADERS)/libmixcommon \ - $(TARGET_OUT_HEADERS)/libmixvideo \ - $(TARGET_OUT_HEADERS)/libva \ - $(TARGET_OUT_HEADERS)/libdrm \ - $(TARGET_OUT_HEADERS)/libdrm/shared-core \ - $(TARGET_OUT_HEADERS)/libmixvbp \ - $(TARGET_OUT_HEADERS)/libpsb_drm \ - $(TARGET_OUT_HEADERS)/libsharedbuffer - - -LOCAL_COPY_HEADERS_TO := libwrs_omxil_intel_mrst_psb_m4v_enc -LOCAL_COPY_HEADERS := vabuffer.h - -ifeq ($(ENABLE_BUFFER_SHARE_MODE),true) -LOCAL_CPPFLAGS += -DENABLE_BUFFER_SHARE_MODE=1 -endif - -include $(BUILD_SHARED_LIBRARY) -endif diff --git a/m4v-enc/ebuild.mk b/m4v-enc/ebuild.mk deleted file mode 100644 index 06a4106..0000000 --- a/m4v-enc/ebuild.mk +++ /dev/null @@ -1,21 +0,0 @@ -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/m4v-enc/psb_m4v.cpp b/m4v-enc/psb_m4v.cpp deleted file mode 100644 index e3299d9..0000000 --- a/m4v-enc/psb_m4v.cpp +++ /dev/null @@ -1,1968 +0,0 @@ -/* - * psb.cpp, omx psb component file - * - * Copyright (c) 2009-2010 Wind River Systems, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -//#define LOG_NDEBUG 0 -#undef LOG_TAG -#define LOG_TAG "intel-m4v-encoder" -#include <utils/Log.h> - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include <sys/time.h> - -#include <OMX_Core.h> -#include <OMX_IndexExt.h> -#include <OMX_VideoExt.h> -#include <OMX_IntelErrorTypes.h> - -#include <cmodule.h> -#include <portvideo.h> -#include <componentbase.h> - -#include <mixdisplayandroid.h> -#include <mixvideo.h> -#include <mixvideoconfigparamsenc_mpeg4.h> - -#ifdef __cplusplus -extern "C" { -#endif - -#include <va/va.h> - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#include <va/va_android.h> -#include "psb_m4v.h" - -#define Display unsigned int -#define SHOW_FPS 0 -#include "vabuffer.h" - -#include <IntelBufferSharing.h> - -#define MPEG4_ENCODE_ERROR_CHECKING(p) \ -if (!p) { \ - LOGV("%s(), NULL pointer", __func__); \ - return OMX_ErrorBadParameter; \ -} \ -ret = CheckTypeHeader(p, sizeof(*p)); \ -if (ret != OMX_ErrorNone) { \ - LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); \ - return ret; \ -} \ -OMX_U32 index = p->nPortIndex; \ -if (index != OUTPORT_INDEX) { \ - LOGV("%s(), wrong port index", __func__); \ - return OMX_ErrorBadPortIndex; \ -} \ -PortMpeg4*port = static_cast<PortMpeg4 *> (ports[index]); \ -if (!port) { \ - LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, \ - OMX_ErrorBadPortIndex); \ - return OMX_ErrorBadPortIndex; \ -} \ -LOGV("%s(), about to get native or supported nal format", __func__); \ -if (!port->IsEnabled()) { \ - LOGV("%s() : port is not enabled", __func__); \ - return OMX_ErrorNotReady; \ -}\ - -/* - * constructor & destructor - */ -MrstPsbComponent::MrstPsbComponent() -{ - LOGV("%s(): enter\n", __func__); - - buffer_sharing_state = BUFFER_SHARING_INVALID; - - OMX_ERRORTYPE oret = RequestToEnableBufferSharingMode(); - - if (oret != OMX_ErrorNone) { - LOGE("%s(),%d: set buffer sharing mode failed", __func__, __LINE__); - RequestToDisableBufferSharingMode(); - } - - LOGV("%s(),%d: exit\n", __func__, __LINE__); -} - -MrstPsbComponent::~MrstPsbComponent() -{ - LOGV("%s(): enter\n", __func__); - - OMX_ERRORTYPE oret = RequestToDisableBufferSharingMode(); - if (oret != OMX_ErrorNone) { - LOGE("%s(),%d: DisableBufferSharingMode failed", __func__, __LINE__); - } - - LOGV("%s(),%d: exit\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, "_"); - - raw_port_index = INPORT_INDEX; - codec_port_index = OUTPORT_INDEX; - raw_port_dir = OMX_DirInput; - codec_port_dir = OMX_DirOutput; - - working_role = strpbrk(working_role, "."); - if (!working_role) - return OMX_ErrorUndefined; - working_role++; - - this->mix = NULL; - this->vip = NULL; - this->mvp = NULL; - this->vcp = NULL; - this->display = NULL; - this->mixbuffer_in[0] = NULL; - - ret = __AllocateMpeg4Port(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: - - 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::__AllocateMpeg4Port(OMX_U32 port_index, - OMX_DIRTYPE dir) -{ - PortMpeg4 *mpeg4port; - - OMX_PARAM_PORTDEFINITIONTYPE mpeg4portdefinition; - OMX_VIDEO_PARAM_MPEG4TYPE mpeg4portparam; - - LOGV("%s(): enter\n", __func__); - - ports[port_index] = new PortMpeg4; - if (!ports[port_index]) { - LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, - OMX_ErrorInsufficientResources); - return OMX_ErrorInsufficientResources; - } - mpeg4port = static_cast<PortMpeg4 *>(this->ports[port_index]); - - /* OMX_PARAM_PORTDEFINITIONTYPE */ - memset(&mpeg4portdefinition, 0, sizeof(mpeg4portdefinition)); - SetTypeHeader(&mpeg4portdefinition, sizeof(mpeg4portdefinition)); - mpeg4portdefinition.nPortIndex = port_index; - mpeg4portdefinition.eDir = dir; - - mpeg4portdefinition.nBufferCountActual =OUTPORT_MPEG4_ACTUAL_BUFFER_COUNT; - mpeg4portdefinition.nBufferCountMin = OUTPORT_MPEG4_MIN_BUFFER_COUNT; - mpeg4portdefinition.nBufferSize = OUTPORT_MPEG4_BUFFER_SIZE; - - mpeg4portdefinition.bEnabled = OMX_TRUE; - mpeg4portdefinition.bPopulated = OMX_FALSE; - mpeg4portdefinition.eDomain = OMX_PortDomainVideo; - mpeg4portdefinition.format.video.cMIMEType = (OMX_STRING)"video/mpeg4"; - mpeg4portdefinition.format.video.pNativeRender = NULL; - mpeg4portdefinition.format.video.nFrameWidth = 176; - mpeg4portdefinition.format.video.nFrameHeight = 144; - mpeg4portdefinition.format.video.nStride = 0; - mpeg4portdefinition.format.video.nSliceHeight = 0; - mpeg4portdefinition.format.video.nBitrate = 64000; - mpeg4portdefinition.format.video.xFramerate = 15 << 16; - mpeg4portdefinition.format.video.bFlagErrorConcealment = OMX_FALSE; - mpeg4portdefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG4; - mpeg4portdefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused; - mpeg4portdefinition.format.video.pNativeWindow = NULL; - mpeg4portdefinition.bBuffersContiguous = OMX_FALSE; - mpeg4portdefinition.nBufferAlignment = 0; - mpeg4port->SetPortDefinition(&mpeg4portdefinition, true); - /* end of OMX_PARAM_PORTDEFINITIONTYPE */ - - /* OMX_VIDEO_PARAM_MPEG4TYPE */ - memset(&mpeg4portparam, 0, sizeof(mpeg4portparam)); - SetTypeHeader(&mpeg4portparam, sizeof(mpeg4portparam)); - mpeg4portparam.nPortIndex = port_index; - mpeg4portparam.eProfile = OMX_VIDEO_MPEG4ProfileSimple; - mpeg4portparam.eLevel = OMX_VIDEO_MPEG4Level5; - - mpeg4port->SetPortMpeg4Param(&mpeg4portparam, true); - /* end of OMX_VIDEO_PARAM_MPEG4TYPE */ - - /* encoder */ - /* OMX_VIDEO_PARAM_BITRATETYPE */ - OMX_VIDEO_PARAM_BITRATETYPE bitrateparam; - memset(&bitrateparam, 0, sizeof(bitrateparam)); - SetTypeHeader(&bitrateparam, sizeof(bitrateparam)); - bitrateparam.nPortIndex = port_index; - bitrateparam.eControlRate = OMX_Video_ControlRateConstant; - bitrateparam.nTargetBitrate = 64000; - mpeg4port->SetPortBitrateParam(&bitrateparam, true); - /* end of OMX_VIDEO_PARAM_BITRATETYPE */ - - /* OMX_VIDEO_CONFIG_PRI_INFOTYPE */ - OMX_VIDEO_CONFIG_PRI_INFOTYPE privateinfoparam; - - memset(&privateinfoparam, 0, sizeof(privateinfoparam)); - SetTypeHeader(&privateinfoparam, sizeof(privateinfoparam)); - - privateinfoparam.nPortIndex = port_index; - privateinfoparam.nCapacity = 0; - privateinfoparam.nHolder = NULL; - mpeg4port->SetPortPrivateInfoParam(&privateinfoparam, true); - /* end of OMX_VIDEO_CONFIG_PRI_INFOTYPE */ - - mpeg4EncPFrames = 0; - mpeg4EncParamIntelBitrateType.nPortIndex = port_index; - mpeg4EncParamIntelBitrateType.eControlRate = OMX_Video_Intel_ControlRateMax; - mpeg4EncParamIntelBitrateType.nTargetBitrate = 0; - SetTypeHeader(&mpeg4EncParamIntelBitrateType, sizeof(mpeg4EncParamIntelBitrateType)); - - mpeg4EncConfigIntelBitrateType.nPortIndex = port_index; - mpeg4EncConfigIntelBitrateType.nMaxEncodeBitrate = 4000 * 1024; // Maximum bitrate - mpeg4EncConfigIntelBitrateType.nTargetPercentage = 95; // Target bitrate as percentage of maximum bitrate; e.g. 95 is 95% - mpeg4EncConfigIntelBitrateType.nWindowSize = 1000; // Window size in milliseconds allowed for bitrate to reach target - mpeg4EncConfigIntelBitrateType.nInitialQP = 36; // Initial QP for I frames - mpeg4EncConfigIntelBitrateType.nMinQP = 18; - SetTypeHeader(&mpeg4EncConfigIntelBitrateType, sizeof(mpeg4EncConfigIntelBitrateType)); - - mpeg4EncConfigAir.nPortIndex = port_index; - mpeg4EncConfigAir.bAirEnable = OMX_FALSE; - mpeg4EncConfigAir.bAirAuto = OMX_FALSE; - mpeg4EncConfigAir.nAirMBs = 0; - mpeg4EncConfigAir.nAirThreshold = 0; - SetTypeHeader(&mpeg4EncConfigAir, sizeof(mpeg4EncConfigAir)); - - mpeg4EncFramerate.nPortIndex = port_index; - mpeg4EncFramerate.xEncodeFramerate = 0; // Q16 format - SetTypeHeader(&mpeg4EncFramerate, sizeof(mpeg4EncFramerate)); - - - - 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]) { - LOGE("%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; - - rawportdefinition.nBufferCountActual = INPORT_RAW_ACTUAL_BUFFER_COUNT; - rawportdefinition.nBufferCountMin = INPORT_RAW_MIN_BUFFER_COUNT; - rawportdefinition.nBufferSize = INPORT_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 = 176; - rawportdefinition.format.video.nSliceHeight = 144; - 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_FormatYUV420SemiPlanar; - 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_FormatYUV420SemiPlanar; - 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: { - LOGV("%s(), OMX_IndexParamVideoPortFormat", __func__); - 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) { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortVideo *>(ports[index]); - - if (!port) { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, - OMX_ErrorBadPortIndex); - return OMX_ErrorBadPortIndex; - } - - if(index == INPORT_INDEX ) { - if(p->nIndex < 1) { - p->eColorFormat = port->GetPortVideoParam()->eColorFormat; - p->eCompressionFormat = OMX_VIDEO_CodingUnused; - } - else { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__,OMX_ErrorNoMore); - return OMX_ErrorNoMore; - } - } - else if(index == OUTPORT_INDEX) { - if(p->nIndex < 1) { - p->eCompressionFormat= port->GetPortVideoParam()->eCompressionFormat; - p->eColorFormat = OMX_COLOR_FormatUnused; - } - else { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__,OMX_ErrorNoMore); - return OMX_ErrorNoMore; - } - } - else { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__,OMX_ErrorBadPortIndex); - return OMX_ErrorBadPortIndex; - } - - - LOGV("p->eColorFormat = %x\n", p->eColorFormat); - - break; - } - case OMX_IndexParamVideoMpeg4: { - LOGV("%s(), OMX_IndexParamVideoMpeg4", __func__); - OMX_VIDEO_PARAM_MPEG4TYPE *p = - (OMX_VIDEO_PARAM_MPEG4TYPE *)pComponentParameterStructure; - OMX_U32 index = p->nPortIndex; - PortMpeg4 *port = NULL; - - LOGV("%s(): port index : %lu\n", __func__, index); - - ret = CheckTypeHeader(p, sizeof(*p)); - if (ret != OMX_ErrorNone) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortMpeg4 *>(ports[index]); - - if (!port) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, - OMX_ErrorBadPortIndex); - return OMX_ErrorBadPortIndex; - } - - memcpy(p, port->GetPortMpeg4Param(), sizeof(*p)); - break; - } - case OMX_IndexParamVideoBitrate: { - LOGV("%s(), OMX_IndexParamVideoBitrate", __func__); - OMX_VIDEO_PARAM_BITRATETYPE *p = - (OMX_VIDEO_PARAM_BITRATETYPE *)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) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortVideo *>(ports[index]); - - if (!port) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, - OMX_ErrorBadPortIndex); - return OMX_ErrorBadPortIndex; - } - - memcpy(p, port->GetPortBitrateParam(), sizeof(*p)); - break; - } - case OMX_IndexParamVideoProfileLevelQuerySupported: - { - LOGV("%s(), OMX_IndexParamVideoProfileLevelQuerySupported", __func__); - OMX_VIDEO_PARAM_PROFILELEVELTYPE *p = - (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure; - PortMpeg4 *port = NULL; - - OMX_U32 index = p->nPortIndex; - - LOGV("%s(): port index : %lu\n", __func__, index); - - ret = CheckTypeHeader(p, sizeof(*p)); - if (ret != OMX_ErrorNone) - { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - { - port = static_cast<PortMpeg4 *>(ports[index]); - } - else - { - return OMX_ErrorBadParameter; - } - - const OMX_VIDEO_PARAM_MPEG4TYPE *mpeg4Param = port->GetPortMpeg4Param(); - - p->eProfile = mpeg4Param->eProfile; - p->eLevel = mpeg4Param->eLevel; - - 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: { - LOGV("%s(), OMX_IndexParamVideoPortFormat", __func__); - 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) { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortVideo *>(ports[index]); - - if (!port) { - LOGE("%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) { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, - OMX_ErrorIncorrectStateOperation); - return OMX_ErrorIncorrectStateOperation; - } - } - - ret = port->SetPortVideoParam(p, false); - break; - } - case OMX_IndexParamVideoMpeg4: { - LOGV("%s(), OMX_IndexParamVideoMpeg4", __func__); - OMX_VIDEO_PARAM_MPEG4TYPE *p = - (OMX_VIDEO_PARAM_MPEG4TYPE *)pComponentParameterStructure; - OMX_U32 index = p->nPortIndex; - PortMpeg4 *port = NULL; - - LOGV("%s(): port index : %lu\n", __func__, index); - - ret = CheckTypeHeader(p, sizeof(*p)); - if (ret != OMX_ErrorNone) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortMpeg4 *>(ports[index]); - - if (!port) { - LOGE("%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) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, - OMX_ErrorIncorrectStateOperation); - return OMX_ErrorIncorrectStateOperation; - } - } - ret = port->SetPortMpeg4Param(p, false); - break; - } - case OMX_IndexParamVideoBitrate: { - LOGV("%s(), OMX_IndexParamVideoBitrate", __func__); - OMX_VIDEO_PARAM_BITRATETYPE *p = - (OMX_VIDEO_PARAM_BITRATETYPE *)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) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortVideo *>(ports[index]); - - if (!port) { - LOGE("%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->SetPortBitrateParam(p, false); - - break; - } - case OMX_IndexParamVideoBytestream: { - LOGV("%s(), OMX_IndexParamVideoBytestream", __func__); - OMX_VIDEO_PARAM_BYTESTREAMTYPE *p = - (OMX_VIDEO_PARAM_BYTESTREAMTYPE *) pComponentParameterStructure; - OMX_U32 index = p->nPortIndex; - PortVideo *port = NULL; - - ret = CheckTypeHeader(p, sizeof(*p)); - if (ret != OMX_ErrorNone) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortVideo *> (ports[index]); - - if (!port) { - LOGE("%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) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, - OMX_ErrorIncorrectStateOperation); - return OMX_ErrorIncorrectStateOperation; - } - - } - 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; - OMX_CONFIG_INTRAREFRESHVOPTYPE* pVideoIFrame; - OMX_VIDEO_CONFIG_AVCINTRAPERIOD *pVideoIDRInterval; - - LOGV("%s(): enter\n", __func__); - - LOGV("%s() : nIndex = %d\n", __func__, nIndex); - - switch (nIndex) - { - - case OMX_IndexConfigIntelBitrate: { - - LOGV("%s() : OMX_IndexParamIntelBitrate", __func__); - - if (mpeg4EncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_VIDEO_CONFIG_INTEL_BITRATETYPE *pIntelBitrate = - (OMX_VIDEO_CONFIG_INTEL_BITRATETYPE *) pComponentConfigStructure; - - MPEG4_ENCODE_ERROR_CHECKING(pIntelBitrate) - - *pIntelBitrate = mpeg4EncConfigIntelBitrateType; - - break; - } - case OMX_IndexConfigIntelAIR: { - - LOGV("%s() : OMX_IndexConfigIntelAIR", __func__); - - if (mpeg4EncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_VIDEO_CONFIG_INTEL_AIR *pIntelAir = - (OMX_VIDEO_CONFIG_INTEL_AIR *) pComponentConfigStructure; - - MPEG4_ENCODE_ERROR_CHECKING(pIntelAir) - - *pIntelAir = mpeg4EncConfigAir; - break; - } - case OMX_IndexConfigVideoFramerate: { - - LOGV("%s() : OMX_IndexConfigVideoFramerate", __func__); - - if (mpeg4EncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_CONFIG_FRAMERATETYPE *pxFramerate = - (OMX_CONFIG_FRAMERATETYPE *) pComponentConfigStructure; - - MPEG4_ENCODE_ERROR_CHECKING(pxFramerate) - - *pxFramerate = mpeg4EncFramerate; - break; - } - case OMX_IndexIntelPrivateInfo: { - OMX_VIDEO_CONFIG_PRI_INFOTYPE *p = - (OMX_VIDEO_CONFIG_PRI_INFOTYPE *)pComponentConfigStructure; - 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) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortVideo *>(ports[index]); - - if (!port) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, - OMX_ErrorBadPortIndex); - return OMX_ErrorBadPortIndex; - } - - memcpy(p, port->GetPortPrivateInfoParam(), sizeof(*p)); - break; - } - default: - { - return OMX_ErrorUnsupportedIndex; - } - } - LOGV("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, ret); - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstPsbComponent::ComponentSetConfig( - OMX_INDEXTYPE nParamIndex, - OMX_PTR pComponentConfigStructure) -{ - OMX_ERRORTYPE ret = OMX_ErrorUnsupportedIndex; - OMX_CONFIG_INTRAREFRESHVOPTYPE* pVideoIFrame; - MIX_RESULT mret; - LOGV("%s(): enter\n", __func__); - - switch (nParamIndex) - { - case OMX_IndexConfigVideoIntraVOPRefresh: - { - LOGV("%s(), OMX_IndexConfigVideoIntraVOPRefresh", __func__); - - pVideoIFrame = (OMX_CONFIG_INTRAREFRESHVOPTYPE*) pComponentConfigStructure; - - MPEG4_ENCODE_ERROR_CHECKING(pVideoIFrame) - - LOGV("%s(), OMX_IndexConfigVideoIntraVOPRefresh", __func__); - if(pVideoIFrame->IntraRefreshVOP == OMX_TRUE) { - LOGV("%s(), pVideoIFrame->IntraRefreshVOP == OMX_TRUE", __func__); - - MixEncDynamicParams encdynareq; - memset(&encdynareq, 0, sizeof(encdynareq)); - encdynareq.force_idr = TRUE; - if(mix) { - mret = mix_video_set_dynamic_enc_config (mix, - MIX_ENC_PARAMS_FORCE_KEY_FRAME, &encdynareq); - if(mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), failed to set IDR interval", __func__); - } - } - } - break; - } - - case OMX_IndexConfigIntelBitrate: { - - LOGV("%s(), OMX_IndexConfigIntelBitrate", __func__); - if (mpeg4EncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - LOGV("%s(), eControlRate == OMX_Video_Intel_ControlRateMax"); - break; - } - - OMX_VIDEO_CONFIG_INTEL_BITRATETYPE *pIntelBitrate = - (OMX_VIDEO_CONFIG_INTEL_BITRATETYPE *) pComponentConfigStructure; - - MPEG4_ENCODE_ERROR_CHECKING(pIntelBitrate); - - mpeg4EncConfigIntelBitrateType = *pIntelBitrate; - - if (mix && mpeg4EncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateVideoConferencingMode) { - - LOGV("%s(), mpeg44EncConfigIntelBitrateType.nInitialQP = %d", __func__, - mpeg4EncConfigIntelBitrateType.nInitialQP); - - LOGV("%s(), mpeg4EncConfigIntelBitrateType.nMinQP = %d", __func__, - mpeg4EncConfigIntelBitrateType.nMinQP); - - LOGV("%s(), mpeg4EncConfigIntelBitrateType.nMaxEncodeBitrate = %d", __func__, - mpeg4EncConfigIntelBitrateType.nMaxEncodeBitrate); - - LOGV("%s(), mpeg4EncConfigIntelBitrateType.nTargetPercentage = %d", __func__, - mpeg4EncConfigIntelBitrateType.nTargetPercentage); - - LOGV("%s(), mpeg4EncConfigIntelBitrateType.nWindowSize = %d", __func__, - mpeg4EncConfigIntelBitrateType.nWindowSize); - - MixEncParamsType params_type; - MixEncDynamicParams dynamic_params; - memset(&dynamic_params, 0, sizeof(dynamic_params)); - - params_type = MIX_ENC_PARAMS_INIT_QP; - dynamic_params.init_QP = mpeg4EncConfigIntelBitrateType.nInitialQP; - mret = mix_video_set_dynamic_enc_config(mix, params_type, - &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - - params_type = MIX_ENC_PARAMS_MIN_QP; - dynamic_params.min_QP = mpeg4EncConfigIntelBitrateType.nMinQP; - mret = mix_video_set_dynamic_enc_config(mix, params_type, - &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - - params_type = MIX_ENC_PARAMS_BITRATE; - dynamic_params.bitrate - = mpeg4EncConfigIntelBitrateType.nMaxEncodeBitrate; - mret = mix_video_set_dynamic_enc_config(mix, params_type, - &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - - params_type = MIX_ENC_PARAMS_TARGET_PERCENTAGE; - dynamic_params.target_percentage - = mpeg4EncConfigIntelBitrateType.nTargetPercentage; - mret = mix_video_set_dynamic_enc_config(mix, params_type, - &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - - params_type = MIX_ENC_PARAMS_WINDOW_SIZE; - dynamic_params.window_size - = mpeg4EncConfigIntelBitrateType.nWindowSize; - mret = mix_video_set_dynamic_enc_config(mix, params_type, - &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - } - break; - } - case OMX_IndexConfigIntelAIR: { - LOGV("%s(), OMX_IndexConfigIntelAIR", __func__); - if (mpeg4EncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_VIDEO_CONFIG_INTEL_AIR *pIntelAir = - (OMX_VIDEO_CONFIG_INTEL_AIR *) pComponentConfigStructure; - - MPEG4_ENCODE_ERROR_CHECKING(pIntelAir); - - mpeg4EncConfigAir = *pIntelAir; - - if (mix && mpeg4EncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateVideoConferencingMode) { - - MixEncParamsType params_type; - MixEncDynamicParams dynamic_params; - memset(&dynamic_params, 0, sizeof(dynamic_params)); - - if(pIntelAir->bAirEnable) { - - params_type = MIX_ENC_PARAMS_REFRESH_TYPE; - dynamic_params.refresh_type = MIX_VIDEO_AIR; - mret = mix_video_set_dynamic_enc_config (mix, params_type, &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - - params_type = MIX_ENC_PARAMS_AIR; - dynamic_params.air_params.air_auto = pIntelAir->bAirAuto; - dynamic_params.air_params.air_MBs = pIntelAir->nAirMBs; - dynamic_params.air_params.air_threshold = pIntelAir->nAirThreshold; - mret = mix_video_set_dynamic_enc_config (mix, params_type, &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - - } else { - - params_type = MIX_ENC_PARAMS_REFRESH_TYPE; - dynamic_params.refresh_type = MIX_VIDEO_NONIR; - mret = mix_video_set_dynamic_enc_config (mix, params_type, &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - } - } - break; - } - - case OMX_IndexConfigVideoFramerate: { - - LOGV("%s(), OMX_IndexConfigVideoFramerate", __func__); - if (mpeg4EncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_CONFIG_FRAMERATETYPE *pxFramerate = - (OMX_CONFIG_FRAMERATETYPE *) pComponentConfigStructure; - - MPEG4_ENCODE_ERROR_CHECKING(pxFramerate); - - mpeg4EncFramerate = *pxFramerate; - - if (mix && mpeg4EncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateVideoConferencingMode) { - - MixEncParamsType params_type; - MixEncDynamicParams dynamic_params; - memset(&dynamic_params, 0, sizeof(dynamic_params)); - - params_type = MIX_ENC_PARAMS_FRAME_RATE; - dynamic_params.frame_rate_denom = 1; - dynamic_params.frame_rate_num = mpeg4EncFramerate.xEncodeFramerate >> 16; // Q16 format - mret = mix_video_set_dynamic_enc_config (mix, params_type, &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - } - break; - } - - default: - { - return OMX_ErrorUnsupportedIndex; - } - } - LOGV("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, ret); - return OMX_ErrorNone; -} -/* end of component methods & helpers */ - -/* - * implement ComponentBase::Processor[*] - */ -OMX_ERRORTYPE MrstPsbComponent::ProcessorInit(void) -{ - MixVideo *mix = NULL; - MixVideoInitParams *vip = NULL; - MixParams *mvp = NULL; - MixVideoConfigParams *vcp = NULL; - MixDisplayAndroid *display = NULL; - OMX_U32 port_index = (OMX_U32)-1; - uint major, minor; - OMX_ERRORTYPE oret = OMX_ErrorNone; - MIX_RESULT mret; - BufferShareStatus bsret; - temp_coded_data_buffer = NULL; - - LOGV("%s(): enter\n", __func__); - mix = mix_video_new(); - LOGV("%s(): called to mix_video_new()", __func__); - - if (!mix) { - LOGE("%s(),%d: exit, mix_video_new failed", __func__, __LINE__); - goto error_out; - } - - mix_video_get_version(mix, &major, &minor); - LOGV("MixVideo version: %d.%d", major, minor); - - /* encoder */ - vcp =MIX_VIDEOCONFIGPARAMS(mix_videoconfigparamsenc_mpeg4_new()); - mvp = MIX_PARAMS(mix_videoencodeparams_new()); - port_index = OUTPORT_INDEX; - - if (!vcp || !mvp || (port_index == (OMX_U32)-1)) { - LOGE("%s(),%d: exit, failed to allocate vcp, mvp, port_index\n", - __func__, __LINE__); - goto error_out; - } - - oret = ChangeVcpWithPortParam(vcp, - static_cast<PortVideo *>(ports[port_index]), - NULL); - if (oret != OMX_ErrorNone) { - LOGE("%s(),%d: exit, ChangeVcpWithPortParam failed (ret == 0x%08x)\n", - __func__, __LINE__, oret); - goto error_out; - } - - display = mix_displayandroid_new(); - if (!display) { - LOGE("%s(),%d: exit, mix_displayandroid_new failed", __func__, __LINE__); - goto error_out; - } - - vip = mix_videoinitparams_new(); - if (!vip) { - LOGE("%s(),%d: exit, mix_videoinitparams_new failed", __func__, - __LINE__); - goto error_out; - } - - { - Display *android_display = (Display*)malloc(sizeof(Display)); - *(android_display) = 0x18c34078; - - LOGV("*android_display = %d", *android_display); - - mret = mix_displayandroid_set_display(display, android_display); - if (mret != MIX_RESULT_SUCCESS) { - LOGV("%s(),%d: exit, mix_displayandroid_set_display failed " - "(ret == 0x%08x)", __func__, __LINE__, mret); - goto error_out; - } - } - - mret = mix_videoinitparams_set_display(vip, MIX_DISPLAY(display)); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(),%d: exit, mix_videoinitparams_set_display failed " - "(ret == 0x%08x)", __func__, __LINE__, mret); - goto error_out; - } - - mret = mix_video_initialize(mix, MIX_CODEC_MODE_ENCODE, vip, NULL); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(),%d: exit, mix_video_initialize failed (ret == 0x%08x)", - __func__, __LINE__, mret); - goto error_out; - } - - oret = CheckAndEnableBufferSharingMode(); - if (oret != OMX_ErrorNone) { - LOGE("%s(), %d: CheckAndEnableBufferSharingMode() failed ", __func__, __LINE__); - goto error_out; - } - - oret = RequestShareBuffers(mix, - MIX_VIDEOCONFIGPARAMSENC(vcp)->picture_width, - MIX_VIDEOCONFIGPARAMSENC(vcp)->picture_height); - if (oret != OMX_ErrorNone) { - LOGE("%s(), %d: RequestShareBuffers() failed ", __func__, __LINE__); - goto error_out; - } - - mix_videoconfigparamsenc_set_share_buf_mode(MIX_VIDEOCONFIGPARAMSENC(vcp), FALSE); - - LOGV("mix_video_configure"); - mret = mix_video_configure(mix, vcp, NULL); - if (mret != MIX_RESULT_SUCCESS) { - LOGV("%s(), %d: exit, mix_video_configure failed " - "(ret:0x%08x)", __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - if(mret == MIX_RESULT_NO_MEMORY) { - oret = OMX_ErrorInsufficientResources; - } else if(mret == MIX_RESULT_NOT_PERMITTED) { - oret = (OMX_ERRORTYPE)OMX_ErrorIntelVideoNotPermitted;; - } - goto error_out; - } - - LOGV("%s(): mix video configured", __func__); - - this->mix = mix; - this->vip = vip; - this->mvp = mvp; - this->vcp = vcp; - this->display = display; - this->mixbuffer_in[0] = NULL; - - inframe_counter = 0; - outframe_counter = 0; - is_mixvideodec_configured = OMX_FALSE; - - last_ts = 0; - last_fps = 0.0; - - video_data = NULL; - video_len = 0; - - temp_coded_data_buffer_size = MIX_VIDEOCONFIGPARAMSENC(vcp)->picture_width * - MIX_VIDEOCONFIGPARAMSENC(vcp)->picture_height * - 400 / 16 / 16; //FIXME: same with h264? - temp_coded_data_buffer = new OMX_U8 [temp_coded_data_buffer_size]; - - b_config_sent = false; - - oret = RegisterShareBuffersToPort(); - if (oret != OMX_ErrorNone) { - LOGE("%s(), %d RegisterShareBufferToPort() failed", __func__, __LINE__); - oret = OMX_ErrorUndefined; - goto error_out; - } - - oret = RegisterShareBuffersToLib(); - if (oret != OMX_ErrorNone) { - LOGE("%s(), %d register Share Buffering Mode failed", __func__, __LINE__); - goto error_out; - } - - oret = EnterBufferSharingMode(); - if (oret != OMX_ErrorNone) { - LOGE("%s(), %d EnterShareBufferingMode() failed", __func__, __LINE__); - goto error_out; - } - - LOGV("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, oret); - return oret; - -error_out: - if (buffer_sharing_state == BUFFER_SHARING_EXECUTING) { - ExitBufferSharingMode(); - } - mix_params_unref(mvp); - mix_videoconfigparams_unref(vcp); - mix_displayandroid_unref(display); - mix_videoinitparams_unref(vip); - mix_video_unref(mix); - - - if (temp_coded_data_buffer != NULL) { - delete [] temp_coded_data_buffer; - temp_coded_data_buffer = NULL; - } - - return OMX_ErrorUndefined; -} - -OMX_ERRORTYPE MrstPsbComponent::ProcessorDeinit(void) -{ - OMX_ERRORTYPE oret = OMX_ErrorNone; - MIX_RESULT mret; - - LOGV("%s(): enter\n", __func__); - if (buffer_sharing_state == BUFFER_SHARING_EXECUTING) { - oret = ExitBufferSharingMode(); - if (oret != OMX_ErrorNone) { - LOGE("%s(),%d: ExitShareBufferingMode failed", __func__, __LINE__); - } - } - - mix_video_eos(mix); - mix_video_flush(mix); - - mix_params_unref(mvp); - mix_videoconfigparams_unref(vcp); - mix_displayandroid_unref(display); - mix_videoinitparams_unref(vip); - - if (mixbuffer_in[0]) { - mix_video_release_mixbuffer(mix, mixbuffer_in[0]); - mixbuffer_in[0] = NULL; - } - - mix_video_deinitialize(mix); - mix_video_unref(mix); - - //delete temp coded buffer - if (temp_coded_data_buffer != NULL) { - delete [] temp_coded_data_buffer; - temp_coded_data_buffer = NULL; - } - - LOGV("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, oret); - return oret; -} - -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__); - - ports[INPORT_INDEX]->ReturnAllRetainedBuffers(); - - 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; -} -bool MrstPsbComponent::DetectSyncFrame(OMX_U8* vop) -{ - M4vVopType voptype= static_cast<M4vVopType>(vop[4] & M4V_VOP_TYPE_MASK); - return ( voptype == I_FRAME ); -} -OMX_ERRORTYPE MrstPsbComponent::ParserConfigData(OMX_U8* coded_buf, OMX_U32 coded_len, - OMX_U8** config_buf, OMX_U32* config_len) -{ - - if(coded_buf == NULL || coded_len < 4) { - LOGE("%s,failed Wrong data ",__func__); - return OMX_ErrorUndefined; // we won't proceed this not vop - } - OMX_U32 count = 0; - OMX_U32 i = 0; - OMX_U8* buf_in = coded_buf; - *config_buf = NULL; - *config_len = 0; - - while (i < coded_len) - { - if ((count > 1) && (buf_in[0] == 0x01) && (buf_in[1] == 0xB6)) //vop start code - { - i += 2; - break; - } - - if (*buf_in++) - count = 0; - else - count++; - i++; - } - if( i == coded_len) { - LOGE("%s failed didn't find vop start code",__func__); - return OMX_ErrorUndefined; //didn't find vop start code - } - //we need VOL header as codec config data not including 00 00 01 B6 - *config_buf = coded_buf; - *config_len = i - 4; - - return OMX_ErrorNone; -} - -/* implement ComponentBase::ProcessorProcess */ -OMX_ERRORTYPE MrstPsbComponent::ProcessorProcess( - OMX_BUFFERHEADERTYPE ***pBuffers, - buffer_retain_t *retain, - OMX_U32 nr_buffers) -{ - MixIOVec buffer_in, buffer_out; - OMX_U32 outfilledlen = 0; - OMX_S64 outtimestamp = 0; - OMX_U32 outflags = 0; - OMX_ERRORTYPE oret = OMX_ErrorNone; - MIX_RESULT mret; - - OMX_U8* config_data = NULL; - OMX_U32 config_len = 0; - - LOGV("%s(): enter encode\n", __func__); - - LOGV_IF((*pBuffers[INPORT_INDEX])->nFlags & OMX_BUFFERFLAG_EOS, - "%s(),%d: got OMX_BUFFERFLAG_EOS\n", __func__, __LINE__); - - if (!(*pBuffers[INPORT_INDEX])->nFilledLen) { - LOGV("%s(),%d: input buffer's nFilledLen is zero\n", - __func__, __LINE__); - goto out; - } - - if (buffer_sharing_state != BUFFER_SHARING_INVALID) { - buffer_in.data_size = buffer_sharing_info[0].dataSize; - buffer_in.buffer_size = buffer_sharing_info[0].allocatedSize; - buffer_in.data = *(reinterpret_cast<uchar**>((*pBuffers[INPORT_INDEX])->pBuffer + (*pBuffers[INPORT_INDEX])->nOffset)); - } else { - buffer_in.data = (*pBuffers[INPORT_INDEX])->pBuffer + (*pBuffers[INPORT_INDEX])->nOffset; - buffer_in.data_size = (*pBuffers[INPORT_INDEX])->nFilledLen; - buffer_in.buffer_size = (*pBuffers[INPORT_INDEX])->nFilledLen; - } - - LOGV("buffer_in.data=%x, data_size=%d, buffer_size=%d", - (unsigned)buffer_in.data, buffer_in.data_size, buffer_in.buffer_size); - - buffer_out.data = (*pBuffers[OUTPORT_INDEX])->pBuffer + (*pBuffers[OUTPORT_INDEX])->nOffset; - buffer_out.data_size = 0; - buffer_out.buffer_size = (*pBuffers[OUTPORT_INDEX])->nAllocLen - (*pBuffers[OUTPORT_INDEX])->nOffset; - mixiovec_out[0] = &buffer_out; - -nomal_start: - - /* get MixBuffer */ - mret = mix_video_get_mixbuffer(mix, &mixbuffer_in[0]); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), %d: exit, mix_video_get_mixbuffer failed (ret:0x%08x)", - __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - goto out; - } - - /* fill MixBuffer */ - mret = mix_buffer_set_data(mixbuffer_in[0], - buffer_in.data, buffer_in.data_size, - (ulong)this, M4vEncMixBufferCallback); - - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), %d: exit, mix_buffer_set_data failed (ret:0x%08x)", - __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - goto out; - } - - if (video_len == 0) { - - LOGV("begin to call mix_video_encode()"); - mret = mix_video_encode(mix, mixbuffer_in, 1, mixiovec_out, 1, - MIX_VIDEOENCODEPARAMS(mvp)); - - LOGV("%s(), mret = 0x%08x", __func__, mret); - LOGV("output data size = %d", mixiovec_out[0]->data_size); - - outtimestamp = (*pBuffers[INPORT_INDEX])->nTimeStamp; - - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), %d: exit, mix_video_encode failed (ret == 0x%08x)\n", - __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - goto out; - } - - if (mixiovec_out[0]-> data_size== 0) { - retain[OUTPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; - retain[INPORT_INDEX] = BUFFER_RETAIN_ACCUMULATE; - goto out; - } - - oret = ParserConfigData(mixiovec_out[0]->data,mixiovec_out[0]->data_size,&config_data, &config_len); - video_data = mixiovec_out[0]->data; - video_len = mixiovec_out[0]->data_size; - if(OMX_ErrorNone != oret) - { - LOGE("%s(), %d: exit, ParserConfigData() failed (ret == 0x%08x)\n",__func__, __LINE__, oret); - goto out; - } - } - - if(config_len != 0) { - //config data needs to be sent completely in a ProcessorProcess() cycle - if(!b_config_sent) { - outfilledlen = config_len; - outflags |= OMX_BUFFERFLAG_CODECCONFIG; - b_config_sent = true; - if(config_data == NULL) { - LOGE("%s()exit config_data is NULL.",__func__); - oret = OMX_ErrorUndefined; - goto out; - } - if((*pBuffers[OUTPORT_INDEX])->pBuffer + (*pBuffers[OUTPORT_INDEX])->nOffset != config_data) { - memcpy((*pBuffers[OUTPORT_INDEX])->pBuffer+(*pBuffers[OUTPORT_INDEX])->nOffset,config_data,config_len); - } - } - else { - //stagefright only accept the first set of config data, hence discard following ones - outfilledlen = 0; - } - //separate vol data from frame - video_len = mixiovec_out[0]->data_size - config_len; - if(video_len > temp_coded_data_buffer_size) { - LOGE("temp_coded_data_buffer_size is too small %s",__LINE__); - return OMX_ErrorUndefined; - } - memcpy(temp_coded_data_buffer,mixiovec_out[0]->data + config_len,video_len); - video_data = temp_coded_data_buffer; - outflags |= OMX_BUFFERFLAG_ENDOFFRAME; - } - else { - outfilledlen = video_len; - if(DetectSyncFrame(video_data)) { - outflags |= OMX_BUFFERFLAG_SYNCFRAME; - } - if((*pBuffers[OUTPORT_INDEX])->pBuffer + (*pBuffers[OUTPORT_INDEX])->nOffset != video_data) { - memcpy((*pBuffers[OUTPORT_INDEX])->pBuffer+(*pBuffers[OUTPORT_INDEX])->nOffset,video_data,video_len); - } - video_data = NULL; - video_len = 0; - - outflags |= OMX_BUFFERFLAG_ENDOFFRAME; - } - - if( outfilledlen > 0 ) { - retain[OUTPORT_INDEX] = BUFFER_RETAIN_NOT_RETAIN; - } - else { - retain[OUTPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; - } - - if (video_len == 0) { - retain[INPORT_INDEX] = BUFFER_RETAIN_ACCUMULATE; //release by callback - } else { - retain[INPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; //get again - } - -#if SHOW_FPS - { - struct timeval t; - OMX_TICKS current_ts, interval_ts; - float current_fps, average_fps; - - t.tv_sec = t.tv_usec = 0; - gettimeofday(&t, NULL); - - current_ts = - (nsecs_t)t.tv_sec * 1000000000 + (nsecs_t)t.tv_usec * 1000; - interval_ts = current_ts - last_ts; - last_ts = current_ts; - - current_fps = (float)1000000000 / (float)interval_ts; - average_fps = (current_fps + last_fps) / 2; - last_fps = current_fps; - - LOGV("FPS = %2.1f\n", average_fps); - } -#endif - -out: - if (mixbuffer_in[0]) { - mix_video_release_mixbuffer(mix, mixbuffer_in[0]); - mixbuffer_in[0] = NULL; - } - - if(retain[OUTPORT_INDEX] != BUFFER_RETAIN_GETAGAIN) { - (*pBuffers[OUTPORT_INDEX])->nFilledLen = outfilledlen; - (*pBuffers[OUTPORT_INDEX])->nTimeStamp = outtimestamp; - (*pBuffers[OUTPORT_INDEX])->nFlags = outflags; - } - - if (retain[INPORT_INDEX] == BUFFER_RETAIN_NOT_RETAIN || - retain[INPORT_INDEX] == BUFFER_RETAIN_ACCUMULATE ) { - inframe_counter++; - } - - if (retain[OUTPORT_INDEX] == BUFFER_RETAIN_NOT_RETAIN) - outframe_counter++; - - LOGV_IF(oret == OMX_ErrorNone, - "%s(),%d: exit, encode is done\n", __func__, __LINE__); - - return oret; -} - -OMX_ERRORTYPE MrstPsbComponent::__Mpeg4ChangeVcpWithPortParam( - MixVideoConfigParams *vcp, PortMpeg4 *port, bool *vcp_changed) -{ - OMX_ERRORTYPE ret = OMX_ErrorNone; - MixVideoConfigParamsEnc *config = MIX_VIDEOCONFIGPARAMSENC(vcp); - mix_videoconfigparamsenc_set_encode_format(config, MIX_ENCODE_TARGET_FORMAT_MPEG4); - mix_videoconfigparamsenc_set_profile(config, MIX_PROFILE_MPEG4SIMPLE); - mix_videoconfigparamsenc_set_mime_type(config, "video/mpeg"); - mix_videoconfigparamsenc_mpeg4_set_dlk(MIX_VIDEOCONFIGPARAMSENC_MPEG4(config), FALSE); - return ret; -} - -OMX_ERRORTYPE MrstPsbComponent::ChangeVcpWithPortParam( - MixVideoConfigParams *vcp, - PortVideo *port, - bool *vcp_changed) -{ - const OMX_PARAM_PORTDEFINITIONTYPE *pd = port->GetPortDefinition(); - OMX_ERRORTYPE ret; - - ret = __Mpeg4ChangeVcpWithPortParam(vcp,static_cast<PortMpeg4 *>(port), vcp_changed); - - /* encoder */ - MixVideoConfigParamsEnc *config = MIX_VIDEOCONFIGPARAMSENC(vcp); - const OMX_VIDEO_PARAM_BITRATETYPE *bitrate = - port->GetPortBitrateParam(); - OMX_VIDEO_CONTROLRATETYPE controlrate; - - if ((config->picture_width != pd->format.video.nFrameWidth) || - (config->picture_height != pd->format.video.nFrameHeight)) { - LOGV("%s(): width : %d != %ld", __func__, - config->picture_width, pd->format.video.nFrameWidth); - LOGV("%s(): height : %d != %ld", __func__, - config->picture_height, pd->format.video.nFrameHeight); - - mix_videoconfigparamsenc_set_picture_res(config, - pd->format.video.nFrameWidth, - pd->format.video.nFrameHeight); - if (vcp_changed) - *vcp_changed = true; - } - - PortVideo *input_port = static_cast<PortVideo*>(ports[INPORT_INDEX]); - const OMX_PARAM_PORTDEFINITIONTYPE *input_pd = input_port->GetPortDefinition(); - - if (config->frame_rate_num != (input_pd->format.video.xFramerate >> 16)) { - LOGV("%s(): framerate : %u != %ld", __func__, - config->frame_rate_num, input_pd->format.video.xFramerate >> 16); - - mix_videoconfigparamsenc_set_frame_rate(config, - input_pd->format.video.xFramerate >> 16, - 1); - - if (vcp_changed) - *vcp_changed = true; - } - - if(mpeg4EncPFrames == 0 && mpeg4EncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - mpeg4EncPFrames = config->frame_rate_num / 2; - } - - LOGV("%s() : mpeg4EncPFrames = %d", __func__, mpeg4EncPFrames); - mix_videoconfigparamsenc_set_intra_period(config, mpeg4EncPFrames); - - if (mpeg4EncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - - LOGV("%s(), eControlRate == OMX_Video_Intel_ControlRateMax", __func__); - - if (config->bitrate != bitrate->nTargetBitrate) { - LOGV("%s(): bitrate : %d != %ld", __func__, - config->bitrate, bitrate->nTargetBitrate); - - mix_videoconfigparamsenc_set_bit_rate(config, - bitrate->nTargetBitrate); - - if (vcp_changed) - *vcp_changed = true; - } - - if (config->rate_control == MIX_RATE_CONTROL_CBR) - controlrate = OMX_Video_ControlRateConstant; - else if (config->rate_control == MIX_RATE_CONTROL_VBR) - controlrate = OMX_Video_ControlRateVariable; - else - controlrate = OMX_Video_ControlRateDisable; - - if (controlrate != bitrate->eControlRate) { - LOGV("%s(): ratecontrol : %d != %d", __func__, - controlrate, bitrate->eControlRate); - - if ((bitrate->eControlRate == OMX_Video_ControlRateVariable) || - (bitrate->eControlRate == - OMX_Video_ControlRateVariableSkipFrames)) - config->rate_control = MIX_RATE_CONTROL_VBR; - else if ((bitrate->eControlRate == - OMX_Video_ControlRateConstant) || - (bitrate->eControlRate == - OMX_Video_ControlRateConstantSkipFrames)) - config->rate_control = MIX_RATE_CONTROL_CBR; - else - config->rate_control = MIX_RATE_CONTROL_NONE; - - if (vcp_changed) - *vcp_changed = true; - } - - /* hard coding */ - mix_videoconfigparamsenc_set_raw_format(config, - MIX_RAW_TARGET_FORMAT_NV12); - mix_videoconfigparamsenc_set_init_qp(config, 6); - mix_videoconfigparamsenc_set_min_qp(config, 1); - mix_videoconfigparamsenc_set_buffer_pool_size(config, 8); - mix_videoconfigparamsenc_set_drawable(config, 0x0); - mix_videoconfigparamsenc_set_need_display(config, FALSE); - } - - return ret; -} -/* end of vcp setting helpers */ - -/* share buffer setting */ -OMX_ERRORTYPE MrstPsbComponent::RequestToEnableBufferSharingMode() -{ - BufferShareStatus bsret; - - if (buffer_sharing_state != BUFFER_SHARING_INVALID) { - LOGE("%s(),%d: invoke %s failed (incorrect state).", __func__, __LINE__, __func__); - return OMX_ErrorUndefined; - } - - buffer_sharing_count = 7; - buffer_sharing_info = NULL; - buffer_sharing_lib = BufferShareRegistry::getInstance(); - - bsret = buffer_sharing_lib->encoderRequestToEnableSharingMode(); - if (bsret != BS_SUCCESS) { - LOGE("%s(),%d: encoder request to enable buffer sharing mode failed:%d", __func__, __LINE__, bsret); - return OMX_ErrorUndefined; - } - - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstPsbComponent::CheckAndEnableBufferSharingMode() -{ - BufferShareStatus bsret; - - if (buffer_sharing_state != BUFFER_SHARING_INVALID) { - LOGE("%s(),%d: invoke %s failed (incorrect state).", __func__, __LINE__, __func__); - return OMX_ErrorUndefined; - } - - if (buffer_sharing_lib->isBufferSharingModeEnabled()) { - LOGW("Buffer sharing is enabled (video source does support)"); - buffer_sharing_state = BUFFER_SHARING_LOADED; - } else { - LOGW("Buffer sharing is disabled (video source doesn't support)"); - } - - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstPsbComponent::RequestToDisableBufferSharingMode() -{ - BufferShareStatus bsret; - - if ((buffer_sharing_state != BUFFER_SHARING_INVALID) && - (buffer_sharing_state != BUFFER_SHARING_LOADED)) { - LOGE("%s(),%d: invoke %s failed (incorrect state).", __func__, __LINE__, __func__); - return OMX_ErrorUndefined; - } - - if (buffer_sharing_state == BUFFER_SHARING_INVALID) { - LOGW("%s(),%d: buffer sharing already in invalid state.", __func__, __LINE__); - return OMX_ErrorNone; - } - - if (buffer_sharing_info) { - delete [] buffer_sharing_info; - } - buffer_sharing_info = NULL; - - bsret = buffer_sharing_lib->encoderRequestToDisableSharingMode(); - if (bsret != BS_SUCCESS) { - LOGE("%s(),%d: request to disable sharing mode failed.", __func__, __LINE__); - return OMX_ErrorUndefined; - } - - buffer_sharing_state = BUFFER_SHARING_INVALID; - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstPsbComponent::RequestShareBuffers(MixVideo* mix, int width, int height) -{ - int i; - int buf_width, buf_height, buf_size; - MIX_RESULT mret; - bool is_request_ok = true; - - if (width <= 0 || height <= 0) { - LOGE("%s(),%d: width and height incorrect", __func__, __LINE__); - return OMX_ErrorUndefined; - } - - if ((buffer_sharing_state != BUFFER_SHARING_INVALID) && - (buffer_sharing_state != BUFFER_SHARING_LOADED)) { - LOGE("%s(),%d: invoke %s failed (incorrect state:%d).", __func__, __LINE__, __func__, buffer_sharing_state); - return OMX_ErrorUndefined; - } - - if (buffer_sharing_state == BUFFER_SHARING_INVALID) { - LOGW("%s(),%d: buffer sharing not enabled, do nothing.", __func__, __LINE__); - return OMX_ErrorNone; - } - - if (buffer_sharing_info != NULL) { - delete [] buffer_sharing_info; - buffer_sharing_info = NULL; - } - - buffer_sharing_info = new SharedBufferType[buffer_sharing_count]; - //query mix for share buffer info. - for (i = 0; i < buffer_sharing_count; i++) { - buf_width = width; - buf_height = height; - buf_size = SHARE_PTR_ALIGN(buf_width) * buf_height * 3 / 2; - mret = mix_video_get_new_userptr_for_surface_buffer(mix, - (uint)buf_width, - (uint)buf_height, - MIX_STRING_TO_FOURCC("NV12"), - (uint)buf_size, - (uint*)&buffer_sharing_info[i].allocatedSize, - (uint*)&buffer_sharing_info[i].stride, - (uint8**)&buffer_sharing_info[i].pointer); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(),%d: mix_video_get_new_userptr_for_surface_buffer failed", __func__, __LINE__); - is_request_ok = false; - break; - } - buffer_sharing_info[i].width = buf_width; - buffer_sharing_info[i].height = buf_height; - buffer_sharing_info[i].dataSize = buffer_sharing_info[i].stride * buf_height * 3 / 2; - - LOGD("width:%d, Height:%d, stride:%d, pointer:%p", buffer_sharing_info[i].width, - buffer_sharing_info[i].height, buffer_sharing_info[i].stride, - buffer_sharing_info[i].pointer); - } - - if (!is_request_ok) { - delete []buffer_sharing_info; - buffer_sharing_info = NULL; - LOGE("%s(),%d: %s failed", __func__, __LINE__,"get usr ptr for surface buffer"); - return OMX_ErrorUndefined; - } - - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstPsbComponent::RegisterShareBuffersToLib() -{ - if ((buffer_sharing_state != BUFFER_SHARING_INVALID) && - (buffer_sharing_state != BUFFER_SHARING_LOADED)) { - LOGE("%s(),%d: invoke %s failed (incorrect state).", __func__, __LINE__, __func__); - return OMX_ErrorUndefined; - } - - if (buffer_sharing_state == BUFFER_SHARING_INVALID) { - LOGW("%s(),%d: buffer sharing not enabled, do nothing.", __func__, __LINE__); - return OMX_ErrorNone; - } - - BufferShareStatus bsret = buffer_sharing_lib->encoderSetSharedBuffer(buffer_sharing_info, buffer_sharing_count); - if (bsret != BS_SUCCESS) { - LOGE("%s(),%d: encoder set shared buffer failed", __func__, __LINE__); - return OMX_ErrorUndefined; - } - - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstPsbComponent::RegisterShareBuffersToPort() -{ - if ((buffer_sharing_state != BUFFER_SHARING_INVALID) && - (buffer_sharing_state != BUFFER_SHARING_LOADED)) { - LOGE("%s(),%d: invoke %s failed (incorrect state).", __func__, __LINE__, __func__); - return OMX_ErrorUndefined; - } - - OMX_VIDEO_CONFIG_PRI_INFOTYPE privateinfoparam; - memset(&privateinfoparam, 0, sizeof(privateinfoparam)); - SetTypeHeader(&privateinfoparam, sizeof(privateinfoparam)); - - //caution: buffer-sharing info stored in INPORT (raw port) - privateinfoparam.nPortIndex = INPORT_INDEX; - if (buffer_sharing_state == BUFFER_SHARING_INVALID) { - privateinfoparam.nCapacity = 0; - privateinfoparam.nHolder = NULL; - } else { - privateinfoparam.nCapacity = buffer_sharing_count; - privateinfoparam.nHolder = buffer_sharing_info; - } - OMX_ERRORTYPE ret = static_cast<PortVideo*>(ports[privateinfoparam.nPortIndex])->SetPortPrivateInfoParam(&privateinfoparam, false); - - return ret; -} - -OMX_ERRORTYPE MrstPsbComponent::EnterBufferSharingMode() -{ - if ((buffer_sharing_state != BUFFER_SHARING_INVALID) && - (buffer_sharing_state != BUFFER_SHARING_LOADED)) { - LOGE("%s(),%d: invoke %s failed (incorrect state).", __func__, __LINE__, __func__); - return OMX_ErrorUndefined; - } - - if (buffer_sharing_state == BUFFER_SHARING_INVALID) { - LOGW("%s(),%d: buffer sharing not enabled, do nothing.", __func__, __LINE__); - return OMX_ErrorNone; - } - - BufferShareStatus bsret = buffer_sharing_lib->encoderEnterSharingMode(); - if (bsret != BS_SUCCESS) { - LOGE("%s(),%d: encoderEnterSharingMode failed", __func__, __LINE__); - if (bsret == BS_PEER_DOWN) { - LOGE("%s(), %d: camera down during buffer sharing state transition.",__func__, __LINE__); - } - return OMX_ErrorUndefined; - } - - buffer_sharing_state = BUFFER_SHARING_EXECUTING; - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstPsbComponent::ExitBufferSharingMode() -{ - if ((buffer_sharing_state != BUFFER_SHARING_INVALID) && - (buffer_sharing_state != BUFFER_SHARING_EXECUTING)) { - LOGE("%s(),%d: invoke %s failed (incorrect state).", __func__, __LINE__, __func__); - return OMX_ErrorUndefined; - } - - if (buffer_sharing_state == BUFFER_SHARING_INVALID) { - LOGW("%s(),%d: buffer sharing not enabled, do nothing.", __func__, __LINE__); - return OMX_ErrorNone; - } - - BufferShareStatus bsret = buffer_sharing_lib->encoderExitSharingMode(); - if (bsret != BS_SUCCESS) { - LOGE("%s(),%d: encoderEnterSharingMode failed", __func__, __LINE__); - if (bsret == BS_PEER_DOWN) { - LOGE("%s(), %d: camera down during buffer sharing state transition.",__func__, __LINE__); - } - return OMX_ErrorUndefined; - } - - buffer_sharing_state = BUFFER_SHARING_LOADED; - return OMX_ErrorNone; -} -/* end of share buffer setting */ - -OMX_ERRORTYPE MrstPsbComponent::ProcessorFlush(OMX_U32 port_index) { - - LOGV("port_index = %d Flushed!\n", port_index); - - if (port_index == INPORT_INDEX || port_index == OMX_ALL) { - ports[INPORT_INDEX]->ReturnAllRetainedBuffers(); - mix_video_flush( mix); - } - return OMX_ErrorNone; -} - -void MrstPsbComponent::M4vEncMixBufferCallback(ulong token, uchar *data) { - MrstPsbComponent *_this = (MrstPsbComponent *) token; - - LOGV("M4vEncMixBufferCallback Begin\n"); - if(_this) { - _this->ports[_this->INPORT_INDEX]->ReturnAllRetainedBuffers(); - } - - LOGV("M4vEncMixBufferCallback End\n"); -} - -/* - * CModule Interface - */ -#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) - -static const char *g_name = (const char *)"OMX.Intel.Mrst.PSB.M4V.Enc"; - -static const char *g_roles[] = -{ - (const char *)"video_encoder.mpeg4", -}; - -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/m4v-enc/psb_m4v.h b/m4v-enc/psb_m4v.h deleted file mode 100644 index 3018f3b..0000000 --- a/m4v-enc/psb_m4v.h +++ /dev/null @@ -1,198 +0,0 @@ -/* - * psb.h, omx psb component header - * - * Copyright (c) 2009-2010 Wind River Systems, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#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> - -#include <IntelBufferSharing.h> - -using android::sp; -using android::BufferShareRegistry; - -#define M4V_VOP_TYPE_MASK 0xC0 - -typedef enum _M4vVopType { - I_FRAME = 0x00, - P_FRAME = 0x40, - B_FRAME = 0x80, - S_FRAME = 0xC0, - UNKNOWN_FRAME = 0xFF, -} M4vVopType; - -typedef enum -{ - BUFFER_SHARING_INVALID, - BUFFER_SHARING_LOADED, - BUFFER_SHARING_EXECUTING -} BufferSharingState; - -class MrstPsbComponent : public ComponentBase -{ -public: - /* - * constructor & destructor - */ - MrstPsbComponent(); - ~MrstPsbComponent(); - -private: - /* - * component methods & helpers - */ - /* implement ComponentBase::ComponentAllocatePorts */ - virtual OMX_ERRORTYPE ComponentAllocatePorts(void); - - OMX_ERRORTYPE __AllocateMpeg4Port(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 OMX_ERRORTYPE ProcessorFlush(OMX_U32 port_index); - virtual OMX_ERRORTYPE ProcessorProcess(OMX_BUFFERHEADERTYPE ***pBuffers, - buffer_retain_t *retain, - OMX_U32 nr_buffers); - - /* end of component methods & helpers */ - - /* - * vcp setting helpers - */ - OMX_ERRORTYPE __RawChangePortParamWithVcp(MixVideoConfigParams *vcp, - PortVideo *port); - - OMX_ERRORTYPE __Mpeg4ChangePortParamWithVcp(MixVideoConfigParams *vcp, - PortMpeg4 *port); - OMX_ERRORTYPE ChangePortParamWithVcp(void); - - OMX_ERRORTYPE __Mpeg4ChangeVcpWithPortParam(MixVideoConfigParams *vcp, - PortMpeg4 *port, bool *vcp_changed); - - OMX_ERRORTYPE ChangeVcpWithPortParam(MixVideoConfigParams *vcp, - PortVideo *port, bool *vcp_changed); - - static void M4vEncMixBufferCallback(ulong token, uchar *data); - - inline bool DetectSyncFrame(OMX_U8* vop); - - OMX_ERRORTYPE ParserConfigData(OMX_U8* coded_buf, OMX_U32 coded_len,OMX_U8** config_buf, OMX_U32* config_len); - - /* end of vcp setting helpers */ - /* share buffer setting */ - OMX_ERRORTYPE EnterBufferSharingMode(void); - OMX_ERRORTYPE ExitBufferSharingMode(void); - OMX_ERRORTYPE RequestToEnableBufferSharingMode(void); - OMX_ERRORTYPE RequestToDisableBufferSharingMode(void); - OMX_ERRORTYPE CheckAndEnableBufferSharingMode(void); - OMX_ERRORTYPE RequestShareBuffers(MixVideo* mix, int width, int height); - OMX_ERRORTYPE RegisterShareBuffersToPort(void); - OMX_ERRORTYPE RegisterShareBuffersToLib(void); - /* end of share buffer setting */ - - /* mix video */ - MixVideo *mix; - MixVideoInitParams *vip; - MixParams *mvp; - MixVideoConfigParams *vcp; - MixDisplayAndroid *display; - MixBuffer *mixbuffer_in[1]; - MixIOVec *mixiovec_out[1]; - - OMX_BOOL is_mixvideodec_configured; - OMX_U32 inframe_counter; - OMX_U32 outframe_counter; - - /* for fps */ - OMX_TICKS last_ts; - float last_fps; - - /* for buffer sharing */ - sp<BufferShareRegistry> buffer_sharing_lib; - int buffer_sharing_count; - SharedBufferType* buffer_sharing_info; - BufferSharingState buffer_sharing_state; - - - bool b_config_sent; - OMX_U8* video_data; - OMX_U32 video_len; - OMX_U8 *temp_coded_data_buffer; - OMX_U32 temp_coded_data_buffer_size; - - OMX_U32 mpeg4EncPFrames; - - OMX_VIDEO_PARAM_INTEL_BITRATETYPE mpeg4EncParamIntelBitrateType; - OMX_VIDEO_CONFIG_INTEL_BITRATETYPE mpeg4EncConfigIntelBitrateType; - - OMX_VIDEO_CONFIG_INTEL_AIR mpeg4EncConfigAir; - OMX_CONFIG_FRAMERATETYPE mpeg4EncFramerate; - - /* constant */ - /* ports */ - const static OMX_U32 NR_PORTS = 2; - const static OMX_U32 INPORT_INDEX = 0; - const static OMX_U32 OUTPORT_INDEX = 1; - - /* default buffer */ - const static OMX_U32 INPORT_RAW_ACTUAL_BUFFER_COUNT = 2;//FIXME: must be set to 2 - const static OMX_U32 INPORT_RAW_MIN_BUFFER_COUNT = 1; - const static OMX_U32 INPORT_RAW_BUFFER_SIZE = 614400; - 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 = 38016; - - const static OMX_U32 INPORT_MPEG4_ACTUAL_BUFFER_COUNT = 10; - const static OMX_U32 INPORT_MPEG4_MIN_BUFFER_COUNT = 1; - - const static OMX_U32 INPORT_MPEG4_BUFFER_SIZE = 614400; - const static OMX_U32 OUTPORT_MPEG4_ACTUAL_BUFFER_COUNT = 2; - const static OMX_U32 OUTPORT_MPEG4_MIN_BUFFER_COUNT = 1; - const static OMX_U32 OUTPORT_MPEG4_BUFFER_SIZE = 307200; - - -}; - -#endif /* __WRS_OMXIL_INTEL_MRST_PSB */ diff --git a/m4v-enc/vabuffer.h b/m4v-enc/vabuffer.h deleted file mode 100644 index e81b195..0000000 --- a/m4v-enc/vabuffer.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * vabuffer.h, vabuffer structure header - * - * Copyright (c) 2009-2010 Wind River Systems, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#ifndef __VA_BUFFER_H__ -#define __VA_BUFFER_H__ - -struct VABuffer -{ - VASurfaceID surface; - VADisplay display; - unsigned int frame_structure; -}; - -#endif /* __VA_BUFFER_H__ */ - diff --git a/psb-dec/Android.mk b/psb-dec/Android.mk deleted file mode 100644 index 8eb606e..0000000 --- a/psb-dec/Android.mk +++ /dev/null @@ -1,50 +0,0 @@ -ifeq ($(strip $(BOARD_USES_WRS_OMXIL_CORE)),true) -LOCAL_PATH := $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := \ - psb.cpp \ - h263.cpp - -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE := libwrs_omxil_intel_mrst_psb_dec - -LOCAL_CPPFLAGS := -DMIXVIDEO_ENCODE_ENABLE=0 - -LOCAL_LDFLAGS := - -LOCAL_SHARED_LIBRARIES := \ - libwrs_omxil_common \ - liblog \ - libmixcommon \ - libmixvideo \ - libmixvbp \ - libva \ - libva-android \ - libva-tpi - - -VENDORS_INTEL_MRST_MIXVBP_ROOT := $(VENDORS_INTEL_MRST_LIBMIX_ROOT)/mix_vbp - -LOCAL_C_INCLUDES := \ - $(TARGET_OUT_HEADERS)/wrs_omxil_core \ - $(TARGET_OUT_HEADERS)/khronos/openmax \ - $(PV_INCLUDES) \ - $(TARGET_OUT_HEADERS)/libmixcommon \ - $(TARGET_OUT_HEADERS)/libmixvideo \ - $(TARGET_OUT_HEADERS)/libva \ - $(TARGET_OUT_HEADERS)/libdrm \ - $(TARGET_OUT_HEADERS)/libdrm/shared-core \ - $(TARGET_OUT_HEADERS)/libmixvbp \ - $(TARGET_OUT_HEADERS)/libpsb_drm - -ifeq ($(strip $(COMPONENT_SUPPORT_OPENCORE)),true) -LOCAL_CFLAGS += -DCOMPONENT_SUPPORT_OPENCORE -endif - - -LOCAL_COPY_HEADERS_TO := libwrs_omxil_intel_mrst_psb_dec -LOCAL_COPY_HEADERS := vabuffer.h - -include $(BUILD_SHARED_LIBRARY) -endif diff --git a/psb-dec/ebuild.mk b/psb-dec/ebuild.mk deleted file mode 100644 index 06a4106..0000000 --- a/psb-dec/ebuild.mk +++ /dev/null @@ -1,21 +0,0 @@ -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-dec/h263.cpp b/psb-dec/h263.cpp deleted file mode 100644 index a6982fc..0000000 --- a/psb-dec/h263.cpp +++ /dev/null @@ -1,283 +0,0 @@ -/* ------------------------------------------------------------------ - * Copyright (C) 1998-2009 PacketVideo - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. - * See the License for the specific language governing permissions - * and limitations under the License. - * ------------------------------------------------------------------- - */ -/* - * Portions Copyright 2011, Intel Corportion - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include <sys/time.h> -#include <OMX_Core.h> - -// #define LOG_NDEBUG 0 - -#define LOG_TAG "mrst_h263" -#include <utils/Log.h> - -//#include "oscl_base.h" -//#include "oscl_types.h" - -#include "h263.h" - -OMX_BOOL H263HeaderParser::DecodeH263Header(OMX_U8* aInputBuffer, int32 *width, - int32 *height, int32 *display_width, int32 *display_height) { - uint32 codeword; - int32 extended_PTYPE = 0; - int32 UFEP = 0; - int32 custom_PFMT = 0; - - //Reset the data bit position to the start of the stream - iH263DataBitPos = 0; - iH263BitPos = 0; - //BitBuf contains the first 4 bytes of the aInputBuffer - iH263BitBuf = (aInputBuffer[0] << 24) | (aInputBuffer[1] << 16) | (aInputBuffer[2] << 8) | aInputBuffer[3]; - - ReadBits(aInputBuffer, 22, &codeword); - if (codeword != 0x20) - { - return OMX_FALSE; - } - - ReadBits(aInputBuffer, 8, &codeword); - - ReadBits(aInputBuffer, 1, &codeword); - if (codeword == 0) return OMX_FALSE; - - ReadBits(aInputBuffer, 1, &codeword); - if (codeword == 1) return OMX_FALSE; - - ReadBits(aInputBuffer, 1, &codeword); - if (codeword == 1){ - LOGW("split_screen_indicator don't support!"); - } - - ReadBits(aInputBuffer, 1, &codeword); - if (codeword == 1) { - LOGW("document_freeze_camera don't support!"); - } - - ReadBits(aInputBuffer, 1, &codeword); - if (codeword == 1) { - LOGW("freeze_picture_release don't support!"); - } - - /* source format */ - ReadBits(aInputBuffer, 3, &codeword); - switch (codeword) - { - case 1: - *width = 128; - *height = 96; - break; - - case 2: - *width = 176; - *height = 144; - break; - - case 3: - *width = 352; - *height = 288; - break; - - case 4: - *width = 704; - *height = 576; - break; - - case 5: - *width = 1408; - *height = 1152; - break; - - case 7: - extended_PTYPE = 1; - break; - default: - /* Msg("H.263 source format not legal\n"); */ - return OMX_FALSE; - } - - if (extended_PTYPE == 0) - { - *display_width = *width; - *display_height = *height; - return OMX_TRUE; - } - - /* source format */ - ReadBits(aInputBuffer, 3, &codeword); - UFEP = codeword; - if (UFEP == 1) - { - ReadBits(aInputBuffer, 3, &codeword); - switch (codeword) - { - case 1: - *width = 128; - *height = 96; - - break; - - case 2: - *width = 176; - *height = 144; - - break; - - case 3: - *width = 352; - *height = 288; - - break; - - case 4: - *width = 704; - *height = 576; - - break; - - case 5: - *width = 1408; - *height = 1152; - - break; - - case 6: - custom_PFMT = 1; - break; - default: - /* Msg("H.263 source format not legal\n"); */ - return OMX_FALSE; - } - if (custom_PFMT == 0) - { - *display_width = *width; - *display_height = *height; - return OMX_TRUE; - } - - - ReadBits(aInputBuffer, 1, &codeword); - ReadBits(aInputBuffer, 1, &codeword); - if (codeword) return OMX_FALSE; - ReadBits(aInputBuffer, 1, &codeword); - if (codeword) return OMX_FALSE; - ReadBits(aInputBuffer, 1, &codeword); - if (codeword) return OMX_FALSE; - ReadBits(aInputBuffer, 3, &codeword); - ReadBits(aInputBuffer, 3, &codeword); - if (codeword) return OMX_FALSE; /* RPS, ISD, AIV */ - ReadBits(aInputBuffer, 1, &codeword); - ReadBits(aInputBuffer, 4, &codeword); - if (codeword != 8) return OMX_FALSE; - } - - if (UFEP == 0 || UFEP == 1) - { - ReadBits(aInputBuffer, 3, &codeword); - if (codeword > 1) return OMX_FALSE; - ReadBits(aInputBuffer, 1, &codeword); - if (codeword) return OMX_FALSE; - ReadBits(aInputBuffer, 1, &codeword); - if (codeword) return OMX_FALSE; - ReadBits(aInputBuffer, 1, &codeword); - ReadBits(aInputBuffer, 3, &codeword); - if (codeword != 1) return OMX_FALSE; - } - else - { - return OMX_FALSE; - } - - ReadBits(aInputBuffer, 1, &codeword); - if (codeword) return OMX_FALSE; /* CPM */ - if (custom_PFMT == 1 && UFEP == 1) - { - OMX_U32 DisplayWidth, Width, DisplayHeight, Height, Resolution; - - ReadBits(aInputBuffer, 4, &codeword); - if (codeword == 0) return OMX_FALSE; - if (codeword == 0xf) - { - ReadBits(aInputBuffer, 8, &codeword); - ReadBits(aInputBuffer, 8, &codeword); - } - ReadBits(aInputBuffer, 9, &codeword); - DisplayWidth = (codeword + 1) << 2; - Width = (DisplayWidth + 15) & -16; - - ReadBits(aInputBuffer, 1, &codeword); - if (codeword != 1) return OMX_FALSE; - ReadBits(aInputBuffer, 9, &codeword); - if (codeword == 0) return OMX_FALSE; - DisplayHeight = codeword << 2; - Height = (DisplayHeight + 15) & -16; - - Resolution = Width * Height; - - *width = Width; - *height = Height; - *display_width = DisplayWidth; - *display_height = DisplayHeight; - } - - return OMX_TRUE; -} - -static const uint32 mask[33] = -{ - 0x00000000, 0x00000001, 0x00000003, 0x00000007, - 0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f, - 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff, - 0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff, - 0x0000ffff, 0x0001ffff, 0x0003ffff, 0x0007ffff, - 0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff, - 0x00ffffff, 0x01ffffff, 0x03ffffff, 0x07ffffff, - 0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff, - 0xffffffff -}; - -void H263HeaderParser::ReadBits(OMX_U8* aStream, /* Input Stream */ - uint8 aNumBits, /* nr of bits to read */ - uint32* aOutData /* output target */ - ) -{ - uint8 *bits; - uint32 dataBitPos = iH263DataBitPos; - uint32 bitPos = iH263BitPos; - uint32 dataBytePos; - - if (aNumBits > (32 - bitPos)) /* not enough bits */ - { - dataBytePos = dataBitPos >> 3; /* Byte Aligned Position */ - bitPos = dataBitPos & 7; /* update bit position */ - bits = &aStream[dataBytePos]; - iH263BitBuf = (bits[0] << 24) | (bits[1] << 16) | (bits[2] << 8) | bits[3]; - } - - iH263DataBitPos += aNumBits; - iH263BitPos = (unsigned char)(bitPos + aNumBits); - - *aOutData = (iH263BitBuf >> (32 - iH263BitPos)) & mask[(uint16)aNumBits]; - - return; -} diff --git a/psb-dec/h263.h b/psb-dec/h263.h deleted file mode 100644 index be2a5af..0000000 --- a/psb-dec/h263.h +++ /dev/null @@ -1,44 +0,0 @@ -/* ------------------------------------------------------------------ - * Copyright (C) 1998-2009 PacketVideo - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. - * See the License for the specific language governing permissions - * and limitations under the License. - * ------------------------------------------------------------------- - */ -/* - * Portions Copyright 2011, Intel Corportion - */ - -#ifndef __OMXIL_INTEL_H263__ -#define __OMXIL_INTEL_H263__ - -typedef int int32; -typedef unsigned int uint32; -typedef unsigned char uint8; -typedef unsigned short uint16; - -class H263HeaderParser { - -private: - OMX_U32 iH263DataBitPos; - OMX_U32 iH263BitPos; - OMX_U32 iH263BitBuf; - -public: - - OMX_BOOL DecodeH263Header(OMX_U8* aInputBuffer, int32 *width, - int32 *height, int32 *display_width, int32 *display_height); - void ReadBits(OMX_U8* aStream, uint8 aNumBits, uint32* aOutData); -}; - -#endif /* __OMXIL_INTEL_H263__ */ diff --git a/psb-dec/psb.cpp b/psb-dec/psb.cpp deleted file mode 100644 index 0712f4c..0000000 --- a/psb-dec/psb.cpp +++ /dev/null @@ -1,3186 +0,0 @@ -/* - * psb.cpp, omx psb component file - * - * Copyright (c) 2009-2010 Wind River Systems, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// #define LOG_NDEBUG 0 - -#define LOG_TAG "mrst_psb" -#include <utils/Log.h> - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include <sys/time.h> - -#include <OMX_Core.h> -#include <OMX_IndexExt.h> -#include <OMX_VideoExt.h> -#include <OMX_IntelErrorTypes.h> - -#include <cmodule.h> -#include <portvideo.h> -#include <componentbase.h> - -#include <mixdisplayandroid.h> -#include <mixvideo.h> -#include <mixvideoconfigparamsdec_h264.h> -#include <mixvideoconfigparamsenc_h264.h> -#include <mixvideoconfigparamsdec_mp42.h> -#include <mixvideoconfigparamsenc_h263.h> - -#ifdef __cplusplus -extern "C" { -#endif - - -#include <va/va.h> - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#include <va/va_android.h> - -#include "h263.h" -#include "psb.h" - -#define Display unsigned int - -#define SHOW_FPS 0 - -#include "vabuffer.h" - -/* - * constructor & destructor - */ -MrstPsbComponent::MrstPsbComponent() -{ - LOGV("%s(): enter\n", __func__); - - LOGV("%s(),%d: exit\n", __func__, __LINE__); -} - -MrstPsbComponent::~MrstPsbComponent() -{ - LOGV("%s(): enter\n", __func__); - - LOGV("%s(),%d: exit\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; - - bool isencoder; - - 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; - - 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; - } - - working_role = strpbrk(working_role, "."); - if (!working_role) - return OMX_ErrorUndefined; - working_role++; - - if (!strcmp(working_role, "avc")) { - ret = __AllocateAvcPort(codec_port_index, codec_port_dir); - coding_type = OMX_VIDEO_CodingAVC; - } - else if (!strcmp(working_role, "mpeg4")) { - ret = __AllocateMpeg4Port(codec_port_index, codec_port_dir); - coding_type = OMX_VIDEO_CodingMPEG4; - } - else if (!strcmp(working_role, "h263")) { - ret = __AllocateH263Port(codec_port_index, codec_port_dir); - coding_type = OMX_VIDEO_CodingH263; - } - else - ret = OMX_ErrorUndefined; - - if (ret != OMX_ErrorNone) - goto free_ports; - - - if(isencoder) { - - LOGV("---- prepare to call __AllocateRawPort() ----\n"); - - ret = __AllocateRawPort(raw_port_index, raw_port_dir); - } else { - - LOGV("---- prepare to call __AllocateRawVAPort() ----\n"); - - ret = __AllocateRawVAPort(raw_port_index, raw_port_dir); - } - if (ret != OMX_ErrorNone) - goto free_codecport; - - codec_mode = isencoder ? MIX_CODEC_MODE_ENCODE : MIX_CODEC_MODE_DECODE; - - /* 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 */ - - /* encoder */ - if (dir == OMX_DirOutput) { - /* OMX_VIDEO_PARAM_BITRATETYPE */ - OMX_VIDEO_PARAM_BITRATETYPE bitrateparam; - - memset(&bitrateparam, 0, sizeof(bitrateparam)); - SetTypeHeader(&bitrateparam, sizeof(bitrateparam)); - - bitrateparam.nPortIndex = port_index; - bitrateparam.eControlRate = OMX_Video_ControlRateConstant; - bitrateparam.nTargetBitrate = 192000; - - avcport->SetPortBitrateParam(&bitrateparam, true); - /* end of OMX_VIDEO_PARAM_BITRATETYPE */ - - /* OMX_VIDEO_CONFIG_PRI_INFOTYPE */ - OMX_VIDEO_CONFIG_PRI_INFOTYPE privateinfoparam; - - memset(&privateinfoparam, 0, sizeof(privateinfoparam)); - SetTypeHeader(&privateinfoparam, sizeof(privateinfoparam)); - - privateinfoparam.nPortIndex = port_index; - privateinfoparam.nCapacity = 0; - privateinfoparam.nHolder = NULL; - - avcport->SetPortPrivateInfoParam(&privateinfoparam, true); - /* end of OMX_VIDEO_CONFIG_PRI_INFOTYPE */ - - avcEncIDRPeriod = 0; - avcEncPFrames = 0; - avcEncNaluFormatType = OMX_NaluFormatZeroByteInterleaveLength; - - avcEncParamIntelBitrateType.nPortIndex = port_index; - avcEncParamIntelBitrateType.eControlRate = OMX_Video_Intel_ControlRateMax; - avcEncParamIntelBitrateType.nTargetBitrate = 0; - SetTypeHeader(&avcEncParamIntelBitrateType, sizeof(avcEncParamIntelBitrateType)); - - avcEncConfigNalSize.nPortIndex = port_index; - avcEncConfigNalSize.nNaluBytes = 0; - SetTypeHeader(&avcEncConfigNalSize, sizeof(avcEncConfigNalSize)); - - avcEncConfigSliceNumbers.nPortIndex = port_index; - avcEncConfigSliceNumbers.nISliceNumber = 1; - avcEncConfigSliceNumbers.nPSliceNumber = 1; - SetTypeHeader(&avcEncConfigSliceNumbers, sizeof(avcEncConfigSliceNumbers)); - - avcEncConfigAir.nPortIndex = port_index; - avcEncConfigAir.bAirEnable = OMX_FALSE; - avcEncConfigAir.bAirAuto = OMX_FALSE; - avcEncConfigAir.nAirMBs = 0; - avcEncConfigAir.nAirThreshold = 0; - SetTypeHeader(&avcEncConfigAir, sizeof(avcEncConfigAir)); - - avcEncFramerate.nPortIndex = port_index; - avcEncFramerate.xEncodeFramerate = 0; // Q16 format - SetTypeHeader(&avcEncFramerate, sizeof(avcEncFramerate)); - - } else { - - avcDecFrameWidth = 0; - avcDecFrameHeight = 0; - memset(&avcDecodeSettings, 0, sizeof(avcDecodeSettings)); - avcDecodeSettings.nMaxNumberOfReferenceFrame = 4; - avcDecGotRes = OMX_FALSE; - - } - - LOGV("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, OMX_ErrorNone); - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstPsbComponent::__AllocateMpeg4Port(OMX_U32 port_index, - OMX_DIRTYPE dir) -{ - PortMpeg4 *mpeg4port; - - OMX_PARAM_PORTDEFINITIONTYPE mpeg4portdefinition; - OMX_VIDEO_PARAM_MPEG4TYPE mpeg4portparam; - - LOGV("%s(): enter\n", __func__); - - ports[port_index] = new PortMpeg4; - if (!ports[port_index]) { - LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, - OMX_ErrorInsufficientResources); - return OMX_ErrorInsufficientResources; - } - - mpeg4port = static_cast<PortMpeg4 *>(this->ports[port_index]); - - /* OMX_PARAM_PORTDEFINITIONTYPE */ - memset(&mpeg4portdefinition, 0, sizeof(mpeg4portdefinition)); - SetTypeHeader(&mpeg4portdefinition, sizeof(mpeg4portdefinition)); - mpeg4portdefinition.nPortIndex = port_index; - mpeg4portdefinition.eDir = dir; - if (dir == OMX_DirInput) { - mpeg4portdefinition.nBufferCountActual = - INPORT_MPEG4_ACTUAL_BUFFER_COUNT; - mpeg4portdefinition.nBufferCountMin = INPORT_MPEG4_MIN_BUFFER_COUNT; - mpeg4portdefinition.nBufferSize = INPORT_MPEG4_BUFFER_SIZE; - } else { - mpeg4portdefinition.nBufferCountActual = - OUTPORT_MPEG4_ACTUAL_BUFFER_COUNT; - mpeg4portdefinition.nBufferCountMin = OUTPORT_MPEG4_MIN_BUFFER_COUNT; - mpeg4portdefinition.nBufferSize = OUTPORT_MPEG4_BUFFER_SIZE; - } - mpeg4portdefinition.bEnabled = OMX_TRUE; - mpeg4portdefinition.bPopulated = OMX_FALSE; - mpeg4portdefinition.eDomain = OMX_PortDomainVideo; - mpeg4portdefinition.format.video.cMIMEType = (OMX_STRING)"video/mpeg4"; - mpeg4portdefinition.format.video.pNativeRender = NULL; - mpeg4portdefinition.format.video.nFrameWidth = 176; - mpeg4portdefinition.format.video.nFrameHeight = 144; - mpeg4portdefinition.format.video.nStride = 0; - mpeg4portdefinition.format.video.nSliceHeight = 0; - mpeg4portdefinition.format.video.nBitrate = 64000; - mpeg4portdefinition.format.video.xFramerate = 15 << 16; - mpeg4portdefinition.format.video.bFlagErrorConcealment = OMX_FALSE; - mpeg4portdefinition.format.video.eCompressionFormat = - OMX_VIDEO_CodingMPEG4; - mpeg4portdefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused; - mpeg4portdefinition.format.video.pNativeWindow = NULL; - mpeg4portdefinition.bBuffersContiguous = OMX_FALSE; - mpeg4portdefinition.nBufferAlignment = 0; - - mpeg4port->SetPortDefinition(&mpeg4portdefinition, true); - - /* end of OMX_PARAM_PORTDEFINITIONTYPE */ - - /* OMX_VIDEO_PARAM_MPEG4TYPE */ - memset(&mpeg4portparam, 0, sizeof(mpeg4portparam)); - SetTypeHeader(&mpeg4portparam, sizeof(mpeg4portparam)); - mpeg4portparam.nPortIndex = port_index; - mpeg4portparam.eProfile = OMX_VIDEO_MPEG4ProfileSimple; - mpeg4portparam.eLevel = OMX_VIDEO_MPEG4Level3; - - mpeg4port->SetPortMpeg4Param(&mpeg4portparam, true); - /* end of OMX_VIDEO_PARAM_MPEG4TYPE */ - - LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, OMX_ErrorNone); - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstPsbComponent::__AllocateH263Port(OMX_U32 port_index, OMX_DIRTYPE dir) { - - PortH263 *h263port; - - OMX_PARAM_PORTDEFINITIONTYPE h263portdefinition; - OMX_VIDEO_PARAM_H263TYPE h263portparam; - - LOGV("%s(): enter\n", __func__); - - ports[port_index] = new PortH263; - if (!ports[port_index]) { - LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, - OMX_ErrorInsufficientResources); - return OMX_ErrorInsufficientResources; - } - - h263port = static_cast<PortH263 *>(this->ports[port_index]); - - /* OMX_PARAM_PORTDEFINITIONTYPE */ - memset(&h263portdefinition, 0, sizeof(h263portdefinition)); - SetTypeHeader(&h263portdefinition, sizeof(h263portdefinition)); - h263portdefinition.nPortIndex = port_index; - h263portdefinition.eDir = dir; - if (dir == OMX_DirInput) { - h263portdefinition.nBufferCountActual = - INPORT_H263_ACTUAL_BUFFER_COUNT; - h263portdefinition.nBufferCountMin = INPORT_H263_MIN_BUFFER_COUNT; - h263portdefinition.nBufferSize = INPORT_H263_BUFFER_SIZE; - } else { - h263portdefinition.nBufferCountActual = - OUTPORT_H263_ACTUAL_BUFFER_COUNT; - h263portdefinition.nBufferCountMin = OUTPORT_H263_MIN_BUFFER_COUNT; - h263portdefinition.nBufferSize = OUTPORT_H263_BUFFER_SIZE; - } - h263portdefinition.bEnabled = OMX_TRUE; - h263portdefinition.bPopulated = OMX_FALSE; - h263portdefinition.eDomain = OMX_PortDomainVideo; - h263portdefinition.format.video.cMIMEType = (OMX_STRING)"video/h263"; - h263portdefinition.format.video.pNativeRender = NULL; - h263portdefinition.format.video.nFrameWidth = 176; - h263portdefinition.format.video.nFrameHeight = 144; - h263portdefinition.format.video.nStride = 0; - h263portdefinition.format.video.nSliceHeight = 0; - h263portdefinition.format.video.nBitrate = 64000; - h263portdefinition.format.video.xFramerate = 15 << 16; - h263portdefinition.format.video.bFlagErrorConcealment = OMX_FALSE; - h263portdefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingH263; - h263portdefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused; - h263portdefinition.format.video.pNativeWindow = NULL; - h263portdefinition.bBuffersContiguous = OMX_FALSE; - h263portdefinition.nBufferAlignment = 0; - - h263port->SetPortDefinition(&h263portdefinition, true); - - /* end of OMX_PARAM_PORTDEFINITIONTYPE */ - - /* OMX_VIDEO_PARAM_H263TYPE */ - memset(&h263portparam, 0, sizeof(h263portparam)); - SetTypeHeader(&h263portparam, sizeof(h263portparam)); - h263portparam.nPortIndex = port_index; - h263portparam.eProfile = OMX_VIDEO_H263ProfileBaseline; - h263portparam.eLevel = OMX_VIDEO_H263Level10; - - h263port->SetPortH263Param(&h263portparam, true); - - /* end of OMX_VIDEO_PARAM_H263TYPE */ - - /* encoder */ - if (dir == OMX_DirOutput) { - /* OMX_VIDEO_PARAM_BITRATETYPE */ - OMX_VIDEO_PARAM_BITRATETYPE bitrateparam; - - memset(&bitrateparam, 0, sizeof(bitrateparam)); - SetTypeHeader(&bitrateparam, sizeof(bitrateparam)); - - bitrateparam.nPortIndex = port_index; - bitrateparam.eControlRate = OMX_Video_ControlRateConstant; - bitrateparam.nTargetBitrate = 64000; - - h263port->SetPortBitrateParam(&bitrateparam, true); - /* end of OMX_VIDEO_PARAM_BITRATETYPE */ - - /* OMX_VIDEO_CONFIG_PRI_INFOTYPE */ - OMX_VIDEO_CONFIG_PRI_INFOTYPE privateinfoparam; - - memset(&privateinfoparam, 0, sizeof(privateinfoparam)); - SetTypeHeader(&privateinfoparam, sizeof(privateinfoparam)); - - privateinfoparam.nPortIndex = port_index; - privateinfoparam.nCapacity = 0; - privateinfoparam.nHolder = NULL; - - h263port->SetPortPrivateInfoParam(&privateinfoparam, true); - } - - 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 = 176; - rawportdefinition.format.video.nSliceHeight = 144; - 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_FormatYUV420SemiPlanar; - 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_FormatYUV420SemiPlanar; - - 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; -} - -/* - Add OMX_COLOR_FormatVendorStartUnused + 0xA00E00 -> PVMF_MIME_RAWVA in file - external/opencore/nodes/pvomxvideodecnode/src/pvmf_omx_videodec_node.cpp - -*/ -OMX_ERRORTYPE MrstPsbComponent::__AllocateRawVAPort(OMX_U32 port_index, - OMX_DIRTYPE dir) -{ - PortVideo *rawport; - - OMX_PARAM_PORTDEFINITIONTYPE rawportdefinition; - OMX_VIDEO_PARAM_PORTFORMATTYPE rawvideoparam; - - LOGV("%s(): enter\n", __func__); - - if(dir != OMX_DirOutput) { - return OMX_ErrorBadParameter; - } - - ports[port_index] = new PortVideo; - if (!ports[port_index]) { - LOGE("%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; - - rawportdefinition.nBufferCountActual = OUTPORT_RAW_ACTUAL_BUFFER_COUNT; - rawportdefinition.nBufferCountMin = OUTPORT_RAW_MIN_BUFFER_COUNT; - rawportdefinition.nBufferSize = sizeof(VABuffer) + 16; /* OUTPORT_RAW_BUFFER_SIZE; */ - - rawportdefinition.bEnabled = OMX_TRUE; - rawportdefinition.bPopulated = OMX_FALSE; - rawportdefinition.eDomain = OMX_PortDomainVideo; - rawportdefinition.format.video.cMIMEType = (char *)"video/x-raw-va"; // (char *)"video/raw"; - rawportdefinition.format.video.pNativeRender = NULL; - rawportdefinition.format.video.nFrameWidth = 176; - rawportdefinition.format.video.nFrameHeight = 144; - rawportdefinition.format.video.nStride = 176; - rawportdefinition.format.video.nSliceHeight = 144; - 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_FORMATTYPE)0x7FA00E00; - 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_FORMATTYPE)0x7FA00E00; - - 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 */ - - -#define AVC_ENCODE_ERROR_CHECKING(p) \ -if (!p) { \ - LOGE("%s(), NULL pointer", __func__); \ - return OMX_ErrorBadParameter; \ -} \ -ret = CheckTypeHeader(p, sizeof(*p)); \ -if (ret != OMX_ErrorNone) { \ - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); \ - return ret; \ -} \ -if (codec_mode != MIX_CODEC_MODE_ENCODE) { \ - LOGE("%s(), wrong codec mode", __func__); \ - return OMX_ErrorUnsupportedIndex; \ -} \ -if (coding_type != OMX_VIDEO_CodingAVC) { \ - LOGE("%s(), wrong coding type", __func__); \ - return OMX_ErrorUnsupportedIndex; \ -} \ -OMX_U32 index = p->nPortIndex; \ -if (index != OUTPORT_INDEX) { \ - LOGE("%s(), wrong port index", __func__); \ - return OMX_ErrorBadPortIndex; \ -} \ -PortAvc *port = static_cast<PortAvc *> (ports[index]); \ -if (!port) { \ - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, \ - OMX_ErrorBadPortIndex); \ - return OMX_ErrorBadPortIndex; \ -} \ -LOGV("%s(), about to get native or supported nal format", __func__); \ -if (!port->IsEnabled()) { \ - LOGE("%s() : port is not enabled", __func__); \ - return OMX_ErrorNotReady; \ -} \ - -/* - * 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) { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortVideo *>(ports[index]); - - if (!port) { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, - OMX_ErrorBadPortIndex); - return OMX_ErrorBadPortIndex; - } - - memcpy(p, port->GetPortVideoParam(), sizeof(*p)); - - LOGV("%s(), p->eColorFormat = %x\n", __func__, p->eColorFormat); - break; - } - case OMX_IndexParamVideoAvc: { - OMX_VIDEO_PARAM_AVCTYPE *p = - (OMX_VIDEO_PARAM_AVCTYPE *)pComponentParameterStructure; - OMX_U32 index = p->nPortIndex; - PortAvc *port = NULL; - - LOGV("%s(): port index : %lu\n", __func__, index); - - ret = CheckTypeHeader(p, sizeof(*p)); - if (ret != OMX_ErrorNone) { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortAvc *>(ports[index]); - - if (!port) { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, - OMX_ErrorBadPortIndex); - return OMX_ErrorBadPortIndex; - } - - memcpy(p, port->GetPortAvcParam(), sizeof(*p)); - break; - } - case OMX_IndexParamVideoMpeg4: { - OMX_VIDEO_PARAM_MPEG4TYPE *p = - (OMX_VIDEO_PARAM_MPEG4TYPE *)pComponentParameterStructure; - OMX_U32 index = p->nPortIndex; - PortMpeg4 *port = NULL; - - LOGV("%s(): port index : %lu\n", __func__, index); - - ret = CheckTypeHeader(p, sizeof(*p)); - if (ret != OMX_ErrorNone) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortMpeg4 *>(ports[index]); - - if (!port) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, - OMX_ErrorBadPortIndex); - return OMX_ErrorBadPortIndex; - } - - memcpy(p, port->GetPortMpeg4Param(), sizeof(*p)); - break; - } - case OMX_IndexParamVideoH263: { - OMX_VIDEO_PARAM_H263TYPE *p = - (OMX_VIDEO_PARAM_H263TYPE *)pComponentParameterStructure; - OMX_U32 index = p->nPortIndex; - PortH263 *port = NULL; - - LOGV("%s(): port index : %lu\n", __func__, index); - - ret = CheckTypeHeader(p, sizeof(*p)); - if (ret != OMX_ErrorNone) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortH263 *>(ports[index]); - - if (!port) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, - OMX_ErrorBadPortIndex); - return OMX_ErrorBadPortIndex; - } - - memcpy(p, port->GetPortH263Param(), sizeof(*p)); - break; - } - case OMX_IndexParamVideoBitrate: { - - if (avcEncParamIntelBitrateType.eControlRate - != OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_VIDEO_PARAM_BITRATETYPE *p = - (OMX_VIDEO_PARAM_BITRATETYPE *)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) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortVideo *>(ports[index]); - - if (!port) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, - OMX_ErrorBadPortIndex); - return OMX_ErrorBadPortIndex; - } - - memcpy(p, port->GetPortBitrateParam(), sizeof(*p)); - break; - } - case OMX_IndexIntelPrivateInfo: { - OMX_VIDEO_CONFIG_PRI_INFOTYPE *p = - (OMX_VIDEO_CONFIG_PRI_INFOTYPE *)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) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortVideo *>(ports[index]); - - if (!port) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, - OMX_ErrorBadPortIndex); - return OMX_ErrorBadPortIndex; - } - - memcpy(p, port->GetPortPrivateInfoParam(), sizeof(*p)); - break; - } - case OMX_IndexParamNalStreamFormat: - case OMX_IndexParamNalStreamFormatSupported: { - OMX_NALSTREAMFORMATTYPE *p = - (OMX_NALSTREAMFORMATTYPE *)pComponentParameterStructure; - - LOGV("%s(), OMX_IndexParamNalStreamFormat or OMX_IndexParamNalStreamFormatSupported", __func__); - - AVC_ENCODE_ERROR_CHECKING(p) - -#if 0 - 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; - } -#endif - if(nParamIndex == OMX_IndexParamNalStreamFormat) { - p->eNaluFormat = OMX_NaluFormatStartCodes; - LOGV("%s(), OMX_IndexParamNalStreamFormat 0x%x", __func__, - p->eNaluFormat); - } else { - p->eNaluFormat = (OMX_NALUFORMATSTYPE)(OMX_NaluFormatStartCodes | - OMX_NaluFormatFourByteInterleaveLength | - OMX_NaluFormatZeroByteInterleaveLength); - LOGV("%s(), OMX_IndexParamNalStreamFormatSupported 0x%x", - __func__, p->eNaluFormat); - } - break; - } - - case OMX_IndexConfigVideoAVCIntraPeriod: { - OMX_VIDEO_CONFIG_AVCINTRAPERIOD *pVideoIDRInterval = - (OMX_VIDEO_CONFIG_AVCINTRAPERIOD *) pComponentParameterStructure; - - LOGV("%s(), OMX_IndexConfigVideoAVCIntraPeriod", __func__); - - if(!vcp) { - LOGE("%s(), vcp is NULL", __func__); - return OMX_ErrorNotReady; - } - - AVC_ENCODE_ERROR_CHECKING(pVideoIDRInterval) - ret = ComponentGetConfig(OMX_IndexConfigVideoAVCIntraPeriod, - pComponentParameterStructure); - - break; - } - case OMX_IndexParamIntelBitrate: { - - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - LOGV("%s(), OMX_IndexParamIntelBitrate", __func__); - - OMX_VIDEO_PARAM_INTEL_BITRATETYPE *pIntelBitrate = - (OMX_VIDEO_PARAM_INTEL_BITRATETYPE *) pComponentParameterStructure; - - AVC_ENCODE_ERROR_CHECKING(pIntelBitrate) - - *pIntelBitrate = avcEncParamIntelBitrateType; - - break; - } - - case OMX_IndexConfigIntelBitrate: { - - LOGV("%s(), OMX_IndexConfigIntelBitrate", __func__); - ret = ComponentGetConfig((OMX_INDEXTYPE)OMX_IndexConfigIntelBitrate, - (OMX_PTR)pComponentParameterStructure); - break; - - } - - case OMX_IndexConfigVideoNalSize: { - - LOGV("%s(), OMX_IndexConfigVideoNalSize", __func__); - ret = ComponentGetConfig(OMX_IndexConfigVideoNalSize, - pComponentParameterStructure); - - break; - } - - case OMX_IndexConfigIntelSliceNumbers: { - - LOGV("%s(), OMX_IndexConfigIntelSliceNumbers", __func__); - ret = ComponentGetConfig((OMX_INDEXTYPE)OMX_IndexConfigIntelSliceNumbers, - pComponentParameterStructure); - - break; - } - - case OMX_IndexConfigIntelAIR: { - - LOGV("%s(), OMX_IndexConfigIntelAIR", __func__); - ret = ComponentGetConfig((OMX_INDEXTYPE)OMX_IndexConfigIntelAIR, - pComponentParameterStructure); - - break; - } - - case OMX_IndexConfigVideoFramerate: { - - LOGV("%s(), OMX_IndexConfigVideoFramerate", __func__); - ret = ComponentGetConfig((OMX_INDEXTYPE)OMX_IndexConfigVideoFramerate, - pComponentParameterStructure); - - 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; - - LOGV("%s(): port index : %lu\n", __func__, index); - - ret = CheckTypeHeader(p, sizeof(*p)); - if (ret != OMX_ErrorNone) { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortVideo *>(ports[index]); - - if (!port) { - LOGE("%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) { - LOGE("%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; - - LOGV("%s(): port index : %lu\n", __func__, index); - - ret = CheckTypeHeader(p, sizeof(*p)); - if (ret != OMX_ErrorNone) { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortAvc *>(ports[index]); - - if (!port) { - LOGE("%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) { - LOGE("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, - OMX_ErrorIncorrectStateOperation); - return OMX_ErrorIncorrectStateOperation; - } - } - - ret = port->SetPortAvcParam(p, false); - break; - } - case OMX_IndexParamVideoMpeg4: { - OMX_VIDEO_PARAM_MPEG4TYPE *p = - (OMX_VIDEO_PARAM_MPEG4TYPE *)pComponentParameterStructure; - OMX_U32 index = p->nPortIndex; - PortMpeg4 *port = NULL; - - LOGV("%s(): port index : %lu\n", __func__, index); - - ret = CheckTypeHeader(p, sizeof(*p)); - if (ret != OMX_ErrorNone) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortMpeg4 *>(ports[index]); - - if (!port) { - LOGE("%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) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, - OMX_ErrorIncorrectStateOperation); - return OMX_ErrorIncorrectStateOperation; - } - } - - ret = port->SetPortMpeg4Param(p, false); - break; - } - case OMX_IndexParamVideoH263: { - OMX_VIDEO_PARAM_H263TYPE *p = - (OMX_VIDEO_PARAM_H263TYPE *)pComponentParameterStructure; - OMX_U32 index = p->nPortIndex; - PortH263 *port = NULL; - - LOGV("%s(): port index : %lu\n", __func__, index); - - ret = CheckTypeHeader(p, sizeof(*p)); - if (ret != OMX_ErrorNone) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortH263 *>(ports[index]); - - if (!port) { - LOGE("%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) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, - OMX_ErrorIncorrectStateOperation); - return OMX_ErrorIncorrectStateOperation; - } - } - - ret = port->SetPortH263Param(p, false); - break; - } - case OMX_IndexParamVideoBitrate: { - - LOGV("%s(), OMX_IndexParamVideoBitrate", __func__); - avcEncParamIntelBitrateType.eControlRate - = OMX_Video_Intel_ControlRateMax; - - OMX_VIDEO_PARAM_BITRATETYPE *p = - (OMX_VIDEO_PARAM_BITRATETYPE *)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) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortVideo *>(ports[index]); - - if (!port) { - LOGE("%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->SetPortBitrateParam(p, false); - break; - } - case OMX_IndexIntelPrivateInfo: { - - LOGV("%s(), OMX_IndexIntelPrivateInfo", __func__); - OMX_VIDEO_CONFIG_PRI_INFOTYPE *p = - (OMX_VIDEO_CONFIG_PRI_INFOTYPE *)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) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (index < nr_ports) - port = static_cast<PortVideo *>(ports[index]); - - if (!port) { - LOGE("%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) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, - OMX_ErrorIncorrectStateOperation); - return OMX_ErrorIncorrectStateOperation; - } - } - - ret = port->SetPortPrivateInfoParam(p, false); - break; - } - - case OMX_IndexParamVideoBytestream: { - - LOGV("%s(), OMX_IndexParamVideoBytestream", __func__); - - OMX_VIDEO_PARAM_BYTESTREAMTYPE *p = - (OMX_VIDEO_PARAM_BYTESTREAMTYPE *) pComponentParameterStructure; - - AVC_ENCODE_ERROR_CHECKING(p) - - OMX_STATETYPE state; - CBaseGetState((void *) GetComponentHandle(), &state); - if (state != OMX_StateLoaded && state != OMX_StateWaitForResources) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, - OMX_ErrorIncorrectStateOperation); - return OMX_ErrorIncorrectStateOperation; - } - - break; - } - case OMX_IndexParamNalStreamFormatSelect: { - - LOGV("%s() : OMX_IndexParamNalStreamFormatSelect", __func__); - OMX_NALSTREAMFORMATTYPE *p = - (OMX_NALSTREAMFORMATTYPE *) pComponentParameterStructure; - - AVC_ENCODE_ERROR_CHECKING(p) - - if (p->eNaluFormat == OMX_NaluFormatStartCodes || p->eNaluFormat - == OMX_NaluFormatFourByteInterleaveLength || p->eNaluFormat - == OMX_NaluFormatZeroByteInterleaveLength) { - OMX_STATETYPE state; - CBaseGetState((void *) GetComponentHandle(), &state); - if (state != OMX_StateLoaded && state != OMX_StateWaitForResources) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, - OMX_ErrorIncorrectStateOperation); - return OMX_ErrorIncorrectStateOperation; - } - - avcEncNaluFormatType = p->eNaluFormat; - LOGE("%s(), OMX_IndexParamNalStreamFormatSelect : 0x%x", - __func__, avcEncNaluFormatType); - } - break; - } - - case OMX_IndexConfigVideoAVCIntraPeriod: { - - LOGV("%s() : OMX_IndexConfigVideoAVCIntraPeriod", __func__); - - OMX_VIDEO_CONFIG_AVCINTRAPERIOD *pVideoIDRInterval = - (OMX_VIDEO_CONFIG_AVCINTRAPERIOD *) pComponentParameterStructure; - - AVC_ENCODE_ERROR_CHECKING(pVideoIDRInterval) - - avcEncIDRPeriod = pVideoIDRInterval->nIDRPeriod; - avcEncPFrames = pVideoIDRInterval->nPFrames; - LOGV("%s(), OMX_IndexConfigVideoAVCIntraPeriod : avcEncIDRPeriod = %d avcEncPFrames = %d", - __func__, avcEncIDRPeriod, avcEncPFrames); - break; - } - case OMX_IndexParamIntelBitrate: { - OMX_VIDEO_PARAM_INTEL_BITRATETYPE *pIntelBitrate = - (OMX_VIDEO_PARAM_INTEL_BITRATETYPE *) pComponentParameterStructure; - - LOGV("%s(), OMX_IndexParamIntelBitrate", __func__); - - AVC_ENCODE_ERROR_CHECKING(pIntelBitrate) - avcEncParamIntelBitrateType = *pIntelBitrate; - - break; - } - - case OMX_IndexConfigIntelBitrate: { - - LOGV("%s(), OMX_IndexParamIntelBitrate", __func__); - - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_VIDEO_CONFIG_INTEL_BITRATETYPE *pIntelBitrate = - (OMX_VIDEO_CONFIG_INTEL_BITRATETYPE *) pComponentParameterStructure; - - AVC_ENCODE_ERROR_CHECKING(pIntelBitrate) - avcEncConfigIntelBitrateType = *pIntelBitrate; - - break; - } - case OMX_IndexConfigVideoNalSize: { - - LOGV("%s() : OMX_IndexConfigVideoNalSize", __func__); - - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_VIDEO_CONFIG_NALSIZE *pNalSize = - (OMX_VIDEO_CONFIG_NALSIZE *) pComponentParameterStructure; - - AVC_ENCODE_ERROR_CHECKING(pNalSize) - - avcEncConfigNalSize = *pNalSize; - - break; - } - - case OMX_IndexConfigIntelSliceNumbers: { - - LOGV("%s() : OMX_IndexConfigIntelSliceNumbers", __func__); - - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_VIDEO_CONFIG_INTEL_SLICE_NUMBERS *pSliceNumbers = - (OMX_VIDEO_CONFIG_INTEL_SLICE_NUMBERS *) pComponentParameterStructure; - - AVC_ENCODE_ERROR_CHECKING(pSliceNumbers) - - avcEncConfigSliceNumbers = *pSliceNumbers; - - LOGV("%s(), nISliceNumber = %d nPSliceNumber = %d", __func__, - pSliceNumbers->nISliceNumber, pSliceNumbers->nPSliceNumber); - - break; - } - - case OMX_IndexConfigIntelAIR: { - - LOGV("%s() : OMX_IndexConfigIntelAIR", __func__); - - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_VIDEO_CONFIG_INTEL_AIR *pIntelAir = - (OMX_VIDEO_CONFIG_INTEL_AIR *) pComponentParameterStructure; - - AVC_ENCODE_ERROR_CHECKING(pIntelAir) - - avcEncConfigAir = *pIntelAir; - - break; - } - - case OMX_IndexConfigVideoFramerate: { - - LOGV("%s() : OMX_IndexConfigVideoFramerate", __func__); - - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_CONFIG_FRAMERATETYPE *pxFramerate = - (OMX_CONFIG_FRAMERATETYPE *) pComponentParameterStructure; - - AVC_ENCODE_ERROR_CHECKING(pxFramerate) - - avcEncFramerate = *pxFramerate; - - break; - } - - case OMX_IndexParamIntelAVCDecodeSettings: { - OMX_VIDEO_PARAM_INTEL_AVC_DECODE_SETTINGS *pAvcDecodeSettings = - (OMX_VIDEO_PARAM_INTEL_AVC_DECODE_SETTINGS *) pComponentParameterStructure; - - LOGV("%s(), OMX_IndexParamIntelAVCDecodeSettings", __func__); - - ret = CheckTypeHeader(pAvcDecodeSettings, sizeof(*pAvcDecodeSettings)); - if (ret != OMX_ErrorNone) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); - return ret; - } - - if (coding_type != OMX_VIDEO_CodingAVC) { - LOGE("%s(), wrong coding type", __func__); - return OMX_ErrorUnsupportedIndex; - } - - OMX_U32 index = pAvcDecodeSettings->nPortIndex; - /* if (index != OUTPORT_INDEX) { - LOGE("%s(), wrong port index", __func__); - return OMX_ErrorBadPortIndex; - } - */ - PortAvc *port = static_cast<PortAvc *> (ports[index]); - if (!port) { - LOGE("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, - OMX_ErrorBadPortIndex); - return OMX_ErrorBadPortIndex; - } - - if (port->IsEnabled()) { - if(pAvcDecodeSettings->nMaxNumberOfReferenceFrame != 0) - avcDecodeSettings = *pAvcDecodeSettings; - } - - 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; - OMX_CONFIG_INTRAREFRESHVOPTYPE* pVideoIFrame; - OMX_VIDEO_CONFIG_AVCINTRAPERIOD *pVideoIDRInterval; - - LOGV("%s(): enter\n", __func__); - - LOGV("%s() : nIndex = %d\n", __func__, nIndex); - - switch (nIndex) - { - case OMX_IndexConfigVideoAVCIntraPeriod: - { - if(!vcp) { - return OMX_ErrorNotReady; - } - pVideoIDRInterval = (OMX_VIDEO_CONFIG_AVCINTRAPERIOD *) pComponentConfigStructure; - if(!pVideoIDRInterval) { - LOGE("%s(), NULL pointer", __func__); - return OMX_ErrorBadParameter; - } - - AVC_ENCODE_ERROR_CHECKING(pVideoIDRInterval) - - - if(!mix) { - LOGE("%s(), MixVideo is not created", __func__); - return OMX_ErrorUndefined; - } - - MixVideoConfigParams *mixbaseconfig = NULL; - MIX_RESULT mret = mix_video_get_config(mix, &mixbaseconfig); - if(mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), failed to get config", __func__); - return OMX_ErrorUndefined; - } - - uint intra_period = 0; - mret = mix_videoconfigparamsenc_get_intra_period(MIX_VIDEOCONFIGPARAMSENC(mixbaseconfig), &intra_period); - if(mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), failed to get intra period", __func__); - return OMX_ErrorUndefined; - } - - uint idr_interval = 0; - mret = mix_videoconfigparamsenc_h264_get_IDR_interval(MIX_VIDEOCONFIGPARAMSENC_H264(mixbaseconfig), &idr_interval); - if(mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), failed to get IDR interval", __func__); - return OMX_ErrorUndefined; - } - - mix_videoconfigparams_unref(mixbaseconfig); - - pVideoIDRInterval->nIDRPeriod = idr_interval; - pVideoIDRInterval->nPFrames = intra_period; - - LOGV("%s(), OMX_IndexConfigVideoAVCIntraPeriod : nIDRPeriod = %d, nPFrames = %d", - __func__, pVideoIDRInterval->nIDRPeriod, pVideoIDRInterval->nPFrames); - - SetTypeHeader(pVideoIDRInterval, sizeof(OMX_VIDEO_CONFIG_AVCINTRAPERIOD)); - } - break; - - case OMX_IndexConfigIntelBitrate: { - - LOGV("%s() : OMX_IndexParamIntelBitrate", __func__); - - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_VIDEO_CONFIG_INTEL_BITRATETYPE *pIntelBitrate = - (OMX_VIDEO_CONFIG_INTEL_BITRATETYPE *) pComponentConfigStructure; - - AVC_ENCODE_ERROR_CHECKING(pIntelBitrate) - - *pIntelBitrate = avcEncConfigIntelBitrateType; - - break; - } - case OMX_IndexConfigVideoNalSize: { - - LOGV("%s() : OMX_IndexConfigVideoNalSize", __func__); - - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_VIDEO_CONFIG_NALSIZE *pNalSize = - (OMX_VIDEO_CONFIG_NALSIZE *) pComponentConfigStructure; - - AVC_ENCODE_ERROR_CHECKING(pNalSize) - - *pNalSize = avcEncConfigNalSize; - break; - } - - case OMX_IndexConfigIntelSliceNumbers: { - - LOGV("%s() : OMX_IndexConfigIntelSliceNumbers", __func__); - - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_VIDEO_CONFIG_INTEL_SLICE_NUMBERS *pSliceNumbers = - (OMX_VIDEO_CONFIG_INTEL_SLICE_NUMBERS *) pComponentConfigStructure; - - AVC_ENCODE_ERROR_CHECKING(pSliceNumbers) - - *pSliceNumbers = avcEncConfigSliceNumbers; - break; - } - - case OMX_IndexConfigIntelAIR: { - - LOGV("%s() : OMX_IndexConfigIntelAIR", __func__); - - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_VIDEO_CONFIG_INTEL_AIR *pIntelAir = - (OMX_VIDEO_CONFIG_INTEL_AIR *) pComponentConfigStructure; - - AVC_ENCODE_ERROR_CHECKING(pIntelAir) - - *pIntelAir = avcEncConfigAir; - break; - } - case OMX_IndexConfigVideoFramerate: { - - LOGV("%s() : OMX_IndexConfigVideoFramerate", __func__); - - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_CONFIG_FRAMERATETYPE *pxFramerate = - (OMX_CONFIG_FRAMERATETYPE *) pComponentConfigStructure; - - AVC_ENCODE_ERROR_CHECKING(pxFramerate) - - *pxFramerate = avcEncFramerate; - break; - } - - default: - { - return OMX_ErrorUnsupportedIndex; - } - } - LOGV("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, ret); - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstPsbComponent::ComponentSetConfig( - OMX_INDEXTYPE nParamIndex, - OMX_PTR pComponentConfigStructure) -{ - OMX_ERRORTYPE ret = OMX_ErrorUnsupportedIndex; - OMX_CONFIG_INTRAREFRESHVOPTYPE* pVideoIFrame; - OMX_VIDEO_CONFIG_AVCINTRAPERIOD *pVideoIDRInterval; - - MIX_RESULT mret; - - LOGV("%s(): enter\n", __func__); - - LOGV("%s() : nIndex = %d\n", __func__, nParamIndex); - - switch (nParamIndex) - { - case OMX_IndexConfigVideoIntraVOPRefresh: - { - LOGV("%s(), OMX_IndexConfigVideoIntraVOPRefresh", __func__); - - pVideoIFrame = (OMX_CONFIG_INTRAREFRESHVOPTYPE*) pComponentConfigStructure; - - AVC_ENCODE_ERROR_CHECKING(pVideoIFrame) - - LOGV("%s(), OMX_IndexConfigVideoIntraVOPRefresh", __func__); - if(pVideoIFrame->IntraRefreshVOP == OMX_TRUE) { - LOGV("%s(), pVideoIFrame->IntraRefreshVOP == OMX_TRUE", __func__); - - MixEncDynamicParams encdynareq; - oscl_memset(&encdynareq, 0, sizeof(encdynareq)); - encdynareq.force_idr = TRUE; - if(mix) { - mret = mix_video_set_dynamic_enc_config (mix, - MIX_ENC_PARAMS_FORCE_KEY_FRAME, &encdynareq); - if(mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), failed to set IDR interval", __func__); - } - } - } - } - break; - - case OMX_IndexConfigVideoAVCIntraPeriod: - { - LOGV("%s(), OMX_IndexConfigVideoAVCIntraPeriod", __func__); - - pVideoIDRInterval = (OMX_VIDEO_CONFIG_AVCINTRAPERIOD *) pComponentConfigStructure; - - AVC_ENCODE_ERROR_CHECKING(pVideoIDRInterval) - - LOGV("%s(), OMX_IndexConfigVideoAVCIntraPeriod : nIDRPeriod = %d, nPFrames = %d", - __func__, pVideoIDRInterval->nIDRPeriod, pVideoIDRInterval->nPFrames); - - MixEncDynamicParams encdynareq; - oscl_memset(&encdynareq, 0, sizeof(encdynareq)); - encdynareq.idr_interval = pVideoIDRInterval->nIDRPeriod; - encdynareq.intra_period = pVideoIDRInterval->nPFrames; - if(mix) { - - // Ignore the return code - mret = mix_video_set_dynamic_enc_config (mix, MIX_ENC_PARAMS_IDR_INTERVAL, &encdynareq); - if(mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), failed to set IDR interval", __func__); - } - - mret = mix_video_set_dynamic_enc_config (mix, MIX_ENC_PARAMS_GOP_SIZE, &encdynareq); - if(mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), failed to set GOP size", __func__); - } - } - } - break; - case OMX_IndexConfigIntelBitrate: { - - LOGV("%s(), OMX_IndexConfigIntelBitrate", __func__); - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - LOGE("%s(), eControlRate == OMX_Video_Intel_ControlRateMax"); - break; - } - - OMX_VIDEO_CONFIG_INTEL_BITRATETYPE *pIntelBitrate = - (OMX_VIDEO_CONFIG_INTEL_BITRATETYPE *) pComponentConfigStructure; - - AVC_ENCODE_ERROR_CHECKING(pIntelBitrate) - - avcEncConfigIntelBitrateType = *pIntelBitrate; - - if (mix && avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateVideoConferencingMode) { - - LOGV("%s(), avcEncConfigIntelBitrateType.nInitialQP = %d", __func__, - avcEncConfigIntelBitrateType.nInitialQP); - - LOGV("%s(), avcEncConfigIntelBitrateType.nMinQP = %d", __func__, - avcEncConfigIntelBitrateType.nMinQP); - - LOGV("%s(), avcEncConfigIntelBitrateType.nMaxEncodeBitrate = %d", __func__, - avcEncConfigIntelBitrateType.nMaxEncodeBitrate); - - LOGV("%s(), avcEncConfigIntelBitrateType.nTargetPercentage = %d", __func__, - avcEncConfigIntelBitrateType.nTargetPercentage); - - LOGV("%s(), avcEncConfigIntelBitrateType.nWindowSize = %d", __func__, - avcEncConfigIntelBitrateType.nWindowSize); - - MixEncParamsType params_type; - MixEncDynamicParams dynamic_params; - oscl_memset(&dynamic_params, 0, sizeof(dynamic_params)); - - - params_type = MIX_ENC_PARAMS_INIT_QP; - dynamic_params.init_QP = avcEncConfigIntelBitrateType.nInitialQP; - mret = mix_video_set_dynamic_enc_config(mix, params_type, - &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - - params_type = MIX_ENC_PARAMS_MIN_QP; - dynamic_params.min_QP = avcEncConfigIntelBitrateType.nMinQP; - mret = mix_video_set_dynamic_enc_config(mix, params_type, - &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - - params_type = MIX_ENC_PARAMS_BITRATE; - dynamic_params.bitrate - = avcEncConfigIntelBitrateType.nMaxEncodeBitrate; - mret = mix_video_set_dynamic_enc_config(mix, params_type, - &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - - params_type = MIX_ENC_PARAMS_TARGET_PERCENTAGE; - dynamic_params.target_percentage - = avcEncConfigIntelBitrateType.nTargetPercentage; - mret = mix_video_set_dynamic_enc_config(mix, params_type, - &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - - params_type = MIX_ENC_PARAMS_WINDOW_SIZE; - dynamic_params.window_size - = avcEncConfigIntelBitrateType.nWindowSize; - mret = mix_video_set_dynamic_enc_config(mix, params_type, - &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - } - break; - } - - case OMX_IndexConfigVideoNalSize: { - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_VIDEO_CONFIG_NALSIZE *pNalSize = - (OMX_VIDEO_CONFIG_NALSIZE *) pComponentConfigStructure; - - AVC_ENCODE_ERROR_CHECKING(pNalSize) - - avcEncConfigNalSize = *pNalSize; - - if (mix && avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateVideoConferencingMode) { - - MixEncParamsType params_type; - MixEncDynamicParams dynamic_params; - oscl_memset(&dynamic_params, 0, sizeof(dynamic_params)); - - params_type = MIX_ENC_PARAMS_MTU_SLICE_SIZE; - dynamic_params.max_slice_size = avcEncConfigNalSize.nNaluBytes * 8; // bits - mret = mix_video_set_dynamic_enc_config (mix, - params_type, &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - } - break; - } - - case OMX_IndexConfigIntelSliceNumbers: { - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_VIDEO_CONFIG_INTEL_SLICE_NUMBERS *pSliceNumbers = - (OMX_VIDEO_CONFIG_INTEL_SLICE_NUMBERS *) pComponentConfigStructure; - - AVC_ENCODE_ERROR_CHECKING(pSliceNumbers) - - avcEncConfigSliceNumbers = *pSliceNumbers; - - LOGV("%s(), OMX_IndexConfigIntelSliceNumbers", __func__); - LOGV("%s(), nISliceNumber = %d nPSliceNumber = %d", __func__, - pSliceNumbers->nISliceNumber, pSliceNumbers->nPSliceNumber); - - if (mix && avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateVideoConferencingMode) { - - MixEncParamsType params_type; - MixEncDynamicParams dynamic_params; - oscl_memset(&dynamic_params, 0, sizeof(dynamic_params)); - - params_type = MIX_ENC_PARAMS_I_SLICE_NUM; - dynamic_params.I_slice_num = pSliceNumbers->nISliceNumber; - mret = mix_video_set_dynamic_enc_config (mix, - params_type, &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - params_type = MIX_ENC_PARAMS_P_SLICE_NUM; - dynamic_params.P_slice_num = pSliceNumbers->nPSliceNumber; - mret = mix_video_set_dynamic_enc_config (mix, - params_type, &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - } - break; - } - case OMX_IndexConfigIntelAIR: { - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_VIDEO_CONFIG_INTEL_AIR *pIntelAir = - (OMX_VIDEO_CONFIG_INTEL_AIR *) pComponentConfigStructure; - - AVC_ENCODE_ERROR_CHECKING(pIntelAir) - - avcEncConfigAir = *pIntelAir; - - if (mix && avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateVideoConferencingMode) { - - MixEncParamsType params_type; - MixEncDynamicParams dynamic_params; - oscl_memset(&dynamic_params, 0, sizeof(dynamic_params)); - - if(pIntelAir->bAirEnable) { - - params_type = MIX_ENC_PARAMS_REFRESH_TYPE; - dynamic_params.refresh_type = MIX_VIDEO_AIR; - mret = mix_video_set_dynamic_enc_config (mix, params_type, &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - - params_type = MIX_ENC_PARAMS_AIR; - dynamic_params.air_params.air_auto = pIntelAir->bAirAuto; - dynamic_params.air_params.air_MBs = pIntelAir->nAirMBs; - dynamic_params.air_params.air_threshold = pIntelAir->nAirThreshold; - mret = mix_video_set_dynamic_enc_config (mix, params_type, &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - - } else { - - params_type = MIX_ENC_PARAMS_REFRESH_TYPE; - dynamic_params.refresh_type = MIX_VIDEO_NONIR; - mret = mix_video_set_dynamic_enc_config (mix, params_type, &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - } - } - break; - } - - case OMX_IndexConfigVideoFramerate: { - if (avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateMax) { - ret = OMX_ErrorUnsupportedIndex; - break; - } - - OMX_CONFIG_FRAMERATETYPE *pxFramerate = - (OMX_CONFIG_FRAMERATETYPE *) pComponentConfigStructure; - - AVC_ENCODE_ERROR_CHECKING(pxFramerate) - - avcEncFramerate = *pxFramerate; - - if (mix && avcEncParamIntelBitrateType.eControlRate - == OMX_Video_Intel_ControlRateVideoConferencingMode) { - - MixEncParamsType params_type; - MixEncDynamicParams dynamic_params; - oscl_memset(&dynamic_params, 0, sizeof(dynamic_params)); - - params_type = MIX_ENC_PARAMS_FRAME_RATE; - dynamic_params.frame_rate_denom = 1; - dynamic_params.frame_rate_num = avcEncFramerate.xEncodeFramerate >> 16; // Q16 format - mret = mix_video_set_dynamic_enc_config (mix, params_type, &dynamic_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGW("%s(), mixvideo return error : 0x%x", __func__, mret); - } - } - break; - } - - default: - { - return OMX_ErrorUnsupportedIndex; - } - } - LOGV("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, ret); - return OMX_ErrorNone; -} - - -/* end of component methods & helpers */ - -/* - * implement ComponentBase::Processor[*] - */ -OMX_ERRORTYPE MrstPsbComponent::ProcessorInit(void) -{ - MixVideo *mix = NULL; - MixVideoInitParams *vip = NULL; - MixParams *mvp = NULL; - MixVideoConfigParams *vcp = NULL; - MixDisplayAndroid *display = NULL; - - OMX_U32 port_index = (OMX_U32)-1; - - uint major, minor; - - OMX_ERRORTYPE oret = OMX_ErrorNone; - MIX_RESULT mret; - - LOGV("%s(): enter\n", __func__); - - mix = mix_video_new(); - LOGV("%s(): called to mix_video_new()", __func__); - - if (!mix) { - LOGE("%s(),%d: exit, mix_video_new failed", __func__, __LINE__); - goto error_out; - } - - mix_video_get_version(mix, &major, &minor); - LOGV("MixVideo version: %d.%d", major, minor); - - /* decoder */ - if (coding_type == OMX_VIDEO_CodingAVC) { - vcp = MIX_VIDEOCONFIGPARAMS(mix_videoconfigparamsdec_h264_new()); - } - else if (coding_type == OMX_VIDEO_CodingMPEG4 || coding_type == OMX_VIDEO_CodingH263) { - vcp = MIX_VIDEOCONFIGPARAMS(mix_videoconfigparamsdec_mp42_new()); - } - - mvp = MIX_PARAMS(mix_videodecodeparams_new()); - port_index = INPORT_INDEX; - - if (!vcp || !mvp || (port_index == (OMX_U32)-1)) { - LOGE("%s(),%d: exit, failed to allocate vcp, mvp, port_index\n", - __func__, __LINE__); - goto error_out; - } - - oret = ChangeVcpWithPortParam(vcp, - static_cast<PortVideo *>(ports[port_index]), - NULL); - if (oret != OMX_ErrorNone) { - LOGE("%s(),%d: exit, ChangeVcpWithPortParam failed (ret == 0x%08x)\n", - __func__, __LINE__, oret); - goto error_out; - } - - display = mix_displayandroid_new(); - if (!display) { - LOGE("%s(),%d: exit, mix_displayandroid_new failed", __func__, __LINE__); - goto error_out; - } - - vip = mix_videoinitparams_new(); - if (!vip) { - LOGE("%s(),%d: exit, mix_videoinitparams_new failed", __func__, - __LINE__); - goto error_out; - } - - { - Display *android_display = (Display*)malloc(sizeof(Display)); - *(android_display) = 0x18c34078; - - LOGV("*android_display = %d", *android_display); - - mret = mix_displayandroid_set_display(display, android_display); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(),%d: exit, mix_displayandroid_set_display failed " - "(ret == 0x%08x)", __func__, __LINE__, mret); - goto error_out; - } - } - - mret = mix_videoinitparams_set_display(vip, MIX_DISPLAY(display)); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(),%d: exit, mix_videoinitparams_set_display failed " - "(ret == 0x%08x)", __func__, __LINE__, mret); - goto error_out; - } - - mret = mix_videodecodeparams_set_discontinuity( - MIX_VIDEODECODEPARAMS(mvp), FALSE); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(),%d: exit, mix_videodecodeparams_set_discontinuity " - "(ret == 0x%08x)", __func__, __LINE__, mret); - goto error_out; - } - - mret = mix_video_initialize(mix, codec_mode, vip, NULL); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(),%d: exit, mix_video_initialize failed (ret == 0x%08x)", - __func__, __LINE__, mret); - goto error_out; - } - - this->mix = mix; - this->vip = vip; - this->mvp = mvp; - this->vcp = vcp; - this->display = display; - this->mixbuffer_in[0] = NULL; - - inframe_counter = 0; - outframe_counter = 0; - is_mixvideodec_configured = OMX_FALSE; - - last_ts = 0; - last_fps = 0.0; - - avc_enc_frame_size_left = 0; - - avc_enc_buffer = NULL; - avc_enc_buffer_length = 0; - avc_enc_buffer_offset = 0; - - LOGV("%s(),%d: exit (ret:0x%08x)\n", __func__, __LINE__, oret); - return oret; - -error_out: - mix_params_unref(mvp); - mix_videoconfigparams_unref(vcp); - mix_displayandroid_unref(display); - mix_videoinitparams_unref(vip); - mix_video_unref(mix); - - return OMX_ErrorUndefined; -} - -OMX_ERRORTYPE MrstPsbComponent::ProcessorDeinit(void) -{ - OMX_ERRORTYPE ret = OMX_ErrorNone; - MIX_RESULT mret; - - LOGV("%s(): enter\n", __func__); - - mix_video_eos(mix); - mix_video_flush(mix); - - mix_params_unref(mvp); - mix_videoconfigparams_unref(vcp); - mix_displayandroid_unref(display); - mix_videoinitparams_unref(vip); - - if (mixbuffer_in[0]) { - mix_video_release_mixbuffer(mix, mixbuffer_in[0]); - mixbuffer_in[0] = NULL; - } - - mix_video_deinitialize(mix); - mix_video_unref(mix); - - //to release glib thread resource; - //g_thread_deinit(); - - 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__); - -#if 0 - if (codec_mode == MIX_CODEC_MODE_ENCODE && coding_type - == OMX_VIDEO_CodingAVC) { - - ports[OUTPORT_INDEX]->ReturnAllRetainedBuffers(); - inframe_counter = 0; - outframe_counter = 0; - } -#endif - - 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 */ -OMX_ERRORTYPE MrstPsbComponent::ProcessorProcess( - OMX_BUFFERHEADERTYPE ***pBuffers, - buffer_retain_t *retain, - OMX_U32 nr_buffers) -{ - MixIOVec buffer_in, buffer_out; - OMX_U32 outfilledlen = 0; - OMX_S64 outtimestamp = 0; - OMX_U32 outflags = 0; - - OMX_ERRORTYPE oret = OMX_ErrorNone; - MIX_RESULT mret; - - VABuffer *vaBuf; - int retry_decode_count; - - LOGV_IF((*pBuffers[INPORT_INDEX])->nFlags & OMX_BUFFERFLAG_EOS, - "%s(),%d: got OMX_BUFFERFLAG_EOS\n", __func__, __LINE__); - - if (!(*pBuffers[INPORT_INDEX])->nFilledLen) { - LOGV("%s(),%d: input buffer's nFilledLen is zero\n", - __func__, __LINE__); - goto out; - } - - buffer_in.data = - (*pBuffers[INPORT_INDEX])->pBuffer + (*pBuffers[INPORT_INDEX])->nOffset; - buffer_in.data_size = (*pBuffers[INPORT_INDEX])->nFilledLen; - buffer_in.buffer_size = (*pBuffers[INPORT_INDEX])->nFilledLen; - - LOGV("buffer_in.data=%x, data_size=%d, buffer_size=%d", - (unsigned)buffer_in.data, buffer_in.data_size, buffer_in.buffer_size); - - buffer_out.data = - (*pBuffers[OUTPORT_INDEX])->pBuffer + (*pBuffers[OUTPORT_INDEX])->nOffset; - buffer_out.data_size = 0; - buffer_out.buffer_size = (*pBuffers[OUTPORT_INDEX])->nAllocLen - (*pBuffers[OUTPORT_INDEX])->nOffset; - - mixiovec_out[0] = &buffer_out; - - if(is_mixvideodec_configured) { - MixVideoFrame *frame = NULL; - vaBuf = (VABuffer *)(mixiovec_out[0]->data); - - mret = mix_video_get_frame(mix, &frame); - if (mret != MIX_RESULT_SUCCESS) { - if (mret == MIX_RESULT_FRAME_NOTAVAIL) { - LOGV("%s(), no more frames, continue to decode " - "(ret == 0x%08x)", __func__, mret); - goto normal_start; - } - else { - LOGE("%s(), %d mix_video_get_frame() failed (ret == 0x%08x)", - __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - goto local_cleanup; - } - } - - mret = mix_videoframe_get_frame_id(frame, (ulong *)&vaBuf->surface); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), %d mix_videoframe_get_frame_id() failed (ret == 0x%08x)", - __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - goto local_cleanup; - } - mret = mix_videoframe_get_vadisplay(frame, (void **)&vaBuf->display); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), %d mix_videoframe_get_vadisplay() failed (ret == 0x%08x)", - __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - goto local_cleanup; - } - - mret = mix_videoframe_get_timestamp(frame, (uint64 *)&outtimestamp); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), %d mix_videoframe_get_timestamp() failed (ret == 0x%08x)", - __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - goto local_cleanup; - } - - LOGV("--- Output timestamp = %"G_GINT64_FORMAT"\n ---", outtimestamp); - - mret = mix_videoframe_get_frame_structure(frame, (uint32 *)&vaBuf->frame_structure); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), %d mix_videoframe_get_frame_structure() failed (ret == 0x%08x)", - __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - goto local_cleanup; - } - - LOGV(" frame_structure = %d \n", vaBuf->frame_structure); - - outfilledlen = sizeof(VABuffer); - LOGV("In OMX DEC vadisplay = %x surfaceid = %x outfilledlen = %d\n", - vaBuf->display, vaBuf->surface, outfilledlen); - - outflags |= OMX_BUFFERFLAG_ENDOFFRAME; - retain[INPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; - - (*pBuffers[OUTPORT_INDEX])->nFilledLen = outfilledlen; - (*pBuffers[OUTPORT_INDEX])->nTimeStamp = outtimestamp; - (*pBuffers[OUTPORT_INDEX])->nFlags = outflags; - - outframe_counter++; - -local_cleanup: - - if(frame) { - mix_video_release_frame(mix, frame); - } - - LOGV("%s(),%d: exit, done\n", __func__, __LINE__); - return oret; - } - -normal_start: - - if (coding_type == OMX_VIDEO_CodingH263) { - - LOGV("data = 0x%x size = %d inframe_counter = %d", buffer_in.data, buffer_in.data_size, inframe_counter); - - int min_size = buffer_in.data_size; - if(min_size > 8 ) { - min_size = 8; - } - for(int i = 0; i < min_size; i++) { - LOGV("0x%x ", buffer_in.data[i]); - } - - if (inframe_counter == 0) { - oret = ChangePortParamWithCodecData(buffer_in.data, - buffer_in.data_size, - ports); - if (oret != OMX_ErrorNone) { - LOGE("%s(),%d: exit ChangePortParamWithCodecData failed " - "(ret:0x%08x)\n", - __func__, __LINE__, oret); - goto out; - } - - oret = ChangeVcpWithPortParam(vcp, - static_cast<PortVideo *>(ports[INPORT_INDEX]), - NULL); - if (oret != OMX_ErrorNone) { - LOGE("%s(),%d: exit ChangeVcpWithPortParam failed " - "(ret:0x%08x)\n", __func__, __LINE__, oret); - goto out; - } - - mret = mix_videoconfigparamsdec_set_header( - MIX_VIDEOCONFIGPARAMSDEC(vcp), &buffer_in); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), %d: exit, " - "mix_videoconfigparamsdec_set_header failed " - "(ret:0x%08x)", __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - goto out; - } - mret = mix_video_configure(mix, vcp, NULL); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), %d: exit, mix_video_configure failed " - "(ret:0x%08x)", __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - if(mret == MIX_RESULT_NO_MEMORY) { - oret = OMX_ErrorInsufficientResources; - } else if(mret == MIX_RESULT_NOT_PERMITTED) { - oret = (OMX_ERRORTYPE)OMX_ErrorIntelVideoNotPermitted;; - } - goto out; - } - is_mixvideodec_configured = OMX_TRUE; - LOGV("%s(): mix video configured", __func__); - - /* - * port reconfigure - */ - ports[OUTPORT_INDEX]->ReportPortSettingsChanged(); - } - } - - /* only in case of decode mode */ - if (((*pBuffers[INPORT_INDEX])->nFlags & OMX_BUFFERFLAG_ENDOFFRAME) && - ((*pBuffers[INPORT_INDEX])->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) { - - if (coding_type == OMX_VIDEO_CodingAVC) { - if (inframe_counter == 0) { - -#if 0 - oret = ChangePortParamWithCodecData(buffer_in.data, - buffer_in.data_size, ports); - if (oret != OMX_ErrorNone) { - LOGE("%s(),%d: exit ChangePortParamWithCodecData failed " - "(ret:0x%08x)\n", __func__, __LINE__, oret); - goto out; - } -#endif - - oret = ChangeVcpWithPortParam(vcp, - static_cast<PortVideo *> (ports[INPORT_INDEX]), NULL); - if (oret != OMX_ErrorNone) { - LOGE("%s(),%d: exit ChangeVcpWithPortParam failed " - "(ret:0x%08x)\n", __func__, __LINE__, oret); - goto out; - } - - mret = mix_video_configure(mix, vcp, NULL); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), %d: exit, mix_video_configure failed " - "(ret:0x%08x)", __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - if(mret == MIX_RESULT_NO_MEMORY) { - oret = OMX_ErrorInsufficientResources; - } else if(mret == MIX_RESULT_NOT_PERMITTED) { - oret = (OMX_ERRORTYPE)OMX_ErrorIntelVideoNotPermitted;; - } - goto out; - } - is_mixvideodec_configured = OMX_TRUE; - LOGV("%s(): mix video configured", __func__); - -#if 0 - /* - * port reconfigure - */ - ports[OUTPORT_INDEX]->ReportPortSettingsChanged(); -#endif - } /* inframe_counter */ - } /* OMX_VIDEO_CodingAVC */ - else if (coding_type == OMX_VIDEO_CodingMPEG4) { - if (inframe_counter == 0) { - oret = ChangePortParamWithCodecData(buffer_in.data, - buffer_in.data_size, - ports); - if (oret != OMX_ErrorNone) { - LOGE("%s(),%d: exit ChangePortParamWithCodecData failed " - "(ret:0x%08x)\n", - __func__, __LINE__, oret); - goto out; - } - - oret = ChangeVcpWithPortParam(vcp, - static_cast<PortVideo *>(ports[INPORT_INDEX]), - NULL); - if (oret != OMX_ErrorNone) { - LOGE("%s(),%d: exit ChangeVcpWithPortParam failed " - "(ret:0x%08x)\n", __func__, __LINE__, oret); - goto out; - } - - mret = mix_videoconfigparamsdec_set_header( - MIX_VIDEOCONFIGPARAMSDEC(vcp), &buffer_in); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), %d: exit, " - "mix_videoconfigparamsdec_set_header failed " - "(ret:0x%08x)", __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - goto out; - } - mret = mix_video_configure(mix, vcp, NULL); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), %d: exit, mix_video_configure failed " - "(ret:0x%08x)", __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - if(mret == MIX_RESULT_NO_MEMORY) { - oret = OMX_ErrorInsufficientResources; - } else if(mret == MIX_RESULT_NOT_PERMITTED) { - oret = (OMX_ERRORTYPE)OMX_ErrorIntelVideoNotPermitted;; - } - goto out; - } - is_mixvideodec_configured = OMX_TRUE; - LOGV("%s(): mix video configured", __func__); - - /* - * port reconfigure - */ - ports[OUTPORT_INDEX]->ReportPortSettingsChanged(); - goto out; - } - } /* OMX VIDEO_CodingMPEG4 */ - } /* OMX_BUFFERFLAG_ENDOFFRAME && OMX_BUFFERFLAG_CODECCONFIG */ - - /* get MixBuffer */ - mret = mix_video_get_mixbuffer(mix, &mixbuffer_in[0]); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), %d: exit, mix_video_get_mixbuffer failed (ret:0x%08x)", - __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - goto out; - } - - /* fill MixBuffer */ - mret = mix_buffer_set_data(mixbuffer_in[0], - buffer_in.data, buffer_in.data_size, - 0, NULL); - - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), %d: exit, mix_buffer_set_data failed (ret:0x%08x)", - __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - goto out; - } - - /* decoder */ - MixVideoFrame *frame; - - /* set timestamp */ - outtimestamp = (*pBuffers[INPORT_INDEX])->nTimeStamp; - - mix_videodecodeparams_set_timestamp(MIX_VIDEODECODEPARAMS(mvp), - outtimestamp); - LOGV("--- Input timestamp = %"G_GINT64_FORMAT" ---\n", outtimestamp); - - { - unsigned char *nal = buffer_in.data; - LOGV("%s(), nal_type = 0x%x", __func__, *nal & 0x1F); - } - - retry_decode_count = 0; - -retry_decode: - mret = mix_video_decode(mix, - mixbuffer_in, 1, - MIX_VIDEODECODEPARAMS(mvp)); - if (mret != MIX_RESULT_SUCCESS) { - if (mret == MIX_RESULT_OUTOFSURFACES) { - LOGV("%s(),%d: mix_video_decode() failed, " - "out of surfaces waits 10000 us and try again\n", - __func__, __LINE__); - - if(retry_decode_count ++ > 100) { - oret = OMX_ErrorUndefined; - goto out; - } - - usleep(10000); - goto retry_decode; - } else if (mret != MIX_RESULT_DROPFRAME && - mret != MIX_RESULT_ERROR_PROCESS_STREAM && - mret != MIX_RESULT_MISSING_CONFIG) { - - LOGE("%s(),%d: exit, mix_video_decode() failed\n", - __func__, __LINE__); - - oret = OMX_ErrorUndefined; - if(mret == MIX_RESULT_NO_MEMORY) { - oret = OMX_ErrorInsufficientResources; - } else if(mret == MIX_RESULT_NOT_PERMITTED) { - oret = (OMX_ERRORTYPE)OMX_ErrorIntelVideoNotPermitted;; - } - goto out; - } - } - - { - MixVideoDecodeParams * decode_params = MIX_VIDEODECODEPARAMS(mvp); - LOGV("%s(), decode_params->new_sequence = %d", __func__, decode_params->new_sequence); - } - - /* decide whether or not to send port setting change event */ - if (coding_type == OMX_VIDEO_CodingAVC) { - if (mret == MIX_RESULT_SUCCESS) { - - MixVideoDecodeParams * decode_params = MIX_VIDEODECODEPARAMS(mvp); - if (avcDecGotRes == OMX_FALSE || decode_params->new_sequence) { - LOGV("%s(), avcDecGotRes == OMX_FALSE || decode_params->new_sequence", __func__); - - avcDecGotRes = OMX_TRUE; - MixVideoConfigParams *config_params = NULL; - mret = mix_video_get_config(mix, &config_params); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(),%d: exit, mix_video_get_config() failed\n", - __func__, __LINE__); - oret = OMX_ErrorUndefined; - goto out; - } - - PortAvc *avcport = - static_cast<PortAvc *> (ports[INPORT_INDEX]); - OMX_PARAM_PORTDEFINITIONTYPE avcpd; - memcpy(&avcpd, avcport->GetPortDefinition(), - sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); - - MixVideoConfigParamsDec *config_params_dec = - MIX_VIDEOCONFIGPARAMSDEC(config_params); - avcDecFrameWidth = config_params_dec->picture_width - - config_params_dec->crop_left - config_params_dec->crop_right; - avcDecFrameHeight = config_params_dec->picture_height - - config_params_dec->crop_top - config_params_dec->crop_bottom; - - if(avcDecodeSettings.nMaxWidth != 0 && avcDecodeSettings.nMaxHeight != 0) { - if(avcDecFrameWidth > avcDecodeSettings.nMaxWidth || - avcDecFrameHeight > avcDecodeSettings.nMaxHeight) { - oret = (OMX_ERRORTYPE)OMX_ErrorIntelVideoNotPermitted; - goto out; - } - } - - LOGV("%s(), avcDecFrameWidth = %d avcDecFrameHeight = %d", - __func__, avcDecFrameWidth, avcDecFrameHeight); - LOGV("%s(), avcpd.format.video.nFrameWidth = %d avcpd.format.video.nFrameHeight = %d", - __func__, avcpd.format.video.nFrameWidth, avcpd.format.video.nFrameHeight); - - if (avcDecFrameWidth != avcpd.format.video.nFrameWidth || - avcDecFrameHeight != avcpd.format.video.nFrameHeight) { - - LOGV("%s(), calls to ChangePortParamWithCodecData", __func__); - oret = ChangePortParamWithCodecData(buffer_in.data, - buffer_in.data_size, ports); - if (oret != OMX_ErrorNone) { - LOGE("%s(),%d: exit ChangePortParamWithCodecData failed " - "(ret:0x%08x)\n", __func__, __LINE__, oret); - goto out; - } - - LOGV("%s(), resolution change is detected!", __func__); - LOGV("%s(), calls to ReportPortSettingsChanged", __func__); - ports[OUTPORT_INDEX]->ReportPortSettingsChanged(); - } - mix_videoconfigparams_unref(config_params); - } - } - } - - LOGV("%s(), mix_video_decode() returns 0x%x", __func__, mret); - if(mret == MIX_RESULT_DROPFRAME || - mret == MIX_RESULT_ERROR_PROCESS_STREAM || - mret == MIX_RESULT_MISSING_CONFIG ) { - LOGE("%s(),%d: mix_video_decode() failed, " - "frame dropped\n", - __func__, __LINE__); - /* not an error */ - oret = OMX_ErrorNone; - retain[OUTPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; - if (mret == MIX_RESULT_ERROR_PROCESS_STREAM) { - oret = (OMX_ERRORTYPE)OMX_ErrorIntelProcessStream; - } else if (mret == MIX_RESULT_MISSING_CONFIG) { - oret = (OMX_ERRORTYPE)OMX_ErrorIntelMissingConfig; - } - goto out; - } - - mret = mix_video_get_frame(mix, &frame); - if (mret != MIX_RESULT_SUCCESS) { - if (mret == MIX_RESULT_FRAME_NOTAVAIL) { - LOGV("%s(), partial frame, waits for next turn " - "(ret == 0x%08x)", __func__, mret); - retain[OUTPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; - oret = OMX_ErrorNone; - goto out; - } - else { - LOGE("%s(), %d mix_video_get_frame() failed (ret == 0x%08x)", - __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - goto out; - } - } - - vaBuf = (VABuffer *)(mixiovec_out[0]->data); - mret = mix_videoframe_get_frame_id(frame, (ulong *)&vaBuf->surface); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), %d mix_videoframe_get_frame_id() failed (ret == 0x%08x)", - __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - goto out; - } - mret = mix_videoframe_get_vadisplay(frame, (void **)&vaBuf->display); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), %d mix_videoframe_get_vadisplay() failed (ret == 0x%08x)", - __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - goto out; - } - -#if 1 - mret = mix_videoframe_get_timestamp(frame, (uint64 *)&outtimestamp); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), %d mix_videoframe_get_timestamp() failed (ret == 0x%08x)", - __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - goto out; - } - - LOGV("--- Output timestamp = %"G_GINT64_FORMAT"\n ---", outtimestamp); -#endif - mret = mix_videoframe_get_frame_structure(frame, (uint32 *)&vaBuf->frame_structure); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), %d mix_videoframe_get_frame_structure() failed (ret == 0x%08x)", - __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - goto out; - } - - LOGV(" frame_structure = %d \n", vaBuf->frame_structure); - - outfilledlen = sizeof(VABuffer); - LOGV("In OMX DEC vadisplay = %x surfaceid = %x outfilledlen = %d\n", - vaBuf->display, vaBuf->surface, outfilledlen); - -release_frame: - mret = mix_video_release_frame(mix, frame); - if (mret != MIX_RESULT_SUCCESS) { - LOGE("%s(), %d mix_video_release_frame() failed (ret == 0x%08x)", - __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - goto out; - } - - outflags |= OMX_BUFFERFLAG_ENDOFFRAME; - -#if SHOW_FPS - { - struct timeval t; - OMX_TICKS current_ts, interval_ts; - float current_fps, average_fps; - - t.tv_sec = t.tv_usec = 0; - gettimeofday(&t, NULL); - - current_ts = - (nsecs_t)t.tv_sec * 1000000000 + (nsecs_t)t.tv_usec * 1000; - interval_ts = current_ts - last_ts; - last_ts = current_ts; - - current_fps = (float)1000000000 / (float)interval_ts; - average_fps = (current_fps + last_fps) / 2; - last_fps = current_fps; - - LOGD("FPS = %2.1f\n", average_fps); - } -#endif - -out: - if (mixbuffer_in[0]) { - mix_video_release_mixbuffer(mix, mixbuffer_in[0]); - mixbuffer_in[0] = NULL; - } - - if(retain[OUTPORT_INDEX] != BUFFER_RETAIN_GETAGAIN) { - (*pBuffers[OUTPORT_INDEX])->nFilledLen = outfilledlen; - (*pBuffers[OUTPORT_INDEX])->nTimeStamp = outtimestamp; - (*pBuffers[OUTPORT_INDEX])->nFlags = outflags; - } - - if (retain[INPORT_INDEX] == BUFFER_RETAIN_NOT_RETAIN || - retain[INPORT_INDEX] == BUFFER_RETAIN_ACCUMULATE ) { - inframe_counter++; -// buffers[INPORT_INDEX]->nFilledLen = 0; - } - - if (retain[OUTPORT_INDEX] == BUFFER_RETAIN_NOT_RETAIN) - outframe_counter++; - -#if 0 - if (retain[OUTPORT_INDEX] == BUFFER_RETAIN_NOT_RETAIN) - DumpBuffer(buffers[OUTPORT_INDEX], false); -#endif - - if (coding_type == OMX_VIDEO_CodingAVC) { - - // TODO: add a flag to differentiate VCM and normal decoding. For now, just to max res - if (avcDecodeSettings.nMaxWidth == 0 || - avcDecodeSettings.nMaxHeight == 0) { - if (oret == (OMX_ERRORTYPE) OMX_ErrorIntelProcessStream) { - oret = OMX_ErrorNone; - } - if (oret == (OMX_ERRORTYPE) OMX_ErrorIntelMissingConfig) { - oret = OMX_ErrorNone; - } - } - } - - LOGV_IF(oret == OMX_ErrorNone, - "%s(),%d: exit, decode is done\n", __func__, __LINE__); - - return oret; -} - -/* end of implement ComponentBase::Processor[*] */ - -/* - * vcp setting helpers - */ -OMX_ERRORTYPE MrstPsbComponent::__AvcChangePortParamWithCodecData( - const OMX_U8 *codec_data, OMX_U32 size, PortBase **ports) -{ - PortAvc *avcport = static_cast<PortAvc *>(ports[INPORT_INDEX]); - PortVideo *rawport = static_cast<PortVideo *>(ports[OUTPORT_INDEX]); - - OMX_PARAM_PORTDEFINITIONTYPE avcpd, rawpd; - - unsigned int width, height, stride, sliceheight; - - int ret; - - memcpy(&avcpd, avcport->GetPortDefinition(), - sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); - -#if 1 - - width = avcDecFrameWidth; - height = avcDecFrameHeight; - stride = width; - sliceheight = height; - -#else - LOGV("nFrameWidth = %lu", avcpd.format.video.nFrameWidth); - LOGV("nFrameHeight = %lu", avcpd.format.video.nFrameHeight); - LOGV("nStride = %lu", avcpd.format.video.nStride); - LOGV("nSliceHeight = %lu", avcpd.format.video.nSliceHeight); - - width = avcpd.format.video.nFrameWidth; - height = avcpd.format.video.nFrameHeight; - stride = width; - sliceheight = height; -#endif - - if (avcpd.format.video.nFrameWidth != width) { - LOGV("%s(): width : %lu != %d", __func__, - avcpd.format.video.nFrameWidth, width); - avcpd.format.video.nFrameWidth = width; - } - if (avcpd.format.video.nFrameHeight != height) { - LOGV("%s(): height : %lu != %d", __func__, - avcpd.format.video.nFrameHeight, height); - avcpd.format.video.nFrameHeight = height; - } - if (avcpd.format.video.nStride != (OMX_S32)stride) { - LOGV("%s(): stride : %lu != %d", __func__, - avcpd.format.video.nStride, stride); - avcpd.format.video.nStride = stride; - } - if (avcpd.format.video.nSliceHeight != sliceheight) { - LOGV("%s(): sliceheight : %ld != %d", __func__, - avcpd.format.video.nSliceHeight, sliceheight); - avcpd.format.video.nSliceHeight = sliceheight; - } - - memcpy(&rawpd, rawport->GetPortDefinition(), - sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); - - if (rawpd.format.video.nFrameWidth != width) - rawpd.format.video.nFrameWidth = width; - if (rawpd.format.video.nFrameHeight != height) - rawpd.format.video.nFrameHeight = height; - if (rawpd.format.video.nStride != (OMX_S32)stride) - rawpd.format.video.nStride = stride; - if (rawpd.format.video.nSliceHeight != sliceheight) - rawpd.format.video.nSliceHeight = sliceheight; - - rawpd.nBufferSize = (stride * sliceheight * 3) >> 1; - - avcport->SetPortDefinition(&avcpd, true); - rawport->SetPortDefinition(&rawpd, true); - - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstPsbComponent::__Mpeg4ChangePortParamWithCodecData( - const OMX_U8 *codec_data, OMX_U32 size, PortBase **ports) -{ - PortMpeg4 *mpeg4port = static_cast<PortMpeg4 *>(ports[INPORT_INDEX]); - PortVideo *rawport = static_cast<PortVideo *>(ports[OUTPORT_INDEX]); - - OMX_PARAM_PORTDEFINITIONTYPE mpeg4pd, rawpd; - - unsigned int width, height, stride, sliceheight; - - memcpy(&mpeg4pd, mpeg4port->GetPortDefinition(), - sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); - - LOGV("nFrameWidth = %lu", mpeg4pd.format.video.nFrameWidth); - LOGV("nFrameHeight = %lu", mpeg4pd.format.video.nFrameHeight); - LOGV("nStride = %lu", mpeg4pd.format.video.nStride); - LOGV("nSliceHeight = %lu", mpeg4pd.format.video.nSliceHeight); - - width = mpeg4pd.format.video.nFrameWidth; - height = mpeg4pd.format.video.nFrameHeight; - stride = width; - sliceheight = height; - - if (mpeg4pd.format.video.nFrameWidth != width) { - LOGV("%s(): width : %lu != %d", __func__, - mpeg4pd.format.video.nFrameWidth, width); - mpeg4pd.format.video.nFrameWidth = width; - } - if (mpeg4pd.format.video.nFrameHeight != height) { - LOGV("%s(): height : %lu != %d", __func__, - mpeg4pd.format.video.nFrameHeight, height); - mpeg4pd.format.video.nFrameHeight = height; - } - if (mpeg4pd.format.video.nStride != (OMX_S32)stride) { - LOGV("%s(): stride : %lu != %d", __func__, - mpeg4pd.format.video.nStride, stride); - mpeg4pd.format.video.nStride = stride; - } - if (mpeg4pd.format.video.nSliceHeight != sliceheight) { - LOGV("%s(): sliceheight : %ld != %d", __func__, - mpeg4pd.format.video.nSliceHeight, sliceheight); - mpeg4pd.format.video.nSliceHeight = sliceheight; - } - - memcpy(&rawpd, rawport->GetPortDefinition(), - sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); - - if (rawpd.format.video.nFrameWidth != width) - rawpd.format.video.nFrameWidth = width; - if (rawpd.format.video.nFrameHeight != height) - rawpd.format.video.nFrameHeight = height; - if (rawpd.format.video.nStride != (OMX_S32)stride) - rawpd.format.video.nStride = stride; - if (rawpd.format.video.nSliceHeight != sliceheight) - rawpd.format.video.nSliceHeight = sliceheight; - - rawpd.nBufferSize = (stride * sliceheight * 3) >> 1; - - mpeg4port->SetPortDefinition(&mpeg4pd, true); - rawport->SetPortDefinition(&rawpd, true); - - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstPsbComponent::__H263ChangePortParamWithCodecData( - const OMX_U8 *codec_data, OMX_U32 size, PortBase **ports) -{ - PortH263 *h263port = static_cast<PortH263 *>(ports[INPORT_INDEX]); - PortVideo *rawport = static_cast<PortVideo *>(ports[OUTPORT_INDEX]); - - OMX_PARAM_PORTDEFINITIONTYPE h263pd, rawpd; - - unsigned int width, height, stride, sliceheight; - unsigned int display_width, display_height; - - H263HeaderParser h263_header_parser; - OMX_BOOL result; - result = h263_header_parser.DecodeH263Header((OMX_U8 *) codec_data, - (int32 *) &width, (int32 *) &height, (int32 *) &display_width, - (int32 *) &display_height); - if(OMX_FALSE ==result) - return OMX_ErrorBadParameter; - - memcpy(&h263pd, h263port->GetPortDefinition(), - sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); - - LOGV("width = %lu", width); - LOGV("height = %lu", height); - LOGV("nFrameWidth = %lu", h263pd.format.video.nFrameWidth); - LOGV("nFrameHeight = %lu", h263pd.format.video.nFrameHeight); - LOGV("nStride = %lu", h263pd.format.video.nStride); - LOGV("nSliceHeight = %lu", h263pd.format.video.nSliceHeight); - -// width = h263pd.format.video.nFrameWidth; -// height = h263pd.format.video.nFrameHeight; - - h263pd.format.video.nFrameWidth = width; - h263pd.format.video.nFrameHeight = height; - h263pd.format.video.nStride = width; - h263pd.format.video.nSliceHeight = height; - - stride = width; - sliceheight = height; - - if (h263pd.format.video.nFrameWidth != width) { - LOGV("%s(): width : %lu != %d", __func__, - h263pd.format.video.nFrameWidth, width); - h263pd.format.video.nFrameWidth = width; - } - if (h263pd.format.video.nFrameHeight != height) { - LOGV("%s(): height : %lu != %d", __func__, - h263pd.format.video.nFrameHeight, height); - h263pd.format.video.nFrameHeight = height; - } - if (h263pd.format.video.nStride != (OMX_S32)stride) { - LOGV("%s(): stride : %lu != %d", __func__, - h263pd.format.video.nStride, stride); - h263pd.format.video.nStride = stride; - } - if (h263pd.format.video.nSliceHeight != sliceheight) { - LOGV("%s(): sliceheight : %ld != %d", __func__, - h263pd.format.video.nSliceHeight, sliceheight); - h263pd.format.video.nSliceHeight = sliceheight; - } - - memcpy(&rawpd, rawport->GetPortDefinition(), - sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); - - if (rawpd.format.video.nFrameWidth != width) - rawpd.format.video.nFrameWidth = width; - if (rawpd.format.video.nFrameHeight != height) - rawpd.format.video.nFrameHeight = height; - if (rawpd.format.video.nStride != (OMX_S32)stride) - rawpd.format.video.nStride = stride; - if (rawpd.format.video.nSliceHeight != sliceheight) - rawpd.format.video.nSliceHeight = sliceheight; - - rawpd.nBufferSize = (stride * sliceheight * 3) >> 1; - - h263port->SetPortDefinition(&h263pd, true); - rawport->SetPortDefinition(&rawpd, true); - - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstPsbComponent::ChangePortParamWithCodecData( - const OMX_U8 *codec_data, - OMX_U32 size, - PortBase **ports) -{ - OMX_ERRORTYPE ret = OMX_ErrorBadParameter; - - if (coding_type == OMX_VIDEO_CodingAVC) { - ret = __AvcChangePortParamWithCodecData(codec_data, size, ports); - } - else if (coding_type == OMX_VIDEO_CodingMPEG4) { - ret = __Mpeg4ChangePortParamWithCodecData(codec_data, size, ports); - } - else if (coding_type == OMX_VIDEO_CodingH263) { - ret = __H263ChangePortParamWithCodecData(codec_data, size, ports); - } - - return ret; -} - -OMX_ERRORTYPE MrstPsbComponent::__AvcChangeVcpWithPortParam( - MixVideoConfigParams *vcp, PortAvc *port, bool *vcp_changed) -{ - OMX_ERRORTYPE ret = OMX_ErrorNone; - - /* mime type */ - mix_videoconfigparamsdec_set_mime_type(MIX_VIDEOCONFIGPARAMSDEC(vcp), - "video/x-h264"); - - return ret; -} - -OMX_ERRORTYPE MrstPsbComponent::__Mpeg4ChangeVcpWithPortParam( - MixVideoConfigParams *vcp, PortMpeg4 *port, bool *vcp_changed) -{ - OMX_ERRORTYPE ret = OMX_ErrorNone; - - mix_videoconfigparamsdec_set_mime_type(MIX_VIDEOCONFIGPARAMSDEC(vcp), - "video/mpeg"); - mix_videoconfigparamsdec_mp42_set_mpegversion( - MIX_VIDEOCONFIGPARAMSDEC_MP42(vcp), 4); - - return ret; -} - -OMX_ERRORTYPE MrstPsbComponent::__H263ChangeVcpWithPortParam( - MixVideoConfigParams *vcp, PortH263 *port, bool *vcp_changed) -{ - OMX_ERRORTYPE ret = OMX_ErrorNone; - - mix_videoconfigparamsdec_set_mime_type(MIX_VIDEOCONFIGPARAMSDEC(vcp), - "video/mpeg"); - mix_videoconfigparamsdec_mp42_set_mpegversion( - MIX_VIDEOCONFIGPARAMSDEC_MP42(vcp), 4); - - return ret; -} - -OMX_ERRORTYPE MrstPsbComponent::ChangeVcpWithPortParam( - MixVideoConfigParams *vcp, - PortVideo *port, - bool *vcp_changed) -{ - const OMX_PARAM_PORTDEFINITIONTYPE *pd = port->GetPortDefinition(); - OMX_ERRORTYPE ret; - - if (coding_type == OMX_VIDEO_CodingAVC) - ret = __AvcChangeVcpWithPortParam(vcp, - static_cast<PortAvc *>(port), - vcp_changed); - else if (coding_type == OMX_VIDEO_CodingMPEG4) - ret = __Mpeg4ChangeVcpWithPortParam(vcp, - static_cast<PortMpeg4 *>(port), - vcp_changed); - else if (coding_type == OMX_VIDEO_CodingH263) - ret = __H263ChangeVcpWithPortParam(vcp, - static_cast<PortH263 *>(port), - vcp_changed); - else - ret = OMX_ErrorBadParameter; - - - MixVideoConfigParamsDec *config = MIX_VIDEOCONFIGPARAMSDEC(vcp); - - if (config->frame_rate_num != (pd->format.video.xFramerate >> 16)) { - LOGV("%s(): framerate : %u != %ld", __func__, - config->frame_rate_num, pd->format.video.xFramerate >> 16); - mix_videoconfigparamsdec_set_frame_rate(config, - pd->format.video.xFramerate >> 16, - 1); - if (vcp_changed) - *vcp_changed = true; - } - - if ((config->picture_width != pd->format.video.nFrameWidth) || - (config->picture_height != pd->format.video.nFrameHeight)) { - LOGV("%s(): width : %ld != %ld", __func__, - config->picture_width, pd->format.video.nFrameWidth); - LOGV("%s(): height : %ld != %ld", __func__, - config->picture_height, pd->format.video.nFrameHeight); - - mix_videoconfigparamsdec_set_picture_res(config, - pd->format.video.nFrameWidth, - pd->format.video.nFrameHeight); - if (vcp_changed) - *vcp_changed = true; - } - - if (coding_type == OMX_VIDEO_CodingAVC) { - if(avcDecodeSettings.nMaxWidth > config->picture_width && - avcDecodeSettings.nMaxHeight > config->picture_height) { - mix_videoconfigparamsdec_set_picture_res(config, - avcDecodeSettings.nMaxWidth, avcDecodeSettings.nMaxHeight); - } - } - - /* hard coding */ - mix_videoconfigparamsdec_set_frame_order_mode( -// MIX_VIDEOCONFIGPARAMSDEC(vcp), MIX_FRAMEORDER_MODE_DECODEORDER); - MIX_VIDEOCONFIGPARAMSDEC(vcp), MIX_FRAMEORDER_MODE_DISPLAYORDER); - mix_videoconfigparamsdec_set_buffer_pool_size( - MIX_VIDEOCONFIGPARAMSDEC(vcp), 8); - - if (coding_type == OMX_VIDEO_CodingAVC) { - mix_videoconfigparamsdec_set_extra_surface_allocation( - MIX_VIDEOCONFIGPARAMSDEC(vcp), avcDecodeSettings.nMaxNumberOfReferenceFrame); - } else { - mix_videoconfigparamsdec_set_extra_surface_allocation( - MIX_VIDEOCONFIGPARAMSDEC(vcp), 4); - } - - return ret; -} - -/* end of vcp setting helpers */ - -OMX_ERRORTYPE MrstPsbComponent::ProcessorFlush(OMX_U32 port_index) { - - LOGV("port_index = %d Flushed!\n", port_index); - - if (port_index == INPORT_INDEX || - port_index == OMX_ALL) { - mix_video_flush( mix); - } - - return OMX_ErrorNone; -} - -void MrstPsbComponent::AvcEncMixBufferCallback(ulong token, uchar *data) { - MrstPsbComponent *_this = (MrstPsbComponent *) token; - - LOGV("AvcEncMixBufferCallback Begin\n"); - - if(_this) { - _this->ports[_this->INPORT_INDEX]->ReturnAllRetainedBuffers(); - } - - LOGV("AvcEncMixBufferCallback End\n"); -} - -/* - * CModule Interface - */ -#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) - -static const char *g_name = (const char *)"OMX.Intel.Mrst.PSB.Dec"; - -static const char *g_roles[] = -{ - (const char *)"video_decoder.avc", - (const char *)"video_decoder.mpeg4", - (const char *)"video_decoder.h263", -}; - -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-dec/psb.h b/psb-dec/psb.h deleted file mode 100644 index a21b7d7..0000000 --- a/psb-dec/psb.h +++ /dev/null @@ -1,198 +0,0 @@ -/* - * psb.h, omx psb component header - * - * Copyright (c) 2009-2010 Wind River Systems, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#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> -#define oscl_memset memset -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 __AllocateMpeg4Port(OMX_U32 port_index, OMX_DIRTYPE dir); - OMX_ERRORTYPE __AllocateH263Port(OMX_U32 port_index, OMX_DIRTYPE dir); - OMX_ERRORTYPE __AllocateRawPort(OMX_U32 port_index, OMX_DIRTYPE dir); - OMX_ERRORTYPE __AllocateRawVAPort(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 OMX_ERRORTYPE ProcessorFlush(OMX_U32 port_index); - virtual OMX_ERRORTYPE ProcessorProcess(OMX_BUFFERHEADERTYPE ***pBuffers, - buffer_retain_t *retain, - OMX_U32 nr_buffers); - - /* end of component methods & helpers */ - - /* - * vcp setting helpers - */ - OMX_ERRORTYPE __RawChangePortParamWithVcp(MixVideoConfigParams *vcp, - PortVideo *port); - OMX_ERRORTYPE __AvcChangePortParamWithVcp(MixVideoConfigParams *vcp, - PortAvc *port); - OMX_ERRORTYPE __Mpeg4ChangePortParamWithVcp(MixVideoConfigParams *vcp, - PortMpeg4 *port); - OMX_ERRORTYPE ChangePortParamWithVcp(void); - - OMX_ERRORTYPE __AvcChangeVcpWithPortParam(MixVideoConfigParams *vcp, - PortAvc *port, bool *vcp_changed); - OMX_ERRORTYPE __Mpeg4ChangeVcpWithPortParam(MixVideoConfigParams *vcp, - PortMpeg4 *port, bool *vcp_changed); - OMX_ERRORTYPE __H263ChangeVcpWithPortParam(MixVideoConfigParams *vcp, - PortH263 *port, bool *vcp_changed); - OMX_ERRORTYPE ChangeVcpWithPortParam(MixVideoConfigParams *vcp, - PortVideo *port, bool *vcp_changed); - - OMX_ERRORTYPE __AvcChangePortParamWithCodecData(const OMX_U8 *codec_data, - OMX_U32 size, - PortBase **ports); - OMX_ERRORTYPE __Mpeg4ChangePortParamWithCodecData(const OMX_U8 *codec_data, - OMX_U32 size, - PortBase **ports); - OMX_ERRORTYPE __H263ChangePortParamWithCodecData(const OMX_U8 *codec_data, - OMX_U32 size, - PortBase **ports); - OMX_ERRORTYPE ChangePortParamWithCodecData(const OMX_U8 *codec_data, - OMX_U32 size, - PortBase **ports); - - static void AvcEncMixBufferCallback(ulong token, uchar *data); - - /* end of vcp setting helpers */ - - /* mix video */ - MixVideo *mix; - MixVideoInitParams *vip; - MixParams *mvp; - MixVideoConfigParams *vcp; - MixDisplayAndroid *display; - MixBuffer *mixbuffer_in[1]; - MixIOVec *mixiovec_out[1]; - - OMX_VIDEO_CODINGTYPE coding_type; - MixCodecMode codec_mode; - - OMX_BOOL is_mixvideodec_configured; - - OMX_U32 inframe_counter; - OMX_U32 outframe_counter; - - /* for fps */ - OMX_TICKS last_ts; - float last_fps; - - OMX_U8 *avc_enc_buffer; - OMX_U32 avc_enc_buffer_offset; - OMX_U32 avc_enc_buffer_length; - OMX_U32 avc_enc_frame_size_left; - - OMX_NALUFORMATSTYPE avcEncNaluFormatType; - OMX_U32 avcEncIDRPeriod; - OMX_U32 avcEncPFrames; - - OMX_VIDEO_PARAM_INTEL_BITRATETYPE avcEncParamIntelBitrateType; - OMX_VIDEO_CONFIG_INTEL_BITRATETYPE avcEncConfigIntelBitrateType; - OMX_VIDEO_CONFIG_NALSIZE avcEncConfigNalSize; - OMX_VIDEO_CONFIG_INTEL_SLICE_NUMBERS avcEncConfigSliceNumbers; - OMX_VIDEO_CONFIG_INTEL_AIR avcEncConfigAir; - OMX_CONFIG_FRAMERATETYPE avcEncFramerate; - - OMX_VIDEO_PARAM_INTEL_AVC_DECODE_SETTINGS avcDecodeSettings; - OMX_U32 avcDecFrameWidth; - OMX_U32 avcDecFrameHeight; - OMX_BOOL avcDecGotRes; - - /* constant */ - /* ports */ - const static OMX_U32 NR_PORTS = 2; - const static OMX_U32 INPORT_INDEX = 0; - const static OMX_U32 OUTPORT_INDEX = 1; - - /* default buffer */ - //BZ 1286: change inport buffer number from 256 to 10 to cut down buffering time - const static OMX_U32 INPORT_AVC_ACTUAL_BUFFER_COUNT = 10; - const static OMX_U32 INPORT_AVC_MIN_BUFFER_COUNT = 1; - const static OMX_U32 INPORT_AVC_BUFFER_SIZE = 1382400; //40960; - const static OMX_U32 OUTPORT_AVC_ACTUAL_BUFFER_COUNT = 10; - const static OMX_U32 OUTPORT_AVC_MIN_BUFFER_COUNT = 1; - const static OMX_U32 OUTPORT_AVC_BUFFER_SIZE = 1382400; //480000; - - const static OMX_U32 INPORT_RAW_ACTUAL_BUFFER_COUNT = 5; //2; - const static OMX_U32 INPORT_RAW_MIN_BUFFER_COUNT = 1; - const static OMX_U32 INPORT_RAW_BUFFER_SIZE = 1382400; - 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 = 1382400; - - const static OMX_U32 INPORT_MPEG4_ACTUAL_BUFFER_COUNT = 10; - const static OMX_U32 INPORT_MPEG4_MIN_BUFFER_COUNT = 1; -// const static OMX_U32 INPORT_MPEG4_BUFFER_SIZE = 16000; - const static OMX_U32 INPORT_MPEG4_BUFFER_SIZE = 1382400; - const static OMX_U32 OUTPORT_MPEG4_ACTUAL_BUFFER_COUNT = 2; - const static OMX_U32 OUTPORT_MPEG4_MIN_BUFFER_COUNT = 1; - const static OMX_U32 OUTPORT_MPEG4_BUFFER_SIZE = 1382400; - - const static OMX_U32 INPORT_H263_ACTUAL_BUFFER_COUNT = 10; - const static OMX_U32 INPORT_H263_MIN_BUFFER_COUNT = 1; - const static OMX_U32 INPORT_H263_BUFFER_SIZE = 1382400; - const static OMX_U32 OUTPORT_H263_ACTUAL_BUFFER_COUNT = 2; - const static OMX_U32 OUTPORT_H263_MIN_BUFFER_COUNT = 1; - const static OMX_U32 OUTPORT_H263_BUFFER_SIZE = 1382400; -}; - -#endif /* __WRS_OMXIL_INTEL_MRST_PSB */ diff --git a/psb-dec/vabuffer.h b/psb-dec/vabuffer.h deleted file mode 100644 index 1b0196c..0000000 --- a/psb-dec/vabuffer.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * vabuffer.h, vabuffer structure header - * - * Copyright (c) 2009-2010 Wind River Systems, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __VA_BUFFER_H__ -#define __VA_BUFFER_H__ - -struct VABuffer -{ - VASurfaceID surface; - VADisplay display; - unsigned int frame_structure; -}; - -#endif /* __VA_BUFFER_H__ */ - diff --git a/sst/Android.mk b/sst/Android.mk deleted file mode 100644 index ca094a1..0000000 --- a/sst/Android.mk +++ /dev/null @@ -1,27 +0,0 @@ -LOCAL_PATH := $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := \ - sst.cpp - -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE := libwrs_omxil_intel_mrst_sst - -LOCAL_CPPFLAGS := - -LOCAL_LDFLAGS := - -LOCAL_SHARED_LIBRARIES := \ - libwrs_omxil_common \ - liblog \ - libmixcommon \ - libmixaudio - -LOCAL_C_INCLUDES := \ - $(TARGET_OUT_HEADERS)/wrs_omxil_core \ - $(TARGET_OUT_HEADERS)/khronos/openmax \ - $(PV_INCLUDES) \ - $(TARGET_OUT_HEADERS)/libmixcommon \ - $(TARGET_OUT_HEADERS)/libmixaudio - -include $(BUILD_SHARED_LIBRARY) diff --git a/sst/ebuild.mk b/sst/ebuild.mk deleted file mode 100644 index 7886eb6..0000000 --- a/sst/ebuild.mk +++ /dev/null @@ -1,21 +0,0 @@ -LOCAL_PATH := $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_SRC_FILES := \ - sst.cpp - -LOCAL_MODULE := libwrs_omxil_intel_mrst_sst - -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/sst/sst.cpp b/sst/sst.cpp deleted file mode 100644 index 9134c8c..0000000 --- a/sst/sst.cpp +++ /dev/null @@ -1,1790 +0,0 @@ -/* - * sst.cpp, omx sst component file - * - * Copyright (c) 2009-2010 Wind River Systems, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> - -#include <pthread.h> - -#include <OMX_Core.h> - -#include <audio_parser.h> - -#include <cmodule.h> -#include <portaudio.h> -#include <componentbase.h> - -//#include <pv_omxcore.h> - -#ifdef __cplusplus -extern "C" { -#endif - -#include <mixaudio.h> -#include <mixacpaac.h> -#include <mixacpmp3.h> - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#include "sst.h" - -//#define LOG_NDEBUG 0 - -#define LOG_TAG "mrst_sst" -#include <log.h> - -/* - * TEST FEATURE - * - need to be removed - */ -#define TEST_USE_AAC_ENCODING_RAW 1 /* 1: RAW, 0: ATDS */ -/* 1:variable, 0:44100,12800,2 */ -#define TEST_USE_AAC_ENCODING_VARIABLE_PARAMETER 1 - -/* - * only decode mode - * 0 : Decode Return - * 1 : Direct Render - */ -#define SST_RENDER_MODE_DIRECT_RENDER 1 - -/* - * MixAudioStreamCtrl - */ - -#define SST_USE_STREAM_CTRL_WORKQUEUE 1 - -static const char *mix_audio_command_string -[MixAudioStreamCtrl::MIX_STREAM_RESUME+2] = { - "MIX_STREAM_START", - "MIX_STREAM_STOP_DROP", - "MIX_STREAM_STOP_DRAIN", - "MIX_STREAM_PAUSE", - "MIX_STREAM_RESUME", - "MIX_STREAM_UNKNOWN", -}; - -inline static const char * -get_mix_audio_command_string(MixAudioStreamCtrl::mix_audio_command_t command) -{ - if (command > MixAudioStreamCtrl::MIX_STREAM_RESUME) - command = (MixAudioStreamCtrl::mix_audio_command_t) - (MixAudioStreamCtrl::MIX_STREAM_RESUME+1); - - return mix_audio_command_string[command]; -} - -MixAudioStreamCtrl::MixAudioStreamCtrl(MixAudio *mix) -{ - __queue_init(&q); - pthread_mutex_init(&lock, NULL); - - this->mix = mix; - - StartWork(true); -} - -MixAudioStreamCtrl::~MixAudioStreamCtrl() -{ - mix_audio_command_t *temp; - - CancelScheduledWork(this); - StopWork(); - - while ((temp = PopCommand())) - free(temp); - - pthread_mutex_destroy(&lock); -} - -void MixAudioStreamCtrl::SendCommand(mix_audio_command_t command) -{ - mix_audio_command_t *copy; - - if (command > MIX_STREAM_RESUME) - return; - - copy = (mix_audio_command_t *)malloc(sizeof(*copy)); - if (!copy) - return; - *copy = command; - - LOGV("send mix audio stream command %s\n", - get_mix_audio_command_string(command)); - - pthread_mutex_lock(&lock); - queue_push_tail(&q, copy); - pthread_mutex_unlock(&lock); - - ScheduleWork(); -} - -MixAudioStreamCtrl::mix_audio_command_t *MixAudioStreamCtrl::PopCommand(void) -{ - mix_audio_command_t *command; - - pthread_mutex_lock(&lock); - command = (mix_audio_command_t *)queue_pop_head(&q); - pthread_mutex_unlock(&lock); - - return command; -} - -void MixAudioStreamCtrl::Work(void) -{ - mix_audio_command_t *command; - MIX_RESULT ret; - - command = PopCommand(); - if (command) { - switch ((int)*command) { - case MIX_STREAM_START: - usleep(50000); - ret = mix_audio_start(mix); - break; - case MIX_STREAM_STOP_DROP: - ret = mix_audio_stop_drop(mix); - break; - case MIX_STREAM_STOP_DRAIN: - ret = mix_audio_stop_drain(mix); - break; - case MIX_STREAM_PAUSE: - ret = mix_audio_pause(mix); - break; - case MIX_STREAM_RESUME: - ret = mix_audio_resume(mix); - break; - default: - ret = MIX_RESULT_FAIL; - LOGE("cannot handle mix audio stream command (%d)", *command); - } - - if (MIX_SUCCEEDED(ret)) - LOGV("done mix audio stream command %s\n", - get_mix_audio_command_string(*command)); - else - LOGE("failed mix audio stream command %s (ret : 0x%08x)\n", - get_mix_audio_command_string(*command), ret); - - free(command); - } -} - -/* end of MixAudioStreamCtrl */ - -/* - * 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) -{ - PortBase **ports; - - OMX_U32 codec_port_index, pcm_port_index; - OMX_DIRTYPE codec_port_dir, pcm_port_dir; - - OMX_PORT_PARAM_TYPE portparam; - - bool isencoder; - const char *working_role; - - 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; - - working_role = GetWorkingRole(); - if (!strncmp(working_role, "audio_decoder", strlen("audio_decoder"))) - isencoder = false; - else - isencoder = true; - - if (isencoder) { - pcm_port_index = INPORT_INDEX; - codec_port_index = OUTPORT_INDEX; - pcm_port_dir = OMX_DirInput; - codec_port_dir = OMX_DirOutput; - } - else { - codec_port_index = INPORT_INDEX; - pcm_port_index = OUTPORT_INDEX; - codec_port_dir = OMX_DirInput; - pcm_port_dir = OMX_DirOutput; - } - - working_role = strpbrk(working_role, "."); - if (!working_role) - return OMX_ErrorUndefined; - working_role++; - - if (!strcmp(working_role, "mp3")) { - ret = __AllocateMp3Port(codec_port_index, codec_port_dir); - coding_type = OMX_AUDIO_CodingMP3; - } - else if(!strcmp(working_role, "aac")) { - ret = __AllocateAacPort(codec_port_index, codec_port_dir); - coding_type = OMX_AUDIO_CodingAAC; - } - else - ret = OMX_ErrorUndefined; - - if (ret != OMX_ErrorNone) - goto free_ports; - - ret = __AllocatePcmPort(pcm_port_index, pcm_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 */ - - codec_mode = isencoder ? MIX_CODING_ENCODE : MIX_CODING_DECODE; - - 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_AUDIO_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 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 = (char *)"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 = 128000; - mp3portparam.nSampleRate = 44100; - 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::__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 = (char *)"audio/mp4"; - 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 = 128000; - aacportparam.nSampleRate = 44100; - 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) -{ - 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 = (char *)"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; - - 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; - - 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; - } - case OMX_IndexParamAudioAac: { - OMX_AUDIO_PARAM_AACPROFILETYPE *p = - (OMX_AUDIO_PARAM_AACPROFILETYPE *)pComponentParameterStructure; - OMX_U32 index = p->nPortIndex; - PortAac *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<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; - } -#if 0 - 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; - p->iOMXComponentSupportsMovableInputBuffers = OMX_TRUE; - p->iOMXComponentUsesNALStartCodes = OMX_TRUE; - p->iOMXComponentSupportsPartialFrames = OMX_FALSE; - p->iOMXComponentCanHandleIncompleteFrames = OMX_TRUE; - p->iOMXComponentUsesFullAVCFrames = OMX_FALSE; - break; - } -#endif - 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; - - 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; - - 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; - } - case OMX_IndexParamAudioAac: { - OMX_AUDIO_PARAM_AACPROFILETYPE *p = - (OMX_AUDIO_PARAM_AACPROFILETYPE *)pComponentParameterStructure; - OMX_U32 index = p->nPortIndex; - PortAac *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<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 */ - - 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) -{ - MixAudio *mix; - MixAudioConfigParams *acp; - bool acp_changed; - MixIOVec *mixio_in, *mixio_out; - OMX_ERRORTYPE oret; - MIX_RESULT mret; - - LOGV("%s(): enter\n", __func__); - - g_type_init(); - - mix = mix_audio_new(); - if (!mix) { - LOGE("%s(),%d: exit, mix_audio_new failed", __func__, __LINE__); - goto error_out; - } - - if (coding_type == OMX_AUDIO_CodingMP3) { - MixAudioConfigParamsMP3 *acp_mp3 = mix_acp_mp3_new(); - if (!acp_mp3) { - LOGE("%s(),%d: exit, mix_acp_mp3_new failed", __func__, __LINE__); - goto free_mix; - } - acp = MIX_AUDIOCONFIGPARAMS(acp_mp3); - } - else if (coding_type == OMX_AUDIO_CodingAAC) { - MixAudioConfigParamsAAC *acp_aac = mix_acp_aac_new(); - if (!acp_aac) { - LOGE("%s(),%d: exit, mix_acp_aac_new failed", __func__, __LINE__); - goto free_mix; - } - acp = MIX_AUDIOCONFIGPARAMS(acp_aac); - } - else { - LOGE("%s(),%d: exit, unkown role (ret == 0x%08x)\n", - __func__, __LINE__, OMX_ErrorInvalidState); - goto free_mix; - } - - if (codec_mode == MIX_CODING_DECODE) { -#if SST_RENDER_MODE_DIRECT_RENDER - MIX_ACP_DECODEMODE(acp) = MIX_DECODE_DIRECTRENDER; -#else - MIX_ACP_DECODEMODE(acp) = MIX_DECODE_DECODERETURN; -#endif - oret = ChangeAcpWithPortParam(acp, ports[INPORT_INDEX], &acp_changed); - if (oret != OMX_ErrorNone) { - LOGE("%s(),%d: exit, ChangeAcpWithPortParam failed " - "(ret == 0x%08x)\n", __func__, __LINE__, oret); - goto free_acp; - } - } - else if (codec_mode == MIX_CODING_ENCODE) { - MIX_ACP_DECODEMODE(acp) = MIX_DECODE_NULL; - oret = ChangeAcpWithPortParam(acp, ports[OUTPORT_INDEX], &acp_changed); - if (oret != OMX_ErrorNone) { - LOGE("%s(),%d: exit, ChangeAcpWithPortParam failed " - "(ret == 0x%08x)\n", __func__, __LINE__, oret); - goto free_acp; - } - } - - mret = mix_acp_set_streamname(acp, GetWorkingRole()); - if (!MIX_SUCCEEDED(mret)) { - LOGE("%s(),%d: exit, mix_acp_set_streamname failed (ret == 0x%08x)", - __func__, __LINE__, mret); - goto free_acp; - } - - mret = mix_audio_initialize(mix, codec_mode, NULL, NULL); - if (!(MIX_SUCCEEDED(mret))) { - LOGE("%s(),%d: exit, mix_audio_initialize failed (ret == 0x%08x)", - __func__, __LINE__, mret); - goto free_acp; - } - LOGV("%s(): mix audio initialized", __func__); - - LOGV("%s: call mix_audio_configure() with the following acp\n", - __func__); - LOGV("%s: decode mode : %d\n", __func__, acp->decode_mode); - LOGV("%s: stream name : %s\n", __func__, acp->stream_name); - LOGV("%s: nr of channels : %d\n", __func__, MIX_ACP_NUM_CHANNELS(acp)); - LOGV("%s: bitrate : %d\n", __func__, MIX_ACP_BITRATE(acp)); - LOGV("%s: samplerate : %d\n", __func__, MIX_ACP_SAMPLE_FREQ(acp)); - if (coding_type == OMX_AUDIO_CodingMP3) { - LOGV("%s: format : %d\n", __func__, - MIX_ACP_MP3_MPEG_FORMAT(acp)); - LOGV("%s: layer : %d\n", __func__, - MIX_ACP_MP3_MPEG_LAYER(acp)); - LOGV("%s: crc : %d\n", __func__, MIX_ACP_MP3_CRC(acp)); - } - else if (coding_type == OMX_AUDIO_CodingAAC) { - LOGV("%s: aot : %d", __func__, - mix_acp_aac_get_aot(MIX_AUDIOCONFIGPARAMSAAC(acp))); - LOGV("%s: aac profile : %d", __func__, - mix_acp_aac_get_aac_profile(MIX_AUDIOCONFIGPARAMSAAC(acp))); - LOGV("%s: MPEG id : %d", __func__, - mix_acp_aac_get_mpeg_id(MIX_AUDIOCONFIGPARAMSAAC(acp))); - LOGV("%s: bitstream format : %d", __func__, - mix_acp_aac_get_bit_stream_format(MIX_AUDIOCONFIGPARAMSAAC(acp))); - LOGV("%s: bitrate type : %d", __func__, - mix_acp_aac_get_bit_rate_type(MIX_AUDIOCONFIGPARAMSAAC(acp))); - } - - mret = mix_audio_configure(mix, acp, NULL); - if (!MIX_SUCCEEDED(mret)) { - LOGE("%s(),%d: exit, mix_audio_configure failed (ret == 0x%08x)", - __func__, __LINE__, mret); - goto deinitialize_mix; - } - LOGV("%s(): mix audio configured", __func__); - -#if SST_USE_STREAM_CTRL_WORKQUEUE - if ((MIX_ACP_DECODEMODE(acp) == MIX_DECODE_DIRECTRENDER) || - (MIX_ACP_DECODEMODE(acp) == MIX_DECODE_NULL)) { - mix_stream_ctrl = new MixAudioStreamCtrl(mix); - if (!mix_stream_ctrl) { - LOGE("%s(),%d: exit, failed to new MixAudioStreamCtrl", - __func__, __LINE__); - goto deinitialize_mix; - } - } -#endif - - mixio_in = (MixIOVec *)malloc(sizeof(MixIOVec)); - if (!mixio_in) { - LOGE("%s(),%d: exit, failed to allocate mbuffer (ret == 0x%08x)", - __func__, __LINE__, mret); - goto deinitialize_mix; - } - - mixio_out = (MixIOVec *)malloc(sizeof(MixIOVec)); - if (!mixio_out) { - LOGE("%s(),%d: exit, failed to allocate mbuffer (ret == 0x%08x)", - __func__, __LINE__, mret); - goto free_mixio_in; - } - - this->mix = mix; - this->acp = acp; - this->mixio_in = mixio_in; - this->mixio_out = mixio_out; - - LOGV("%s(),%d: exit, done\n", __func__, __LINE__); - return OMX_ErrorNone; - -free_mixio_in: - free(mixio_in); - -deinitialize_mix: - mix_audio_deinitialize(mix); - -free_acp: - mix_acp_unref(acp); - -free_mix: - mix_audio_unref(mix); - -error_out: - LOGV("%s(),%d: exit, (ret = 0x%08x)\n", __func__, __LINE__, oret); - return OMX_ErrorUndefined; -} - -OMX_ERRORTYPE MrstSstComponent::ProcessorDeinit(void) -{ - OMX_ERRORTYPE ret = OMX_ErrorNone; - LOGV("%s(): enter\n", __func__); - -#if SST_USE_STREAM_CTRL_WORKQUEUE - if ((MIX_ACP_DECODEMODE(acp) == MIX_DECODE_DIRECTRENDER) || - (MIX_ACP_DECODEMODE(acp) == MIX_DECODE_NULL)) - delete mix_stream_ctrl; -#endif - - if ((MIX_ACP_DECODEMODE(acp) == MIX_DECODE_DIRECTRENDER) || - (MIX_ACP_DECODEMODE(acp) == MIX_DECODE_NULL)) - mix_audio_stop_drop(mix); - - mix_audio_deinitialize(mix); - LOGV("%s(): mix audio deinitialized", __func__); - - mix_acp_unref(acp); - mix_audio_unref(mix); - - free(mixio_in); - free(mixio_out); - - 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__); - - if ((MIX_ACP_DECODEMODE(acp) == MIX_DECODE_DIRECTRENDER) || - (MIX_ACP_DECODEMODE(acp) == MIX_DECODE_NULL)) - mix_audio_stop_drop(mix); - - 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__); - - //if ((MIX_ACP_DECODEMODE(acp) == MIX_DECODE_DIRECTRENDER) || - // (MIX_ACP_DECODEMODE(acp) == MIX_DECODE_NULL)) - // mix_audio_pause(mix) - - 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__); - - //if ((MIX_ACP_DECODEMODE(acp) == MIX_DECODE_DIRECTRENDER) || - // (MIX_ACP_DECODEMODE(acp) == MIX_DECODE_NULL)) - // mix_audio_resume(mix); - - LOGV("%s(),%d: exit (ret = 0x%08x)\n", __func__, __LINE__, ret); - return ret; -} - -/* implement ComponentBase::ProcessorProcess */ -OMX_ERRORTYPE MrstSstComponent::ProcessorProcess( - OMX_BUFFERHEADERTYPE ***pBuffers, - buffer_retain_t *retain, - OMX_U32 nr_buffers) -{ - OMX_U64 consumed = 0, produced = 0; - OMX_U32 outfilledlen = 0; - OMX_S64 outtimestamp = 0; - OMX_U32 outflags = 0; - - MixStreamState mstream_state = MIX_STREAM_NULL; - MixState mstate; - bool acp_changed = false; - - OMX_ERRORTYPE oret = OMX_ErrorNone; - MIX_RESULT mret; - - LOGV("%s(): enter\n", __func__); - -#if !LOG_NDEBUG - DumpBuffer(*pBuffers[INPORT_INDEX], false); -#endif - - LOGV_IF((*pBuffers[INPORT_INDEX])->nFlags & OMX_BUFFERFLAG_EOS, - "%s(),%d: got OMX_BUFFERFLAG_EOS\n", __func__, __LINE__); - - if (!(*pBuffers[INPORT_INDEX])->nFilledLen) { - LOGV("%s(),%d: exit, input buffer's nFilledLen is zero (ret = void)\n", - __func__, __LINE__); - goto out; - } - - mixio_in->data = (*pBuffers[INPORT_INDEX])->pBuffer + - (*pBuffers[INPORT_INDEX])->nOffset; - mixio_in->data_size = (*pBuffers[INPORT_INDEX])->nFilledLen; - mixio_in->buffer_size = (*pBuffers[INPORT_INDEX])->nAllocLen; - - mixio_out->data = (*pBuffers[OUTPORT_INDEX])->pBuffer + - (*pBuffers[OUTPORT_INDEX])->nOffset; - mixio_out->data_size = 0; - mixio_out->buffer_size = (*pBuffers[OUTPORT_INDEX])->nAllocLen; - - if (codec_mode == MIX_CODING_DECODE) { - if (((coding_type == OMX_AUDIO_CodingMP3) && - ((*pBuffers[INPORT_INDEX])->nFlags & OMX_BUFFERFLAG_SYNCFRAME)) - || - ((coding_type == OMX_AUDIO_CodingAAC) && - ((*pBuffers[INPORT_INDEX])->nFlags & OMX_BUFFERFLAG_CODECCONFIG))) { - - oret = ChangeAcpWithConfigHeader(mixio_in->data, - &acp_changed); - if (oret != OMX_ErrorNone) { - LOGE("%s(),%d: exit, ret == 0x%08x\n", __func__, __LINE__, - oret); - goto out; - } - } - - /* - * reconfigure acp with parsed parameter - * 1. if started, stop - * 2. reset mix audio - * 3. configure - */ - if (acp_changed) { - mix_audio_get_state(mix, &mstate); - if (mstate == MIX_STATE_CONFIGURED) { - if ((MIX_ACP_DECODEMODE(acp) == MIX_DECODE_DIRECTRENDER) || - (MIX_ACP_DECODEMODE(acp) == MIX_DECODE_NULL)) { - mix_audio_get_stream_state(mix, &mstream_state); - if (mstream_state == MIX_STREAM_PLAYING) - mix_audio_stop_drop(mix); - } - mix_audio_deinitialize(mix); - mix_audio_initialize(mix, codec_mode, NULL, NULL); - } - - mret = mix_audio_configure(mix, acp, NULL); - if (!MIX_SUCCEEDED(mret)) { - LOGE("%s(),%d: exit, mix_audio_configure failed " - "(ret == 0x%08x)", __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - goto out; - } - LOGV("%s(): mix audio configured", __func__); - - /* - * port reconfigure - */ - ChangePortParamWithAcp(); - goto out; - } - } - else { - if (coding_type == OMX_AUDIO_CodingAAC) { -#if TEST_USE_AAC_ENCODING_RAW - if (codecdata) { - memcpy((*pBuffers[OUTPORT_INDEX])->pBuffer, codecdata, 2); - - free(codecdata); - codecdata = NULL; - - outfilledlen = 2; - outflags |= - OMX_BUFFERFLAG_CODECCONFIG | OMX_BUFFERFLAG_ENDOFFRAME; - - retain[INPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; - goto out; - } -#endif - } - } - - if ((MIX_ACP_DECODEMODE(acp) == MIX_DECODE_DIRECTRENDER) || - (MIX_ACP_DECODEMODE(acp) == MIX_DECODE_NULL)) { - mix_audio_get_stream_state(mix, &mstream_state); - if (mstream_state != MIX_STREAM_PLAYING) { -#if SST_USE_STREAM_CTRL_WORKQUEUE - if ((MIX_ACP_DECODEMODE(acp) == MIX_DECODE_DIRECTRENDER) || - (MIX_ACP_DECODEMODE(acp) == MIX_DECODE_NULL)) - mix_stream_ctrl->SendCommand( - MixAudioStreamCtrl::MIX_STREAM_START); -#else - LOGV("%s(): mix current stream state = %d, call mix_audio_start\n", - __func__, mstream_state); - mret = mix_audio_start(mix); - if (!MIX_SUCCEEDED(mret)) { - LOGE("%s(),%d: faild to mix_audio_start (ret == 0x%08x)", - __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - goto out; - } -#endif - } - } - - if (codec_mode == MIX_CODING_DECODE) { - if ((*pBuffers[INPORT_INDEX])->nFlags & OMX_BUFFERFLAG_CODECCONFIG) { - retain[OUTPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; - goto out; - } - - //LOGV("%s(): call mix_audio_decode()\n", __func__); - mret = mix_audio_decode(mix, - (const MixIOVec *)mixio_in, 1, &consumed, - mixio_out, 1); - if (!MIX_SUCCEEDED(mret)) { - LOGE("%s(), %d: exit, mix_audio_decode failed (ret == 0x%08x)", - __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - goto out; - } - produced = mixio_out->data_size; - //LOGV("%s(): returned from mix_audio_decode()\n", __func__); - } - else { - //LOGV("%s(): call mix_audio_capture_encode()\n", __func__); - mret = mix_audio_capture_encode(mix, mixio_out, 1); - if (!MIX_SUCCEEDED(mret)) { - LOGE("%s(), %d: exit, mix_audio_decode failed (ret == 0x%08x)", - __func__, __LINE__, mret); - oret = OMX_ErrorUndefined; - goto out; - } - //LOGV("%s(): returned from mix_audio_capture_encode()\n", __func__); - - outflags |= OMX_BUFFERFLAG_ENDOFFRAME; - - /* direct encode workaround */ - consumed = mixio_in->data_size; - produced = mixio_out->data_size; - -#if 0 - mix_audio_get_timestamp(mix, (OMX_U64 *)&outtimestamp); - outtimestamp *= 1000; - buffers[INPORT_INDEX]->nTimeStamp = outtimestamp; -#endif - } - - outfilledlen = produced; - LOGV("%s(): %lu bytes produced\n", __func__, outfilledlen); - - (*pBuffers[INPORT_INDEX])->nFilledLen -= (OMX_U32)consumed; - if ((*pBuffers[INPORT_INDEX])->nFilledLen) { - LOGV("%s(): input buffer NOT fully consumed %lu bytes consumed\n", - __func__, (OMX_U32)consumed); - - if (!consumed && !produced) { - LOGV("%s(): just return\n", __func__); - goto out; - } - - LOGV("%s(): %lu bytes remained, waits for next turn\n", - __func__, (*pBuffers[INPORT_INDEX])->nFilledLen); - - (*pBuffers[INPORT_INDEX])->nOffset += (OMX_U32)consumed; - retain[INPORT_INDEX] = BUFFER_RETAIN_GETAGAIN; - /* FIXME */ - outtimestamp = (*pBuffers[INPORT_INDEX])->nTimeStamp; - } - else { - (*pBuffers[INPORT_INDEX])->nOffset = 0; - outtimestamp = (*pBuffers[INPORT_INDEX])->nTimeStamp; - - LOGV("%s(): %lu bytes fully consumed\n", __func__, - (OMX_U32)consumed); - } - -out: - (*pBuffers[OUTPORT_INDEX])->nFilledLen = outfilledlen; - (*pBuffers[OUTPORT_INDEX])->nTimeStamp = outtimestamp; - (*pBuffers[OUTPORT_INDEX])->nFlags = outflags; - -#if !LOG_NDEBUG - if (retain[OUTPORT_INDEX] == BUFFER_RETAIN_NOT_RETAIN) - DumpBuffer(*pBuffers[OUTPORT_INDEX], false); -#endif - - LOGV("%s(),%d: exit, done\n", __func__, __LINE__); - - return oret; -} - -/* end of implement ComponentBase::Processor[*] */ - -/* end of component methods & helpers */ - -/* - * acp setting helpers - */ - -static inline OMX_ERRORTYPE __Mp3ChangeAcp(MixAudioConfigParams *acp, - bool *acp_changed, - int channel, int samplingrate, - int bitrate, - int version, int layer, int crc) -{ - if (!acp_changed) - return OMX_ErrorBadParameter; - - if ((MIX_ACP_NUM_CHANNELS(acp) != channel) || - /* mix_audio doesn't care bitrate change */ - //(MIX_ACP_BITRATE(acp) != bitrate) || - (MIX_ACP_SAMPLE_FREQ(acp) != samplingrate) || - (MIX_ACP_MP3_CRC(acp) != crc) || - (MIX_ACP_MP3_MPEG_FORMAT(acp) != version) || - (MIX_ACP_MP3_MPEG_LAYER(acp) != layer)) { - - *acp_changed = true; - - LOGV_IF(MIX_ACP_NUM_CHANNELS(acp) != channel, - "%s(): channel : %d != %d\n", __func__, - MIX_ACP_NUM_CHANNELS(acp), channel); - LOGV_IF(MIX_ACP_BITRATE(acp) != bitrate, - "%s(): bitrate : %d != %d\n", __func__, - MIX_ACP_BITRATE(acp), bitrate); - LOGV_IF(MIX_ACP_SAMPLE_FREQ(acp) != samplingrate, - "%s(): frequency : %d != %d\n", __func__, - MIX_ACP_SAMPLE_FREQ(acp), samplingrate); - LOGV_IF(MIX_ACP_MP3_CRC(acp) != crc, - "%s(): crc : %d != %d\n", __func__, MIX_ACP_MP3_CRC(acp), crc); - LOGV_IF(MIX_ACP_MP3_MPEG_FORMAT(acp) != version, - "%s(): version : %d != %d\n", __func__, - MIX_ACP_MP3_MPEG_FORMAT(acp), version); - LOGV_IF(MIX_ACP_MP3_MPEG_LAYER(acp) != layer, - "%s(): layer : %d != %d\n", __func__, - MIX_ACP_MP3_MPEG_LAYER(acp), layer); - - MIX_ACP_NUM_CHANNELS(acp) = channel; - MIX_ACP_BITRATE(acp) = bitrate; - MIX_ACP_SAMPLE_FREQ(acp) = samplingrate; - - MIX_ACP_MP3_CRC(acp) = crc; - MIX_ACP_MP3_MPEG_FORMAT(acp) = version; - MIX_ACP_MP3_MPEG_LAYER(acp) = layer; - - LOGV("%s(): mp3 configration parameter has been changed\n", __func__); - LOGV("%s(): format : %d\n", __func__, MIX_ACP_MP3_MPEG_FORMAT(acp)); - LOGV("%s(): layer : %d\n", __func__, MIX_ACP_MP3_MPEG_LAYER(acp)); - LOGV("%s(): crc : %d\n", __func__, MIX_ACP_MP3_CRC(acp)); - LOGV("%s(): frequency : %d\n", __func__, MIX_ACP_SAMPLE_FREQ(acp)); - LOGV("%s(): bitrate : %d\n", __func__, MIX_ACP_BITRATE(acp)); - LOGV("%s(): channel : %d\n", __func__, MIX_ACP_NUM_CHANNELS(acp)); - } - - mix_acp_set_op_align(acp, MIX_ACP_OUTPUT_ALIGN_LSB); - mix_acp_set_bps(acp, MIX_ACP_BPS_16); - - return OMX_ErrorNone; -} - -static inline OMX_ERRORTYPE __AacChangeAcp(MixAudioConfigParams *acp, - bool *acp_changed, - int channel, int frequency, - int bitrate, int aot) -{ - if (!acp_changed) - return OMX_ErrorBadParameter; - - if ((MIX_ACP_NUM_CHANNELS(acp) != channel) || - (MIX_ACP_SAMPLE_FREQ(acp) != frequency) || - (mix_acp_aac_get_aot(MIX_AUDIOCONFIGPARAMSAAC(acp)) != - (unsigned)aot) || - (mix_acp_aac_get_aac_profile(MIX_AUDIOCONFIGPARAMSAAC(acp)) != - (aot - 1))) { - - *acp_changed = true; - - LOGV_IF("%s(): channel : %d != %d\n", __func__, - MIX_ACP_NUM_CHANNELS(acp), channel); - LOGV_IF("%s(): samplingrate : %d != %d\n", __func__, - MIX_ACP_SAMPLE_FREQ(acp), frequency); - LOGV_IF("%s(): aot : %d != %d\n", __func__, - mix_acp_aac_get_aot(MIX_AUDIOCONFIGPARAMSAAC(acp)), aot); - LOGV_IF("%s(): profile : %d != %d\n", __func__, - mix_acp_aac_get_aac_profile(MIX_AUDIOCONFIGPARAMSAAC(acp)), - (aot - 1)); - - MIX_ACP_NUM_CHANNELS(acp) = channel; - MIX_ACP_SAMPLE_FREQ(acp) = frequency; - MIX_ACP_BITRATE(acp) = bitrate; - - MIX_ACP_AAC_SAMPLE_RATE(acp) = frequency; - MIX_ACP_AAC_CHANNELS(acp) = channel; - - /* 1:Main, 2:LC, 3:SSR, 4:SBR */ - mix_acp_aac_set_aot(MIX_AUDIOCONFIGPARAMSAAC(acp), aot); - /* 0:Main, 1:LC, 2:SSR, 3:SBR */ - mix_acp_aac_set_aac_profile(MIX_AUDIOCONFIGPARAMSAAC(acp), - (MixAACProfile)(aot - 1)); - - LOGV("%s(): audio configration parameter has been chagned\n", - __func__); - LOGV("%s(): aot : %d\n", __func__, - mix_acp_aac_get_aot(MIX_AUDIOCONFIGPARAMSAAC(acp))); - LOGV("%s(): frequency : %d\n", __func__, MIX_ACP_SAMPLE_FREQ(acp)); - LOGV("%s(): channel : %d\n", __func__, MIX_ACP_NUM_CHANNELS(acp)); - } - - mix_acp_aac_set_mpeg_id(MIX_AUDIOCONFIGPARAMSAAC(acp), MIX_AAC_MPEG_4_ID); - MIX_ACP_AAC_CRC(acp) = 0; /* 0:disabled, 1:enabled */ - /* 0:CBR, 1:VBR */ - mix_acp_aac_set_bit_rate_type(MIX_AUDIOCONFIGPARAMSAAC(acp), - (MixAACBitrateType)0); -#if TEST_USE_AAC_ENCODING_RAW - mix_acp_aac_set_bit_stream_format(MIX_AUDIOCONFIGPARAMSAAC(acp), - MIX_AAC_BS_RAW); -#else /* encoding: adts, decoding:raw */ - if (MIX_ACP_DECODEMODE(acp) != MIX_DECODE_NULL) /* decoding */ - mix_acp_aac_set_bit_stream_format(MIX_AUDIOCONFIGPARAMSAAC(acp), - MIX_AAC_BS_RAW); - else /* encoding */ - mix_acp_aac_set_bit_stream_format(MIX_AUDIOCONFIGPARAMSAAC(acp), - MIX_AAC_BS_ADTS); -#endif - - mix_acp_set_op_align(acp, MIX_ACP_OUTPUT_ALIGN_LSB); - mix_acp_set_bps(acp, MIX_ACP_BPS_16); - - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstSstComponent::__Mp3ChangeAcpWithConfigHeader( - const unsigned char *buffer, bool *acp_changed) -{ - int version, layer, crc, bitrate, samplingrate, channel, - mode_extension, frame_length, frame_duration; - int ret; - - ret = mp3_header_parse(buffer, - &version, &layer, - &crc, &bitrate, - &samplingrate, &channel, - &mode_extension, &frame_length, &frame_duration); - if (ret) - return OMX_ErrorBadParameter; - - if (version == MP3_HEADER_VERSION_1) - version = 1; - else if ((version == MP3_HEADER_VERSION_2) || - (version == MP3_HEADER_VERSION_25)) - version = 2; - else - return OMX_ErrorUndefined; - - if (layer == MP3_HEADER_LAYER_1) - layer = 1; - else if (layer == MP3_HEADER_LAYER_2) - layer = 2; - else if (layer == MP3_HEADER_LAYER_3) - layer = 3; - else - return OMX_ErrorUndefined; - - if (crc == MP3_HEADER_CRC_PROTECTED) - crc = 1; - else if (crc == MP3_HEADER_NOT_PROTECTED) - crc = 0; - else - return OMX_ErrorUndefined; - - if ((channel == MP3_HEADER_STEREO) || - (channel == MP3_HEADER_JOINT_STEREO) || - (channel == MP3_HEADER_DUAL_CHANNEL)) - channel = 2; - else if (channel == MP3_HEADER_SINGLE_CHANNEL) - channel = 1; - else - return OMX_ErrorUndefined; - - return __Mp3ChangeAcp(acp, acp_changed, - channel, samplingrate, bitrate, - version, layer, crc); -} - -OMX_ERRORTYPE MrstSstComponent::__AacChangeAcpWithConfigHeader( - const unsigned char *buffer, bool *acp_changed) -{ - int aot, frequency, channel; - int ret; - OMX_ERRORTYPE oret; - - ret = audio_specific_config_parse(buffer, - &aot, &frequency, &channel); - if (ret) - return OMX_ErrorBadParameter; - - if (aot < 1 || aot > 4) - return OMX_ErrorUndefined; - - oret = __AacChangeAcp(acp, acp_changed, channel, frequency, 128000, aot); - if (oret != OMX_ErrorNone) { - LOGE("%s(): __AacChangAcp() failed (ret : 0x%08x)\n", __func__, oret); - return oret; - } - - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstSstComponent::ChangeAcpWithConfigHeader( - const unsigned char *buffer, - bool *acp_changed) -{ - OMX_ERRORTYPE ret; - - if (coding_type == OMX_AUDIO_CodingMP3) - ret = __Mp3ChangeAcpWithConfigHeader(buffer, acp_changed); - else if (coding_type == OMX_AUDIO_CodingAAC) - ret = __AacChangeAcpWithConfigHeader(buffer, acp_changed); - else - return OMX_ErrorBadParameter; - - if (ret != OMX_ErrorNone) - return ret; - - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstSstComponent::__Mp3ChangeAcpWithPortParam( - MixAudioConfigParams *acp, PortMp3 *port, bool *acp_changed) -{ - OMX_AUDIO_PARAM_MP3TYPE p; - int format; - OMX_ERRORTYPE ret; - - memcpy(&p, port->GetPortMp3Param(), sizeof(OMX_AUDIO_PARAM_MP3TYPE)); - - ret = ComponentBase::CheckTypeHeader(&p, sizeof(p)); - if (ret != OMX_ErrorNone) - return ret; - - LOGV("%s(): eFormat = %d\n", __func__, p.eFormat); - LOGV("%s(): nBitRate = %lu\n", __func__, p.nBitRate); - LOGV("%s(): nSampleRate = %lu\n", __func__, p.nSampleRate); - LOGV("%s(): nChannels = %lu\n", __func__, p.nChannels); - - if (p.eFormat == OMX_AUDIO_MP3StreamFormatMP1Layer3) - format = 1; - else if ((p.eFormat == OMX_AUDIO_MP3StreamFormatMP2Layer3) || - (p.eFormat == OMX_AUDIO_MP3StreamFormatMP2_5Layer3)) - format = 2; - else - return OMX_ErrorBadParameter; - - return __Mp3ChangeAcp(acp, acp_changed, - p.nChannels, p.nSampleRate, p.nBitRate, - format, 3, 0); -} - -OMX_ERRORTYPE MrstSstComponent::__AacChangeAcpWithPortParam( - MixAudioConfigParams *acp, PortAac *port, bool *acp_changed) -{ - OMX_AUDIO_PARAM_AACPROFILETYPE p; - int aot; - OMX_ERRORTYPE ret; - - memcpy(&p, port->GetPortAacParam(), sizeof(p)); - - ret = ComponentBase::CheckTypeHeader(&p, sizeof(p)); - if (ret != OMX_ErrorNone) - return ret; - - LOGV("%s(): eAACProfile = %d\n", __func__, p.eAACProfile); - LOGV("%s(): nSampleRate = %lu\n", __func__, p.nSampleRate); - LOGV("%s(): nBitRate = %lu\n", __func__, p.nBitRate); - LOGV("%s(): nChannels = %lu\n", __func__, p.nChannels); - - if (p.eAACProfile == OMX_AUDIO_AACObjectMain) - aot = 1; - else if (p.eAACProfile == OMX_AUDIO_AACObjectLC) - aot = 2; - else if (p.eAACProfile == OMX_AUDIO_AACObjectSSR) - aot = 3; - else - return OMX_ErrorBadParameter; - -#if TEST_USE_AAC_ENCODING_RAW -#if TEST_USE_AAC_ENCODING_VARIABLE_PARAMETER - if (codec_mode == MIX_CODING_ENCODE) { - /* freed at ProcessorProcess */ - codecdata = (unsigned char *)calloc(2, sizeof(unsigned char)); - if (codecdata) - audio_specific_config_bitcoding(codecdata, - aot, p.nSampleRate, p.nChannels); - } - - return __AacChangeAcp(acp, acp_changed, p.nChannels, p.nSampleRate, - p.nBitRate, aot); -#else /* 44100,12800,2 */ - if (codec_mode == MIX_CODING_ENCODE) { - /* freed at ProcessorProcess */ - codecdata = (unsigned char *)calloc(2, sizeof(unsigned char)); - if (codecdata) - audio_specific_config_bitcoding(codecdata, - aot, 44100, 2); - } - - return __AacChangeAcp(acp, acp_changed, 2, 44100, - 128000, aot); -#endif -#else /* ADTS */ - if (codec_mode == MIX_CODING_ENCODE) - codecdata = NULL; - -#if TEST_USE_AAC_ENCODING_VARIABLE_PARAMETER - return __AacChangeAcp(acp, acp_changed, p.nChannels, p.nSampleRate, - p.nBitRate, aot); -#else /* 44100,12800,2 */ - return __AacChangeAcp(acp, acp_changed, 2, 44100, - 128000, aot); -#endif -#endif -} - -OMX_ERRORTYPE MrstSstComponent::ChangeAcpWithPortParam( - MixAudioConfigParams *acp, - PortBase *port, - bool *acp_changed) -{ - OMX_ERRORTYPE ret; - - if (coding_type == OMX_AUDIO_CodingMP3) - ret = __Mp3ChangeAcpWithPortParam( - acp, static_cast<PortMp3 *>(port), acp_changed); - else if (coding_type == OMX_AUDIO_CodingAAC) - ret = __AacChangeAcpWithPortParam( - acp, static_cast<PortAac *>(port), acp_changed); - else - return OMX_ErrorBadParameter; - - if (ret != OMX_ErrorNone) - return ret; - - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstSstComponent::__PcmChangePortParamWithAcp( - MixAudioConfigParams *acp, PortPcm *port) -{ - OMX_AUDIO_PARAM_PCMMODETYPE p; - OMX_ERRORTYPE ret; - - memcpy(&p, port->GetPortPcmParam(), sizeof(OMX_AUDIO_PARAM_PCMMODETYPE)); - - if ((MIX_ACP_NUM_CHANNELS(acp) != (int)p.nChannels) || - (MIX_ACP_SAMPLE_FREQ(acp) != (int)p.nSamplingRate)) { - - p.nChannels = MIX_ACP_NUM_CHANNELS(acp); - p.nSamplingRate = MIX_ACP_SAMPLE_FREQ(acp); - } - - port->SetPortPcmParam(&p, false); - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstSstComponent::__Mp3ChangePortParamWithAcp( - MixAudioConfigParams *acp, PortMp3 *port) -{ - OMX_AUDIO_PARAM_MP3TYPE p; - OMX_ERRORTYPE ret; - - memcpy(&p, port->GetPortMp3Param(), sizeof(OMX_AUDIO_PARAM_MP3TYPE)); - - if ((MIX_ACP_NUM_CHANNELS(acp) != (int)p.nChannels) || - (MIX_ACP_BITRATE(acp) != (int)p.nBitRate) || - (MIX_ACP_SAMPLE_FREQ(acp) != (int)p.nSampleRate)) { - - p.nChannels = MIX_ACP_NUM_CHANNELS(acp); - p.nBitRate = MIX_ACP_BITRATE(acp); - p.nSampleRate = MIX_ACP_SAMPLE_FREQ(acp); - } - - port->SetPortMp3Param(&p, false); - return OMX_ErrorNone; -} - -OMX_ERRORTYPE MrstSstComponent::__AacChangePortParamWithAcp( - MixAudioConfigParams *acp, PortAac *port) -{ - OMX_AUDIO_PARAM_AACPROFILETYPE p; - OMX_ERRORTYPE ret; - - memcpy(&p, port->GetPortAacParam(), sizeof(p)); - - if ((MIX_ACP_NUM_CHANNELS(acp) != (int)p.nChannels) || - (MIX_ACP_SAMPLE_FREQ(acp) != (int)p.nSampleRate)) { - - p.nChannels = MIX_ACP_NUM_CHANNELS(acp); - p.nSampleRate = MIX_ACP_SAMPLE_FREQ(acp); - } - - port->SetPortAacParam(&p, false); - return OMX_ErrorNone; -} - -/* used only decode mode */ -OMX_ERRORTYPE MrstSstComponent::ChangePortParamWithAcp(void) -{ - OMX_ERRORTYPE ret; - - if (coding_type == OMX_AUDIO_CodingMP3) - ret = __Mp3ChangePortParamWithAcp( - acp, static_cast<PortMp3 *>(ports[INPORT_INDEX])); - else if (coding_type == OMX_AUDIO_CodingAAC) - ret = __AacChangePortParamWithAcp( - acp, static_cast<PortAac *>(ports[INPORT_INDEX])); - else - return OMX_ErrorBadParameter; - - if (ret != OMX_ErrorNone) - return ret; - - ret = __PcmChangePortParamWithAcp( - acp, static_cast<PortPcm *>(ports[OUTPORT_INDEX])); - if (ret != OMX_ErrorNone) - return ret; - - LOGV("%s(): report OMX_EventPortSettingsChanged event on %luth port", - __func__, OUTPORT_INDEX); - - ret = static_cast<PortPcm *>(ports[OUTPORT_INDEX])-> - ReportPortSettingsChanged(); - - LOGV("%s(): returned from event handler (ret : 0x%08x)\n", __func__, ret); - - return OMX_ErrorNone; -} - -/* end of acp setting helpers */ - -/* - * CModule Interface - */ -#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) - -static const char *g_name = (const char *)"OMX.Intel.Mrst.SST"; - -static const char *g_roles[] = -{ - (const char *)"audio_decoder.mp3", - (const char *)"audio_decoder.aac", - (const char *)"audio_encoder.aac", -}; - -OMX_ERRORTYPE wrs_omxil_cmodule_ops_instantiate(OMX_PTR *instance) -{ - ComponentBase *cbase; - - cbase = new MrstSstComponent; - 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/sst/sst.h b/sst/sst.h deleted file mode 100644 index 26952cf..0000000 --- a/sst/sst.h +++ /dev/null @@ -1,174 +0,0 @@ -/* - * sst.h, omx sst component header - * - * Copyright (c) 2009-2010 Wind River Systems, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __WRS_OMXIL_INTEL_MRST_SST -#define __WRS_OMXIL_INTEL_MRST_SST - -#include <OMX_Core.h> -#include <OMX_Component.h> - -#include <cmodule.h> -#include <portbase.h> -#include <componentbase.h> - -class MixAudioStreamCtrl : public WorkQueue -{ -public: - MixAudioStreamCtrl(MixAudio *mix); - ~MixAudioStreamCtrl(); - - typedef enum mix_audio_command_e { - MIX_STREAM_START = 0, - MIX_STREAM_STOP_DROP, - MIX_STREAM_STOP_DRAIN, - MIX_STREAM_PAUSE, - MIX_STREAM_RESUME, - } mix_audio_command_t; - - void SendCommand(mix_audio_command_t command); - -private: - mix_audio_command_t *PopCommand(void); - - virtual void Work(void); - - struct queue q; - pthread_mutex_t lock; - - MixAudio *mix; -}; - -class MrstSstComponent : public ComponentBase -{ -public: - /* - * constructor & destructor - */ - MrstSstComponent(); - ~MrstSstComponent(); - -private: - /* - * component methods & helpers - */ - /* implement ComponentBase::ComponentAllocatePorts */ - virtual OMX_ERRORTYPE ComponentAllocatePorts(void); - - /* 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 OMX_ERRORTYPE ProcessorProcess(OMX_BUFFERHEADERTYPE ***pBuffers, - buffer_retain_t *retain, - OMX_U32 nr_buffers); - - OMX_ERRORTYPE __AllocateMp3Port(OMX_U32 port_index, OMX_DIRTYPE dir); - OMX_ERRORTYPE __AllocateAacPort(OMX_U32 port_index, OMX_DIRTYPE dir); - OMX_ERRORTYPE __AllocatePcmPort(OMX_U32 port_index, OMX_DIRTYPE dir); - - /* end of component methods & helpers */ - - /* - * acp setting helpers - */ - OMX_ERRORTYPE __Mp3ChangeAcpWithConfigHeader(const unsigned char *buffer, - bool *acp_changed); - OMX_ERRORTYPE __AacChangeAcpWithConfigHeader(const unsigned char *buffer, - bool *acp_changed); - OMX_ERRORTYPE ChangeAcpWithConfigHeader(const unsigned char *buffer, - bool *acp_changed); - - OMX_ERRORTYPE __Mp3ChangeAcpWithPortParam(MixAudioConfigParams *acp, - PortMp3 *port, - bool *acp_changed); - OMX_ERRORTYPE __AacChangeAcpWithPortParam(MixAudioConfigParams *acp, - PortAac *port, - bool *acp_changed); - OMX_ERRORTYPE ChangeAcpWithPortParam(MixAudioConfigParams *acp, - PortBase *port, - bool *acp_changed); - - OMX_ERRORTYPE __PcmChangePortParamWithAcp(MixAudioConfigParams *acp, - PortPcm *port); - OMX_ERRORTYPE __Mp3ChangePortParamWithAcp(MixAudioConfigParams *acp, - PortMp3 *port); - OMX_ERRORTYPE __AacChangePortParamWithAcp(MixAudioConfigParams *acp, - PortAac *port); - OMX_ERRORTYPE ChangePortParamWithAcp(void); - - /* end of acp setting helpers */ - - /* mix audio */ - MixAudio *mix; - MixAudioConfigParams *acp; - MixIOVec *mixio_in, *mixio_out; - - MixAudioStreamCtrl *mix_stream_ctrl; - - OMX_AUDIO_CODINGTYPE coding_type; - MixCodecMode codec_mode; - - OMX_U8 *codecdata; - - /* constant */ - /* ports */ - const static OMX_U32 NR_PORTS = 2; - const static OMX_U32 INPORT_INDEX = 0; - const static OMX_U32 OUTPORT_INDEX = 1; - - /* buffer */ - const static OMX_U32 INPORT_MP3_ACTUAL_BUFFER_COUNT = 5; - const static OMX_U32 INPORT_MP3_MIN_BUFFER_COUNT = 1; - const static OMX_U32 INPORT_MP3_BUFFER_SIZE = 4096; - 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 = 5; - const static OMX_U32 INPORT_AAC_MIN_BUFFER_COUNT = 1; - 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 = 2048; - const static OMX_U32 INPORT_PCM_ACTUAL_BUFFER_COUNT = 2; - const static OMX_U32 INPORT_PCM_MIN_BUFFER_COUNT = 1; - const static OMX_U32 INPORT_PCM_BUFFER_SIZE = 4096; - const static OMX_U32 OUTPORT_PCM_ACTUAL_BUFFER_COUNT = 5; - const static OMX_U32 OUTPORT_PCM_MIN_BUFFER_COUNT = 1; - const static OMX_U32 OUTPORT_PCM_BUFFER_SIZE = 16384; -}; - -#endif /* __WRS_OMXIL_INTEL_MRST_SST */ diff --git a/videocodec/OMXComponentCodecBase.cpp b/videocodec/OMXComponentCodecBase.cpp index 29a4beb..3b4e40e 100644 --- a/videocodec/OMXComponentCodecBase.cpp +++ b/videocodec/OMXComponentCodecBase.cpp @@ -14,7 +14,7 @@ * limitations under the License. */ -#define LOG_NDEBUG 0 +#define LOG_NDEBUG 1 #define LOG_TAG "OMXComponentCodecBase" #include <utils/Log.h> #include "OMXComponentCodecBase.h" diff --git a/wrs_omxil_components.list b/wrs_omxil_components.list deleted file mode 100644 index 1565a42..0000000 --- a/wrs_omxil_components.list +++ /dev/null @@ -1,21 +0,0 @@ -#libwrs_omxil_intel_mrst_sst.so -libwrs_omxil_intel_mrst_psb_avc_enc.so -libwrs_omxil_intel_mrst_psb_h263_enc.so -libwrs_omxil_intel_mrst_psb_m4v_enc.so -libwrs_omxil_intel_mrst_psb_dec.so -libomx_ipp_aacdec.so -libomx_ipp_mp3dec.so -libomx_ipp_aacenc.so -libomx_ipp_amrwbenc.so -libomx_ipp_amrnbenc.so -libomx_ipp_amrwbdec.so -libomx_ipp_amrnbdec.so -libOMXVideoDecoderAVC.so -libOMXVideoDecoderH263.so -libOMXVideoDecoderWMV.so -libOMXVideoDecoderMPEG4.so -libOMXVideoDecoderPAVC.so -libOMXVideoDecoderAVCSecure.so -libOMXVideoEncoderAVC.so -libOMXVideoEncoderH263.so -libOMXVideoEncoderMPEG4.so |
