omx_vdec_hevc_swvdec.h revision e7273837b521d16f87dd5fb6eea3750a51ea92da
1e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/*--------------------------------------------------------------------------
2e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyCopyright (c) 2010, Code Aurora Forum. All rights reserved.
3e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
4e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyRedistribution and use in source and binary forms, with or without
5e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellymodification, are permitted provided that the following conditions are met:
6e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    * Redistributions of source code must retain the above copyright
7e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      notice, this list of conditions and the following disclaimer.
8e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    * Redistributions in binary form must reproduce the above copyright
9e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      notice, this list of conditions and the following disclaimer in the
10e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      documentation and/or other materials provided with the distribution.
11e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    * Neither the name of Code Aurora nor
12e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      the names of its contributors may be used to endorse or promote
13e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      products derived from this software without specific prior written
14e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly      permission.
15e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
16e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyIMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyNON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyCONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyOTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26e7273837b521d16f87dd5fb6eea3750a51ea92daNick PellyADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly--------------------------------------------------------------------------*/
28e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#ifndef __OMX_VDEC_H__
29e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define __OMX_VDEC_H__
30e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly/*============================================================================
31e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                            O p e n M A X   Component
32e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                Video Decoder
33e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
34e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly*//** @file comx_vdec.h
35e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  This module contains the class definition for openMAX decoder component.
36e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
37e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly*//*========================================================================*/
38e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
39e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly//////////////////////////////////////////////////////////////////////////////
40e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly//                             Include Files
41e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly//////////////////////////////////////////////////////////////////////////////
42e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
43e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include<stdlib.h>
44e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
45e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <stdio.h>
46e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
47e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#ifdef _ANDROID_
48e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <binder/MemoryHeapBase.h>
49e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyextern "C"{
50e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include<utils/Log.h>
51e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
52e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define LOG_TAG "OMX-VDEC-720P"
53e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#ifdef ENABLE_DEBUG_LOW
54e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define DEBUG_PRINT_LOW LOGE
55e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#else
56e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define DEBUG_PRINT_LOW
57e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif
58e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#ifdef ENABLE_DEBUG_HIGH
59e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define DEBUG_PRINT_HIGH LOGE
60e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#else
61e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define DEBUG_PRINT_HIGH
62e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif
63e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#ifdef ENABLE_DEBUG_ERROR
64e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define DEBUG_PRINT_ERROR LOGE
65e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#else
66e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define DEBUG_PRINT_ERROR
67e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif
68e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif // _ANDROID_
69e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
70e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <pthread.h>
71e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#ifndef PC_DEBUG
72e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <semaphore.h>
73e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif
74e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include "OMX_Core.h"
75e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include "OMX_QCOMExtns.h"
76e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly//#include "vdec.h"
77e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include "qc_omx_component.h"
78e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly//#include "Map.h"
79e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly//#include "OmxUtils.h"
80e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <linux/msm_vidc_dec.h>
81e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include "frameparser.h"
82e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#include <linux/android_pmem.h>
83e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
84e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyextern "C" {
85e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly  OMX_API void * get_omx_component_factory_fn(void);
86e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly}
87e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
88e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
89e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#ifdef _ANDROID_
90e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    using namespace android;
91e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // local pmem heap object
92e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    class VideoHeap : public MemoryHeapBase
93e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
94e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    public:
95e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        VideoHeap(int fd, size_t size, void* base);
96e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        virtual ~VideoHeap() {}
97e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    };
98e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif // _ANDROID_
99e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly//////////////////////////////////////////////////////////////////////////////
100e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly//                       Module specific globals
101e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly//////////////////////////////////////////////////////////////////////////////
102e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define OMX_SPEC_VERSION  0x00000101
103e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
104e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
105e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly//////////////////////////////////////////////////////////////////////////////
106e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly//               Macros
107e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly//////////////////////////////////////////////////////////////////////////////
108e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define PrintFrameHdr(bufHdr) DEBUG_PRINT("bufHdr %x buf %x size %d TS %d\n",\
109e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                       (unsigned) bufHdr,\
110e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                       (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->pBuffer,\
111e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                       (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nFilledLen,\
112e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                       (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nTimeStamp)
113e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
114e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// BitMask Management logic
115e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define BITS_PER_BYTE        32
116e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define BITMASK_SIZE(mIndex) (((mIndex) + BITS_PER_BYTE - 1)/BITS_PER_BYTE)
117e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define BITMASK_OFFSET(mIndex) ((mIndex)/BITS_PER_BYTE)
118e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define BITMASK_FLAG(mIndex) (1 << ((mIndex) % BITS_PER_BYTE))
119e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define BITMASK_CLEAR(mArray,mIndex) (mArray)[BITMASK_OFFSET(mIndex)] \
120e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        &=  ~(BITMASK_FLAG(mIndex))
121e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define BITMASK_SET(mArray,mIndex)  (mArray)[BITMASK_OFFSET(mIndex)] \
122e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        |=  BITMASK_FLAG(mIndex)
123e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \
124e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        & BITMASK_FLAG(mIndex))
125e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
126e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        & BITMASK_FLAG(mIndex)) == 0x0)
127e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \
128e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        & BITMASK_FLAG(mIndex))
129e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
130e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        & BITMASK_FLAG(mIndex)) == 0x0)
131e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
132e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define OMX_VIDEO_DEC_NUM_INPUT_BUFFERS   2
133e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define OMX_VIDEO_DEC_NUM_OUTPUT_BUFFERS  2
134e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
135e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#ifdef FEATURE_QTV_WVGA_ENABLE
136e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define OMX_VIDEO_DEC_INPUT_BUFFER_SIZE   (256*1024)
137e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#else
138e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define OMX_VIDEO_DEC_INPUT_BUFFER_SIZE   (128*1024)
139e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif
140e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
141e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define OMX_CORE_CONTROL_CMDQ_SIZE   100
142e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define OMX_CORE_QCIF_HEIGHT         144
143e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define OMX_CORE_QCIF_WIDTH          176
144e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define OMX_CORE_VGA_HEIGHT          480
145e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define OMX_CORE_VGA_WIDTH           640
146e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define OMX_CORE_WVGA_HEIGHT         480
147e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#define OMX_CORE_WVGA_WIDTH          800
148e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
149e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
150e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellystruct video_driver_context
151e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
152e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int video_driver_fd;
153e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    enum vdec_codec decoder_format;
154e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    enum vdec_output_fromat output_format;
155e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    struct vdec_picsize video_resoultion;
156e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    struct vdec_allocatorproperty input_buffer;
157e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    struct vdec_allocatorproperty output_buffer;
158e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    struct vdec_bufferpayload *ptr_inputbuffer;
159e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    struct vdec_bufferpayload *ptr_outputbuffer;
160e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    struct vdec_output_frameinfo *ptr_respbuffer;
161e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    char kind[128];
162e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly};
163e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
164e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyclass OmxUtils;
165e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
166e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly// OMX video decoder class
167e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyclass omx_vdec: public qc_omx_component
168e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly{
169e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
170e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellypublic:
171e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx_vdec();  // constructor
172e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    virtual ~omx_vdec();  // destructor
173e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
174e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    static int async_message_process (void *context, void* message);
175e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    static void process_event_cb(void *ctxt,unsigned char id);
176e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
177e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE allocate_buffer(
178e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                   OMX_HANDLETYPE hComp,
179e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                   OMX_BUFFERHEADERTYPE **bufferHdr,
180e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                   OMX_U32 port,
181e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                   OMX_PTR appData,
182e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                   OMX_U32 bytes
183e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                  );
184e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
185e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
186e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp);
187e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
188e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE component_init(OMX_STRING role);
189e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
190e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE component_role_enum(
191e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       OMX_HANDLETYPE hComp,
192e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       OMX_U8 *role,
193e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       OMX_U32 index
194e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      );
195e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
196e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE component_tunnel_request(
197e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                            OMX_HANDLETYPE hComp,
198e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                            OMX_U32 port,
199e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                            OMX_HANDLETYPE  peerComponent,
200e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                            OMX_U32 peerPort,
201e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                            OMX_TUNNELSETUPTYPE *tunnelSetup
202e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                           );
203e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
204e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE empty_this_buffer(
205e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                     OMX_HANDLETYPE hComp,
206e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                     OMX_BUFFERHEADERTYPE *buffer
207e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                    );
208e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
209e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
210e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
211e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE fill_this_buffer(
212e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                    OMX_HANDLETYPE hComp,
213e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                    OMX_BUFFERHEADERTYPE *buffer
214e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                   );
215e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
216e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
217e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE free_buffer(
218e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                              OMX_HANDLETYPE hComp,
219e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                              OMX_U32 port,
220e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                              OMX_BUFFERHEADERTYPE *buffer
221e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                              );
222e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
223e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE get_component_version(
224e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                        OMX_HANDLETYPE hComp,
225e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                        OMX_STRING componentName,
226e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                        OMX_VERSIONTYPE *componentVersion,
227e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                        OMX_VERSIONTYPE *specVersion,
228e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                        OMX_UUIDTYPE *componentUUID
229e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                        );
230e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
231e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE get_config(
232e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                              OMX_HANDLETYPE hComp,
233e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                              OMX_INDEXTYPE configIndex,
234e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                              OMX_PTR configData
235e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                             );
236e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
237e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE get_extension_index(
238e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_HANDLETYPE hComp,
239e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_STRING paramName,
240e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      OMX_INDEXTYPE *indexType
241e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                      );
242e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
243e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE hComp,
244e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                OMX_INDEXTYPE  paramIndex,
245e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                OMX_PTR        paramData);
246e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
247e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE get_state(OMX_HANDLETYPE hComp,
248e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                            OMX_STATETYPE *state);
249e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
250e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
251e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
252e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE send_command(OMX_HANDLETYPE  hComp,
253e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                               OMX_COMMANDTYPE cmd,
254e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                               OMX_U32         param1,
255e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                               OMX_PTR         cmdData);
256e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
257e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
258e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE   hComp,
259e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                OMX_CALLBACKTYPE *callbacks,
260e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                OMX_PTR          appData);
261e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
262e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp,
263e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                             OMX_INDEXTYPE  configIndex,
264e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                             OMX_PTR        configData);
265e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
266e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp,
267e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                OMX_INDEXTYPE  paramIndex,
268e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                OMX_PTR        paramData);
269e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
270e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE      hComp,
271e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                             OMX_BUFFERHEADERTYPE **bufferHdr,
272e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                             OMX_U32              port,
273e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                             OMX_PTR              appData,
274e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                             OMX_U32              bytes,
275e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                             OMX_U8               *buffer);
276e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
277e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
278e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE     hComp,
279e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                OMX_BUFFERHEADERTYPE **bufferHdr,
280e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                OMX_U32              port,
281e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                OMX_PTR              appData,
282e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                void *               eglImage);
283e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
284e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
285e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
286e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    struct video_driver_context driver_context;
287e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int  m_pipe_in;
288e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int  m_pipe_out;
289e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_t msg_thread_id;
290e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_t async_thread_id;
291e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
292e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pellyprivate:
293e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // Bit Positions
294e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    enum flags_bit_positions
295e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
296e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // Defer transition to IDLE
297e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_IDLE_PENDING            =0x1,
298e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // Defer transition to LOADING
299e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_LOADING_PENDING         =0x2,
300e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // First  Buffer Pending
301e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_FIRST_BUFFER_PENDING    =0x3,
302e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // Second Buffer Pending
303e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_SECOND_BUFFER_PENDING   =0x4,
304e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // Defer transition to Enable
305e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_INPUT_ENABLE_PENDING    =0x5,
306e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // Defer transition to Enable
307e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_OUTPUT_ENABLE_PENDING   =0x6,
308e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // Defer transition to Disable
309e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_INPUT_DISABLE_PENDING   =0x7,
310e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // Defer transition to Disable
311e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_OUTPUT_DISABLE_PENDING  =0x8,
312e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        //defer flush notification
313e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_OUTPUT_FLUSH_PENDING    =0x9,
314e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_INPUT_FLUSH_PENDING    =0xA,
315e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_PAUSE_PENDING          =0xB,
316e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_EXECUTE_PENDING        =0xC
317e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
318e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    };
319e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
320e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // Deferred callback identifiers
321e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    enum
322e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
323e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        //Event Callbacks from the vdec component thread context
324e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_GENERATE_EVENT       = 0x1,
325e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        //Buffer Done callbacks from the vdec component thread context
326e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_GENERATE_BUFFER_DONE = 0x2,
327e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        //Frame Done callbacks from the vdec component thread context
328e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_GENERATE_FRAME_DONE  = 0x3,
329e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        //Buffer Done callbacks from the vdec component thread context
330e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_GENERATE_FTB         = 0x4,
331e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        //Frame Done callbacks from the vdec component thread context
332e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_GENERATE_ETB         = 0x5,
333e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        //Command
334e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_GENERATE_COMMAND     = 0x6,
335e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        //Push-Pending Buffers
336e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_PUSH_PENDING_BUFS    = 0x7,
337e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // Empty Buffer Done callbacks
338e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_GENERATE_EBD         = 0x8,
339e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        //Flush Event Callbacks from the vdec component thread context
340e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_GENERATE_EVENT_FLUSH       = 0x9,
341e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH = 0x0A,
342e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH = 0x0B,
343e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_GENERATE_FBD = 0xc,
344e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_GENERATE_START_DONE = 0xD,
345e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_GENERATE_PAUSE_DONE = 0xE,
346e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_GENERATE_RESUME_DONE = 0xF,
347e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_GENERATE_STOP_DONE = 0x10,
348e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_GENERATE_HARDWARE_ERROR = 0x11,
349e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_COMPONENT_GENERATE_ETB_ARBITRARY = 0x12
350e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    };
351e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
352e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    enum port_indexes
353e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
354e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_CORE_INPUT_PORT_INDEX        =0,
355e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        OMX_CORE_OUTPUT_PORT_INDEX       =1
356e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    };
357e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
358e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    enum vc1_profile_type
359e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
360e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        VC1_SP_MP_RCV = 1,
361e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        VC1_AP = 2
362e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    };
363e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
364e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    struct omx_event
365e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
366e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        unsigned param1;
367e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        unsigned param2;
368e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        unsigned id;
369e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    };
370e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
371e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    struct omx_cmd_queue
372e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
373e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        omx_event m_q[OMX_CORE_CONTROL_CMDQ_SIZE];
374e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        unsigned m_read;
375e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        unsigned m_write;
376e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        unsigned m_size;
377e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
378e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        omx_cmd_queue();
379e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        ~omx_cmd_queue();
380e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bool insert_entry(unsigned p1, unsigned p2, unsigned id);
381e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        bool pop_entry(unsigned *p1,unsigned *p2, unsigned *id);
382e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        // get msgtype of the first ele from the queue
383e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        unsigned get_q_msg_type();
384e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
385e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    };
386e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
387e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE omx_vdec_check_port_settings(bool *port_setting_changed);
388e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE omx_vdec_validate_port_param(int height, int width);
389e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
390e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
391e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bool allocate_done(void);
392e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bool allocate_input_done(void);
393e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bool allocate_output_done(void);
394e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
395e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
396e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
397e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
398e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE allocate_input_heap_buffer(OMX_HANDLETYPE       hComp,
399e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                             OMX_BUFFERHEADERTYPE **bufferHdr,
400e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                             OMX_U32              port,
401e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                             OMX_PTR              appData,
402e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                             OMX_U32              bytes);
403e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
404e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
405e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE allocate_input_buffer(OMX_HANDLETYPE       hComp,
406e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                        OMX_BUFFERHEADERTYPE **bufferHdr,
407e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                        OMX_U32              port,
408e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                        OMX_PTR              appData,
409e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                        OMX_U32              bytes);
410e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
411e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE       hComp,
412e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                         OMX_BUFFERHEADERTYPE **bufferHdr,
413e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                         OMX_U32 port,OMX_PTR appData,
414e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                         OMX_U32              bytes);
415e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
416e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE use_input_buffer(OMX_HANDLETYPE hComp,
417e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                   OMX_BUFFERHEADERTYPE  **bufferHdr,
418e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                   OMX_U32               port,
419e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                   OMX_PTR               appData,
420e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                   OMX_U32               bytes,
421e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                   OMX_U8                *buffer);
422e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
423e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE use_output_buffer(OMX_HANDLETYPE hComp,
424e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                   OMX_BUFFERHEADERTYPE   **bufferHdr,
425e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                   OMX_U32                port,
426e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                   OMX_PTR                appData,
427e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                   OMX_U32                bytes,
428e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                   OMX_U8                 *buffer);
429e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
430e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bool execute_omx_flush(OMX_U32);
431e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bool execute_output_flush(OMX_U32);
432e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bool execute_input_flush(OMX_U32);
433e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bool register_output_buffers();
434e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE hComp,
435e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                    OMX_BUFFERHEADERTYPE * buffer);
436e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
437e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE fill_buffer_done(OMX_HANDLETYPE hComp,
438e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                    OMX_BUFFERHEADERTYPE * buffer);
439e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE empty_this_buffer_proxy(OMX_HANDLETYPE       hComp,
440e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                        OMX_BUFFERHEADERTYPE *buffer);
441e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
442e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE empty_this_buffer_proxy_arbitrary(OMX_HANDLETYPE hComp,
443e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                   OMX_BUFFERHEADERTYPE *buffer
444e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                                   );
445e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
446e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE push_input_buffer (OMX_HANDLETYPE hComp);
447e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE push_input_sc_codec (OMX_HANDLETYPE hComp);
448e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE push_input_h264 (OMX_HANDLETYPE hComp);
449e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE push_input_vc1 (OMX_HANDLETYPE hComp);
450e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
451e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE fill_this_buffer_proxy(OMX_HANDLETYPE       hComp,
452e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                       OMX_BUFFERHEADERTYPE *buffer);
453e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bool release_done();
454e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
455e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bool release_output_done();
456e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bool release_input_done();
457e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
458e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bool align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
459e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                            OMX_U32 alignment);
460e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
461e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE  hComp,
462e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                     OMX_COMMANDTYPE cmd,
463e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                     OMX_U32         param1,
464e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                                     OMX_PTR         cmdData);
465e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bool post_event( unsigned int p1,
466e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     unsigned int p2,
467e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                     unsigned int id
468e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                    );
469e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    inline int clip2(int x)
470e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
471e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        x = x -1;
472e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        x = x | x >> 1;
473e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        x = x | x >> 2;
474e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        x = x | x >> 4;
475e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        x = x | x >> 16;
476e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        x = x + 1;
477e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        return x;
478e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
479e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
480e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    inline void omx_report_error ()
481e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    {
482e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        DEBUG_PRINT_ERROR("\nERROR: Sending OMX_EventError to Client");
483e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        if (m_cb.EventHandler && !m_error_propogated)
484e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        {
485e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_error_propogated = true;
486e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly            m_cb.EventHandler(&m_cmp,m_app_data,
487e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly                  OMX_EventError,OMX_ErrorHardware,0,NULL);
488e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly        }
489e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    }
490e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
491e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
492e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    //*************************************************************
493e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    //*******************MEMBER VARIABLES *************************
494e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    //*************************************************************
495e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    pthread_mutex_t       m_lock;
496e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    //sem to handle the minimum procesing of commands
497e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    sem_t                 m_cmd_lock;
498e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bool              m_error_propogated;
499e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // compression format
500e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_VIDEO_CODINGTYPE eCompressionFormat;
501e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // OMX State
502e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_STATETYPE m_state;
503e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // Application data
504e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_PTR m_app_data;
505e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // Application callbacks
506e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_CALLBACKTYPE m_cb;
507e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_COLOR_FORMATTYPE  m_color_format;
508e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_PRIORITYMGMTTYPE m_priority_mgm ;
509e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_PARAM_BUFFERSUPPLIERTYPE m_buffer_supplier;
510e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // fill this buffer queue
511e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx_cmd_queue         m_ftb_q;
512e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // Command Q for rest of the events
513e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx_cmd_queue         m_cmd_q;
514e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx_cmd_queue         m_etb_q;
515e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // Input memory pointer
516e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_BUFFERHEADERTYPE  *m_inp_mem_ptr;
517e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // Output memory pointer
518e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_BUFFERHEADERTYPE  *m_out_mem_ptr;
519e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
520e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bool input_flush_progress;
521e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bool output_flush_progress;
522e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bool input_use_buffer;
523e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bool output_use_buffer;
524e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int pending_input_buffers;
525e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int pending_output_buffers;
526e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int m_ineos_reached;
527e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int m_outeos_pending;
528e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int m_outeos_reached;
529e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // bitmask array size for output side
530e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int m_out_bm_count;
531e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // Number of Output Buffers
532e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int m_out_buf_count;
533e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int m_out_buf_count_min;
534e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int m_out_buf_size;
535e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // Number of Input Buffers
536e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int m_inp_buf_count;
537e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int m_inp_buf_count_min;
538e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // Size of Input Buffers
539e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int m_inp_buf_size;
540e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // bitmask array size for input side
541e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int m_inp_bm_count;
542e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    //Input port Populated
543e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_BOOL m_inp_bPopulated;
544e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    //Output port Populated
545e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_BOOL m_out_bPopulated;
546e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    //Height
547e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int m_height;
548e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // Width
549e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int m_width;
550e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int stride;
551e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int scan_lines;
552e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // Storage of HxW during dynamic port reconfig
553e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int m_port_height;
554e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int m_port_width;
555e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
556e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int m_crop_x;
557e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int m_crop_y;
558e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int m_crop_dx;
559e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int m_crop_dy;
560e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // encapsulate the waiting states.
561e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int m_flags;
562e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
563e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#ifdef _ANDROID_
564e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // Heap pointer to frame buffers
565e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    sp<MemoryHeapBase>    m_heap_ptr;
566e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif //_ANDROID_
567e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // store I/P PORT state
568e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_BOOL m_inp_bEnabled;
569e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // store O/P PORT state
570e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_BOOL m_out_bEnabled;
571e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // to know whether Event Port Settings change has been triggered or not.
572e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bool m_event_port_settings_sent;
573e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_U8                m_cRole[OMX_MAX_STRINGNAME_SIZE];
574e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // Platform specific details
575e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_QCOM_PLATFORM_PRIVATE_LIST      *m_platform_list;
576e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *m_platform_entry;
577e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *m_pmem_info;
578e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    // SPS+PPS sent as part of set_config
579e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_VENDOR_EXTRADATATYPE            m_vendor_config;
580e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
581e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    /*Variables for arbitrary Byte parsing support*/
582e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    frame_parse m_frame_parser;
583e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx_cmd_queue m_input_pending_q;
584e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    omx_cmd_queue m_input_free_q;
585e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bool arbitrary_bytes;
586e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_BUFFERHEADERTYPE  h264_scratch;
587e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_BUFFERHEADERTYPE  *psource_frame;
588e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_BUFFERHEADERTYPE  *pdest_frame;
589e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_BUFFERHEADERTYPE  *m_inp_heap_ptr;
590e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    OMX_BUFFERHEADERTYPE  **m_phdr_pmem_ptr;
591e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int m_heap_inp_bm_count;
592e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    codec_type codec_type_parse;
593e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bool first_frame_meta;
594e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned frame_count;
595e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned nal_count;
596e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned nal_length;
597e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bool look_ahead_nal;
598e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int first_frame;
599e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned char *first_buffer;
600e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    int first_frame_size;
601e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int mp4h263_flags;
602e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int mp4h263_timestamp;
603e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bool set_seq_header_done;
604e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bool gate_output_buffers;
605e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bool gate_input_buffers;
606e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    bool sent_first_frame;
607e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int m_out_buf_count_recon;
608e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int m_out_buf_count_min_recon;
609e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned int m_out_buf_size_recon;
610e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    unsigned char m_hwdevice_name[80];
611e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    FILE *m_device_file_ptr;
612e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly    enum vc1_profile_type m_vc1_profile;
613e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly};
614e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly
615e7273837b521d16f87dd5fb6eea3750a51ea92daNick Pelly#endif // __OMX_VDEC_H__
616