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(&paramPortDefinitionOutput,ports[p->nPortIndex]->GetPortDefinition(),
6763f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan                        sizeof(paramPortDefinitionOutput));
6773f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan                paramPortDefinitionOutput.format.video.nFrameWidth = mMaxFrameWidth;
6783f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan                paramPortDefinitionOutput.format.video.nFrameHeight = mMaxFrameHeight;
6793f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan                ports[p->nPortIndex]->SetPortDefinition(&paramPortDefinitionOutput, 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