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