You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
217 lines
6.0 KiB
217 lines
6.0 KiB
/* |
|
* Copyright (c) 2009-2011 Intel Corporation. All rights reserved. |
|
* |
|
* 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 1 |
|
#define LOG_TAG "OMXComponentCodecBase" |
|
#include <wrs_omxil_core/log.h> |
|
#include "OMXComponentCodecBase.h" |
|
|
|
|
|
OMXComponentCodecBase::OMXComponentCodecBase() |
|
: mHandlerList(NULL) { |
|
pthread_mutex_init(&mSerializationLock, NULL); |
|
} |
|
|
|
OMXComponentCodecBase::~OMXComponentCodecBase(){ |
|
HandlerEntry *p = NULL; |
|
while (mHandlerList) { |
|
p = mHandlerList->next; |
|
delete mHandlerList; |
|
mHandlerList = p; |
|
} |
|
|
|
if (this->ports) { |
|
delete this->ports; |
|
this->ports = NULL; |
|
} |
|
|
|
pthread_mutex_destroy(&mSerializationLock); |
|
} |
|
|
|
OMX_ERRORTYPE OMXComponentCodecBase::ComponentAllocatePorts(void) { |
|
OMX_ERRORTYPE ret = OMX_ErrorNone; |
|
|
|
this->ports = new PortBase* [NUMBER_PORTS]; |
|
if (this->ports == NULL) { |
|
return OMX_ErrorInsufficientResources; |
|
} |
|
|
|
ret = InitInputPort(); |
|
CHECK_RETURN_VALUE("InitInputPort"); |
|
|
|
ret = InitOutputPort(); |
|
CHECK_RETURN_VALUE("InitOutputPort"); |
|
|
|
this->nr_ports = NUMBER_PORTS; |
|
|
|
// OMX_PORT_PARAM_TYPE |
|
// Return to OMX client through index OMX_IndexParamVideoInit/OMX_IndexParamAudioInit |
|
// TODO: replace portparam with mPortParam |
|
memset(&this->portparam, 0, sizeof(this->portparam)); |
|
SetTypeHeader(&this->portparam, sizeof(this->portparam)); |
|
this->portparam.nPorts = NUMBER_PORTS; |
|
this->portparam.nStartPortNumber = INPORT_INDEX; |
|
|
|
return ret; |
|
} |
|
|
|
|
|
OMX_ERRORTYPE OMXComponentCodecBase::ComponentGetParameter( |
|
OMX_INDEXTYPE nIndex, |
|
OMX_PTR pComponentParameterStructure) { |
|
|
|
OMXHANDLER handler = FindHandler(nIndex, true); |
|
if (handler == NULL) { |
|
LOGE("ComponentGetParameter: No handler for index %d", nIndex); |
|
return OMX_ErrorUnsupportedIndex; |
|
} |
|
|
|
LOGV("ComponentGetParameter: Index = 0x%x", nIndex); |
|
return (*handler)(this, pComponentParameterStructure); |
|
} |
|
|
|
OMX_ERRORTYPE OMXComponentCodecBase::ComponentSetParameter( |
|
OMX_INDEXTYPE nIndex, |
|
OMX_PTR pComponentParameterStructure) { |
|
|
|
OMXHANDLER handler = FindHandler(nIndex, false); |
|
if (handler == NULL) { |
|
LOGE("ComponentSetParameter: No handler for index %d", nIndex); |
|
return OMX_ErrorUnsupportedIndex; |
|
} |
|
|
|
LOGV("ComponentSetParameter: Index = 0x%x", nIndex); |
|
return (*handler)(this, pComponentParameterStructure); |
|
} |
|
|
|
OMX_ERRORTYPE OMXComponentCodecBase::ComponentGetConfig( |
|
OMX_INDEXTYPE nIndex, |
|
OMX_PTR pComponentConfigStructure) { |
|
|
|
OMXHANDLER handler = FindHandler(nIndex, true); |
|
if (handler == NULL) { |
|
LOGE("ComponentGetConfig: No handler for index %d", nIndex); |
|
return OMX_ErrorUnsupportedIndex; |
|
} |
|
|
|
LOGV("ComponentGetConfig: Index = 0x%x", nIndex); |
|
return (*handler)(this, pComponentConfigStructure); |
|
} |
|
|
|
OMX_ERRORTYPE OMXComponentCodecBase::ComponentSetConfig( |
|
OMX_INDEXTYPE nIndex, |
|
OMX_PTR pComponentConfigStructure) { |
|
|
|
OMX_ERRORTYPE ret = OMX_ErrorNone; |
|
|
|
OMXHANDLER handler = FindHandler(nIndex, false); |
|
if (handler == NULL) { |
|
LOGE("ComponentSetConfig: No handler for index %d", nIndex); |
|
return OMX_ErrorUnsupportedIndex; |
|
} |
|
|
|
LOGV("ComponentSetConfig: Index = 0x%x", nIndex); |
|
pthread_mutex_lock(&mSerializationLock); |
|
ret = (*handler)(this, pComponentConfigStructure); |
|
pthread_mutex_unlock(&mSerializationLock); |
|
return ret; |
|
} |
|
|
|
OMX_COLOR_FORMATTYPE OMXComponentCodecBase::GetOutputColorFormat(int width) { |
|
LOGD("%s: width = %d", __func__, width); |
|
return OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar; |
|
} |
|
|
|
OMX_ERRORTYPE OMXComponentCodecBase::ProcessorInit(void) { |
|
LOGV("OMXComponentCodecBase::ProcessorInit"); |
|
|
|
return OMX_ErrorNone; |
|
} |
|
|
|
OMX_ERRORTYPE OMXComponentCodecBase::ProcessorDeinit(void) { |
|
LOGV("OMXComponentCodecBase::ProcessorDeinit"); |
|
return OMX_ErrorNone; |
|
} |
|
|
|
OMX_ERRORTYPE OMXComponentCodecBase::ProcessorStart(void) { |
|
LOGV("OMXComponentCodecBase::ProcessorStart"); |
|
return OMX_ErrorNone; |
|
} |
|
|
|
OMX_ERRORTYPE OMXComponentCodecBase::ProcessorStop(void) { |
|
LOGV("OMXComponentCodecBase::ProcessorStop"); |
|
return OMX_ErrorNone; |
|
} |
|
|
|
OMX_ERRORTYPE OMXComponentCodecBase::ProcessorPause(void) { |
|
LOGV("OMXComponentCodecBase::ProcessorPause"); |
|
return OMX_ErrorNone; |
|
} |
|
|
|
OMX_ERRORTYPE OMXComponentCodecBase::ProcessorResume(void) { |
|
LOGV("OMXComponentCodecBase::ProcessorResume"); |
|
return OMX_ErrorNone; |
|
} |
|
|
|
OMX_ERRORTYPE OMXComponentCodecBase::AddHandler( |
|
OMX_INDEXTYPE type, |
|
OMXComponentCodecBase::OMXHANDLER getter, |
|
OMXComponentCodecBase::OMXHANDLER setter) { |
|
|
|
HandlerEntry *p = mHandlerList; |
|
HandlerEntry *last = NULL; |
|
while (p) { |
|
if (p->type == type) { |
|
p->getter = getter; |
|
p->setter = setter; |
|
return OMX_ErrorNone; |
|
} |
|
last = p; |
|
p = p->next; |
|
} |
|
p = new HandlerEntry; |
|
if (p == NULL) { |
|
return OMX_ErrorInsufficientResources; |
|
} |
|
p->type = type; |
|
p->getter = getter; |
|
p->setter = setter; |
|
p->next = NULL; |
|
|
|
if (last) { |
|
last->next = p; |
|
} else { |
|
mHandlerList = p; |
|
} |
|
return OMX_ErrorNone; |
|
} |
|
|
|
OMXComponentCodecBase::OMXHANDLER OMXComponentCodecBase::FindHandler(OMX_INDEXTYPE type, bool get) { |
|
HandlerEntry *p = mHandlerList; |
|
while (p) { |
|
if (p->type == type) { |
|
return get ? p->getter : p->setter; |
|
} |
|
p = p->next; |
|
} |
|
return NULL; |
|
} |
|
|
|
OMX_ERRORTYPE OMXComponentCodecBase::BuildHandlerList(void) { |
|
return OMX_ErrorNone; |
|
} |
|
|
|
|
|
|