1/*--------------------------------------------------------------------------
2Copyright (c) 2010-2012, 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#include <stdio.h>
45#include <string.h>
46#include <inttypes.h>
47#include <cstddef>
48#include <gralloc_priv.h>
49
50static ptrdiff_t x;
51
52#ifdef _ANDROID_
53#ifdef USE_ION
54#include <linux/msm_ion.h>
55#endif
56#include <binder/MemoryHeapBase.h>
57#include <ui/ANativeObjectBase.h>
58#include <binder/IServiceManager.h>
59extern "C"{
60#include<utils/Log.h>
61}
62#include <linux/videodev2.h>
63#include <poll.h>
64#define TIMEOUT 5000
65#ifdef MAX_RES_720P
66#define LOG_TAG "OMX-VDEC-720P"
67#elif MAX_RES_1080P
68#define LOG_TAG "OMX-VDEC-1080P"
69#else
70#define LOG_TAG "OMX-VDEC"
71#endif
72#ifdef ENABLE_DEBUG_LOW
73#define DEBUG_PRINT_LOW ALOGE
74#else
75#define DEBUG_PRINT_LOW
76#endif
77#ifdef ENABLE_DEBUG_HIGH
78#define DEBUG_PRINT_HIGH ALOGE
79#else
80#define DEBUG_PRINT_HIGH
81#endif
82#ifdef ENABLE_DEBUG_ERROR
83#define DEBUG_PRINT_ERROR ALOGE
84#else
85#define DEBUG_PRINT_ERROR
86#endif
87
88#else //_ANDROID_
89#define DEBUG_PRINT_LOW printf
90#define DEBUG_PRINT_HIGH printf
91#define DEBUG_PRINT_ERROR printf
92#endif // _ANDROID_
93
94#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
95#include <media/hardware/HardwareAPI.h>
96#endif
97
98#include <unistd.h>
99
100#if defined (_ANDROID_ICS_)
101#include <IQService.h>
102#endif
103
104#include <pthread.h>
105#ifndef PC_DEBUG
106#include <semaphore.h>
107#endif
108#include "OMX_Core.h"
109#include "OMX_QCOMExtns.h"
110#include "qc_omx_component.h"
111#include <linux/msm_vidc_dec.h>
112#include "frameparser.h"
113#ifdef MAX_RES_1080P
114#include "mp4_utils.h"
115#endif
116#include "extra_data_handler.h"
117#include "ts_parser.h"
118#include "vidc_color_converter.h"
119extern "C" {
120  OMX_API void * get_omx_component_factory_fn(void);
121}
122
123#ifdef _ANDROID_
124    using namespace android;
125#ifdef USE_ION
126    class VideoHeap : public MemoryHeapBase
127    {
128    public:
129        VideoHeap(int devicefd, size_t size, void* base,struct ion_handle *handle,int mapfd);
130        virtual ~VideoHeap() {}
131    private:
132       int m_ion_device_fd;
133       struct ion_handle *m_ion_handle;
134    };
135#else
136    // local pmem heap object
137    class VideoHeap : public MemoryHeapBase
138    {
139    public:
140        VideoHeap(int fd, size_t size, void* base);
141        virtual ~VideoHeap() {}
142    };
143#endif
144#endif // _ANDROID_
145//////////////////////////////////////////////////////////////////////////////
146//                       Module specific globals
147//////////////////////////////////////////////////////////////////////////////
148#define OMX_SPEC_VERSION  0x00000101
149
150
151//////////////////////////////////////////////////////////////////////////////
152//               Macros
153//////////////////////////////////////////////////////////////////////////////
154#define PrintFrameHdr(bufHdr) DEBUG_PRINT("bufHdr %x buf %x size %d TS %d\n",\
155                       (unsigned) bufHdr,\
156                       (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->pBuffer,\
157                       (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nFilledLen,\
158                       (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nTimeStamp)
159
160// BitMask Management logic
161#define BITS_PER_BYTE        32
162#define BITMASK_SIZE(mIndex) (((mIndex) + BITS_PER_BYTE - 1)/BITS_PER_BYTE)
163#define BITMASK_OFFSET(mIndex) ((mIndex)/BITS_PER_BYTE)
164#define BITMASK_FLAG(mIndex) (1 << ((mIndex) % BITS_PER_BYTE))
165#define BITMASK_CLEAR(mArray,mIndex) (mArray)[BITMASK_OFFSET(mIndex)] \
166        &=  ~(BITMASK_FLAG(mIndex))
167#define BITMASK_SET(mArray,mIndex)  (mArray)[BITMASK_OFFSET(mIndex)] \
168        |=  BITMASK_FLAG(mIndex)
169#define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \
170        & BITMASK_FLAG(mIndex))
171#define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
172        & BITMASK_FLAG(mIndex)) == 0x0)
173#define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \
174        & BITMASK_FLAG(mIndex))
175#define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
176        & BITMASK_FLAG(mIndex)) == 0x0)
177
178#define OMX_CORE_CONTROL_CMDQ_SIZE   100
179#define OMX_CORE_QCIF_HEIGHT         144
180#define OMX_CORE_QCIF_WIDTH          176
181#define OMX_CORE_VGA_HEIGHT          480
182#define OMX_CORE_VGA_WIDTH           640
183#define OMX_CORE_WVGA_HEIGHT         480
184#define OMX_CORE_WVGA_WIDTH          800
185
186#define DESC_BUFFER_SIZE (8192 * 16)
187
188#ifdef _ANDROID_
189#define MAX_NUM_INPUT_OUTPUT_BUFFERS 32
190#endif
191
192#define OMX_FRAMEINFO_EXTRADATA 0x00010000
193#define OMX_INTERLACE_EXTRADATA 0x00020000
194#define OMX_TIMEINFO_EXTRADATA  0x00040000
195#define OMX_PORTDEF_EXTRADATA   0x00080000
196#define DRIVER_EXTRADATA_MASK   0x0000FFFF
197
198#define OMX_INTERLACE_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
199                                       sizeof(OMX_STREAMINTERLACEFORMAT) + 3)&(~3))
200#define OMX_FRAMEINFO_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
201                                       sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO) + 3)&(~3))
202#define OMX_PORTDEF_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
203                                       sizeof(OMX_PARAM_PORTDEFINITIONTYPE) + 3)&(~3))
204
205//  Define next macro with required values to enable default extradata,
206//    VDEC_EXTRADATA_MB_ERROR_MAP
207//    OMX_INTERLACE_EXTRADATA
208//    OMX_FRAMEINFO_EXTRADATA
209//    OMX_TIMEINFO_EXTRADATA
210
211//#define DEFAULT_EXTRADATA (OMX_FRAMEINFO_EXTRADATA|OMX_INTERLACE_EXTRADATA)
212
213enum port_indexes
214{
215    OMX_CORE_INPUT_PORT_INDEX        =0,
216    OMX_CORE_OUTPUT_PORT_INDEX       =1
217};
218#ifdef USE_ION
219struct vdec_ion
220{
221    int ion_device_fd;
222    struct ion_fd_data fd_ion_data;
223    struct ion_allocation_data ion_alloc_data;
224};
225#endif
226
227struct video_driver_context
228{
229    int video_driver_fd;
230    enum vdec_codec decoder_format;
231    enum vdec_output_fromat output_format;
232    enum vdec_interlaced_format interlace;
233    enum vdec_output_order picture_order;
234    struct vdec_picsize video_resolution;
235    struct vdec_allocatorproperty ip_buf;
236    struct vdec_allocatorproperty op_buf;
237    struct vdec_bufferpayload *ptr_inputbuffer;
238    struct vdec_bufferpayload *ptr_outputbuffer;
239    struct vdec_output_frameinfo *ptr_respbuffer;
240#ifdef USE_ION
241    struct vdec_ion *ip_buf_ion_info;
242    struct vdec_ion *op_buf_ion_info;
243    struct vdec_ion h264_mv;
244#endif
245    struct vdec_framerate frame_rate;
246    unsigned extradata;
247    bool timestamp_adjust;
248    char kind[128];
249    bool idr_only_decoding;
250    unsigned disable_dmx;
251};
252
253#ifdef _ANDROID_
254class DivXDrmDecrypt;
255#endif //_ANDROID_
256
257// OMX video decoder class
258class omx_vdec: public qc_omx_component
259{
260
261public:
262    omx_vdec();  // constructor
263    virtual ~omx_vdec();  // destructor
264
265    static int async_message_process (void *context, void* message);
266    static void process_event_cb(void *ctxt,unsigned char id);
267
268    OMX_ERRORTYPE allocate_buffer(
269                                   OMX_HANDLETYPE hComp,
270                                   OMX_BUFFERHEADERTYPE **bufferHdr,
271                                   OMX_U32 port,
272                                   OMX_PTR appData,
273                                   OMX_U32 bytes
274                                  );
275
276
277    OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp);
278
279    OMX_ERRORTYPE component_init(OMX_STRING role);
280
281    OMX_ERRORTYPE component_role_enum(
282                                       OMX_HANDLETYPE hComp,
283                                       OMX_U8 *role,
284                                       OMX_U32 index
285                                      );
286
287    OMX_ERRORTYPE component_tunnel_request(
288                                            OMX_HANDLETYPE hComp,
289                                            OMX_U32 port,
290                                            OMX_HANDLETYPE  peerComponent,
291                                            OMX_U32 peerPort,
292                                            OMX_TUNNELSETUPTYPE *tunnelSetup
293                                           );
294
295    OMX_ERRORTYPE empty_this_buffer(
296                                     OMX_HANDLETYPE hComp,
297                                     OMX_BUFFERHEADERTYPE *buffer
298                                    );
299
300
301
302    OMX_ERRORTYPE fill_this_buffer(
303                                    OMX_HANDLETYPE hComp,
304                                    OMX_BUFFERHEADERTYPE *buffer
305                                   );
306
307
308    OMX_ERRORTYPE free_buffer(
309                              OMX_HANDLETYPE hComp,
310                              OMX_U32 port,
311                              OMX_BUFFERHEADERTYPE *buffer
312                              );
313
314    OMX_ERRORTYPE get_component_version(
315                                        OMX_HANDLETYPE hComp,
316                                        OMX_STRING componentName,
317                                        OMX_VERSIONTYPE *componentVersion,
318                                        OMX_VERSIONTYPE *specVersion,
319                                        OMX_UUIDTYPE *componentUUID
320                                        );
321
322    OMX_ERRORTYPE get_config(
323                              OMX_HANDLETYPE hComp,
324                              OMX_INDEXTYPE configIndex,
325                              OMX_PTR configData
326                             );
327
328    OMX_ERRORTYPE get_extension_index(
329                                      OMX_HANDLETYPE hComp,
330                                      OMX_STRING paramName,
331                                      OMX_INDEXTYPE *indexType
332                                      );
333
334    OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE hComp,
335                                OMX_INDEXTYPE  paramIndex,
336                                OMX_PTR        paramData);
337
338    OMX_ERRORTYPE get_state(OMX_HANDLETYPE hComp,
339                            OMX_STATETYPE *state);
340
341
342
343    OMX_ERRORTYPE send_command(OMX_HANDLETYPE  hComp,
344                               OMX_COMMANDTYPE cmd,
345                               OMX_U32         param1,
346                               OMX_PTR         cmdData);
347
348
349    OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE   hComp,
350                                OMX_CALLBACKTYPE *callbacks,
351                                OMX_PTR          appData);
352
353    OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp,
354                             OMX_INDEXTYPE  configIndex,
355                             OMX_PTR        configData);
356
357    OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp,
358                                OMX_INDEXTYPE  paramIndex,
359                                OMX_PTR        paramData);
360
361    OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE      hComp,
362                             OMX_BUFFERHEADERTYPE **bufferHdr,
363                             OMX_U32              port,
364                             OMX_PTR              appData,
365                             OMX_U32              bytes,
366                             OMX_U8               *buffer);
367
368    OMX_ERRORTYPE  use_input_heap_buffers(
369                          OMX_HANDLETYPE            hComp,
370                          OMX_BUFFERHEADERTYPE** bufferHdr,
371                          OMX_U32                   port,
372                          OMX_PTR                   appData,
373                          OMX_U32                   bytes,
374                          OMX_U8*                   buffer);
375
376    OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE     hComp,
377                                OMX_BUFFERHEADERTYPE **bufferHdr,
378                                OMX_U32              port,
379                                OMX_PTR              appData,
380                                void *               eglImage);
381    void complete_pending_buffer_done_cbs();
382    void update_resolution(int width, int height);
383    struct video_driver_context drv_ctx;
384    int  m_pipe_in;
385    int  m_pipe_out;
386    pthread_t msg_thread_id;
387    pthread_t async_thread_id;
388    bool is_component_secure();
389
390private:
391    // Bit Positions
392    enum flags_bit_positions
393    {
394        // Defer transition to IDLE
395        OMX_COMPONENT_IDLE_PENDING            =0x1,
396        // Defer transition to LOADING
397        OMX_COMPONENT_LOADING_PENDING         =0x2,
398        // First  Buffer Pending
399        OMX_COMPONENT_FIRST_BUFFER_PENDING    =0x3,
400        // Second Buffer Pending
401        OMX_COMPONENT_SECOND_BUFFER_PENDING   =0x4,
402        // Defer transition to Enable
403        OMX_COMPONENT_INPUT_ENABLE_PENDING    =0x5,
404        // Defer transition to Enable
405        OMX_COMPONENT_OUTPUT_ENABLE_PENDING   =0x6,
406        // Defer transition to Disable
407        OMX_COMPONENT_INPUT_DISABLE_PENDING   =0x7,
408        // Defer transition to Disable
409        OMX_COMPONENT_OUTPUT_DISABLE_PENDING  =0x8,
410        //defer flush notification
411        OMX_COMPONENT_OUTPUT_FLUSH_PENDING    =0x9,
412        OMX_COMPONENT_INPUT_FLUSH_PENDING    =0xA,
413        OMX_COMPONENT_PAUSE_PENDING          =0xB,
414        OMX_COMPONENT_EXECUTE_PENDING        =0xC,
415        OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING =0xD,
416        OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED=0xE
417    };
418
419    // Deferred callback identifiers
420    enum
421    {
422        //Event Callbacks from the vdec component thread context
423        OMX_COMPONENT_GENERATE_EVENT       = 0x1,
424        //Buffer Done callbacks from the vdec component thread context
425        OMX_COMPONENT_GENERATE_BUFFER_DONE = 0x2,
426        //Frame Done callbacks from the vdec component thread context
427        OMX_COMPONENT_GENERATE_FRAME_DONE  = 0x3,
428        //Buffer Done callbacks from the vdec component thread context
429        OMX_COMPONENT_GENERATE_FTB         = 0x4,
430        //Frame Done callbacks from the vdec component thread context
431        OMX_COMPONENT_GENERATE_ETB         = 0x5,
432        //Command
433        OMX_COMPONENT_GENERATE_COMMAND     = 0x6,
434        //Push-Pending Buffers
435        OMX_COMPONENT_PUSH_PENDING_BUFS    = 0x7,
436        // Empty Buffer Done callbacks
437        OMX_COMPONENT_GENERATE_EBD         = 0x8,
438        //Flush Event Callbacks from the vdec component thread context
439        OMX_COMPONENT_GENERATE_EVENT_FLUSH       = 0x9,
440        OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH = 0x0A,
441        OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH = 0x0B,
442        OMX_COMPONENT_GENERATE_FBD = 0xc,
443        OMX_COMPONENT_GENERATE_START_DONE = 0xD,
444        OMX_COMPONENT_GENERATE_PAUSE_DONE = 0xE,
445        OMX_COMPONENT_GENERATE_RESUME_DONE = 0xF,
446        OMX_COMPONENT_GENERATE_STOP_DONE = 0x10,
447        OMX_COMPONENT_GENERATE_HARDWARE_ERROR = 0x11,
448        OMX_COMPONENT_GENERATE_ETB_ARBITRARY = 0x12,
449        OMX_COMPONENT_GENERATE_PORT_RECONFIG = 0x13,
450        OMX_COMPONENT_GENERATE_EOS_DONE = 0x14,
451        OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG = 0x15,
452        OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED = 0x16,
453    };
454
455    enum vc1_profile_type
456    {
457        VC1_SP_MP_RCV = 1,
458        VC1_AP = 2
459    };
460
461#ifdef _COPPER_
462    enum v4l2_ports
463    {
464        CAPTURE_PORT,
465        OUTPUT_PORT,
466        MAX_PORT
467    };
468#endif
469
470    struct omx_event
471    {
472        unsigned param1;
473        unsigned param2;
474        unsigned id;
475    };
476
477    struct omx_cmd_queue
478    {
479        omx_event m_q[OMX_CORE_CONTROL_CMDQ_SIZE];
480        unsigned m_read;
481        unsigned m_write;
482        unsigned m_size;
483
484        omx_cmd_queue();
485        ~omx_cmd_queue();
486        bool insert_entry(unsigned p1, unsigned p2, unsigned id);
487        bool pop_entry(unsigned *p1,unsigned *p2, unsigned *id);
488        // get msgtype of the first ele from the queue
489        unsigned get_q_msg_type();
490
491    };
492
493#ifdef _ANDROID_
494    struct ts_entry
495    {
496        OMX_TICKS timestamp;
497        bool valid;
498    };
499
500    struct ts_arr_list
501    {
502        ts_entry m_ts_arr_list[MAX_NUM_INPUT_OUTPUT_BUFFERS];
503
504        ts_arr_list();
505        ~ts_arr_list();
506
507        bool insert_ts(OMX_TICKS ts);
508        bool pop_min_ts(OMX_TICKS &ts);
509        bool reset_ts_list();
510    };
511#endif
512
513    struct desc_buffer_hdr
514    {
515        OMX_U8 *buf_addr;
516        OMX_U32 desc_data_size;
517    };
518    bool allocate_done(void);
519    bool allocate_input_done(void);
520    bool allocate_output_done(void);
521
522    OMX_ERRORTYPE free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
523    OMX_ERRORTYPE free_input_buffer(unsigned int bufferindex,
524                                    OMX_BUFFERHEADERTYPE *pmem_bufferHdr);
525    OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
526    void free_output_buffer_header();
527    void free_input_buffer_header();
528    OMX_ERRORTYPE update_color_format(OMX_COLOR_FORMATTYPE eColorFormat);
529    OMX_ERRORTYPE allocate_input_heap_buffer(OMX_HANDLETYPE       hComp,
530                                             OMX_BUFFERHEADERTYPE **bufferHdr,
531                                             OMX_U32              port,
532                                             OMX_PTR              appData,
533                                             OMX_U32              bytes);
534
535
536    OMX_ERRORTYPE allocate_input_buffer(OMX_HANDLETYPE       hComp,
537                                        OMX_BUFFERHEADERTYPE **bufferHdr,
538                                        OMX_U32              port,
539                                        OMX_PTR              appData,
540                                        OMX_U32              bytes);
541
542    OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE       hComp,
543                                         OMX_BUFFERHEADERTYPE **bufferHdr,
544                                         OMX_U32 port,OMX_PTR appData,
545                                         OMX_U32              bytes);
546    OMX_ERRORTYPE use_output_buffer(OMX_HANDLETYPE hComp,
547                                   OMX_BUFFERHEADERTYPE   **bufferHdr,
548                                   OMX_U32                port,
549                                   OMX_PTR                appData,
550                                   OMX_U32                bytes,
551                                   OMX_U8                 *buffer);
552
553#ifdef MAX_RES_720P
554    OMX_ERRORTYPE get_supported_profile_level_for_720p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType);
555#endif
556#ifdef MAX_RES_1080P
557    OMX_ERRORTYPE get_supported_profile_level_for_1080p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType);
558#endif
559
560    OMX_ERRORTYPE allocate_desc_buffer(OMX_U32 index);
561    OMX_ERRORTYPE allocate_output_headers();
562    bool execute_omx_flush(OMX_U32);
563    bool execute_output_flush();
564    bool execute_input_flush();
565    OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE hComp,
566                                    OMX_BUFFERHEADERTYPE * buffer);
567
568    OMX_ERRORTYPE fill_buffer_done(OMX_HANDLETYPE hComp,
569                                    OMX_BUFFERHEADERTYPE * buffer);
570    OMX_ERRORTYPE empty_this_buffer_proxy(OMX_HANDLETYPE       hComp,
571                                        OMX_BUFFERHEADERTYPE *buffer);
572
573    OMX_ERRORTYPE empty_this_buffer_proxy_arbitrary(OMX_HANDLETYPE hComp,
574                                                   OMX_BUFFERHEADERTYPE *buffer
575                                                   );
576
577    OMX_ERRORTYPE push_input_buffer (OMX_HANDLETYPE hComp);
578    OMX_ERRORTYPE push_input_sc_codec (OMX_HANDLETYPE hComp);
579    OMX_ERRORTYPE push_input_h264 (OMX_HANDLETYPE hComp);
580    OMX_ERRORTYPE push_input_vc1 (OMX_HANDLETYPE hComp);
581
582    OMX_ERRORTYPE fill_this_buffer_proxy(OMX_HANDLETYPE       hComp,
583                                       OMX_BUFFERHEADERTYPE *buffer);
584    bool release_done();
585
586    bool release_output_done();
587    bool release_input_done();
588    OMX_ERRORTYPE get_buffer_req(vdec_allocatorproperty *buffer_prop);
589    OMX_ERRORTYPE set_buffer_req(vdec_allocatorproperty *buffer_prop);
590    OMX_ERRORTYPE start_port_reconfig();
591    OMX_ERRORTYPE update_picture_resolution();
592	void stream_off();
593    void adjust_timestamp(OMX_S64 &act_timestamp);
594    void set_frame_rate(OMX_S64 act_timestamp);
595    void handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr);
596    OMX_ERRORTYPE enable_extradata(OMX_U32 requested_extradata, bool enable = true);
597    void print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra);
598    void append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
599                                    OMX_U32 interlaced_format_type);
600    void append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
601                               OMX_U32 num_conceal_mb,
602                               OMX_U32 picture_type,
603                               OMX_S64 timestamp,
604                               OMX_U32 frame_rate,
605                               struct vdec_aspectratioinfo *aspect_ratio_info);
606    void fill_aspect_ratio_info(struct vdec_aspectratioinfo *aspect_ratio_info,
607                                OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info);
608    void append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra);
609    OMX_ERRORTYPE update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn);
610    void append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra);
611    void insert_demux_addr_offset(OMX_U32 address_offset);
612    void extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr);
613    OMX_ERRORTYPE handle_demux_data(OMX_BUFFERHEADERTYPE *buf_hdr);
614    OMX_U32 count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra);
615
616#ifdef USE_ION
617    int alloc_map_ion_memory(OMX_U32 buffer_size,
618              OMX_U32 alignment, struct ion_allocation_data *alloc_data,
619              struct ion_fd_data *fd_data,int flag);
620    void free_ion_memory(struct vdec_ion *buf_ion_info);
621#else
622    bool align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
623                            OMX_U32 alignment);
624#endif
625
626
627    OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE  hComp,
628                                     OMX_COMMANDTYPE cmd,
629                                     OMX_U32         param1,
630                                     OMX_PTR         cmdData);
631    bool post_event( unsigned int p1,
632                     unsigned int p2,
633                     unsigned int id
634                    );
635    inline int clip2(int x)
636    {
637        x = x -1;
638        x = x | x >> 1;
639        x = x | x >> 2;
640        x = x | x >> 4;
641        x = x | x >> 16;
642        x = x + 1;
643        return x;
644    }
645
646#ifdef MAX_RES_1080P
647    OMX_ERRORTYPE vdec_alloc_h264_mv();
648    void vdec_dealloc_h264_mv();
649#endif
650
651    inline void omx_report_error ()
652    {
653        if (m_cb.EventHandler && !m_error_propogated)
654        {
655            ALOGE("\nERROR: Sending OMX_EventError to Client");
656            m_error_propogated = true;
657            m_cb.EventHandler(&m_cmp,m_app_data,
658                  OMX_EventError,OMX_ErrorHardware,0,NULL);
659        }
660    }
661#ifdef _ANDROID_
662    OMX_ERRORTYPE createDivxDrmContext();
663#endif //_ANDROID_
664#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
665    OMX_ERRORTYPE use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data);
666#endif
667
668    //*************************************************************
669    //*******************MEMBER VARIABLES *************************
670    //*************************************************************
671    pthread_mutex_t       m_lock;
672    pthread_mutex_t       c_lock;
673    //sem to handle the minimum procesing of commands
674    sem_t                 m_cmd_lock;
675    bool              m_error_propogated;
676    // compression format
677    OMX_VIDEO_CODINGTYPE eCompressionFormat;
678    // OMX State
679    OMX_STATETYPE m_state;
680    // Application data
681    OMX_PTR m_app_data;
682    // Application callbacks
683    OMX_CALLBACKTYPE m_cb;
684    OMX_PRIORITYMGMTTYPE m_priority_mgm ;
685    OMX_PARAM_BUFFERSUPPLIERTYPE m_buffer_supplier;
686    // fill this buffer queue
687    omx_cmd_queue         m_ftb_q;
688    // Command Q for rest of the events
689    omx_cmd_queue         m_cmd_q;
690    omx_cmd_queue         m_etb_q;
691    // Input memory pointer
692    OMX_BUFFERHEADERTYPE  *m_inp_mem_ptr;
693    // Output memory pointer
694    OMX_BUFFERHEADERTYPE  *m_out_mem_ptr;
695    // number of input bitstream error frame count
696    unsigned int m_inp_err_count;
697#ifdef _ANDROID_
698    // Timestamp list
699    ts_arr_list           m_timestamp_list;
700#endif
701
702    bool input_flush_progress;
703    bool output_flush_progress;
704    bool input_use_buffer;
705    bool output_use_buffer;
706    bool ouput_egl_buffers;
707    OMX_BOOL m_use_output_pmem;
708    OMX_BOOL m_out_mem_region_smi;
709    OMX_BOOL m_out_pvt_entry_pmem;
710
711    int pending_input_buffers;
712    int pending_output_buffers;
713    // bitmask array size for output side
714    unsigned int m_out_bm_count;
715    // bitmask array size for input side
716    unsigned int m_inp_bm_count;
717    //Input port Populated
718    OMX_BOOL m_inp_bPopulated;
719    //Output port Populated
720    OMX_BOOL m_out_bPopulated;
721    // encapsulate the waiting states.
722    unsigned int m_flags;
723
724#ifdef _ANDROID_
725    // Heap pointer to frame buffers
726    struct vidc_heap
727    {
728        sp<MemoryHeapBase>    video_heap_ptr;
729    };
730    struct vidc_heap *m_heap_ptr;
731    unsigned int m_heap_count;
732#endif //_ANDROID_
733    // store I/P PORT state
734    OMX_BOOL m_inp_bEnabled;
735    // store O/P PORT state
736    OMX_BOOL m_out_bEnabled;
737    OMX_U32 m_in_alloc_cnt;
738    OMX_U8                m_cRole[OMX_MAX_STRINGNAME_SIZE];
739    // Platform specific details
740    OMX_QCOM_PLATFORM_PRIVATE_LIST      *m_platform_list;
741    OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *m_platform_entry;
742    OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *m_pmem_info;
743    // SPS+PPS sent as part of set_config
744    OMX_VENDOR_EXTRADATATYPE            m_vendor_config;
745
746    /*Variables for arbitrary Byte parsing support*/
747    frame_parse m_frame_parser;
748    omx_cmd_queue m_input_pending_q;
749    omx_cmd_queue m_input_free_q;
750    bool arbitrary_bytes;
751    OMX_BUFFERHEADERTYPE  h264_scratch;
752    OMX_BUFFERHEADERTYPE  *psource_frame;
753    OMX_BUFFERHEADERTYPE  *pdest_frame;
754    OMX_BUFFERHEADERTYPE  *m_inp_heap_ptr;
755    OMX_BUFFERHEADERTYPE  **m_phdr_pmem_ptr;
756    unsigned int m_heap_inp_bm_count;
757    codec_type codec_type_parse;
758    bool first_frame_meta;
759    unsigned frame_count;
760    unsigned nal_count;
761    unsigned nal_length;
762    bool look_ahead_nal;
763    int first_frame;
764    unsigned char *first_buffer;
765    int first_frame_size;
766    unsigned char m_hwdevice_name[80];
767    FILE *m_device_file_ptr;
768    enum vc1_profile_type m_vc1_profile;
769    OMX_S64 h264_last_au_ts;
770    OMX_U32 h264_last_au_flags;
771    OMX_U32 m_demux_offsets[8192];
772    OMX_U32 m_demux_entries;
773
774    OMX_S64 prev_ts;
775    bool rst_prev_ts;
776    OMX_U32 frm_int;
777
778    struct vdec_allocatorproperty op_buf_rcnfg;
779    bool in_reconfig;
780    OMX_NATIVE_WINDOWTYPE m_display_id;
781    h264_stream_parser *h264_parser;
782    OMX_U32 client_extradata;
783#ifdef _ANDROID_
784    bool m_debug_timestamp;
785    bool perf_flag;
786    OMX_U32 proc_frms, latency;
787    perf_metrics fps_metrics;
788    perf_metrics dec_time;
789    bool m_enable_android_native_buffers;
790    bool m_use_android_native_buffers;
791    bool m_debug_extradata;
792    bool m_debug_concealedmb;
793#endif
794#ifdef MAX_RES_1080P
795    MP4_Utils mp4_headerparser;
796#endif
797
798    struct h264_mv_buffer{
799        unsigned char* buffer;
800        int size;
801        int count;
802        int pmem_fd;
803        int offset;
804    };
805    h264_mv_buffer h264_mv_buff;
806	extra_data_handler extra_data_handle;
807#ifdef _ANDROID_
808    DivXDrmDecrypt* iDivXDrmDecrypt;
809#endif //_ANDROID_
810    OMX_PARAM_PORTDEFINITIONTYPE m_port_def;
811    omx_time_stamp_reorder time_stamp_dts;
812    desc_buffer_hdr *m_desc_buffer_ptr;
813    bool secure_mode;
814    OMX_QCOM_EXTRADATA_FRAMEINFO *m_extradata;
815    bool codec_config_flag;
816    OMX_CONFIG_RECTTYPE rectangle;
817#ifdef _COPPER_
818    int capture_capability;
819    int output_capability;
820    bool streaming[MAX_PORT];
821#endif
822
823    // added for smooth streaming
824    private_handle_t * native_buffer[MAX_NUM_INPUT_OUTPUT_BUFFERS];
825    bool m_use_smoothstreaming;
826    OMX_U32 m_smoothstreaming_height;
827    OMX_U32 m_smoothstreaming_width;
828
829    unsigned int m_fill_output_msg;
830    class allocate_color_convert_buf {
831    public:
832        allocate_color_convert_buf();
833        ~allocate_color_convert_buf();
834        void set_vdec_client(void *);
835        void update_client();
836        bool set_color_format(OMX_COLOR_FORMATTYPE dest_color_format);
837        bool get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format);
838        bool update_buffer_req();
839        bool get_buffer_req(unsigned int &buffer_size);
840        OMX_BUFFERHEADERTYPE* get_il_buf_hdr();
841        OMX_BUFFERHEADERTYPE* get_il_buf_hdr(OMX_BUFFERHEADERTYPE *input_hdr);
842        OMX_BUFFERHEADERTYPE* get_dr_buf_hdr(OMX_BUFFERHEADERTYPE *input_hdr);
843        OMX_BUFFERHEADERTYPE* convert(OMX_BUFFERHEADERTYPE *header);
844        OMX_BUFFERHEADERTYPE* queue_buffer(OMX_BUFFERHEADERTYPE *header);
845        OMX_ERRORTYPE allocate_buffers_color_convert(OMX_HANDLETYPE hComp,
846             OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,
847             OMX_U32 bytes);
848        OMX_ERRORTYPE use_output_buffer(OMX_HANDLETYPE hComp,
849             OMX_BUFFERHEADERTYPE **bufferHdr, OMX_U32 port, OMX_PTR appData,
850             OMX_U32 bytes, OMX_U8 *buffer);
851
852        OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
853        void enable_native_buffers(bool enable) {m_native_buffers_enabled = enable;}
854        OMX_U32 get_output_stride();
855        OMX_U32 get_output_scanlines();
856    private:
857        #define MAX_COUNT 32
858        omx_vdec *omx;
859        bool enabled;
860        bool m_native_buffers_enabled;
861        OMX_COLOR_FORMATTYPE ColorFormat;
862        void init_members();
863        bool color_convert_mode;
864        ColorConvertFormat dest_format;
865        class omx_c2d_conv c2d;
866        unsigned int allocated_count;
867        unsigned int buffer_size_req;
868        unsigned int buffer_alignment_req;
869        OMX_QCOM_PLATFORM_PRIVATE_LIST      m_platform_list_client[MAX_COUNT];
870        OMX_QCOM_PLATFORM_PRIVATE_ENTRY     m_platform_entry_client[MAX_COUNT];
871        OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO m_pmem_info_client[MAX_COUNT];
872        OMX_BUFFERHEADERTYPE  m_out_mem_ptr_client[MAX_COUNT];
873        struct vdec_ion op_buf_ion_info[MAX_COUNT];
874        unsigned char *pmem_baseaddress[MAX_COUNT];
875        int pmem_fd[MAX_COUNT];
876        struct vidc_heap
877        {
878            sp<MemoryHeapBase>    video_heap_ptr;
879        };
880        struct vidc_heap m_heap_ptr[MAX_COUNT];
881    };
882    allocate_color_convert_buf client_buffers;
883    static bool m_secure_display; //For qservice
884    int secureDisplay(int mode);
885    int unsecureDisplay(int mode);
886};
887
888#ifdef _COPPER_
889enum instance_state {
890	MSM_VIDC_CORE_UNINIT_DONE = 0x0001,
891	MSM_VIDC_CORE_INIT,
892	MSM_VIDC_CORE_INIT_DONE,
893	MSM_VIDC_OPEN,
894	MSM_VIDC_OPEN_DONE,
895	MSM_VIDC_LOAD_RESOURCES,
896	MSM_VIDC_LOAD_RESOURCES_DONE,
897	MSM_VIDC_START,
898	MSM_VIDC_START_DONE,
899	MSM_VIDC_STOP,
900	MSM_VIDC_STOP_DONE,
901	MSM_VIDC_RELEASE_RESOURCES,
902	MSM_VIDC_RELEASE_RESOURCES_DONE,
903	MSM_VIDC_CLOSE,
904	MSM_VIDC_CLOSE_DONE,
905	MSM_VIDC_CORE_UNINIT,
906};
907
908enum vidc_resposes_id {
909	MSM_VIDC_DECODER_FLUSH_DONE = 0x11,
910	MSM_VIDC_DECODER_EVENT_CHANGE,
911};
912
913#endif // _COPPER_
914
915#endif // __OMX_VDEC_H__
916