1e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
2e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @copyright
3e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
4e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *   Copyright (c) 2015, The Linux Foundation. All rights reserved.
5e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
6e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *   Redistribution and use in source and binary forms, with or without
7e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *   modification, are permitted provided that the following conditions are met:
8e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
9e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *   * Redistributions of source code must retain the above copyright notice,
10e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *     this list of conditions and the following disclaimer.
11e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *   * Redistributions in binary form must reproduce the above copyright notice,
12e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *     this list of conditions and the following disclaimer in the documentation
13e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *     and/or other materials provided with the distribution.
14e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *   * Neither the name of The Linux Foundation nor the names of its
15e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *     contributors may be used to endorse or promote products derived from
16e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *     this software without specific prior written permission.
17e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
18e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *   THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
19e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
20e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *   FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE DISCLAIMED.
21e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *   IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
22e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *   DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *   CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *   LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *   OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
28e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *   DAMAGE.
29e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
30e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @file
31e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
32e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *   omx_swvdec.cpp
33e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
34e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief
35e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
36e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *   OMX software video decoder component source.
37e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
38e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
39e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <assert.h>
40e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <fcntl.h>
41e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <sys/mman.h>
42e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
43e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <media/hardware/HardwareAPI.h>
44e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <gralloc_priv.h>
45e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
46e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include "OMX_QCOMExtns.h"
47e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
48e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include "omx_swvdec.h"
49e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
50e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include "swvdec_api.h"
51e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
52e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
53e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * ----------------
54e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * PUBLIC FUNCTIONS
55e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * ----------------
56e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
57e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
58e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
59e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Create & return component class instance.
60e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
61e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval Pointer to new component class instance.
62e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
63e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid *get_omx_component_factory_fn(void)
64e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
65e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return new omx_swvdec;
66e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
67e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
68e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
69e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Component constructor.
70e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
71e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinomx_swvdec::omx_swvdec():
72e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_state(OMX_StateInvalid),
73e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_status_flags(0),
74e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_swvdec_codec(SWVDEC_CODEC_INVALID),
75e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_swvdec_handle(NULL),
76e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_swvdec_created(false),
77e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_omx_video_codingtype(OMX_VIDEO_CodingUnused),
78e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_omx_color_formattype(OMX_COLOR_FormatUnused),
79e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_sync_frame_decoding_mode(false),
80e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_android_native_buffers(false),
81e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_meta_buffer_mode(false),
82e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_port_reconfig_inprogress(false),
83e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_buffer_array_ip(NULL),
84e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_buffer_array_op(NULL),
85e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_meta_buffer_array(NULL)
86e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
87e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    // memset all member variables that are composite structures
88e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    memset(&m_cmp,                     0, sizeof(m_cmp)); // part of base class
89e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    memset(&m_cmp_name[0],             0, sizeof(m_cmp_name));
90e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    memset(&m_role_name[0],            0, sizeof(m_role_name));
91e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    memset(&m_frame_rate,              0, sizeof(m_frame_rate));
92e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    memset(&m_frame_dimensions,        0, sizeof(m_frame_dimensions));
93e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    memset(&m_frame_attributes,        0, sizeof(m_frame_attributes));
94e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    memset(&m_async_thread,            0, sizeof(m_async_thread));
95e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    memset(&m_port_ip,                 0, sizeof(m_port_ip));
96e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    memset(&m_port_op,                 0, sizeof(m_port_op));
97e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    memset(&m_callback,                0, sizeof(m_callback));
98e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    memset(&m_app_data,                0, sizeof(m_app_data));
99e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    memset(&m_prio_mgmt,               0, sizeof(m_prio_mgmt));
100e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    memset(&m_sem_cmd,                 0, sizeof(m_sem_cmd));
101e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    memset(&m_meta_buffer_array_mutex, 0, sizeof(m_meta_buffer_array_mutex));
102e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
103e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    // null-terminate component name & role name strings
104e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_cmp_name[0]  = '\0';
105e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_role_name[0] = '\0';
106e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
107e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    // ports are enabled & unpopulated by default
108e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_port_ip.enabled     = OMX_TRUE;
109e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_port_op.enabled     = OMX_TRUE;
110e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_port_ip.unpopulated = OMX_TRUE;
111e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_port_op.unpopulated = OMX_TRUE;
112e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
113e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
114e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
115e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Component destructor.
116e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinomx_swvdec::~omx_swvdec()
118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
119e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
120e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
121e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
122e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Initialize component.
123e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
124e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmp_name: Component name string.
125e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
126e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
127e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
128e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::component_init(OMX_STRING cmp_name)
129e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
130e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
131e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
132e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_LOG_API("'%s', version date: %s",
133e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                       cmp_name,
134e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                       OMX_SWVDEC_VERSION_DATE);
135e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
136e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    omx_swvdec_log_init();
137e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
138e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_state != OMX_StateInvalid)
139e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
140e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("disallowed in state %s",
141e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             OMX_STATETYPE_STRING(m_state));
142e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorIncorrectStateOperation;
143e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto component_init_exit;
144e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
145e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
146e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    // set up codec type variables based on component name string
147e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
148e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (!strncmp(cmp_name,
149e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                 "OMX.qti.video.decoder.mpeg4sw",
150e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                 OMX_MAX_STRINGNAME_SIZE))
151e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
152e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_LOW("'video_decoder.mpeg4'");
153e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
154e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        strlcpy(m_cmp_name,               cmp_name, OMX_MAX_STRINGNAME_SIZE);
155e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        strlcpy(m_role_name, "video_decoder.mpeg4", OMX_MAX_STRINGNAME_SIZE);
156e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_swvdec_codec         = SWVDEC_CODEC_MPEG4;
158e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_omx_video_codingtype = OMX_VIDEO_CodingMPEG4;
159e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
160e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (!strncmp(cmp_name,
161e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                      "OMX.qti.video.decoder.h263sw",
162e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                      OMX_MAX_STRINGNAME_SIZE))
163e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
164e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_LOW("video_decoder.h263");
165e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
166e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        strlcpy(m_cmp_name,              cmp_name, OMX_MAX_STRINGNAME_SIZE);
167e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        strlcpy(m_role_name, "video_decoder.h263", OMX_MAX_STRINGNAME_SIZE);
168e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
169e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_swvdec_codec         = SWVDEC_CODEC_H263;
170e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_omx_video_codingtype = OMX_VIDEO_CodingH263;
171e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
172e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (((!strncmp(cmp_name,
173e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        "OMX.qti.video.decoder.divxsw",
174e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        OMX_MAX_STRINGNAME_SIZE))) ||
175e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin             ((!strncmp(cmp_name,
176e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        "OMX.qti.video.decoder.divx4sw",
177e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        OMX_MAX_STRINGNAME_SIZE))))
178e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
179e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_LOW("video_decoder.divx");
180e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
181e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        strlcpy(m_cmp_name,              cmp_name, OMX_MAX_STRINGNAME_SIZE);
182e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        strlcpy(m_role_name, "video_decoder.divx", OMX_MAX_STRINGNAME_SIZE);
183e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
184e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_swvdec_codec         = SWVDEC_CODEC_MPEG4;
185e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_omx_video_codingtype = ((OMX_VIDEO_CODINGTYPE) QOMX_VIDEO_CodingDivx);
186e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
187e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
188e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
189e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("'%s': invalid component name", cmp_name);
190e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidComponentName;
191e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto component_init_exit;
192e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
193e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
194e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_omx_color_formattype =
195e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        (OMX_COLOR_FORMATTYPE) OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar32m;
196e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
197e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_frame_rate.fps_numerator   = DEFAULT_FPS_NUMERATOR;
198e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_frame_rate.fps_denominator = DEFAULT_FPS_DENOMINATOR;
199e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
200e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
201e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        SWVDEC_CALLBACK callback;
202e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
203e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        SWVDEC_STATUS retval_swvdec;
204e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
205e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        // initialize SwVdec core library
206e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
207e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        callback.pfn_empty_buffer_done  = swvdec_empty_buffer_done_callback;
208e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        callback.pfn_fill_buffer_done   = swvdec_fill_buffer_done_callback;
209e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        callback.pfn_event_notification = swvdec_event_handler_callback;
210e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        callback.p_client               = this;
211e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
212e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((retval_swvdec = swvdec_init(&m_swvdec_handle,
213e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                         m_swvdec_codec,
214e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                         &callback)) !=
215e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            SWVDEC_STATUS_SUCCESS)
216e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
217e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = retval_swvdec2omx(retval_swvdec);
218e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            goto component_init_exit;
219e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
220e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
221e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_swvdec_created = true;
222e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
223e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        // set frame dimensions for OMX component & SwVdec core
224e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((retval = set_frame_dimensions(DEFAULT_FRAME_WIDTH,
225e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                           DEFAULT_FRAME_HEIGHT)) !=
226e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_ErrorNone)
227e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
228e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            goto component_init_exit;
229e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
230e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
231e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        // set frame attributes for OMX component & SwVdec core
232e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((retval = set_frame_attributes(DEFAULT_ALIGNMENT_STRIDE,
233e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                           DEFAULT_ALIGNMENT_SCANLINES_Y,
234e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                           DEFAULT_ALIGNMENT_SCANLINES_UV,
235e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                           DEFAULT_ALIGNMENT_SIZE)) !=
236e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_ErrorNone)
237e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
238e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            goto component_init_exit;
239e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
240e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
241e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
242e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    // get SwVdec buffer requirements for input port; set m_port_ip
243e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if ((retval = get_buffer_requirements_swvdec(OMX_CORE_PORT_INDEX_IP)) !=
244e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_ErrorNone)
245e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
246e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto component_init_exit;
247e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
248e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
249e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    // get SwVdec buffer requirements for output port; set m_port_op
250e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if ((retval = get_buffer_requirements_swvdec(OMX_CORE_PORT_INDEX_OP)) !=
251e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_ErrorNone)
252e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
253e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto component_init_exit;
254e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
255e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
256e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    // create callback thread's mutex & condition variable
257e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if ((retval = async_thread_create()) != OMX_ErrorNone)
258e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
259e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto component_init_exit;
260e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
261e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
262e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    // create semaphore for command processing
263e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (sem_init(&m_sem_cmd, 0, 0))
264e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
265e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("failed to create command processing semaphore");
266e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInsufficientResources;
267e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto component_init_exit;
268e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
269e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
270e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    // create mutex for meta buffer info array
271e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (pthread_mutex_init(&m_meta_buffer_array_mutex, NULL))
272e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
273e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("failed to create meta buffer info array mutex");
274e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInsufficientResources;
275e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto component_init_exit;
276e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
277e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
278e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    // move to 'loaded' state
279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_LOG_HIGH("OMX_StateInvalid -> OMX_StateLoaded");
280e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_state = OMX_StateLoaded;
281e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
282e4010605f233a213cf0d972397bb33c34c364227Patrick Tjincomponent_init_exit:
283e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
284e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
285e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
286e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
287e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief De-initialize component.
288e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
289e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmp_handle: Component handle.
290e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
291e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
292e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
293e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::component_deinit(OMX_HANDLETYPE cmp_handle)
294e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
295e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_LOG_API("");
296e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
297e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (cmp_handle == NULL)
298e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
299e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL");
300e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
301e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
302e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    pthread_mutex_destroy(&m_meta_buffer_array_mutex);
303e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
304e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    sem_destroy(&m_sem_cmd);
305e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
306e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    async_thread_destroy();
307e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
308e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_swvdec_created)
309e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
310e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        swvdec_deinit(m_swvdec_handle);
311e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_swvdec_handle = NULL;
312e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
313e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
314e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_LOG_HIGH("all done, goodbye!");
315e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
316e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return OMX_ErrorNone;
317e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
318e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
319e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
320e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Get component version.
321e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
322e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in]     cmp_handle:     Component handle.
323e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in]     cmp_name:       Component name string.
324e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] p_cmp_version:  Pointer to component version variable.
325e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] p_spec_version: Pointer to OMX spec version variable.
326e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] p_cmp_UUID:     Pointer to component UUID variable.
327e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
328e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
329e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
330e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::get_component_version(OMX_HANDLETYPE   cmp_handle,
331e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                OMX_STRING       cmp_name,
332e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                OMX_VERSIONTYPE *p_cmp_version,
333e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                OMX_VERSIONTYPE *p_spec_version,
334e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                OMX_UUIDTYPE    *p_cmp_UUID)
335e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
336e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
337e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
338e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) p_cmp_UUID;
339e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
340e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_LOG_API("");
341e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
342e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_state == OMX_StateInvalid)
343e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
344e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("in invalid state");
345e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidState;
346e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
347e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (cmp_handle == NULL)
348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL");
350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidComponent;
351e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
352e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (strncmp(cmp_name, m_cmp_name, sizeof(m_cmp_name)))
353e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
354e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("'%s': invalid component name", cmp_name);
355e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidComponentName;
356e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
357e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (p_cmp_version == NULL)
358e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
359e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("p_cmp_version = NULL");
360e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
361e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
362e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (p_spec_version == NULL)
363e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
364e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("p_spec_version = NULL");
365e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
366e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
367e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
368e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
369e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_spec_version->nVersion = OMX_SPEC_VERSION;
370e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
371e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
372e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinget_component_version_exit:
373e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
374e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
375e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
376e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
377e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Send command to component.
378e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
379e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmp_handle: Component handle.
380e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmd:        Command.
381e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] param:      Command parameter.
382e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_cmd_data: Pointer to command data.
383e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
384e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
385e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
386e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::send_command(OMX_HANDLETYPE  cmp_handle,
387e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                       OMX_COMMANDTYPE cmd,
388e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                       OMX_U32         param,
389e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                       OMX_PTR         p_cmd_data)
390e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
391e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
392e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
393e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) p_cmd_data; // prevent warning for unused function argument
394e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
395e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_state == OMX_StateInvalid)
396e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
397e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("in invalid state");
398e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidState;
399e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto send_command_exit;
400e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
401e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (cmp_handle == NULL)
402e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
403e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL");
404e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidComponent;
405e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto send_command_exit;
406e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
407e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
408e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    switch (cmd)
409e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
410e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
411e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_CommandStateSet:
412e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
413e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("%s, %s",
414e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           OMX_COMMANDTYPE_STRING(cmd),
415e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           OMX_STATETYPE_STRING((OMX_STATETYPE) param));
416e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
417e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
418e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
419e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_CommandFlush:
420e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_CommandPortDisable:
421e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_CommandPortEnable:
422e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
423e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("%s, port index %d",
424e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           OMX_COMMANDTYPE_STRING(cmd),
425e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           param);
426e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
427e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((param != OMX_CORE_PORT_INDEX_IP) &&
428e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (param != OMX_CORE_PORT_INDEX_OP) &&
429e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (param != OMX_ALL))
430e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
431e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", param);
432e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorBadPortIndex;
433e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
434e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
435e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
436e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
437e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    default:
438e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
439e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("cmd %d, param %d", cmd, param);
440e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
441e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("cmd '%d' invalid", cmd);
442e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
443e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
444e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
445e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
446e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    } // switch (cmd)
447e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
448e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (retval == OMX_ErrorNone)
449e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
450e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (cmp_handle == NULL)
451e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
452e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL");
453e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorInvalidComponent;
454e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
455e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else if (m_state == OMX_StateInvalid)
456e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
457e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("in invalid state");
458e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorInvalidState;
459e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
460e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
461e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
462e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (retval != OMX_ErrorNone)
463e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
464e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        // command not processed; return error code via event handler callback
465e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        async_post_event(OMX_SWVDEC_EVENT_ERROR, retval, 0);
466e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
467e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
468e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
469e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        // post command event
470e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        async_post_event(OMX_SWVDEC_EVENT_CMD, cmd, param);
471e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
472e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        // wait on command semaphore
473e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        sem_wait(&m_sem_cmd);
474e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
475e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
476e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinsend_command_exit:
477e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
478e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
479e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
480e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
481e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Get a parameter from component.
482e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
483e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in]     cmp_handle:   Component handle.
484e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in]     param_index:  Parameter index.
485e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] p_param_data: Pointer to parameter data.
486e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
487e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
488e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
489e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::get_parameter(OMX_HANDLETYPE cmp_handle,
490e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        OMX_INDEXTYPE  param_index,
491e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        OMX_PTR        p_param_data)
492e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
493e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
494e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
495e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_state == OMX_StateInvalid)
496e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
497e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("in invalid state");
498e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidState;
499e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
500e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (cmp_handle == NULL)
501e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
502e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL");
503e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidComponent;
504e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
505e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (p_param_data == NULL)
506e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
507e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("p_param_data = NULL");
508e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
509e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
510e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
511e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (retval != OMX_ErrorNone)
512e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
513e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto get_parameter_exit;
514e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
515e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
516e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    switch (param_index)
517e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
518e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
519e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_IndexParamAudioInit:
520e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
521e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_PORT_PARAM_TYPE *p_port_param =
522e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (OMX_PORT_PARAM_TYPE *) p_param_data;
523e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
524e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_port_param->nPorts           = 0;
525e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_port_param->nStartPortNumber = 0;
526e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
527e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("OMX_IndexParamAudioInit: "
528e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           "%d port(s), start port %d",
529e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           p_port_param->nPorts,
530e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           p_port_param->nStartPortNumber);
531e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
532e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
533e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
534e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_IndexParamImageInit:
535e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
536e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_PORT_PARAM_TYPE *p_port_param =
537e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (OMX_PORT_PARAM_TYPE *) p_param_data;
538e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
539e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_port_param->nPorts           = 0;
540e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_port_param->nStartPortNumber = 0;
541e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
542e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("OMX_IndexParamImageInit: "
543e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           "%d port(s), start port %d",
544e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           p_port_param->nPorts,
545e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           p_port_param->nStartPortNumber);
546e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
547e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
548e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
549e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_IndexParamVideoInit:
550e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
551e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_PORT_PARAM_TYPE *p_port_param =
552e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (OMX_PORT_PARAM_TYPE *) p_param_data;
553e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
554e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_port_param->nPorts           = 2;
555e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_port_param->nStartPortNumber = 0;
556e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
557e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("OMX_IndexParamVideoInit: "
558e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           "%d port(s), start port %d",
559e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           p_port_param->nPorts,
560e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           p_port_param->nStartPortNumber);
561e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
562e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
563e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
564e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_IndexParamOtherInit:
565e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
566e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_PORT_PARAM_TYPE *p_port_param =
567e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (OMX_PORT_PARAM_TYPE *) p_param_data;
568e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
569e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_port_param->nPorts           = 0;
570e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_port_param->nStartPortNumber = 0;
571e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
572e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("OMX_IndexParamOtherInit: "
573e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           "%d port(s), start port %d",
574e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           p_port_param->nPorts,
575e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           p_port_param->nStartPortNumber);
576e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
577e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
578e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
579e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_IndexConfigPriorityMgmt:
580e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
581e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_PRIORITYMGMTTYPE *p_prio_mgmt =
582e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (OMX_PRIORITYMGMTTYPE *) p_param_data;
583e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
584e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("OMX_IndexConfigPriorityMgmt");
585e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
586e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        memcpy(p_prio_mgmt, &m_prio_mgmt, sizeof(OMX_PRIORITYMGMTTYPE));
587e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
588e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
589e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
590e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_IndexParamStandardComponentRole:
591e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
592e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_PARAM_COMPONENTROLETYPE *p_cmp_role =
593e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (OMX_PARAM_COMPONENTROLETYPE *) p_param_data;
594e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
595e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        strlcpy((char *) p_cmp_role->cRole,
596e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_role_name,
597e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_MAX_STRINGNAME_SIZE);
598e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
599e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("OMX_IndexParamStandardComponentRole: %s",
600e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           p_cmp_role->cRole);
601e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
602e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
603e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
604e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_IndexParamPortDefinition:
605e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
606e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_PARAM_PORTDEFINITIONTYPE *p_port_def =
607e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (OMX_PARAM_PORTDEFINITIONTYPE *) p_param_data;
608e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
609e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("OMX_IndexParamPortDefinition, port index %d",
610e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           p_port_def->nPortIndex);
611e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
612e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = get_port_definition(p_port_def);
613e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
614e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
615e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
616e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_IndexParamCompBufferSupplier:
617e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
618e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_PARAM_BUFFERSUPPLIERTYPE *p_buffer_supplier =
619e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (OMX_PARAM_BUFFERSUPPLIERTYPE *) p_param_data;
620e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
621e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("OMX_IndexParamCompBufferSupplier, port index %d",
622e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           p_buffer_supplier->nPortIndex);
623e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
624e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((p_buffer_supplier->nPortIndex == OMX_CORE_PORT_INDEX_IP) ||
625e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (p_buffer_supplier->nPortIndex == OMX_CORE_PORT_INDEX_OP))
626e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
627e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_supplier->eBufferSupplier = OMX_BufferSupplyUnspecified;
628e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
629e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
630e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
631e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("port index '%d' invalid",
632e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 p_buffer_supplier->nPortIndex);
633e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorBadPortIndex;
634e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
635e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
636e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
637e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
638e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
639e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_IndexParamVideoPortFormat:
640e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
641e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_VIDEO_PARAM_PORTFORMATTYPE *p_port_format =
642e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (OMX_VIDEO_PARAM_PORTFORMATTYPE *) p_param_data;
643e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
644e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("OMX_IndexParamVideoPortFormat, "
645e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           "port index %d, index %d",
646e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           p_port_format->nPortIndex,
647e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           p_port_format->nIndex);
648e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
649e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = get_video_port_format(p_port_format);
650e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
651e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
652e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
653e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_IndexParamVideoMpeg2:
654e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
655e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("OMX_IndexParamVideoMpeg2: unsupported");
656e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorUnsupportedIndex;
657e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
658e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
659e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
660e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_IndexParamVideoMpeg4:
661e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
662e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("OMX_IndexParamVideoMpeg4: unsupported");
663e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorUnsupportedIndex;
664e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
665e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
666e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
667e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_IndexParamVideoAvc:
668e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
669e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("OMX_IndexParamVideoAvc: unsupported");
670e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorUnsupportedIndex;
671e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
672e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
673e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
674e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_IndexParamVideoH263:
675e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
676e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("OMX_IndexParamVideoH263: unsupported");
677e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorUnsupportedIndex;
678e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
679e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
680e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
681e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_IndexParamVideoProfileLevelQuerySupported:
682e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
683e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_VIDEO_PARAM_PROFILELEVELTYPE *p_profilelevel =
684e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (OMX_VIDEO_PARAM_PROFILELEVELTYPE *) p_param_data;
685e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
686e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("OMX_IndexParamVideoProfileLevelQuerySupported, "
687e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           "port index %d, profile index %d",
688e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           p_profilelevel->nPortIndex,
689e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           p_profilelevel->nProfileIndex);
690e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
691e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = get_supported_profilelevel(p_profilelevel);
692e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
693e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
694e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
695e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    default:
696e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
697e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        /**
698e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         * Vendor-specific extension indices checked here since they are not
699e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         * part of the OMX_INDEXTYPE enumerated type.
700e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         */
701e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
702e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        switch ((OMX_QCOM_EXTN_INDEXTYPE) param_index)
703e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
704e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
705e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage:
706e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
707e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            GetAndroidNativeBufferUsageParams *p_buffer_usage =
708e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                (GetAndroidNativeBufferUsageParams *) p_param_data;
709e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
710e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_API(
711e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                "OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage, "
712e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                "port index %d", p_buffer_usage->nPortIndex);
713e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
714e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (p_buffer_usage->nPortIndex == OMX_CORE_PORT_INDEX_OP)
715e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
716e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                p_buffer_usage->nUsage = (GRALLOC_USAGE_PRIVATE_IOMMU_HEAP |
717e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          GRALLOC_USAGE_SW_READ_OFTEN |
718e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          GRALLOC_USAGE_SW_WRITE_OFTEN);
719e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
720e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            else
721e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
722e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_SWVDEC_LOG_ERROR("port index '%d' invalid",
723e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     p_buffer_usage->nPortIndex);
724e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                retval = OMX_ErrorBadPortIndex;
725e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
726e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
727e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
728e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
729e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_QcomIndexFlexibleYUVDescription:
730e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
731e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_API("OMX_QcomIndexFlexibleYUVDescription");
732e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
733e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = describe_color_format((DescribeColorFormatParams *)
734e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                           p_param_data);
735e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
736e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
737e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
738e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        default:
739e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
740e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("param index '0x%08x' invalid");
741e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorBadParameter;
742e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
743e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
744e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
745e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        } // switch ((OMX_QCOM_EXTN_INDEXTYPE) param_index)
746e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
747e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    } // default case
748e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
749e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    } // switch (param_index)
750e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
751e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinget_parameter_exit:
752e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
753e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
754e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
755e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
756e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Set a parameter to component.
757e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
758e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmp_handle:   Component handle.
759e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] param_index:  Parameter index.
760e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_param_data: Pointer to parameter data.
761e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
762e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
763e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
764e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::set_parameter(OMX_HANDLETYPE cmp_handle,
765e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        OMX_INDEXTYPE  param_index,
766e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        OMX_PTR        p_param_data)
767e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
768e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
769e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
770e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_state == OMX_StateInvalid)
771e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
772e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("in invalid state");
773e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidState;
774e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
775e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (cmp_handle == NULL)
776e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
777e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL");
778e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidComponent;
779e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
780e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (p_param_data == NULL)
781e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
782e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("p_param_data = NULL");
783e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
784e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
785e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if ((m_state != OMX_StateLoaded) &&
786e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin             (m_port_reconfig_inprogress == false))
787e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
788e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("disallowed in state %s",
789e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             OMX_STATETYPE_STRING(m_state));
790e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorIncorrectStateOperation;
791e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
792e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
793e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (retval != OMX_ErrorNone)
794e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
795e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto set_parameter_exit;
796e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
797e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
798e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    switch (param_index)
799e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
800e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
801e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_IndexParamPriorityMgmt:
802e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
803e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_PRIORITYMGMTTYPE *p_prio_mgmt =
804e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (OMX_PRIORITYMGMTTYPE *) p_param_data;
805e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
806e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("OMX_IndexConfigPriorityMgmt: "
807e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           "group ID %d, group priority %d",
808e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           p_prio_mgmt->nGroupID,
809e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           p_prio_mgmt->nGroupPriority);
810e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
811e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_state != OMX_StateLoaded)
812e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
813e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("'%d' state invalid; "
814e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 "should be in loaded state",
815e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 m_state);
816e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorIncorrectStateOperation;
817e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
818e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
819e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
820e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            memcpy(&m_prio_mgmt, p_prio_mgmt, sizeof(OMX_PRIORITYMGMTTYPE));
821e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
822e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
823e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
824e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
825e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
826e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_IndexParamStandardComponentRole:
827e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
828e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_PARAM_COMPONENTROLETYPE *p_cmp_role =
829e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (OMX_PARAM_COMPONENTROLETYPE *) p_param_data;
830e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
831e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("OMX_IndexParamStandardComponentRole '%s'",
832e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           p_cmp_role->cRole);
833e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
834e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_state != OMX_StateLoaded)
835e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
836e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("'%d' state invalid; "
837e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 "should be in loaded state",
838e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 m_state);
839e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorIncorrectStateOperation;
840e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
841e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
842e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
843e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (strncmp((char *) p_cmp_role->cRole,
844e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        m_role_name,
845e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        OMX_MAX_STRINGNAME_SIZE))
846e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
847e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_SWVDEC_LOG_ERROR("'%s': invalid component role name",
848e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     p_cmp_role->cRole);
849e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                retval = OMX_ErrorBadParameter;
850e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
851e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
852e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
853e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
854e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
855e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
856e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_IndexParamPortDefinition:
857e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
858e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_PARAM_PORTDEFINITIONTYPE *p_port_def =
859e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (OMX_PARAM_PORTDEFINITIONTYPE *) p_param_data;
860e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
861e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("OMX_IndexParamPortDefinition, port index %d",
862e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           p_port_def->nPortIndex);
863e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
864e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((m_state != OMX_StateLoaded) &&
865e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (((p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_IP) &&
866e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin              (m_port_ip.enabled      == OMX_TRUE) &&
867e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin              (m_port_ip.populated    == OMX_TRUE)) ||
868e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin             ((p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_OP) &&
869e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin              (m_port_op.enabled      == OMX_TRUE) &&
870e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin              (m_port_op.populated    == OMX_TRUE))))
871e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
872e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("OMX_IndexParamPortDefinition "
873e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 "disallowed in state %s "
874e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 "while port %d is enabled & populated",
875e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 OMX_STATETYPE_STRING(m_state),
876e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 p_port_def->nPortIndex);
877e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
878e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorIncorrectStateOperation;
879e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
880e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
881e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
882e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = set_port_definition(p_port_def);
883e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
884e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
885e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
886e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
887e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
888e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_IndexParamCompBufferSupplier:
889e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
890e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_PARAM_BUFFERSUPPLIERTYPE *p_buffer_supplier =
891e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (OMX_PARAM_BUFFERSUPPLIERTYPE *) p_param_data;
892e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
893e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("OMX_IndexParamCompBufferSupplier: "
894e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           "port index %d, buffer supplier %d",
895e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           p_buffer_supplier->nPortIndex,
896e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           (int) p_buffer_supplier->eBufferSupplier);
897e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
898e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((p_buffer_supplier->nPortIndex != OMX_CORE_PORT_INDEX_IP) &&
899e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (p_buffer_supplier->nPortIndex != OMX_CORE_PORT_INDEX_OP))
900e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
901e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("port index '%d' invalid",
902e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 p_buffer_supplier->nPortIndex);
903e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorBadPortIndex;
904e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
905e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
906e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
907e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
908e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
909e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_IndexParamVideoPortFormat:
910e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
911e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_VIDEO_PARAM_PORTFORMATTYPE *p_port_format =
912e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (OMX_VIDEO_PARAM_PORTFORMATTYPE *) p_param_data;
913e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
914e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("OMX_IndexParamVideoPortFormat, port index %d",
915e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           p_port_format->nPortIndex);
916e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
917e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((m_state != OMX_StateLoaded) &&
918e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (((p_port_format->nPortIndex == OMX_CORE_PORT_INDEX_IP) &&
919e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin              (m_port_ip.enabled         == OMX_TRUE) &&
920e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin              (m_port_ip.populated       == OMX_TRUE)) ||
921e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin             ((p_port_format->nPortIndex == OMX_CORE_PORT_INDEX_OP) &&
922e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin              (m_port_op.enabled         == OMX_TRUE) &&
923e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin              (m_port_op.populated       == OMX_TRUE))))
924e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
925e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("OMX_IndexParamVideoPortFormat "
926e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 "disallowed in state %s "
927e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 "while port %d is enabled & populated",
928e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 OMX_STATETYPE_STRING(m_state),
929e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 p_port_format->nPortIndex);
930e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
931e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorIncorrectStateOperation;
932e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
933e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
934e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
935e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = set_video_port_format(p_port_format);
936e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
937e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
938e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
939e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
940e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
941e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_IndexParamVideoMpeg2:
942e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
943e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("OMX_IndexParamVideoMpeg2 unsupported");
944e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorUnsupportedIndex;
945e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
946e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
947e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
948e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_IndexParamVideoMpeg4:
949e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
950e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("OMX_IndexParamVideoMpeg4 unsupported");
951e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorUnsupportedIndex;
952e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
953e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
954e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
955e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_IndexParamVideoAvc:
956e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
957e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("OMX_IndexParamVideoAvc unsupported");
958e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorUnsupportedIndex;
959e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
960e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
961e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
962e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_IndexParamVideoH263:
963e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
964e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("OMX_IndexParamVideoH263 unsupported");
965e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorUnsupportedIndex;
966e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
967e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
968e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
969e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    default:
970e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
971e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        /**
972e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         * Vendor-specific extension indices checked here since they are not
973e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         * part of the OMX_INDEXTYPE enumerated type.
974e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         */
975e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
976e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        switch ((OMX_QCOM_EXTN_INDEXTYPE) param_index)
977e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
978e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
979e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_QcomIndexPortDefn:
980e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
981e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_QCOM_PARAM_PORTDEFINITIONTYPE *p_port_def =
982e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                (OMX_QCOM_PARAM_PORTDEFINITIONTYPE *) p_param_data;
983e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
984e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_API("OMX_QcomIndexPortDefn, port index %d",
985e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               p_port_def->nPortIndex);
986e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
987e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if ((m_state != OMX_StateLoaded) &&
988e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                (((p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_IP) &&
989e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                  (m_port_ip.enabled      == OMX_TRUE) &&
990e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                  (m_port_ip.populated    == OMX_TRUE)) ||
991e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                 ((p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_OP) &&
992e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                  (m_port_op.enabled      == OMX_TRUE) &&
993e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                  (m_port_op.populated    == OMX_TRUE))))
994e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
995e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_SWVDEC_LOG_ERROR("OMX_QcomIndexPortDefn "
996e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     "disallowed in state %s "
997e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     "while port %d is enabled & populated",
998e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     OMX_STATETYPE_STRING(m_state),
999e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     p_port_def->nPortIndex);
1000e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1001e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                retval = OMX_ErrorIncorrectStateOperation;
1002e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
1003e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            else
1004e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
1005e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                retval = set_port_definition_qcom(p_port_def);
1006e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
1007e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1008e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
1009e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1010e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1011e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_QcomIndexParamVideoDivx:
1012e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
1013e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_API("OMX_QcomIndexParamVideoDivx");
1014e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("OMX_QcomIndexParamVideoDivx unsupported");
1015e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorUnsupportedIndex;
1016e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
1017e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1018e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1019e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_QcomIndexParamVideoSyncFrameDecodingMode:
1020e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
1021e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_API("OMX_QcomIndexParamVideoSyncFrameDecodingMode");
1022e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_sync_frame_decoding_mode = true;
1023e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
1024e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1025e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1026e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_QcomIndexParamVideoDecoderPictureOrder:
1027e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
1028e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            QOMX_VIDEO_DECODER_PICTURE_ORDER *p_picture_order =
1029e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                (QOMX_VIDEO_DECODER_PICTURE_ORDER *) p_param_data;
1030e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1031e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            switch (p_picture_order->eOutputPictureOrder)
1032e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
1033e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1034e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            case QOMX_VIDEO_DISPLAY_ORDER:
1035e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
1036e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_SWVDEC_LOG_API(
1037e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    "OMX_QcomIndexParamVideoDecoderPictureOrder, "
1038e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    "QOMX_VIDEO_DISPLAY_ORDER");
1039e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                break;
1040e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
1041e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1042e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            case QOMX_VIDEO_DECODE_ORDER:
1043e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
1044e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_SWVDEC_LOG_ERROR(
1045e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    "OMX_QcomIndexParamVideoDecoderPictureOrder, "
1046e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    "QOMX_VIDEO_DECODE_ORDER; unsupported");
1047e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1048e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                retval = OMX_ErrorUnsupportedSetting;
1049e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                break;
1050e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
1051e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1052e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            default:
1053e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
1054e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_SWVDEC_LOG_ERROR(
1055e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    "OMX_QcomIndexParamVideoDecoderPictureOrder, %d; invalid");
1056e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1057e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                retval = OMX_ErrorBadParameter;
1058e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                break;
1059e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
1060e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1061e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
1062e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
1063e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1064e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1065e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_GoogleAndroidIndexEnableAndroidNativeBuffers:
1066e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
1067e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_API(
1068e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                "OMX_GoogleAndroidIndexEnableAndroidNativeBuffers, %s",
1069e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                (((EnableAndroidNativeBuffersParams *) p_param_data)->enable ?
1070e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                 "enable" :
1071e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                 "disable"));
1072e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1073e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_android_native_buffers =
1074e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                (bool) (((EnableAndroidNativeBuffersParams *)
1075e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         p_param_data)->enable);
1076e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1077e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
1078e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1079e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1080e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_GoogleAndroidIndexUseAndroidNativeBuffer:
1081e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
1082e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("OMX_GoogleAndroidIndexUseAndroidNativeBuffer "
1083e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 "unsupported");
1084e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1085e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorUnsupportedIndex;
1086e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
1087e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1088e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1089e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_QcomIndexParamEnableTimeStampReorder:
1090e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
1091e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_API(
1092e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                "OMX_QcomIndexParamEnableTimeStampReorder, %s",
1093e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                (((QOMX_INDEXTIMESTAMPREORDER *) p_param_data)->bEnable ?
1094e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                 "enable" :
1095e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                 "disable"));
1096e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1097e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
1098e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1099e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1100e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_QcomIndexParamVideoMetaBufferMode:
1101e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
1102e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            StoreMetaDataInBuffersParams *p_meta_data =
1103e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                (StoreMetaDataInBuffersParams *) p_param_data;
1104e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1105e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_API("OMX_QcomIndexParamVideoMetaBufferMode, "
1106e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               "port index %d, %s",
1107e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               p_meta_data->nPortIndex,
1108e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               (p_meta_data->bStoreMetaData ?
1109e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                "enabled" :
1110e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                "disabled"));
1111e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1112e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (p_meta_data->nPortIndex == OMX_CORE_PORT_INDEX_OP)
1113e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
1114e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_meta_buffer_mode = (bool) p_meta_data->bStoreMetaData;
1115e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
1116e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            else
1117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
1118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_SWVDEC_LOG_ERROR("port index '%d' invalid",
1119e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     p_meta_data->nPortIndex);
1120e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                retval = OMX_ErrorBadPortIndex;
1121e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
1122e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1123e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
1124e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1125e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1126e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        default:
1127e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
1128e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("param index '0x%08x' invalid");
1129e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorBadParameter;
1130e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
1131e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1132e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1133e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        } // switch ((OMX_QCOM_EXTN_INDEXTYPE) param_index)
1134e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1135e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
1136e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    } // default case
1137e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1138e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    } // switch (param_index)
1139e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1140e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinset_parameter_exit:
1141e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
1142e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
1143e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1144e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
1145e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Get a configuration from component.
1146e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
1147e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmp_handle:    Component handle.
1148e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] config_index:  Configuration index.
1149e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_config_data: Pointer to configuration data.
1150e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
1151e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
1152e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
1153e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::get_config(OMX_HANDLETYPE cmp_handle,
1154e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     OMX_INDEXTYPE  config_index,
1155e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     OMX_PTR        p_config_data)
1156e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
1157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
1158e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1159e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_state == OMX_StateInvalid)
1160e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1161e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("in invalid state");
1162e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidState;
1163e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto get_config_exit;
1164e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1165e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (cmp_handle == NULL)
1166e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1167e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL");
1168e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidComponent;
1169e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto get_config_exit;
1170e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1171e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (p_config_data == NULL)
1172e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1173e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("p_config_data = NULL");
1174e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
1175e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto get_config_exit;
1176e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1177e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1178e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    switch (config_index)
1179e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1180e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1181e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_IndexConfigCommonOutputCrop:
1182e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1183e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_CONFIG_RECTTYPE *p_recttype = (OMX_CONFIG_RECTTYPE *) p_config_data;
1184e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1185e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("OMX_IndexConfigCommonOutputCrop, port index %d",
1186e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           p_recttype->nPortIndex);
1187e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1188e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (p_recttype->nPortIndex == OMX_CORE_PORT_INDEX_OP)
1189e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
1190e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_recttype->nLeft   = 0;
1191e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_recttype->nTop    = 0;
1192e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_recttype->nWidth  = m_frame_dimensions.width;
1193e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_recttype->nHeight = m_frame_dimensions.height;
1194e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1195e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
1196e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
1197e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("port index '%d' invalid",
1198e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 p_recttype->nPortIndex);
1199e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorBadPortIndex;
1200e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1201e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1202e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
1203e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1204e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1205e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    default:
1206e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1207e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        switch ((OMX_QCOM_EXTN_INDEXTYPE) config_index)
1208e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
1209e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1210e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_QcomIndexConfigInterlaced:
1211e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
1212e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_QCOM_CONFIG_INTERLACETYPE *p_config_interlacetype =
1213e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                (OMX_QCOM_CONFIG_INTERLACETYPE *) p_config_data;
1214e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1215e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_API("OMX_QcomIndexConfigInterlaced, "
1216e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               "port index %d, index %d",
1217e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               p_config_interlacetype->nPortIndex,
1218e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               p_config_interlacetype->nIndex);
1219e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1220e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (p_config_interlacetype->nPortIndex == OMX_CORE_PORT_INDEX_OP)
1221e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
1222e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                if (p_config_interlacetype->nIndex == 0)
1223e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                {
1224e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    p_config_interlacetype->eInterlaceType =
1225e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        OMX_QCOM_InterlaceFrameProgressive;
1226e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                }
1227e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                else if (p_config_interlacetype->nIndex == 1)
1228e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                {
1229e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    p_config_interlacetype->eInterlaceType =
1230e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        OMX_QCOM_InterlaceInterleaveFrameTopFieldFirst;
1231e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                }
1232e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                else if (p_config_interlacetype->nIndex == 2)
1233e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                {
1234e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    p_config_interlacetype->eInterlaceType =
1235e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        OMX_QCOM_InterlaceInterleaveFrameBottomFieldFirst;
1236e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                }
1237e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                else
1238e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                {
1239e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    OMX_SWVDEC_LOG_ERROR("index '%d' unsupported; "
1240e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                         "no more interlaced types",
1241e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                         p_config_interlacetype->nIndex);
1242e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    retval = OMX_ErrorNoMore;
1243e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                }
1244e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
1245e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            else
1246e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
1247e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_SWVDEC_LOG_ERROR("port index '%d' invalid",
1248e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     p_config_interlacetype->nPortIndex);
1249e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                retval = OMX_ErrorBadPortIndex;
1250e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
1251e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1252e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
1253e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1254e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1255e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_QcomIndexQueryNumberOfVideoDecInstance:
1256e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
1257e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            QOMX_VIDEO_QUERY_DECODER_INSTANCES *p_decoder_instances =
1258e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                (QOMX_VIDEO_QUERY_DECODER_INSTANCES *) p_config_data;
1259e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1260e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_API("OMX_QcomIndexQueryNumberOfVideoDecInstance");
1261e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1262e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_decoder_instances->nNumOfInstances = OMX_SWVDEC_NUM_INSTANCES;
1263e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
1264e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1265e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1266e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_QcomIndexConfigVideoFramePackingArrangement:
1267e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
1268e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_API(
1269e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                "OMX_QcomIndexConfigVideoFramePackingArrangement");
1270e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1271e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR(
1272e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                "OMX_QcomIndexConfigVideoFramePackingArrangement unsupported");
1273e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1274e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorUnsupportedIndex;
1275e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
1276e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1277e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1278e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        default:
1279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
1280e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("config index '%d' invalid", config_index);
1281e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorBadParameter;
1282e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
1283e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1284e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1285e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        } // switch ((OMX_QCOM_EXTN_INDEXTYPE) config_index)
1286e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1287e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
1288e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1289e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1290e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    } // switch (config_index)
1291e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1292e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinget_config_exit:
1293e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
1294e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
1295e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1296e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
1297e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Set a configuration to component.
1298e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
1299e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
1300e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
1301e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::set_config(OMX_HANDLETYPE cmp_handle,
1302e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     OMX_INDEXTYPE  config_index,
1303e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     OMX_PTR        p_config_data)
1304e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
1305e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) cmp_handle;
1306e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) config_index;
1307e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) p_config_data;
1308e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1309e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_LOG_ERROR("not implemented");
1310e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1311e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return OMX_ErrorNotImplemented;
1312e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
1313e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1314e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
1315e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Translate a vendor-specific extension string to a standard index type.
1316e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
1317e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in]     cmp_handle:   Component handle.
1318e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in]     param_name:   Parameter name (extension string).
1319e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] p_index_type: Pointer to extension string's index type.
1320e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
1321e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
1322e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
1323e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::get_extension_index(OMX_HANDLETYPE cmp_handle,
1324e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                              OMX_STRING     param_name,
1325e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                              OMX_INDEXTYPE *p_index_type)
1326e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
1327e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
1328e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1329e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_state == OMX_StateInvalid)
1330e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1331e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("in invalid state");
1332e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidState;
1333e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1334e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (cmp_handle == NULL)
1335e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1336e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL");
1337e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidComponent;
1338e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1339e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (p_index_type == NULL)
1340e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1341e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("p_index_type = NULL");
1342e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
1343e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1344e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1345e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (retval != OMX_ErrorNone)
1346e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto get_extension_index_exit;
1347e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_LOG_API("'%s'", param_name);
1349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (!strncmp(param_name,
1351e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                 "OMX.QCOM.index.param.video.SyncFrameDecodingMode",
1352e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                 OMX_MAX_STRINGNAME_SIZE))
1353e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1354e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        *p_index_type =
1355e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (OMX_INDEXTYPE) OMX_QcomIndexParamVideoSyncFrameDecodingMode;
1356e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1357e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (!strncmp(param_name,
1358e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                      "OMX.QCOM.index.param.IndexExtraData",
1359e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                      OMX_MAX_STRINGNAME_SIZE))
1360e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1361e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        *p_index_type = (OMX_INDEXTYPE) OMX_QcomIndexParamIndexExtraDataType;
1362e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1363e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (!strncmp(param_name,
1364e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                      "OMX.google.android.index.enableAndroidNativeBuffers",
1365e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                      OMX_MAX_STRINGNAME_SIZE))
1366e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1367e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        *p_index_type =
1368e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (OMX_INDEXTYPE) OMX_GoogleAndroidIndexEnableAndroidNativeBuffers;
1369e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1370e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (!strncmp(param_name,
1371e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                      "OMX.google.android.index.useAndroidNativeBuffer2",
1372e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                      OMX_MAX_STRINGNAME_SIZE))
1373e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1374e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        *p_index_type =
1375e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (OMX_INDEXTYPE) OMX_GoogleAndroidIndexUseAndroidNativeBuffer2;
1376e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1377e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (!strncmp(param_name,
1378e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                      "OMX.google.android.index.useAndroidNativeBuffer",
1379e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                      OMX_MAX_STRINGNAME_SIZE))
1380e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1381e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        *p_index_type =
1382e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (OMX_INDEXTYPE) OMX_GoogleAndroidIndexUseAndroidNativeBuffer;
1383e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1384e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (!strncmp(param_name,
1385e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                      "OMX.google.android.index.getAndroidNativeBufferUsage",
1386e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                      OMX_MAX_STRINGNAME_SIZE))
1387e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1388e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        *p_index_type =
1389e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (OMX_INDEXTYPE) OMX_GoogleAndroidIndexGetAndroidNativeBufferUsage;
1390e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1391e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (!strncmp(param_name,
1392e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                      "OMX.google.android.index.storeMetaDataInBuffers",
1393e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                      OMX_MAX_STRINGNAME_SIZE))
1394e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1395e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        *p_index_type = (OMX_INDEXTYPE) OMX_QcomIndexParamVideoMetaBufferMode;
1396e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1397e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (!strncmp(param_name,
1398e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                      "OMX.google.android.index.describeColorFormat",
1399e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                      OMX_MAX_STRINGNAME_SIZE))
1400e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1401e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        *p_index_type = (OMX_INDEXTYPE) OMX_QcomIndexFlexibleYUVDescription;
1402e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1403e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
1404e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1405e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("'%s': not implemented", param_name);
1406e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorNotImplemented;
1407e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1408e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1409e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinget_extension_index_exit:
1410e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
1411e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
1412e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1413e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
1414e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Get component state.
1415e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
1416e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in]     cmp_handle: Component handle.
1417e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] p_state:    Pointer to state variable.
1418e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
1419e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
1420e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
1421e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::get_state(OMX_HANDLETYPE cmp_handle,
1422e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                    OMX_STATETYPE *p_state)
1423e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
1424e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
1425e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1426e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (cmp_handle == NULL)
1427e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1428e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL");
1429e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidComponent;
1430e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1431e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
1432e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1433e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("%s", OMX_STATETYPE_STRING(m_state));
1434e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        *p_state = m_state;
1435e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1436e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1437e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
1438e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
1439e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1440e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
1441e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Component tunnel request.
1442e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
1443e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ErrorNotImplemented
1444e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
1445e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::component_tunnel_request(
1446e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_HANDLETYPE       cmp_handle,
1447e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_U32              port,
1448e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_HANDLETYPE       peer_component,
1449e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_U32              peer_port,
1450e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_TUNNELSETUPTYPE *p_tunnel_setup)
1451e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
1452e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) cmp_handle;
1453e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) port;
1454e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) peer_component;
1455e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) peer_port;
1456e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) p_tunnel_setup;
1457e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1458e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_LOG_API("");
1459e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1460e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_LOG_ERROR("not implemented");
1461e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1462e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return OMX_ErrorNotImplemented;
1463e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
1464e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1465e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
1466e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Use buffer.
1467e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
1468e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in]     cmp_handle:    Component handle.
1469e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] pp_buffer_hdr: Pointer to pointer to buffer header type
1470e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *                               structure.
1471e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in]     port:          Port index.
1472e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in]     p_app_data:    Pointer to IL client app data.
1473e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in]     bytes:         Size of buffer to be allocated in bytes.
1474e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in]     p_buffer:      Pointer to buffer to be used.
1475e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
1476e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
1477e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
1478e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::use_buffer(OMX_HANDLETYPE         cmp_handle,
1479e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     OMX_BUFFERHEADERTYPE **pp_buffer_hdr,
1480e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     OMX_U32                port,
1481e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     OMX_PTR                p_app_data,
1482e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     OMX_U32                bytes,
1483e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     OMX_U8                *p_buffer)
1484e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
1485e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
1486e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1487e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_state == OMX_StateInvalid)
1488e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1489e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("in invalid state");
1490e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidState;
1491e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1492e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (cmp_handle == NULL)
1493e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1494e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL");
1495e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidComponent;
1496e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1497e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (pp_buffer_hdr == NULL)
1498e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1499e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("pp_buffer_hdr = NULL");
1500e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
1501e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1502e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
1503e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1504e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("port index %d, %p", port, p_buffer);
1505e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1506e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (port == OMX_CORE_PORT_INDEX_OP)
1507e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
1508e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = buffer_use_op(pp_buffer_hdr, p_app_data, bytes, p_buffer);
1509e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1510e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (retval == OMX_ErrorNone)
1511e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
1512e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                SWVDEC_STATUS retval_swvdec;
1513e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1514e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                if ((m_status_flags & (1 << PENDING_STATE_LOADED_TO_IDLE)) &&
1515e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    (m_port_ip.populated == OMX_TRUE) &&
1516e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    (m_port_op.populated == OMX_TRUE))
1517e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                {
1518e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    // start SwVdec
1519e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    if ((retval_swvdec = swvdec_start(m_swvdec_handle)) !=
1520e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        SWVDEC_STATUS_SUCCESS)
1521e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    {
1522e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        OMX_SWVDEC_LOG_ERROR("failed to start SwVdec");
1523e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        retval = retval_swvdec2omx(retval_swvdec);
1524e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        goto use_buffer_exit;
1525e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    }
1526e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1527e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    m_status_flags &= ~(1 << PENDING_STATE_LOADED_TO_IDLE);
1528e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1529e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    async_post_event(OMX_SWVDEC_EVENT_CMD_ACK,
1530e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     OMX_CommandStateSet,
1531e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     OMX_StateIdle);
1532e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                }
1533e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1534e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                if ((m_status_flags & (1 << PENDING_PORT_ENABLE_OP)) &&
1535e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    (m_port_op.populated == OMX_TRUE))
1536e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                {
1537e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    if (m_port_reconfig_inprogress)
1538e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    {
1539e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        // start SwVdec
1540e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        if ((retval_swvdec = swvdec_start(m_swvdec_handle)) !=
1541e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            SWVDEC_STATUS_SUCCESS)
1542e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        {
1543e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            OMX_SWVDEC_LOG_ERROR("failed to start SwVdec");
1544e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            retval = retval_swvdec2omx(retval_swvdec);
1545e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        }
1546e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    }
1547e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1548e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    m_status_flags &= ~(1 << PENDING_PORT_ENABLE_OP);
1549e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1550e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    async_post_event(OMX_SWVDEC_EVENT_CMD_ACK,
1551e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     OMX_CommandPortEnable,
1552e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     OMX_CORE_PORT_INDEX_OP);
1553e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                }
1554e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
1555e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1556e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
1557e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
1558e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", port);
1559e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorBadPortIndex;
1560e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1561e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1562e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1563e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinuse_buffer_exit:
1564e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
1565e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
1566e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1567e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
1568e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Allocate new buffer & associated header.
1569e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
1570e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in]     cmp_handle:    Component handle.
1571e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] pp_buffer_hdr: Pointer to pointer to buffer header type
1572e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *                               structure.
1573e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in]     port:          Port index.
1574e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in]     p_app_data:    Pointer to IL client app data.
1575e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in]     bytes:         Size of buffer to be allocated in bytes.
1576e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
1577e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
1578e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
1579e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::allocate_buffer(OMX_HANDLETYPE         cmp_handle,
1580e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          OMX_BUFFERHEADERTYPE **pp_buffer_hdr,
1581e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          OMX_U32                port,
1582e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          OMX_PTR                p_app_data,
1583e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          OMX_U32                bytes)
1584e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
1585e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
1586e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1587e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_state == OMX_StateInvalid)
1588e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1589e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("in invalid state");
1590e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidState;
1591e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1592e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (cmp_handle == NULL)
1593e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1594e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL");
1595e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidComponent;
1596e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1597e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (pp_buffer_hdr == NULL)
1598e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1599e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("pp_buffer_hdr = NULL");
1600e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
1601e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1602e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
1603e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1604e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("port index %d, %d bytes", port, bytes);
1605e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1606e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (port == OMX_CORE_PORT_INDEX_IP)
1607e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
1608e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = buffer_allocate_ip(pp_buffer_hdr,
1609e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        p_app_data,
1610e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        bytes);
1611e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1612e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else if (port == OMX_CORE_PORT_INDEX_OP)
1613e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
1614e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (m_meta_buffer_mode == true)
1615e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
1616e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_SWVDEC_LOG_ERROR("'meta buffer mode' enabled");
1617e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                retval = OMX_ErrorBadParameter;
1618e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
1619e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            else if (m_android_native_buffers == true)
1620e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
1621e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_SWVDEC_LOG_ERROR("'android native buffers' enabled");
1622e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                retval = OMX_ErrorBadParameter;
1623e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
1624e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            else
1625e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
1626e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                retval = buffer_allocate_op(pp_buffer_hdr,
1627e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                            p_app_data,
1628e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                            bytes);
1629e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
1630e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1631e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
1632e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
1633e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("port index %d invalid", port);
1634e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorBadPortIndex;
1635e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1636e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1637e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (retval == OMX_ErrorNone)
1638e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
1639e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            SWVDEC_STATUS retval_swvdec;
1640e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1641e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if ((m_status_flags & (1 << PENDING_STATE_LOADED_TO_IDLE)) &&
1642e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                (m_port_ip.populated == OMX_TRUE) &&
1643e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                (m_port_op.populated == OMX_TRUE))
1644e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
1645e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                // start SwVdec
1646e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                if ((retval_swvdec = swvdec_start(m_swvdec_handle)) !=
1647e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    SWVDEC_STATUS_SUCCESS)
1648e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                {
1649e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    OMX_SWVDEC_LOG_ERROR("failed to start SwVdec");
1650e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    retval = retval_swvdec2omx(retval_swvdec);
1651e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    goto allocate_buffer_exit;
1652e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                }
1653e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1654e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_status_flags &= ~(1 << PENDING_STATE_LOADED_TO_IDLE);
1655e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1656e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                async_post_event(OMX_SWVDEC_EVENT_CMD_ACK,
1657e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 OMX_CommandStateSet,
1658e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 OMX_StateIdle);
1659e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
1660e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1661e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if ((m_status_flags & (1 << PENDING_PORT_ENABLE_IP)) &&
1662e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                (m_port_ip.populated == OMX_TRUE))
1663e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
1664e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_status_flags &= ~(1 << PENDING_PORT_ENABLE_IP);
1665e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1666e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                async_post_event(OMX_SWVDEC_EVENT_CMD_ACK,
1667e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 OMX_CommandPortEnable,
1668e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 OMX_CORE_PORT_INDEX_IP);
1669e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
1670e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1671e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if ((m_status_flags & (1 << PENDING_PORT_ENABLE_OP)) &&
1672e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                (m_port_op.populated == OMX_TRUE))
1673e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
1674e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                if (m_port_reconfig_inprogress)
1675e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                {
1676e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    // start SwVdec
1677e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    if ((retval_swvdec = swvdec_start(m_swvdec_handle)) !=
1678e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        SWVDEC_STATUS_SUCCESS)
1679e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    {
1680e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        OMX_SWVDEC_LOG_ERROR("failed to start SwVdec");
1681e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        retval = retval_swvdec2omx(retval_swvdec);
1682e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    }
1683e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                }
1684e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1685e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_status_flags &= ~(1 << PENDING_PORT_ENABLE_OP);
1686e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1687e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                async_post_event(OMX_SWVDEC_EVENT_CMD_ACK,
1688e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 OMX_CommandPortEnable,
1689e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 OMX_CORE_PORT_INDEX_OP);
1690e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
1691e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1692e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1693e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1694e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinallocate_buffer_exit:
1695e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
1696e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
1697e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1698e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
1699e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Release buffer & associated header.
1700e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
1701e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmp_handle:   Component handle.
1702e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] port:         Port index.
1703e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_buffer_hdr: Pointer to buffer's buffer header.
1704e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
1705e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
1706e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
1707e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::free_buffer(OMX_HANDLETYPE        cmp_handle,
1708e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                      OMX_U32               port,
1709e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                      OMX_BUFFERHEADERTYPE *p_buffer_hdr)
1710e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
1711e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
1712e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1713e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (cmp_handle == NULL)
1714e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1715e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL");
1716e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidComponent;
1717e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1718e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (p_buffer_hdr == NULL)
1719e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1720e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("p_buffer_hdr = NULL");
1721e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
1722e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1723e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if ((port != OMX_CORE_PORT_INDEX_IP) &&
1724e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin             (port != OMX_CORE_PORT_INDEX_OP))
1725e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1726e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", port);
1727e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadPortIndex;
1728e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1729e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (m_state != OMX_StateIdle)
1730e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1731e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_state != OMX_StateExecuting)
1732e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
1733e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("disallowed in state %s",
1734e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 OMX_STATETYPE_STRING(m_state));
1735e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorIncorrectStateOperation;
1736e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1737e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
1738e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
1739e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (((port == OMX_CORE_PORT_INDEX_IP) && m_port_ip.enabled) ||
1740e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                ((port == OMX_CORE_PORT_INDEX_OP) && m_port_op.enabled))
1741e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
1742e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_SWVDEC_LOG_ERROR("port index %d not disabled", port);
1743e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                retval = OMX_ErrorBadPortIndex;
1744e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
1745e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1746e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1747e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1748e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (retval == OMX_ErrorNone)
1749e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1750e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("port index %d, %p", port, p_buffer_hdr);
1751e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1752e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (port == OMX_CORE_PORT_INDEX_IP)
1753e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
1754e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = buffer_deallocate_ip(p_buffer_hdr);
1755e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1756e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
1757e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
1758e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = buffer_deallocate_op(p_buffer_hdr);
1759e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1760e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1761e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1762e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if ((retval == OMX_ErrorNone) &&
1763e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        (m_status_flags & (1 << PENDING_STATE_IDLE_TO_LOADED)))
1764e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1765e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((m_port_ip.unpopulated == OMX_TRUE) &&
1766e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (m_port_op.unpopulated == OMX_TRUE))
1767e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
1768e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            SWVDEC_STATUS retval_swvdec;
1769e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1770e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            // stop SwVdec
1771e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if ((retval_swvdec = swvdec_stop(m_swvdec_handle)) ==
1772e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                SWVDEC_STATUS_SUCCESS)
1773e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
1774e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_status_flags &= ~(1 << PENDING_STATE_IDLE_TO_LOADED);
1775e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1776e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                async_post_event(OMX_SWVDEC_EVENT_CMD_ACK,
1777e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 OMX_CommandStateSet,
1778e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 OMX_StateLoaded);
1779e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
1780e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            else
1781e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
1782e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_SWVDEC_LOG_ERROR("failed to stop SwVdec");
1783e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                retval = retval_swvdec2omx(retval_swvdec);
1784e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
1785e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1786e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1787e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1788e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if ((retval == OMX_ErrorNone) &&
1789e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        (m_status_flags & (1 << PENDING_PORT_DISABLE_IP)) &&
1790e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_port_ip.unpopulated)
1791e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1792e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_status_flags &= ~(1 << PENDING_PORT_DISABLE_IP);
1793e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1794e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        async_post_event(OMX_SWVDEC_EVENT_CMD_ACK,
1795e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         OMX_CommandPortDisable,
1796e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         OMX_CORE_PORT_INDEX_IP);
1797e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1798e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1799e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if ((retval == OMX_ErrorNone) &&
1800e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        (m_status_flags & (1 << PENDING_PORT_DISABLE_OP)) &&
1801e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_port_op.unpopulated)
1802e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1803e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_port_reconfig_inprogress)
1804e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
1805e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            SWVDEC_STATUS retval_swvdec;
1806e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1807e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if ((retval_swvdec = swvdec_stop(m_swvdec_handle)) !=
1808e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                SWVDEC_STATUS_SUCCESS)
1809e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
1810e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_SWVDEC_LOG_ERROR("failed to stop SwVdec");
1811e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                retval = retval_swvdec2omx(retval_swvdec);
1812e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
1813e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1814e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1815e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_status_flags &= ~(1 << PENDING_PORT_DISABLE_OP);
1816e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1817e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        async_post_event(OMX_SWVDEC_EVENT_CMD_ACK,
1818e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         OMX_CommandPortDisable,
1819e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         OMX_CORE_PORT_INDEX_OP);
1820e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1821e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1822e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
1823e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
1824e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1825e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
1826e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Send a buffer to component's input port to be emptied.
1827e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
1828e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmp_handle:   Component handle.
1829e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_buffer_hdr: Pointer to buffer's buffer header.
1830e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
1831e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
1832e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
1833e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::empty_this_buffer(OMX_HANDLETYPE        cmp_handle,
1834e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                            OMX_BUFFERHEADERTYPE *p_buffer_hdr)
1835e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
1836e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
1837e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1838e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int ii;
1839e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1840e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_state == OMX_StateInvalid)
1841e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1842e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("in invalid state");
1843e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidState;
1844e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1845e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (cmp_handle == NULL)
1846e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1847e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL");
1848e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidComponent;
1849e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1850e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (p_buffer_hdr == NULL)
1851e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1852e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("p_buffer_hdr = NULL");
1853e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
1854e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1855e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (p_buffer_hdr->pBuffer == NULL)
1856e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1857e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("p_buffer_hdr->pBuffer = NULL");
1858e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
1859e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1860e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (p_buffer_hdr->pInputPortPrivate == NULL)
1861e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1862e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("p_buffer_hdr->pInputPortPrivate = NULL");
1863e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
1864e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1865e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (m_port_ip.enabled == OMX_FALSE)
1866e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1867e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("ip port disabled");
1868e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorIncorrectStateOperation;
1869e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1870e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (p_buffer_hdr->nInputPortIndex != OMX_CORE_PORT_INDEX_IP)
1871e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1872e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("port index '%d' invalid",
1873e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             p_buffer_hdr->nInputPortIndex);
1874e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadPortIndex;
1875e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1876e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1877e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (retval != OMX_ErrorNone)
1878e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1879e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto empty_this_buffer_exit;
1880e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1881e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1882e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    for (ii = 0; ii < m_port_ip.def.nBufferCountActual; ii++)
1883e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1884e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (p_buffer_hdr == &(m_buffer_array_ip[ii].buffer_header))
1885e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
1886e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_LOW("ip buffer %p has index %d",
1887e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               p_buffer_hdr->pBuffer,
1888e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               ii);
1889e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
1890e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1891e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1892e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1893e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (ii == m_port_ip.def.nBufferCountActual)
1894e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1895e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("ip buffer %p not found",
1896e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             p_buffer_hdr->pBuffer);
1897e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
1898e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto empty_this_buffer_exit;
1899e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1900e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1901e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_sync_frame_decoding_mode &&
1902e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        ((p_buffer_hdr->nFlags & OMX_BUFFERFLAG_CODECCONFIG) == 0))
1903e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1904e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_buffer_hdr->nFlags |= OMX_BUFFERFLAG_EOS;
1905e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1906e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1907e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_LOG_API("%p: buffer %p, flags 0x%08x, filled length %d, "
1908e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                       "timestamp %lld",
1909e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                       p_buffer_hdr,
1910e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                       p_buffer_hdr->pBuffer,
1911e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                       p_buffer_hdr->nFlags,
1912e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                       p_buffer_hdr->nFilledLen,
1913e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                       p_buffer_hdr->nTimeStamp);
1914e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1915e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    async_post_event(OMX_SWVDEC_EVENT_ETB,
1916e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                     (unsigned long) p_buffer_hdr,
1917e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                     (unsigned long) ii);
1918e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1919e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinempty_this_buffer_exit:
1920e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
1921e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
1922e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1923e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
1924e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Send a buffer to component's output port to be filled.
1925e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
1926e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmp_handle:   Component handle.
1927e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_buffer_hdr: Pointer to buffer's buffer header.
1928e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
1929e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
1930e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
1931e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::fill_this_buffer(OMX_HANDLETYPE        cmp_handle,
1932e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                           OMX_BUFFERHEADERTYPE *p_buffer_hdr)
1933e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
1934e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
1935e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1936e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int ii;
1937e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1938e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_BUFFER *p_buffer_swvdec;
1939e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1940e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_state == OMX_StateInvalid)
1941e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1942e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("in invalid state");
1943e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidState;
1944e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1945e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (cmp_handle == NULL)
1946e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1947e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL");
1948e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidComponent;
1949e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1950e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (p_buffer_hdr == NULL)
1951e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1952e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("p_buffer_hdr = NULL");
1953e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
1954e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1955e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (p_buffer_hdr->pBuffer == NULL)
1956e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1957e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("p_buffer_hdr->pBuffer = NULL");
1958e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
1959e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1960e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (p_buffer_hdr->pOutputPortPrivate == NULL)
1961e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1962e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("p_buffer_hdr->pOutputPortPrivate = NULL");
1963e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
1964e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1965e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (m_port_op.enabled == OMX_FALSE)
1966e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1967e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("op port disabled");
1968e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorIncorrectStateOperation;
1969e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1970e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (p_buffer_hdr->nOutputPortIndex != OMX_CORE_PORT_INDEX_OP)
1971e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1972e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("port index '%d' invalid",
1973e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             p_buffer_hdr->nOutputPortIndex);
1974e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadPortIndex;
1975e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1976e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1977e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (retval != OMX_ErrorNone)
1978e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1979e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto fill_this_buffer_exit;
1980e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1981e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1982e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_LOG_API("%p", p_buffer_hdr);
1983e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1984e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    for (ii = 0; ii < m_port_op.def.nBufferCountActual; ii++)
1985e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1986e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (p_buffer_hdr == &(m_buffer_array_op[ii].buffer_header))
1987e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
1988e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_LOW("op buffer %p has index %d",
1989e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               p_buffer_hdr->pBuffer,
1990e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               ii);
1991e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
1992e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
1993e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
1994e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
1995e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (ii == m_port_op.def.nBufferCountActual)
1996e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
1997e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("op buffer %p not found",
1998e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             p_buffer_hdr->pBuffer);
1999e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
2000e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto fill_this_buffer_exit;
2001e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2002e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2003e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    p_buffer_swvdec = &m_buffer_array_op[ii].buffer_swvdec;
2004e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2005e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_meta_buffer_mode)
2006e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2007e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        struct VideoDecoderOutputMetaData *p_meta_data;
2008e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2009e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        private_handle_t *p_private_handle;
2010e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2011e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        struct vdec_bufferpayload *p_buffer_payload;
2012e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2013e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_meta_data =
2014e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (struct VideoDecoderOutputMetaData *) p_buffer_hdr->pBuffer;
2015e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2016e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_private_handle = (private_handle_t *) (p_meta_data->pHandle);
2017e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2018e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_buffer_payload = &m_buffer_array_op[ii].buffer_payload;
2019e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2020e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (p_private_handle == NULL)
2021e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2022e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR(
2023e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                "p_buffer_hdr->pBuffer->pHandle = NULL");
2024e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2025e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorBadParameter;
2026e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            goto fill_this_buffer_exit;
2027e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2028e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2029e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        pthread_mutex_lock(&m_meta_buffer_array_mutex);
2030e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2031e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_meta_buffer_array[ii].ref_count == 0)
2032e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2033e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            unsigned char *bufferaddr;
2034e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2035e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            bufferaddr = (unsigned char *) mmap(NULL,
2036e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                m_port_op.def.nBufferSize,
2037e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                PROT_READ | PROT_WRITE,
2038e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                MAP_SHARED,
2039e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                p_private_handle->fd,
2040e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                0);
2041e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2042e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (bufferaddr == MAP_FAILED)
2043e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
2044e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_SWVDEC_LOG_ERROR("mmap() failed for "
2045e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     "fd %d of size %d",
2046e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     p_private_handle->fd,
2047e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     m_port_op.def.nBufferSize);
2048e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2049e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                retval = OMX_ErrorInsufficientResources;
2050e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                goto fill_this_buffer_exit;
2051e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
2052e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2053e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_payload->bufferaddr  = bufferaddr;
2054e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_payload->pmem_fd     = p_private_handle->fd;
2055e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_payload->buffer_len  = m_port_op.def.nBufferSize;
2056e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_payload->mmaped_size = m_port_op.def.nBufferSize;
2057e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2058e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_swvdec->p_buffer      = bufferaddr;
2059e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_swvdec->size          = m_port_op.def.nBufferSize;
2060e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_swvdec->p_client_data = (void *) ((unsigned long) ii);
2061e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2062e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2063e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        pthread_mutex_unlock(&m_meta_buffer_array_mutex);
2064e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2065e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        meta_buffer_ref_add(ii,
2066e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            p_buffer_payload->pmem_fd,
2067e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            p_buffer_payload->offset);
2068e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2069e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2070e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_LOG_LOW("%p: buffer %p",
2071e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                       p_buffer_hdr,
2072e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                       p_buffer_swvdec->p_buffer);
2073e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2074e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    async_post_event(OMX_SWVDEC_EVENT_FTB,
2075e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                     (unsigned long) p_buffer_hdr,
2076e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                     (unsigned long) ii);
2077e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2078e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinfill_this_buffer_exit:
2079e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
2080e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
2081e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2082e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
2083e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Set component's callback structure.
2084e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2085e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmp_handle:  Component handle.
2086e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_callbacks: Pointer to callback structure.
2087e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_app_data:  Pointer to IL client app data.
2088e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2089e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
2090e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
2091e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::set_callbacks(OMX_HANDLETYPE    cmp_handle,
2092e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        OMX_CALLBACKTYPE *p_callbacks,
2093e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        OMX_PTR           p_app_data)
2094e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
2095e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
2096e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2097e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_LOG_API("");
2098e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2099e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_state == OMX_StateInvalid)
2100e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2101e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("in invalid state");
2102e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidState;
2103e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2104e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (cmp_handle == NULL)
2105e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2106e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL");
2107e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidComponent;
2108e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2109e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (p_callbacks->EventHandler == NULL)
2110e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2111e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("p_callbacks->EventHandler = NULL");
2112e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
2113e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2114e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (p_callbacks->EmptyBufferDone == NULL)
2115e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2116e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("p_callbacks->EmptyBufferDone = NULL");
2117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
2118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2119e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (p_callbacks->FillBufferDone == NULL)
2120e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2121e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("p_callbacks->FillBufferDone = NULL");
2122e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
2123e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2124e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
2125e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2126e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_callback = *p_callbacks;
2127e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_app_data = p_app_data;
2128e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2129e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2130e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
2131e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
2132e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2133e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
2134e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Use EGL image.
2135e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2136e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ErrorNotImplemented
2137e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
2138e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::use_EGL_image(OMX_HANDLETYPE         cmp_handle,
2139e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        OMX_BUFFERHEADERTYPE **pp_buffer_hdr,
2140e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        OMX_U32                port,
2141e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        OMX_PTR                p_app_data,
2142e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        void                  *egl_image)
2143e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
2144e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) cmp_handle;
2145e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) pp_buffer_hdr;
2146e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) port;
2147e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) p_app_data;
2148e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) egl_image;
2149e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2150e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_LOG_API("");
2151e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2152e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_LOG_ERROR("not implemented");
2153e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2154e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return OMX_ErrorNotImplemented;
2155e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
2156e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
2158e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Enumerate component role.
2159e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2160e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in]     cmp_handle: Component handle.
2161e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] p_role:     Pointer to component role string.
2162e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in]     index:      Role index being queried.
2163e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2164e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
2165e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
2166e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::component_role_enum(OMX_HANDLETYPE cmp_handle,
2167e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                              OMX_U8        *p_role,
2168e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                              OMX_U32        index)
2169e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
2170e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
2171e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2172e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_state == OMX_StateInvalid)
2173e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2174e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("in invalid state");
2175e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidState;
2176e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2177e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (cmp_handle == NULL)
2178e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2179e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("cmp_handle = NULL");
2180e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidComponent;
2181e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2182e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (index > 0)
2183e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2184e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_HIGH("index '%d' unsupported; no more roles", index);
2185e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorNoMore;
2186e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2187e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
2188e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2189e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        memcpy(p_role, m_role_name, OMX_MAX_STRINGNAME_SIZE);
2190e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_API("index '%d': '%s'", index, p_role);
2191e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2192e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2193e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
2194e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
2195e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2196e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
2197e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * -------------------------
2198e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * SwVdec callback functions
2199e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * -------------------------
2200e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
2201e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2202e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
2203e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief SwVdec empty buffer done callback.
2204e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2205e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] swvdec_handle:   SwVdec handle.
2206e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_buffer_ip:     Pointer to input buffer structure.
2207e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_client_handle: Pointer to SwVdec's client handle.
2208e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2209e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval SWVDEC_STATUS_SUCCESS
2210e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval SWVDEC_STATUS_NULL_POINTER
2211e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval SWVDEC_STATUS_INVALID_PARAMETERS
2212e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
2213e4010605f233a213cf0d972397bb33c34c364227Patrick TjinSWVDEC_STATUS omx_swvdec::swvdec_empty_buffer_done_callback(
2214e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_HANDLE  swvdec_handle,
2215e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_BUFFER *p_buffer_ip,
2216e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    void          *p_client_handle)
2217e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
2218e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_STATUS retval = SWVDEC_STATUS_SUCCESS;
2219e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2220e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (p_buffer_ip == NULL)
2221e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2222e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("p_buffer_ip = NULL");
2223e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = SWVDEC_STATUS_NULL_POINTER;
2224e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2225e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (p_client_handle == NULL)
2226e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2227e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("p_client_handle = NULL");
2228e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = SWVDEC_STATUS_NULL_POINTER;
2229e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2230e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
2231e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2232e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        omx_swvdec *p_omx_swvdec = (omx_swvdec *) p_client_handle;
2233e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2234e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (swvdec_handle != p_omx_swvdec->m_swvdec_handle)
2235e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2236e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("invalid SwVdec handle");
2237e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = SWVDEC_STATUS_INVALID_PARAMETERS;
2238e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2239e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
2240e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2241e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_omx_swvdec->swvdec_empty_buffer_done(p_buffer_ip);
2242e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2243e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2244e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2245e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
2246e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
2247e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2248e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
2249e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief SwVdec fill buffer done callback.
2250e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2251e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] swvdec_handle:   SwVdec handle.
2252e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_buffer_op:     Pointer to output buffer structure.
2253e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_client_handle: Pointer to SwVdec's client handle.
2254e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2255e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval SWVDEC_STATUS_SUCCESS
2256e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval SWVDEC_STATUS_NULL_POINTER
2257e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval SWVDEC_STATUS_INVALID_PARAMETERS
2258e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
2259e4010605f233a213cf0d972397bb33c34c364227Patrick TjinSWVDEC_STATUS omx_swvdec::swvdec_fill_buffer_done_callback(
2260e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_HANDLE  swvdec_handle,
2261e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_BUFFER *p_buffer_op,
2262e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    void          *p_client_handle)
2263e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
2264e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_STATUS retval = SWVDEC_STATUS_SUCCESS;
2265e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2266e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (p_buffer_op == NULL)
2267e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2268e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("p_buffer_op = NULL");
2269e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = SWVDEC_STATUS_NULL_POINTER;
2270e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2271e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (p_client_handle == NULL)
2272e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2273e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("p_client_handle = NULL");
2274e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = SWVDEC_STATUS_NULL_POINTER;
2275e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2276e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
2277e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2278e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        omx_swvdec *p_omx_swvdec = (omx_swvdec *) p_client_handle;
2279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2280e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (swvdec_handle != p_omx_swvdec->m_swvdec_handle)
2281e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2282e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("invalid SwVdec handle");
2283e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = SWVDEC_STATUS_INVALID_PARAMETERS;
2284e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2285e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
2286e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2287e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_omx_swvdec->swvdec_fill_buffer_done(p_buffer_op);
2288e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2289e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2290e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2291e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
2292e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
2293e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2294e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
2295e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief SwVdec event handler callback.
2296e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2297e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] swvdec_handle:   SwVdec handle.
2298e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] event:           Event.
2299e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_data:          Pointer to event-specific data.
2300e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_client_handle: Pointer to SwVdec's client handle.
2301e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2302e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval SWVDEC_STATUS_SUCCESS
2303e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval SWVDEC_STATUS_NULL_POINTER
2304e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval SWVDEC_STATUS_INVALID_PARAMETERS
2305e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
2306e4010605f233a213cf0d972397bb33c34c364227Patrick TjinSWVDEC_STATUS omx_swvdec::swvdec_event_handler_callback(
2307e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_HANDLE swvdec_handle,
2308e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_EVENT  event,
2309e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    void         *p_data,
2310e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    void         *p_client_handle)
2311e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
2312e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_STATUS retval = SWVDEC_STATUS_SUCCESS;
2313e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2314e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if ((event == SWVDEC_EVENT_RELEASE_REFERENCE) && (p_data == NULL))
2315e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2316e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("p_data = NULL");
2317e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = SWVDEC_STATUS_NULL_POINTER;
2318e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2319e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (p_client_handle == NULL)
2320e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2321e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("p_client_handle = NULL");
2322e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = SWVDEC_STATUS_NULL_POINTER;
2323e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2324e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
2325e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2326e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        omx_swvdec *p_omx_swvdec = (omx_swvdec *) p_client_handle;
2327e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2328e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (swvdec_handle != p_omx_swvdec->m_swvdec_handle)
2329e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2330e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("invalid SwVdec handle");
2331e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = SWVDEC_STATUS_INVALID_PARAMETERS;
2332e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2333e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
2334e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2335e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_omx_swvdec->swvdec_event_handler(event, p_data);
2336e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2337e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2338e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2339e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
2340e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
2341e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2342e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
2343e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * -----------------
2344e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * PRIVATE FUNCTIONS
2345e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * -----------------
2346e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
2347e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
2349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Set frame dimensions for OMX component & SwVdec core.
2350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2351e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] width:  Frame width.
2352e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] height: Frame height.
2353e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2354e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
2355e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
2356e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::set_frame_dimensions(unsigned int width,
2357e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                               unsigned int height)
2358e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
2359e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval;
2360e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2361e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_frame_dimensions.width  = width;
2362e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_frame_dimensions.height = height;
2363e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2364e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_LOG_HIGH("%d x %d",
2365e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        m_frame_dimensions.width,
2366e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        m_frame_dimensions.height);
2367e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2368e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    retval = set_frame_dimensions_swvdec();
2369e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2370e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
2371e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
2372e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2373e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
2374e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Set frame attributes for OMX component & SwVdec core, based on
2375e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *        frame dimensions & alignment factors.
2376e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2377e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] alignment_stride:       Frame stride alignment factor.
2378e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] alignment_scanlines_y:  Frame   luma scanlines alignment factor.
2379e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] alignment_scanlines_uv: Frame chroma scanlines alignment factor.
2380e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] alignment_size:         Frame size alignment factor.
2381e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2382e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
2383e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
2384e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::set_frame_attributes(
2385e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int alignment_stride,
2386e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int alignment_scanlines_y,
2387e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int alignment_scanlines_uv,
2388e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int alignment_size)
2389e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
2390e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval;
2391e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2392e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int width  = m_frame_dimensions.width;
2393e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int height = m_frame_dimensions.height;
2394e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2395e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int scanlines_uv;
2396e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2397e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int plane_size_y;
2398e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int plane_size_uv;
2399e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2400e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_frame_attributes.stride    = ALIGN(width,  alignment_stride);
2401e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_frame_attributes.scanlines = ALIGN(height, alignment_scanlines_y);
2402e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2403e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    scanlines_uv = ALIGN(height / 2, alignment_scanlines_uv);
2404e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2405e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    plane_size_y  = m_frame_attributes.stride * m_frame_attributes.scanlines;
2406e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    plane_size_uv = m_frame_attributes.stride * scanlines_uv;
2407e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2408e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_frame_attributes.size =
2409e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        ALIGN(plane_size_y + plane_size_uv, alignment_size);
2410e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2411e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_LOG_HIGH("stride %d, scanlines %d, size %d",
2412e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        m_frame_attributes.stride,
2413e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        m_frame_attributes.scanlines,
2414e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        m_frame_attributes.size);
2415e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2416e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    retval = set_frame_attributes_swvdec();
2417e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2418e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
2419e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
2420e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2421e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
2422e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Get video port format for input or output port.
2423e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2424e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] p_port_format: Pointer to video port format type.
2425e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2426e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
2427e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
2428e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::get_video_port_format(
2429e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_VIDEO_PARAM_PORTFORMATTYPE *p_port_format)
2430e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
2431e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
2432e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2433e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (p_port_format->nPortIndex == OMX_CORE_PORT_INDEX_IP)
2434e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2435e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (p_port_format->nIndex == 0)
2436e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2437e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_port_format->eColorFormat       = OMX_COLOR_FormatUnused;
2438e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_port_format->eCompressionFormat = m_omx_video_codingtype;
2439e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2440e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_HIGH("color format 0x%08x, "
2441e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                "compression format 0x%08x",
2442e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                p_port_format->eColorFormat,
2443e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                p_port_format->eCompressionFormat);
2444e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2445e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
2446e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2447e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_HIGH("index '%d' unsupported; "
2448e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                "no more compression formats",
2449e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                p_port_format->nIndex);
2450e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorNoMore;
2451e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2452e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2453e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (p_port_format->nPortIndex == OMX_CORE_PORT_INDEX_OP)
2454e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2455e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (p_port_format->nIndex == 0)
2456e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2457e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_port_format->eColorFormat =
2458e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar32m;
2459e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_port_format->eCompressionFormat = OMX_VIDEO_CodingUnused;
2460e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2461e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_HIGH("color format 0x%08x, "
2462e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                "compression format 0x%08x",
2463e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                p_port_format->eColorFormat,
2464e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                p_port_format->eCompressionFormat);
2465e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2466e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else if (p_port_format->nIndex == 1)
2467e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2468e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_port_format->eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
2469e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_port_format->eCompressionFormat = OMX_VIDEO_CodingUnused;
2470e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2471e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_HIGH("color format 0x%08x, "
2472e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                "compression format 0x%08x",
2473e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                p_port_format->eColorFormat,
2474e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                p_port_format->eCompressionFormat);
2475e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2476e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        // Here, add additional supported color formats as necessary.
2477e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
2478e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2479e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_HIGH("index '%d' unsupported; no more color formats",
2480e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                p_port_format->nIndex);
2481e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorNoMore;
2482e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2483e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2484e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
2485e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2486e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("port index '%d' invalid",
2487e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             p_port_format->nPortIndex);
2488e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadPortIndex;
2489e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2490e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2491e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
2492e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
2493e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2494e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
2495e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Set video port format for input or output port.
2496e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2497e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_port_format: Pointer to video port format type.
2498e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2499e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
2500e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
2501e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::set_video_port_format(
2502e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_VIDEO_PARAM_PORTFORMATTYPE *p_port_format)
2503e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
2504e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
2505e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2506e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (p_port_format->nPortIndex == OMX_CORE_PORT_INDEX_IP)
2507e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2508e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        // do nothing
2509e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_HIGH("OMX_IndexParamVideoPortFormat, port index 0; "
2510e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            "doing nothing");
2511e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2512e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (p_port_format->nPortIndex == OMX_CORE_PORT_INDEX_OP)
2513e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2514e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        /**
2515e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         * If color format specified by IL client is different from default,
2516e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         * set alignment factors for new color format and call
2517e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         * set_frame_attributes().
2518e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         */
2519e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        switch (p_port_format->eColorFormat)
2520e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2521e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2522e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar32m:
2523e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2524e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            // do nothing; this is the default color format
2525e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_HIGH(
2526e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                "'0x%08x': OMX_QCOM_COLOR_FormatYUV420PackedSemiPlanar32m",
2527e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                p_port_format->eColorFormat);
2528e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
2529e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2530e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2531e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_COLOR_FormatYUV420SemiPlanar:
2532e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2533e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_HIGH("'0x%08x': OMX_COLOR_FormatYUV420SemiPlanar",
2534e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                p_port_format->eColorFormat);
2535e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2536e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = set_frame_attributes(16,    //       stride alignment
2537e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          1,     //  Y scanlines alignment
2538e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          1,     // UV scanlines alignment
2539e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          4096); //         size alignment
2540e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
2541e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2542e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2543e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        default:
2544e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2545e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("color format '0x%08x' invalid or unsupported",
2546e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 p_port_format->eColorFormat);
2547e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorBadParameter;
2548e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
2549e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2550e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2551e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2552e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2553e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
2554e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2555e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("port index '%d' invalid",
2556e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             p_port_format->nPortIndex);
2557e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadPortIndex;
2558e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2559e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2560e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinset_video_port_format_exit:
2561e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
2562e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
2563e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2564e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
2565e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Get port definition for input or output port.
2566e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2567e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] p_port_def: Pointer to port definition type.
2568e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2569e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
2570e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
2571e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::get_port_definition(
2572e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_PARAM_PORTDEFINITIONTYPE *p_port_def)
2573e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
2574e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
2575e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2576e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    p_port_def->eDomain = OMX_PortDomainVideo;
2577e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2578e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_IP)
2579e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2580e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((retval = get_buffer_requirements_swvdec(OMX_CORE_PORT_INDEX_IP)) !=
2581e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_ErrorNone)
2582e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2583e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            goto get_port_definition_exit;
2584e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2585e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2586e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_port_def->eDir               = OMX_DirInput;
2587e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_port_def->nBufferCountActual = m_port_ip.def.nBufferCountActual;
2588e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_port_def->nBufferCountMin    = m_port_ip.def.nBufferCountMin;
2589e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_port_def->nBufferSize        = m_port_ip.def.nBufferSize;
2590e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_port_def->bEnabled           = m_port_ip.enabled;
2591e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_port_def->bPopulated         = m_port_ip.populated;
2592e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2593e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_HIGH("port index %d: "
2594e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            "count actual %d, count min %d, size %d",
2595e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            p_port_def->nPortIndex,
2596e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            p_port_def->nBufferCountActual,
2597e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            p_port_def->nBufferCountMin,
2598e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            p_port_def->nBufferSize);
2599e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2600e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        // frame dimensions & attributes don't apply to input port
2601e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2602e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_port_def->format.video.eColorFormat       = OMX_COLOR_FormatUnused;
2603e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_port_def->format.video.eCompressionFormat = m_omx_video_codingtype;
2604e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2605e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_OP)
2606e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2607e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        unsigned int frame_width  = m_frame_dimensions.width;
2608e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        unsigned int frame_height = m_frame_dimensions.height;
2609e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2610e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((retval = get_frame_dimensions_swvdec()) != OMX_ErrorNone)
2611e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2612e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            goto get_port_definition_exit;
2613e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2614e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2615e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_port_def->format.video.nFrameWidth  = m_frame_dimensions.width;
2616e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_port_def->format.video.nFrameHeight = m_frame_dimensions.height;
2617e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2618e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        // if frame dimensions have changed, update frame attributes
2619e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((frame_width  != m_frame_dimensions.width) ||
2620e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (frame_height != m_frame_dimensions.height))
2621e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2622e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if ((retval = set_frame_attributes(DEFAULT_ALIGNMENT_STRIDE,
2623e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                               DEFAULT_ALIGNMENT_SCANLINES_Y,
2624e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                               DEFAULT_ALIGNMENT_SCANLINES_UV,
2625e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                               DEFAULT_ALIGNMENT_SIZE)) !=
2626e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_ErrorNone)
2627e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
2628e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                goto get_port_definition_exit;
2629e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
2630e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2631e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2632e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((retval = get_frame_attributes_swvdec()) != OMX_ErrorNone)
2633e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2634e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            goto get_port_definition_exit;
2635e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2636e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2637e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_port_def->format.video.nStride      = m_frame_attributes.stride;
2638e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_port_def->format.video.nSliceHeight = m_frame_attributes.scanlines;
2639e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2640e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_HIGH("port index %d: "
2641e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            "%d x %d, stride %d, sliceheight %d",
2642e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            p_port_def->nPortIndex,
2643e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            p_port_def->format.video.nFrameWidth,
2644e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            p_port_def->format.video.nFrameHeight,
2645e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            p_port_def->format.video.nStride,
2646e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            p_port_def->format.video.nSliceHeight);
2647e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2648e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        /**
2649e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         * Query to SwVdec core for buffer requirements is not allowed in
2650e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         * executing state since it will overwrite the component's buffer
2651e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         * requirements updated via the most recent set_parameter().
2652e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         *
2653e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         * Buffer requirements communicated to component via set_parameter() are
2654e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         * not propagated to SwVdec core.
2655e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         *
2656e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         * The only execption is if port reconfiguration is in progress, in
2657e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         * which case the query to SwVdec core is required since buffer
2658e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         * requirements can change based on new dimensions.
2659e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         */
2660e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((m_state != OMX_StateExecuting) || m_port_reconfig_inprogress)
2661e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2662e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if ((retval =
2663e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                 get_buffer_requirements_swvdec(OMX_CORE_PORT_INDEX_OP)) !=
2664e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_ErrorNone)
2665e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
2666e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                goto get_port_definition_exit;
2667e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
2668e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2669e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2670e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_port_def->eDir               = OMX_DirOutput;
2671e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_port_def->nBufferCountActual = m_port_op.def.nBufferCountActual;
2672e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_port_def->nBufferCountMin    = m_port_op.def.nBufferCountMin;
2673e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_port_def->nBufferSize        = m_port_op.def.nBufferSize;
2674e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_port_def->bEnabled           = m_port_op.enabled;
2675e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_port_def->bPopulated         = m_port_op.populated;
2676e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2677e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_HIGH("port index %d: "
2678e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            "count actual %d, count min %d, size %d",
2679e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            p_port_def->nPortIndex,
2680e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            p_port_def->nBufferCountActual,
2681e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            p_port_def->nBufferCountMin,
2682e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            p_port_def->nBufferSize);
2683e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2684e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_port_def->format.video.eColorFormat       = m_omx_color_formattype;
2685e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_port_def->format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
2686e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2687e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
2688e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2689e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", p_port_def->nPortIndex);
2690e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadPortIndex;
2691e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2692e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2693e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinget_port_definition_exit:
2694e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
2695e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
2696e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2697e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
2698e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Set port definition for input or output port.
2699e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2700e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_port_def: Pointer to port definition type.
2701e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2702e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
2703e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
2704e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::set_port_definition(
2705e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_PARAM_PORTDEFINITIONTYPE *p_port_def)
2706e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
2707e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
2708e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2709e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_LOG_HIGH("port index %d: "
2710e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        "count actual %d, count min %d, size %d",
2711e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        p_port_def->nPortIndex,
2712e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        p_port_def->nBufferCountActual,
2713e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        p_port_def->nBufferCountMin,
2714e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        p_port_def->nBufferSize);
2715e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2716e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_IP)
2717e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2718e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_port_ip.def.nBufferCountActual = p_port_def->nBufferCountActual;
2719e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_port_ip.def.nBufferCountMin    = p_port_def->nBufferCountMin;
2720e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_port_ip.def.nBufferSize        = p_port_def->nBufferSize;
2721e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2722e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_OP)
2723e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2724e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_HIGH("port index %d: %d x %d",
2725e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            p_port_def->nPortIndex,
2726e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            p_port_def->format.video.nFrameWidth,
2727e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            p_port_def->format.video.nFrameHeight);
2728e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2729e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_port_op.def.nBufferCountActual = p_port_def->nBufferCountActual;
2730e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_port_op.def.nBufferCountMin    = p_port_def->nBufferCountMin;
2731e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_port_op.def.nBufferSize        = p_port_def->nBufferSize;
2732e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2733e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = set_frame_dimensions(p_port_def->format.video.nFrameWidth,
2734e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                      p_port_def->format.video.nFrameHeight);
2735e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (retval != OMX_ErrorNone)
2736e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            goto set_port_definition_exit;
2737e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2738e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_frame_attributes.stride    = p_port_def->format.video.nStride;
2739e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_frame_attributes.scanlines = p_port_def->format.video.nSliceHeight;
2740e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_frame_attributes.size      = p_port_def->nBufferSize;
2741e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2742e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = set_frame_attributes(DEFAULT_ALIGNMENT_STRIDE,
2743e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                      DEFAULT_ALIGNMENT_SCANLINES_Y,
2744e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                      DEFAULT_ALIGNMENT_SCANLINES_UV,
2745e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                      DEFAULT_ALIGNMENT_SIZE);
2746e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2747e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
2748e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2749e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", p_port_def->nPortIndex);
2750e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadPortIndex;
2751e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2752e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2753e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinset_port_definition_exit:
2754e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
2755e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
2756e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2757e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
2758e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Get supported profile & level.
2759e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2760e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * The supported profiles & levels are not queried from SwVdec core, but
2761e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * hard-coded. This should ideally be replaced with a query to SwVdec core.
2762e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2763e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] p_profilelevel: Pointer to video profile & level type.
2764e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2765e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
2766e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
2767e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::get_supported_profilelevel(
2768e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_VIDEO_PARAM_PROFILELEVELTYPE *p_profilelevel)
2769e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
2770e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
2771e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2772e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (p_profilelevel == NULL)
2773e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2774e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("p_profilelevel = NULL");
2775e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
2776e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto get_supported_profilelevel_exit;
2777e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2778e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2779e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (p_profilelevel->nPortIndex != OMX_CORE_PORT_INDEX_IP)
2780e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2781e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("port index '%d' invalid",
2782e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             p_profilelevel->nPortIndex);
2783e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadPortIndex;
2784e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto get_supported_profilelevel_exit;
2785e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2786e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2787e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_omx_video_codingtype == OMX_VIDEO_CodingH263)
2788e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2789e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (p_profilelevel->nProfileIndex == 0)
2790e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2791e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_profilelevel->eProfile = OMX_VIDEO_H263ProfileBaseline;
2792e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_profilelevel->eLevel   = OMX_VIDEO_H263Level70;
2793e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_HIGH("H.263 baseline profile, level 70");
2794e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2795e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
2796e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2797e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_HIGH("profile index '%d' unsupported; "
2798e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                "no more profiles",
2799e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                p_profilelevel->nProfileIndex);
2800e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorNoMore;
2801e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2802e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2803e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if ((m_omx_video_codingtype == OMX_VIDEO_CodingMPEG4) ||
2804e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin             (m_omx_video_codingtype ==
2805e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin              ((OMX_VIDEO_CODINGTYPE) QOMX_VIDEO_CodingDivx)))
2806e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2807e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (p_profilelevel->nProfileIndex == 0)
2808e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2809e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_profilelevel->eProfile = OMX_VIDEO_MPEG4ProfileSimple;
2810e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_profilelevel->eLevel   = OMX_VIDEO_MPEG4Level5;
2811e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_HIGH("MPEG-4 simple profile, level 5");
2812e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2813e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else if (p_profilelevel->nProfileIndex == 1)
2814e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2815e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_profilelevel->eProfile = OMX_VIDEO_MPEG4ProfileAdvancedSimple;
2816e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_profilelevel->eLevel   = OMX_VIDEO_MPEG4Level5;
2817e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_HIGH("MPEG-4 advanced simple profile, level 5");
2818e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2819e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
2820e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2821e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_HIGH("profile index '%d' unsupported; "
2822e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                "no more profiles",
2823e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                p_profilelevel->nProfileIndex);
2824e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorNoMore;
2825e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2826e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2827e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
2828e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2829e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        assert(0);
2830e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorUndefined;
2831e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2832e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2833e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinget_supported_profilelevel_exit:
2834e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
2835e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
2836e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2837e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
2838e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Describe color format.
2839e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2840e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] p_params: Pointer to 'DescribeColorFormatParams' structure.
2841e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2842e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
2843e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
2844e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::describe_color_format(
2845e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    DescribeColorFormatParams *p_params)
2846e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
2847e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
2848e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2849e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (p_params == NULL)
2850e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2851e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("p_params = NULL");
2852e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
2853e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2854e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
2855e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2856e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        MediaImage *p_img = &p_params->sMediaImage;
2857e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2858e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        switch (p_params->eColorFormat)
2859e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2860e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2861e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m:
2862e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2863e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            size_t stride, scanlines;
2864e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2865e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mType = MediaImage::MEDIA_IMAGE_TYPE_YUV;
2866e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mNumPlanes = 3;
2867e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2868e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mWidth  = p_params->nFrameWidth;
2869e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mHeight = p_params->nFrameHeight;
2870e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2871e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            stride    = ALIGN(p_img->mWidth,  DEFAULT_ALIGNMENT_STRIDE);
2872e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            scanlines = ALIGN(p_img->mHeight, DEFAULT_ALIGNMENT_SCANLINES_Y);
2873e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2874e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mBitDepth = 8;
2875e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2876e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            // plane 0 (Y)
2877e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mOffset = 0;
2878e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mColInc = 1;
2879e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mRowInc = stride;
2880e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mHorizSubsampling = 1;
2881e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mVertSubsampling  = 1;
2882e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2883e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            // plane 1 (U)
2884e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mOffset = stride * scanlines;
2885e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mColInc = 2;
2886e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mRowInc = stride;
2887e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mHorizSubsampling = 2;
2888e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mVertSubsampling  = 2;
2889e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2890e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            // plane 2 (V)
2891e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mOffset = stride * scanlines + 1;
2892e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mColInc = 2;
2893e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mRowInc = stride;
2894e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mHorizSubsampling = 2;
2895e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mVertSubsampling  = 2;
2896e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2897e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
2898e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2899e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2900e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_COLOR_FormatYUV420SemiPlanar:
2901e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2902e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            size_t stride, scanlines;
2903e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2904e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mType = MediaImage::MEDIA_IMAGE_TYPE_YUV;
2905e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mNumPlanes = 3;
2906e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2907e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mWidth  = p_params->nFrameWidth;
2908e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mHeight = p_params->nFrameHeight;
2909e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2910e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            stride    = ALIGN(p_img->mWidth,  16);
2911e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            scanlines = ALIGN(p_img->mHeight,  1);
2912e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2913e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mBitDepth = 8;
2914e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2915e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            // plane 0 (Y)
2916e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mOffset = 0;
2917e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mColInc = 1;
2918e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mRowInc = stride;
2919e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mHorizSubsampling = 1;
2920e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mVertSubsampling  = 1;
2921e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2922e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            // plane 1 (U)
2923e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mOffset = stride * scanlines;
2924e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mColInc = 2;
2925e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mRowInc = stride;
2926e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mHorizSubsampling = 2;
2927e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mVertSubsampling  = 2;
2928e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2929e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            // plane 2 (V)
2930e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mOffset = stride * scanlines + 1;
2931e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mColInc = 2;
2932e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mRowInc = stride;
2933e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mHorizSubsampling = 2;
2934e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mPlane[MediaImage::Y].mVertSubsampling  = 2;
2935e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2936e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
2937e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2938e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2939e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        default:
2940e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2941e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("color format '0x%08x' invalid/unsupported",
2942e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 p_params->eColorFormat);
2943e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2944e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_img->mType = MediaImage::MEDIA_IMAGE_TYPE_UNKNOWN;
2945e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2946e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorBadParameter;
2947e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
2948e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2949e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2950e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        } // switch (p_params->eColorFormat)
2951e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2952e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2953e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
2954e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
2955e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2956e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
2957e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Set QTI vendor-specific port definition for input or output port.
2958e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2959e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_port_def: Pointer to QTI vendor-specific port definition type.
2960e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
2961e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
2962e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
2963e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::set_port_definition_qcom(
2964e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_QCOM_PARAM_PORTDEFINITIONTYPE *p_port_def)
2965e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
2966e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
2967e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2968e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_IP)
2969e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2970e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        switch (p_port_def->nFramePackingFormat)
2971e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2972e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2973e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_QCOM_FramePacking_Arbitrary:
2974e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2975e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("OMX_QCOM_FramePacking_Arbitrary unsupported");
2976e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorUnsupportedSetting;
2977e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
2978e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2979e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2980e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_QCOM_FramePacking_OnlyOneCompleteFrame:
2981e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2982e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_HIGH(
2983e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                "OMX_QCOM_FramePacking_OnlyOneCompleteFrame");
2984e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
2985e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2986e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2987e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        default:
2988e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
2989e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR(
2990e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                "frame packing format '%d' unsupported");
2991e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorUnsupportedSetting;
2992e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
2993e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2994e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
2995e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
2996e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
2997e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (p_port_def->nPortIndex == OMX_CORE_PORT_INDEX_OP)
2998e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
2999e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_HIGH("nMemRegion %d, nCacheAttr %d",
3000e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            p_port_def->nMemRegion,
3001e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            p_port_def->nCacheAttr);
3002e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3003e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
3004e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3005e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("port index '%d' invalid",
3006e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             p_port_def->nPortIndex);
3007e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadPortIndex;
3008e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3009e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3010e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
3011e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
3012e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3013e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
3014e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Set SwVdec frame dimensions based on OMX component frame dimensions.
3015e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
3016e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
3017e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
3018e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::set_frame_dimensions_swvdec()
3019e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
3020e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
3021e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3022e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_PROPERTY property;
3023e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3024e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_STATUS retval_swvdec;
3025e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3026e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    property.id = SWVDEC_PROPERTY_ID_FRAME_DIMENSIONS;
3027e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3028e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    property.info.frame_dimensions.width  = m_frame_dimensions.width;
3029e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    property.info.frame_dimensions.height = m_frame_dimensions.height;
3030e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3031e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if ((retval_swvdec = swvdec_setproperty(m_swvdec_handle, &property)) !=
3032e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        SWVDEC_STATUS_SUCCESS)
3033e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3034e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = retval_swvdec2omx(retval_swvdec);
3035e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3036e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3037e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
3038e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
3039e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3040e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
3041e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Set SwVdec frame attributes based on OMX component frame attributes.
3042e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
3043e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
3044e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
3045e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::set_frame_attributes_swvdec()
3046e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
3047e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
3048e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3049e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_FRAME_ATTRIBUTES *p_frame_attributes;
3050e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3051e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_PROPERTY property;
3052e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3053e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_STATUS retval_swvdec;
3054e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3055e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    p_frame_attributes = &property.info.frame_attributes;
3056e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3057e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    property.id = SWVDEC_PROPERTY_ID_FRAME_ATTRIBUTES;
3058e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3059e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    p_frame_attributes->color_format = SWVDEC_COLOR_FORMAT_SEMIPLANAR_NV12;
3060e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3061e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    p_frame_attributes->semiplanar.stride    = m_frame_attributes.stride;
3062e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    p_frame_attributes->semiplanar.offset_uv = (m_frame_attributes.stride *
3063e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                m_frame_attributes.scanlines);
3064e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3065e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    p_frame_attributes->size = m_frame_attributes.size;
3066e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3067e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if ((retval_swvdec = swvdec_setproperty(m_swvdec_handle, &property)) !=
3068e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        SWVDEC_STATUS_SUCCESS)
3069e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3070e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = retval_swvdec2omx(retval_swvdec);
3071e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3072e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3073e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
3074e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
3075e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3076e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
3077e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Get SwVdec frame dimensions and set OMX component frame dimensions.
3078e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
3079e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
3080e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
3081e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::get_frame_dimensions_swvdec()
3082e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
3083e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
3084e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3085e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_PROPERTY property;
3086e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3087e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_STATUS retval_swvdec;
3088e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3089e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    property.id = SWVDEC_PROPERTY_ID_FRAME_DIMENSIONS;
3090e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3091e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if ((retval_swvdec = swvdec_getproperty(m_swvdec_handle, &property)) !=
3092e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        SWVDEC_STATUS_SUCCESS)
3093e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3094e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = retval_swvdec2omx(retval_swvdec);
3095e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3096e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
3097e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3098e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_frame_dimensions.width  = property.info.frame_dimensions.width;
3099e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_frame_dimensions.height = property.info.frame_dimensions.height;
3100e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3101e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3102e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
3103e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
3104e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3105e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
3106e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Get SwVdec frame attributes and set OMX component frame attributes.
3107e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
3108e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
3109e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
3110e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::get_frame_attributes_swvdec()
3111e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
3112e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
3113e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3114e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_PROPERTY property;
3115e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3116e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_STATUS retval_swvdec;
3117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    property.id = SWVDEC_PROPERTY_ID_FRAME_ATTRIBUTES;
3119e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3120e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if ((retval_swvdec = swvdec_getproperty(m_swvdec_handle, &property)) !=
3121e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        SWVDEC_STATUS_SUCCESS)
3122e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3123e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = retval_swvdec2omx(retval_swvdec);
3124e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3125e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
3126e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3127e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_frame_attributes.stride =
3128e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            property.info.frame_attributes.semiplanar.stride;
3129e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3130e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_frame_attributes.scanlines =
3131e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (property.info.frame_attributes.semiplanar.offset_uv /
3132e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin             property.info.frame_attributes.semiplanar.stride);
3133e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3134e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_frame_attributes.size = property.info.frame_attributes.size;
3135e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3136e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3137e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
3138e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
3139e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3140e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
3141e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Get SwVdec buffer requirements; set input or output port definitions.
3142e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
3143e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] port_index: Port index.
3144e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
3145e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
3146e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
3147e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::get_buffer_requirements_swvdec(
3148e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int port_index)
3149e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
3150e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
3151e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3152e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_PROPERTY property;
3153e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3154e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_STATUS retval_swvdec;
3155e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3156e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_BUFFER_REQ *p_buffer_req;
3157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3158e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (port_index == OMX_CORE_PORT_INDEX_IP)
3159e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3160e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        property.id = SWVDEC_PROPERTY_ID_BUFFER_REQ_IP;
3161e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3162e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_buffer_req = &property.info.buffer_req_ip;
3163e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3164e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((retval_swvdec = swvdec_getproperty(m_swvdec_handle, &property)) !=
3165e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            SWVDEC_STATUS_SUCCESS)
3166e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
3167e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = retval_swvdec2omx(retval_swvdec);
3168e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            goto get_buffer_requirements_swvdec_exit;
3169e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
3170e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3171e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_port_ip.def.nBufferSize        = p_buffer_req->size;
3172e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_port_ip.def.nBufferCountMin    = p_buffer_req->mincount;
3173e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_port_ip.def.nBufferCountActual = MAX(p_buffer_req->mincount,
3174e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                               OMX_SWVDEC_IP_BUFFER_COUNT);
3175e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_port_ip.def.nBufferAlignment   = p_buffer_req->alignment;
3176e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3177e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_HIGH("ip port: %d bytes x %d, %d-byte aligned",
3178e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            m_port_ip.def.nBufferSize,
3179e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            m_port_ip.def.nBufferCountActual,
3180e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            m_port_ip.def.nBufferAlignment);
3181e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3182e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (port_index == OMX_CORE_PORT_INDEX_OP)
3183e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3184e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        property.id = SWVDEC_PROPERTY_ID_BUFFER_REQ_OP;
3185e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3186e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_buffer_req = &property.info.buffer_req_op;
3187e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3188e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((retval_swvdec = swvdec_getproperty(m_swvdec_handle, &property)) !=
3189e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            SWVDEC_STATUS_SUCCESS)
3190e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
3191e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = retval_swvdec2omx(retval_swvdec);
3192e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            goto get_buffer_requirements_swvdec_exit;
3193e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
3194e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3195e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_sync_frame_decoding_mode)
3196e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
3197e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            // only 1 output buffer for sync frame decoding mode
3198e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_req->mincount = 1;
3199e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
3200e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3201e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_port_op.def.nBufferSize        = p_buffer_req->size;
3202e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_port_op.def.nBufferCountMin    = p_buffer_req->mincount;
3203e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_port_op.def.nBufferCountActual = p_buffer_req->mincount;
3204e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_port_op.def.nBufferAlignment   = p_buffer_req->alignment;
3205e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3206e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_HIGH("op port: %d bytes x %d, %d-byte aligned",
3207e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            m_port_op.def.nBufferSize,
3208e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            m_port_op.def.nBufferCountActual,
3209e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            m_port_op.def.nBufferAlignment);
3210e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3211e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
3212e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3213e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("port index '%d' invalid", port_index);
3214e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadPortIndex;
3215e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3216e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3217e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinget_buffer_requirements_swvdec_exit:
3218e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
3219e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
3220e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3221e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
3222e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Allocate input buffer, and input buffer info array if ncessary.
3223e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
3224e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] pp_buffer_hdr: Pointer to pointer to buffer header type
3225e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *                               structure.
3226e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in]     p_app_data:    Pointer to IL client app data.
3227e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in]     size:          Size of buffer to be allocated in bytes.
3228e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
3229e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
3230e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
3231e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::buffer_allocate_ip(
3232e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_BUFFERHEADERTYPE **pp_buffer_hdr,
3233e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_PTR                p_app_data,
3234e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_U32                size)
3235e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
3236e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
3237e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3238e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int ii;
3239e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3240e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (size != m_port_ip.def.nBufferSize)
3241e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3242e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("requested size (%d bytes) not equal to "
3243e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             "configured size (%d bytes)",
3244e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             size,
3245e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             m_port_ip.def.nBufferSize);
3246e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
3247e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto buffer_allocate_ip_exit;
3248e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3249e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3250e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_buffer_array_ip == NULL)
3251e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3252e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        // input buffer info array not allocated; allocate here
3253e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3254e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_HIGH("allocating buffer info array, %d element%s",
3255e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            m_port_ip.def.nBufferCountActual,
3256e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            (m_port_ip.def.nBufferCountActual > 1) ? "s" : "");
3257e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3258e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((retval = buffer_allocate_ip_info_array()) != OMX_ErrorNone)
3259e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
3260e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            goto buffer_allocate_ip_exit;
3261e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
3262e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3263e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3264e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    for (ii = 0; ii < m_port_ip.def.nBufferCountActual; ii++)
3265e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3266e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_buffer_array_ip[ii].buffer_populated == false)
3267e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
3268e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_LOW("buffer %d not populated", ii);
3269e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
3270e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
3271e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3272e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3273e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (ii < m_port_ip.def.nBufferCountActual)
3274e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3275e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        int pmem_fd = -1;
3276e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3277e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        unsigned char *bufferaddr;
3278e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_HIGH("ip buffer %d: %d bytes being allocated",
3280e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            ii,
3281e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            size);
3282e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3283e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_buffer_array_ip[ii].ion_info.ion_fd_device =
3284e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            ion_memory_alloc_map(&m_buffer_array_ip[ii].ion_info.ion_alloc_data,
3285e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 &m_buffer_array_ip[ii].ion_info.ion_fd_data,
3286e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 size,
3287e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 m_port_ip.def.nBufferAlignment);
3288e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3289e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_buffer_array_ip[ii].ion_info.ion_fd_device < 0)
3290e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
3291e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorInsufficientResources;
3292e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            goto buffer_allocate_ip_exit;
3293e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
3294e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3295e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        pmem_fd = m_buffer_array_ip[ii].ion_info.ion_fd_data.fd;
3296e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3297e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        bufferaddr = (unsigned char *) mmap(NULL,
3298e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                            size,
3299e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                            PROT_READ | PROT_WRITE,
3300e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                            MAP_SHARED,
3301e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                            pmem_fd,
3302e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                            0);
3303e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3304e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (bufferaddr == MAP_FAILED)
3305e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
3306e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("mmap() failed for fd %d of size %d",
3307e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 pmem_fd,
3308e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 size);
3309e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            close(pmem_fd);
3310e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            ion_memory_free(&m_buffer_array_ip[ii].ion_info);
3311e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorInsufficientResources;
3312e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            goto buffer_allocate_ip_exit;
3313e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
3314e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3315e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        *pp_buffer_hdr = &m_buffer_array_ip[ii].buffer_header;
3316e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3317e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_buffer_array_ip[ii].buffer_payload.bufferaddr  = bufferaddr;
3318e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_buffer_array_ip[ii].buffer_payload.pmem_fd     = pmem_fd;
3319e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_buffer_array_ip[ii].buffer_payload.buffer_len  = size;
3320e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_buffer_array_ip[ii].buffer_payload.mmaped_size = size;
3321e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_buffer_array_ip[ii].buffer_payload.offset      = 0;
3322e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3323e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_buffer_array_ip[ii].buffer_swvdec.p_buffer      = bufferaddr;
3324e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_buffer_array_ip[ii].buffer_swvdec.size          = size;
3325e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_buffer_array_ip[ii].buffer_swvdec.p_client_data =
3326e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (void *) ((unsigned long) ii);
3327e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3328e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_buffer_array_ip[ii].buffer_populated = true;
3329e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3330e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_HIGH("ip buffer %d: %p, %d bytes",
3331e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            ii,
3332e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            bufferaddr,
3333e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            size);
3334e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3335e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        (*pp_buffer_hdr)->pBuffer           = (OMX_U8 *) bufferaddr;
3336e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        (*pp_buffer_hdr)->nSize             = sizeof(OMX_BUFFERHEADERTYPE);
3337e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        (*pp_buffer_hdr)->nVersion.nVersion = OMX_SPEC_VERSION;
3338e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        (*pp_buffer_hdr)->nAllocLen         = size;
3339e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        (*pp_buffer_hdr)->pAppPrivate       = p_app_data;
3340e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        (*pp_buffer_hdr)->nInputPortIndex   = OMX_CORE_PORT_INDEX_IP;
3341e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        (*pp_buffer_hdr)->pInputPortPrivate =
3342e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (void *) &(m_buffer_array_ip[ii].buffer_payload);
3343e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3344e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_port_ip.populated   = port_ip_populated();
3345e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_port_ip.unpopulated = OMX_FALSE;
3346e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3347e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
3348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("all %d ip buffers allocated",
3350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             m_port_ip.def.nBufferCountActual);
3351e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInsufficientResources;
3352e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3353e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3354e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbuffer_allocate_ip_exit:
3355e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
3356e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
3357e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3358e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
3359e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Allocate output buffer, and output buffer info array if necessary.
3360e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
3361e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] pp_buffer_hdr: Pointer to pointer to buffer header type
3362e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *                               structure.
3363e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in]     p_app_data:    Pointer to IL client app data.
3364e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in]     size:          Size of buffer to be allocated in bytes.
3365e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
3366e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
3367e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
3368e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::buffer_allocate_op(
3369e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_BUFFERHEADERTYPE **pp_buffer_hdr,
3370e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_PTR                p_app_data,
3371e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_U32                size)
3372e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
3373e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
3374e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3375e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int ii;
3376e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3377e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (size != m_port_op.def.nBufferSize)
3378e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3379e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("requested size (%d bytes) not equal to "
3380e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             "configured size (%d bytes)",
3381e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             size,
3382e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             m_port_op.def.nBufferSize);
3383e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
3384e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto buffer_allocate_op_exit;
3385e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3386e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3387e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_buffer_array_op == NULL)
3388e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3389e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        // output buffer info array not allocated; allocate here
3390e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3391e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_HIGH("allocating buffer info array, %d element%s",
3392e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            m_port_op.def.nBufferCountActual,
3393e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            (m_port_op.def.nBufferCountActual > 1) ? "s" : "");
3394e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3395e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((retval = buffer_allocate_op_info_array()) != OMX_ErrorNone)
3396e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
3397e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            goto buffer_allocate_op_exit;
3398e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
3399e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3400e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3401e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    for (ii = 0; ii < m_port_op.def.nBufferCountActual; ii++)
3402e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3403e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_buffer_array_op[ii].buffer_populated == false)
3404e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
3405e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_LOW("buffer %d not populated", ii);
3406e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
3407e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
3408e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3409e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3410e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (ii < m_port_op.def.nBufferCountActual)
3411e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3412e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        int pmem_fd = -1;
3413e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3414e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        unsigned char *bufferaddr;
3415e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3416e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_HIGH("op buffer %d: %d bytes being allocated",
3417e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            ii,
3418e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            size);
3419e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3420e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_buffer_array_op[ii].ion_info.ion_fd_device =
3421e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            ion_memory_alloc_map(&m_buffer_array_op[ii].ion_info.ion_alloc_data,
3422e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 &m_buffer_array_op[ii].ion_info.ion_fd_data,
3423e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 size,
3424e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 m_port_op.def.nBufferAlignment);
3425e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3426e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_buffer_array_op[ii].ion_info.ion_fd_device < 0)
3427e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
3428e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorInsufficientResources;
3429e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            goto buffer_allocate_op_exit;
3430e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
3431e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3432e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        pmem_fd = m_buffer_array_op[ii].ion_info.ion_fd_data.fd;
3433e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3434e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        bufferaddr = (unsigned char *) mmap(NULL,
3435e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                            size,
3436e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                            PROT_READ | PROT_WRITE,
3437e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                            MAP_SHARED,
3438e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                            pmem_fd,
3439e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                            0);
3440e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3441e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (bufferaddr == MAP_FAILED)
3442e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
3443e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("mmap() failed for fd %d of size %d",
3444e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 pmem_fd,
3445e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 size);
3446e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            close(pmem_fd);
3447e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            ion_memory_free(&m_buffer_array_op[ii].ion_info);
3448e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorInsufficientResources;
3449e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            goto buffer_allocate_op_exit;
3450e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
3451e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3452e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        *pp_buffer_hdr = &m_buffer_array_op[ii].buffer_header;
3453e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3454e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_buffer_array_op[ii].buffer_payload.bufferaddr  = bufferaddr;
3455e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_buffer_array_op[ii].buffer_payload.pmem_fd     = pmem_fd;
3456e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_buffer_array_op[ii].buffer_payload.buffer_len  = size;
3457e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_buffer_array_op[ii].buffer_payload.mmaped_size = size;
3458e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_buffer_array_op[ii].buffer_payload.offset      = 0;
3459e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3460e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_buffer_array_op[ii].buffer_swvdec.p_buffer      = bufferaddr;
3461e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_buffer_array_op[ii].buffer_swvdec.size          = size;
3462e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_buffer_array_op[ii].buffer_swvdec.p_client_data =
3463e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (void *) ((unsigned long) ii);
3464e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3465e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_buffer_array_op[ii].buffer_populated = true;
3466e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3467e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_HIGH("op buffer %d: %p, %d bytes",
3468e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            ii,
3469e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            bufferaddr,
3470e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            size);
3471e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3472e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        (*pp_buffer_hdr)->pBuffer            = (OMX_U8 *) bufferaddr;
3473e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        (*pp_buffer_hdr)->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
3474e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        (*pp_buffer_hdr)->nVersion.nVersion  = OMX_SPEC_VERSION;
3475e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        (*pp_buffer_hdr)->nAllocLen          = size;
3476e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        (*pp_buffer_hdr)->pAppPrivate        = p_app_data;
3477e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        (*pp_buffer_hdr)->nOutputPortIndex   = OMX_CORE_PORT_INDEX_OP;
3478e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        (*pp_buffer_hdr)->pOutputPortPrivate =
3479e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (void *) &(m_buffer_array_op[ii].buffer_payload);
3480e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3481e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_port_op.populated   = port_op_populated();
3482e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_port_op.unpopulated = OMX_FALSE;
3483e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3484e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
3485e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3486e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("all %d op buffers allocated",
3487e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             m_port_op.def.nBufferCountActual);
3488e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInsufficientResources;
3489e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3490e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3491e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbuffer_allocate_op_exit:
3492e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
3493e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
3494e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3495e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
3496e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Allocate input buffer info array.
3497e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
3498e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::buffer_allocate_ip_info_array()
3499e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
3500e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
3501e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3502e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int ii;
3503e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3504e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_BUFFERHEADERTYPE *p_buffer_hdr;
3505e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3506e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_buffer_array_ip != NULL)
3507e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3508e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("buffer info array already allocated");
3509e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInsufficientResources;
3510e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto buffer_allocate_ip_hdr_exit;
3511e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3512e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3513e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    // input buffer info array not allocated; allocate here
3514e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3515e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_LOG_HIGH("allocating buffer info array, %d element%s",
3516e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        m_port_ip.def.nBufferCountActual,
3517e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        (m_port_ip.def.nBufferCountActual > 1) ? "s" : "");
3518e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3519e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_buffer_array_ip =
3520e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        (OMX_SWVDEC_BUFFER_INFO *) calloc(sizeof(OMX_SWVDEC_BUFFER_INFO),
3521e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          m_port_ip.def.nBufferCountActual);
3522e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3523e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_buffer_array_ip == NULL)
3524e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3525e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("failed to allocate buffer info array; "
3526e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             "%d element%s, %d bytes requested",
3527e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             m_port_ip.def.nBufferCountActual,
3528e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             (m_port_ip.def.nBufferCountActual > 1) ? "s" : "",
3529e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             sizeof(OMX_SWVDEC_BUFFER_INFO) *
3530e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             m_port_ip.def.nBufferCountActual);
3531e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInsufficientResources;
3532e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto buffer_allocate_ip_hdr_exit;
3533e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3534e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3535e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    for (ii = 0; ii < m_port_ip.def.nBufferCountActual; ii++)
3536e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3537e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_buffer_hdr = &m_buffer_array_ip[ii].buffer_header;
3538e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3539e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        // reset file descriptors
3540e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3541e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_buffer_array_ip[ii].buffer_payload.pmem_fd = -1;
3542e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_buffer_array_ip[ii].ion_info.ion_fd_device = -1;
3543e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3544e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_buffer_array_ip[ii].buffer_swvdec.p_client_data =
3545e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (void *) ((unsigned long) ii);
3546e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3547e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_buffer_hdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
3548e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_buffer_hdr->nVersion.nVersion  = OMX_SPEC_VERSION;
3549e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_buffer_hdr->nOutputPortIndex   = OMX_CORE_PORT_INDEX_IP;
3550e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_buffer_hdr->pOutputPortPrivate =
3551e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (void *) &(m_buffer_array_ip[ii].buffer_payload);
3552e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3553e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3554e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbuffer_allocate_ip_hdr_exit:
3555e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
3556e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
3557e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3558e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
3559e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Allocate output buffer info array.
3560e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
3561e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::buffer_allocate_op_info_array()
3562e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
3563e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
3564e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3565e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int ii;
3566e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3567e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_BUFFERHEADERTYPE *p_buffer_hdr;
3568e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3569e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_buffer_array_op != NULL)
3570e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3571e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("buffer info array already allocated");
3572e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInsufficientResources;
3573e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto buffer_allocate_op_hdr_exit;
3574e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3575e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3576e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    // output buffer info array not allocated; allocate here
3577e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3578e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_LOG_HIGH("allocating buffer info array, %d element%s",
3579e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        m_port_op.def.nBufferCountActual,
3580e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        (m_port_op.def.nBufferCountActual > 1) ? "s" : "");
3581e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3582e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_buffer_array_op =
3583e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        (OMX_SWVDEC_BUFFER_INFO *) calloc(sizeof(OMX_SWVDEC_BUFFER_INFO),
3584e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          m_port_op.def.nBufferCountActual);
3585e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3586e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_buffer_array_op == NULL)
3587e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3588e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("failed to allocate buffer info array; "
3589e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             "%d element%s, %d bytes requested",
3590e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             m_port_op.def.nBufferCountActual,
3591e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             (m_port_op.def.nBufferCountActual > 1) ? "s" : "",
3592e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             sizeof(OMX_SWVDEC_BUFFER_INFO) *
3593e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             m_port_op.def.nBufferCountActual);
3594e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInsufficientResources;
3595e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto buffer_allocate_op_hdr_exit;
3596e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3597e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3598e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    for (ii = 0; ii < m_port_op.def.nBufferCountActual; ii++)
3599e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3600e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_buffer_hdr = &m_buffer_array_op[ii].buffer_header;
3601e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3602e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        // reset file descriptors
3603e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3604e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_buffer_array_op[ii].buffer_payload.pmem_fd = -1;
3605e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_buffer_array_op[ii].ion_info.ion_fd_device = -1;
3606e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3607e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_buffer_array_op[ii].buffer_swvdec.p_client_data =
3608e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (void *) ((unsigned long) ii);
3609e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3610e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_buffer_hdr->nSize              = sizeof(OMX_BUFFERHEADERTYPE);
3611e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_buffer_hdr->nVersion.nVersion  = OMX_SPEC_VERSION;
3612e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_buffer_hdr->nOutputPortIndex   = OMX_CORE_PORT_INDEX_OP;
3613e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_buffer_hdr->pOutputPortPrivate =
3614e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (void *) &(m_buffer_array_op[ii].buffer_payload);
3615e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3616e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3617e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbuffer_allocate_op_hdr_exit:
3618e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
3619e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
3620e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3621e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
3622e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Use buffer allocated by IL client; allocate output buffer info array
3623e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *        if necessary.
3624e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
3625e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] pp_buffer_hdr: Pointer to pointer to buffer header type
3626e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *                               structure.
3627e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in]     p_app_data:    Pointer to IL client app data.
3628e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in]     size:          Size of buffer to be allocated in bytes.
3629e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in]     p_buffer:      Pointer to buffer to be used.
3630e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
3631e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
3632e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
3633e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::buffer_use_op(
3634e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_BUFFERHEADERTYPE **pp_buffer_hdr,
3635e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_PTR                p_app_data,
3636e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_U32                size,
3637e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_U8                *p_buffer)
3638e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
3639e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
3640e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3641e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int ii;
3642e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3643e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    (void) size;
3644e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3645e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_buffer_array_op == NULL)
3646e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3647e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        // output buffer info array not allocated; allocate here
3648e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3649e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_HIGH("allocating buffer info array, %d element%s",
3650e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            m_port_op.def.nBufferCountActual,
3651e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            (m_port_op.def.nBufferCountActual > 1) ? "s" : "");
3652e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3653e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((retval = buffer_allocate_op_info_array()) != OMX_ErrorNone)
3654e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
3655e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            goto buffer_use_op_exit;
3656e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
3657e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3658e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3659e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_meta_buffer_mode && (m_meta_buffer_array == NULL))
3660e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3661e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        // meta buffer info array not allocated; allocate here
3662e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3663e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_HIGH("allocating meta buffer info array, %d element%s",
3664e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            m_port_op.def.nBufferCountActual,
3665e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            (m_port_op.def.nBufferCountActual > 1) ? "s" : "");
3666e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3667e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((retval = meta_buffer_array_allocate()) != OMX_ErrorNone)
3668e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
3669e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            goto buffer_use_op_exit;
3670e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
3671e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3672e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3673e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    for (ii = 0; ii < m_port_op.def.nBufferCountActual; ii++)
3674e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3675e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_buffer_array_op[ii].buffer_populated == false)
3676e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
3677e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_LOW("buffer %d not populated", ii);
3678e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
3679e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
3680e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3681e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3682e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (ii < m_port_op.def.nBufferCountActual)
3683e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3684e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        struct vdec_bufferpayload *p_buffer_payload;
3685e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3686e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        SWVDEC_BUFFER *p_buffer_swvdec;
3687e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3688e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        *pp_buffer_hdr   = &m_buffer_array_op[ii].buffer_header;
3689e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_buffer_payload = &m_buffer_array_op[ii].buffer_payload;
3690e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_buffer_swvdec  = &m_buffer_array_op[ii].buffer_swvdec;
3691e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3692e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_meta_buffer_mode)
3693e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
3694e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_swvdec->size          = m_port_op.def.nBufferSize;
3695e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_swvdec->p_client_data = (void *) ((unsigned long) ii);
3696e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3697e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_buffer_array_op[ii].buffer_populated = true;
3698e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3699e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (*pp_buffer_hdr)->pBuffer     = p_buffer;
3700e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (*pp_buffer_hdr)->pAppPrivate = p_app_data;
3701e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (*pp_buffer_hdr)->nAllocLen   =
3702e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                sizeof(struct VideoDecoderOutputMetaData);
3703e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3704e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_HIGH("op buffer %d: %p (meta buffer)",
3705e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                ii,
3706e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                *pp_buffer_hdr);
3707e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3708e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_port_op.populated   = port_op_populated();
3709e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_port_op.unpopulated = OMX_FALSE;
3710e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
3711e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else if (m_android_native_buffers)
3712e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
3713e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            private_handle_t *p_handle;
3714e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3715e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_U8 *p_buffer_mapped;
3716e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3717e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_handle = (private_handle_t *) p_buffer;
3718e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3719e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (((OMX_U32) p_handle->size) < m_port_op.def.nBufferSize)
3720e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
3721e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_SWVDEC_LOG_ERROR("requested size (%d bytes) not equal to "
3722e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     "configured size (%d bytes)",
3723e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     p_handle->size,
3724e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     m_port_op.def.nBufferSize);
3725e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3726e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                retval = OMX_ErrorBadParameter;
3727e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                goto buffer_use_op_exit;
3728e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
3729e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3730e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_port_op.def.nBufferSize = p_handle->size;
3731e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3732e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_mapped = (OMX_U8 *) mmap(NULL,
3733e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                              p_handle->size,
3734e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                              PROT_READ | PROT_WRITE,
3735e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                              MAP_SHARED,
3736e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                              p_handle->fd,
3737e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                              0);
3738e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3739e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (p_buffer_mapped == MAP_FAILED)
3740e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
3741e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_SWVDEC_LOG_ERROR("mmap() failed for fd %d of size %d",
3742e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     p_handle->fd,
3743e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     p_handle->size);
3744e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3745e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                retval = OMX_ErrorInsufficientResources;
3746e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                goto buffer_use_op_exit;
3747e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
3748e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3749e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_payload->bufferaddr  = p_buffer_mapped;
3750e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_payload->pmem_fd     = p_handle->fd;
3751e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_payload->buffer_len  = p_handle->size;
3752e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_payload->mmaped_size = p_handle->size;
3753e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_payload->offset      = 0;
3754e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3755e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_swvdec->p_buffer      = p_buffer_mapped;
3756e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_swvdec->size          = m_port_op.def.nBufferSize;
3757e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_swvdec->p_client_data = (void *) ((unsigned long) ii);
3758e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3759e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_buffer_array_op[ii].buffer_populated = true;
3760e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3761e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (*pp_buffer_hdr)->pBuffer     = (m_android_native_buffers ?
3762e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                             ((OMX_U8 *) p_handle) :
3763e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                             p_buffer_mapped);
3764e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (*pp_buffer_hdr)->pAppPrivate = p_app_data;
3765e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (*pp_buffer_hdr)->nAllocLen   = m_port_op.def.nBufferSize;
3766e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3767e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_buffer_array_op[ii].ion_info.ion_fd_data.fd = p_handle->fd;
3768e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3769e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_HIGH("op buffer %d: %p",
3770e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                ii,
3771e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                *pp_buffer_hdr);
3772e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3773e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_port_op.populated   = port_op_populated();
3774e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_port_op.unpopulated = OMX_FALSE;
3775e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
3776e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
3777e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
3778e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("neither 'meta buffer mode' nor "
3779e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 "'android native buffers' enabled");
3780e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorBadParameter;
3781e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
3782e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3783e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
3784e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3785e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("all %d op buffers populated",
3786e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             m_port_op.def.nBufferCountActual);
3787e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInsufficientResources;
3788e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3789e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3790e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbuffer_use_op_exit:
3791e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
3792e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
3793e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3794e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
3795e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief De-allocate input buffer.
3796e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
3797e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_buffer_hdr: Pointer to buffer header structure.
3798e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
3799e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
3800e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
3801e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::buffer_deallocate_ip(
3802e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_BUFFERHEADERTYPE *p_buffer_hdr)
3803e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
3804e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
3805e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3806e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int ii;
3807e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3808e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (p_buffer_hdr == NULL)
3809e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3810e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("p_buffer_hdr = NULL");
3811e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
3812e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto buffer_deallocate_ip_exit;
3813e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3814e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (m_buffer_array_ip == NULL)
3815e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3816e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("ip buffer array not allocated");
3817e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
3818e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto buffer_deallocate_ip_exit;
3819e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3820e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3821e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    for (ii = 0; ii < m_port_ip.def.nBufferCountActual; ii++)
3822e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3823e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (p_buffer_hdr == &(m_buffer_array_ip[ii].buffer_header))
3824e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
3825e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_LOW("%p has index %d",
3826e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               p_buffer_hdr->pBuffer,
3827e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               ii);
3828e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
3829e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
3830e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3831e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3832e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (ii < m_port_ip.def.nBufferCountActual)
3833e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3834e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_buffer_array_ip[ii].buffer_payload.pmem_fd > 0)
3835e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
3836e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_buffer_array_ip[ii].buffer_populated = false;
3837e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3838e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_port_ip.populated = OMX_FALSE;
3839e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3840e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            munmap(m_buffer_array_ip[ii].buffer_payload.bufferaddr,
3841e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                   m_buffer_array_ip[ii].buffer_payload.mmaped_size);
3842e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3843e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            close(m_buffer_array_ip[ii].buffer_payload.pmem_fd);
3844e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_buffer_array_ip[ii].buffer_payload.pmem_fd = -1;
3845e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3846e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            ion_memory_free(&m_buffer_array_ip[ii].ion_info);
3847e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3848e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            // check if all buffers are unpopulated
3849e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            for (ii = 0; ii < m_port_ip.def.nBufferCountActual; ii++)
3850e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
3851e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                if (m_buffer_array_ip[ii].buffer_populated)
3852e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    break;
3853e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
3854e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3855e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            // if no buffers are populated, de-allocate input buffer info array
3856e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (ii == m_port_ip.def.nBufferCountActual)
3857e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
3858e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                buffer_deallocate_ip_info_array();
3859e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_port_ip.unpopulated = OMX_TRUE;
3860e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
3861e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
3862e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
3863e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
3864e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("%p: pmem_fd %d",
3865e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 p_buffer_hdr->pBuffer,
3866e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 m_buffer_array_ip[ii].buffer_payload.pmem_fd);
3867e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
3868e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3869e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
3870e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3871e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("%p not found", p_buffer_hdr->pBuffer);
3872e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
3873e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3874e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3875e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbuffer_deallocate_ip_exit:
3876e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
3877e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
3878e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3879e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
3880e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief De-allocate output buffer.
3881e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
3882e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_buffer_hdr: Pointer to buffer header structure.
3883e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
3884e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
3885e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
3886e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::buffer_deallocate_op(
3887e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_BUFFERHEADERTYPE *p_buffer_hdr)
3888e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
3889e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
3890e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3891e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int ii;
3892e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3893e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (p_buffer_hdr == NULL)
3894e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3895e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("p_buffer_hdr = NULL");
3896e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
3897e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto buffer_deallocate_op_exit;
3898e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3899e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (m_buffer_array_op == NULL)
3900e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3901e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("op buffer array not allocated");
3902e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
3903e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto buffer_deallocate_op_exit;
3904e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3905e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3906e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    for (ii = 0; ii < m_port_op.def.nBufferCountActual; ii++)
3907e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3908e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (p_buffer_hdr == &(m_buffer_array_op[ii].buffer_header))
3909e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
3910e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_LOW("%p has index %d",
3911e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               p_buffer_hdr->pBuffer,
3912e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               ii);
3913e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
3914e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
3915e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3916e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3917e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (ii < m_port_op.def.nBufferCountActual)
3918e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3919e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        assert(m_buffer_array_op[ii].buffer_payload.pmem_fd > 0);
3920e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3921e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_meta_buffer_mode)
3922e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
3923e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            // do nothing; munmap() & close() done in FBD or RR
3924e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
3925e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else if (m_android_native_buffers)
3926e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
3927e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            munmap(m_buffer_array_op[ii].buffer_payload.bufferaddr,
3928e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                   m_buffer_array_op[ii].buffer_payload.mmaped_size);
3929e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_buffer_array_op[ii].buffer_payload.pmem_fd = -1;
3930e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
3931e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else if (m_sync_frame_decoding_mode)
3932e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
3933e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            munmap(m_buffer_array_op[ii].buffer_payload.bufferaddr,
3934e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                   m_buffer_array_op[ii].buffer_payload.mmaped_size);
3935e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            close(m_buffer_array_op[ii].buffer_payload.pmem_fd);
3936e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_buffer_array_op[ii].buffer_payload.pmem_fd = -1;
3937e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            ion_memory_free(&m_buffer_array_op[ii].ion_info);
3938e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
3939e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
3940e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
3941e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            assert(0);
3942e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
3943e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3944e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_buffer_array_op[ii].buffer_populated = false;
3945e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3946e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_port_op.populated = OMX_FALSE;
3947e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3948e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        // check if all buffers are unpopulated
3949e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        for (ii = 0; ii < m_port_op.def.nBufferCountActual; ii++)
3950e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
3951e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (m_buffer_array_op[ii].buffer_populated)
3952e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                break;
3953e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
3954e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3955e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        // if no buffers are populated, de-allocate output buffer info array
3956e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (ii == m_port_op.def.nBufferCountActual)
3957e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
3958e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            buffer_deallocate_op_info_array();
3959e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_port_op.unpopulated = OMX_TRUE;
3960e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3961e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (m_meta_buffer_mode)
3962e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
3963e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                meta_buffer_array_deallocate();
3964e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
3965e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
3966e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3967e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
3968e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
3969e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("%p not found", p_buffer_hdr->pBuffer);
3970e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
3971e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
3972e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3973e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbuffer_deallocate_op_exit:
3974e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
3975e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
3976e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3977e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
3978e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief De-allocate input buffer info array.
3979e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
3980e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_swvdec::buffer_deallocate_ip_info_array()
3981e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
3982e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    assert(m_buffer_array_ip != NULL);
3983e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3984e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    free(m_buffer_array_ip);
3985e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_buffer_array_ip = NULL;
3986e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
3987e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3988e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
3989e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief De-allocate output buffer info array.
3990e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
3991e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_swvdec::buffer_deallocate_op_info_array()
3992e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
3993e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    assert(m_buffer_array_op != NULL);
3994e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3995e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    free(m_buffer_array_op);
3996e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_buffer_array_op = NULL;
3997e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
3998e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
3999e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
4000e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Allocate meta buffer info array.
4001e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
4002e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
4003e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
4004e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::meta_buffer_array_allocate()
4005e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
4006e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
4007e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4008e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_meta_buffer_array = ((OMX_SWVDEC_META_BUFFER_INFO *)
4009e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           calloc(sizeof(OMX_SWVDEC_META_BUFFER_INFO),
4010e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                  m_port_op.def.nBufferCountActual));
4011e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4012e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_meta_buffer_array == NULL)
4013e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4014e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("failed to allocate meta_buffer info array; "
4015e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             "%d element%s, %d bytes requested",
4016e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             m_port_op.def.nBufferCountActual,
4017e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             (m_port_op.def.nBufferCountActual > 1) ? "s" : "",
4018e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             sizeof(OMX_SWVDEC_META_BUFFER_INFO) *
4019e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             m_port_op.def.nBufferCountActual);
4020e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4021e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInsufficientResources;
4022e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4023e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4024e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
4025e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
4026e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4027e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
4028e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief De-allocate meta buffer info array.
4029e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
4030e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_swvdec::meta_buffer_array_deallocate()
4031e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
4032e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    assert(m_meta_buffer_array != NULL);
4033e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4034e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    free(m_meta_buffer_array);
4035e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_meta_buffer_array = NULL;
4036e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
4037e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4038e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
4039e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Add meta buffer reference.
4040e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
4041e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] index:
4042e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] fd:
4043e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] offset:
4044e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
4045e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_swvdec::meta_buffer_ref_add(unsigned int index,
4046e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     unsigned int fd,
4047e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     unsigned int offset)
4048e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
4049e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    pthread_mutex_lock(&m_meta_buffer_array_mutex);
4050e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4051e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if ((m_meta_buffer_array[index].dup_fd != 0) &&
4052e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        (m_meta_buffer_array[index].fd     != fd) &&
4053e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        (m_meta_buffer_array[index].offset != offset))
4054e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4055e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_LOW("index %d taken by fd %d, offset %d",
4056e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           index,
4057e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           m_meta_buffer_array[index].fd,
4058e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           m_meta_buffer_array[index].offset);
4059e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4060e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
4061e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4062e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_meta_buffer_array[index].dup_fd == 0)
4063e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
4064e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_meta_buffer_array[index].fd     = fd;
4065e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_meta_buffer_array[index].dup_fd = dup(fd);
4066e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_meta_buffer_array[index].offset = offset;
4067e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
4068e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4069e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_meta_buffer_array[index].ref_count++;
4070e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4071e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4072e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    pthread_mutex_unlock(&m_meta_buffer_array_mutex);
4073e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
4074e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4075e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
4076e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Remove meta buffer reference.
4077e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
4078e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] fd:
4079e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] offset:
4080e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
4081e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_swvdec::meta_buffer_ref_remove(unsigned int fd,
4082e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        unsigned int offset)
4083e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
4084e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int ii;
4085e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4086e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    pthread_mutex_lock(&m_meta_buffer_array_mutex);
4087e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4088e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    for (ii = 0; ii < m_port_op.def.nBufferCountActual; ii++)
4089e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4090e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((m_meta_buffer_array[ii].fd     == fd) &&
4091e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (m_meta_buffer_array[ii].offset == offset))
4092e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
4093e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_meta_buffer_array[ii].ref_count--;
4094e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4095e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (m_meta_buffer_array[ii].ref_count == 0)
4096e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
4097e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                close(m_meta_buffer_array[ii].dup_fd);
4098e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4099e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_meta_buffer_array[ii].fd = 0;
4100e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_meta_buffer_array[ii].dup_fd = 0;
4101e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_meta_buffer_array[ii].offset = 0;
4102e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4103e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                munmap(m_buffer_array_op[ii].buffer_payload.bufferaddr,
4104e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                       m_buffer_array_op[ii].buffer_payload.mmaped_size);
4105e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4106e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_buffer_array_op[ii].buffer_payload.bufferaddr  = NULL;
4107e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_buffer_array_op[ii].buffer_payload.offset      = 0;
4108e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_buffer_array_op[ii].buffer_payload.mmaped_size = 0;
4109e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4110e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_buffer_array_op[ii].buffer_swvdec.p_buffer = NULL;
4111e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_buffer_array_op[ii].buffer_swvdec.size     = 0;
4112e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
4113e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4114e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
4115e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
4116e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    assert(ii < m_port_op.def.nBufferCountActual);
4119e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4120e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    pthread_mutex_unlock(&m_meta_buffer_array_mutex);
4121e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
4122e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4123e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
4124e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Check if ip port is populated, i.e., if all ip buffers are populated.
4125e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
4126e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval  true
4127e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval false
4128e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
4129e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_BOOL omx_swvdec::port_ip_populated()
4130e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
4131e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_BOOL retval = OMX_FALSE;
4132e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4133e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_buffer_array_ip != NULL)
4134e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4135e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        unsigned int ii;
4136e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4137e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        for (ii = 0; ii < m_port_ip.def.nBufferCountActual; ii++)
4138e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
4139e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (m_buffer_array_ip[ii].buffer_populated == false)
4140e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
4141e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                break;
4142e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
4143e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
4144e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4145e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (ii == m_port_ip.def.nBufferCountActual)
4146e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
4147e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_TRUE;
4148e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
4149e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4150e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4151e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
4152e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
4153e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4154e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
4155e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Check if op port is populated, i.e., if all op buffers are populated.
4156e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
4157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval  true
4158e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval false
4159e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
4160e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_BOOL omx_swvdec::port_op_populated()
4161e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
4162e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_BOOL retval = OMX_FALSE;
4163e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4164e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_buffer_array_op != NULL)
4165e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4166e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        unsigned int ii;
4167e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4168e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        for (ii = 0; ii < m_port_op.def.nBufferCountActual; ii++)
4169e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
4170e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (m_buffer_array_op[ii].buffer_populated == false)
4171e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
4172e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                break;
4173e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
4174e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
4175e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4176e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (ii == m_port_op.def.nBufferCountActual)
4177e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
4178e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_TRUE;
4179e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
4180e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4181e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4182e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
4183e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
4184e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4185e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
4186e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Flush input, output, or both input & output ports.
4187e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
4188e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] port_index: Index of port to flush.
4189e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
4190e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
4191e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
4192e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::flush(unsigned int port_index)
4193e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
4194e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
4195e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4196e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (((port_index == OMX_CORE_PORT_INDEX_IP) &&
4197e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         m_port_ip.flush_inprogress) ||
4198e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        ((port_index == OMX_CORE_PORT_INDEX_OP) &&
4199e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         m_port_op.flush_inprogress) ||
4200e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        ((port_index == OMX_ALL) &&
4201e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         m_port_ip.flush_inprogress &&
4202e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         m_port_op.flush_inprogress))
4203e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4204e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_HIGH("flush port %d already in progress", port_index);
4205e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4206e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
4207e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4208e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        SWVDEC_FLUSH_TYPE swvdec_flush_type;
4209e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4210e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        SWVDEC_STATUS retval_swvdec;
4211e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4212e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (port_index == OMX_CORE_PORT_INDEX_IP)
4213e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
4214e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_port_ip.flush_inprogress = OMX_TRUE;
4215e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4216e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            // no separate SwVdec flush type for input
4217e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
4218e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else if (port_index == OMX_CORE_PORT_INDEX_OP)
4219e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
4220e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_port_op.flush_inprogress = OMX_TRUE;
4221e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4222e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            swvdec_flush_type = (m_port_ip.flush_inprogress ?
4223e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 SWVDEC_FLUSH_TYPE_ALL :
4224e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                 SWVDEC_FLUSH_TYPE_OP);
4225e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4226e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if ((retval_swvdec = swvdec_flush(m_swvdec_handle,
4227e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                              swvdec_flush_type)) !=
4228e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                SWVDEC_STATUS_SUCCESS)
4229e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
4230e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                retval = retval_swvdec2omx(retval_swvdec);
4231e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
4232e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
4233e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else if (port_index == OMX_ALL)
4234e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
4235e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_port_ip.flush_inprogress = OMX_TRUE;
4236e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_port_op.flush_inprogress = OMX_TRUE;
4237e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4238e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            swvdec_flush_type = SWVDEC_FLUSH_TYPE_ALL;
4239e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4240e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if ((retval_swvdec = swvdec_flush(m_swvdec_handle,
4241e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                              swvdec_flush_type)) !=
4242e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                SWVDEC_STATUS_SUCCESS)
4243e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
4244e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                retval = retval_swvdec2omx(retval_swvdec);
4245e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
4246e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
4247e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
4248e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
4249e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            assert(0);
4250e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
4251e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4252e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4253e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
4254e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
4255e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4256e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
4257e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Allocate & map ION memory.
4258e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
4259e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinint omx_swvdec::ion_memory_alloc_map(struct ion_allocation_data *p_alloc_data,
4260e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     struct ion_fd_data         *p_fd_data,
4261e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     OMX_U32                     size,
4262e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     OMX_U32                     alignment)
4263e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
4264e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    int fd = -EINVAL;
4265e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    int rc = -EINVAL;
4266e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4267e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if ((p_alloc_data == NULL) || (p_fd_data == NULL) || (size == 0))
4268e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4269e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("invalid arguments");
4270e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto ion_memory_alloc_map_exit;
4271e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4272e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4273e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if ((fd = open("/dev/ion", O_RDONLY)) < 0)
4274e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4275e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("failed to open ion device; fd = %d", fd);
4276e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto ion_memory_alloc_map_exit;
4277e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4278e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    p_alloc_data->len   = size;
4280e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    p_alloc_data->align = (alignment < 4096) ? 4096 : alignment;
4281e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    p_alloc_data->heap_id_mask = ION_HEAP(ION_IOMMU_HEAP_ID);
4282e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    p_alloc_data->flags = 0;
4283e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4284e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_LOG_LOW("heap_id_mask 0x%08x, len %d, align %d",
4285e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                       p_alloc_data->heap_id_mask,
4286e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                       p_alloc_data->len,
4287e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                       p_alloc_data->align);
4288e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4289e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    rc = ioctl(fd, ION_IOC_ALLOC, p_alloc_data);
4290e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4291e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (rc || (p_alloc_data->handle == 0))
4292e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4293e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("ioctl() for allocation failed");
4294e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        close(fd);
4295e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        fd = -ENOMEM;
4296e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto ion_memory_alloc_map_exit;
4297e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4298e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4299e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    p_fd_data->handle = p_alloc_data->handle;
4300e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4301e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (ioctl(fd, ION_IOC_MAP, p_fd_data))
4302e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4303e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        struct vdec_ion ion_buf_info;
4304e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4305e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("ioctl() for mapping failed");
4306e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4307e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        ion_buf_info.ion_alloc_data = *p_alloc_data;
4308e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        ion_buf_info.ion_fd_device  = fd;
4309e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        ion_buf_info.ion_fd_data    = *p_fd_data;
4310e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4311e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        ion_memory_free(&ion_buf_info);
4312e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4313e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_fd_data->fd = -1;
4314e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        close(fd);
4315e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        fd = -ENOMEM;
4316e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto ion_memory_alloc_map_exit;
4317e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4318e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4319e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinion_memory_alloc_map_exit:
4320e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return fd;
4321e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
4322e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4323e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
4324e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Free ION memory.
4325e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
4326e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_swvdec::ion_memory_free(struct vdec_ion *p_ion_buf_info)
4327e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
4328e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (p_ion_buf_info == NULL)
4329e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4330e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("p_ion_buf_info = NULL");
4331e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto ion_memory_free_exit;
4332e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4333e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4334e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (ioctl(p_ion_buf_info->ion_fd_device,
4335e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin              ION_IOC_FREE,
4336e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin              &p_ion_buf_info->ion_alloc_data.handle))
4337e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4338e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("ioctl() for freeing failed");
4339e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4340e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4341e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    close(p_ion_buf_info->ion_fd_device);
4342e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4343e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    p_ion_buf_info->ion_fd_device         = -1;
4344e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    p_ion_buf_info->ion_alloc_data.handle =  0;
4345e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    p_ion_buf_info->ion_fd_data.fd        = -1;
4346e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4347e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinion_memory_free_exit:
4348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return;
4349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
4350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4351e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
4352e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * ----------------------------
4353e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * component callback functions
4354e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * ----------------------------
4355e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
4356e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4357e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
4358e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Empty buffer done callback.
4359e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
4360e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_buffer_ip: Pointer to input buffer structure.
4361e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
4362e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_swvdec::swvdec_empty_buffer_done(SWVDEC_BUFFER *p_buffer_ip)
4363e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
4364e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned long index = (unsigned long) p_buffer_ip->p_client_data;
4365e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4366e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    async_post_event(OMX_SWVDEC_EVENT_EBD,
4367e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                     (unsigned long) &m_buffer_array_ip[index].buffer_header,
4368e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                     index);
4369e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
4370e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4371e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
4372e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Fill buffer done callback.
4373e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
4374e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_buffer_op: Pointer to output buffer structure.
4375e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
4376e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_swvdec::swvdec_fill_buffer_done(SWVDEC_BUFFER *p_buffer_op)
4377e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
4378e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned long index = (unsigned long) p_buffer_op->p_client_data;
4379e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4380e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_BUFFERHEADERTYPE *p_buffer_hdr;
4381e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4382e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (index < ((unsigned long) m_port_op.def.nBufferCountActual))
4383e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4384e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_buffer_hdr = &m_buffer_array_op[index].buffer_header;
4385e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4386e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_buffer_hdr->nFlags     = p_buffer_op->flags;
4387e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_buffer_hdr->nTimeStamp = p_buffer_op->timestamp;
4388e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_buffer_hdr->nFilledLen = ((m_meta_buffer_mode &&
4389e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     p_buffer_op->filled_length) ?
4390e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                    p_buffer_hdr->nAllocLen :
4391e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                    p_buffer_op->filled_length);
4392e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4393e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4394e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    async_post_event(OMX_SWVDEC_EVENT_FBD,
4395e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                     (unsigned long) &m_buffer_array_op[index].buffer_header,
4396e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                     index);
4397e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
4398e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4399e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
4400e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Event handler callback.
4401e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
4402e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] event:  Event.
4403e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_data: Pointer to event-specific data.
4404e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
4405e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_swvdec::swvdec_event_handler(SWVDEC_EVENT event, void *p_data)
4406e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
4407e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    switch (event)
4408e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4409e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4410e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case SWVDEC_EVENT_FLUSH_ALL_DONE:
4411e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4412e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        async_post_event(OMX_SWVDEC_EVENT_FLUSH_PORT_IP, 0, 0);
4413e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        async_post_event(OMX_SWVDEC_EVENT_FLUSH_PORT_OP, 0, 0);
4414e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4415e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4416e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4417e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case SWVDEC_EVENT_FLUSH_OP_DONE:
4418e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4419e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        async_post_event(OMX_SWVDEC_EVENT_FLUSH_PORT_OP, 0, 0);
4420e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4421e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4422e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4423e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case SWVDEC_EVENT_RELEASE_REFERENCE:
4424e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4425e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        SWVDEC_BUFFER *p_buffer_op = (SWVDEC_BUFFER *) p_data;
4426e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4427e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        unsigned long index = (unsigned long) p_buffer_op->p_client_data;
4428e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4429e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_LOW("release reference: %p", p_buffer_op->p_buffer);
4430e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4431e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        assert(index < ((unsigned long) m_port_op.def.nBufferCountActual));
4432e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4433e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_meta_buffer_mode)
4434e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
4435e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            meta_buffer_ref_remove(
4436e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_buffer_array_op[index].buffer_payload.pmem_fd,
4437e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_buffer_array_op[index].buffer_payload.offset);
4438e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
4439e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4440e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4441e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4442e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4443e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case SWVDEC_EVENT_RECONFIG_REQUIRED:
4444e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4445e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        async_post_event(OMX_SWVDEC_EVENT_PORT_RECONFIG, 0, 0);
4446e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4447e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4448e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4449e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case SWVDEC_EVENT_FATAL_ERROR:
4450e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    default:
4451e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4452e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        async_post_event(OMX_SWVDEC_EVENT_ERROR, OMX_ErrorHardware, 0);
4453e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4454e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4455e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4456e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4457e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
4458e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4459e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
4460e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Translate SwVdec status return value to OMX error type return value.
4461e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
4462e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] retval_swvdec: SwVdec status return value.
4463e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
4464e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
4465e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
4466e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::retval_swvdec2omx(SWVDEC_STATUS retval_swvdec)
4467e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
4468e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval_omx;
4469e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4470e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    switch (retval_swvdec)
4471e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4472e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4473e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_STATUS_SUCCESS:
4474e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval_omx = OMX_ErrorNone;
4475e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4476e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4477e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_STATUS_FAILURE:
4478e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval_omx = OMX_ErrorUndefined;
4479e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4480e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4481e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_STATUS_NULL_POINTER:
4482e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_STATUS_INVALID_PARAMETERS:
4483e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval_omx = OMX_ErrorBadParameter;
4484e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4485e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4486e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_STATUS_INVALID_STATE:
4487e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval_omx = OMX_ErrorInvalidState;
4488e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4489e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4490e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_STATUS_INSUFFICIENT_RESOURCES:
4491e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval_omx = OMX_ErrorInsufficientResources;
4492e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4493e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4494e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_STATUS_UNSUPPORTED:
4495e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval_omx = OMX_ErrorUnsupportedSetting;
4496e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4497e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4498e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_STATUS_NOT_IMPLEMENTED:
4499e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval_omx = OMX_ErrorNotImplemented;
4500e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4501e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4502e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    default:
4503e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval_omx = OMX_ErrorUndefined;
4504e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4505e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4506e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4507e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4508e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval_omx;
4509e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
4510e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4511e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
4512e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Create asynchronous thread.
4513e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
4514e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
4515e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
4516e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_thread_create()
4517e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
4518e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
4519e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4520e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    pthread_attr_t thread_attributes;
4521e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4522e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (sem_init(&m_async_thread.sem_thread_created, 0, 0))
4523e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4524e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("failed to create async thread created semaphore");
4525e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInsufficientResources;
4526e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4527e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (sem_init(&m_async_thread.sem_event, 0, 0))
4528e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4529e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("failed to create async thread event semaphore");
4530e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInsufficientResources;
4531e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4532e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (pthread_attr_init(&thread_attributes))
4533e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4534e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("failed to create thread attributes object");
4535e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInsufficientResources;
4536e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4537e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (pthread_attr_setdetachstate(&thread_attributes,
4538e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                         PTHREAD_CREATE_JOINABLE))
4539e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4540e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("failed to set detach state attribute");
4541e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInsufficientResources;
4542e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4543e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        pthread_attr_destroy(&thread_attributes);
4544e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4545e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
4546e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4547e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_async_thread.created = false;
4548e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_async_thread.exit    = false;
4549e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4550e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (pthread_create(&m_async_thread.handle,
4551e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           &thread_attributes,
4552e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           (void *(*)(void *)) async_thread,
4553e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           this))
4554e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
4555e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("failed to create async thread");
4556e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorInsufficientResources;
4557e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4558e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            pthread_attr_destroy(&thread_attributes);
4559e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
4560e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
4561e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
4562e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (pthread_setname_np(m_async_thread.handle, "swvdec_async"))
4563e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
4564e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                // don't return error
4565e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_SWVDEC_LOG_ERROR("failed to set async thread name");
4566e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
4567e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4568e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            sem_wait(&m_async_thread.sem_thread_created);
4569e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_async_thread.created = true;
4570e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
4571e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4572e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4573e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
4574e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
4575e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4576e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
4577e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Destroy asynchronous thread.
4578e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
4579e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_swvdec::async_thread_destroy()
4580e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
4581e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_async_thread.created)
4582e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4583e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_async_thread.exit = true;
4584e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        sem_post(&m_async_thread.sem_event);
4585e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4586e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        pthread_join(m_async_thread.handle, NULL);
4587e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_async_thread.created = false;
4588e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4589e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4590e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_async_thread.exit = false;
4591e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4592e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    sem_destroy(&m_async_thread.sem_event);
4593e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    sem_destroy(&m_async_thread.sem_thread_created);
4594e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
4595e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4596e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
4597e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Post event to appropriate queue.
4598e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
4599e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] event_id:     Event ID.
4600e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] event_param1: Event parameter 1.
4601e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] event_param2: Event parameter 2.
4602e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
4603e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval  true if post event successful
4604e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval false if post event unsuccessful
4605e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
4606e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinbool omx_swvdec::async_post_event(unsigned long event_id,
4607e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                  unsigned long event_param1,
4608e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                  unsigned long event_param2)
4609e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
4610e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_EVENT_INFO event_info;
4611e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4612e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    bool retval = true;
4613e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4614e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    event_info.event_id     = event_id;
4615e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    event_info.event_param1 = event_param1;
4616e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    event_info.event_param2 = event_param2;
4617e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4618e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    switch (event_id)
4619e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4620e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4621e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_SWVDEC_EVENT_ETB:
4622e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_SWVDEC_EVENT_EBD:
4623e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4624e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = m_queue_port_ip.push(&event_info);
4625e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4626e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4627e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4628e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_SWVDEC_EVENT_FTB:
4629e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_SWVDEC_EVENT_FBD:
4630e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4631e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = m_queue_port_op.push(&event_info);
4632e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4633e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4634e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4635e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    default:
4636e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4637e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = m_queue_command.push(&event_info);
4638e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4639e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4640e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4641e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4642e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4643e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (retval == true)
4644e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4645e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        sem_post(&m_async_thread.sem_event);
4646e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4647e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4648e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
4649e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
4650e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4651e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
4652e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Asynchronous thread.
4653e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
4654e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_cmp: Pointer to OMX SwVdec component class.
4655e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
4656e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_swvdec::async_thread(void *p_cmp)
4657e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
4658e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (p_cmp == NULL)
4659e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4660e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("p_cmp = NULL");
4661e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4662e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
4663e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4664e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        omx_swvdec *p_omx_swvdec = (omx_swvdec *) p_cmp;
4665e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4666e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        ASYNC_THREAD *p_async_thread = &p_omx_swvdec->m_async_thread;
4667e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4668e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_HIGH("created");
4669e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4670e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        sem_post(&p_async_thread->sem_thread_created);
4671e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4672e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        while (p_async_thread->exit == false)
4673e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
4674e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            sem_wait(&p_async_thread->sem_event);
4675e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4676e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (p_async_thread->exit == true)
4677e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
4678e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                break;
4679e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
4680e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4681e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_omx_swvdec->async_process_event(p_cmp);
4682e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
4683e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4684e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4685e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_LOG_HIGH("exiting");
4686e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
4687e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4688e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
4689e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process event.
4690e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
4691e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_cmp: Pointer to OMX SwVdec component class.
4692e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
4693e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinvoid omx_swvdec::async_process_event(void *p_cmp)
4694e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
4695e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    omx_swvdec *p_omx_swvdec;
4696e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4697e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_EVENT_INFO event_info;
4698e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4699e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
4700e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4701e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (p_cmp == NULL)
4702e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4703e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("p_cmp = NULL");
4704e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto async_process_event_exit;
4705e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4706e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4707e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    p_omx_swvdec = (omx_swvdec *) p_cmp;
4708e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4709e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    // NOTE: queues popped in order of priority; do not change!
4710e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4711e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if ((p_omx_swvdec->m_queue_command.pop(&event_info) == false) &&
4712e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        (p_omx_swvdec->m_queue_port_op.pop(&event_info) == false) &&
4713e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        (p_omx_swvdec->m_queue_port_ip.pop(&event_info) == false))
4714e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4715e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_LOW("no event popped");
4716e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        goto async_process_event_exit;
4717e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4718e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4719e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    switch (event_info.event_id)
4720e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4721e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4722e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_SWVDEC_EVENT_CMD:
4723e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4724e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_COMMANDTYPE cmd   = (OMX_COMMANDTYPE) event_info.event_param1;
4725e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_U32         param = (OMX_U32)         event_info.event_param2;
4726e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4727e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = p_omx_swvdec->async_process_event_cmd(cmd, param);
4728e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4729e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4730e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4731e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_SWVDEC_EVENT_CMD_ACK:
4732e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4733e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_COMMANDTYPE cmd   = (OMX_COMMANDTYPE) event_info.event_param1;
4734e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_U32         param = (OMX_U32)         event_info.event_param2;
4735e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4736e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = p_omx_swvdec->async_process_event_cmd_ack(cmd, param);
4737e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4738e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4739e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4740e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_SWVDEC_EVENT_ERROR:
4741e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4742e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_ERRORTYPE error_code = (OMX_ERRORTYPE) event_info.event_param1;
4743e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4744e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = p_omx_swvdec->async_process_event_error(error_code);
4745e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4746e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4747e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4748e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_SWVDEC_EVENT_ETB:
4749e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4750e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_BUFFERHEADERTYPE *p_buffer_hdr =
4751e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (OMX_BUFFERHEADERTYPE *) event_info.event_param1;
4752e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4753e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        unsigned int index = event_info.event_param2;
4754e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4755e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = p_omx_swvdec->async_process_event_etb(p_buffer_hdr, index);
4756e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4757e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4758e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4759e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_SWVDEC_EVENT_FTB:
4760e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4761e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_BUFFERHEADERTYPE *p_buffer_hdr =
4762e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (OMX_BUFFERHEADERTYPE *) event_info.event_param1;
4763e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4764e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        unsigned int index = event_info.event_param2;
4765e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4766e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = p_omx_swvdec->async_process_event_ftb(p_buffer_hdr, index);
4767e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4768e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4769e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4770e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_SWVDEC_EVENT_EBD:
4771e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4772e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_BUFFERHEADERTYPE *p_buffer_hdr =
4773e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (OMX_BUFFERHEADERTYPE *) event_info.event_param1;
4774e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4775e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        unsigned int index = event_info.event_param2;
4776e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4777e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = p_omx_swvdec->async_process_event_ebd(p_buffer_hdr, index);
4778e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4779e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4780e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4781e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_SWVDEC_EVENT_FBD:
4782e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4783e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_BUFFERHEADERTYPE *p_buffer_hdr =
4784e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (OMX_BUFFERHEADERTYPE *) event_info.event_param1;
4785e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4786e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        unsigned int index = event_info.event_param2;
4787e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4788e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = p_omx_swvdec->async_process_event_fbd(p_buffer_hdr, index);
4789e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4790e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4791e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4792e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_SWVDEC_EVENT_EOS:
4793e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4794e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = p_omx_swvdec->async_process_event_eos();
4795e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4796e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4797e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4798e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_SWVDEC_EVENT_FLUSH_PORT_IP:
4799e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4800e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = p_omx_swvdec->async_process_event_flush_port_ip();
4801e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4802e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4803e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4804e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_SWVDEC_EVENT_FLUSH_PORT_OP:
4805e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4806e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = p_omx_swvdec->async_process_event_flush_port_op();
4807e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4808e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4809e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4810e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_SWVDEC_EVENT_PORT_RECONFIG:
4811e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4812e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = p_omx_swvdec->async_process_event_port_reconfig();
4813e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4814e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4815e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4816e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    default:
4817e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4818e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        assert(0);
4819e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorUndefined;
4820e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4821e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4822e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4823e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4824e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4825e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (retval != OMX_ErrorNone)
4826e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4827e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_omx_swvdec->async_post_event(OMX_SWVDEC_EVENT_ERROR, retval, 0);
4828e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4829e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4830e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinasync_process_event_exit:
4831e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return;
4832e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
4833e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4834e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
4835e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process command event.
4836e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
4837e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmd:   Command.
4838e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] param: Command parameter.
4839e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
4840e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
4841e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
4842e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_cmd(OMX_COMMANDTYPE cmd,
4843e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                  OMX_U32         param)
4844e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
4845e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
4846e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4847e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    bool cmd_ack = false; // set to 'true' if command is to be acknowledged
4848e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4849e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_STATUS retval_swvdec;
4850e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4851e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    switch (cmd)
4852e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4853e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4854e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_CommandStateSet:
4855e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4856e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = async_process_event_cmd_state_set(&cmd_ack,
4857e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                   (OMX_STATETYPE) param);
4858e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4859e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4860e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4861e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_CommandFlush:
4862e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4863e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = async_process_event_cmd_flush((unsigned int) param);
4864e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4865e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4866e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4867e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_CommandPortDisable:
4868e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4869e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = async_process_event_cmd_port_disable(&cmd_ack,
4870e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                      (unsigned int) param);
4871e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4872e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4873e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4874e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_CommandPortEnable:
4875e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4876e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = async_process_event_cmd_port_enable(&cmd_ack,
4877e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                     (unsigned int) param);
4878e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4879e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4880e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4881e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    default:
4882e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4883e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("cmd '%d' invalid", (int) cmd);
4884e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4885e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
4886e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4887e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4888e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4889e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    } // switch (cmd)
4890e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4891e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    // post appropriate event
4892e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4893e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (retval != OMX_ErrorNone)
4894e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4895e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        async_post_event(OMX_SWVDEC_EVENT_ERROR, retval, 0);
4896e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4897e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (cmd_ack)
4898e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4899e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        async_post_event(OMX_SWVDEC_EVENT_CMD_ACK, cmd, param);
4900e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4901e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4902e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    // post to command semaphore
4903e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    sem_post(&m_sem_cmd);
4904e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4905e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
4906e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
4907e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4908e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
4909e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process command acknowledgement event.
4910e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
4911e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] cmd:   Command.
4912e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] param: Command parameter.
4913e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
4914e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
4915e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
4916e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_cmd_ack(OMX_COMMANDTYPE cmd,
4917e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                      OMX_U32         param)
4918e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
4919e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
4920e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4921e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    switch (cmd)
4922e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4923e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4924e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_CommandStateSet:
4925e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4926e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_state = (OMX_STATETYPE) param;
4927e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4928e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_CALLBACK("EventHandler(): OMX_EventCmdComplete, "
4929e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                "OMX_CommandStateSet, %s",
4930e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                OMX_STATETYPE_STRING(m_state));
4931e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4932e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_callback.EventHandler(&m_cmp,
4933e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                m_app_data,
4934e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                OMX_EventCmdComplete,
4935e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                OMX_CommandStateSet,
4936e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                (OMX_U32) m_state,
4937e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                NULL);
4938e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4939e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4940e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4941e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_CommandFlush:
4942e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_CommandPortEnable:
4943e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    case OMX_CommandPortDisable:
4944e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4945e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((cmd == OMX_CommandPortEnable) && m_port_reconfig_inprogress)
4946e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
4947e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_port_reconfig_inprogress = false;
4948e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
4949e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4950e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_CALLBACK("EventHandler(): OMX_EventCmdComplete, "
4951e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                "%s, port index %d",
4952e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                OMX_COMMANDTYPE_STRING(cmd),
4953e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                param);
4954e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4955e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_callback.EventHandler(&m_cmp,
4956e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                m_app_data,
4957e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                OMX_EventCmdComplete,
4958e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                cmd,
4959e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                param,
4960e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                NULL);
4961e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4962e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4963e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4964e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    default:
4965e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4966e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("cmd '%d' invalid", (int) cmd);
4967e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
4968e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        break;
4969e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4970e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4971e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    } // switch (cmd)
4972e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4973e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
4974e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
4975e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4976e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
4977e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process error event.
4978e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
4979e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] error_code: Error code.
4980e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
4981e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ErrorNone
4982e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
4983e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_error(OMX_ERRORTYPE error_code)
4984e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
4985e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (error_code == OMX_ErrorInvalidState)
4986e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
4987e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_state = OMX_StateInvalid;
4988e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
4989e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4990e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_LOG_CALLBACK("EventHandler(): OMX_EventError, 0x%08x",
4991e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            error_code);
4992e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
4993e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_callback.EventHandler(&m_cmp,
4994e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            m_app_data,
4995e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            OMX_EventError,
4996e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            (OMX_U32) error_code,
4997e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            0,
4998e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            NULL);
4999e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5000e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return OMX_ErrorNone;
5001e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
5002e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5003e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
5004e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process OMX_CommandStateSet.
5005e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
5006e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] p_cmd_ack: Pointer to 'command acknowledge' boolean variable.
5007e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in]     state_new: New state to which transition is requested.
5008e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
5009e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
5010e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
5011e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_cmd_state_set(
5012e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    bool         *p_cmd_ack,
5013e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_STATETYPE state_new)
5014e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
5015e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
5016e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5017e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_STATUS retval_swvdec;
5018e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5019e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_LOG_HIGH("'%s-to-%s' requested",
5020e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        OMX_STATETYPE_STRING(m_state),
5021e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        OMX_STATETYPE_STRING(state_new));
5022e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5023e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    /**
5024e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin     * Only the following state transitions are allowed via CommandStateSet:
5025e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin     *
5026e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin     * LOADED -> IDLE -> EXECUTING
5027e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin     * LOADED <- IDLE <- EXECUTING
5028e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin     */
5029e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5030e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_state == OMX_StateInvalid)
5031e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5032e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("in state %s", OMX_STATETYPE_STRING(m_state));
5033e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidState;
5034e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5035e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (state_new == OMX_StateInvalid)
5036e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5037e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("requested transition to state %s",
5038e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             OMX_STATETYPE_STRING(state_new));
5039e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorInvalidState;
5040e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5041e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if ((m_state   == OMX_StateLoaded) &&
5042e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin             (state_new == OMX_StateIdle))
5043e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5044e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((m_port_ip.populated == OMX_TRUE) &&
5045e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (m_port_op.populated == OMX_TRUE))
5046e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5047e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            // start SwVdec
5048e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if ((retval_swvdec = swvdec_start(m_swvdec_handle)) ==
5049e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                SWVDEC_STATUS_SUCCESS)
5050e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
5051e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                *p_cmd_ack = true;
5052e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
5053e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            else
5054e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
5055e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_SWVDEC_LOG_ERROR("failed to start SwVdec");
5056e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                retval = retval_swvdec2omx(retval_swvdec);
5057e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
5058e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5059e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
5060e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5061e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_status_flags |= (1 << PENDING_STATE_LOADED_TO_IDLE);
5062e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5063e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_LOW("'loaded-to-idle' pending");
5064e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5065e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5066e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if ((m_state   == OMX_StateIdle) &&
5067e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin             (state_new == OMX_StateExecuting))
5068e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5069e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        *p_cmd_ack = true;
5070e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5071e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if ((m_state   == OMX_StateExecuting) &&
5072e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin             (state_new == OMX_StateIdle))
5073e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5074e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_status_flags |= (1 << PENDING_STATE_EXECUTING_TO_IDLE);
5075e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5076e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_LOW("'executing-to-idle' pending");
5077e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5078e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = flush(OMX_ALL);
5079e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5080e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if ((m_state   == OMX_StateIdle) &&
5081e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin             (state_new == OMX_StateLoaded))
5082e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5083e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if ((m_port_ip.unpopulated == OMX_TRUE) &&
5084e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            (m_port_op.unpopulated == OMX_TRUE))
5085e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5086e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            // stop SwVdec
5087e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if ((retval_swvdec = swvdec_stop(m_swvdec_handle)) ==
5088e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                SWVDEC_STATUS_SUCCESS)
5089e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
5090e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                *p_cmd_ack = true;
5091e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
5092e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            else
5093e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
5094e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_SWVDEC_LOG_ERROR("failed to stop SwVdec");
5095e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                retval = retval_swvdec2omx(retval_swvdec);
5096e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
5097e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5098e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
5099e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5100e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_status_flags |= (1 << PENDING_STATE_IDLE_TO_LOADED);
5101e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5102e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_LOW("'idle-to-loaded' pending");
5103e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5104e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5105e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
5106e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5107e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("state transition '%s -> %s' illegal",
5108e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             OMX_STATETYPE_STRING(m_state),
5109e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             OMX_STATETYPE_STRING(state_new));
5110e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5111e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = ((state_new == m_state) ?
5112e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                  OMX_ErrorSameState :
5113e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                  OMX_ErrorIncorrectStateTransition);
5114e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5115e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5116e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
5117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
5118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5119e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
5120e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process OMX_CommandFlush.
5121e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
5122e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] port_index: Index of port to flush.
5123e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
5124e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
5125e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
5126e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_cmd_flush(unsigned int port_index)
5127e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
5128e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
5129e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5130e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_LOG_HIGH("flush port %d requested", port_index);
5131e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5132e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (port_index == OMX_CORE_PORT_INDEX_IP)
5133e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5134e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_status_flags |= (1 << PENDING_PORT_FLUSH_IP);
5135e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5136e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_LOW("ip port flush pending");
5137e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5138e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (port_index == OMX_CORE_PORT_INDEX_OP)
5139e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5140e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_status_flags |= (1 << PENDING_PORT_FLUSH_OP);
5141e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5142e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_LOW("op port flush pending");
5143e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5144e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (port_index == OMX_ALL)
5145e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5146e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_status_flags |= (1 << PENDING_PORT_FLUSH_IP);
5147e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_status_flags |= (1 << PENDING_PORT_FLUSH_OP);
5148e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5149e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_LOW("ip & op ports flush pending");
5150e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5151e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5152e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    retval = flush(port_index);
5153e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5154e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
5155e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
5156e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
5158e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process OMX_CommandPortDisable.
5159e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
5160e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] p_cmd_ack:  Pointer to 'command acknowledge' boolean variable.
5161e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in]     port_index: Index of port to disable.
5162e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
5163e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
5164e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
5165e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_cmd_port_disable(
5166e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    bool         *p_cmd_ack,
5167e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int  port_index)
5168e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
5169e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
5170e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5171e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_LOG_HIGH("disable port %d requested", port_index);
5172e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5173e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (port_index == OMX_CORE_PORT_INDEX_IP)
5174e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5175e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_port_ip.enabled == OMX_FALSE)
5176e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5177e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("ip port already disabled");
5178e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorBadPortIndex;
5179e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5180e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
5181e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5182e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_port_ip.enabled = OMX_FALSE;
5183e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5184e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (m_port_ip.unpopulated)
5185e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
5186e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                *p_cmd_ack = true;
5187e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
5188e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            else
5189e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
5190e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_status_flags |= (1 << PENDING_PORT_DISABLE_IP);
5191e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5192e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_SWVDEC_LOG_LOW("ip port disable pending");
5193e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5194e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                if (m_port_ip.num_pending_buffers)
5195e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                {
5196e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    retval = flush(port_index);
5197e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                }
5198e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
5199e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5200e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5201e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (port_index == OMX_CORE_PORT_INDEX_OP)
5202e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5203e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_port_op.enabled == OMX_FALSE)
5204e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5205e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("op port already disabled");
5206e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorBadPortIndex;
5207e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5208e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
5209e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5210e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_port_op.enabled = OMX_FALSE;
5211e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5212e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (m_port_op.unpopulated)
5213e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
5214e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                *p_cmd_ack = true;
5215e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
5216e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            else
5217e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
5218e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_status_flags |= (1 << PENDING_PORT_DISABLE_OP);
5219e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5220e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_SWVDEC_LOG_LOW("op port disable pending");
5221e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5222e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                if (m_port_op.num_pending_buffers)
5223e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                {
5224e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    retval = flush(port_index);
5225e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                }
5226e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
5227e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5228e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5229e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (port_index == OMX_ALL)
5230e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5231e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_port_ip.enabled == OMX_FALSE)
5232e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5233e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("ip port already disabled");
5234e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorBadPortIndex;
5235e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5236e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else if (m_port_op.enabled == OMX_FALSE)
5237e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5238e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("op port already disabled");
5239e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorBadPortIndex;
5240e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5241e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
5242e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5243e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (m_port_ip.unpopulated && m_port_op.unpopulated)
5244e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
5245e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                *p_cmd_ack = true;
5246e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
5247e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            else
5248e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
5249e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_port_ip.enabled = OMX_FALSE;
5250e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_port_op.enabled = OMX_FALSE;
5251e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5252e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                if (m_port_ip.unpopulated == OMX_FALSE)
5253e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                {
5254e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    m_status_flags |= (1 << PENDING_PORT_DISABLE_IP);
5255e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5256e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    OMX_SWVDEC_LOG_LOW("ip port disable pending");
5257e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5258e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    if (m_port_ip.num_pending_buffers)
5259e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    {
5260e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        retval = flush(port_index);
5261e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    }
5262e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                }
5263e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5264e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                if ((retval == OMX_ErrorNone) &&
5265e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    (m_port_op.unpopulated == OMX_FALSE))
5266e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                {
5267e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    m_status_flags |= (1 << PENDING_PORT_DISABLE_OP);
5268e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5269e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    OMX_SWVDEC_LOG_LOW("op port disable pending");
5270e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5271e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    if (m_port_op.num_pending_buffers)
5272e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    {
5273e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                        retval = flush(port_index);
5274e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    }
5275e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                }
5276e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
5277e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5278e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
5280e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5281e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("port index '%d' invalid");
5282e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadPortIndex;
5283e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5284e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5285e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
5286e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
5287e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5288e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
5289e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process OMX_CommandPortEnable.
5290e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
5291e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in,out] p_cmd_ack:  Pointer to 'command acknowledge' boolean variable.
5292e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in]     port_index: Index of port to enable.
5293e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
5294e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
5295e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
5296e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_cmd_port_enable(
5297e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    bool         *p_cmd_ack,
5298e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int  port_index)
5299e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
5300e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
5301e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5302e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_LOG_HIGH("enable port %d requested", port_index);
5303e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5304e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (port_index == OMX_CORE_PORT_INDEX_IP)
5305e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5306e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_port_ip.enabled)
5307e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5308e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("ip port already enabled");
5309e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorBadPortIndex;
5310e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5311e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
5312e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5313e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_port_ip.enabled = OMX_TRUE;
5314e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5315e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (m_port_ip.populated)
5316e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
5317e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                *p_cmd_ack = true;
5318e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
5319e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            else
5320e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
5321e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_status_flags |= (1 << PENDING_PORT_ENABLE_IP);
5322e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5323e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_SWVDEC_LOG_LOW("ip port enable pending");
5324e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
5325e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5326e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5327e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (port_index == OMX_CORE_PORT_INDEX_OP)
5328e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5329e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_port_op.enabled)
5330e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5331e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("op port already enabled");
5332e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorBadPortIndex;
5333e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5334e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
5335e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5336e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_port_op.enabled = OMX_TRUE;
5337e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5338e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (m_port_op.populated)
5339e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
5340e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                *p_cmd_ack = true;
5341e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
5342e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            else
5343e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
5344e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_status_flags |= (1 << PENDING_PORT_ENABLE_OP);
5345e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5346e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_SWVDEC_LOG_LOW("op port enable pending");
5347e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
5348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (port_index == OMX_ALL)
5351e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5352e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_port_ip.enabled)
5353e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5354e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("ip port already enabled");
5355e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorBadPortIndex;
5356e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5357e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else if (m_port_op.enabled)
5358e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5359e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            OMX_SWVDEC_LOG_ERROR("op port already enabled");
5360e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = OMX_ErrorBadPortIndex;
5361e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5362e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        else
5363e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5364e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_port_ip.enabled = OMX_TRUE;
5365e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_port_op.enabled = OMX_TRUE;
5366e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5367e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (m_port_ip.populated && m_port_op.populated)
5368e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
5369e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                *p_cmd_ack = true;
5370e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
5371e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            else if (m_port_ip.populated == false)
5372e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
5373e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_status_flags |= (1 << PENDING_PORT_ENABLE_IP);
5374e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5375e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_SWVDEC_LOG_LOW("ip port enable pending");
5376e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
5377e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            else if (m_port_op.populated == false)
5378e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
5379e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_status_flags |= (1 << PENDING_PORT_ENABLE_OP);
5380e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5381e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                OMX_SWVDEC_LOG_LOW("op port enable pending");
5382e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
5383e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5384e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5385e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
5386e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5387e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("port index '%d' invalid");
5388e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadPortIndex;
5389e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5390e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5391e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
5392e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
5393e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5394e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
5395e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process ETB event.
5396e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
5397e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_buffer_hdr: Pointer to buffer header.
5398e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] index:        Index of buffer in input buffer info array.
5399e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
5400e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
5401e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
5402e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_etb(
5403e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_BUFFERHEADERTYPE *p_buffer_hdr,
5404e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int          index)
5405e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
5406e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
5407e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5408e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_port_ip.num_pending_buffers++;
5409e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5410e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if ((p_buffer_hdr->nFilledLen == 0) &&
5411e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        ((p_buffer_hdr->nFlags & OMX_BUFFERFLAG_EOS) == 0))
5412e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5413e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_HIGH("returning %p, buffer %p; "
5414e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            "zero length & no EOS flag",
5415e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            p_buffer_hdr,
5416e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            p_buffer_hdr->pBuffer);
5417e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5418e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        async_post_event(OMX_SWVDEC_EVENT_EBD,
5419e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         (unsigned long) p_buffer_hdr,
5420e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         (unsigned long) index);
5421e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5422e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else if (m_port_ip.flush_inprogress)
5423e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5424e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_HIGH("returning %p, buffer %p; "
5425e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            "ip port flush in progress",
5426e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            p_buffer_hdr,
5427e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            p_buffer_hdr->pBuffer);
5428e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5429e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        async_post_event(OMX_SWVDEC_EVENT_EBD,
5430e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         (unsigned long) p_buffer_hdr,
5431e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         (unsigned long) index);
5432e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5433e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
5434e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5435e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        SWVDEC_STATUS retval_swvdec;
5436e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5437e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        SWVDEC_BUFFER *p_buffer_swvdec =
5438e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            &(m_buffer_array_ip[index].buffer_swvdec);
5439e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5440e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (p_buffer_hdr->nFilledLen &&
5441e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            ((p_buffer_hdr->nFlags & OMX_BUFFERFLAG_CODECCONFIG) == 0))
5442e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5443e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_ts_list.push(p_buffer_hdr->nTimeStamp);
5444e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5445e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5446e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        assert(p_buffer_swvdec->p_buffer == p_buffer_hdr->pBuffer);
5447e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5448e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_buffer_swvdec->flags         = p_buffer_hdr->nFlags;
5449e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_buffer_swvdec->timestamp     = p_buffer_hdr->nTimeStamp;
5450e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_buffer_swvdec->filled_length = p_buffer_hdr->nFilledLen;
5451e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5452e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_diag.dump_ip(p_buffer_swvdec->p_buffer,
5453e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                       p_buffer_swvdec->filled_length);
5454e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5455e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval_swvdec = swvdec_emptythisbuffer(m_swvdec_handle,
5456e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                               p_buffer_swvdec);
5457e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5458e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (retval_swvdec != SWVDEC_STATUS_SUCCESS)
5459e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5460e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = retval_swvdec2omx(retval_swvdec);
5461e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5462e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5463e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5464e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
5465e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
5466e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5467e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
5468e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process FTB event.
5469e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
5470e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_buffer_hdr: Pointer to buffer header.
5471e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] index:        Index of buffer in output buffer info array.
5472e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
5473e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
5474e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
5475e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_ftb(
5476e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_BUFFERHEADERTYPE *p_buffer_hdr,
5477e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int          index)
5478e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
5479e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
5480e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5481e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_port_op.num_pending_buffers++;
5482e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5483e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_port_op.flush_inprogress)
5484e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5485e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_HIGH("returning %p, buffer %p; "
5486e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            "op port flush in progress",
5487e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            p_buffer_hdr,
5488e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            m_buffer_array_op[index].buffer_swvdec.p_buffer);
5489e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5490e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        async_post_event(OMX_SWVDEC_EVENT_FBD,
5491e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         (unsigned long) p_buffer_hdr,
5492e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         (unsigned long) index);
5493e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5494e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
5495e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5496e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        SWVDEC_STATUS retval_swvdec;
5497e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5498e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        SWVDEC_BUFFER *p_buffer_swvdec =
5499e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            &(m_buffer_array_op[index].buffer_swvdec);
5500e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5501e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval_swvdec = swvdec_fillthisbuffer(m_swvdec_handle, p_buffer_swvdec);
5502e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5503e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (retval_swvdec != SWVDEC_STATUS_SUCCESS)
5504e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5505e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = retval_swvdec2omx(retval_swvdec);
5506e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5507e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5508e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5509e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
5510e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
5511e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5512e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
5513e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process EBD event.
5514e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
5515e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_buffer_hdr: Pointer to buffer header.
5516e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] index:        Index of buffer in output buffer info array.
5517e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
5518e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
5519e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
5520e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_ebd(
5521e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_BUFFERHEADERTYPE *p_buffer_hdr,
5522e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int          index)
5523e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
5524e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
5525e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5526e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (index < m_port_ip.def.nBufferCountActual)
5527e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5528e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_port_ip.num_pending_buffers--;
5529e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5530e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        // should ideally be set in swvdec_empty_buffer_done()
5531e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_buffer_hdr->nFilledLen = 0;
5532e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5533e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_CALLBACK(
5534e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            "EmptyBufferDone(): %p, buffer %p",
5535e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_hdr,
5536e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_buffer_array_ip[index].buffer_swvdec.p_buffer);
5537e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5538e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_callback.EmptyBufferDone(&m_cmp, m_app_data, p_buffer_hdr);
5539e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5540e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
5541e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5542e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("buffer index '%d' invalid", index);
5543e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
5544e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5545e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5546e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
5547e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
5548e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5549e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
5550e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process FBD event.
5551e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
5552e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] p_buffer_hdr: Pointer to buffer header.
5553e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @param[in] index:        Index of buffer in output buffer info array.
5554e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
5555e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
5556e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
5557e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_fbd(
5558e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_BUFFERHEADERTYPE *p_buffer_hdr,
5559e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int          index)
5560e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
5561e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
5562e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5563e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (index < m_port_op.def.nBufferCountActual)
5564e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5565e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_U8 *p_buffer;
5566e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5567e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        p_buffer = m_buffer_array_op[index].buffer_swvdec.p_buffer;
5568e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5569e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_port_op.num_pending_buffers--;
5570e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5571e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_port_op.flush_inprogress)
5572e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5573e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_hdr->nFilledLen = 0;
5574e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_hdr->nTimeStamp = 0;
5575e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_hdr->nFlags    &= ~OMX_BUFFERFLAG_DATACORRUPT;
5576e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5577e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5578e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (p_buffer_hdr->nFilledLen)
5579e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5580e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            if (m_sync_frame_decoding_mode)
5581e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
5582e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                p_buffer_hdr->nTimeStamp = 0;
5583e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
5584e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            else
5585e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            {
5586e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                if (m_ts_list.pop(&p_buffer_hdr->nTimeStamp) == false)
5587e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                {
5588e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                    OMX_SWVDEC_LOG_ERROR("failed to pop timestamp from list");
5589e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                }
5590e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            }
5591e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5592e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_diag.dump_op(p_buffer,
5593e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           m_frame_dimensions.width,
5594e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           m_frame_dimensions.height,
5595e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           m_frame_attributes.stride,
5596e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                           m_frame_attributes.scanlines);
5597e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5598e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5599e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (p_buffer_hdr->nFlags & OMX_BUFFERFLAG_EOS)
5600e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5601e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            async_post_event(OMX_SWVDEC_EVENT_EOS, 0, 0);
5602e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5603e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_ts_list.reset();
5604e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5605e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5606e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        if (m_meta_buffer_mode &&
5607e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            ((p_buffer_hdr->nFlags & OMX_BUFFERFLAG_READONLY)) == 0)
5608e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5609e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            meta_buffer_ref_remove(
5610e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_buffer_array_op[index].buffer_payload.pmem_fd,
5611e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                m_buffer_array_op[index].buffer_payload.offset);
5612e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5613e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5614e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_CALLBACK(
5615e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            "FillBufferDone(): %p, buffer %p, "
5616e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            "flags 0x%08x, timestamp %lld",
5617e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_hdr,
5618e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer,
5619e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_hdr->nFlags,
5620e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_hdr->nTimeStamp);
5621e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5622e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_callback.FillBufferDone(&m_cmp, m_app_data, p_buffer_hdr);
5623e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5624e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
5625e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5626e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("buffer index '%d' invalid", index);
5627e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorBadParameter;
5628e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5629e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5630e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinasync_process_event_fbd_exit:
5631e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
5632e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
5633e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5634e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
5635e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process EOS event.
5636e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
5637e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ErrorNone
5638e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
5639e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_eos()
5640e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
5641e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_LOG_CALLBACK("EventHandler(): "
5642e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            "OMX_EventBufferFlag, port %d, EOS",
5643e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            OMX_CORE_PORT_INDEX_OP);
5644e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5645e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_callback.EventHandler(&m_cmp,
5646e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            m_app_data,
5647e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            OMX_EventBufferFlag,
5648e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            OMX_CORE_PORT_INDEX_OP,
5649e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            OMX_BUFFERFLAG_EOS,
5650e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            NULL);
5651e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5652e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return OMX_ErrorNone;
5653e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
5654e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5655e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
5656e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process input port flush event.
5657e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
5658e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
5659e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
5660e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_flush_port_ip()
5661e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
5662e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
5663e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5664e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_EVENT_INFO event_info;
5665e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5666e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_BUFFERHEADERTYPE *p_buffer_hdr;
5667e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5668e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int index;
5669e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5670e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    while (m_queue_port_ip.pop(&event_info))
5671e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5672e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        switch (event_info.event_id)
5673e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5674e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5675e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_SWVDEC_EVENT_ETB:
5676e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5677e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_hdr = (OMX_BUFFERHEADERTYPE *) event_info.event_param1;
5678e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            index = event_info.event_param2;
5679e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5680e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            // compensate decrement in async_process_event_ebd()
5681e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_port_ip.num_pending_buffers++;
5682e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5683e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = async_process_event_ebd(p_buffer_hdr, index);
5684e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
5685e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5686e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5687e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_SWVDEC_EVENT_EBD:
5688e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5689e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_hdr = (OMX_BUFFERHEADERTYPE *) event_info.event_param1;
5690e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            index = event_info.event_param2;
5691e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5692e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = async_process_event_ebd(p_buffer_hdr, index);
5693e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
5694e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5695e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5696e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        default:
5697e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5698e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            assert(0);
5699e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
5700e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5701e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5702e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5703e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5704e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5705e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    assert(m_port_ip.num_pending_buffers == 0);
5706e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5707e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if ((retval == OMX_ErrorNone) &&
5708e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        (m_status_flags & (1 << PENDING_PORT_FLUSH_IP)))
5709e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5710e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_status_flags &= ~(1 << PENDING_PORT_FLUSH_IP);
5711e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5712e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        async_post_event(OMX_SWVDEC_EVENT_CMD_ACK,
5713e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         OMX_CommandFlush,
5714e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         OMX_CORE_PORT_INDEX_IP);
5715e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5716e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5717e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_port_ip.flush_inprogress = OMX_FALSE;
5718e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5719e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
5720e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
5721e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5722e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
5723e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process output port flush event.
5724e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
5725e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
5726e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
5727e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_flush_port_op()
5728e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
5729e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
5730e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5731e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_EVENT_INFO event_info;
5732e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5733e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_BUFFERHEADERTYPE *p_buffer_hdr;
5734e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5735e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int index;
5736e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5737e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    while (m_queue_port_op.pop(&event_info))
5738e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5739e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        switch (event_info.event_id)
5740e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5741e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5742e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_SWVDEC_EVENT_FTB:
5743e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5744e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_hdr = (OMX_BUFFERHEADERTYPE *) event_info.event_param1;
5745e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            index = event_info.event_param2;
5746e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5747e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            // compensate decrement in async_process_event_fbd()
5748e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            m_port_op.num_pending_buffers++;
5749e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5750e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = async_process_event_fbd(p_buffer_hdr, index);
5751e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
5752e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5753e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5754e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        case OMX_SWVDEC_EVENT_FBD:
5755e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5756e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            p_buffer_hdr = (OMX_BUFFERHEADERTYPE *) event_info.event_param1;
5757e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            index = event_info.event_param2;
5758e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5759e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            retval = async_process_event_fbd(p_buffer_hdr, index);
5760e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
5761e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5762e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5763e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        default:
5764e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        {
5765e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            assert(0);
5766e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin            break;
5767e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5768e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5769e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        }
5770e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5771e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5772e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    assert(m_port_op.num_pending_buffers == 0);
5773e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5774e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if ((retval == OMX_ErrorNone) &&
5775e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        (m_status_flags & (1 << PENDING_PORT_FLUSH_OP)))
5776e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5777e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_status_flags &= ~(1 << PENDING_PORT_FLUSH_OP);
5778e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5779e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        async_post_event(OMX_SWVDEC_EVENT_CMD_ACK,
5780e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         OMX_CommandFlush,
5781e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         OMX_CORE_PORT_INDEX_OP);
5782e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5783e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5784e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if ((retval == OMX_ErrorNone) &&
5785e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        (m_status_flags & (1 << PENDING_STATE_EXECUTING_TO_IDLE)))
5786e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5787e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_status_flags &= ~(1 << PENDING_STATE_EXECUTING_TO_IDLE);
5788e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5789e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        async_post_event(OMX_SWVDEC_EVENT_CMD_ACK,
5790e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         OMX_CommandStateSet,
5791e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                         OMX_StateIdle);
5792e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5793e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5794e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_port_reconfig_inprogress == false)
5795e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5796e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_ts_list.reset();
5797e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5798e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5799e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    m_port_op.flush_inprogress = OMX_FALSE;
5800e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5801e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
5802e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
5803e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5804e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/**
5805e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief Process port reconfiguration event.
5806e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
5807e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @retval OMX_ERRORTYPE
5808e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
5809e4010605f233a213cf0d972397bb33c34c364227Patrick TjinOMX_ERRORTYPE omx_swvdec::async_process_event_port_reconfig()
5810e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
5811e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval = OMX_ErrorNone;
5812e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5813e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    if (m_port_reconfig_inprogress)
5814e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5815e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_ERROR("port reconfiguration in progress");
5816e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        retval = OMX_ErrorIncorrectStateOperation;
5817e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5818e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    else
5819e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    {
5820e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_port_reconfig_inprogress = true;
5821e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5822e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_LOG_CALLBACK("EventHandler(): "
5823e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                "OMX_EventPortSettingsChanged, port %d",
5824e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                OMX_CORE_PORT_INDEX_OP);
5825e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5826e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        m_callback.EventHandler(&m_cmp,
5827e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                m_app_data,
5828e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                OMX_EventPortSettingsChanged,
5829e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                OMX_CORE_PORT_INDEX_OP,
5830e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                0,
5831e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                NULL);
5832e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    }
5833e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
5834e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    return retval;
5835e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin}
5836