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.h
33e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
34e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin * @brief
35e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *
36e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin *   OMX software video decoder component header.
37e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin */
38e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
39e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#ifndef _OMX_SWVDEC_H_
40e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define _OMX_SWVDEC_H_
41e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
42e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <pthread.h>
43e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <semaphore.h>
44e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
45e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <linux/msm_ion.h>
46e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include <linux/msm_vidc_dec.h>
47e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
48e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include "qc_omx_component.h"
49e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
50e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include "omx_swvdec_utils.h"
51e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
52e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#include "swvdec_types.h"
53e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
54e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinusing namespace android;
55e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
56e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/// OMX SwVdec version date
57e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define OMX_SWVDEC_VERSION_DATE "2015-11-09T18:33:31+0530"
58e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
59e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define OMX_SPEC_VERSION 0x00000101 ///< OMX specification version
60e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
61e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define OMX_SWVDEC_NUM_INSTANCES 1 ///< number of OMX SwVdec instances
62e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
63e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin// @todo Make this macro default and store in a variable?
64e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define OMX_SWVDEC_IP_BUFFER_COUNT 5 ///< OMX SwVdec input buffer count
65e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
66e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/// frame rate structure
67e4010605f233a213cf0d972397bb33c34c364227Patrick Tjintypedef struct {
68e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int fps_numerator;   ///< fps numerator
69e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int fps_denominator; ///< fps denominator
70e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} FRAME_RATE;
71e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
72e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define DEFAULT_FPS_NUMERATOR   30 ///< default fps numerator
73e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define DEFAULT_FPS_DENOMINATOR  1 ///< default fps denominator
74e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
75e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/// frame dimensions structure
76e4010605f233a213cf0d972397bb33c34c364227Patrick Tjintypedef struct {
77e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int width;  ///< frame width
78e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int height; ///< frame height
79e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} FRAME_DIMENSIONS;
80e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
81e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/// frame attributes structure
82e4010605f233a213cf0d972397bb33c34c364227Patrick Tjintypedef struct {
83e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int stride;    ///< frame stride
84e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int scanlines; ///< frame scanlines
85e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int size;      ///< frame size
86e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} FRAME_ATTRIBUTES;
87e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
88e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/// asynchronous thread structure
89e4010605f233a213cf0d972397bb33c34c364227Patrick Tjintypedef struct {
90e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    sem_t     sem_thread_created; ///< thread created semaphore
91e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    sem_t     sem_event;          ///< event semaphore
92e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    pthread_t handle;             ///< thread handle
93e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    bool      created;            ///< thread created?
94e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    bool      exit;               ///< thread exit variable
95e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} ASYNC_THREAD;
96e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
97e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/// @cond
98e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
99e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinstruct vdec_ion {
100e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    int                        ion_fd_device;
101e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    struct ion_fd_data         ion_fd_data;
102e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    struct ion_allocation_data ion_alloc_data;
103e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin};
104e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
105e4010605f233a213cf0d972397bb33c34c364227Patrick Tjintypedef struct {
106e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_BUFFERHEADERTYPE      buffer_header;
107e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    struct vdec_ion           ion_info;
108e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    struct vdec_bufferpayload buffer_payload;
109e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_BUFFER             buffer_swvdec;
110e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    bool                      buffer_populated;
111e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} OMX_SWVDEC_BUFFER_INFO;
112e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
113e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/// @endcond
114e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
115e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/// port structure
116e4010605f233a213cf0d972397bb33c34c364227Patrick Tjintypedef struct {
117e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_PARAM_PORTDEFINITIONTYPE def;                 ///< definition
118e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_BOOL                     enabled;             ///< enabled?
119e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_BOOL                     populated;           ///< populated?
120e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_BOOL                     unpopulated;         ///< unpopulated?
121e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_BOOL                     flush_inprogress;    ///< flush inprogress?
122e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int                 num_pending_buffers; ///< # of pending buffers
123e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} OMX_SWVDEC_PORT;
124e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
125e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/// meta_buffer information structure
126e4010605f233a213cf0d972397bb33c34c364227Patrick Tjintypedef struct {
127e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int fd;        ///< file descriptor
128e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int dup_fd;    ///< duplicate file descriptor
129e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int offset;    ///< offset
130e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int ref_count; ///< reference count
131e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin} OMX_SWVDEC_META_BUFFER_INFO;
132e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
133e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define DEFAULT_FRAME_WIDTH  1920 ///< default frame width
134e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define DEFAULT_FRAME_HEIGHT 1088 ///< default frame height
135e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
136e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define DEFAULT_ALIGNMENT_STRIDE      128 ///< default stride alignment
137e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define DEFAULT_ALIGNMENT_SCANLINES_Y  32 ///< default  Y scanlines alignment
138e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define DEFAULT_ALIGNMENT_SCANLINES_UV 16 ///< default UV scanlines alignment
139e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define DEFAULT_ALIGNMENT_SIZE       4096 ///< default size alignment
140e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
141e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define MAX(x, y) (((x) > (y)) ? (x) : (y)) ///< maximum
142e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define MIN(x, y) (((x) < (y)) ? (x) : (y)) ///< minimum
143e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define ALIGN(x, y) (((x) + ((y) - 1)) & (~((y) - 1)))
144e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                  ///< align 'x' to next highest multiple of 'y'
145e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
146e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/// macro to print 'command type' string
147e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define OMX_COMMANDTYPE_STRING(x)                                 \
148e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    ((x == OMX_CommandStateSet) ? "OMX_CommandStateSet" :         \
149e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin     ((x == OMX_CommandFlush) ? "OMX_CommandFlush" :              \
150e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin      ((x == OMX_CommandPortDisable) ? "OMX_CommandPortDisable" : \
151e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin       ((x == OMX_CommandPortEnable) ? "OMX_CommandPortEnable" :  \
152e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        "unknown"))))
153e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
154e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/// macro to print 'state type' string
155e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#define OMX_STATETYPE_STRING(x)                                            \
156e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    ((x == OMX_StateInvalid) ? "OMX_StateInvalid" :                        \
157e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin     ((x == OMX_StateLoaded) ? "OMX_StateLoaded" :                         \
158e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin      ((x == OMX_StateIdle) ? "OMX_StateIdle" :                            \
159e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin       ((x == OMX_StateExecuting) ? "OMX_StateExecuting" :                 \
160e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        ((x == OMX_StatePause) ? "OMX_StatePause" :                        \
161e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin         ((x == OMX_StateWaitForResources) ? "OMX_StateWaitForResources" : \
162e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin          "unknown"))))))
163e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
164e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinenum {
165e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_CORE_PORT_INDEX_IP = 0, ///<  input port index
166e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_CORE_PORT_INDEX_OP = 1  ///< output port index
167e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin};
168e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
169e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinextern "C" {
170e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_API void *get_omx_component_factory_fn(void);
171e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin};
172e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
173e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin/// OMX SwVdec component class; derived from QC OMX component base class
174e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinclass omx_swvdec : public qc_omx_component
175e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin{
176e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinpublic:
177e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
178e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    omx_swvdec();
179e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
180e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    virtual ~omx_swvdec();
181e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
182e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    // derived class versions of base class pure virtual functions
183e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
184e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE component_init(OMX_STRING cmp_name);
185e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE cmp_handle);
186e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE get_component_version(OMX_HANDLETYPE   cmp_handle,
187e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        OMX_STRING       cmp_name,
188e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        OMX_VERSIONTYPE *p_cmp_version,
189e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        OMX_VERSIONTYPE *p_spec_version,
190e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                        OMX_UUIDTYPE    *p_cmp_UUID);
191e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE send_command(OMX_HANDLETYPE  cmp_handle,
192e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               OMX_COMMANDTYPE cmd,
193e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               OMX_U32         param,
194e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                               OMX_PTR         p_cmd_data);
195e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE cmp_handle,
196e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                OMX_INDEXTYPE  param_index,
197e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                OMX_PTR        p_param_data);
198e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE cmp_handle,
199e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                OMX_INDEXTYPE  param_index,
200e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                OMX_PTR        p_param_data);
201e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE get_config(OMX_HANDLETYPE cmp_handle,
202e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             OMX_INDEXTYPE  config_index,
203e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             OMX_PTR        p_config_data);
204e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE set_config(OMX_HANDLETYPE cmp_handle,
205e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             OMX_INDEXTYPE  config_index,
206e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             OMX_PTR        p_config_data);
207e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE get_extension_index(OMX_HANDLETYPE cmp_handle,
208e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                      OMX_STRING     param_name,
209e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                      OMX_INDEXTYPE *p_index_type);
210e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE get_state(OMX_HANDLETYPE cmp_handle,
211e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                            OMX_STATETYPE *p_state);
212e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE component_tunnel_request(OMX_HANDLETYPE       cmp_handle,
213e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                           OMX_U32              port,
214e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                           OMX_HANDLETYPE       peer_component,
215e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                           OMX_U32              peer_port,
216e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                           OMX_TUNNELSETUPTYPE *p_tunnel_setup);
217e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE         cmp_handle,
218e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             OMX_BUFFERHEADERTYPE **pp_buffer_hdr,
219e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             OMX_U32                port,
220e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             OMX_PTR                p_app_data,
221e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             OMX_U32                bytes,
222e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                             OMX_U8                *p_buffer);
223e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE allocate_buffer(OMX_HANDLETYPE         cmp_handle,
224e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                  OMX_BUFFERHEADERTYPE **pp_buffer_hdr,
225e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                  OMX_U32                port,
226e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                  OMX_PTR                p_app_data,
227e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                  OMX_U32                bytes);
228e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE free_buffer(OMX_HANDLETYPE        cmp_handle,
229e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                              OMX_U32               port,
230e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                              OMX_BUFFERHEADERTYPE *p_buffer);
231e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE empty_this_buffer(OMX_HANDLETYPE        cmp_handle,
232e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                    OMX_BUFFERHEADERTYPE *p_buffer_hdr);
233e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE fill_this_buffer(OMX_HANDLETYPE        cmp_handle,
234e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                   OMX_BUFFERHEADERTYPE *p_buffer_hdr);
235e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE    cmp_handle,
236e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                OMX_CALLBACKTYPE *p_callbacks,
237e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                OMX_PTR           p_app_data);
238e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE         cmp_handle,
239e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                OMX_BUFFERHEADERTYPE **pp_buffer_hdr,
240e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                OMX_U32                port,
241e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                OMX_PTR                p_app_data,
242e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                void                  *egl_image);
243e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE component_role_enum(OMX_HANDLETYPE cmp_handle,
244e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                      OMX_U8        *p_role,
245e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                      OMX_U32        index);
246e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
247e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    // SwVdec callback functions
248e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
249e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    static SWVDEC_STATUS swvdec_empty_buffer_done_callback(
250e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        SWVDEC_HANDLE  swvdec_handle,
251e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        SWVDEC_BUFFER *p_buffer_ip,
252e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        void          *p_client_handle);
253e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    static SWVDEC_STATUS swvdec_fill_buffer_done_callback(
254e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        SWVDEC_HANDLE  swvdec_handle,
255e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        SWVDEC_BUFFER *p_buffer_op,
256e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        void          *p_client_handle);
257e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    static SWVDEC_STATUS swvdec_event_handler_callback(
258e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        SWVDEC_HANDLE swvdec_handle,
259e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        SWVDEC_EVENT  event,
260e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        void         *p_data,
261e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        void         *p_client_handle);
262e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
263e4010605f233a213cf0d972397bb33c34c364227Patrick Tjinprivate:
264e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
265e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_STATETYPE m_state; ///< component state
266e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
267e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    unsigned int m_status_flags; ///< status flags
268e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
269e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    char m_cmp_name[OMX_MAX_STRINGNAME_SIZE];  ///< component name
270e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    char m_role_name[OMX_MAX_STRINGNAME_SIZE]; ///< component role name
271e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
272e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_CODEC  m_swvdec_codec;   ///< SwVdec codec type
273e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    SWVDEC_HANDLE m_swvdec_handle;  ///< SwVdec handle
274e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    bool          m_swvdec_created; ///< SwVdec created?
275e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
276e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_VIDEO_CODINGTYPE m_omx_video_codingtype; ///< OMX video coding type
277e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_COLOR_FORMATTYPE m_omx_color_formattype; ///< OMX color format type
278e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
279e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    FRAME_RATE       m_frame_rate;       ///< frame rate
280e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    FRAME_DIMENSIONS m_frame_dimensions; ///< frame dimensions
281e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    FRAME_ATTRIBUTES m_frame_attributes; ///< frame attributes
282e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
283e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    ASYNC_THREAD m_async_thread; ///< asynchronous thread
284e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
285e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    omx_swvdec_queue m_queue_command; ///< command queue
286e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    omx_swvdec_queue m_queue_port_ip; ///<  input port queue for ETBs & EBDs
287e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    omx_swvdec_queue m_queue_port_op; ///< output port queue for FTBs & FBDs
288e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
289e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_PORT m_port_ip; ///<  input port
290e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_PORT m_port_op; ///< output port
291e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
292e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_CALLBACKTYPE m_callback; ///< IL client callback structure
293e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_PTR          m_app_data; ///< IL client app data pointer
294e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
295e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_PRIORITYMGMTTYPE m_prio_mgmt; ///< priority management
296e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
297e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    bool m_sync_frame_decoding_mode; ///< sync frame decoding mode enabled?
298e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    bool m_android_native_buffers;   ///< android native buffers enabled?
299e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    bool m_meta_buffer_mode;         ///< meta buffer mode enabled?
300e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
301e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    bool m_port_reconfig_inprogress; ///< port reconfiguration in progress?
302e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
303e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    sem_t m_sem_cmd; ///< semaphore for command processing
304e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
305e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_BUFFER_INFO *m_buffer_array_ip; ///<  input buffer info array
306e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_BUFFER_INFO *m_buffer_array_op; ///< output buffer info array
307e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
308e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_SWVDEC_META_BUFFER_INFO *m_meta_buffer_array; ///< metabuffer info array
309e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    pthread_mutex_t              m_meta_buffer_array_mutex;
310e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                            ///< mutex for metabuffer info array
311e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
312e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    omx_swvdec_ts_list m_ts_list; ///< timestamp list
313e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
314e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    omx_swvdec_diag m_diag; ///< diagnostics class variable
315e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
316e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE set_frame_dimensions(unsigned int width,
317e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                       unsigned int height);
318e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE set_frame_attributes(unsigned int alignment_stride,
319e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                       unsigned int alignment_scanlines_y,
320e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                       unsigned int alignment_scanlines_uv,
321e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                       unsigned int alignment_size);
322e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
323e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE get_video_port_format(
324e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_VIDEO_PARAM_PORTFORMATTYPE *p_port_format);
325e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE set_video_port_format(
326e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_VIDEO_PARAM_PORTFORMATTYPE *p_port_format);
327e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
328e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE get_port_definition(OMX_PARAM_PORTDEFINITIONTYPE *p_port_def);
329e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE set_port_definition(OMX_PARAM_PORTDEFINITIONTYPE *p_port_def);
330e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
331e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE get_supported_profilelevel(
332e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_VIDEO_PARAM_PROFILELEVELTYPE *p_profilelevel);
333e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
334e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE describe_color_format(DescribeColorFormatParams *p_params);
335e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
336e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE set_port_definition_qcom(
337e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_QCOM_PARAM_PORTDEFINITIONTYPE *p_port_def);
338e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
339e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    // functions to set SwVdec properties with OMX component properties
340e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
341e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE set_frame_dimensions_swvdec();
342e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE set_frame_attributes_swvdec();
343e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
344e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    // functions to get SwVdec properties and set OMX component properties
345e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
346e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE get_frame_dimensions_swvdec();
347e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE get_frame_attributes_swvdec();
348e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE get_buffer_requirements_swvdec(unsigned int port_index);
349e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
350e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    // buffer allocation & de-allocation functions
351e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE buffer_allocate_ip(OMX_BUFFERHEADERTYPE **pp_buffer_hdr,
352e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     OMX_PTR                p_app_data,
353e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     OMX_U32                size);
354e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE buffer_allocate_op(OMX_BUFFERHEADERTYPE **pp_buffer_hdr,
355e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     OMX_PTR                p_app_data,
356e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                     OMX_U32                size);
357e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE buffer_allocate_ip_info_array();
358e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE buffer_allocate_op_info_array();
359e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE buffer_use_op(OMX_BUFFERHEADERTYPE **pp_buffer_hdr,
360e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                OMX_PTR                p_app_data,
361e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                OMX_U32                size,
362e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                OMX_U8                *p_buffer);
363e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE buffer_deallocate_ip(OMX_BUFFERHEADERTYPE *p_buffer_hdr);
364e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE buffer_deallocate_op(OMX_BUFFERHEADERTYPE *p_buffer_hdr);
365e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    void          buffer_deallocate_ip_info_array();
366e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    void          buffer_deallocate_op_info_array();
367e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
368e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE meta_buffer_array_allocate();
369e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    void          meta_buffer_array_deallocate();
370e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    void          meta_buffer_ref_add(unsigned int index,
371e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                      unsigned int fd,
372e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                      unsigned int offset);
373e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    void          meta_buffer_ref_remove(unsigned int fd, unsigned int offset);
374e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
375e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_BOOL port_ip_populated();
376e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_BOOL port_op_populated();
377e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
378e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE flush(unsigned int port_index);
379e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
380e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    int  ion_memory_alloc_map(struct ion_allocation_data *p_alloc_data,
381e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                              struct ion_fd_data         *p_fd_data,
382e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                              OMX_U32                     size,
383e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                              OMX_U32                     alignment);
384e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    void ion_memory_free(struct vdec_ion *p_ion_buf_info);
385e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
386e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    // component callback functions
387e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
388e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    void swvdec_empty_buffer_done(SWVDEC_BUFFER *p_buffer_ip);
389e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    void swvdec_fill_buffer_done(SWVDEC_BUFFER *p_buffer_op);
390e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    void swvdec_event_handler(SWVDEC_EVENT event, void *p_data);
391e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
392e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE retval_swvdec2omx(SWVDEC_STATUS retval_swvdec);
393e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
394e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    // status bits for pending events
395e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    enum {
396e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        PENDING_STATE_LOADED_TO_IDLE,    ///< loaded to idle state
397e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        PENDING_STATE_EXECUTING_TO_IDLE, ///< executing to idle state
398e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        PENDING_STATE_IDLE_TO_LOADED,    ///< idle to loaded state
399e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        PENDING_PORT_ENABLE_IP,          ///< enablement of ip port
400e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        PENDING_PORT_ENABLE_OP,          ///< enablement of op port
401e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        PENDING_PORT_DISABLE_IP,         ///< disablement of ip port
402e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        PENDING_PORT_DISABLE_OP,         ///< disablement of op port
403e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        PENDING_PORT_FLUSH_IP,           ///< flush of ip port
404e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        PENDING_PORT_FLUSH_OP            ///< flush of op port
405e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    };
406e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
407e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    // events raised internally
408e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    enum {
409e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_EVENT_CMD,           ///< command event
410e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_EVENT_CMD_ACK,       ///< command acknowledgement
411e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_EVENT_ERROR,         ///< error event
412e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_EVENT_ETB,           ///< ETB event
413e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_EVENT_EBD,           ///< EBD event
414e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_EVENT_FTB,           ///< FTB event
415e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_EVENT_FBD,           ///< FBD event
416e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_EVENT_EOS,           ///< EOS event
417e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_EVENT_FLUSH_PORT_IP, ///< flush ip port event
418e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_EVENT_FLUSH_PORT_OP, ///< flush op port event
419e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        OMX_SWVDEC_EVENT_PORT_RECONFIG  ///< port reconfig event
420e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    };
421e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
422e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE async_thread_create();
423e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    void          async_thread_destroy();
424e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
425e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    static void   async_thread(void *p_cmp);
426e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
427e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    bool          async_post_event(unsigned long event_id,
428e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                   unsigned long event_param1,
429e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                   unsigned long event_param2);
430e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
431e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    static void   async_process_event(void *p_cmp);
432e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
433e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE async_process_event_cmd(OMX_COMMANDTYPE cmd, OMX_U32 param);
434e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE async_process_event_cmd_ack(OMX_COMMANDTYPE cmd,
435e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                              OMX_U32         param);
436e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE async_process_event_error(OMX_ERRORTYPE error_code);
437e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE async_process_event_cmd_state_set(bool         *p_cmd_ack,
438e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                    OMX_STATETYPE state_new);
439e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE async_process_event_cmd_flush(unsigned int port_index);
440e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE async_process_event_cmd_port_disable(
441e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        bool         *p_cmd_ack,
442e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin        unsigned int  port_index);
443e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE async_process_event_cmd_port_enable(bool         *p_cmd_ack,
444e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                                      unsigned int  port_index);
445e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE async_process_event_etb(OMX_BUFFERHEADERTYPE *p_buffer_hdr,
446e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          unsigned int          index);
447e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE async_process_event_ftb(OMX_BUFFERHEADERTYPE *p_buffer_hdr,
448e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          unsigned int          index);
449e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE async_process_event_ebd(OMX_BUFFERHEADERTYPE *p_buffer_hdr,
450e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          unsigned int          index);
451e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE async_process_event_fbd(OMX_BUFFERHEADERTYPE *p_buffer_hdr,
452e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin                                          unsigned int          index);
453e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE async_process_event_eos();
454e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE async_process_event_flush_port_ip();
455e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE async_process_event_flush_port_op();
456e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin    OMX_ERRORTYPE async_process_event_port_reconfig();
457e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin};
458e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin
459e4010605f233a213cf0d972397bb33c34c364227Patrick Tjin#endif // #ifndef _OMX_SWVDEC_H_
460