120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu/* 22f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * componentbase.cpp, component base class 330bd6062e4b295f5f7bcaeb98165065310d29269Ho-Eun Ryu * 42f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * Copyright (c) 2009-2010 Wind River Systems, Inc. 52f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * 62f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * Licensed under the Apache License, Version 2.0 (the "License"); 72f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * you may not use this file except in compliance with the License. 82f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * You may obtain a copy of the License at 92f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * 102f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * http://www.apache.org/licenses/LICENSE-2.0 112f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * 122f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * Unless required by applicable law or agreed to in writing, software 132f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * distributed under the License is distributed on an "AS IS" BASIS, 142f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 152f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * See the License for the specific language governing permissions and 162f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * limitations under the License. 1720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu */ 1820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 1920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu#include <stdlib.h> 2020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu#include <string.h> 2120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 22cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu#include <pthread.h> 23cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu 2420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu#include <OMX_Core.h> 2520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu#include <OMX_Component.h> 2620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 2720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu#include <componentbase.h> 2820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 29cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu#include <queue.h> 30cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu#include <workqueue.h> 3134277d8b1ca48a932e7b17ba331c29f040ba0838xiao#include <OMX_IndexExt.h> 326a3d9478ea33b4e734cbcbc88d3f258c2cac94bbAustin Hu#include <OMX_IntelVideoExt.h> 33c87a1a8f47c29d4eddf1ea0093c32b8eee04a239ywan#include <HardwareAPI.h> 34cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu 3523381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu//#define LOG_NDEBUG 0 363f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan#undef LOG_TAG 373ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu#define LOG_TAG "componentbase" 383ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu#include <log.h> 393ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu 40c87a1a8f47c29d4eddf1ea0093c32b8eee04a239ywanstatic const OMX_U32 kMaxAdaptiveStreamingWidth = 1920; 41c87a1a8f47c29d4eddf1ea0093c32b8eee04a239ywanstatic const OMX_U32 kMaxAdaptiveStreamingHeight = 1088; 4220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu/* 43cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu * CmdProcessWork 44cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu */ 45cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun RyuCmdProcessWork::CmdProcessWork(CmdHandlerInterface *ci) 46cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu{ 47cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu this->ci = ci; 48cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu 49cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu workq = new WorkQueue; 50cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu 51cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu __queue_init(&q); 52cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu pthread_mutex_init(&lock, NULL); 53890904549b98adbf1b45b8c6a4aa64cb0ac93531Ho-Eun Ryu 54095dca7041d500f159c9e49d3ab784b6885ed086Ho-Eun Ryu workq->StartWork(true); 5523381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu 5623381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu LOGV("command process workqueue started\n"); 57cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu} 58cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu 59cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun RyuCmdProcessWork::~CmdProcessWork() 60cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu{ 61f41f0fecd2ff9e720aebab649a03968eaa3d0380Ho-Eun Ryu struct cmd_s *temp; 62f41f0fecd2ff9e720aebab649a03968eaa3d0380Ho-Eun Ryu 63890904549b98adbf1b45b8c6a4aa64cb0ac93531Ho-Eun Ryu workq->StopWork(); 64cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu delete workq; 65cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu 66f41f0fecd2ff9e720aebab649a03968eaa3d0380Ho-Eun Ryu while ((temp = PopCmdQueue())) 67f41f0fecd2ff9e720aebab649a03968eaa3d0380Ho-Eun Ryu free(temp); 68cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu 69cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu pthread_mutex_destroy(&lock); 7023381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu 7123381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu LOGV("command process workqueue stopped\n"); 72cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu} 73cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu 74cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun RyuOMX_ERRORTYPE CmdProcessWork::PushCmdQueue(struct cmd_s *cmd) 75cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu{ 76cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu int ret; 77cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu 78cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu pthread_mutex_lock(&lock); 79cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu ret = queue_push_tail(&q, cmd); 80cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu if (ret) { 81cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu pthread_mutex_unlock(&lock); 82cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu return OMX_ErrorInsufficientResources; 83cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu } 84cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu 85cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu workq->ScheduleWork(this); 86cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu pthread_mutex_unlock(&lock); 87cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu 88cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu return OMX_ErrorNone; 89cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu} 90cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu 91cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryustruct cmd_s *CmdProcessWork::PopCmdQueue(void) 92cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu{ 93cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu struct cmd_s *cmd; 94cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu 95cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu pthread_mutex_lock(&lock); 96cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu cmd = (struct cmd_s *)queue_pop_head(&q); 97cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu pthread_mutex_unlock(&lock); 98cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu 99cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu return cmd; 100cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu} 101cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu 102cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryuvoid CmdProcessWork::Work(void) 103cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu{ 104cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu struct cmd_s *cmd; 105cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu 106cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu cmd = PopCmdQueue(); 107cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu if (cmd) { 108cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu ci->CmdHandler(cmd); 109cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu free(cmd); 110cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu } 111cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu} 112cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu 1135ab694059dd6abe79303fdf2712a974d9d2e29d4Ho-Eun Ryu/* end of CmdProcessWork */ 1145ab694059dd6abe79303fdf2712a974d9d2e29d4Ho-Eun Ryu 115cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu/* 11620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu * ComponentBase 11720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu */ 11820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu/* 11920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu * constructor & destructor 12020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu */ 12120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryuvoid ComponentBase::__ComponentBase(void) 12220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 12320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu memset(name, 0, OMX_MAX_STRINGNAME_SIZE); 12420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu cmodule = NULL; 1259b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu handle = NULL; 12620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 12720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu roles = NULL; 12820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu nr_roles = 0; 129cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu 1305f3dea3773e2a740d6389e9f0de70d3078c0dcc8Ho-Eun Ryu working_role = NULL; 1315f3dea3773e2a740d6389e9f0de70d3078c0dcc8Ho-Eun Ryu 1325ab694059dd6abe79303fdf2712a974d9d2e29d4Ho-Eun Ryu ports = NULL; 1335ab694059dd6abe79303fdf2712a974d9d2e29d4Ho-Eun Ryu nr_ports = 0; 134c87a1a8f47c29d4eddf1ea0093c32b8eee04a239ywan mEnableAdaptivePlayback = OMX_FALSE; 1355ab694059dd6abe79303fdf2712a974d9d2e29d4Ho-Eun Ryu memset(&portparam, 0, sizeof(portparam)); 1365ab694059dd6abe79303fdf2712a974d9d2e29d4Ho-Eun Ryu 137abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu state = OMX_StateUnloaded; 138abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 139f41f0fecd2ff9e720aebab649a03968eaa3d0380Ho-Eun Ryu cmdwork = NULL; 14022d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu 141f41f0fecd2ff9e720aebab649a03968eaa3d0380Ho-Eun Ryu bufferwork = NULL; 14222d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu 14322d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu pthread_mutex_init(&ports_block, NULL); 144d438ab4e1c4dde0b5e0aa7c44186137b2d2adaa5Gu, Wangyi pthread_mutex_init(&state_block, NULL); 14520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 14620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 14720fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuComponentBase::ComponentBase() 14820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 14920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu __ComponentBase(); 15020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 15120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 15220fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuComponentBase::ComponentBase(const OMX_STRING name) 15320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 15420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu __ComponentBase(); 15520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu SetName(name); 15620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 15720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 15820fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuComponentBase::~ComponentBase() 15920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 16022d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu pthread_mutex_destroy(&ports_block); 161d438ab4e1c4dde0b5e0aa7c44186137b2d2adaa5Gu, Wangyi pthread_mutex_destroy(&state_block); 16222d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu 16320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (roles) { 164eb6bd3c1dc051d62789fcccf108a6fc382d4fa71Ho-Eun Ryu if (roles[0]) 165eb6bd3c1dc051d62789fcccf108a6fc382d4fa71Ho-Eun Ryu free(roles[0]); 16620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu free(roles); 16720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu } 16820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 16920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 1709b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu/* end of constructor & destructor */ 1719b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu 17220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu/* 17320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu * accessor 17420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu */ 17520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu/* name */ 17620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryuvoid ComponentBase::SetName(const OMX_STRING name) 17720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 1780fc2a2b43fa4b6f11f667aacea2e8f4ebe049eeewfeng strncpy(this->name, name, (strlen(name) < OMX_MAX_STRINGNAME_SIZE) ? strlen(name) : (OMX_MAX_STRINGNAME_SIZE-1)); 17906d2b4622ddb4b2f9ae3bd5eefd4d991c5d69367nguo // strncpy(this->name, name, OMX_MAX_STRINGNAME_SIZE); 18020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu this->name[OMX_MAX_STRINGNAME_SIZE-1] = '\0'; 18120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 18220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 1833f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywanOMX_STRING ComponentBase::GetName(void) 18420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 18520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return name; 18620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 18720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 18820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu/* component module */ 18920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryuvoid ComponentBase::SetCModule(CModule *cmodule) 19020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 19120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu this->cmodule = cmodule; 19220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 19320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 19420fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuCModule *ComponentBase::GetCModule(void) 19520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 19620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return cmodule; 19720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 19820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 1999b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu/* end of accessor */ 2009b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu 2019b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu/* 2029b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu * core methods & helpers 2039b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu */ 2049b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu/* roles */ 2059b88640fe94198cf3f03151136840b04014a0a7dHo-Eun RyuOMX_ERRORTYPE ComponentBase::SetRolesOfComponent(OMX_U32 nr_roles, 2069b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu const OMX_U8 **roles) 2079b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu{ 2089b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu OMX_U32 i; 2099b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu 21046138beb319d1ab8d281fc442cc594c3f6bcc305Ho-Eun Ryu if (!roles || !nr_roles) 21146138beb319d1ab8d281fc442cc594c3f6bcc305Ho-Eun Ryu return OMX_ErrorBadParameter; 21246138beb319d1ab8d281fc442cc594c3f6bcc305Ho-Eun Ryu 21346138beb319d1ab8d281fc442cc594c3f6bcc305Ho-Eun Ryu if (this->roles) { 21446138beb319d1ab8d281fc442cc594c3f6bcc305Ho-Eun Ryu free(this->roles[0]); 21546138beb319d1ab8d281fc442cc594c3f6bcc305Ho-Eun Ryu free(this->roles); 21646138beb319d1ab8d281fc442cc594c3f6bcc305Ho-Eun Ryu this->roles = NULL; 21746138beb319d1ab8d281fc442cc594c3f6bcc305Ho-Eun Ryu } 21846138beb319d1ab8d281fc442cc594c3f6bcc305Ho-Eun Ryu 2199b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu this->roles = (OMX_U8 **)malloc(sizeof(OMX_STRING) * nr_roles); 2209b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu if (!this->roles) 2219b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu return OMX_ErrorInsufficientResources; 2229b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu 223eb6bd3c1dc051d62789fcccf108a6fc382d4fa71Ho-Eun Ryu this->roles[0] = (OMX_U8 *)malloc(OMX_MAX_STRINGNAME_SIZE * nr_roles); 224eb6bd3c1dc051d62789fcccf108a6fc382d4fa71Ho-Eun Ryu if (!this->roles[0]) { 22546138beb319d1ab8d281fc442cc594c3f6bcc305Ho-Eun Ryu free(this->roles); 22646138beb319d1ab8d281fc442cc594c3f6bcc305Ho-Eun Ryu this->roles = NULL; 22746138beb319d1ab8d281fc442cc594c3f6bcc305Ho-Eun Ryu return OMX_ErrorInsufficientResources; 22846138beb319d1ab8d281fc442cc594c3f6bcc305Ho-Eun Ryu } 2299b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu 23046138beb319d1ab8d281fc442cc594c3f6bcc305Ho-Eun Ryu for (i = 0; i < nr_roles; i++) { 23146138beb319d1ab8d281fc442cc594c3f6bcc305Ho-Eun Ryu if (i < nr_roles-1) 232379a6101a5370d1310ce773972513581d254efd7Ho-Eun Ryu this->roles[i+1] = this->roles[i] + OMX_MAX_STRINGNAME_SIZE; 2339b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu 2349b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu strncpy((OMX_STRING)&this->roles[i][0], 23546138beb319d1ab8d281fc442cc594c3f6bcc305Ho-Eun Ryu (const OMX_STRING)&roles[i][0], OMX_MAX_STRINGNAME_SIZE); 2369b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu } 2379b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu 2389b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu this->nr_roles = nr_roles; 2399b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu return OMX_ErrorNone; 2409b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu} 2419b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu 2423ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu/* GetHandle & FreeHandle */ 2433ee08716991119e541a439811c8c74988d7be754Ho-Eun RyuOMX_ERRORTYPE ComponentBase::GetHandle(OMX_HANDLETYPE *pHandle, 2443ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu OMX_PTR pAppData, 2453ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu OMX_CALLBACKTYPE *pCallBacks) 2463ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu{ 2473ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu OMX_ERRORTYPE ret; 2483ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu 249aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu if (!pHandle) 250aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu return OMX_ErrorBadParameter; 251aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu 2523ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu if (handle) 2533ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu return OMX_ErrorUndefined; 2543ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu 255f41f0fecd2ff9e720aebab649a03968eaa3d0380Ho-Eun Ryu cmdwork = new CmdProcessWork(this); 256f41f0fecd2ff9e720aebab649a03968eaa3d0380Ho-Eun Ryu if (!cmdwork) 2573ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu return OMX_ErrorInsufficientResources; 2583ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu 259f41f0fecd2ff9e720aebab649a03968eaa3d0380Ho-Eun Ryu bufferwork = new WorkQueue(); 260f41f0fecd2ff9e720aebab649a03968eaa3d0380Ho-Eun Ryu if (!bufferwork) { 261f41f0fecd2ff9e720aebab649a03968eaa3d0380Ho-Eun Ryu ret = OMX_ErrorInsufficientResources; 262f41f0fecd2ff9e720aebab649a03968eaa3d0380Ho-Eun Ryu goto free_cmdwork; 263f41f0fecd2ff9e720aebab649a03968eaa3d0380Ho-Eun Ryu } 264f41f0fecd2ff9e720aebab649a03968eaa3d0380Ho-Eun Ryu 265f41f0fecd2ff9e720aebab649a03968eaa3d0380Ho-Eun Ryu handle = (OMX_COMPONENTTYPE *)calloc(1, sizeof(*handle)); 266f41f0fecd2ff9e720aebab649a03968eaa3d0380Ho-Eun Ryu if (!handle) { 267f41f0fecd2ff9e720aebab649a03968eaa3d0380Ho-Eun Ryu ret = OMX_ErrorInsufficientResources; 268f41f0fecd2ff9e720aebab649a03968eaa3d0380Ho-Eun Ryu goto free_bufferwork; 269f41f0fecd2ff9e720aebab649a03968eaa3d0380Ho-Eun Ryu } 270f41f0fecd2ff9e720aebab649a03968eaa3d0380Ho-Eun Ryu 2713ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu /* handle initialization */ 2723ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu SetTypeHeader(handle, sizeof(*handle)); 2733ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu handle->pComponentPrivate = static_cast<OMX_PTR>(this); 2743ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu handle->pApplicationPrivate = pAppData; 2753ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu 2763ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu /* connect handle's functions */ 277ec2f29d0c23a6c7ea3a36e03a9635b63ac23ae35XiaoFeng handle->GetComponentVersion = NULL; 2783ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu handle->SendCommand = SendCommand; 2793ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu handle->GetParameter = GetParameter; 2803ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu handle->SetParameter = SetParameter; 2813ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu handle->GetConfig = GetConfig; 2823ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu handle->SetConfig = SetConfig; 2833ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu handle->GetExtensionIndex = GetExtensionIndex; 2843ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu handle->GetState = GetState; 285ec2f29d0c23a6c7ea3a36e03a9635b63ac23ae35XiaoFeng handle->ComponentTunnelRequest = NULL; 2863ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu handle->UseBuffer = UseBuffer; 2873ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu handle->AllocateBuffer = AllocateBuffer; 2883ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu handle->FreeBuffer = FreeBuffer; 2893ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu handle->EmptyThisBuffer = EmptyThisBuffer; 2903ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu handle->FillThisBuffer = FillThisBuffer; 2913ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu handle->SetCallbacks = SetCallbacks; 292ec2f29d0c23a6c7ea3a36e03a9635b63ac23ae35XiaoFeng handle->ComponentDeInit = NULL; 293ec2f29d0c23a6c7ea3a36e03a9635b63ac23ae35XiaoFeng handle->UseEGLImage = NULL; 2943ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu handle->ComponentRoleEnum = ComponentRoleEnum; 2953ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu 2963ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu appdata = pAppData; 2973ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu callbacks = pCallBacks; 2983ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu 299663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu if (nr_roles == 1) { 300663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu SetWorkingRole((OMX_STRING)&roles[0][0]); 301663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu ret = ApplyWorkingRole(); 302663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu if (ret != OMX_ErrorNone) { 303663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu SetWorkingRole(NULL); 304663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu goto free_handle; 305663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu } 306663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu } 307663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu 308663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu *pHandle = (OMX_HANDLETYPE *)handle; 309abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu state = OMX_StateLoaded; 3103ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu return OMX_ErrorNone; 311663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu 312663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryufree_handle: 313663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu free(handle); 314663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu 315663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu appdata = NULL; 316663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu callbacks = NULL; 317663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu *pHandle = NULL; 318663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu 319f41f0fecd2ff9e720aebab649a03968eaa3d0380Ho-Eun Ryufree_bufferwork: 320f41f0fecd2ff9e720aebab649a03968eaa3d0380Ho-Eun Ryu delete bufferwork; 321f41f0fecd2ff9e720aebab649a03968eaa3d0380Ho-Eun Ryu 322f41f0fecd2ff9e720aebab649a03968eaa3d0380Ho-Eun Ryufree_cmdwork: 323f41f0fecd2ff9e720aebab649a03968eaa3d0380Ho-Eun Ryu delete cmdwork; 324f41f0fecd2ff9e720aebab649a03968eaa3d0380Ho-Eun Ryu 325663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu return ret; 3263ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu} 3273ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu 3283ee08716991119e541a439811c8c74988d7be754Ho-Eun RyuOMX_ERRORTYPE ComponentBase::FreeHandle(OMX_HANDLETYPE hComponent) 3293ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu{ 3303ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu if (hComponent != handle) 3313ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu return OMX_ErrorBadParameter; 3323ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu 333a288c2c6afe3d49fe42295955c167cd5c99615fbHo-Eun Ryu if (state != OMX_StateLoaded) 334a288c2c6afe3d49fe42295955c167cd5c99615fbHo-Eun Ryu return OMX_ErrorIncorrectStateOperation; 335a288c2c6afe3d49fe42295955c167cd5c99615fbHo-Eun Ryu 33606a26665054225a20ebb0f9b684a71a18bd68723Ho-Eun Ryu FreePorts(); 3373ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu 3383ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu free(handle); 3393ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu 3403ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu appdata = NULL; 3413ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu callbacks = NULL; 3423ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu 343f41f0fecd2ff9e720aebab649a03968eaa3d0380Ho-Eun Ryu delete cmdwork; 344f41f0fecd2ff9e720aebab649a03968eaa3d0380Ho-Eun Ryu delete bufferwork; 345f41f0fecd2ff9e720aebab649a03968eaa3d0380Ho-Eun Ryu 346abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu state = OMX_StateUnloaded; 3473ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu return OMX_ErrorNone; 3483ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu} 3493ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu 3509b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu/* end of core methods & helpers */ 3519b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu 35220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu/* 35320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu * component methods & helpers 35420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu */ 35520fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuOMX_ERRORTYPE ComponentBase::SendCommand( 35620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_HANDLETYPE hComponent, 35720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_COMMANDTYPE Cmd, 35820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_U32 nParam1, 35920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_PTR pCmdData) 36020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 36120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu ComponentBase *cbase; 36220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 36320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!hComponent) 36420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return OMX_ErrorBadParameter; 36520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 36620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu cbase = static_cast<ComponentBase *> 36720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu (((OMX_COMPONENTTYPE *)hComponent)->pComponentPrivate); 36820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!cbase) 36920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return OMX_ErrorBadParameter; 37020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 37120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return cbase->CBaseSendCommand(hComponent, Cmd, nParam1, pCmdData); 37220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 37320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 37420fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuOMX_ERRORTYPE ComponentBase::CBaseSendCommand( 37520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_HANDLETYPE hComponent, 37620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_COMMANDTYPE Cmd, 37720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_U32 nParam1, 37820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_PTR pCmdData) 37920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 380cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu struct cmd_s *cmd; 38120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 382cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu if (hComponent != handle) 383cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu return OMX_ErrorInvalidComponent; 384cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu 385cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu /* basic error check */ 386cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu switch (Cmd) { 387cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu case OMX_CommandStateSet: 388cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu /* 389cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu * Todo 390cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu */ 391cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu break; 392dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu case OMX_CommandFlush: { 393dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu OMX_U32 port_index = nParam1; 394dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu 395dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu if ((port_index != OMX_ALL) && (port_index > nr_ports-1)) 396dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu return OMX_ErrorBadPortIndex; 397dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu break; 398dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu } 399cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu case OMX_CommandPortDisable: 400b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu case OMX_CommandPortEnable: { 401b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu OMX_U32 port_index = nParam1; 402b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu 403b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu if ((port_index != OMX_ALL) && (port_index > nr_ports-1)) 404b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu return OMX_ErrorBadPortIndex; 405b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu break; 406b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu } 40784536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu case OMX_CommandMarkBuffer: { 40884536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu OMX_MARKTYPE *mark = (OMX_MARKTYPE *)pCmdData; 40984536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu OMX_MARKTYPE *copiedmark; 41084536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu OMX_U32 port_index = nParam1; 41184536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu 41284536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu if (port_index > nr_ports-1) 41384536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu return OMX_ErrorBadPortIndex; 41484536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu 41584536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu if (!mark || !mark->hMarkTargetComponent) 41684536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu return OMX_ErrorBadParameter; 41784536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu 41884536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu copiedmark = (OMX_MARKTYPE *)malloc(sizeof(*copiedmark)); 41984536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu if (!copiedmark) 42084536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu return OMX_ErrorInsufficientResources; 42184536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu 42284536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu copiedmark->hMarkTargetComponent = mark->hMarkTargetComponent; 42384536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu copiedmark->pMarkData = mark->pMarkData; 42484536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu pCmdData = (OMX_PTR)copiedmark; 42584536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu break; 42684536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu } 427cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu default: 428cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu LOGE("command %d not supported\n", Cmd); 429cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu return OMX_ErrorUnsupportedIndex; 430cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu } 431cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu 432cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu cmd = (struct cmd_s *)malloc(sizeof(*cmd)); 433cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu if (!cmd) 434cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu return OMX_ErrorInsufficientResources; 435cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu 436cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu cmd->cmd = Cmd; 437cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu cmd->param1 = nParam1; 438cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu cmd->cmddata = pCmdData; 439cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu 440cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu return cmdwork->PushCmdQueue(cmd); 44120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 44220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 44320fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuOMX_ERRORTYPE ComponentBase::GetParameter( 44420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_HANDLETYPE hComponent, 44520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_INDEXTYPE nParamIndex, 44620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_INOUT OMX_PTR pComponentParameterStructure) 44720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 44820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu ComponentBase *cbase; 44920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 45020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!hComponent) 45120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return OMX_ErrorBadParameter; 45220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 45320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu cbase = static_cast<ComponentBase *> 45420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu (((OMX_COMPONENTTYPE *)hComponent)->pComponentPrivate); 45520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!cbase) 45620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return OMX_ErrorBadParameter; 45720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 45820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return cbase->CBaseGetParameter(hComponent, nParamIndex, 45920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu pComponentParameterStructure); 46020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 46120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 46220fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuOMX_ERRORTYPE ComponentBase::CBaseGetParameter( 46320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_HANDLETYPE hComponent, 46420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_INDEXTYPE nParamIndex, 46520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_INOUT OMX_PTR pComponentParameterStructure) 46620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 467d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu OMX_ERRORTYPE ret = OMX_ErrorNone; 46820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 4696790df551efca72bca4fb25bd53a3b7259ecb3f7Ho-Eun Ryu if (hComponent != handle) 4706790df551efca72bca4fb25bd53a3b7259ecb3f7Ho-Eun Ryu return OMX_ErrorBadParameter; 471d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu switch (nParamIndex) { 472d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu case OMX_IndexParamAudioInit: 473d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu case OMX_IndexParamVideoInit: 474d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu case OMX_IndexParamImageInit: 475d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu case OMX_IndexParamOtherInit: { 476d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu OMX_PORT_PARAM_TYPE *p = 477d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu (OMX_PORT_PARAM_TYPE *)pComponentParameterStructure; 478d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu 4795bd597eb6ce245c1343e9e66bf544b6ef4a7c7a5Ho-Eun Ryu ret = CheckTypeHeader(p, sizeof(*p)); 4805bd597eb6ce245c1343e9e66bf544b6ef4a7c7a5Ho-Eun Ryu if (ret != OMX_ErrorNone) 4815bd597eb6ce245c1343e9e66bf544b6ef4a7c7a5Ho-Eun Ryu return ret; 4825bd597eb6ce245c1343e9e66bf544b6ef4a7c7a5Ho-Eun Ryu 483d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu memcpy(p, &portparam, sizeof(*p)); 484d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu break; 485d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu } 486d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu case OMX_IndexParamPortDefinition: { 487d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu OMX_PARAM_PORTDEFINITIONTYPE *p = 488d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu (OMX_PARAM_PORTDEFINITIONTYPE *)pComponentParameterStructure; 489d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu OMX_U32 index = p->nPortIndex; 49087c753e71b7f92bc737f47b0bb406252494d8952Ho-Eun Ryu PortBase *port = NULL; 491d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu 4925bd597eb6ce245c1343e9e66bf544b6ef4a7c7a5Ho-Eun Ryu ret = CheckTypeHeader(p, sizeof(*p)); 4935bd597eb6ce245c1343e9e66bf544b6ef4a7c7a5Ho-Eun Ryu if (ret != OMX_ErrorNone) 4945bd597eb6ce245c1343e9e66bf544b6ef4a7c7a5Ho-Eun Ryu return ret; 4955bd597eb6ce245c1343e9e66bf544b6ef4a7c7a5Ho-Eun Ryu 49687c753e71b7f92bc737f47b0bb406252494d8952Ho-Eun Ryu if (index < nr_ports) 49787c753e71b7f92bc737f47b0bb406252494d8952Ho-Eun Ryu port = ports[index]; 49887c753e71b7f92bc737f47b0bb406252494d8952Ho-Eun Ryu 49987c753e71b7f92bc737f47b0bb406252494d8952Ho-Eun Ryu if (!port) 50062c24b4b9a0869f519ea32b6731c2379c4cbca04Ho-Eun Ryu return OMX_ErrorBadPortIndex; 50187c753e71b7f92bc737f47b0bb406252494d8952Ho-Eun Ryu 502927a17efb5e89aa8a5153bc6eb0940a7de18e2f0Ho-Eun Ryu memcpy(p, port->GetPortDefinition(), sizeof(*p)); 503d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu break; 504d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu } 505d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu case OMX_IndexParamCompBufferSupplier: 506d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu /* 507d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu * Todo 508d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu */ 509d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu 510d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu ret = OMX_ErrorUnsupportedIndex; 511d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu break; 51234277d8b1ca48a932e7b17ba331c29f040ba0838xiao 513d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu default: 514d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu ret = ComponentGetParameter(nParamIndex, pComponentParameterStructure); 515d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu } /* switch */ 516d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu 517d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu return ret; 51820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 51920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 52020fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuOMX_ERRORTYPE ComponentBase::SetParameter( 52120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_HANDLETYPE hComponent, 52220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_INDEXTYPE nIndex, 52320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_PTR pComponentParameterStructure) 52420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 52520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu ComponentBase *cbase; 52620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 52720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!hComponent) 52820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return OMX_ErrorBadParameter; 52920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 53020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu cbase = static_cast<ComponentBase *> 53120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu (((OMX_COMPONENTTYPE *)hComponent)->pComponentPrivate); 53220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!cbase) 53320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return OMX_ErrorBadParameter; 53420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 53520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return cbase->CBaseSetParameter(hComponent, nIndex, 53620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu pComponentParameterStructure); 53720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 53820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 53920fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuOMX_ERRORTYPE ComponentBase::CBaseSetParameter( 54020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_HANDLETYPE hComponent, 54120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_INDEXTYPE nIndex, 54220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_PTR pComponentParameterStructure) 54320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 544d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu OMX_ERRORTYPE ret = OMX_ErrorNone; 54520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 5466790df551efca72bca4fb25bd53a3b7259ecb3f7Ho-Eun Ryu if (hComponent != handle) 5476790df551efca72bca4fb25bd53a3b7259ecb3f7Ho-Eun Ryu return OMX_ErrorBadParameter; 5486790df551efca72bca4fb25bd53a3b7259ecb3f7Ho-Eun Ryu 549d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu switch (nIndex) { 550d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu case OMX_IndexParamAudioInit: 551d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu case OMX_IndexParamVideoInit: 552d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu case OMX_IndexParamImageInit: 55380bed9fce1d0fce4be04171716b4d7d1ec23b45cHo-Eun Ryu case OMX_IndexParamOtherInit: 55480bed9fce1d0fce4be04171716b4d7d1ec23b45cHo-Eun Ryu /* preventing clients from setting OMX_PORT_PARAM_TYPE */ 55580bed9fce1d0fce4be04171716b4d7d1ec23b45cHo-Eun Ryu ret = OMX_ErrorUnsupportedIndex; 556d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu break; 557d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu case OMX_IndexParamPortDefinition: { 558d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu OMX_PARAM_PORTDEFINITIONTYPE *p = 559d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu (OMX_PARAM_PORTDEFINITIONTYPE *)pComponentParameterStructure; 560d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu OMX_U32 index = p->nPortIndex; 56187c753e71b7f92bc737f47b0bb406252494d8952Ho-Eun Ryu PortBase *port = NULL; 562d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu 5635bd597eb6ce245c1343e9e66bf544b6ef4a7c7a5Ho-Eun Ryu ret = CheckTypeHeader(p, sizeof(*p)); 5645bd597eb6ce245c1343e9e66bf544b6ef4a7c7a5Ho-Eun Ryu if (ret != OMX_ErrorNone) 5655bd597eb6ce245c1343e9e66bf544b6ef4a7c7a5Ho-Eun Ryu return ret; 5665bd597eb6ce245c1343e9e66bf544b6ef4a7c7a5Ho-Eun Ryu 56787c753e71b7f92bc737f47b0bb406252494d8952Ho-Eun Ryu if (index < nr_ports) 56887c753e71b7f92bc737f47b0bb406252494d8952Ho-Eun Ryu port = ports[index]; 56987c753e71b7f92bc737f47b0bb406252494d8952Ho-Eun Ryu 57087c753e71b7f92bc737f47b0bb406252494d8952Ho-Eun Ryu if (!port) 57162c24b4b9a0869f519ea32b6731c2379c4cbca04Ho-Eun Ryu return OMX_ErrorBadPortIndex; 57287c753e71b7f92bc737f47b0bb406252494d8952Ho-Eun Ryu 57308e7a75302b433817bc8ee27b64672434d091ed6Ho-Eun Ryu if (port->IsEnabled()) { 57408e7a75302b433817bc8ee27b64672434d091ed6Ho-Eun Ryu if (state != OMX_StateLoaded && state != OMX_StateWaitForResources) 57508e7a75302b433817bc8ee27b64672434d091ed6Ho-Eun Ryu return OMX_ErrorIncorrectStateOperation; 57608e7a75302b433817bc8ee27b64672434d091ed6Ho-Eun Ryu } 57708e7a75302b433817bc8ee27b64672434d091ed6Ho-Eun Ryu 578c87a1a8f47c29d4eddf1ea0093c32b8eee04a239ywan if (index == 1 && mEnableAdaptivePlayback == OMX_TRUE) { 579c87a1a8f47c29d4eddf1ea0093c32b8eee04a239ywan if (p->format.video.nFrameWidth < mMaxFrameWidth) 580c87a1a8f47c29d4eddf1ea0093c32b8eee04a239ywan p->format.video.nFrameWidth = mMaxFrameWidth; 581c87a1a8f47c29d4eddf1ea0093c32b8eee04a239ywan if (p->format.video.nFrameHeight < mMaxFrameHeight) 582c87a1a8f47c29d4eddf1ea0093c32b8eee04a239ywan p->format.video.nFrameHeight = mMaxFrameHeight; 583c87a1a8f47c29d4eddf1ea0093c32b8eee04a239ywan } 584c87a1a8f47c29d4eddf1ea0093c32b8eee04a239ywan 585a4315bcc3603ce74c2faeb4b81563dd3396cbd64gji if (working_role != NULL && !strncmp((char*)working_role, "video_encoder", 13)) { 586a55635021d692b693ba02505ec23e8ae0298e6e2gji if (p->format.video.nFrameWidth > 2048 || p->format.video.nFrameHeight > 2048) 587a55635021d692b693ba02505ec23e8ae0298e6e2gji return OMX_ErrorUnsupportedSetting; 588a55635021d692b693ba02505ec23e8ae0298e6e2gji 589a4315bcc3603ce74c2faeb4b81563dd3396cbd64gji if(p->format.video.eColorFormat == OMX_COLOR_FormatUnused) 590a4315bcc3603ce74c2faeb4b81563dd3396cbd64gji p->nBufferSize = p->format.video.nFrameWidth * p->format.video.nFrameHeight *3/2; 591a4315bcc3603ce74c2faeb4b81563dd3396cbd64gji } 592a4315bcc3603ce74c2faeb4b81563dd3396cbd64gji 5936a3d9478ea33b4e734cbcbc88d3f258c2cac94bbAustin Hu if ((p->format.video.eColorFormat == OMX_COLOR_FormatUnused) || 5946a3d9478ea33b4e734cbcbc88d3f258c2cac94bbAustin Hu (p->format.video.eColorFormat == OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar) || 5956a3d9478ea33b4e734cbcbc88d3f258c2cac94bbAustin Hu (p->format.video.eColorFormat == OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar_Tiled)) 5966a3d9478ea33b4e734cbcbc88d3f258c2cac94bbAustin Hu p->format.video.eColorFormat = GetOutputColorFormat(p->format.video.nFrameWidth); 5976a3d9478ea33b4e734cbcbc88d3f258c2cac94bbAustin Hu 598c3e26983a72fa51f0dff98bc66234b73f74adc17wfeng ret = port->SetPortDefinition(p, false); 599c3e26983a72fa51f0dff98bc66234b73f74adc17wfeng if (ret != OMX_ErrorNone) { 600c3e26983a72fa51f0dff98bc66234b73f74adc17wfeng return ret; 601c3e26983a72fa51f0dff98bc66234b73f74adc17wfeng } 602d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu break; 603d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu } 604d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu case OMX_IndexParamCompBufferSupplier: 605c2067bb142cdbc423de50cf97811425a8ab3ff1aHo-Eun Ryu /* 606c2067bb142cdbc423de50cf97811425a8ab3ff1aHo-Eun Ryu * Todo 607c2067bb142cdbc423de50cf97811425a8ab3ff1aHo-Eun Ryu */ 608c2067bb142cdbc423de50cf97811425a8ab3ff1aHo-Eun Ryu 609d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu ret = OMX_ErrorUnsupportedIndex; 610d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu break; 61120d24dd0df20095a26ad14d06e0eb2a301f7f6a8Ho-Eun Ryu case OMX_IndexParamStandardComponentRole: { 61220d24dd0df20095a26ad14d06e0eb2a301f7f6a8Ho-Eun Ryu OMX_PARAM_COMPONENTROLETYPE *p = 61320d24dd0df20095a26ad14d06e0eb2a301f7f6a8Ho-Eun Ryu (OMX_PARAM_COMPONENTROLETYPE *)pComponentParameterStructure; 61420d24dd0df20095a26ad14d06e0eb2a301f7f6a8Ho-Eun Ryu 61508e7a75302b433817bc8ee27b64672434d091ed6Ho-Eun Ryu if (state != OMX_StateLoaded && state != OMX_StateWaitForResources) 61608e7a75302b433817bc8ee27b64672434d091ed6Ho-Eun Ryu return OMX_ErrorIncorrectStateOperation; 61708e7a75302b433817bc8ee27b64672434d091ed6Ho-Eun Ryu 6185bd597eb6ce245c1343e9e66bf544b6ef4a7c7a5Ho-Eun Ryu ret = CheckTypeHeader(p, sizeof(*p)); 6195bd597eb6ce245c1343e9e66bf544b6ef4a7c7a5Ho-Eun Ryu if (ret != OMX_ErrorNone) 6205bd597eb6ce245c1343e9e66bf544b6ef4a7c7a5Ho-Eun Ryu return ret; 6215bd597eb6ce245c1343e9e66bf544b6ef4a7c7a5Ho-Eun Ryu 62220d24dd0df20095a26ad14d06e0eb2a301f7f6a8Ho-Eun Ryu ret = SetWorkingRole((OMX_STRING)p->cRole); 62320d24dd0df20095a26ad14d06e0eb2a301f7f6a8Ho-Eun Ryu if (ret != OMX_ErrorNone) 62420d24dd0df20095a26ad14d06e0eb2a301f7f6a8Ho-Eun Ryu return ret; 625663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu 626663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu if (ports) 627663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu FreePorts(); 628663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu 629663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu ret = ApplyWorkingRole(); 630663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu if (ret != OMX_ErrorNone) { 631663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu SetWorkingRole(NULL); 632663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu return ret; 633663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu } 63420d24dd0df20095a26ad14d06e0eb2a301f7f6a8Ho-Eun Ryu break; 63520d24dd0df20095a26ad14d06e0eb2a301f7f6a8Ho-Eun Ryu } 6363f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan default: 6373f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan if (nIndex == (OMX_INDEXTYPE)OMX_IndexExtPrepareForAdaptivePlayback) { 6383f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan android::PrepareForAdaptivePlaybackParams* p = 6393f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan (android::PrepareForAdaptivePlaybackParams *)pComponentParameterStructure; 640c87a1a8f47c29d4eddf1ea0093c32b8eee04a239ywan 6413f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan ret = CheckTypeHeader(p, sizeof(*p)); 6423f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan if (ret != OMX_ErrorNone) 6433f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan return ret; 644c87a1a8f47c29d4eddf1ea0093c32b8eee04a239ywan 6453f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan if (p->nPortIndex != 1) 6463f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan return OMX_ErrorBadPortIndex; 647c87a1a8f47c29d4eddf1ea0093c32b8eee04a239ywan 6483f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan if (!(working_role != NULL && !strncmp((char*)working_role, "video_decoder", 13))) 6493f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan return OMX_ErrorBadParameter; 650c87a1a8f47c29d4eddf1ea0093c32b8eee04a239ywan 6513f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan if (p->nMaxFrameWidth > kMaxAdaptiveStreamingWidth 6523f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan || p->nMaxFrameHeight > kMaxAdaptiveStreamingHeight) { 6533f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan LOGE("resolution %d x %d exceed max driver support %d x %d\n",p->nMaxFrameWidth, p->nMaxFrameHeight, 6543f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan kMaxAdaptiveStreamingWidth, kMaxAdaptiveStreamingHeight); 6553f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan return OMX_ErrorBadParameter; 6563f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan } 657aba5931866f6b482539b82cb42ab108d291bba57ywan 658aba5931866f6b482539b82cb42ab108d291bba57ywan if (GetWorkingRole() != NULL && 659aba5931866f6b482539b82cb42ab108d291bba57ywan !strcmp (GetWorkingRole(),"video_decoder.vp9")) { 660aba5931866f6b482539b82cb42ab108d291bba57ywan if (p->nMaxFrameWidth < 640 && p->nMaxFrameHeight < 480) { 661aba5931866f6b482539b82cb42ab108d291bba57ywan p->nMaxFrameHeight = kMaxAdaptiveStreamingHeight; 662aba5931866f6b482539b82cb42ab108d291bba57ywan p->nMaxFrameWidth = kMaxAdaptiveStreamingWidth; 663aba5931866f6b482539b82cb42ab108d291bba57ywan } 664aba5931866f6b482539b82cb42ab108d291bba57ywan } 665aba5931866f6b482539b82cb42ab108d291bba57ywan 6663f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan mEnableAdaptivePlayback = p->bEnable; 6673f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan if (mEnableAdaptivePlayback != OMX_TRUE) 6683f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan return OMX_ErrorBadParameter; 6693f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan 6703f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan mMaxFrameWidth = p->nMaxFrameWidth; 6713f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan mMaxFrameHeight = p->nMaxFrameHeight; 6723f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan /* update output port definition */ 6733f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan OMX_PARAM_PORTDEFINITIONTYPE paramPortDefinitionOutput; 6743f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan if (nr_ports > p->nPortIndex && ports[p->nPortIndex]) { 6753f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan memcpy(¶mPortDefinitionOutput,ports[p->nPortIndex]->GetPortDefinition(), 6763f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan sizeof(paramPortDefinitionOutput)); 6773f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan paramPortDefinitionOutput.format.video.nFrameWidth = mMaxFrameWidth; 6783f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan paramPortDefinitionOutput.format.video.nFrameHeight = mMaxFrameHeight; 6793f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan ports[p->nPortIndex]->SetPortDefinition(¶mPortDefinitionOutput, true); 6803f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan } 6813f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan } else { 6823f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan ret = ComponentSetParameter(nIndex, pComponentParameterStructure); 683c87a1a8f47c29d4eddf1ea0093c32b8eee04a239ywan } 684c87a1a8f47c29d4eddf1ea0093c32b8eee04a239ywan break; 685d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu } /* switch */ 686d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu 687d8b921cd23e85c61acf2422a617943ac378cccc4Ho-Eun Ryu return ret; 68820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 68920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 69020fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuOMX_ERRORTYPE ComponentBase::GetConfig( 69120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_HANDLETYPE hComponent, 69220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_INDEXTYPE nIndex, 69320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_INOUT OMX_PTR pComponentConfigStructure) 69420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 69520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu ComponentBase *cbase; 69620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 69720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!hComponent) 69820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return OMX_ErrorBadParameter; 69920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 70020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu cbase = static_cast<ComponentBase *> 70120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu (((OMX_COMPONENTTYPE *)hComponent)->pComponentPrivate); 70220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!cbase) 70320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return OMX_ErrorBadParameter; 70420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 70520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return cbase->CBaseGetConfig(hComponent, nIndex, 70620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu pComponentConfigStructure); 70720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 70820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 70920fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuOMX_ERRORTYPE ComponentBase::CBaseGetConfig( 71020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_HANDLETYPE hComponent, 71120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_INDEXTYPE nIndex, 71220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_INOUT OMX_PTR pComponentConfigStructure) 71320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 714e3be2d84503a7693ece53adbcf26ee243eea1b87Ho-Eun Ryu OMX_ERRORTYPE ret; 71520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 716e3be2d84503a7693ece53adbcf26ee243eea1b87Ho-Eun Ryu if (hComponent != handle) 717e3be2d84503a7693ece53adbcf26ee243eea1b87Ho-Eun Ryu return OMX_ErrorBadParameter; 718e3be2d84503a7693ece53adbcf26ee243eea1b87Ho-Eun Ryu 719e3be2d84503a7693ece53adbcf26ee243eea1b87Ho-Eun Ryu switch (nIndex) { 720e3be2d84503a7693ece53adbcf26ee243eea1b87Ho-Eun Ryu default: 721e3be2d84503a7693ece53adbcf26ee243eea1b87Ho-Eun Ryu ret = ComponentGetConfig(nIndex, pComponentConfigStructure); 722e3be2d84503a7693ece53adbcf26ee243eea1b87Ho-Eun Ryu } 723e3be2d84503a7693ece53adbcf26ee243eea1b87Ho-Eun Ryu 724e3be2d84503a7693ece53adbcf26ee243eea1b87Ho-Eun Ryu return ret; 72520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 72620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 72720fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuOMX_ERRORTYPE ComponentBase::SetConfig( 72820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_HANDLETYPE hComponent, 72920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_INDEXTYPE nIndex, 73020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_PTR pComponentConfigStructure) 73120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 73220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu ComponentBase *cbase; 73320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 73420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!hComponent) 73520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return OMX_ErrorBadParameter; 73620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 73720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu cbase = static_cast<ComponentBase *> 73820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu (((OMX_COMPONENTTYPE *)hComponent)->pComponentPrivate); 73920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!cbase) 74020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return OMX_ErrorBadParameter; 74120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 74220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return cbase->CBaseSetConfig(hComponent, nIndex, 74320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu pComponentConfigStructure); 74420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 74520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 74620fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuOMX_ERRORTYPE ComponentBase::CBaseSetConfig( 74720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_HANDLETYPE hComponent, 74820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_INDEXTYPE nIndex, 74920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_PTR pComponentConfigStructure) 75020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 751e3be2d84503a7693ece53adbcf26ee243eea1b87Ho-Eun Ryu OMX_ERRORTYPE ret; 752666f8b21fe0923595def20b16e9e7eefa11308b2Tao Tao 753e3be2d84503a7693ece53adbcf26ee243eea1b87Ho-Eun Ryu if (hComponent != handle) 754e3be2d84503a7693ece53adbcf26ee243eea1b87Ho-Eun Ryu return OMX_ErrorBadParameter; 755e3be2d84503a7693ece53adbcf26ee243eea1b87Ho-Eun Ryu 756e3be2d84503a7693ece53adbcf26ee243eea1b87Ho-Eun Ryu switch (nIndex) { 757e3be2d84503a7693ece53adbcf26ee243eea1b87Ho-Eun Ryu default: 758e3be2d84503a7693ece53adbcf26ee243eea1b87Ho-Eun Ryu ret = ComponentSetConfig(nIndex, pComponentConfigStructure); 759e3be2d84503a7693ece53adbcf26ee243eea1b87Ho-Eun Ryu } 760e3be2d84503a7693ece53adbcf26ee243eea1b87Ho-Eun Ryu 761e3be2d84503a7693ece53adbcf26ee243eea1b87Ho-Eun Ryu return ret; 76220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 76320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 76420fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuOMX_ERRORTYPE ComponentBase::GetExtensionIndex( 76520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_HANDLETYPE hComponent, 76620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_STRING cParameterName, 76720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_OUT OMX_INDEXTYPE* pIndexType) 76820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 76920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu ComponentBase *cbase; 77020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 77120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!hComponent) 77220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return OMX_ErrorBadParameter; 77320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 77420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu cbase = static_cast<ComponentBase *> 77520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu (((OMX_COMPONENTTYPE *)hComponent)->pComponentPrivate); 77620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!cbase) 77720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return OMX_ErrorBadParameter; 77820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 77920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return cbase->CBaseGetExtensionIndex(hComponent, cParameterName, 78020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu pIndexType); 78120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 78220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 78320fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuOMX_ERRORTYPE ComponentBase::CBaseGetExtensionIndex( 78420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_HANDLETYPE hComponent, 78520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_STRING cParameterName, 78620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_OUT OMX_INDEXTYPE* pIndexType) 78720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 78834277d8b1ca48a932e7b17ba331c29f040ba0838xiao /* 78934277d8b1ca48a932e7b17ba331c29f040ba0838xiao * Todo 79034277d8b1ca48a932e7b17ba331c29f040ba0838xiao */ 79144e493bfd5e5abeadd4431e294d3108235bdeb29Shuo Liu if (hComponent != handle) { 79220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 79334277d8b1ca48a932e7b17ba331c29f040ba0838xiao return OMX_ErrorBadParameter; 79444e493bfd5e5abeadd4431e294d3108235bdeb29Shuo Liu } 79544e493bfd5e5abeadd4431e294d3108235bdeb29Shuo Liu 79692528264a273da7a58fefc7b77b0437bbcc6c330Yong Yao if (!strcmp(cParameterName, "OMX.google.android.index.storeMetaDataInBuffers")) { 79792528264a273da7a58fefc7b77b0437bbcc6c330Yong Yao *pIndexType = static_cast<OMX_INDEXTYPE>(OMX_IndexStoreMetaDataInBuffers); 79892528264a273da7a58fefc7b77b0437bbcc6c330Yong Yao return OMX_ErrorNone; 79992528264a273da7a58fefc7b77b0437bbcc6c330Yong Yao } 80092528264a273da7a58fefc7b77b0437bbcc6c330Yong Yao 80181df951a8711fe300306e8c179677efea58adb65xiao if (!strcmp(cParameterName, "OMX.google.android.index.enableAndroidNativeBuffers")) { 80234277d8b1ca48a932e7b17ba331c29f040ba0838xiao *pIndexType = static_cast<OMX_INDEXTYPE>(OMX_IndexExtEnableNativeBuffer); 80334277d8b1ca48a932e7b17ba331c29f040ba0838xiao return OMX_ErrorNone; 80434277d8b1ca48a932e7b17ba331c29f040ba0838xiao } 80534277d8b1ca48a932e7b17ba331c29f040ba0838xiao 80681df951a8711fe300306e8c179677efea58adb65xiao if (!strcmp(cParameterName, "OMX.google.android.index.getAndroidNativeBufferUsage")) { 80734277d8b1ca48a932e7b17ba331c29f040ba0838xiao *pIndexType = static_cast<OMX_INDEXTYPE>(OMX_IndexExtGetNativeBufferUsage); 80834277d8b1ca48a932e7b17ba331c29f040ba0838xiao return OMX_ErrorNone; 80934277d8b1ca48a932e7b17ba331c29f040ba0838xiao } 81034277d8b1ca48a932e7b17ba331c29f040ba0838xiao 81181df951a8711fe300306e8c179677efea58adb65xiao if (!strcmp(cParameterName, "OMX.google.android.index.useAndroidNativeBuffer")) { 81234277d8b1ca48a932e7b17ba331c29f040ba0838xiao *pIndexType = static_cast<OMX_INDEXTYPE>(OMX_IndexExtUseNativeBuffer); 81334277d8b1ca48a932e7b17ba331c29f040ba0838xiao return OMX_ErrorNone; 81434277d8b1ca48a932e7b17ba331c29f040ba0838xiao } 815e8ef7cfbad3a42b41edabbdc4ed258ce331a00a0Zhao Liang 81681df951a8711fe300306e8c179677efea58adb65xiao if (!strcmp(cParameterName, "OMX.Intel.index.rotation")) { 81781df951a8711fe300306e8c179677efea58adb65xiao *pIndexType = static_cast<OMX_INDEXTYPE>(OMX_IndexExtRotationDegrees); 81881df951a8711fe300306e8c179677efea58adb65xiao return OMX_ErrorNone; 81981df951a8711fe300306e8c179677efea58adb65xiao } 82034277d8b1ca48a932e7b17ba331c29f040ba0838xiao 821e8ef7cfbad3a42b41edabbdc4ed258ce331a00a0Zhao Liang if (!strcmp(cParameterName, "OMX.Intel.index.enableSyncEncoding")) { 822e8ef7cfbad3a42b41edabbdc4ed258ce331a00a0Zhao Liang *pIndexType = static_cast<OMX_INDEXTYPE>(OMX_IndexExtSyncEncoding); 823e8ef7cfbad3a42b41edabbdc4ed258ce331a00a0Zhao Liang return OMX_ErrorNone; 824e8ef7cfbad3a42b41edabbdc4ed258ce331a00a0Zhao Liang } 825e8ef7cfbad3a42b41edabbdc4ed258ce331a00a0Zhao Liang 826fbd63aabced2ef7b356f2dea4903b5ca7b12362cgji if (!strcmp(cParameterName, "OMX.google.android.index.prependSPSPPSToIDRFrames")) { 827fbd63aabced2ef7b356f2dea4903b5ca7b12362cgji *pIndexType = static_cast<OMX_INDEXTYPE>(OMX_IndexExtPrependSPSPPS); 828fbd63aabced2ef7b356f2dea4903b5ca7b12362cgji return OMX_ErrorNone; 829fbd63aabced2ef7b356f2dea4903b5ca7b12362cgji } 830fbd63aabced2ef7b356f2dea4903b5ca7b12362cgji 8317c51a53fdded8c5115afd1f2f32dfd269841ec9eXigui Wang#ifdef TARGET_HAS_ISV 832241b5fe3bb7d386f5875ec19a6a22f6d5dd68b29Yu, Linda if (!strcmp(cParameterName, "OMX.Intel.index.vppBufferNum")) { 833241b5fe3bb7d386f5875ec19a6a22f6d5dd68b29Yu, Linda *pIndexType = static_cast<OMX_INDEXTYPE>(OMX_IndexExtVppBufferNum); 834241b5fe3bb7d386f5875ec19a6a22f6d5dd68b29Yu, Linda return OMX_ErrorNone; 835241b5fe3bb7d386f5875ec19a6a22f6d5dd68b29Yu, Linda } 836241b5fe3bb7d386f5875ec19a6a22f6d5dd68b29Yu, Linda#endif 83735ff01df238a01bfef109b68eb68a82de8722c5fDan Liang 838c87a1a8f47c29d4eddf1ea0093c32b8eee04a239ywan if (!strcmp(cParameterName, "OMX.Intel.index.enableErrorReport")) { 83935ff01df238a01bfef109b68eb68a82de8722c5fDan Liang *pIndexType = static_cast<OMX_INDEXTYPE>(OMX_IndexExtEnableErrorReport); 84035ff01df238a01bfef109b68eb68a82de8722c5fDan Liang return OMX_ErrorNone; 84135ff01df238a01bfef109b68eb68a82de8722c5fDan Liang } 842241b5fe3bb7d386f5875ec19a6a22f6d5dd68b29Yu, Linda 843c87a1a8f47c29d4eddf1ea0093c32b8eee04a239ywan if (!strcmp(cParameterName, "OMX.google.android.index.prepareForAdaptivePlayback")) { 844c87a1a8f47c29d4eddf1ea0093c32b8eee04a239ywan *pIndexType = static_cast<OMX_INDEXTYPE>(OMX_IndexExtPrepareForAdaptivePlayback); 845c87a1a8f47c29d4eddf1ea0093c32b8eee04a239ywan return OMX_ErrorNone; 846c87a1a8f47c29d4eddf1ea0093c32b8eee04a239ywan } 847c87a1a8f47c29d4eddf1ea0093c32b8eee04a239ywan 8480e0c2732815205370638a066fe4f25743310a531Weian Chen if (!strcmp(cParameterName, "OMX.Intel.index.requestBlackFramePointer")) { 8490e0c2732815205370638a066fe4f25743310a531Weian Chen *pIndexType = static_cast<OMX_INDEXTYPE>(OMX_IndexExtRequestBlackFramePointer); 8500e0c2732815205370638a066fe4f25743310a531Weian Chen return OMX_ErrorNone; 8510e0c2732815205370638a066fe4f25743310a531Weian Chen } 8527fe59118003a3c624651cf4512fd4251171b9e6aBolun 853536f092125a0a1b5a60aa60690a2393c83b3848abolunliu if (!strcmp(cParameterName, "OMX.Intel.index.vp8MaxFrameRatio")) { 854536f092125a0a1b5a60aa60690a2393c83b3848abolunliu *pIndexType = static_cast<OMX_INDEXTYPE>(OMX_IndexExtVP8MaxFrameSizeRatio); 855536f092125a0a1b5a60aa60690a2393c83b3848abolunliu return OMX_ErrorNone; 856536f092125a0a1b5a60aa60690a2393c83b3848abolunliu } 857536f092125a0a1b5a60aa60690a2393c83b3848abolunliu 858bc093e3ecfb9386e27a1501188176966a2f609b1bolunliu if (!strcmp(cParameterName, "OMX.Intel.index.temporalLayer")) { 859bc093e3ecfb9386e27a1501188176966a2f609b1bolunliu *pIndexType = static_cast<OMX_INDEXTYPE>(OMX_IndexExtTemporalLayer); 860536f092125a0a1b5a60aa60690a2393c83b3848abolunliu return OMX_ErrorNone; 861536f092125a0a1b5a60aa60690a2393c83b3848abolunliu } 862536f092125a0a1b5a60aa60690a2393c83b3848abolunliu 863e3e491f0eb8ddb06c941fcf0b980ab0edb78b089gji if (!strcmp(cParameterName, "OMX.Intel.index.vuiEnable")) { 864e3e491f0eb8ddb06c941fcf0b980ab0edb78b089gji *pIndexType = static_cast<OMX_INDEXTYPE>(OMX_IndexParamIntelAVCVUI); 865e3e491f0eb8ddb06c941fcf0b980ab0edb78b089gji return OMX_ErrorNone; 866e3e491f0eb8ddb06c941fcf0b980ab0edb78b089gji } 867e3e491f0eb8ddb06c941fcf0b980ab0edb78b089gji 868e3e491f0eb8ddb06c941fcf0b980ab0edb78b089gji if (!strcmp(cParameterName, "OMX.Intel.index.sliceNumber")) { 869e3e491f0eb8ddb06c941fcf0b980ab0edb78b089gji *pIndexType = static_cast<OMX_INDEXTYPE>(OMX_IndexConfigIntelSliceNumbers); 870e3e491f0eb8ddb06c941fcf0b980ab0edb78b089gji return OMX_ErrorNone; 871e3e491f0eb8ddb06c941fcf0b980ab0edb78b089gji } 872e3e491f0eb8ddb06c941fcf0b980ab0edb78b089gji 873e3e491f0eb8ddb06c941fcf0b980ab0edb78b089gji if (!strcmp(cParameterName, "OMX.Intel.index.intelBitrateConfig")) { 874e3e491f0eb8ddb06c941fcf0b980ab0edb78b089gji *pIndexType = static_cast<OMX_INDEXTYPE>(OMX_IndexConfigIntelBitrate); 875e3e491f0eb8ddb06c941fcf0b980ab0edb78b089gji return OMX_ErrorNone; 876e3e491f0eb8ddb06c941fcf0b980ab0edb78b089gji } 877e3e491f0eb8ddb06c941fcf0b980ab0edb78b089gji 878e3e491f0eb8ddb06c941fcf0b980ab0edb78b089gji if (!strcmp(cParameterName, "OMX.Intel.index.autoIntraRefresh")) { 879e3e491f0eb8ddb06c941fcf0b980ab0edb78b089gji *pIndexType = static_cast<OMX_INDEXTYPE>(OMX_IndexConfigIntelAIR); 880e3e491f0eb8ddb06c941fcf0b980ab0edb78b089gji return OMX_ErrorNone; 881e3e491f0eb8ddb06c941fcf0b980ab0edb78b089gji } 882e3e491f0eb8ddb06c941fcf0b980ab0edb78b089gji 8833e858c34513e6dfba295d3ac4768ce7ef31ceab7Hyunchang Choi if (!strcmp(cParameterName, "OMX.google.android.index.allocateNativeHandle")) { 8843e858c34513e6dfba295d3ac4768ce7ef31ceab7Hyunchang Choi *pIndexType = static_cast<OMX_INDEXTYPE>(OMX_IndexExtAllocateNativeHandle); 8853e858c34513e6dfba295d3ac4768ce7ef31ceab7Hyunchang Choi return OMX_ErrorNone; 8863e858c34513e6dfba295d3ac4768ce7ef31ceab7Hyunchang Choi } 8873e858c34513e6dfba295d3ac4768ce7ef31ceab7Hyunchang Choi 88844e493bfd5e5abeadd4431e294d3108235bdeb29Shuo Liu return OMX_ErrorUnsupportedIndex; 88920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 89020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 89120fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuOMX_ERRORTYPE ComponentBase::GetState( 89220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_HANDLETYPE hComponent, 89320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_OUT OMX_STATETYPE* pState) 89420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 89520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu ComponentBase *cbase; 89620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 89720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!hComponent) 89820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return OMX_ErrorBadParameter; 89920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 90020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu cbase = static_cast<ComponentBase *> 90120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu (((OMX_COMPONENTTYPE *)hComponent)->pComponentPrivate); 90220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!cbase) 90320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return OMX_ErrorBadParameter; 90420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 90520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return cbase->CBaseGetState(hComponent, pState); 90620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 90720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 90820fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuOMX_ERRORTYPE ComponentBase::CBaseGetState( 90920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_HANDLETYPE hComponent, 91020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_OUT OMX_STATETYPE* pState) 91120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 9124cd3e66c126fc2a11287e11832f5ab386e27b867Ho-Eun Ryu if (hComponent != handle) 9134cd3e66c126fc2a11287e11832f5ab386e27b867Ho-Eun Ryu return OMX_ErrorBadParameter; 9144cd3e66c126fc2a11287e11832f5ab386e27b867Ho-Eun Ryu 915d438ab4e1c4dde0b5e0aa7c44186137b2d2adaa5Gu, Wangyi pthread_mutex_lock(&state_block); 91600cc8b816fc0e267bb4acfd03db9afdce07b0ac2Ho-Eun Ryu *pState = state; 917d438ab4e1c4dde0b5e0aa7c44186137b2d2adaa5Gu, Wangyi pthread_mutex_unlock(&state_block); 91800cc8b816fc0e267bb4acfd03db9afdce07b0ac2Ho-Eun Ryu return OMX_ErrorNone; 91920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 92020fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuOMX_ERRORTYPE ComponentBase::UseBuffer( 92120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_HANDLETYPE hComponent, 922002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu OMX_INOUT OMX_BUFFERHEADERTYPE **ppBufferHdr, 92320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_U32 nPortIndex, 92420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_PTR pAppPrivate, 92520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_U32 nSizeBytes, 926002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu OMX_IN OMX_U8 *pBuffer) 92720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 92820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu ComponentBase *cbase; 92920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 93020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!hComponent) 93120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return OMX_ErrorBadParameter; 93220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 93320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu cbase = static_cast<ComponentBase *> 93420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu (((OMX_COMPONENTTYPE *)hComponent)->pComponentPrivate); 93520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!cbase) 93620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return OMX_ErrorBadParameter; 93720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 93820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return cbase->CBaseUseBuffer(hComponent, ppBufferHdr, nPortIndex, 93920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu pAppPrivate, nSizeBytes, pBuffer); 94020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 94120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 94220fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuOMX_ERRORTYPE ComponentBase::CBaseUseBuffer( 94320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_HANDLETYPE hComponent, 944002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu OMX_INOUT OMX_BUFFERHEADERTYPE **ppBufferHdr, 94520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_U32 nPortIndex, 94620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_PTR pAppPrivate, 94720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_U32 nSizeBytes, 948002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu OMX_IN OMX_U8 *pBuffer) 94920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 950002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu PortBase *port = NULL; 95120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 952002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu if (hComponent != handle) 953002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu return OMX_ErrorBadParameter; 954002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu 9553e70358f4893dffa18a9edf60e02fe4c017328deHo-Eun Ryu if (!ppBufferHdr) 9563e70358f4893dffa18a9edf60e02fe4c017328deHo-Eun Ryu return OMX_ErrorBadParameter; 9573e70358f4893dffa18a9edf60e02fe4c017328deHo-Eun Ryu *ppBufferHdr = NULL; 9583e70358f4893dffa18a9edf60e02fe4c017328deHo-Eun Ryu 9593e70358f4893dffa18a9edf60e02fe4c017328deHo-Eun Ryu if (!pBuffer) 9603e70358f4893dffa18a9edf60e02fe4c017328deHo-Eun Ryu return OMX_ErrorBadParameter; 9613e70358f4893dffa18a9edf60e02fe4c017328deHo-Eun Ryu 962002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu if (ports) 963349230895647ce1d927da6118698d364543adf0fHo-Eun Ryu if (nPortIndex < nr_ports) 964002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu port = ports[nPortIndex]; 965002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu 966002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu if (!port) 967002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu return OMX_ErrorBadParameter; 968002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu 9693e70358f4893dffa18a9edf60e02fe4c017328deHo-Eun Ryu if (port->IsEnabled()) { 9703e70358f4893dffa18a9edf60e02fe4c017328deHo-Eun Ryu if (state != OMX_StateLoaded && state != OMX_StateWaitForResources) 9713e70358f4893dffa18a9edf60e02fe4c017328deHo-Eun Ryu return OMX_ErrorIncorrectStateOperation; 9723e70358f4893dffa18a9edf60e02fe4c017328deHo-Eun Ryu } 9733e70358f4893dffa18a9edf60e02fe4c017328deHo-Eun Ryu 974002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu return port->UseBuffer(ppBufferHdr, nPortIndex, pAppPrivate, nSizeBytes, 975002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu pBuffer); 97620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 97720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 97820fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuOMX_ERRORTYPE ComponentBase::AllocateBuffer( 97920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_HANDLETYPE hComponent, 980002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu OMX_INOUT OMX_BUFFERHEADERTYPE **ppBuffer, 98120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_U32 nPortIndex, 98220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_PTR pAppPrivate, 98320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_U32 nSizeBytes) 98420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 98520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu ComponentBase *cbase; 98620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 98720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!hComponent) 98820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return OMX_ErrorBadParameter; 98920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 99020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu cbase = static_cast<ComponentBase *> 99120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu (((OMX_COMPONENTTYPE *)hComponent)->pComponentPrivate); 99220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!cbase) 99320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return OMX_ErrorBadParameter; 99420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 99520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return cbase->CBaseAllocateBuffer(hComponent, ppBuffer, nPortIndex, 99620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu pAppPrivate, nSizeBytes); 99720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 99820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 99920fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuOMX_ERRORTYPE ComponentBase::CBaseAllocateBuffer( 100020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_HANDLETYPE hComponent, 1001002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu OMX_INOUT OMX_BUFFERHEADERTYPE **ppBuffer, 100220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_U32 nPortIndex, 100320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_PTR pAppPrivate, 100420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_U32 nSizeBytes) 100520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 1006002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu PortBase *port = NULL; 100720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 1008002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu if (hComponent != handle) 1009002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu return OMX_ErrorBadParameter; 1010002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu 10113e70358f4893dffa18a9edf60e02fe4c017328deHo-Eun Ryu if (!ppBuffer) 10123e70358f4893dffa18a9edf60e02fe4c017328deHo-Eun Ryu return OMX_ErrorBadParameter; 10133e70358f4893dffa18a9edf60e02fe4c017328deHo-Eun Ryu *ppBuffer = NULL; 10143e70358f4893dffa18a9edf60e02fe4c017328deHo-Eun Ryu 1015002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu if (ports) 1016349230895647ce1d927da6118698d364543adf0fHo-Eun Ryu if (nPortIndex < nr_ports) 1017002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu port = ports[nPortIndex]; 1018002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu 1019002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu if (!port) 1020002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu return OMX_ErrorBadParameter; 1021002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu 10223e70358f4893dffa18a9edf60e02fe4c017328deHo-Eun Ryu if (port->IsEnabled()) { 10233e70358f4893dffa18a9edf60e02fe4c017328deHo-Eun Ryu if (state != OMX_StateLoaded && state != OMX_StateWaitForResources) 10243e70358f4893dffa18a9edf60e02fe4c017328deHo-Eun Ryu return OMX_ErrorIncorrectStateOperation; 10253e70358f4893dffa18a9edf60e02fe4c017328deHo-Eun Ryu } 10263e70358f4893dffa18a9edf60e02fe4c017328deHo-Eun Ryu 1027002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu return port->AllocateBuffer(ppBuffer, nPortIndex, pAppPrivate, nSizeBytes); 102820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 102920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 103020fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuOMX_ERRORTYPE ComponentBase::FreeBuffer( 103120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_HANDLETYPE hComponent, 103220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_U32 nPortIndex, 1033002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu OMX_IN OMX_BUFFERHEADERTYPE *pBuffer) 103420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 103520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu ComponentBase *cbase; 103620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 103720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!hComponent) 103820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return OMX_ErrorBadParameter; 103920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 104020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu cbase = static_cast<ComponentBase *> 104120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu (((OMX_COMPONENTTYPE *)hComponent)->pComponentPrivate); 104220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!cbase) 104320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return OMX_ErrorBadParameter; 104420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 104520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return cbase->CBaseFreeBuffer(hComponent, nPortIndex, pBuffer); 104620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 104720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 104820fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuOMX_ERRORTYPE ComponentBase::CBaseFreeBuffer( 104920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_HANDLETYPE hComponent, 105020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_U32 nPortIndex, 1051002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu OMX_IN OMX_BUFFERHEADERTYPE *pBuffer) 105220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 1053002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu PortBase *port = NULL; 105420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 1055002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu if (hComponent != handle) 1056002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu return OMX_ErrorBadParameter; 1057002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu 10583e70358f4893dffa18a9edf60e02fe4c017328deHo-Eun Ryu if (!pBuffer) 10593e70358f4893dffa18a9edf60e02fe4c017328deHo-Eun Ryu return OMX_ErrorBadParameter; 10603e70358f4893dffa18a9edf60e02fe4c017328deHo-Eun Ryu 1061002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu if (ports) 1062349230895647ce1d927da6118698d364543adf0fHo-Eun Ryu if (nPortIndex < nr_ports) 1063002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu port = ports[nPortIndex]; 1064002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu 1065002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu if (!port) 1066002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu return OMX_ErrorBadParameter; 1067002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu 106857fbad335bcd1fc0b12cea2e58586015cec7b571xiao ProcessorPreFreeBuffer(nPortIndex, pBuffer); 106957fbad335bcd1fc0b12cea2e58586015cec7b571xiao 1070002af9e537f231620ece85d29ebafccf7a3ed579Ho-Eun Ryu return port->FreeBuffer(nPortIndex, pBuffer); 107120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 107220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 107320fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuOMX_ERRORTYPE ComponentBase::EmptyThisBuffer( 107420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_HANDLETYPE hComponent, 107520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) 107620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 107720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu ComponentBase *cbase; 107820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 107920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!hComponent) 108020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return OMX_ErrorBadParameter; 108120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 108220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu cbase = static_cast<ComponentBase *> 108320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu (((OMX_COMPONENTTYPE *)hComponent)->pComponentPrivate); 108420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!cbase) 108520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return OMX_ErrorBadParameter; 108620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 108720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return cbase->CBaseEmptyThisBuffer(hComponent, pBuffer); 108820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 108920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 109020fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuOMX_ERRORTYPE ComponentBase::CBaseEmptyThisBuffer( 109120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_HANDLETYPE hComponent, 1092f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu OMX_IN OMX_BUFFERHEADERTYPE *pBuffer) 109320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 1094f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu PortBase *port = NULL; 1095f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu OMX_U32 port_index; 1096f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu OMX_ERRORTYPE ret; 109720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 1098f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu if ((hComponent != handle) || !pBuffer) 1099f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu return OMX_ErrorBadParameter; 1100f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu 1101c2c974d6dc62b38872e55559f5e83b01200f798bHo-Eun Ryu ret = CheckTypeHeader(pBuffer, sizeof(OMX_BUFFERHEADERTYPE)); 1102c2c974d6dc62b38872e55559f5e83b01200f798bHo-Eun Ryu if (ret != OMX_ErrorNone) 1103c2c974d6dc62b38872e55559f5e83b01200f798bHo-Eun Ryu return ret; 1104c2c974d6dc62b38872e55559f5e83b01200f798bHo-Eun Ryu 1105f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu port_index = pBuffer->nInputPortIndex; 1106f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu if (port_index == (OMX_U32)-1) 1107f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu return OMX_ErrorBadParameter; 1108f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu 1109f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu if (ports) 1110f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu if (port_index < nr_ports) 1111f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu port = ports[port_index]; 1112f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu 1113f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu if (!port) 1114f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu return OMX_ErrorBadParameter; 1115f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu 111622c983f39fc4fb8970f15d260fc62b2ccf967906Ho-Eun Ryu if (port->IsEnabled()) { 111722c983f39fc4fb8970f15d260fc62b2ccf967906Ho-Eun Ryu if (state != OMX_StateIdle && state != OMX_StateExecuting && 111822c983f39fc4fb8970f15d260fc62b2ccf967906Ho-Eun Ryu state != OMX_StatePause) 111922c983f39fc4fb8970f15d260fc62b2ccf967906Ho-Eun Ryu return OMX_ErrorIncorrectStateOperation; 112022c983f39fc4fb8970f15d260fc62b2ccf967906Ho-Eun Ryu } 112122c983f39fc4fb8970f15d260fc62b2ccf967906Ho-Eun Ryu 112284536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu if (!pBuffer->hMarkTargetComponent) { 112384536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu OMX_MARKTYPE *mark; 112484536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu 112584536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu mark = port->PopMark(); 112684536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu if (mark) { 112784536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu pBuffer->hMarkTargetComponent = mark->hMarkTargetComponent; 112884536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu pBuffer->pMarkData = mark->pMarkData; 112984536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu free(mark); 113084536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu } 113184536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu } 113284536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu 113385d33bdb86649f8daa474948f3224cc0a6c160ceZhao Liang ProcessorPreEmptyBuffer(pBuffer); 113485d33bdb86649f8daa474948f3224cc0a6c160ceZhao Liang 113561e83f918712abb485057828a43da4523988514aHo-Eun Ryu ret = port->PushThisBuffer(pBuffer); 113661e83f918712abb485057828a43da4523988514aHo-Eun Ryu if (ret == OMX_ErrorNone) 113761e83f918712abb485057828a43da4523988514aHo-Eun Ryu bufferwork->ScheduleWork(this); 113861e83f918712abb485057828a43da4523988514aHo-Eun Ryu 113961e83f918712abb485057828a43da4523988514aHo-Eun Ryu return ret; 114020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 114120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 114220fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuOMX_ERRORTYPE ComponentBase::FillThisBuffer( 114320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_HANDLETYPE hComponent, 1144f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu OMX_IN OMX_BUFFERHEADERTYPE *pBuffer) 114520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 114620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu ComponentBase *cbase; 114720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 114820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!hComponent) 114920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return OMX_ErrorBadParameter; 115020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 115120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu cbase = static_cast<ComponentBase *> 115220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu (((OMX_COMPONENTTYPE *)hComponent)->pComponentPrivate); 115320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!cbase) 115420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return OMX_ErrorBadParameter; 115520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 115620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return cbase->CBaseFillThisBuffer(hComponent, pBuffer); 115720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 115820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 115920fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuOMX_ERRORTYPE ComponentBase::CBaseFillThisBuffer( 116020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_HANDLETYPE hComponent, 1161f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu OMX_IN OMX_BUFFERHEADERTYPE *pBuffer) 116220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 1163f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu PortBase *port = NULL; 1164f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu OMX_U32 port_index; 1165f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu OMX_ERRORTYPE ret; 116620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 1167f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu if ((hComponent != handle) || !pBuffer) 1168f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu return OMX_ErrorBadParameter; 1169f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu 1170c2c974d6dc62b38872e55559f5e83b01200f798bHo-Eun Ryu ret = CheckTypeHeader(pBuffer, sizeof(OMX_BUFFERHEADERTYPE)); 1171c2c974d6dc62b38872e55559f5e83b01200f798bHo-Eun Ryu if (ret != OMX_ErrorNone) 1172c2c974d6dc62b38872e55559f5e83b01200f798bHo-Eun Ryu return ret; 1173c2c974d6dc62b38872e55559f5e83b01200f798bHo-Eun Ryu 1174f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu port_index = pBuffer->nOutputPortIndex; 1175f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu if (port_index == (OMX_U32)-1) 1176f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu return OMX_ErrorBadParameter; 1177f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu 1178f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu if (ports) 1179f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu if (port_index < nr_ports) 1180f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu port = ports[port_index]; 1181f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu 1182f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu if (!port) 1183f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu return OMX_ErrorBadParameter; 1184f512d67ca4d720eaedbde875aa58cb9e9cae7a76Ho-Eun Ryu 118522c983f39fc4fb8970f15d260fc62b2ccf967906Ho-Eun Ryu if (port->IsEnabled()) { 118622c983f39fc4fb8970f15d260fc62b2ccf967906Ho-Eun Ryu if (state != OMX_StateIdle && state != OMX_StateExecuting && 118722c983f39fc4fb8970f15d260fc62b2ccf967906Ho-Eun Ryu state != OMX_StatePause) 118822c983f39fc4fb8970f15d260fc62b2ccf967906Ho-Eun Ryu return OMX_ErrorIncorrectStateOperation; 118922c983f39fc4fb8970f15d260fc62b2ccf967906Ho-Eun Ryu } 119022c983f39fc4fb8970f15d260fc62b2ccf967906Ho-Eun Ryu 1191b3e4883725f0e186dd80503bedd9999770233182fxiao ProcessorPreFillBuffer(pBuffer); 119234277d8b1ca48a932e7b17ba331c29f040ba0838xiao 119361e83f918712abb485057828a43da4523988514aHo-Eun Ryu ret = port->PushThisBuffer(pBuffer); 119461e83f918712abb485057828a43da4523988514aHo-Eun Ryu if (ret == OMX_ErrorNone) 119561e83f918712abb485057828a43da4523988514aHo-Eun Ryu bufferwork->ScheduleWork(this); 119661e83f918712abb485057828a43da4523988514aHo-Eun Ryu 119761e83f918712abb485057828a43da4523988514aHo-Eun Ryu return ret; 119820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 119920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 120020fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuOMX_ERRORTYPE ComponentBase::SetCallbacks( 120120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_HANDLETYPE hComponent, 120220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_CALLBACKTYPE* pCallbacks, 120320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_PTR pAppData) 120420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 120520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu ComponentBase *cbase; 120620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 120720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!hComponent) 120820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return OMX_ErrorBadParameter; 120920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 121020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu cbase = static_cast<ComponentBase *> 121120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu (((OMX_COMPONENTTYPE *)hComponent)->pComponentPrivate); 121220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!cbase) 121320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return OMX_ErrorBadParameter; 121420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 121520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return cbase->CBaseSetCallbacks(hComponent, pCallbacks, pAppData); 121620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 121720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 121820fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuOMX_ERRORTYPE ComponentBase::CBaseSetCallbacks( 121920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_HANDLETYPE hComponent, 12203ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu OMX_IN OMX_CALLBACKTYPE *pCallbacks, 122120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_PTR pAppData) 122220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 12233ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu if (hComponent != handle) 12243ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu return OMX_ErrorBadParameter; 122520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 12263ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu appdata = pAppData; 12273ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu callbacks = pCallbacks; 12283ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu 12293ee08716991119e541a439811c8c74988d7be754Ho-Eun Ryu return OMX_ErrorNone; 123020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 123120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 123220fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuOMX_ERRORTYPE ComponentBase::ComponentRoleEnum( 123320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_HANDLETYPE hComponent, 123420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_OUT OMX_U8 *cRole, 123520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_U32 nIndex) 123620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 123720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu ComponentBase *cbase; 123820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 123920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!hComponent) 124020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return OMX_ErrorBadParameter; 124120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 124220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu cbase = static_cast<ComponentBase *> 124320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu (((OMX_COMPONENTTYPE *)hComponent)->pComponentPrivate); 124420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!cbase) 124520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return OMX_ErrorBadParameter; 124620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 124720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return cbase->CBaseComponentRoleEnum(hComponent, cRole, nIndex); 124820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 124920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 125020fb971c092d9f2141a81d0890d211dab85284acHo-Eun RyuOMX_ERRORTYPE ComponentBase::CBaseComponentRoleEnum( 125120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_HANDLETYPE hComponent, 125220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_OUT OMX_U8 *cRole, 125320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_IN OMX_U32 nIndex) 125420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 12559b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu if (hComponent != (OMX_HANDLETYPE *)this->handle) 12569b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu return OMX_ErrorBadParameter; 125720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 1258107bd5628b58f6869a2b7fc0580f1c953cb9eb42XiaoFeng if (nIndex >= nr_roles) 12599b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu return OMX_ErrorBadParameter; 12609b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu 12619b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu strncpy((char *)cRole, (const char *)roles[nIndex], 12629b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu OMX_MAX_STRINGNAME_SIZE); 12639b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu return OMX_ErrorNone; 126420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 126520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 1266cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu/* implement CmdHandlerInterface */ 126723381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryustatic const char *cmd_name[OMX_CommandMarkBuffer+2] = { 126823381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu "OMX_CommandStateSet", 126923381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu "OMX_CommandFlush", 127023381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu "OMX_CommandPortDisable", 127123381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu "OMX_CommandPortEnable", 127223381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu "OMX_CommandMarkBuffer", 127323381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu "Unknown Command", 127423381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu}; 127523381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu 127623381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryustatic inline const char *GetCmdName(OMX_COMMANDTYPE cmd) 127723381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu{ 127823381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu if (cmd > OMX_CommandMarkBuffer) 127923381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu cmd = (OMX_COMMANDTYPE)(OMX_CommandMarkBuffer+1); 128023381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu 128123381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu return cmd_name[cmd]; 128223381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu} 128323381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu 1284cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryuvoid ComponentBase::CmdHandler(struct cmd_s *cmd) 1285cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu{ 12865382b99a03f877b3cde9ef7d3edc25cd1fde746aHo-Eun Ryu LOGV("%s:%s: handling %s command\n", 128723381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetName(), GetWorkingRole(), GetCmdName(cmd->cmd)); 128823381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu 1289cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu switch (cmd->cmd) { 1290abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu case OMX_CommandStateSet: { 1291abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu OMX_STATETYPE transition = (OMX_STATETYPE)cmd->param1; 1292abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 1293d438ab4e1c4dde0b5e0aa7c44186137b2d2adaa5Gu, Wangyi pthread_mutex_lock(&state_block); 1294abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu TransState(transition); 1295d438ab4e1c4dde0b5e0aa7c44186137b2d2adaa5Gu, Wangyi pthread_mutex_unlock(&state_block); 1296cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu break; 1297abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu } 1298dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu case OMX_CommandFlush: { 1299dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu OMX_U32 port_index = cmd->param1; 1300666f8b21fe0923595def20b16e9e7eefa11308b2Tao Tao pthread_mutex_lock(&ports_block); 1301ac3429dfacf1c5a03889558006f2af0d40a7bfe8Tao Tao ProcessorFlush(port_index); 1302b075b83b34ab602a1583879948042d697b43b58aywan FlushPort(port_index, 1); 1303666f8b21fe0923595def20b16e9e7eefa11308b2Tao Tao pthread_mutex_unlock(&ports_block); 1304cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu break; 1305dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu } 1306b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu case OMX_CommandPortDisable: { 1307b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu OMX_U32 port_index = cmd->param1; 1308b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu 1309b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu TransStatePort(port_index, PortBase::OMX_PortDisabled); 1310cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu break; 1311b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu } 1312b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu case OMX_CommandPortEnable: { 1313b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu OMX_U32 port_index = cmd->param1; 1314b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu 1315b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu TransStatePort(port_index, PortBase::OMX_PortEnabled); 1316cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu break; 1317b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu } 1318ed725e9598aac5b25f222f6798c1d2ce6b16cd59Ho-Eun Ryu case OMX_CommandMarkBuffer: { 1319d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu OMX_U32 port_index = (OMX_U32)cmd->param1; 1320d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu OMX_MARKTYPE *mark = (OMX_MARKTYPE *)cmd->cmddata; 1321d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu 1322d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu PushThisMark(port_index, mark); 1323cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu break; 1324ed725e9598aac5b25f222f6798c1d2ce6b16cd59Ho-Eun Ryu } 1325ed725e9598aac5b25f222f6798c1d2ce6b16cd59Ho-Eun Ryu default: 132623381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu LOGE("%s:%s:%s: exit failure, command %d cannot be handled\n", 132723381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetName(), GetWorkingRole(), GetCmdName(cmd->cmd), cmd->cmd); 1328ed725e9598aac5b25f222f6798c1d2ce6b16cd59Ho-Eun Ryu break; 1329abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu } /* switch */ 133023381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu 13315382b99a03f877b3cde9ef7d3edc25cd1fde746aHo-Eun Ryu LOGV("%s:%s: command %s handling done\n", 133223381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetName(), GetWorkingRole(), GetCmdName(cmd->cmd)); 1333abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu} 1334abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 1335abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu/* 1336abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu * SendCommand:OMX_CommandStateSet 1337abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu * called in CmdHandler or called in other parts of component for reporting 1338abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu * internal error (OMX_StateInvalid). 1339abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu */ 1340abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu/* 1341abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu * Todo 1342abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu * Resource Management (OMX_StateWaitForResources) 1343abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu * for now, we never notify OMX_ErrorInsufficientResources, 1344abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu * so IL client doesn't try to set component' state OMX_StateWaitForResources 1345abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu */ 134623381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryustatic const char *state_name[OMX_StateWaitForResources+2] = { 13473e7cfd77fb3d796b3908e90b7e98c2b60e3dd27dHo-Eun Ryu "OMX_StateInvalid", 13483e7cfd77fb3d796b3908e90b7e98c2b60e3dd27dHo-Eun Ryu "OMX_StateLoaded", 13493e7cfd77fb3d796b3908e90b7e98c2b60e3dd27dHo-Eun Ryu "OMX_StateIdle", 13503e7cfd77fb3d796b3908e90b7e98c2b60e3dd27dHo-Eun Ryu "OMX_StateExecuting", 13513e7cfd77fb3d796b3908e90b7e98c2b60e3dd27dHo-Eun Ryu "OMX_StatePause", 13523e7cfd77fb3d796b3908e90b7e98c2b60e3dd27dHo-Eun Ryu "OMX_StateWaitForResources", 135323381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu "Unknown State", 13543e7cfd77fb3d796b3908e90b7e98c2b60e3dd27dHo-Eun Ryu}; 13553e7cfd77fb3d796b3908e90b7e98c2b60e3dd27dHo-Eun Ryu 13563e7cfd77fb3d796b3908e90b7e98c2b60e3dd27dHo-Eun Ryustatic inline const char *GetStateName(OMX_STATETYPE state) 13573e7cfd77fb3d796b3908e90b7e98c2b60e3dd27dHo-Eun Ryu{ 13583e7cfd77fb3d796b3908e90b7e98c2b60e3dd27dHo-Eun Ryu if (state > OMX_StateWaitForResources) 135923381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu state = (OMX_STATETYPE)(OMX_StateWaitForResources+1); 13603e7cfd77fb3d796b3908e90b7e98c2b60e3dd27dHo-Eun Ryu 13613e7cfd77fb3d796b3908e90b7e98c2b60e3dd27dHo-Eun Ryu return state_name[state]; 13623e7cfd77fb3d796b3908e90b7e98c2b60e3dd27dHo-Eun Ryu} 13633e7cfd77fb3d796b3908e90b7e98c2b60e3dd27dHo-Eun Ryu 1364abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryuvoid ComponentBase::TransState(OMX_STATETYPE transition) 1365abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu{ 1366abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu OMX_STATETYPE current = this->state; 1367abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu OMX_EVENTTYPE event; 13683f6f9d1b2070cf81bcdf3b423cd77b6b4ff799e0Ho-Eun Ryu OMX_U32 data1, data2; 1369abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu OMX_ERRORTYPE ret; 1370abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 13715382b99a03f877b3cde9ef7d3edc25cd1fde746aHo-Eun Ryu LOGV("%s:%s: try to transit state from %s to %s\n", 137223381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetName(), GetWorkingRole(), GetStateName(current), 137323381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetStateName(transition)); 1374abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 1375abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu /* same state */ 1376abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu if (current == transition) { 1377abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu ret = OMX_ErrorSameState; 137823381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu LOGE("%s:%s: exit failure, same state (%s)\n", 137923381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetName(), GetWorkingRole(), GetStateName(current)); 1380abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu goto notify_event; 1381abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu } 1382abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 1383abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu /* invalid state */ 1384abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu if (current == OMX_StateInvalid) { 1385abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu ret = OMX_ErrorInvalidState; 138623381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu LOGE("%s:%s: exit failure, current state is OMX_StateInvalid\n", 138723381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetName(), GetWorkingRole()); 1388abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu goto notify_event; 1389abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu } 1390abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 1391abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu if (transition == OMX_StateLoaded) 1392abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu ret = TransStateToLoaded(current); 1393abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu else if (transition == OMX_StateIdle) 1394abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu ret = TransStateToIdle(current); 1395abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu else if (transition == OMX_StateExecuting) 1396abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu ret = TransStateToExecuting(current); 1397abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu else if (transition == OMX_StatePause) 1398abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu ret = TransStateToPause(current); 1399abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu else if (transition == OMX_StateInvalid) 1400abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu ret = TransStateToInvalid(current); 1401abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu else if (transition == OMX_StateWaitForResources) 1402abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu ret = TransStateToWaitForResources(current); 1403abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu else 1404abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu ret = OMX_ErrorIncorrectStateTransition; 1405abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 1406abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryunotify_event: 1407abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu if (ret == OMX_ErrorNone) { 1408abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu event = OMX_EventCmdComplete; 14093f6f9d1b2070cf81bcdf3b423cd77b6b4ff799e0Ho-Eun Ryu data1 = OMX_CommandStateSet; 14103f6f9d1b2070cf81bcdf3b423cd77b6b4ff799e0Ho-Eun Ryu data2 = transition; 1411abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 1412d84f1cd0a72565031a7bbb1f245bc4718e7fc33fGu, Wangyi state = transition; 141323381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu LOGD("%s:%s: transition from %s to %s completed", 141423381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetName(), GetWorkingRole(), 141523381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetStateName(current), GetStateName(transition)); 1416abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu } 1417abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu else { 1418abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu event = OMX_EventError; 1419abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu data1 = ret; 14203f6f9d1b2070cf81bcdf3b423cd77b6b4ff799e0Ho-Eun Ryu data2 = 0; 1421abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 14229f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryu if (transition == OMX_StateInvalid || ret == OMX_ErrorInvalidState) { 1423d84f1cd0a72565031a7bbb1f245bc4718e7fc33fGu, Wangyi state = OMX_StateInvalid; 142423381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu LOGE("%s:%s: exit failure, transition from %s to %s, " 142523381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu "current state is %s\n", 142623381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetName(), GetWorkingRole(), GetStateName(current), 142723381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetStateName(transition), GetStateName(state)); 1428abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu } 1429abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu } 1430abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 14313f6f9d1b2070cf81bcdf3b423cd77b6b4ff799e0Ho-Eun Ryu callbacks->EventHandler(handle, appdata, event, data1, data2, NULL); 1432abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 1433abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu /* WaitForResources workaround */ 1434abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu if (ret == OMX_ErrorNone && transition == OMX_StateWaitForResources) 1435abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu callbacks->EventHandler(handle, appdata, 1436abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu OMX_EventResourcesAcquired, 0, 0, NULL); 1437abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu} 1438abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 1439abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryuinline OMX_ERRORTYPE ComponentBase::TransStateToLoaded(OMX_STATETYPE current) 1440abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu{ 1441abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu OMX_ERRORTYPE ret; 1442abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 1443abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu if (current == OMX_StateIdle) { 1444853162b38464989d224c939f15066ab4aa4cb47cHo-Eun Ryu OMX_U32 i; 1445853162b38464989d224c939f15066ab4aa4cb47cHo-Eun Ryu 1446853162b38464989d224c939f15066ab4aa4cb47cHo-Eun Ryu for (i = 0; i < nr_ports; i++) 1447d5174df80f21e83a589dc59925d587b9e54d690fLiu, Shuo { 1448d5174df80f21e83a589dc59925d587b9e54d690fLiu, Shuo if (ports[i]->GetPortBufferCount() > 0) { 1449d5174df80f21e83a589dc59925d587b9e54d690fLiu, Shuo ports[i]->WaitPortBufferCompletion(); 1450d5174df80f21e83a589dc59925d587b9e54d690fLiu, Shuo }; 1451d5174df80f21e83a589dc59925d587b9e54d690fLiu, Shuo }; 1452853162b38464989d224c939f15066ab4aa4cb47cHo-Eun Ryu 14539f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryu ret = ProcessorDeinit(); 14549f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryu if (ret != OMX_ErrorNone) { 145523381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu LOGE("%s:%s: ProcessorDeinit() failed " 145623381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu "(ret : 0x%08x)\n", GetName(), GetWorkingRole(), 145723381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu ret); 14589f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryu goto out; 14599f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryu } 1460abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu } 1461abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu else if (current == OMX_StateWaitForResources) { 14625382b99a03f877b3cde9ef7d3edc25cd1fde746aHo-Eun Ryu LOGV("%s:%s: " 146323381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu "state transition's requested from WaitForResources to Loaded\n", 146423381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetName(), GetWorkingRole()); 1465abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 1466abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu /* 1467abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu * from WaitForResources to Loaded considered from Loaded to Loaded. 1468abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu * do nothing 1469abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu */ 1470abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 1471abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu ret = OMX_ErrorNone; 1472abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu } 1473abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu else 147402c027ae33fc00f917c21c1dccf058a0b25e723cHo-Eun Ryu ret = OMX_ErrorIncorrectStateTransition; 1475abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 14769f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryuout: 1477abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu return ret; 1478abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu} 1479abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 1480abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryuinline OMX_ERRORTYPE ComponentBase::TransStateToIdle(OMX_STATETYPE current) 1481abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu{ 148286c08d74951f4c563b1343c5b1735742fc734372ywan OMX_ERRORTYPE ret = OMX_ErrorNone; 1483abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 1484abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu if (current == OMX_StateLoaded) { 1485853162b38464989d224c939f15066ab4aa4cb47cHo-Eun Ryu OMX_U32 i; 1486fa824cac36baf4f5377f65a996a615b90c1558afywan for (i = 0; i < nr_ports; i++) { 148786c08d74951f4c563b1343c5b1735742fc734372ywan if (ports[i]->IsEnabled()) { 148886c08d74951f4c563b1343c5b1735742fc734372ywan if (GetWorkingRole() != NULL && 148986c08d74951f4c563b1343c5b1735742fc734372ywan !strncmp (GetWorkingRole(),"video_decoder", 13 )) { 149086c08d74951f4c563b1343c5b1735742fc734372ywan ret = ports[i]->WaitPortBufferCompletionTimeout(800); 149186c08d74951f4c563b1343c5b1735742fc734372ywan } else { 149286c08d74951f4c563b1343c5b1735742fc734372ywan ports[i]->WaitPortBufferCompletion(); 149386c08d74951f4c563b1343c5b1735742fc734372ywan } 149486c08d74951f4c563b1343c5b1735742fc734372ywan } 1495fa824cac36baf4f5377f65a996a615b90c1558afywan } 1496853162b38464989d224c939f15066ab4aa4cb47cHo-Eun Ryu 149786c08d74951f4c563b1343c5b1735742fc734372ywan if (ret == OMX_ErrorNone) { 149886c08d74951f4c563b1343c5b1735742fc734372ywan ret = ProcessorInit(); 149986c08d74951f4c563b1343c5b1735742fc734372ywan } 15009f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryu if (ret != OMX_ErrorNone) { 150123381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu LOGE("%s:%s: ProcessorInit() failed (ret : 0x%08x)\n", 150223381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetName(), GetWorkingRole(), ret); 15039f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryu goto out; 15049f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryu } 1505cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu } 150664239dd40f5c997a4c5b66e0d9da49b6b110802aHo-Eun Ryu else if ((current == OMX_StatePause) || (current == OMX_StateExecuting)) { 1507b075b83b34ab602a1583879948042d697b43b58aywan pthread_mutex_lock(&ports_block); 1508c5203bed45e653e87ba308eae644abc549e93fdcHo-Eun Ryu FlushPort(OMX_ALL, 0); 1509b075b83b34ab602a1583879948042d697b43b58aywan pthread_mutex_unlock(&ports_block); 15105382b99a03f877b3cde9ef7d3edc25cd1fde746aHo-Eun Ryu LOGV("%s:%s: flushed all ports\n", GetName(), GetWorkingRole()); 1511abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 151261e83f918712abb485057828a43da4523988514aHo-Eun Ryu bufferwork->CancelScheduledWork(this); 15135382b99a03f877b3cde9ef7d3edc25cd1fde746aHo-Eun Ryu LOGV("%s:%s: discarded all scheduled buffer process work\n", 151423381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetName(), GetWorkingRole()); 1515aa852fab8a86b592bc152dfb1d0ff5104257198fHo-Eun Ryu 151623381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu if (current == OMX_StatePause) { 1517095dca7041d500f159c9e49d3ab784b6885ed086Ho-Eun Ryu bufferwork->ResumeWork(); 15185382b99a03f877b3cde9ef7d3edc25cd1fde746aHo-Eun Ryu LOGV("%s:%s: buffer process work resumed\n", 151923381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetName(), GetWorkingRole()); 152023381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu } 1521aa852fab8a86b592bc152dfb1d0ff5104257198fHo-Eun Ryu 152261e83f918712abb485057828a43da4523988514aHo-Eun Ryu bufferwork->StopWork(); 15235382b99a03f877b3cde9ef7d3edc25cd1fde746aHo-Eun Ryu LOGV("%s:%s: buffer process work stopped\n", 152423381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetName(), GetWorkingRole()); 1525abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 15269f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryu ret = ProcessorStop(); 15279f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryu if (ret != OMX_ErrorNone) { 152823381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu LOGE("%s:%s: ProcessorStop() failed (ret : 0x%08x)\n", 152923381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetName(), GetWorkingRole(), ret); 15309f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryu goto out; 15319f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryu } 1532abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu } 1533abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu else if (current == OMX_StateWaitForResources) { 15345382b99a03f877b3cde9ef7d3edc25cd1fde746aHo-Eun Ryu LOGV("%s:%s: " 153523381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu "state transition's requested from WaitForResources to Idle\n", 153623381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetName(), GetWorkingRole()); 1537abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 1538abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu /* same as Loaded to Idle BUT DO NOTHING for now */ 1539cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu 1540abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu ret = OMX_ErrorNone; 1541abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu } 1542abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu else 154302c027ae33fc00f917c21c1dccf058a0b25e723cHo-Eun Ryu ret = OMX_ErrorIncorrectStateTransition; 1544abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 15459f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryuout: 1546abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu return ret; 1547abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu} 1548abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 1549abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryuinline OMX_ERRORTYPE 1550abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun RyuComponentBase::TransStateToExecuting(OMX_STATETYPE current) 1551abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu{ 1552abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu OMX_ERRORTYPE ret; 1553abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 1554abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu if (current == OMX_StateIdle) { 1555095dca7041d500f159c9e49d3ab784b6885ed086Ho-Eun Ryu bufferwork->StartWork(true); 15565382b99a03f877b3cde9ef7d3edc25cd1fde746aHo-Eun Ryu LOGV("%s:%s: buffer process work started with executing state\n", 155723381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetName(), GetWorkingRole()); 15589f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryu 15599f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryu ret = ProcessorStart(); 15609f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryu if (ret != OMX_ErrorNone) { 156123381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu LOGE("%s:%s: ProcessorStart() failed (ret : 0x%08x)\n", 156223381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetName(), GetWorkingRole(), ret); 15639f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryu goto out; 15649f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryu } 1565abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu } 1566abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu else if (current == OMX_StatePause) { 1567095dca7041d500f159c9e49d3ab784b6885ed086Ho-Eun Ryu bufferwork->ResumeWork(); 15685382b99a03f877b3cde9ef7d3edc25cd1fde746aHo-Eun Ryu LOGV("%s:%s: buffer process work resumed\n", 156923381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetName(), GetWorkingRole()); 157061e83f918712abb485057828a43da4523988514aHo-Eun Ryu 15719f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryu ret = ProcessorResume(); 15729f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryu if (ret != OMX_ErrorNone) { 157323381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu LOGE("%s:%s: ProcessorResume() failed (ret : 0x%08x)\n", 157423381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetName(), GetWorkingRole(), ret); 15759f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryu goto out; 15769f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryu } 1577abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu } 1578abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu else 157902c027ae33fc00f917c21c1dccf058a0b25e723cHo-Eun Ryu ret = OMX_ErrorIncorrectStateTransition; 1580abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 15819f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryuout: 1582abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu return ret; 1583abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu} 1584abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 1585abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryuinline OMX_ERRORTYPE ComponentBase::TransStateToPause(OMX_STATETYPE current) 1586abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu{ 1587abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu OMX_ERRORTYPE ret; 1588abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 1589abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu if (current == OMX_StateIdle) { 1590095dca7041d500f159c9e49d3ab784b6885ed086Ho-Eun Ryu bufferwork->StartWork(false); 15915382b99a03f877b3cde9ef7d3edc25cd1fde746aHo-Eun Ryu LOGV("%s:%s: buffer process work started with paused state\n", 159223381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetName(), GetWorkingRole()); 159361e83f918712abb485057828a43da4523988514aHo-Eun Ryu 15949f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryu ret = ProcessorStart(); 15959f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryu if (ret != OMX_ErrorNone) { 159623381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu LOGE("%s:%s: ProcessorSart() failed (ret : 0x%08x)\n", 159723381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetName(), GetWorkingRole(), ret); 15989f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryu goto out; 15999f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryu } 1600abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu } 1601abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu else if (current == OMX_StateExecuting) { 1602095dca7041d500f159c9e49d3ab784b6885ed086Ho-Eun Ryu bufferwork->PauseWork(); 16035382b99a03f877b3cde9ef7d3edc25cd1fde746aHo-Eun Ryu LOGV("%s:%s: buffer process work paused\n", 160423381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetName(), GetWorkingRole()); 160561e83f918712abb485057828a43da4523988514aHo-Eun Ryu 16069f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryu ret = ProcessorPause(); 16079f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryu if (ret != OMX_ErrorNone) { 160823381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu LOGE("%s:%s: ProcessorPause() failed (ret : 0x%08x)\n", 160923381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetName(), GetWorkingRole(), ret); 16109f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryu goto out; 16119f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryu } 1612abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu } 1613abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu else 161402c027ae33fc00f917c21c1dccf058a0b25e723cHo-Eun Ryu ret = OMX_ErrorIncorrectStateTransition; 1615abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 16169f0e3e2107fd9d1ed3acabb5719b4b25423a5086Ho-Eun Ryuout: 1617abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu return ret; 1618abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu} 1619abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 1620abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryuinline OMX_ERRORTYPE ComponentBase::TransStateToInvalid(OMX_STATETYPE current) 1621abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu{ 1622abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu OMX_ERRORTYPE ret = OMX_ErrorInvalidState; 16233f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan LOGV("transit to invalid state from %d state",current); 1624abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu /* 1625abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu * Todo 1626abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu * graceful escape 1627abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu */ 1628abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu return ret; 1629abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu} 1630abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 1631abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryuinline OMX_ERRORTYPE 1632abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun RyuComponentBase::TransStateToWaitForResources(OMX_STATETYPE current) 1633abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu{ 1634abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu OMX_ERRORTYPE ret; 1635abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 1636abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu if (current == OMX_StateLoaded) { 16375382b99a03f877b3cde9ef7d3edc25cd1fde746aHo-Eun Ryu LOGV("%s:%s: " 163823381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu "state transition's requested from Loaded to WaitForResources\n", 163923381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetName(), GetWorkingRole()); 1640abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu ret = OMX_ErrorNone; 1641abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu } 1642abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu else 164302c027ae33fc00f917c21c1dccf058a0b25e723cHo-Eun Ryu ret = OMX_ErrorIncorrectStateTransition; 1644abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu 1645abd679fdaba9c3c8230dbcbaa838a5100acb546dHo-Eun Ryu return ret; 1646cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu} 1647cc664c7fd05a92b255d2be6efefe3bb0378dd8a3Ho-Eun Ryu 1648d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu/* mark buffer */ 1649d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryuvoid ComponentBase::PushThisMark(OMX_U32 port_index, OMX_MARKTYPE *mark) 1650d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu{ 1651d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu PortBase *port = NULL; 1652d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu OMX_EVENTTYPE event; 1653d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu OMX_U32 data1, data2; 1654d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu OMX_ERRORTYPE ret; 1655d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu 1656d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu if (ports) 1657d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu if (port_index < nr_ports) 1658d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu port = ports[port_index]; 1659d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu 1660d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu if (!port) { 1661d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu ret = OMX_ErrorBadPortIndex; 1662d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu goto notify_event; 1663d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu } 1664d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu 1665d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu ret = port->PushMark(mark); 1666d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu if (ret != OMX_ErrorNone) { 1667d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu /* don't report OMX_ErrorInsufficientResources */ 1668d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu ret = OMX_ErrorUndefined; 1669d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu goto notify_event; 1670d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu } 1671d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu 1672d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryunotify_event: 1673d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu if (ret == OMX_ErrorNone) { 1674d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu event = OMX_EventCmdComplete; 1675d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu data1 = OMX_CommandMarkBuffer; 1676d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu data2 = port_index; 1677d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu } 1678d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu else { 1679d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu event = OMX_EventError; 1680d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu data1 = ret; 1681d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu data2 = 0; 1682d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu } 1683d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu 1684d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu callbacks->EventHandler(handle, appdata, event, data1, data2, NULL); 1685d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu} 1686d2d7fc5745af2532cd7aaf9bd88148cf29501900Ho-Eun Ryu 1687dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryuvoid ComponentBase::FlushPort(OMX_U32 port_index, bool notify) 1688dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu{ 1689dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu OMX_U32 i, from_index, to_index; 1690dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu 1691dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu if ((port_index != OMX_ALL) && (port_index > nr_ports-1)) 1692dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu return; 1693dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu 1694dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu if (port_index == OMX_ALL) { 1695dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu from_index = 0; 1696dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu to_index = nr_ports - 1; 1697dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu } 1698dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu else { 1699dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu from_index = port_index; 1700dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu to_index = port_index; 1701dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu } 1702dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu 17033f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan LOGV("%s:%s: flush ports (from index %u to %u)\n", 170423381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetName(), GetWorkingRole(), from_index, to_index); 170523381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu 1706dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu for (i = from_index; i <= to_index; i++) { 1707dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu ports[i]->FlushPort(); 1708dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu if (notify) 1709dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu callbacks->EventHandler(handle, appdata, OMX_EventCmdComplete, 1710dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu OMX_CommandFlush, i, NULL); 1711dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu } 171223381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu 171323381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu LOGV("%s:%s: flush ports done\n", GetName(), GetWorkingRole()); 1714dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu} 1715dcf05c3d6a37bf9a3b09de2428a18d7f82b8204dHo-Eun Ryu 171623381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryuextern const char *GetPortStateName(OMX_U8 state); //portbase.cpp 171723381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu 1718b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryuvoid ComponentBase::TransStatePort(OMX_U32 port_index, OMX_U8 state) 1719b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu{ 1720b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu OMX_EVENTTYPE event; 1721b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu OMX_U32 data1, data2; 1722b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu OMX_U32 i, from_index, to_index; 1723b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu OMX_ERRORTYPE ret; 1724b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu 1725b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu if ((port_index != OMX_ALL) && (port_index > nr_ports-1)) 1726b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu return; 1727b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu 1728b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu if (port_index == OMX_ALL) { 1729b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu from_index = 0; 1730b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu to_index = nr_ports - 1; 1731b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu } 1732b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu else { 1733b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu from_index = port_index; 1734b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu to_index = port_index; 1735b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu } 1736b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu 17373f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan LOGV("%s:%s: transit ports state to %s (from index %u to %u)\n", 173823381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetName(), GetWorkingRole(), GetPortStateName(state), 173923381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu from_index, to_index); 174023381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu 1741b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu pthread_mutex_lock(&ports_block); 1742b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu for (i = from_index; i <= to_index; i++) { 1743b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu ret = ports[i]->TransState(state); 1744b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu if (ret == OMX_ErrorNone) { 1745b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu event = OMX_EventCmdComplete; 1746ecc877a1dd44921dff3f300bc5559841f0c44ac6ywan if (state == PortBase::OMX_PortEnabled) { 1747b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu data1 = OMX_CommandPortEnable; 1748ecc877a1dd44921dff3f300bc5559841f0c44ac6ywan ProcessorReset(); 1749fa824cac36baf4f5377f65a996a615b90c1558afywan } else { 1750b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu data1 = OMX_CommandPortDisable; 1751fa824cac36baf4f5377f65a996a615b90c1558afywan } 1752b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu data2 = i; 175341e08b779bbfab77f59765aa470aa93e2d81b877ywan } else { 1754b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu event = OMX_EventError; 1755b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu data1 = ret; 1756b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu data2 = 0; 1757b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu } 175841e08b779bbfab77f59765aa470aa93e2d81b877ywan callbacks->EventHandler(handle, appdata, event, 175955a75fa3e7f521265cd0db82970b69b29e6a50b0Ho-Eun Ryu data1, data2, NULL); 1760b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu } 1761b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu pthread_mutex_unlock(&ports_block); 176223381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu 176323381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu LOGV("%s:%s: transit ports state to %s completed\n", 176423381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu GetName(), GetWorkingRole(), GetPortStateName(state)); 1765b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu} 1766b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu 17675f3dea3773e2a740d6389e9f0de70d3078c0dcc8Ho-Eun Ryu/* set working role */ 17685f3dea3773e2a740d6389e9f0de70d3078c0dcc8Ho-Eun RyuOMX_ERRORTYPE ComponentBase::SetWorkingRole(const OMX_STRING role) 17695f3dea3773e2a740d6389e9f0de70d3078c0dcc8Ho-Eun Ryu{ 17705f3dea3773e2a740d6389e9f0de70d3078c0dcc8Ho-Eun Ryu OMX_U32 i; 17715f3dea3773e2a740d6389e9f0de70d3078c0dcc8Ho-Eun Ryu 1772663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu if (state != OMX_StateUnloaded && state != OMX_StateLoaded) 1773663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu return OMX_ErrorIncorrectStateOperation; 1774663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu 1775dd972fa0c42f2aad258a0d484d94f0e1c6300bacHo-Eun Ryu if (!role) { 1776dd972fa0c42f2aad258a0d484d94f0e1c6300bacHo-Eun Ryu working_role = NULL; 1777dd972fa0c42f2aad258a0d484d94f0e1c6300bacHo-Eun Ryu return OMX_ErrorNone; 1778dd972fa0c42f2aad258a0d484d94f0e1c6300bacHo-Eun Ryu } 17795f3dea3773e2a740d6389e9f0de70d3078c0dcc8Ho-Eun Ryu 17805f3dea3773e2a740d6389e9f0de70d3078c0dcc8Ho-Eun Ryu for (i = 0; i < nr_roles; i++) { 17815f3dea3773e2a740d6389e9f0de70d3078c0dcc8Ho-Eun Ryu if (!strcmp((char *)&roles[i][0], role)) { 17825f3dea3773e2a740d6389e9f0de70d3078c0dcc8Ho-Eun Ryu working_role = (OMX_STRING)&roles[i][0]; 17835f3dea3773e2a740d6389e9f0de70d3078c0dcc8Ho-Eun Ryu return OMX_ErrorNone; 17845f3dea3773e2a740d6389e9f0de70d3078c0dcc8Ho-Eun Ryu } 17855f3dea3773e2a740d6389e9f0de70d3078c0dcc8Ho-Eun Ryu } 17865f3dea3773e2a740d6389e9f0de70d3078c0dcc8Ho-Eun Ryu 178723381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu LOGE("%s: cannot find %s role\n", GetName(), role); 17883b09ea8de3ecd7c28333b9f5f417f836bbefbcd0Wonsik Kim return OMX_ErrorUnsupportedSetting; 17895f3dea3773e2a740d6389e9f0de70d3078c0dcc8Ho-Eun Ryu} 17905f3dea3773e2a740d6389e9f0de70d3078c0dcc8Ho-Eun Ryu 17915f3dea3773e2a740d6389e9f0de70d3078c0dcc8Ho-Eun Ryu/* apply a working role for a component having multiple roles */ 17925f3dea3773e2a740d6389e9f0de70d3078c0dcc8Ho-Eun RyuOMX_ERRORTYPE ComponentBase::ApplyWorkingRole(void) 17935f3dea3773e2a740d6389e9f0de70d3078c0dcc8Ho-Eun Ryu{ 1794663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu OMX_U32 i; 17955995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu OMX_ERRORTYPE ret; 17965f3dea3773e2a740d6389e9f0de70d3078c0dcc8Ho-Eun Ryu 1797663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu if (state != OMX_StateUnloaded && state != OMX_StateLoaded) 1798663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu return OMX_ErrorIncorrectStateOperation; 1799663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu 18005995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu if (!working_role) 18015995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu return OMX_ErrorBadParameter; 18025995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu 1803663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu if (!callbacks || !appdata) 1804663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu return OMX_ErrorBadParameter; 1805663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu 18065995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu ret = AllocatePorts(); 18075995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu if (ret != OMX_ErrorNone) { 18085995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu LOGE("failed to AllocatePorts() (ret = 0x%08x)\n", ret); 18095995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu return ret; 18105995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu } 18115995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu 1812663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu /* now we can access ports */ 1813663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu for (i = 0; i < nr_ports; i++) { 1814663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu ports[i]->SetOwner(handle); 1815663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu ports[i]->SetCallbacks(handle, callbacks, appdata); 1816663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu } 1817663764bd4166f81e2fe4e8dc06ce917a0dc1d15cHo-Eun Ryu 181823381c4b5aa20392177ad1034402e748b64da936Ho-Eun Ryu LOGI("%s: set working role %s:", GetName(), GetWorkingRole()); 18195995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu return OMX_ErrorNone; 18205995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu} 18215995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu 18225995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun RyuOMX_ERRORTYPE ComponentBase::AllocatePorts(void) 18235995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu{ 1824f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu OMX_DIRTYPE dir; 1825f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu bool has_input, has_output; 1826f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu OMX_U32 i; 18275995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu OMX_ERRORTYPE ret; 18285995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu 18295995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu if (ports) 18305995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu return OMX_ErrorBadParameter; 18315995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu 18325995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu ret = ComponentAllocatePorts(); 18335995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu if (ret != OMX_ErrorNone) { 18345995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu LOGE("failed to %s::ComponentAllocatePorts(), ret = 0x%08x\n", 18355995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu name, ret); 18365995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu return ret; 18375995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu } 18385995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu 1839f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu has_input = false; 1840f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu has_output = false; 1841f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu ret = OMX_ErrorNone; 1842f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu for (i = 0; i < nr_ports; i++) { 1843f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu dir = ports[i]->GetPortDirection(); 1844f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu if (dir == OMX_DirInput) 1845f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu has_input = true; 1846f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu else if (dir == OMX_DirOutput) 1847f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu has_output = true; 1848f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu else { 1849f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu ret = OMX_ErrorUndefined; 1850f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu break; 1851f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu } 1852f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu } 1853f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu if (ret != OMX_ErrorNone) 1854f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu goto free_ports; 1855f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu 1856f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu if ((has_input == false) && (has_output == true)) 1857f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu cvariant = CVARIANT_SOURCE; 1858f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu else if ((has_input == true) && (has_output == true)) 1859f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu cvariant = CVARIANT_FILTER; 1860f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu else if ((has_input == true) && (has_output == false)) 1861f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu cvariant = CVARIANT_SINK; 1862f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu else 1863f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu goto free_ports; 1864f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu 18655995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu return OMX_ErrorNone; 1866f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu 1867f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryufree_ports: 1868f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu LOGE("%s(): exit, unknown component variant\n", __func__); 1869f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu FreePorts(); 18708af4549cec855377507046127d9b9a45911eaf04ywan return OMX_ErrorUndefined; 18715995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu} 18725995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu 18735995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu/* called int FreeHandle() */ 18745995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun RyuOMX_ERRORTYPE ComponentBase::FreePorts(void) 18755995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu{ 18765995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu if (ports) { 18775995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu OMX_U32 i, this_nr_ports = this->nr_ports; 18785995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu 18795995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu for (i = 0; i < this_nr_ports; i++) { 18805995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu if (ports[i]) { 188184536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu OMX_MARKTYPE *mark; 188284536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu /* it should be empty before this */ 188384536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu while ((mark = ports[i]->PopMark())) 188484536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu free(mark); 188584536897c4739ea3948fa165d2d86f5c4a126201Ho-Eun Ryu 18865995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu delete ports[i]; 18875995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu ports[i] = NULL; 18885995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu } 18895995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu } 18905995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu delete []ports; 18915995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu ports = NULL; 18925995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu } 18935995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu 18945995aef03a789309fef914febc0bc6beb2d926f2Ho-Eun Ryu return OMX_ErrorNone; 18955f3dea3773e2a740d6389e9f0de70d3078c0dcc8Ho-Eun Ryu} 18965f3dea3773e2a740d6389e9f0de70d3078c0dcc8Ho-Eun Ryu 18976a3d9478ea33b4e734cbcbc88d3f258c2cac94bbAustin HuOMX_COLOR_FORMATTYPE ComponentBase::GetOutputColorFormat(int width) 18986a3d9478ea33b4e734cbcbc88d3f258c2cac94bbAustin Hu{ 18996a3d9478ea33b4e734cbcbc88d3f258c2cac94bbAustin Hu LOGD("%s: width = %d", __func__, width); 19006a3d9478ea33b4e734cbcbc88d3f258c2cac94bbAustin Hu return OMX_INTEL_COLOR_FormatYUV420PackedSemiPlanar; 19016a3d9478ea33b4e734cbcbc88d3f258c2cac94bbAustin Hu} 19026a3d9478ea33b4e734cbcbc88d3f258c2cac94bbAustin Hu 190322d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu/* buffer processing */ 190422d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu/* implement WorkableInterface */ 190522d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryuvoid ComponentBase::Work(void) 190622d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu{ 190734277d8b1ca48a932e7b17ba331c29f040ba0838xiao OMX_BUFFERHEADERTYPE **buffers[nr_ports]; 190834277d8b1ca48a932e7b17ba331c29f040ba0838xiao OMX_BUFFERHEADERTYPE *buffers_hdr[nr_ports]; 1909705c231d1e4ff148d8cec637288d9ad41429f0e3Weian Chen OMX_BUFFERHEADERTYPE *buffers_org[nr_ports]; 1910f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu buffer_retain_t retain[nr_ports]; 191122d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu OMX_U32 i; 191222c02021e7be74c6636353ad0b62f60278a695c8Ho-Eun Ryu OMX_ERRORTYPE ret; 191322d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu 19148af4549cec855377507046127d9b9a45911eaf04ywan if (nr_ports == 0) { 19158af4549cec855377507046127d9b9a45911eaf04ywan return; 19168af4549cec855377507046127d9b9a45911eaf04ywan } 19178af4549cec855377507046127d9b9a45911eaf04ywan 191846a9a52901ba2f967e57fde33b8a496fc0c82670Zhao Liang memset(buffers, 0, sizeof(OMX_BUFFERHEADERTYPE *) * nr_ports); 191946a9a52901ba2f967e57fde33b8a496fc0c82670Zhao Liang memset(buffers_hdr, 0, sizeof(OMX_BUFFERHEADERTYPE *) * nr_ports); 192046a9a52901ba2f967e57fde33b8a496fc0c82670Zhao Liang memset(buffers_org, 0, sizeof(OMX_BUFFERHEADERTYPE *) * nr_ports); 192146a9a52901ba2f967e57fde33b8a496fc0c82670Zhao Liang 192222d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu pthread_mutex_lock(&ports_block); 192322d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu 192432a658abd2af3681d553a55582f31321fff4dd58Tao Tao while(IsAllBufferAvailable()) 192532a658abd2af3681d553a55582f31321fff4dd58Tao Tao { 19264345b3f2fbd534f8609a47a594d8b3b8f0bdd309Ho-Eun Ryu for (i = 0; i < nr_ports; i++) { 192734277d8b1ca48a932e7b17ba331c29f040ba0838xiao buffers_hdr[i] = ports[i]->PopBuffer(); 192834277d8b1ca48a932e7b17ba331c29f040ba0838xiao buffers[i] = &buffers_hdr[i]; 1929705c231d1e4ff148d8cec637288d9ad41429f0e3Weian Chen buffers_org[i] = buffers_hdr[i]; 1930f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu retain[i] = BUFFER_RETAIN_NOT_RETAIN; 19314345b3f2fbd534f8609a47a594d8b3b8f0bdd309Ho-Eun Ryu } 1932a3a94384a975aece23a5a68022268ce483d4a49dHo-Eun Ryu 1933b075b83b34ab602a1583879948042d697b43b58aywan if (working_role != NULL && !strncmp((char*)working_role, "video_decoder", 13)){ 193434277d8b1ca48a932e7b17ba331c29f040ba0838xiao ret = ProcessorProcess(buffers, &retain[0], nr_ports); 193534277d8b1ca48a932e7b17ba331c29f040ba0838xiao }else{ 193634277d8b1ca48a932e7b17ba331c29f040ba0838xiao ret = ProcessorProcess(buffers_hdr, &retain[0], nr_ports); 193734277d8b1ca48a932e7b17ba331c29f040ba0838xiao } 1938f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu 193922c02021e7be74c6636353ad0b62f60278a695c8Ho-Eun Ryu if (ret == OMX_ErrorNone) { 1940a081918af785d476df2da1342eabe245eab468d0Zhao Liang if (!working_role || (strncmp((char*)working_role, "video_encoder", 13) != 0)) 1941a081918af785d476df2da1342eabe245eab468d0Zhao Liang PostProcessBuffers(buffers, &retain[0]); 194222c02021e7be74c6636353ad0b62f60278a695c8Ho-Eun Ryu 194322c02021e7be74c6636353ad0b62f60278a695c8Ho-Eun Ryu for (i = 0; i < nr_ports; i++) { 194446a9a52901ba2f967e57fde33b8a496fc0c82670Zhao Liang if (buffers_hdr[i] == NULL) 1945a081918af785d476df2da1342eabe245eab468d0Zhao Liang continue; 1946a081918af785d476df2da1342eabe245eab468d0Zhao Liang 1947705c231d1e4ff148d8cec637288d9ad41429f0e3Weian Chen if(retain[i] == BUFFER_RETAIN_GETAGAIN) { 194834277d8b1ca48a932e7b17ba331c29f040ba0838xiao ports[i]->RetainThisBuffer(*buffers[i], false); 1949705c231d1e4ff148d8cec637288d9ad41429f0e3Weian Chen } 1950705c231d1e4ff148d8cec637288d9ad41429f0e3Weian Chen else if (retain[i] == BUFFER_RETAIN_ACCUMULATE) { 195134277d8b1ca48a932e7b17ba331c29f040ba0838xiao ports[i]->RetainThisBuffer(*buffers[i], true); 1952705c231d1e4ff148d8cec637288d9ad41429f0e3Weian Chen } 1953705c231d1e4ff148d8cec637288d9ad41429f0e3Weian Chen else if (retain[i] == BUFFER_RETAIN_OVERRIDDEN) { 1954705c231d1e4ff148d8cec637288d9ad41429f0e3Weian Chen ports[i]->RetainAndReturnBuffer(buffers_org[i], *buffers[i]); 195585d33bdb86649f8daa474948f3224cc0a6c160ceZhao Liang } 195685d33bdb86649f8daa474948f3224cc0a6c160ceZhao Liang else if (retain[i] == BUFFER_RETAIN_CACHE) { 195785d33bdb86649f8daa474948f3224cc0a6c160ceZhao Liang //nothing to do 1958705c231d1e4ff148d8cec637288d9ad41429f0e3Weian Chen } else { 195934277d8b1ca48a932e7b17ba331c29f040ba0838xiao ports[i]->ReturnThisBuffer(*buffers[i]); 1960705c231d1e4ff148d8cec637288d9ad41429f0e3Weian Chen } 196122c02021e7be74c6636353ad0b62f60278a695c8Ho-Eun Ryu } 196222c02021e7be74c6636353ad0b62f60278a695c8Ho-Eun Ryu } 196322c02021e7be74c6636353ad0b62f60278a695c8Ho-Eun Ryu else { 19645aeb9f85283fbbd2084c8cd8b547b496e4bdfe83Ho-Eun Ryu 196522c02021e7be74c6636353ad0b62f60278a695c8Ho-Eun Ryu for (i = 0; i < nr_ports; i++) { 196646a9a52901ba2f967e57fde33b8a496fc0c82670Zhao Liang if (buffers_hdr[i] == NULL) 196746a9a52901ba2f967e57fde33b8a496fc0c82670Zhao Liang continue; 196846a9a52901ba2f967e57fde33b8a496fc0c82670Zhao Liang 196922c02021e7be74c6636353ad0b62f60278a695c8Ho-Eun Ryu /* return buffers by hands, these buffers're not in queue */ 197034277d8b1ca48a932e7b17ba331c29f040ba0838xiao ports[i]->ReturnThisBuffer(*buffers[i]); 197122c02021e7be74c6636353ad0b62f60278a695c8Ho-Eun Ryu /* flush ports */ 197222c02021e7be74c6636353ad0b62f60278a695c8Ho-Eun Ryu ports[i]->FlushPort(); 197322c02021e7be74c6636353ad0b62f60278a695c8Ho-Eun Ryu } 19746f1535e99c8d19e8cebc5bc0cec462100c8576c6Weian Chen 19756f1535e99c8d19e8cebc5bc0cec462100c8576c6Weian Chen callbacks->EventHandler(handle, appdata, OMX_EventError, ret, 19766f1535e99c8d19e8cebc5bc0cec462100c8576c6Weian Chen 0, NULL); 19774345b3f2fbd534f8609a47a594d8b3b8f0bdd309Ho-Eun Ryu } 197822d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu } 197908109deff68a8aee14dc6add1d291610f781382bHo-Eun Ryu 198022d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu pthread_mutex_unlock(&ports_block); 198122d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu} 198222d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu 198322d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryubool ComponentBase::IsAllBufferAvailable(void) 198422d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu{ 198522d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu OMX_U32 i; 198622d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu OMX_U32 nr_avail = 0; 198722d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu 198822d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu for (i = 0; i < nr_ports; i++) { 1989b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu OMX_U32 length = 0; 1990b7ca9a1a868348e9234c9aee022929c9b3267e4dHo-Eun Ryu 1991a081918af785d476df2da1342eabe245eab468d0Zhao Liang if (ports[i]->IsEnabled()) { 1992a081918af785d476df2da1342eabe245eab468d0Zhao Liang length += ports[i]->BufferQueueLength(); 1993a081918af785d476df2da1342eabe245eab468d0Zhao Liang length += ports[i]->RetainedBufferQueueLength(); 1994a081918af785d476df2da1342eabe245eab468d0Zhao Liang } 199522d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu 199622d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu if (length) 199722d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu nr_avail++; 199822d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu } 199922d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu 200022d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu if (nr_avail == nr_ports) 200122d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu return true; 200222d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu else 200322d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu return false; 200422d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu} 200522d9fa5479b936d58d92f54d16560d0f9f15d5b3Ho-Eun Ryu 2006f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryuinline void ComponentBase::SourcePostProcessBuffers( 20073f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan OMX_BUFFERHEADERTYPE ***buffers) 20087036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu{ 20097036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu OMX_U32 i; 20107036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu 20117036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu for (i = 0; i < nr_ports; i++) { 2012f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu /* 2013f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu * in case of source component, buffers're marked when they come 2014f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu * from the ouput ports 2015f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu */ 201634277d8b1ca48a932e7b17ba331c29f040ba0838xiao if (!(*buffers[i])->hMarkTargetComponent) { 2017f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu OMX_MARKTYPE *mark; 2018f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu 2019f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu mark = ports[i]->PopMark(); 2020f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu if (mark) { 202134277d8b1ca48a932e7b17ba331c29f040ba0838xiao (*buffers[i])->hMarkTargetComponent = mark->hMarkTargetComponent; 202234277d8b1ca48a932e7b17ba331c29f040ba0838xiao (*buffers[i])->pMarkData = mark->pMarkData; 2023f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu free(mark); 20247036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu } 2025f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu } 2026f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu } 2027f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu} 2028f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu 2029f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryuinline void ComponentBase::FilterPostProcessBuffers( 203034277d8b1ca48a932e7b17ba331c29f040ba0838xiao OMX_BUFFERHEADERTYPE ***buffers, 2031f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu const buffer_retain_t *retain) 2032f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu{ 2033f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu OMX_MARKTYPE *mark; 2034f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu OMX_U32 i, j; 20357036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu 2036f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu for (i = 0; i < nr_ports; i++) { 2037f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu if (ports[i]->GetPortDirection() == OMX_DirInput) { 20387036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu for (j = 0; j < nr_ports; j++) { 2039f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu if (ports[j]->GetPortDirection() != OMX_DirOutput) 20407036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu continue; 20417036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu 2042f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu /* propagates EOS flag */ 2043f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu /* clear input EOS at the end of this loop */ 2044f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu if (retain[i] != BUFFER_RETAIN_GETAGAIN) { 204534277d8b1ca48a932e7b17ba331c29f040ba0838xiao if ((*buffers[i])->nFlags & OMX_BUFFERFLAG_EOS) 204634277d8b1ca48a932e7b17ba331c29f040ba0838xiao (*buffers[j])->nFlags |= OMX_BUFFERFLAG_EOS; 2047f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu } 20487036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu 2049f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu /* propagates marks */ 2050f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu /* 2051f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu * if hMarkTargetComponent == handle then the mark's not 2052f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu * propagated 2053f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu */ 205434277d8b1ca48a932e7b17ba331c29f040ba0838xiao if ((*buffers[i])->hMarkTargetComponent && 205534277d8b1ca48a932e7b17ba331c29f040ba0838xiao ((*buffers[i])->hMarkTargetComponent != handle)) { 205634277d8b1ca48a932e7b17ba331c29f040ba0838xiao if ((*buffers[j])->hMarkTargetComponent) { 2057f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu mark = (OMX_MARKTYPE *)malloc(sizeof(*mark)); 2058f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu if (mark) { 2059f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu mark->hMarkTargetComponent = 206034277d8b1ca48a932e7b17ba331c29f040ba0838xiao (*buffers[i])->hMarkTargetComponent; 206134277d8b1ca48a932e7b17ba331c29f040ba0838xiao mark->pMarkData = (*buffers[i])->pMarkData; 2062f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu ports[j]->PushMark(mark); 2063f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu mark = NULL; 206434277d8b1ca48a932e7b17ba331c29f040ba0838xiao (*buffers[i])->hMarkTargetComponent = NULL; 206534277d8b1ca48a932e7b17ba331c29f040ba0838xiao (*buffers[i])->pMarkData = NULL; 2066f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu } 2067f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu } 2068f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu else { 20697036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu mark = ports[j]->PopMark(); 20707036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu if (mark) { 207134277d8b1ca48a932e7b17ba331c29f040ba0838xiao (*buffers[j])->hMarkTargetComponent = 20727036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu mark->hMarkTargetComponent; 207334277d8b1ca48a932e7b17ba331c29f040ba0838xiao (*buffers[j])->pMarkData = mark->pMarkData; 20747036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu free(mark); 20757036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu 20767036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu mark = (OMX_MARKTYPE *)malloc(sizeof(*mark)); 20777036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu if (mark) { 20787036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu mark->hMarkTargetComponent = 207934277d8b1ca48a932e7b17ba331c29f040ba0838xiao (*buffers[i])->hMarkTargetComponent; 208034277d8b1ca48a932e7b17ba331c29f040ba0838xiao mark->pMarkData = (*buffers[i])->pMarkData; 20817036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu ports[j]->PushMark(mark); 20827036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu mark = NULL; 208334277d8b1ca48a932e7b17ba331c29f040ba0838xiao (*buffers[i])->hMarkTargetComponent = NULL; 208434277d8b1ca48a932e7b17ba331c29f040ba0838xiao (*buffers[i])->pMarkData = NULL; 20857036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu } 20867036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu } 2087f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu else { 208834277d8b1ca48a932e7b17ba331c29f040ba0838xiao (*buffers[j])->hMarkTargetComponent = 208934277d8b1ca48a932e7b17ba331c29f040ba0838xiao (*buffers[i])->hMarkTargetComponent; 209034277d8b1ca48a932e7b17ba331c29f040ba0838xiao (*buffers[j])->pMarkData = (*buffers[i])->pMarkData; 209134277d8b1ca48a932e7b17ba331c29f040ba0838xiao (*buffers[i])->hMarkTargetComponent = NULL; 209234277d8b1ca48a932e7b17ba331c29f040ba0838xiao (*buffers[i])->pMarkData = NULL; 20937036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu } 20947036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu } 20957036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu } 20967036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu } 2097f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu /* clear input buffer's EOS */ 2098f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu if (retain[i] != BUFFER_RETAIN_GETAGAIN) 209934277d8b1ca48a932e7b17ba331c29f040ba0838xiao (*buffers[i])->nFlags &= ~OMX_BUFFERFLAG_EOS; 21007036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu } 2101f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu } 2102f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu} 2103f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu 21043f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywaninline void ComponentBase::SinkPostProcessBuffers() 2105f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu{ 2106f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu return; 2107f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu} 2108f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu 210934277d8b1ca48a932e7b17ba331c29f040ba0838xiaovoid ComponentBase::PostProcessBuffers(OMX_BUFFERHEADERTYPE ***buffers, 2110f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu const buffer_retain_t *retain) 2111f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu{ 2112f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu 2113f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu if (cvariant == CVARIANT_SOURCE) 21143f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan SourcePostProcessBuffers(buffers); 2115f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu else if (cvariant == CVARIANT_FILTER) 2116f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu FilterPostProcessBuffers(buffers, retain); 2117f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu else if (cvariant == CVARIANT_SINK) { 21183f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan SinkPostProcessBuffers(); 2119f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu } 2120f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu else { 2121f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu LOGE("%s(): fatal error unknown component variant (%d)\n", 2122f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu __func__, cvariant); 21237036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu } 21247036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu} 21257036eb904f03a68a182222e5c8148163dc0f1ad7Ho-Eun Ryu 21267ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu/* processor default callbacks */ 21277ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun RyuOMX_ERRORTYPE ComponentBase::ProcessorInit(void) 21287ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu{ 21297ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu return OMX_ErrorNone; 21307ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu} 21317ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun RyuOMX_ERRORTYPE ComponentBase::ProcessorDeinit(void) 21327ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu{ 21337ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu return OMX_ErrorNone; 21347ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu} 21357ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu 21367ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun RyuOMX_ERRORTYPE ComponentBase::ProcessorStart(void) 21377ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu{ 21387ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu return OMX_ErrorNone; 21397ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu} 21407ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu 2141ecc877a1dd44921dff3f300bc5559841f0c44ac6ywanOMX_ERRORTYPE ComponentBase::ProcessorReset(void) 2142ecc877a1dd44921dff3f300bc5559841f0c44ac6ywan{ 2143ecc877a1dd44921dff3f300bc5559841f0c44ac6ywan return OMX_ErrorNone; 2144ecc877a1dd44921dff3f300bc5559841f0c44ac6ywan} 2145ecc877a1dd44921dff3f300bc5559841f0c44ac6ywan 2146ecc877a1dd44921dff3f300bc5559841f0c44ac6ywan 21477ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun RyuOMX_ERRORTYPE ComponentBase::ProcessorStop(void) 21487ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu{ 21497ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu return OMX_ErrorNone; 21507ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu} 21517ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu 21527ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun RyuOMX_ERRORTYPE ComponentBase::ProcessorPause(void) 21537ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu{ 21547ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu return OMX_ErrorNone; 21557ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu} 21567ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu 21577ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun RyuOMX_ERRORTYPE ComponentBase::ProcessorResume(void) 21587ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu{ 21597ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu return OMX_ErrorNone; 21607ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu} 21617ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu 21623f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywanOMX_ERRORTYPE ComponentBase::ProcessorFlush(OMX_U32) 2163666f8b21fe0923595def20b16e9e7eefa11308b2Tao Tao{ 2164666f8b21fe0923595def20b16e9e7eefa11308b2Tao Tao return OMX_ErrorNone; 2165666f8b21fe0923595def20b16e9e7eefa11308b2Tao Tao} 21663f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywanOMX_ERRORTYPE ComponentBase::ProcessorPreFillBuffer(OMX_BUFFERHEADERTYPE*) 216734277d8b1ca48a932e7b17ba331c29f040ba0838xiao{ 216834277d8b1ca48a932e7b17ba331c29f040ba0838xiao return OMX_ErrorNone; 216934277d8b1ca48a932e7b17ba331c29f040ba0838xiao} 217034277d8b1ca48a932e7b17ba331c29f040ba0838xiao 21713f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywanOMX_ERRORTYPE ComponentBase::ProcessorPreEmptyBuffer(OMX_BUFFERHEADERTYPE*) 217285d33bdb86649f8daa474948f3224cc0a6c160ceZhao Liang{ 217385d33bdb86649f8daa474948f3224cc0a6c160ceZhao Liang return OMX_ErrorNone; 217485d33bdb86649f8daa474948f3224cc0a6c160ceZhao Liang} 21753f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywanOMX_ERRORTYPE ComponentBase::ProcessorProcess(OMX_BUFFERHEADERTYPE **, 21763f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan buffer_retain_t *, 21773f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan OMX_U32) 217834277d8b1ca48a932e7b17ba331c29f040ba0838xiao{ 217934277d8b1ca48a932e7b17ba331c29f040ba0838xiao LOGE("ProcessorProcess not be implemented"); 218034277d8b1ca48a932e7b17ba331c29f040ba0838xiao return OMX_ErrorNotImplemented; 218134277d8b1ca48a932e7b17ba331c29f040ba0838xiao} 21823f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywanOMX_ERRORTYPE ComponentBase::ProcessorProcess(OMX_BUFFERHEADERTYPE ***, 21833f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan buffer_retain_t *, 21843f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan OMX_U32) 218534277d8b1ca48a932e7b17ba331c29f040ba0838xiao{ 218634277d8b1ca48a932e7b17ba331c29f040ba0838xiao LOGE("ProcessorProcess not be implemented"); 218734277d8b1ca48a932e7b17ba331c29f040ba0838xiao return OMX_ErrorNotImplemented; 218834277d8b1ca48a932e7b17ba331c29f040ba0838xiao} 218934277d8b1ca48a932e7b17ba331c29f040ba0838xiao 21903f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywanOMX_ERRORTYPE ComponentBase::ProcessorPreFreeBuffer(OMX_U32, OMX_BUFFERHEADERTYPE*) 219157fbad335bcd1fc0b12cea2e58586015cec7b571xiao{ 219257fbad335bcd1fc0b12cea2e58586015cec7b571xiao return OMX_ErrorNone; 219357fbad335bcd1fc0b12cea2e58586015cec7b571xiao 219457fbad335bcd1fc0b12cea2e58586015cec7b571xiao} 21957ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu/* end of processor callbacks */ 21967ca8edc2e24fcee5fbaa5406bc966494d13ac1b4Ho-Eun Ryu 2197abc94977297716935830b32fce440a07a73250a5Ho-Eun Ryu/* helper for derived class */ 21983f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywanOMX_STRING ComponentBase::GetWorkingRole(void) 2199abc94977297716935830b32fce440a07a73250a5Ho-Eun Ryu{ 2200abc94977297716935830b32fce440a07a73250a5Ho-Eun Ryu return &working_role[0]; 2201abc94977297716935830b32fce440a07a73250a5Ho-Eun Ryu} 2202abc94977297716935830b32fce440a07a73250a5Ho-Eun Ryu 220369d34dfb7d76cbdd1bd0f0b4b7cb1f2267f5002aHo-Eun Ryuconst OMX_COMPONENTTYPE *ComponentBase::GetComponentHandle(void) 220469d34dfb7d76cbdd1bd0f0b4b7cb1f2267f5002aHo-Eun Ryu{ 220569d34dfb7d76cbdd1bd0f0b4b7cb1f2267f5002aHo-Eun Ryu return handle; 220669d34dfb7d76cbdd1bd0f0b4b7cb1f2267f5002aHo-Eun Ryu} 2207ec2f29d0c23a6c7ea3a36e03a9635b63ac23ae35XiaoFeng#if 0 2208dd0f8243514bd9380e5172ba883e488bcf65dcc9Ho-Eun Ryuvoid ComponentBase::DumpBuffer(const OMX_BUFFERHEADERTYPE *bufferheader, 2209dd0f8243514bd9380e5172ba883e488bcf65dcc9Ho-Eun Ryu bool dumpdata) 221027cb7aad256077ad50541fb08c675b257ec76626Ho-Eun Ryu{ 2211fb74fc90d40dadb1a607b3e81a2f271845fcd659Ho-Eun Ryu OMX_U8 *pbuffer = bufferheader->pBuffer, *p; 221227cb7aad256077ad50541fb08c675b257ec76626Ho-Eun Ryu OMX_U32 offset = bufferheader->nOffset; 221327cb7aad256077ad50541fb08c675b257ec76626Ho-Eun Ryu OMX_U32 alloc_len = bufferheader->nAllocLen; 221427cb7aad256077ad50541fb08c675b257ec76626Ho-Eun Ryu OMX_U32 filled_len = bufferheader->nFilledLen; 221527cb7aad256077ad50541fb08c675b257ec76626Ho-Eun Ryu OMX_U32 left = filled_len, oneline; 221627cb7aad256077ad50541fb08c675b257ec76626Ho-Eun Ryu OMX_U32 index = 0, i; 2217fb74fc90d40dadb1a607b3e81a2f271845fcd659Ho-Eun Ryu /* 0x%04lx: %02x %02x .. (n = 16)\n\0 */ 2218fb74fc90d40dadb1a607b3e81a2f271845fcd659Ho-Eun Ryu char prbuffer[8 + 3 * 0x10 + 2], *pp; 2219fb74fc90d40dadb1a607b3e81a2f271845fcd659Ho-Eun Ryu OMX_U32 prbuffer_len; 222027cb7aad256077ad50541fb08c675b257ec76626Ho-Eun Ryu 2221f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu LOGD("Component %s DumpBuffer\n", name); 2222fb74fc90d40dadb1a607b3e81a2f271845fcd659Ho-Eun Ryu LOGD("%s port index = %lu", 2223fb74fc90d40dadb1a607b3e81a2f271845fcd659Ho-Eun Ryu (bufferheader->nInputPortIndex != 0x7fffffff) ? "input" : "output", 2224fb74fc90d40dadb1a607b3e81a2f271845fcd659Ho-Eun Ryu (bufferheader->nInputPortIndex != 0x7fffffff) ? 2225fb74fc90d40dadb1a607b3e81a2f271845fcd659Ho-Eun Ryu bufferheader->nInputPortIndex : bufferheader->nOutputPortIndex); 222627cb7aad256077ad50541fb08c675b257ec76626Ho-Eun Ryu LOGD("nAllocLen = %lu, nOffset = %lu, nFilledLen = %lu\n", 222727cb7aad256077ad50541fb08c675b257ec76626Ho-Eun Ryu alloc_len, offset, filled_len); 222827cb7aad256077ad50541fb08c675b257ec76626Ho-Eun Ryu LOGD("nTimeStamp = %lld, nTickCount = %lu", 222927cb7aad256077ad50541fb08c675b257ec76626Ho-Eun Ryu bufferheader->nTimeStamp, 223027cb7aad256077ad50541fb08c675b257ec76626Ho-Eun Ryu bufferheader->nTickCount); 223127cb7aad256077ad50541fb08c675b257ec76626Ho-Eun Ryu LOGD("nFlags = 0x%08lx\n", bufferheader->nFlags); 2232f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu LOGD("hMarkTargetComponent = %p, pMarkData = %p\n", 2233f0a76b4aab79646e482196e212f89ab1aacd6f6fHo-Eun Ryu bufferheader->hMarkTargetComponent, bufferheader->pMarkData); 223427cb7aad256077ad50541fb08c675b257ec76626Ho-Eun Ryu 2235fb74fc90d40dadb1a607b3e81a2f271845fcd659Ho-Eun Ryu if (!pbuffer || !alloc_len || !filled_len) 223627cb7aad256077ad50541fb08c675b257ec76626Ho-Eun Ryu return; 223727cb7aad256077ad50541fb08c675b257ec76626Ho-Eun Ryu 223827cb7aad256077ad50541fb08c675b257ec76626Ho-Eun Ryu if (offset + filled_len > alloc_len) 223927cb7aad256077ad50541fb08c675b257ec76626Ho-Eun Ryu return; 224027cb7aad256077ad50541fb08c675b257ec76626Ho-Eun Ryu 2241dd0f8243514bd9380e5172ba883e488bcf65dcc9Ho-Eun Ryu if (!dumpdata) 2242dd0f8243514bd9380e5172ba883e488bcf65dcc9Ho-Eun Ryu return; 2243dd0f8243514bd9380e5172ba883e488bcf65dcc9Ho-Eun Ryu 2244fb74fc90d40dadb1a607b3e81a2f271845fcd659Ho-Eun Ryu p = pbuffer + offset; 224527cb7aad256077ad50541fb08c675b257ec76626Ho-Eun Ryu while (left) { 2246fb74fc90d40dadb1a607b3e81a2f271845fcd659Ho-Eun Ryu oneline = left > 0x10 ? 0x10 : left; /* 16 items per 1 line */ 2247fb74fc90d40dadb1a607b3e81a2f271845fcd659Ho-Eun Ryu pp += sprintf(pp, "0x%04lx: ", index); 224827cb7aad256077ad50541fb08c675b257ec76626Ho-Eun Ryu for (i = 0; i < oneline; i++) 2249fb74fc90d40dadb1a607b3e81a2f271845fcd659Ho-Eun Ryu pp += sprintf(pp, " %02x", *(p + i)); 2250fb74fc90d40dadb1a607b3e81a2f271845fcd659Ho-Eun Ryu pp += sprintf(pp, "\n"); 2251fb74fc90d40dadb1a607b3e81a2f271845fcd659Ho-Eun Ryu *pp = '\0'; 2252fb74fc90d40dadb1a607b3e81a2f271845fcd659Ho-Eun Ryu 225327cb7aad256077ad50541fb08c675b257ec76626Ho-Eun Ryu index += 0x10; 225427cb7aad256077ad50541fb08c675b257ec76626Ho-Eun Ryu p += oneline; 225527cb7aad256077ad50541fb08c675b257ec76626Ho-Eun Ryu left -= oneline; 2256fb74fc90d40dadb1a607b3e81a2f271845fcd659Ho-Eun Ryu 2257fb74fc90d40dadb1a607b3e81a2f271845fcd659Ho-Eun Ryu pp = &prbuffer[0]; 2258fb74fc90d40dadb1a607b3e81a2f271845fcd659Ho-Eun Ryu LOGD("%s", pp); 225927cb7aad256077ad50541fb08c675b257ec76626Ho-Eun Ryu } 226027cb7aad256077ad50541fb08c675b257ec76626Ho-Eun Ryu} 2261ec2f29d0c23a6c7ea3a36e03a9635b63ac23ae35XiaoFeng#endif 226220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu/* end of component methods & helpers */ 226320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 226420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu/* 226520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu * omx header manipuation 226620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu */ 226720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryuvoid ComponentBase::SetTypeHeader(OMX_PTR type, OMX_U32 size) 226820fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 226920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_U32 *nsize; 227020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_VERSIONTYPE *nversion; 227120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 227220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!type) 227320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu return; 227420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 227520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu nsize = (OMX_U32 *)type; 227620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu nversion = (OMX_VERSIONTYPE *)((OMX_U8 *)type + sizeof(OMX_U32)); 227720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 2278074aeb8c3193c729c3e1050b970a2315608d0a24Ho-Eun Ryu *nsize = size; 227920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu nversion->nVersion = OMX_SPEC_VERSION; 228020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 228120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 2282dfaf4e141f33555032cc66b3810eba741a589288Ho-Eun RyuOMX_ERRORTYPE ComponentBase::CheckTypeHeader(const OMX_PTR type, OMX_U32 size) 228320fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu{ 228420fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_U32 *nsize; 228520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu OMX_VERSIONTYPE *nversion; 228620fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 228720fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu if (!type) 2288074aeb8c3193c729c3e1050b970a2315608d0a24Ho-Eun Ryu return OMX_ErrorBadParameter; 228920fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 229020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu nsize = (OMX_U32 *)type; 229120fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu nversion = (OMX_VERSIONTYPE *)((OMX_U8 *)type + sizeof(OMX_U32)); 229220fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 2293074aeb8c3193c729c3e1050b970a2315608d0a24Ho-Eun Ryu if (*nsize != size) 2294074aeb8c3193c729c3e1050b970a2315608d0a24Ho-Eun Ryu return OMX_ErrorBadParameter; 229520fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu 2296074aeb8c3193c729c3e1050b970a2315608d0a24Ho-Eun Ryu if (nversion->nVersion != OMX_SPEC_VERSION) 2297074aeb8c3193c729c3e1050b970a2315608d0a24Ho-Eun Ryu return OMX_ErrorVersionMismatch; 2298074aeb8c3193c729c3e1050b970a2315608d0a24Ho-Eun Ryu 2299074aeb8c3193c729c3e1050b970a2315608d0a24Ho-Eun Ryu return OMX_ErrorNone; 230020fb971c092d9f2141a81d0890d211dab85284acHo-Eun Ryu} 23015ab694059dd6abe79303fdf2712a974d9d2e29d4Ho-Eun Ryu 23025ab694059dd6abe79303fdf2712a974d9d2e29d4Ho-Eun Ryu/* end of ComponentBase */ 2303