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