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