1/*--------------------------------------------------------------------------
2Copyright (c) 2010-2017, 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#ifdef _ANDROID_ICS_
51#include "QComOMXMetadata.h"
52#endif
53#endif // _ANDROID_
54#include <pthread.h>
55#include <semaphore.h>
56#include <linux/msm_vidc_enc.h>
57#include <media/hardware/HardwareAPI.h>
58#include "OMX_Core.h"
59#include "OMX_QCOMExtns.h"
60#include "OMX_Skype_VideoExtensions.h"
61#include "OMX_VideoExt.h"
62#include "OMX_IndexExt.h"
63#include "qc_omx_component.h"
64#include "omx_video_common.h"
65#include "extra_data_handler.h"
66#include <linux/videodev2.h>
67#include <dlfcn.h>
68#include "C2DColorConverter.h"
69#include "vidc_debug.h"
70#include <vector>
71#include "vidc_vendor_extensions.h"
72
73#ifdef _ANDROID_
74using namespace android;
75#include <utils/Log.h>
76
77#endif // _ANDROID_
78
79#ifdef USE_ION
80static const char* MEM_DEVICE = "/dev/ion";
81#if defined(MAX_RES_720P) && !defined(_MSM8974_)
82#define MEM_HEAP_ID ION_CAMERA_HEAP_ID
83#else
84#ifdef _MSM8974_
85#define MEM_HEAP_ID ION_IOMMU_HEAP_ID
86#else
87#define MEM_HEAP_ID ION_CP_MM_HEAP_ID
88#endif
89#endif
90#elif MAX_RES_720P
91static const char* MEM_DEVICE = "/dev/pmem_adsp";
92#elif MAX_RES_1080P_EBI
93static const char* MEM_DEVICE  = "/dev/pmem_adsp";
94#elif MAX_RES_1080P
95static const char* MEM_DEVICE = "/dev/pmem_smipool";
96#else
97#error MEM_DEVICE cannot be determined.
98#endif
99
100//////////////////////////////////////////////////////////////////////////////
101//                       Module specific globals
102//////////////////////////////////////////////////////////////////////////////
103#define OMX_SPEC_VERSION 0x00000101
104#define OMX_INIT_STRUCT(_s_, _name_)            \
105    memset((_s_), 0x0, sizeof(_name_));          \
106(_s_)->nSize = sizeof(_name_);               \
107(_s_)->nVersion.nVersion = OMX_SPEC_VERSION
108
109//////////////////////////////////////////////////////////////////////////////
110//               Macros
111//////////////////////////////////////////////////////////////////////////////
112#define PrintFrameHdr(bufHdr) DEBUG_PRINT("bufHdr %x buf %x size %d TS %d\n",\
113        (unsigned) bufHdr,\
114        (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->pBuffer,\
115        (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nFilledLen,\
116        (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nTimeStamp)
117
118// BitMask Management logic
119#define BITS_PER_INDEX        64
120#define BITMASK_SIZE(mIndex) (((mIndex) + BITS_PER_INDEX - 1)/BITS_PER_INDEX)
121#define BITMASK_OFFSET(mIndex) ((mIndex)/BITS_PER_INDEX)
122#define BITMASK_FLAG(mIndex) ((uint64_t)1 << ((mIndex) % BITS_PER_INDEX))
123#define BITMASK_CLEAR(mArray,mIndex) (mArray)[BITMASK_OFFSET(mIndex)] \
124    &=  ~(BITMASK_FLAG(mIndex))
125#define BITMASK_SET(mArray,mIndex)  (mArray)[BITMASK_OFFSET(mIndex)] \
126    |=  BITMASK_FLAG(mIndex)
127#define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \
128        & BITMASK_FLAG(mIndex))
129#define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
130            & BITMASK_FLAG(mIndex)) == 0x0)
131#define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \
132        & BITMASK_FLAG(mIndex))
133#define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
134            & BITMASK_FLAG(mIndex)) == 0x0)
135
136#define MAX_NUM_INPUT_BUFFERS 64
137#define MAX_NUM_OUTPUT_BUFFERS 64
138
139#ifdef USE_NATIVE_HANDLE_SOURCE
140#define LEGACY_CAM_SOURCE kMetadataBufferTypeNativeHandleSource
141#define LEGACY_CAM_METADATA_TYPE encoder_nativehandle_buffer_type
142#else
143#define LEGACY_CAM_SOURCE kMetadataBufferTypeCameraSource
144#define LEGACY_CAM_METADATA_TYPE encoder_media_buffer_type
145#endif
146
147void* message_thread_enc(void *);
148
149enum omx_venc_extradata_types {
150    VENC_EXTRADATA_SLICEINFO = 0x100,
151    VENC_EXTRADATA_MBINFO = 0x400,
152    VENC_EXTRADATA_FRAMEDIMENSION = 0x1000000,
153    VENC_EXTRADATA_YUV_STATS = 0x800,
154    VENC_EXTRADATA_VQZIP = 0x02000000,
155    VENC_EXTRADATA_ROI = 0x04000000,
156};
157
158struct output_metabuffer {
159    OMX_U32 type;
160    native_handle_t *nh;
161};
162
163typedef struct encoder_meta_buffer_payload_type {
164    char data[sizeof(LEGACY_CAM_METADATA_TYPE) + sizeof(int)];
165} encoder_meta_buffer_payload_type;
166
167// OMX video class
168class omx_video: public qc_omx_component
169{
170    protected:
171#ifdef _ANDROID_ICS_
172        bool meta_mode_enable;
173        bool c2d_opened;
174        encoder_meta_buffer_payload_type meta_buffers[MAX_NUM_INPUT_BUFFERS];
175        OMX_BUFFERHEADERTYPE *opaque_buffer_hdr[MAX_NUM_INPUT_BUFFERS];
176        bool get_syntaxhdr_enable;
177        OMX_BUFFERHEADERTYPE  *psource_frame;
178        OMX_BUFFERHEADERTYPE  *pdest_frame;
179        bool secure_session;
180        bool hier_b_enabled;
181        //intermediate conversion buffer queued to encoder in case of invalid EOS input
182        OMX_BUFFERHEADERTYPE  *mEmptyEosBuffer;
183
184        class omx_c2d_conv
185        {
186            public:
187                omx_c2d_conv();
188                ~omx_c2d_conv();
189                bool init();
190                bool open(unsigned int height,unsigned int width,
191                        ColorConvertFormat src, ColorConvertFormat dest,
192                        unsigned int src_stride, unsigned int flags);
193                bool convert(int src_fd, void *src_base, void *src_viraddr,
194                        int dest_fd, void *dest_base, void *dest_viraddr);
195                bool get_buffer_size(int port,unsigned int &buf_size);
196                int get_src_format();
197                void close();
198            private:
199                C2DColorConverterBase *c2dcc;
200                pthread_mutex_t c_lock;
201                void *mLibHandle;
202                ColorConvertFormat src_format;
203                createC2DColorConverter_t *mConvertOpen;
204                destroyC2DColorConverter_t *mConvertClose;
205        };
206        omx_c2d_conv c2d_conv;
207#endif
208    public:
209
210        bool mUseProxyColorFormat;
211        //RGB or non-native input, and we have pre-allocated conversion buffers
212        bool mUsesColorConversion;
213
214        omx_video();  // constructor
215        virtual ~omx_video();  // destructor
216
217        // virtual int async_message_process (void *context, void* message);
218        void process_event_cb(void *ctxt,unsigned char id);
219
220        OMX_ERRORTYPE allocate_buffer(
221                OMX_HANDLETYPE hComp,
222                OMX_BUFFERHEADERTYPE **bufferHdr,
223                OMX_U32 port,
224                OMX_PTR appData,
225                OMX_U32 bytes
226                );
227
228
229        virtual OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp)= 0;
230
231        virtual OMX_ERRORTYPE component_init(OMX_STRING role)= 0;
232
233        virtual OMX_U32 dev_stop(void) = 0;
234        virtual OMX_U32 dev_pause(void) = 0;
235        virtual OMX_U32 dev_start(void) = 0;
236        virtual OMX_U32 dev_flush(unsigned) = 0;
237        virtual OMX_U32 dev_resume(void) = 0;
238        virtual OMX_U32 dev_start_done(void) = 0;
239        virtual OMX_U32 dev_set_message_thread_id(pthread_t) = 0;
240        virtual bool dev_use_buf(void *,unsigned,unsigned) = 0;
241        virtual bool dev_free_buf(void *,unsigned) = 0;
242        virtual bool dev_empty_buf(void *, void *,unsigned,unsigned) = 0;
243        virtual bool dev_fill_buf(void *buffer, void *,unsigned,unsigned) = 0;
244        virtual bool dev_get_buf_req(OMX_U32 *,OMX_U32 *,OMX_U32 *,OMX_U32) = 0;
245        virtual bool dev_get_seq_hdr(void *, unsigned, unsigned *) = 0;
246        virtual bool dev_loaded_start(void) = 0;
247        virtual bool dev_loaded_stop(void) = 0;
248        virtual bool dev_loaded_start_done(void) = 0;
249        virtual bool dev_loaded_stop_done(void) = 0;
250        virtual bool is_secure_session(void) = 0;
251        virtual int dev_handle_output_extradata(void*, int) = 0;
252        virtual int dev_set_format(int) = 0;
253        virtual bool dev_is_video_session_supported(OMX_U32 width, OMX_U32 height) = 0;
254        virtual bool dev_get_capability_ltrcount(OMX_U32 *, OMX_U32 *, OMX_U32 *) = 0;
255        virtual bool dev_get_performance_level(OMX_U32 *) = 0;
256        virtual bool dev_get_vui_timing_info(OMX_U32 *) = 0;
257        virtual bool dev_get_vqzip_sei_info(OMX_U32 *) = 0;
258        virtual bool dev_get_peak_bitrate(OMX_U32 *) = 0;
259        virtual bool dev_get_batch_size(OMX_U32 *) = 0;
260        virtual bool dev_buffer_ready_to_queue(OMX_BUFFERHEADERTYPE *buffer) = 0;
261        virtual bool dev_get_temporal_layer_caps(OMX_U32 * /*nMaxLayers*/,
262                OMX_U32 * /*nMaxBLayers*/) = 0;
263        virtual bool dev_get_pq_status(OMX_BOOL *) = 0;
264#ifdef _ANDROID_ICS_
265        void omx_release_meta_buffer(OMX_BUFFERHEADERTYPE *buffer);
266#endif
267        virtual bool dev_color_align(OMX_BUFFERHEADERTYPE *buffer, OMX_U32 width,
268                        OMX_U32 height) = 0;
269        virtual bool dev_get_output_log_flag() = 0;
270        virtual int dev_output_log_buffers(const char *buffer_addr, int buffer_len) = 0;
271        virtual int dev_extradata_log_buffers(char *buffer_addr) = 0;
272        OMX_ERRORTYPE component_role_enum(
273                OMX_HANDLETYPE hComp,
274                OMX_U8 *role,
275                OMX_U32 index
276                );
277
278        OMX_ERRORTYPE component_tunnel_request(
279                OMX_HANDLETYPE hComp,
280                OMX_U32 port,
281                OMX_HANDLETYPE  peerComponent,
282                OMX_U32 peerPort,
283                OMX_TUNNELSETUPTYPE *tunnelSetup
284                );
285
286        OMX_ERRORTYPE empty_this_buffer(
287                OMX_HANDLETYPE hComp,
288                OMX_BUFFERHEADERTYPE *buffer
289                );
290
291
292
293        OMX_ERRORTYPE fill_this_buffer(
294                OMX_HANDLETYPE hComp,
295                OMX_BUFFERHEADERTYPE *buffer
296                );
297
298
299        OMX_ERRORTYPE free_buffer(
300                OMX_HANDLETYPE hComp,
301                OMX_U32 port,
302                OMX_BUFFERHEADERTYPE *buffer
303                );
304
305        OMX_ERRORTYPE get_component_version(
306                OMX_HANDLETYPE hComp,
307                OMX_STRING componentName,
308                OMX_VERSIONTYPE *componentVersion,
309                OMX_VERSIONTYPE *specVersion,
310                OMX_UUIDTYPE *componentUUID
311                );
312
313        OMX_ERRORTYPE get_config(
314                OMX_HANDLETYPE hComp,
315                OMX_INDEXTYPE configIndex,
316                OMX_PTR configData
317                );
318
319        OMX_ERRORTYPE get_extension_index(
320                OMX_HANDLETYPE hComp,
321                OMX_STRING paramName,
322                OMX_INDEXTYPE *indexType
323                );
324
325        OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE hComp,
326                OMX_INDEXTYPE  paramIndex,
327                OMX_PTR        paramData);
328
329        OMX_ERRORTYPE get_state(OMX_HANDLETYPE hComp,
330                OMX_STATETYPE *state);
331
332
333
334        OMX_ERRORTYPE send_command(OMX_HANDLETYPE  hComp,
335                OMX_COMMANDTYPE cmd,
336                OMX_U32         param1,
337                OMX_PTR         cmdData);
338
339
340        OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE   hComp,
341                OMX_CALLBACKTYPE *callbacks,
342                OMX_PTR          appData);
343
344        virtual OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp,
345                OMX_INDEXTYPE  configIndex,
346                OMX_PTR        configData) = 0;
347
348        virtual OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp,
349                OMX_INDEXTYPE  paramIndex,
350                OMX_PTR        paramData) =0;
351
352        OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE      hComp,
353                OMX_BUFFERHEADERTYPE **bufferHdr,
354                OMX_U32              port,
355                OMX_PTR              appData,
356                OMX_U32              bytes,
357                OMX_U8               *buffer);
358
359
360        OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE     hComp,
361                OMX_BUFFERHEADERTYPE **bufferHdr,
362                OMX_U32              port,
363                OMX_PTR              appData,
364                void *               eglImage);
365
366
367
368        int  m_pipe_in;
369        int  m_pipe_out;
370
371        pthread_t msg_thread_id;
372        pthread_t async_thread_id;
373        bool async_thread_created;
374        bool msg_thread_created;
375        volatile bool msg_thread_stop;
376
377        OMX_U8 m_nkind[128];
378
379
380        //int *input_pmem_fd;
381        //int *output_pmem_fd;
382        struct pmem *m_pInput_pmem;
383        struct pmem *m_pOutput_pmem;
384#ifdef USE_ION
385        struct venc_ion *m_pInput_ion;
386        struct venc_ion *m_pOutput_ion;
387#endif
388
389
390
391    public:
392        // Bit Positions
393        enum flags_bit_positions {
394            // Defer transition to IDLE
395            OMX_COMPONENT_IDLE_PENDING            =0x1,
396            // Defer transition to LOADING
397            OMX_COMPONENT_LOADING_PENDING         =0x2,
398            // First  Buffer Pending
399            OMX_COMPONENT_FIRST_BUFFER_PENDING    =0x3,
400            // Second Buffer Pending
401            OMX_COMPONENT_SECOND_BUFFER_PENDING   =0x4,
402            // Defer transition to Enable
403            OMX_COMPONENT_INPUT_ENABLE_PENDING    =0x5,
404            // Defer transition to Enable
405            OMX_COMPONENT_OUTPUT_ENABLE_PENDING   =0x6,
406            // Defer transition to Disable
407            OMX_COMPONENT_INPUT_DISABLE_PENDING   =0x7,
408            // Defer transition to Disable
409            OMX_COMPONENT_OUTPUT_DISABLE_PENDING  =0x8,
410            //defer flush notification
411            OMX_COMPONENT_OUTPUT_FLUSH_PENDING    =0x9,
412            OMX_COMPONENT_INPUT_FLUSH_PENDING    =0xA,
413            OMX_COMPONENT_PAUSE_PENDING          =0xB,
414            OMX_COMPONENT_EXECUTE_PENDING        =0xC,
415            OMX_COMPONENT_LOADED_START_PENDING = 0xD,
416            OMX_COMPONENT_LOADED_STOP_PENDING = 0xF,
417
418        };
419
420        // Deferred callback identifiers
421        enum {
422            //Event Callbacks from the venc component thread context
423            OMX_COMPONENT_GENERATE_EVENT       = 0x1,
424            //Buffer Done callbacks from the venc component thread context
425            OMX_COMPONENT_GENERATE_BUFFER_DONE = 0x2,
426            //Frame Done callbacks from the venc component thread context
427            OMX_COMPONENT_GENERATE_FRAME_DONE  = 0x3,
428            //Buffer Done callbacks from the venc component thread context
429            OMX_COMPONENT_GENERATE_FTB         = 0x4,
430            //Frame Done callbacks from the venc component thread context
431            OMX_COMPONENT_GENERATE_ETB         = 0x5,
432            //Command
433            OMX_COMPONENT_GENERATE_COMMAND     = 0x6,
434            //Push-Pending Buffers
435            OMX_COMPONENT_PUSH_PENDING_BUFS    = 0x7,
436            // Empty Buffer Done callbacks
437            OMX_COMPONENT_GENERATE_EBD         = 0x8,
438            //Flush Event Callbacks from the venc component thread context
439            OMX_COMPONENT_GENERATE_EVENT_FLUSH       = 0x9,
440            OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH = 0x0A,
441            OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH = 0x0B,
442            OMX_COMPONENT_GENERATE_FBD = 0xc,
443            OMX_COMPONENT_GENERATE_START_DONE = 0xD,
444            OMX_COMPONENT_GENERATE_PAUSE_DONE = 0xE,
445            OMX_COMPONENT_GENERATE_RESUME_DONE = 0xF,
446            OMX_COMPONENT_GENERATE_STOP_DONE = 0x10,
447            OMX_COMPONENT_GENERATE_HARDWARE_ERROR = 0x11,
448            OMX_COMPONENT_GENERATE_LTRUSE_FAILED = 0x12,
449            OMX_COMPONENT_GENERATE_ETB_OPQ = 0x13,
450            OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING = 0x14,
451            OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD = 0x15,
452            OMX_COMPONENT_CLOSE_MSG = 0x16
453        };
454
455        struct omx_event {
456            unsigned long param1;
457            unsigned long param2;
458            unsigned long id;
459        };
460
461        struct omx_cmd_queue {
462            omx_event m_q[OMX_CORE_CONTROL_CMDQ_SIZE];
463            unsigned long m_read;
464            unsigned long m_write;
465            unsigned long m_size;
466
467            omx_cmd_queue();
468            ~omx_cmd_queue();
469            bool insert_entry(unsigned long p1, unsigned long p2, unsigned long id);
470            bool pop_entry(unsigned long *p1,unsigned long *p2, unsigned long *id);
471            // get msgtype of the first ele from the queue
472            unsigned get_q_msg_type();
473
474        };
475
476        bool allocate_done(void);
477        bool allocate_input_done(void);
478        bool allocate_output_done(void);
479
480        OMX_ERRORTYPE free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
481        OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
482
483        OMX_ERRORTYPE allocate_input_buffer(OMX_HANDLETYPE       hComp,
484                OMX_BUFFERHEADERTYPE **bufferHdr,
485                OMX_U32              port,
486                OMX_PTR              appData,
487                OMX_U32              bytes);
488#ifdef _ANDROID_ICS_
489        OMX_ERRORTYPE allocate_input_meta_buffer(OMX_HANDLETYPE       hComp,
490                OMX_BUFFERHEADERTYPE **bufferHdr,
491                OMX_PTR              appData,
492                OMX_U32              bytes);
493#endif
494        OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE       hComp,
495                OMX_BUFFERHEADERTYPE **bufferHdr,
496                OMX_U32 port,OMX_PTR appData,
497                OMX_U32              bytes);
498
499        OMX_ERRORTYPE use_input_buffer(OMX_HANDLETYPE hComp,
500                OMX_BUFFERHEADERTYPE  **bufferHdr,
501                OMX_U32               port,
502                OMX_PTR               appData,
503                OMX_U32               bytes,
504                OMX_U8                *buffer);
505
506        OMX_ERRORTYPE use_output_buffer(OMX_HANDLETYPE hComp,
507                OMX_BUFFERHEADERTYPE   **bufferHdr,
508                OMX_U32                port,
509                OMX_PTR                appData,
510                OMX_U32                bytes,
511                OMX_U8                 *buffer);
512
513        bool execute_omx_flush(OMX_U32);
514        bool execute_output_flush(void);
515        bool execute_input_flush(void);
516#ifdef _MSM8974_
517        bool execute_flush_all(void);
518#endif
519        OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE hComp,
520                OMX_BUFFERHEADERTYPE * buffer);
521
522        OMX_ERRORTYPE fill_buffer_done(OMX_HANDLETYPE hComp,
523                OMX_BUFFERHEADERTYPE * buffer);
524        OMX_ERRORTYPE empty_this_buffer_proxy(OMX_HANDLETYPE hComp,
525                OMX_BUFFERHEADERTYPE *buffer);
526        OMX_ERRORTYPE empty_this_buffer_opaque(OMX_HANDLETYPE hComp,
527                OMX_BUFFERHEADERTYPE *buffer);
528        OMX_ERRORTYPE push_input_buffer(OMX_HANDLETYPE hComp);
529        OMX_ERRORTYPE convert_queue_buffer(OMX_HANDLETYPE hComp,
530                struct pmem &Input_pmem_info,unsigned long &index);
531        OMX_ERRORTYPE queue_meta_buffer(OMX_HANDLETYPE hComp,
532                struct pmem &Input_pmem_info);
533        OMX_ERRORTYPE push_empty_eos_buffer(OMX_HANDLETYPE hComp);
534        OMX_ERRORTYPE fill_this_buffer_proxy(OMX_HANDLETYPE hComp,
535                OMX_BUFFERHEADERTYPE *buffer);
536        bool release_done();
537
538        bool release_output_done();
539        bool release_input_done();
540
541        OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE  hComp,
542                OMX_COMMANDTYPE cmd,
543                OMX_U32         param1,
544                OMX_PTR         cmdData);
545        bool post_event( unsigned long p1,
546                unsigned long p2,
547                unsigned long id
548                   );
549        OMX_ERRORTYPE get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType);
550        inline void omx_report_error () {
551            if (m_pCallbacks.EventHandler && !m_error_propogated && m_state != OMX_StateLoaded) {
552                m_error_propogated = true;
553                DEBUG_PRINT_ERROR("ERROR: send OMX_ErrorHardware to Client");
554                m_pCallbacks.EventHandler(&m_cmp,m_app_data,
555                        OMX_EventError,OMX_ErrorHardware,0,NULL);
556            }
557        }
558
559        inline void omx_report_hw_overload ()
560        {
561            if (m_pCallbacks.EventHandler && !m_error_propogated && m_state != OMX_StateLoaded) {
562                m_error_propogated = true;
563                DEBUG_PRINT_ERROR("ERROR: send OMX_ErrorInsufficientResources to Client");
564                m_pCallbacks.EventHandler(&m_cmp, m_app_data,
565                        OMX_EventError, OMX_ErrorInsufficientResources, 0, NULL);
566            }
567        }
568
569        inline void omx_report_unsupported_setting () {
570            if (m_pCallbacks.EventHandler && !m_error_propogated && m_state != OMX_StateLoaded) {
571                m_error_propogated = true;
572                m_pCallbacks.EventHandler(&m_cmp,m_app_data,
573                        OMX_EventError,OMX_ErrorUnsupportedSetting,0,NULL);
574            }
575        }
576
577        void complete_pending_buffer_done_cbs();
578        bool is_conv_needed(int, int);
579        void print_debug_color_aspects(ColorAspects *aspects, const char *prefix);
580
581        OMX_ERRORTYPE get_vendor_extension_config(
582                OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE *ext);
583        OMX_ERRORTYPE set_vendor_extension_config(
584                OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE *ext);
585        void init_vendor_extensions(VendorExtensionStore&);
586        // Extensions-store is immutable after initialization (i.e cannot add/remove/change
587        //  extensions once added !)
588        const VendorExtensionStore mVendorExtensionStore;
589
590#ifdef USE_ION
591        int alloc_map_ion_memory(int size,
592                                 struct ion_allocation_data *alloc_data,
593                                 struct ion_fd_data *fd_data,int flag);
594        void free_ion_memory(struct venc_ion *buf_ion_info);
595#endif
596
597        //*************************************************************
598        //*******************MEMBER VARIABLES *************************
599        //*************************************************************
600
601        pthread_mutex_t       m_lock;
602        sem_t                 m_cmd_lock;
603        bool              m_error_propogated;
604
605        //sem to handle the minimum procesing of commands
606
607
608        // compression format
609        //OMX_VIDEO_CODINGTYPE eCompressionFormat;
610        // OMX State
611        OMX_STATETYPE m_state;
612        // Application data
613        OMX_PTR m_app_data;
614        OMX_BOOL m_use_input_pmem;
615        OMX_BOOL m_use_output_pmem;
616        // Application callbacks
617        OMX_CALLBACKTYPE m_pCallbacks;
618        OMX_PORT_PARAM_TYPE m_sPortParam;
619        OMX_VIDEO_PARAM_PROFILELEVELTYPE m_sParamProfileLevel;
620        OMX_VIDEO_PARAM_PORTFORMATTYPE m_sInPortFormat;
621        OMX_VIDEO_PARAM_PORTFORMATTYPE m_sOutPortFormat;
622        OMX_PARAM_PORTDEFINITIONTYPE m_sInPortDef;
623        OMX_PARAM_PORTDEFINITIONTYPE m_sOutPortDef;
624        OMX_VIDEO_PARAM_MPEG4TYPE m_sParamMPEG4;
625        OMX_VIDEO_PARAM_H263TYPE m_sParamH263;
626        OMX_VIDEO_PARAM_AVCTYPE m_sParamAVC;
627        OMX_VIDEO_PARAM_VP8TYPE m_sParamVP8;
628        OMX_VIDEO_PARAM_HEVCTYPE m_sParamHEVC;
629        OMX_PORT_PARAM_TYPE m_sPortParam_img;
630        OMX_PORT_PARAM_TYPE m_sPortParam_audio;
631        OMX_VIDEO_CONFIG_BITRATETYPE m_sConfigBitrate;
632        OMX_CONFIG_FRAMERATETYPE m_sConfigFramerate;
633        OMX_VIDEO_PARAM_BITRATETYPE m_sParamBitrate;
634        OMX_PRIORITYMGMTTYPE m_sPriorityMgmt;
635        OMX_PARAM_BUFFERSUPPLIERTYPE m_sInBufSupplier;
636        OMX_PARAM_BUFFERSUPPLIERTYPE m_sOutBufSupplier;
637        OMX_CONFIG_ROTATIONTYPE m_sConfigFrameRotation;
638        OMX_CONFIG_INTRAREFRESHVOPTYPE m_sConfigIntraRefreshVOP;
639        OMX_VIDEO_PARAM_QUANTIZATIONTYPE m_sSessionQuantization;
640        OMX_QCOM_VIDEO_PARAM_QPRANGETYPE m_sSessionQPRange;
641        OMX_QCOM_VIDEO_PARAM_IPB_QPRANGETYPE m_sSessionIPBQPRange;
642        OMX_VIDEO_PARAM_AVCSLICEFMO m_sAVCSliceFMO;
643        QOMX_VIDEO_INTRAPERIODTYPE m_sIntraperiod;
644        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE m_sErrorCorrection;
645        OMX_VIDEO_PARAM_INTRAREFRESHTYPE m_sIntraRefresh;
646        QOMX_VIDEO_PARAM_LTRMODE_TYPE m_sParamLTRMode;
647        QOMX_VIDEO_PARAM_LTRCOUNT_TYPE m_sParamLTRCount;
648        QOMX_VIDEO_CONFIG_LTRPERIOD_TYPE m_sConfigLTRPeriod;
649        QOMX_VIDEO_CONFIG_LTRUSE_TYPE m_sConfigLTRUse;
650        OMX_VIDEO_CONFIG_AVCINTRAPERIOD m_sConfigAVCIDRPeriod;
651        OMX_VIDEO_CONFIG_DEINTERLACE m_sConfigDeinterlace;
652        OMX_VIDEO_VP8REFERENCEFRAMETYPE m_sConfigVp8ReferenceFrame;
653        QOMX_VIDEO_HIERARCHICALLAYERS m_sHierLayers;
654        OMX_QOMX_VIDEO_MBI_STATISTICS m_sMBIStatistics;
655        QOMX_EXTNINDEX_VIDEO_INITIALQP m_sParamInitqp;
656        QOMX_EXTNINDEX_VIDEO_HIER_P_LAYERS m_sHPlayers;
657        OMX_SKYPE_VIDEO_CONFIG_BASELAYERPID m_sBaseLayerID;
658        OMX_SKYPE_VIDEO_PARAM_DRIVERVER m_sDriverVer;
659        OMX_SKYPE_VIDEO_CONFIG_QP m_sConfigQP;
660        QOMX_EXTNINDEX_VIDEO_VENC_SAR m_sSar;
661        QOMX_VIDEO_H264ENTROPYCODINGTYPE m_sParamEntropy;
662        PrependSPSPPSToIDRFramesParams m_sPrependSPSPPS;
663        struct timestamp_info {
664            OMX_U64 m_TimeStamp;
665            bool is_buffer_pending;
666            OMX_BUFFERHEADERTYPE *pending_buffer;
667            pthread_mutex_t m_lock;
668        } timestamp;
669        OMX_U32 m_sExtraData;
670        OMX_U32 m_input_msg_id;
671        QOMX_EXTNINDEX_VIDEO_VENC_LOW_LATENCY_MODE m_slowLatencyMode;
672#ifdef SUPPORT_CONFIG_INTRA_REFRESH
673        OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE m_sConfigIntraRefresh;
674#endif
675        OMX_QTI_VIDEO_CONFIG_BLURINFO       m_blurInfo;
676        DescribeColorAspectsParams m_sConfigColorAspects;
677        OMX_VIDEO_PARAM_ANDROID_TEMPORALLAYERINGTYPE m_sParamTemporalLayers;
678        OMX_VIDEO_CONFIG_ANDROID_TEMPORALLAYERINGTYPE m_sConfigTemporalLayers;
679        QOMX_ENABLETYPE m_sParamAVTimerTimestampMode;   // use VT-timestamps in gralloc-handle
680
681        // fill this buffer queue
682        omx_cmd_queue m_ftb_q;
683        // Command Q for rest of the events
684        omx_cmd_queue m_cmd_q;
685        omx_cmd_queue m_etb_q;
686        // Input memory pointer
687        OMX_BUFFERHEADERTYPE *m_inp_mem_ptr;
688        // Output memory pointer
689        OMX_BUFFERHEADERTYPE *m_out_mem_ptr;
690        omx_cmd_queue m_opq_meta_q;
691        omx_cmd_queue m_opq_pmem_q;
692        OMX_BUFFERHEADERTYPE meta_buffer_hdr[MAX_NUM_INPUT_BUFFERS];
693        pthread_mutex_t m_buf_lock;
694
695        bool input_flush_progress;
696        bool output_flush_progress;
697        bool input_use_buffer;
698        bool output_use_buffer;
699        int pending_input_buffers;
700        int pending_output_buffers;
701
702        bool allocate_native_handle;
703
704        uint64_t m_out_bm_count;
705        uint64_t m_client_out_bm_count;
706        uint64_t m_client_in_bm_count;
707        uint64_t m_inp_bm_count;
708        uint64_t m_flags;
709        uint64_t m_etb_count;
710        uint64_t m_fbd_count;
711        OMX_TICKS m_etb_timestamp;
712        // to know whether Event Port Settings change has been triggered or not.
713        bool m_event_port_settings_sent;
714        OMX_U8                m_cRole[OMX_MAX_STRINGNAME_SIZE];
715        extra_data_handler extra_data_handle;
716        bool hw_overload;
717        size_t m_graphicbuffer_size;
718        char m_platform[OMX_MAX_STRINGNAME_SIZE];
719        bool m_buffer_freed;
720};
721
722#endif // __OMX_VIDEO_BASE_H__
723