omx_video_base.h revision df87813cb87f16ed2d909b9adf0e442879f3f495
1/*--------------------------------------------------------------------------
2Copyright (c) 2010-2014, The Linux Foundation. All rights reserved.
3
4Redistribution and use in source and binary forms, with or without
5modification, are permitted provided that the following conditions are
6met:
7    * Redistributions of source code must retain the above copyright
8      notice, this list of conditions and the following disclaimer.
9    * Redistributions in binary form must reproduce the above
10      copyright notice, this list of conditions and the following
11      disclaimer in the documentation and/or other materials provided
12      with the distribution.
13    * Neither the name of The Linux Foundation nor the names of its
14      contributors may be used to endorse or promote products derived
15      from this software without specific prior written permission.
16
17THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28--------------------------------------------------------------------------*/
29
30#ifndef __OMX_VIDEO_BASE_H__
31#define __OMX_VIDEO_BASE_H__
32/*============================================================================
33                            O p e n M A X   Component
34                                Video Encoder
35
36*//** @file comx_video_base.h
37  This module contains the class definition for openMAX decoder component.
38
39*//*========================================================================*/
40
41//////////////////////////////////////////////////////////////////////////////
42//                             Include Files
43//////////////////////////////////////////////////////////////////////////////
44
45#define LOG_TAG "OMX-VENC"
46#include <stdlib.h>
47#include <stdio.h>
48#include <sys/mman.h>
49#ifdef _ANDROID_
50#include <binder/MemoryHeapBase.h>
51#ifdef _ANDROID_ICS_
52#include "QComOMXMetadata.h"
53#endif
54#endif // _ANDROID_
55#include <pthread.h>
56#include <semaphore.h>
57#include <linux/msm_vidc_enc.h>
58#include "OMX_Core.h"
59#include "OMX_QCOMExtns.h"
60#include "OMX_VideoExt.h"
61#include "OMX_IndexExt.h"
62#include "qc_omx_component.h"
63#include "omx_video_common.h"
64#include "extra_data_handler.h"
65#include <linux/videodev2.h>
66#include <dlfcn.h>
67#include "C2DColorConverter.h"
68#include "vidc_debug.h"
69
70#ifdef _ANDROID_
71using namespace android;
72// local pmem heap object
73class VideoHeap : public MemoryHeapBase
74{
75    public:
76        VideoHeap(int fd, size_t size, void* base);
77        virtual ~VideoHeap() {}
78};
79
80#include <utils/Log.h>
81
82#endif // _ANDROID_
83
84#ifdef USE_ION
85static const char* MEM_DEVICE = "/dev/ion";
86#if defined(MAX_RES_720P) && !defined(_MSM8974_)
87#define MEM_HEAP_ID ION_CAMERA_HEAP_ID
88#else
89#ifdef _MSM8974_
90#define MEM_HEAP_ID ION_IOMMU_HEAP_ID
91#else
92#define MEM_HEAP_ID ION_CP_MM_HEAP_ID
93#endif
94#endif
95#elif MAX_RES_720P
96static const char* MEM_DEVICE = "/dev/pmem_adsp";
97#elif MAX_RES_1080P_EBI
98static const char* MEM_DEVICE  = "/dev/pmem_adsp";
99#elif MAX_RES_1080P
100static const char* MEM_DEVICE = "/dev/pmem_smipool";
101#else
102#error MEM_DEVICE cannot be determined.
103#endif
104
105#ifdef _ION_HEAP_MASK_COMPATIBILITY_WA
106    #define ION_HEAP_MASK heap_mask
107#else
108    #define ION_HEAP_MASK heap_id_mask
109#endif
110
111//////////////////////////////////////////////////////////////////////////////
112//                       Module specific globals
113//////////////////////////////////////////////////////////////////////////////
114
115#define OMX_SPEC_VERSION  0x00000101
116
117
118//////////////////////////////////////////////////////////////////////////////
119//               Macros
120//////////////////////////////////////////////////////////////////////////////
121#define PrintFrameHdr(bufHdr) DEBUG_PRINT("bufHdr %x buf %x size %d TS %d\n",\
122        (unsigned) bufHdr,\
123        (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->pBuffer,\
124        (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nFilledLen,\
125        (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nTimeStamp)
126
127// BitMask Management logic
128#define BITS_PER_BYTE        32
129#define BITMASK_SIZE(mIndex) (((mIndex) + BITS_PER_BYTE - 1)/BITS_PER_BYTE)
130#define BITMASK_OFFSET(mIndex) ((mIndex)/BITS_PER_BYTE)
131#define BITMASK_FLAG(mIndex) (1 << ((mIndex) % BITS_PER_BYTE))
132#define BITMASK_CLEAR(mArray,mIndex) (mArray)[BITMASK_OFFSET(mIndex)] \
133    &=  ~(BITMASK_FLAG(mIndex))
134#define BITMASK_SET(mArray,mIndex)  (mArray)[BITMASK_OFFSET(mIndex)] \
135    |=  BITMASK_FLAG(mIndex)
136#define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \
137        & BITMASK_FLAG(mIndex))
138#define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
139            & BITMASK_FLAG(mIndex)) == 0x0)
140#define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \
141        & BITMASK_FLAG(mIndex))
142#define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
143            & BITMASK_FLAG(mIndex)) == 0x0)
144#ifdef _ANDROID_ICS_
145#define MAX_NUM_INPUT_BUFFERS 32
146#endif
147void* message_thread(void *);
148
149// OMX video class
150class omx_video: public qc_omx_component
151{
152    protected:
153#ifdef _ANDROID_ICS_
154        bool meta_mode_enable;
155        bool c2d_opened;
156        encoder_media_buffer_type meta_buffers[MAX_NUM_INPUT_BUFFERS];
157        OMX_BUFFERHEADERTYPE *opaque_buffer_hdr[MAX_NUM_INPUT_BUFFERS];
158        bool get_syntaxhdr_enable;
159        OMX_BUFFERHEADERTYPE  *psource_frame;
160        OMX_BUFFERHEADERTYPE  *pdest_frame;
161        bool secure_session;
162        //intermediate conversion buffer queued to encoder in case of invalid EOS input
163        OMX_BUFFERHEADERTYPE  *mEmptyEosBuffer;
164
165        class omx_c2d_conv
166        {
167            public:
168                omx_c2d_conv();
169                ~omx_c2d_conv();
170                bool init();
171                bool open(unsigned int height,unsigned int width,
172                        ColorConvertFormat src,
173                        ColorConvertFormat dest,unsigned int src_stride);
174                bool convert(int src_fd, void *src_base, void *src_viraddr,
175                        int dest_fd, void *dest_base, void *dest_viraddr);
176                bool get_buffer_size(int port,unsigned int &buf_size);
177                int get_src_format();
178                void close();
179            private:
180                C2DColorConverterBase *c2dcc;
181                pthread_mutex_t c_lock;
182                void *mLibHandle;
183                ColorConvertFormat src_format;
184                createC2DColorConverter_t *mConvertOpen;
185                destroyC2DColorConverter_t *mConvertClose;
186        };
187        omx_c2d_conv c2d_conv;
188#endif
189    public:
190
191        bool mUseProxyColorFormat;
192        //RGB or non-native input, and we have pre-allocated conversion buffers
193        bool mUsesColorConversion;
194
195        omx_video();  // constructor
196        virtual ~omx_video();  // destructor
197
198        // virtual int async_message_process (void *context, void* message);
199        void process_event_cb(void *ctxt,unsigned char id);
200
201        OMX_ERRORTYPE allocate_buffer(
202                OMX_HANDLETYPE hComp,
203                OMX_BUFFERHEADERTYPE **bufferHdr,
204                OMX_U32 port,
205                OMX_PTR appData,
206                OMX_U32 bytes
207                );
208
209
210        virtual OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp)= 0;
211
212        virtual OMX_ERRORTYPE component_init(OMX_STRING role)= 0;
213
214        virtual OMX_U32 dev_stop(void) = 0;
215        virtual OMX_U32 dev_pause(void) = 0;
216        virtual OMX_U32 dev_start(void) = 0;
217        virtual OMX_U32 dev_flush(unsigned) = 0;
218        virtual OMX_U32 dev_resume(void) = 0;
219        virtual OMX_U32 dev_start_done(void) = 0;
220        virtual OMX_U32 dev_set_message_thread_id(pthread_t) = 0;
221        virtual bool dev_use_buf(void *,unsigned,unsigned) = 0;
222        virtual bool dev_free_buf(void *,unsigned) = 0;
223        virtual bool dev_empty_buf(void *, void *,unsigned,unsigned) = 0;
224        virtual bool dev_fill_buf(void *buffer, void *,unsigned,unsigned) = 0;
225        virtual bool dev_get_buf_req(OMX_U32 *,OMX_U32 *,OMX_U32 *,OMX_U32) = 0;
226        virtual bool dev_get_seq_hdr(void *, unsigned, OMX_U32 *) = 0;
227        virtual bool dev_loaded_start(void) = 0;
228        virtual bool dev_loaded_stop(void) = 0;
229        virtual bool dev_loaded_start_done(void) = 0;
230        virtual bool dev_loaded_stop_done(void) = 0;
231        virtual bool is_secure_session(void) = 0;
232#ifdef _MSM8974_
233        virtual int dev_handle_extradata(void*, int) = 0;
234        virtual int dev_set_format(int) = 0;
235#endif
236        virtual bool dev_is_video_session_supported(OMX_U32 width, OMX_U32 height) = 0;
237        virtual bool dev_get_capability_ltrcount(OMX_U32 *, OMX_U32 *, OMX_U32 *) = 0;
238        virtual bool dev_get_performance_level(OMX_U32 *) = 0;
239        virtual bool dev_get_vui_timing_info(OMX_U32 *) = 0;
240        virtual bool dev_get_peak_bitrate(OMX_U32 *) = 0;
241#ifdef _ANDROID_ICS_
242        void omx_release_meta_buffer(OMX_BUFFERHEADERTYPE *buffer);
243#endif
244        virtual bool dev_color_align(OMX_BUFFERHEADERTYPE *buffer, OMX_U32 width,
245                        OMX_U32 height) = 0;
246        virtual bool dev_get_output_log_flag() = 0;
247        virtual int dev_output_log_buffers(const char *buffer_addr, int buffer_len) = 0;
248        virtual int dev_extradata_log_buffers(char *buffer_addr) = 0;
249        OMX_ERRORTYPE component_role_enum(
250                OMX_HANDLETYPE hComp,
251                OMX_U8 *role,
252                OMX_U32 index
253                );
254
255        OMX_ERRORTYPE component_tunnel_request(
256                OMX_HANDLETYPE hComp,
257                OMX_U32 port,
258                OMX_HANDLETYPE  peerComponent,
259                OMX_U32 peerPort,
260                OMX_TUNNELSETUPTYPE *tunnelSetup
261                );
262
263        OMX_ERRORTYPE empty_this_buffer(
264                OMX_HANDLETYPE hComp,
265                OMX_BUFFERHEADERTYPE *buffer
266                );
267
268
269
270        OMX_ERRORTYPE fill_this_buffer(
271                OMX_HANDLETYPE hComp,
272                OMX_BUFFERHEADERTYPE *buffer
273                );
274
275
276        OMX_ERRORTYPE free_buffer(
277                OMX_HANDLETYPE hComp,
278                OMX_U32 port,
279                OMX_BUFFERHEADERTYPE *buffer
280                );
281
282        OMX_ERRORTYPE get_component_version(
283                OMX_HANDLETYPE hComp,
284                OMX_STRING componentName,
285                OMX_VERSIONTYPE *componentVersion,
286                OMX_VERSIONTYPE *specVersion,
287                OMX_UUIDTYPE *componentUUID
288                );
289
290        OMX_ERRORTYPE get_config(
291                OMX_HANDLETYPE hComp,
292                OMX_INDEXTYPE configIndex,
293                OMX_PTR configData
294                );
295
296        OMX_ERRORTYPE get_extension_index(
297                OMX_HANDLETYPE hComp,
298                OMX_STRING paramName,
299                OMX_INDEXTYPE *indexType
300                );
301
302        OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE hComp,
303                OMX_INDEXTYPE  paramIndex,
304                OMX_PTR        paramData);
305
306        OMX_ERRORTYPE get_state(OMX_HANDLETYPE hComp,
307                OMX_STATETYPE *state);
308
309
310
311        OMX_ERRORTYPE send_command(OMX_HANDLETYPE  hComp,
312                OMX_COMMANDTYPE cmd,
313                OMX_U32         param1,
314                OMX_PTR         cmdData);
315
316
317        OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE   hComp,
318                OMX_CALLBACKTYPE *callbacks,
319                OMX_PTR          appData);
320
321        virtual OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp,
322                OMX_INDEXTYPE  configIndex,
323                OMX_PTR        configData) = 0;
324
325        virtual OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp,
326                OMX_INDEXTYPE  paramIndex,
327                OMX_PTR        paramData) =0;
328
329        OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE      hComp,
330                OMX_BUFFERHEADERTYPE **bufferHdr,
331                OMX_U32              port,
332                OMX_PTR              appData,
333                OMX_U32              bytes,
334                OMX_U8               *buffer);
335
336
337        OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE     hComp,
338                OMX_BUFFERHEADERTYPE **bufferHdr,
339                OMX_U32              port,
340                OMX_PTR              appData,
341                void *               eglImage);
342
343
344
345        int  m_pipe_in;
346        int  m_pipe_out;
347
348        pthread_t msg_thread_id;
349        pthread_t async_thread_id;
350        bool async_thread_created;
351        bool msg_thread_created;
352
353        OMX_U8 m_nkind[128];
354
355
356        //int *input_pmem_fd;
357        //int *output_pmem_fd;
358        struct pmem *m_pInput_pmem;
359        struct pmem *m_pOutput_pmem;
360#ifdef USE_ION
361        struct venc_ion *m_pInput_ion;
362        struct venc_ion *m_pOutput_ion;
363#endif
364
365
366
367    public:
368        // Bit Positions
369        enum flags_bit_positions {
370            // Defer transition to IDLE
371            OMX_COMPONENT_IDLE_PENDING            =0x1,
372            // Defer transition to LOADING
373            OMX_COMPONENT_LOADING_PENDING         =0x2,
374            // First  Buffer Pending
375            OMX_COMPONENT_FIRST_BUFFER_PENDING    =0x3,
376            // Second Buffer Pending
377            OMX_COMPONENT_SECOND_BUFFER_PENDING   =0x4,
378            // Defer transition to Enable
379            OMX_COMPONENT_INPUT_ENABLE_PENDING    =0x5,
380            // Defer transition to Enable
381            OMX_COMPONENT_OUTPUT_ENABLE_PENDING   =0x6,
382            // Defer transition to Disable
383            OMX_COMPONENT_INPUT_DISABLE_PENDING   =0x7,
384            // Defer transition to Disable
385            OMX_COMPONENT_OUTPUT_DISABLE_PENDING  =0x8,
386            //defer flush notification
387            OMX_COMPONENT_OUTPUT_FLUSH_PENDING    =0x9,
388            OMX_COMPONENT_INPUT_FLUSH_PENDING    =0xA,
389            OMX_COMPONENT_PAUSE_PENDING          =0xB,
390            OMX_COMPONENT_EXECUTE_PENDING        =0xC,
391            OMX_COMPONENT_LOADED_START_PENDING = 0xD,
392            OMX_COMPONENT_LOADED_STOP_PENDING = 0xF,
393
394        };
395
396        // Deferred callback identifiers
397        enum {
398            //Event Callbacks from the venc component thread context
399            OMX_COMPONENT_GENERATE_EVENT       = 0x1,
400            //Buffer Done callbacks from the venc component thread context
401            OMX_COMPONENT_GENERATE_BUFFER_DONE = 0x2,
402            //Frame Done callbacks from the venc component thread context
403            OMX_COMPONENT_GENERATE_FRAME_DONE  = 0x3,
404            //Buffer Done callbacks from the venc component thread context
405            OMX_COMPONENT_GENERATE_FTB         = 0x4,
406            //Frame Done callbacks from the venc component thread context
407            OMX_COMPONENT_GENERATE_ETB         = 0x5,
408            //Command
409            OMX_COMPONENT_GENERATE_COMMAND     = 0x6,
410            //Push-Pending Buffers
411            OMX_COMPONENT_PUSH_PENDING_BUFS    = 0x7,
412            // Empty Buffer Done callbacks
413            OMX_COMPONENT_GENERATE_EBD         = 0x8,
414            //Flush Event Callbacks from the venc component thread context
415            OMX_COMPONENT_GENERATE_EVENT_FLUSH       = 0x9,
416            OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH = 0x0A,
417            OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH = 0x0B,
418            OMX_COMPONENT_GENERATE_FBD = 0xc,
419            OMX_COMPONENT_GENERATE_START_DONE = 0xD,
420            OMX_COMPONENT_GENERATE_PAUSE_DONE = 0xE,
421            OMX_COMPONENT_GENERATE_RESUME_DONE = 0xF,
422            OMX_COMPONENT_GENERATE_STOP_DONE = 0x10,
423            OMX_COMPONENT_GENERATE_HARDWARE_ERROR = 0x11,
424            OMX_COMPONENT_GENERATE_LTRUSE_FAILED = 0x12,
425            OMX_COMPONENT_GENERATE_ETB_OPQ = 0x13
426        };
427
428        struct omx_event {
429            unsigned long param1;
430            unsigned long param2;
431            unsigned long id;
432        };
433
434        struct omx_cmd_queue {
435            omx_event m_q[OMX_CORE_CONTROL_CMDQ_SIZE];
436            unsigned long m_read;
437            unsigned long m_write;
438            unsigned long m_size;
439
440            omx_cmd_queue();
441            ~omx_cmd_queue();
442            bool insert_entry(unsigned long p1, unsigned long p2, unsigned long id);
443            bool pop_entry(unsigned long *p1,unsigned long *p2, unsigned long *id);
444            // get msgtype of the first ele from the queue
445            unsigned get_q_msg_type();
446
447        };
448
449        bool allocate_done(void);
450        bool allocate_input_done(void);
451        bool allocate_output_done(void);
452
453        OMX_ERRORTYPE free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
454        OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
455
456        OMX_ERRORTYPE allocate_input_buffer(OMX_HANDLETYPE       hComp,
457                OMX_BUFFERHEADERTYPE **bufferHdr,
458                OMX_U32              port,
459                OMX_PTR              appData,
460                OMX_U32              bytes);
461#ifdef _ANDROID_ICS_
462        OMX_ERRORTYPE allocate_input_meta_buffer(OMX_HANDLETYPE       hComp,
463                OMX_BUFFERHEADERTYPE **bufferHdr,
464                OMX_PTR              appData,
465                OMX_U32              bytes);
466#endif
467        OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE       hComp,
468                OMX_BUFFERHEADERTYPE **bufferHdr,
469                OMX_U32 port,OMX_PTR appData,
470                OMX_U32              bytes);
471
472        OMX_ERRORTYPE use_input_buffer(OMX_HANDLETYPE hComp,
473                OMX_BUFFERHEADERTYPE  **bufferHdr,
474                OMX_U32               port,
475                OMX_PTR               appData,
476                OMX_U32               bytes,
477                OMX_U8                *buffer);
478
479        OMX_ERRORTYPE use_output_buffer(OMX_HANDLETYPE hComp,
480                OMX_BUFFERHEADERTYPE   **bufferHdr,
481                OMX_U32                port,
482                OMX_PTR                appData,
483                OMX_U32                bytes,
484                OMX_U8                 *buffer);
485
486        bool execute_omx_flush(OMX_U32);
487        bool execute_output_flush(void);
488        bool execute_input_flush(void);
489#ifdef _MSM8974_
490        bool execute_flush_all(void);
491#endif
492        OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE hComp,
493                OMX_BUFFERHEADERTYPE * buffer);
494
495        OMX_ERRORTYPE fill_buffer_done(OMX_HANDLETYPE hComp,
496                OMX_BUFFERHEADERTYPE * buffer);
497        OMX_ERRORTYPE empty_this_buffer_proxy(OMX_HANDLETYPE hComp,
498                OMX_BUFFERHEADERTYPE *buffer);
499        OMX_ERRORTYPE empty_this_buffer_opaque(OMX_HANDLETYPE hComp,
500                OMX_BUFFERHEADERTYPE *buffer);
501        OMX_ERRORTYPE push_input_buffer(OMX_HANDLETYPE hComp);
502        OMX_ERRORTYPE convert_queue_buffer(OMX_HANDLETYPE hComp,
503                struct pmem &Input_pmem_info,unsigned long &index);
504        OMX_ERRORTYPE queue_meta_buffer(OMX_HANDLETYPE hComp,
505                struct pmem &Input_pmem_info);
506        OMX_ERRORTYPE push_empty_eos_buffer(OMX_HANDLETYPE hComp,
507                OMX_BUFFERHEADERTYPE *buffer);
508        OMX_ERRORTYPE fill_this_buffer_proxy(OMX_HANDLETYPE hComp,
509                OMX_BUFFERHEADERTYPE *buffer);
510        bool release_done();
511
512        bool release_output_done();
513        bool release_input_done();
514
515        OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE  hComp,
516                OMX_COMMANDTYPE cmd,
517                OMX_U32         param1,
518                OMX_PTR         cmdData);
519        bool post_event( unsigned long p1,
520                unsigned long p2,
521                unsigned long id
522                   );
523        OMX_ERRORTYPE get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType);
524        inline void omx_report_error () {
525            if (m_pCallbacks.EventHandler && !m_error_propogated) {
526                m_error_propogated = true;
527                m_pCallbacks.EventHandler(&m_cmp,m_app_data,
528                        OMX_EventError,OMX_ErrorHardware,0,NULL);
529            }
530        }
531
532        inline void omx_report_unsupported_setting () {
533            if (m_pCallbacks.EventHandler && !m_error_propogated) {
534                m_error_propogated = true;
535                m_pCallbacks.EventHandler(&m_cmp,m_app_data,
536                        OMX_EventError,OMX_ErrorUnsupportedSetting,0,NULL);
537            }
538        }
539
540        void complete_pending_buffer_done_cbs();
541
542#ifdef USE_ION
543        int alloc_map_ion_memory(int size,
544                                 struct ion_allocation_data *alloc_data,
545                                 struct ion_fd_data *fd_data,int flag);
546        void free_ion_memory(struct venc_ion *buf_ion_info);
547#endif
548
549        //*************************************************************
550        //*******************MEMBER VARIABLES *************************
551        //*************************************************************
552
553        pthread_mutex_t       m_lock;
554        sem_t                 m_cmd_lock;
555        bool              m_error_propogated;
556
557        //sem to handle the minimum procesing of commands
558
559
560        // compression format
561        //OMX_VIDEO_CODINGTYPE eCompressionFormat;
562        // OMX State
563        OMX_STATETYPE m_state;
564        // Application data
565        OMX_PTR m_app_data;
566        OMX_BOOL m_use_input_pmem;
567        OMX_BOOL m_use_output_pmem;
568        // Application callbacks
569        OMX_CALLBACKTYPE m_pCallbacks;
570        OMX_PORT_PARAM_TYPE m_sPortParam;
571        OMX_VIDEO_PARAM_PROFILELEVELTYPE m_sParamProfileLevel;
572        OMX_VIDEO_PARAM_PORTFORMATTYPE m_sInPortFormat;
573        OMX_VIDEO_PARAM_PORTFORMATTYPE m_sOutPortFormat;
574        OMX_PARAM_PORTDEFINITIONTYPE m_sInPortDef;
575        OMX_PARAM_PORTDEFINITIONTYPE m_sOutPortDef;
576        OMX_VIDEO_PARAM_MPEG4TYPE m_sParamMPEG4;
577        OMX_VIDEO_PARAM_H263TYPE m_sParamH263;
578        OMX_VIDEO_PARAM_AVCTYPE m_sParamAVC;
579        OMX_VIDEO_PARAM_VP8TYPE m_sParamVP8;
580        OMX_PORT_PARAM_TYPE m_sPortParam_img;
581        OMX_PORT_PARAM_TYPE m_sPortParam_audio;
582        OMX_VIDEO_CONFIG_BITRATETYPE m_sConfigBitrate;
583        OMX_CONFIG_FRAMERATETYPE m_sConfigFramerate;
584        OMX_VIDEO_PARAM_BITRATETYPE m_sParamBitrate;
585        OMX_PRIORITYMGMTTYPE m_sPriorityMgmt;
586        OMX_PARAM_BUFFERSUPPLIERTYPE m_sInBufSupplier;
587        OMX_PARAM_BUFFERSUPPLIERTYPE m_sOutBufSupplier;
588        OMX_CONFIG_ROTATIONTYPE m_sConfigFrameRotation;
589        OMX_CONFIG_INTRAREFRESHVOPTYPE m_sConfigIntraRefreshVOP;
590        OMX_VIDEO_PARAM_QUANTIZATIONTYPE m_sSessionQuantization;
591        OMX_QCOM_VIDEO_PARAM_QPRANGETYPE m_sSessionQPRange;
592        OMX_VIDEO_PARAM_AVCSLICEFMO m_sAVCSliceFMO;
593        QOMX_VIDEO_INTRAPERIODTYPE m_sIntraperiod;
594        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE m_sErrorCorrection;
595        OMX_VIDEO_PARAM_INTRAREFRESHTYPE m_sIntraRefresh;
596        QOMX_VIDEO_PARAM_LTRMODE_TYPE m_sParamLTRMode;
597        QOMX_VIDEO_PARAM_LTRCOUNT_TYPE m_sParamLTRCount;
598        QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE m_sConfigLTRPeriod;
599        QOMX_VIDEO_CONFIG_LTRUSE_TYPE m_sConfigLTRUse;
600        OMX_VIDEO_CONFIG_AVCINTRAPERIOD m_sConfigAVCIDRPeriod;
601        OMX_VIDEO_CONFIG_DEINTERLACE m_sConfigDeinterlace;
602        OMX_VIDEO_VP8REFERENCEFRAMETYPE m_sConfigVp8ReferenceFrame;
603        QOMX_VIDEO_HIERARCHICALLAYERS m_sHierLayers;
604        QOMX_EXTNINDEX_VIDEO_INITIALQP m_sParamInitqp;
605        OMX_U32 m_sExtraData;
606        OMX_U32 m_input_msg_id;
607
608        // fill this buffer queue
609        omx_cmd_queue m_ftb_q;
610        // Command Q for rest of the events
611        omx_cmd_queue m_cmd_q;
612        omx_cmd_queue m_etb_q;
613        // Input memory pointer
614        OMX_BUFFERHEADERTYPE *m_inp_mem_ptr;
615        // Output memory pointer
616        OMX_BUFFERHEADERTYPE *m_out_mem_ptr;
617        omx_cmd_queue m_opq_meta_q;
618        omx_cmd_queue m_opq_pmem_q;
619        OMX_BUFFERHEADERTYPE meta_buffer_hdr[MAX_NUM_INPUT_BUFFERS];
620
621        bool input_flush_progress;
622        bool output_flush_progress;
623        bool input_use_buffer;
624        bool output_use_buffer;
625        int pending_input_buffers;
626        int pending_output_buffers;
627
628        unsigned int m_out_bm_count;
629        unsigned int m_inp_bm_count;
630        unsigned int m_flags;
631        unsigned int m_etb_count;
632        unsigned int m_fbd_count;
633#ifdef _ANDROID_
634        // Heap pointer to frame buffers
635        sp<MemoryHeapBase>    m_heap_ptr;
636#endif //_ANDROID_
637        // to know whether Event Port Settings change has been triggered or not.
638        bool m_event_port_settings_sent;
639        OMX_U8                m_cRole[OMX_MAX_STRINGNAME_SIZE];
640        extra_data_handler extra_data_handle;
641
642};
643
644#endif // __OMX_VIDEO_BASE_H__
645