Home | History | Annotate | Download | only in videocodec
      1 /*
      2 * Copyright (c) 2009-2011 Intel Corporation.  All rights reserved.
      3 *
      4 * Licensed under the Apache License, Version 2.0 (the "License");
      5 * you may not use this file except in compliance with the License.
      6 * You may obtain a copy of the License at
      7 *
      8 * http://www.apache.org/licenses/LICENSE-2.0
      9 *
     10 * Unless required by applicable law or agreed to in writing, software
     11 * distributed under the License is distributed on an "AS IS" BASIS,
     12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 * See the License for the specific language governing permissions and
     14 * limitations under the License.
     15 */
     16 
     17 #define LOG_NDEBUG 1
     18 #define LOG_TAG "OMXComponentCodecBase"
     19 #include <wrs_omxil_core/log.h>
     20 #include "OMXComponentCodecBase.h"
     21 
     22 
     23 OMXComponentCodecBase::OMXComponentCodecBase()
     24     : mHandlerList(NULL) {
     25     pthread_mutex_init(&mSerializationLock, NULL);
     26 }
     27 
     28 OMXComponentCodecBase::~OMXComponentCodecBase(){
     29     HandlerEntry *p = NULL;
     30     while (mHandlerList) {
     31         p = mHandlerList->next;
     32         delete mHandlerList;
     33         mHandlerList = p;
     34     }
     35 
     36     if (this->ports) {
     37         delete this->ports;
     38         this->ports = NULL;
     39     }
     40 
     41     pthread_mutex_destroy(&mSerializationLock);
     42 }
     43 
     44 OMX_ERRORTYPE OMXComponentCodecBase::ComponentAllocatePorts(void) {
     45     OMX_ERRORTYPE ret = OMX_ErrorNone;
     46 
     47     this->ports = new PortBase* [NUMBER_PORTS];
     48     if (this->ports == NULL) {
     49         return OMX_ErrorInsufficientResources;
     50     }
     51 
     52     ret = InitInputPort();
     53     CHECK_RETURN_VALUE("InitInputPort");
     54 
     55     ret = InitOutputPort();
     56     CHECK_RETURN_VALUE("InitOutputPort");
     57 
     58     this->nr_ports = NUMBER_PORTS;
     59 
     60     // OMX_PORT_PARAM_TYPE
     61     // Return to OMX client through index OMX_IndexParamVideoInit/OMX_IndexParamAudioInit
     62     // TODO: replace portparam with mPortParam
     63     memset(&this->portparam, 0, sizeof(this->portparam));
     64     SetTypeHeader(&this->portparam, sizeof(this->portparam));
     65     this->portparam.nPorts = NUMBER_PORTS;
     66     this->portparam.nStartPortNumber = INPORT_INDEX;
     67 
     68     return ret;
     69 }
     70 
     71 
     72 OMX_ERRORTYPE OMXComponentCodecBase::ComponentGetParameter(
     73     OMX_INDEXTYPE nIndex,
     74     OMX_PTR pComponentParameterStructure) {
     75 
     76     OMXHANDLER handler = FindHandler(nIndex, true);
     77     if (handler == NULL) {
     78         LOGE("ComponentGetParameter: No handler for index %d", nIndex);
     79         return OMX_ErrorUnsupportedIndex;
     80     }
     81 
     82     LOGV("ComponentGetParameter: Index = 0x%x", nIndex);
     83     return (*handler)(this, pComponentParameterStructure);
     84 }
     85 
     86 OMX_ERRORTYPE OMXComponentCodecBase::ComponentSetParameter(
     87     OMX_INDEXTYPE nIndex,
     88     OMX_PTR pComponentParameterStructure) {
     89 
     90     OMXHANDLER handler = FindHandler(nIndex, false);
     91     if (handler == NULL) {
     92         LOGE("ComponentSetParameter: No handler for index %d", nIndex);
     93         return OMX_ErrorUnsupportedIndex;
     94     }
     95 
     96     LOGV("ComponentSetParameter: Index = 0x%x", nIndex);
     97     return (*handler)(this, pComponentParameterStructure);
     98 }
     99 
    100 OMX_ERRORTYPE OMXComponentCodecBase::ComponentGetConfig(
    101     OMX_INDEXTYPE nIndex,
    102     OMX_PTR pComponentConfigStructure) {
    103 
    104     OMXHANDLER handler = FindHandler(nIndex, true);
    105     if (handler == NULL) {
    106         LOGE("ComponentGetConfig: No handler for index %d", nIndex);
    107         return OMX_ErrorUnsupportedIndex;
    108     }
    109 
    110     LOGV("ComponentGetConfig: Index = 0x%x", nIndex);
    111     return (*handler)(this, pComponentConfigStructure);
    112 }
    113 
    114 OMX_ERRORTYPE OMXComponentCodecBase::ComponentSetConfig(
    115     OMX_INDEXTYPE nIndex,
    116     OMX_PTR pComponentConfigStructure) {
    117 
    118     OMX_ERRORTYPE ret = OMX_ErrorNone;
    119 
    120     OMXHANDLER handler = FindHandler(nIndex, false);
    121     if (handler == NULL) {
    122         LOGE("ComponentSetConfig: No handler for index %d", nIndex);
    123         return OMX_ErrorUnsupportedIndex;
    124     }
    125 
    126     LOGV("ComponentSetConfig: Index = 0x%x", nIndex);
    127     pthread_mutex_lock(&mSerializationLock);
    128     ret = (*handler)(this, pComponentConfigStructure);
    129     pthread_mutex_unlock(&mSerializationLock);
    130     return ret;
    131 }
    132 
    133 OMX_COLOR_FORMATTYPE OMXComponentCodecBase::GetOutputColorFormat(int width) {
    134     LOGD("%s: width = %d", __func__, width);
    135     return OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar;
    136 }
    137 
    138 OMX_ERRORTYPE OMXComponentCodecBase::ProcessorInit(void) {
    139     LOGV("OMXComponentCodecBase::ProcessorInit");
    140 
    141     return OMX_ErrorNone;
    142 }
    143 
    144 OMX_ERRORTYPE OMXComponentCodecBase::ProcessorDeinit(void) {
    145     LOGV("OMXComponentCodecBase::ProcessorDeinit");
    146     return OMX_ErrorNone;
    147 }
    148 
    149 OMX_ERRORTYPE OMXComponentCodecBase::ProcessorStart(void) {
    150     LOGV("OMXComponentCodecBase::ProcessorStart");
    151     return OMX_ErrorNone;
    152 }
    153 
    154 OMX_ERRORTYPE OMXComponentCodecBase::ProcessorStop(void) {
    155     LOGV("OMXComponentCodecBase::ProcessorStop");
    156     return OMX_ErrorNone;
    157 }
    158 
    159 OMX_ERRORTYPE OMXComponentCodecBase::ProcessorPause(void) {
    160     LOGV("OMXComponentCodecBase::ProcessorPause");
    161     return OMX_ErrorNone;
    162 }
    163 
    164 OMX_ERRORTYPE OMXComponentCodecBase::ProcessorResume(void) {
    165     LOGV("OMXComponentCodecBase::ProcessorResume");
    166     return OMX_ErrorNone;
    167 }
    168 
    169 OMX_ERRORTYPE OMXComponentCodecBase::AddHandler(
    170         OMX_INDEXTYPE type,
    171         OMXComponentCodecBase::OMXHANDLER getter,
    172         OMXComponentCodecBase::OMXHANDLER setter) {
    173 
    174     HandlerEntry *p = mHandlerList;
    175     HandlerEntry *last = NULL;
    176     while (p) {
    177         if (p->type == type) {
    178             p->getter = getter;
    179             p->setter = setter;
    180             return OMX_ErrorNone;
    181         }
    182         last = p;
    183         p = p->next;
    184     }
    185     p = new HandlerEntry;
    186     if (p == NULL) {
    187         return OMX_ErrorInsufficientResources;
    188     }
    189     p->type = type;
    190     p->getter = getter;
    191     p->setter = setter;
    192     p->next = NULL;
    193 
    194     if (last) {
    195         last->next = p;
    196     } else {
    197         mHandlerList = p;
    198     }
    199     return OMX_ErrorNone;
    200 }
    201 
    202 OMXComponentCodecBase::OMXHANDLER OMXComponentCodecBase::FindHandler(OMX_INDEXTYPE type, bool get) {
    203     HandlerEntry *p = mHandlerList;
    204     while (p) {
    205         if (p->type == type) {
    206             return get ? p->getter : p->setter;
    207         }
    208         p = p->next;
    209     }
    210     return NULL;
    211 }
    212 
    213 OMX_ERRORTYPE OMXComponentCodecBase::BuildHandlerList(void) {
    214     return OMX_ErrorNone;
    215 }
    216 
    217 
    218