19042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang/* 29042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang * * Copyright (c) 2015 Intel Corporation. All rights reserved. 39042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang * * 49042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang * * Licensed under the Apache License, Version 2.0 (the "License"); 59042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang * * you may not use this file except in compliance with the License. 69042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang * * You may obtain a copy of the License at 79042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang * * 89042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang * * http://www.apache.org/licenses/LICENSE-2.0 99042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang * * 109042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang * * Unless required by applicable law or agreed to in writing, software 119042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang * * distributed under the License is distributed on an "AS IS" BASIS, 129042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang * * See the License for the specific language governing permissions and 149042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang * * limitations under the License. 159042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang * */ 169042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 179042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 189042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang//#define LOG_NDEBUG 0 199042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang#define LOG_TAG "MRM_OMX_Adaptor" 209042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 219042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang#include <utils/Log.h> 229042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang#include <utils/threads.h> 239042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang#include "OMX_adaptor.h" 249042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 259042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huangconst char* CODECS_LIMITATION_FILE = "/etc/codec_resources_limitation.xml"; 269042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 279042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huangusing namespace android; 289042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 299042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang// static member declare 309042795f805dffc0be5b900df3e42fe32ae61349Yuanjun HuangMRM_OMX_Adaptor* MRM_OMX_Adaptor::sInstance = NULL; 319042795f805dffc0be5b900df3e42fe32ae61349Yuanjun HuangMutex MRM_OMX_Adaptor::sLock; 329042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 339042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huangtypedef enum { 349042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang kPortIndexInput = 0, 359042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang kPortIndexOutput = 1 369042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang} PORT_INDEX; 379042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 389042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 399042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang// case insensitive string finding 409042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huangstatic const char* strstri(const char* str, const char* subStr) { 419042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang int len = strlen(subStr); 429042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang if (len == 0) { 439042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang return NULL; 449042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } 459042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 469042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang while(*str) { 479042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang if(strncasecmp(str, subStr, len) == 0) { 489042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang return str; 499042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } 509042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ++str; 519042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } 529042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang return NULL; 539042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang} 549042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 559042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 569042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang//static 579042795f805dffc0be5b900df3e42fe32ae61349Yuanjun HuangMRM_OMX_Adaptor* MRM_OMX_Adaptor::getInstance() { 589042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ALOGV("getInstance()"); 599042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang Mutex::Autolock lock(sLock); 609042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 619042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang if (sInstance == NULL) { 629042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang sInstance = new MRM_OMX_Adaptor(); 639042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } 649042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 659042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang return sInstance; 669042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang} 679042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 689042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 699042795f805dffc0be5b900df3e42fe32ae61349Yuanjun HuangOMX_ERRORTYPE MRM_OMX_Adaptor::MRM_OMX_Init(void) { 709042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ALOGV("MRM_OMX_Init"); 719042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang OMX_ERRORTYPE err = OMX_ErrorNone; 729042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang if (mArbitrator != NULL) { 739042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang err = (OMX_ERRORTYPE)mArbitrator->Config(CODECS_LIMITATION_FILE); 749042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } 759042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang return err; 769042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang} 779042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 789042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 799042795f805dffc0be5b900df3e42fe32ae61349Yuanjun HuangOMX_ERRORTYPE MRM_OMX_Adaptor::MRM_OMX_CheckIfFullLoad(OMX_STRING cComponentName) { 809042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ALOGV("MRM_OMX_CheckIfFullLoad"); 819042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang Mutex::Autolock lock(sLock); 829042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 839042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang String8 sComponentName(cComponentName); 849042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang AdaptorCodecInfo codecInfo; 859042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ParseCodecInfoFromComponentName(sComponentName.string(), &codecInfo); 869042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 879042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang if (codecInfo.isEncoder) { 889042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ALOGV("Checking full load status of encoder."); 899042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang if (mArbitrator->CheckIfFullLoad(true/*encoder*/)) { 909042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ALOGV("encoder in full load status. return OMX_ErrorInsufficientResources"); 919042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang return OMX_ErrorInsufficientResources; 929042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } else { 939042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang return OMX_ErrorNone; 949042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } 959042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } else { 969042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ALOGV("Checking full load status of decoder."); 979042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang if (mArbitrator->CheckIfFullLoad(false/*decoder*/)) { 989042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ALOGV("decoder in full load status. return OMX_ErrorInsufficientResources"); 999042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang return OMX_ErrorInsufficientResources; 1009042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } else { 1019042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang return OMX_ErrorNone; 1029042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } 1039042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } 1049042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang} 1059042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 1069042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 1079042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huangvoid MRM_OMX_Adaptor::MRM_OMX_SetComponent( 1089042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang OMX_HANDLETYPE pComponentHandle, 1099042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang OMX_STRING cComponentName) { 1109042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ALOGV("MRM_OMX_SetComponent: %s", cComponentName); 1119042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang String8 sComponentName(cComponentName); 1129042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ALOGV("pComponentHandle = 0x%x, componentName = %s", pComponentHandle, sComponentName.string()); 1139042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang mComponentNameMap.add(pComponentHandle, sComponentName); 1149042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang} 1159042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 1169042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 1179042795f805dffc0be5b900df3e42fe32ae61349Yuanjun HuangOMX_ERRORTYPE MRM_OMX_Adaptor::MRM_OMX_SetParameter( 1189042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang OMX_HANDLETYPE hComponent, 1199042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang OMX_INDEXTYPE nIndex, 1209042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang OMX_PTR pComponentParameterStructure) { 1219042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ALOGV("MRM_OMX_SetParameter"); 1229042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ALOGV("hComponent = 0x%x", hComponent); 1239042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang OMX_ERRORTYPE err = OMX_ErrorNone; 1249042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 1259042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang Mutex::Autolock lock(sLock); 1269042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 1279042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang if (nIndex == OMX_IndexParamPortDefinition) { 1289042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang OMX_PARAM_PORTDEFINITIONTYPE *def = 1299042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang static_cast<OMX_PARAM_PORTDEFINITIONTYPE*>(pComponentParameterStructure); 1309042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 1319042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang if (def->nPortIndex == kPortIndexInput) { 1329042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ALOGV("MRM_OMX_SetParameter for inport param def"); 1339042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang if (mComponentFramerateMap.indexOfKey(hComponent) >= 0) { 1349042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ALOGV("setParameter is called again for component 0x%x inport", hComponent); 1359042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang return OMX_ErrorNone; 1369042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } 1379042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 1389042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def->format.video; 1399042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang uint frameRate = (uint)(video_def->xFramerate/65536); 1409042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ALOGV("frame rate from inport = %d", frameRate); 1419042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang mComponentFramerateMap.add(hComponent, frameRate); 1429042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } 1439042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 1449042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang if (def->nPortIndex == kPortIndexOutput) { 1459042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def->format.video; 1469042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 1479042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang // if setParameter is not first called to this component's outport 1489042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang // do not try to record its info for the second time 1499042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang if (mComponentInfoMap.indexOfKey(hComponent) >= 0) { 1509042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ALOGV("setParameter is called again for component 0x%x outport", hComponent); 1519042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang return OMX_ErrorNone; 1529042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } 1539042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 1549042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang String8 sComponentName = mComponentNameMap.valueFor(hComponent); 1559042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ALOGV("component name from component map is %s", sComponentName.string()); 1569042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 1579042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang AdaptorCodecInfo codecInfo; 1589042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ParseCodecInfoFromComponentName(sComponentName.string(), &codecInfo); 1599042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 1609042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang if (mArbitrator->CheckIfFullLoad(codecInfo.isEncoder)) { 1619042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang return OMX_ErrorInsufficientResources; 1629042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } 1639042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 1649042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ResolutionType resolution; 1659042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang unsigned int height = video_def->nFrameHeight; 1669042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ALOGV("video resulotion = %d x %d", video_def->nFrameWidth, video_def->nFrameHeight); 1679042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang if (height <= 480) { 1689042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang resolution = Resolution_480; 1699042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } else if (height <= 720) { 1709042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang resolution = Resolution_720; 1719042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } else if (height <= 1080) { 1729042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang resolution = Resolution_1080; 1739042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } else if (height <= 1440) { 1749042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang resolution = Resolution_2K; 1759042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } else if (height <= 2160) { 1769042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang resolution = Resolution_4K; 1779042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } else { 1789042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ALOGE("resolution > 4K is not supported!"); 1799042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } 1809042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang codecInfo.resolution = resolution; 1819042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 1829042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang unsigned int frameRate = 0; 1839042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang if (mComponentFramerateMap.indexOfKey(hComponent) >= 0) { 1849042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang frameRate = mComponentFramerateMap.valueFor(hComponent); 1859042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } else { 1869042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ALOGW("frame rate was not set in inport def..."); 1879042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } 1889042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 1899042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ALOGV("frame rate from inport def = %d", frameRate); 1909042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang if ((frameRate > 55) && (frameRate < 65)) { 1919042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang frameRate = 60; 1929042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang // This is a w/a to set default frame rate as 30 in case it is not 1939042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang // set from framewrok. 1949042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } else { 1959042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang frameRate = 30; 1969042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } 1979042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang codecInfo.frameRate = frameRate; 1989042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang err = (OMX_ERRORTYPE)mArbitrator->AddResource(codecInfo.codecType, 1999042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang codecInfo.isEncoder, 2009042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang codecInfo.isSecured, 2019042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang codecInfo.resolution, 2029042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang codecInfo.frameRate); 2039042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 2049042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang mComponentInfoMap.add(hComponent, codecInfo); 2059042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } 2069042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } 2079042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang return err; 2089042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang} 2099042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 2109042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 2119042795f805dffc0be5b900df3e42fe32ae61349Yuanjun HuangOMX_ERRORTYPE MRM_OMX_Adaptor::MRM_OMX_UseBuffer( 2129042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang OMX_HANDLETYPE hComponent, 2139042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang OMX_BUFFERHEADERTYPE **ppBufferHdr, 2149042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang OMX_U32 nPortIndex, 2159042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang OMX_PTR pAppPrivate, 2169042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang OMX_U32 nSizeBytes, 2179042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang OMX_U8 *pBuffer) { 2189042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ALOGV("MRM_OMX_UseBuffer"); 2199042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang OMX_ERRORTYPE err = OMX_ErrorNone; 2209042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang return err; 2219042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang} 2229042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 2239042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 2249042795f805dffc0be5b900df3e42fe32ae61349Yuanjun HuangOMX_ERRORTYPE MRM_OMX_Adaptor::MRM_OMX_RemoveComponent( 2259042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang OMX_HANDLETYPE pComponentHandle) { 2266f58f9a80b880616bafbc3782a95d44cf0bff950Joe Qi ALOGV("MRM_OMX_RemoveComponent 0x%x", pComponentHandle); 2279042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang OMX_ERRORTYPE err = OMX_ErrorNone; 2289042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 2299042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang if (mComponentInfoMap.indexOfKey(pComponentHandle) < 0) { 2306f58f9a80b880616bafbc3782a95d44cf0bff950Joe Qi ALOGE("component 0x%x was not added by setParameter before! something is wrong?",pComponentHandle); 2319042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang return OMX_ErrorNone; // TODO: change to specific error. 2329042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } 2339042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 2349042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang const AdaptorCodecInfo& codecInfo = mComponentInfoMap.valueFor(pComponentHandle); 2359042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 2369042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang err = (OMX_ERRORTYPE)mArbitrator->RemoveResource(codecInfo.codecType, 2379042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang codecInfo.isEncoder, 2389042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang codecInfo.isSecured, 2399042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang codecInfo.resolution, 2409042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang codecInfo.frameRate); 241b2615f1e02eb59b78a9af088ea40299cd0526ff0Gu, Wangyi mComponentInfoMap.removeItem(pComponentHandle); 2429042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang return err; 2439042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang} 2449042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 2459042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 2469042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 2479042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 2489042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huangvoid MRM_OMX_Adaptor::ParseCodecInfoFromComponentName( 2499042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang const char* componentName, 2509042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang AdaptorCodecInfo* codecInfo) { 2519042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ALOGV("ParseCodecInfoFromComponentName"); 2529042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ALOGV("componentName = %s", componentName); 2539042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang bool isSecured = false; 2549042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang if (strstri(componentName,"SECURE") != NULL) { 2559042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang isSecured = true; 2569042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } 2579042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang codecInfo->isSecured = isSecured; 2589042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 2599042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang bool isEncoder = false; 2609042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang if ((strstri(componentName, "ENCODER") != NULL) || 2619042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang (strstri(componentName, "sw_ve") != NULL)) { 2629042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang isEncoder = true; 2639042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } 2649042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang codecInfo->isEncoder = isEncoder; 2659042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 2666f58f9a80b880616bafbc3782a95d44cf0bff950Joe Qi CodecType codecType = CODEC_TYPE_MAX; 2679042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang if (strstri(componentName, "AVC") != NULL) { 2689042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang codecType = CODEC_TYPE_AVC; 2699042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } else if (strstri(componentName, "VP8") != NULL) { 2709042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang codecType = CODEC_TYPE_VP8; 2719042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } else if (strstri(componentName, "VP9") != NULL) { 2729042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang codecType = CODEC_TYPE_VP9; 2739042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } else if (strstri(componentName, "MPEG4") != NULL) { 2749042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang codecType = CODEC_TYPE_MPEG4; 2759042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } else if (strstri(componentName, "MPEG2") != NULL) { 2769042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang codecType = CODEC_TYPE_MPEG2; 2779042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } else if (strstri(componentName, "H263") != NULL) { 2789042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang codecType = CODEC_TYPE_H263; 2799042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } else if (strstri(componentName, "H265") != NULL) { 2809042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang codecType = CODEC_TYPE_HEVC; 2819042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } else if (strstri(componentName, "WMV") != NULL) { 2829042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang codecType = CODEC_TYPE_WMV; 2839042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } 2849042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ALOGV("video codec type = %d", codecType); 2859042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang codecInfo->codecType = codecType; 2869042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang} 2879042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 2889042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 289