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