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