1 /*--------------------------------------------------------------------------
2 Copyright (c) 2010-2020, 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 #include <stdlib.h>
46 #include <stdio.h>
47 #include <sys/mman.h>
48 #ifdef _ANDROID_
49 #ifdef _ANDROID_ICS_
50 #include "QComOMXMetadata.h"
51 #endif
52 #endif // _ANDROID_
53 #include <pthread.h>
54 #include <semaphore.h>
55 #include <media/hardware/HardwareAPI.h>
56 #include "vidc_common.h"
57 #include "OMX_Core.h"
58 #include "OMX_QCOMExtns.h"
59 #include "OMX_Skype_VideoExtensions.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 <vector>
69 #include "vidc_vendor_extensions.h"
70 
71 #include <linux/msm_ion.h>
72 #if TARGET_ION_ABI_VERSION >= 2
73 #include <ion/ion.h>
74 #include <linux/dma-buf.h>
75 #else
76 #include <linux/ion.h>
77 #endif
78 
79 #undef LOG_TAG
80 #define LOG_TAG "OMX-VENC"
81 #include "vidc_debug.h"
82 
83 #ifdef _ANDROID_
84 using namespace android;
85 #include <utils/Log.h>
86 
87 #endif // _ANDROID_
88 
89 #ifdef USE_ION
90 static const char* MEM_DEVICE = "/dev/ion";
91 #define MEM_HEAP_ID ION_IOMMU_HEAP_ID
92 #endif
93 
94 //////////////////////////////////////////////////////////////////////////////
95 //                       Module specific globals
96 //////////////////////////////////////////////////////////////////////////////
97 #define OMX_SPEC_VERSION 0x00000101
98 #define OMX_INIT_STRUCT(_s_, _name_)            \
99     memset((_s_), 0x0, sizeof(_name_));          \
100 (_s_)->nSize = sizeof(_name_);               \
101 (_s_)->nVersion.nVersion = OMX_SPEC_VERSION
102 
103 //////////////////////////////////////////////////////////////////////////////
104 //               Macros
105 //////////////////////////////////////////////////////////////////////////////
106 #define PrintFrameHdr(bufHdr) DEBUG_PRINT("bufHdr %x buf %x size %d TS %d\n",\
107         (unsigned) bufHdr,\
108         (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->pBuffer,\
109         (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nFilledLen,\
110         (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nTimeStamp)
111 
112 /** STATUS CODES*/
113 /* Base value for status codes */
114 #define VEN_S_BASE	0x00000000
115 #define VEN_S_SUCCESS	(VEN_S_BASE)/* Success */
116 #define VEN_S_EFAIL	(VEN_S_BASE+1)/* General failure */
117 
118 /*Asynchronous messages from driver*/
119 #define VEN_MSG_INDICATION	0
120 #define VEN_MSG_INPUT_BUFFER_DONE	1
121 #define VEN_MSG_OUTPUT_BUFFER_DONE	2
122 #define VEN_MSG_NEED_OUTPUT_BUFFER	3
123 #define VEN_MSG_FLUSH_INPUT_DONE	4
124 #define VEN_MSG_FLUSH_OUPUT_DONE	5
125 #define VEN_MSG_START	6
126 #define VEN_MSG_STOP	7
127 #define VEN_MSG_PAUSE	8
128 #define VEN_MSG_RESUME	9
129 #define VEN_MSG_LTRUSE_FAILED	    10
130 #define VEN_MSG_HW_OVERLOAD	11
131 #define VEN_MSG_MAX_CLIENTS	12
132 
133 #define MAX_NUM_INPUT_BUFFERS 64
134 #define MAX_NUM_OUTPUT_BUFFERS 64
135 
136 #ifdef USE_NATIVE_HANDLE_SOURCE
137 #define LEGACY_CAM_SOURCE kMetadataBufferTypeNativeHandleSource
138 #define LEGACY_CAM_METADATA_TYPE encoder_nativehandle_buffer_type
139 #else
140 #define LEGACY_CAM_SOURCE kMetadataBufferTypeCameraSource
141 #define LEGACY_CAM_METADATA_TYPE encoder_media_buffer_type
142 #endif
143 
144 class omx_video;
145 void post_message(omx_video *omx, unsigned char id);
146 void* message_thread_enc(void *);
147 bool is_ubwc_interlaced(private_handle_t *handle);
148 
149 enum omx_venc_extradata_types {
150     VENC_EXTRADATA_SLICEINFO = 0x100,
151     VENC_EXTRADATA_LTRINFO = 0x200,
152     VENC_EXTRADATA_MBINFO = 0x400,
153     VENC_EXTRADATA_FRAMEDIMENSION = 0x1000000,
154     VENC_EXTRADATA_YUV_STATS = 0x800,
155     VENC_EXTRADATA_ROI = 0x04000000,
156 };
157 
158 struct output_metabuffer {
159     OMX_U32 type;
160     native_handle_t *nh;
161 };
162 
163 struct venc_buffer{
164  unsigned char *ptrbuffer;
165  unsigned long	sz;
166  unsigned long	len;
167  unsigned long	offset;
168  long long	timestamp;
169  unsigned long	flags;
170  void	*clientdata;
171 };
172 
173 struct venc_bufferpayload{
174 	unsigned char *pbuffer;
175 	size_t	sz;
176 	int	fd;
177 	unsigned int	offset;
178 	unsigned int	maped_size;
179 	unsigned long	filled_len;
180 };
181 
182 struct venc_framerate{
183 	unsigned long	fps_denominator;
184 	unsigned long	fps_numerator;
185 };
186 
187 struct venc_headerextension{
188 	 unsigned long	header_extension;
189 };
190 
191 struct venc_multiclicecfg{
192 	unsigned long	mslice_mode;
193 	unsigned long	mslice_size;
194 };
195 
196 struct venc_msg{
197 	unsigned long	statuscode;
198 	unsigned long	msgcode;
199 	struct venc_buffer	buf;
200 	unsigned long	msgdata_size;
201 };
202 
203 typedef struct encoder_meta_buffer_payload_type {
204     char data[sizeof(LEGACY_CAM_METADATA_TYPE) + sizeof(int)];
205 } encoder_meta_buffer_payload_type;
206 
207 // OMX video class
208 class omx_video: public qc_omx_component
209 {
210     protected:
211 #ifdef _ANDROID_ICS_
212         bool meta_mode_enable;
213         bool c2d_opened;
214         encoder_meta_buffer_payload_type meta_buffers[MAX_NUM_INPUT_BUFFERS];
215         OMX_BUFFERHEADERTYPE *opaque_buffer_hdr[MAX_NUM_INPUT_BUFFERS];
216         bool get_syntaxhdr_enable;
217         OMX_BUFFERHEADERTYPE  *psource_frame;
218         OMX_BUFFERHEADERTYPE  *pdest_frame;
219         bool secure_session;
220         bool hier_b_enabled;
221         bool m_ubwc_supported;
222         C2DColorConverter c2dcc;
223         ColorMapping mMapPixelFormat2Converter;
224 
225 #endif
226     public:
227 
228         bool mUseProxyColorFormat;
229         //RGB or non-native input, and we have pre-allocated conversion buffers
230         bool mUsesColorConversion;
231         ColorConvertFormat mC2dSrcFmt;
232         ColorConvertFormat  mC2dDestFmt;
233         OMX_U32 mC2DFrameHeight;
234         OMX_U32 mC2DFrameWidth;
235         bool is_stop_in_progress;
236 
237         omx_video();  // constructor
238         virtual ~omx_video();  // destructor
239 
240         // virtual int async_message_process (void *context, void* message);
241         void process_event_cb(void *ctxt);
242 
243         OMX_ERRORTYPE allocate_buffer(
244                 OMX_HANDLETYPE hComp,
245                 OMX_BUFFERHEADERTYPE **bufferHdr,
246                 OMX_U32 port,
247                 OMX_PTR appData,
248                 OMX_U32 bytes
249                 );
250 
251 
252         virtual OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp)= 0;
253 
254         virtual OMX_ERRORTYPE component_init(OMX_STRING role)= 0;
255 
256         virtual OMX_U32 dev_stop(void) = 0;
257         virtual OMX_U32 dev_pause(void) = 0;
258         virtual OMX_U32 dev_start(void) = 0;
259         virtual OMX_U32 dev_flush(unsigned) = 0;
260         virtual OMX_U32 dev_resume(void) = 0;
261         virtual OMX_U32 dev_start_done(void) = 0;
262         virtual OMX_U32 dev_set_message_thread_id(pthread_t) = 0;
263         virtual bool dev_use_buf(unsigned) = 0;
264         virtual bool dev_handle_empty_eos_buffer(void) = 0;
265         virtual bool dev_free_buf(void *,unsigned) = 0;
266         virtual bool dev_empty_buf(void *, void *,unsigned,unsigned) = 0;
267         virtual bool dev_fill_buf(void *buffer, void *,unsigned,unsigned) = 0;
268         virtual bool dev_is_meta_mode() = 0;
269         virtual bool dev_is_avtimer_needed() = 0;
270         virtual bool dev_get_buf_req(OMX_U32 *,OMX_U32 *,OMX_U32 *,OMX_U32) = 0;
271         virtual bool dev_get_dimensions(OMX_U32 ,OMX_U32 *,OMX_U32 *) = 0;
272         virtual bool is_streamon_done(OMX_U32 port) = 0;
273         virtual bool dev_get_seq_hdr(void *, unsigned, unsigned *) = 0;
274         virtual bool dev_loaded_start(void) = 0;
275         virtual bool dev_loaded_stop(void) = 0;
276         virtual bool dev_loaded_start_done(void) = 0;
277         virtual bool dev_loaded_stop_done(void) = 0;
278         virtual bool is_secure_session(void) = 0;
279         virtual int dev_handle_output_extradata(void*, int) = 0;
280         virtual int dev_set_format(int) = 0;
281         virtual bool dev_is_video_session_supported(OMX_U32 width, OMX_U32 height) = 0;
282         virtual bool dev_get_capability_ltrcount(OMX_U32 *, OMX_U32 *, OMX_U32 *) = 0;
283         virtual bool dev_get_vui_timing_info(OMX_U32 *) = 0;
284         virtual bool dev_get_peak_bitrate(OMX_U32 *) = 0;
285         virtual bool dev_get_batch_size(OMX_U32 *) = 0;
286         virtual bool dev_buffer_ready_to_queue(OMX_BUFFERHEADERTYPE *buffer) = 0;
287         virtual bool dev_get_temporal_layer_caps(OMX_U32 * /*nMaxLayers*/,
288                 OMX_U32 * /*nMaxBLayers*/, OMX_VIDEO_ANDROID_TEMPORALLAYERINGPATTERNTYPE */*SupportedPattern*/) = 0;
289         virtual OMX_ERRORTYPE dev_get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *) = 0;
290         virtual bool dev_get_supported_color_format(unsigned index, OMX_U32 *colorFormat) = 0;
291 #ifdef _ANDROID_ICS_
292         void omx_release_meta_buffer(OMX_BUFFERHEADERTYPE *buffer);
293 #endif
294         virtual bool dev_color_align(OMX_BUFFERHEADERTYPE *buffer, OMX_U32 width,
295                         OMX_U32 height) = 0;
296         virtual bool dev_get_output_log_flag() = 0;
297         virtual int dev_output_log_buffers(const char *buffer_addr, int buffer_len, uint64_t timestamp) = 0;
298         virtual int dev_extradata_log_buffers(char *buffer_addr, int index, bool input) = 0;
299         virtual bool dev_get_hevc_profile(OMX_U32*) = 0;
300         virtual bool dev_handle_client_input_extradata(void*) = 0;
301         virtual void dev_get_color_format_as_string(char * buf, int buf_len, unsigned colorformat) = 0;
302         virtual void dev_get_consumer_usage(OMX_U32*) = 0;
303         OMX_ERRORTYPE component_role_enum(
304                 OMX_HANDLETYPE hComp,
305                 OMX_U8 *role,
306                 OMX_U32 index
307                 );
308 
309         OMX_ERRORTYPE component_tunnel_request(
310                 OMX_HANDLETYPE hComp,
311                 OMX_U32 port,
312                 OMX_HANDLETYPE  peerComponent,
313                 OMX_U32 peerPort,
314                 OMX_TUNNELSETUPTYPE *tunnelSetup
315                 );
316 
317         OMX_ERRORTYPE empty_this_buffer(
318                 OMX_HANDLETYPE hComp,
319                 OMX_BUFFERHEADERTYPE *buffer
320                 );
321 
322 
323 
324         OMX_ERRORTYPE fill_this_buffer(
325                 OMX_HANDLETYPE hComp,
326                 OMX_BUFFERHEADERTYPE *buffer
327                 );
328 
329 
330         OMX_ERRORTYPE free_buffer(
331                 OMX_HANDLETYPE hComp,
332                 OMX_U32 port,
333                 OMX_BUFFERHEADERTYPE *buffer
334                 );
335 
336         OMX_ERRORTYPE get_component_version(
337                 OMX_HANDLETYPE hComp,
338                 OMX_STRING componentName,
339                 OMX_VERSIONTYPE *componentVersion,
340                 OMX_VERSIONTYPE *specVersion,
341                 OMX_UUIDTYPE *componentUUID
342                 );
343 
344         OMX_ERRORTYPE get_config(
345                 OMX_HANDLETYPE hComp,
346                 OMX_INDEXTYPE configIndex,
347                 OMX_PTR configData
348                 );
349 
350         OMX_ERRORTYPE get_extension_index(
351                 OMX_HANDLETYPE hComp,
352                 OMX_STRING paramName,
353                 OMX_INDEXTYPE *indexType
354                 );
355 
356         OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE hComp,
357                 OMX_INDEXTYPE  paramIndex,
358                 OMX_PTR        paramData);
359 
360         OMX_ERRORTYPE get_state(OMX_HANDLETYPE hComp,
361                 OMX_STATETYPE *state);
362 
363 
364 
365         OMX_ERRORTYPE send_command(OMX_HANDLETYPE  hComp,
366                 OMX_COMMANDTYPE cmd,
367                 OMX_U32         param1,
368                 OMX_PTR         cmdData);
369 
370 
371         OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE   hComp,
372                 OMX_CALLBACKTYPE *callbacks,
373                 OMX_PTR          appData);
374 
375         virtual OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp,
376                 OMX_INDEXTYPE  configIndex,
377                 OMX_PTR        configData) = 0;
378 
379         virtual OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp,
380                 OMX_INDEXTYPE  paramIndex,
381                 OMX_PTR        paramData) =0;
382 
383         OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE      hComp,
384                 OMX_BUFFERHEADERTYPE **bufferHdr,
385                 OMX_U32              port,
386                 OMX_PTR              appData,
387                 OMX_U32              bytes,
388                 OMX_U8               *buffer);
389 
390 
391         OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE     hComp,
392                 OMX_BUFFERHEADERTYPE **bufferHdr,
393                 OMX_U32              port,
394                 OMX_PTR              appData,
395                 void *               eglImage);
396 
397         Signal signal;
398 
399         pthread_t msg_thread_id;
400         pthread_t async_thread_id;
401         bool async_thread_created;
402         bool msg_thread_created;
403         volatile bool msg_thread_stop;
404 
405         OMX_U8 m_nkind[128];
406 
407 
408         //int *input_pmem_fd;
409         //int *output_pmem_fd;
410         struct pmem *m_pInput_pmem;
411         struct pmem *m_pOutput_pmem;
412 #ifdef USE_ION
413         struct venc_ion *m_pInput_ion;
414         struct venc_ion *m_pOutput_ion;
415 #endif
416 
417 
418 
419     public:
420         // Bit Positions
421         enum flags_bit_positions {
422             // Defer transition to IDLE
423             OMX_COMPONENT_IDLE_PENDING            =0x1,
424             // Defer transition to LOADING
425             OMX_COMPONENT_LOADING_PENDING         =0x2,
426             // First  Buffer Pending
427             OMX_COMPONENT_FIRST_BUFFER_PENDING    =0x3,
428             // Second Buffer Pending
429             OMX_COMPONENT_SECOND_BUFFER_PENDING   =0x4,
430             // Defer transition to Enable
431             OMX_COMPONENT_INPUT_ENABLE_PENDING    =0x5,
432             // Defer transition to Enable
433             OMX_COMPONENT_OUTPUT_ENABLE_PENDING   =0x6,
434             // Defer transition to Disable
435             OMX_COMPONENT_INPUT_DISABLE_PENDING   =0x7,
436             // Defer transition to Disable
437             OMX_COMPONENT_OUTPUT_DISABLE_PENDING  =0x8,
438             //defer flush notification
439             OMX_COMPONENT_OUTPUT_FLUSH_PENDING    =0x9,
440             OMX_COMPONENT_INPUT_FLUSH_PENDING    =0xA,
441             OMX_COMPONENT_PAUSE_PENDING          =0xB,
442             OMX_COMPONENT_EXECUTE_PENDING        =0xC,
443             OMX_COMPONENT_LOADED_START_PENDING = 0xD,
444             OMX_COMPONENT_LOADED_STOP_PENDING = 0xF,
445 
446         };
447 
448         // Deferred callback identifiers
449         enum {
450             //Event Callbacks from the venc component thread context
451             OMX_COMPONENT_GENERATE_EVENT       = 0x1,
452             //Buffer Done callbacks from the venc component thread context
453             OMX_COMPONENT_GENERATE_BUFFER_DONE = 0x2,
454             //Frame Done callbacks from the venc component thread context
455             OMX_COMPONENT_GENERATE_FRAME_DONE  = 0x3,
456             //Buffer Done callbacks from the venc component thread context
457             OMX_COMPONENT_GENERATE_FTB         = 0x4,
458             //Frame Done callbacks from the venc component thread context
459             OMX_COMPONENT_GENERATE_ETB         = 0x5,
460             //Command
461             OMX_COMPONENT_GENERATE_COMMAND     = 0x6,
462             //Push-Pending Buffers
463             OMX_COMPONENT_PUSH_PENDING_BUFS    = 0x7,
464             // Empty Buffer Done callbacks
465             OMX_COMPONENT_GENERATE_EBD         = 0x8,
466             //Flush Event Callbacks from the venc component thread context
467             OMX_COMPONENT_GENERATE_EVENT_FLUSH       = 0x9,
468             OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH = 0x0A,
469             OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH = 0x0B,
470             OMX_COMPONENT_GENERATE_FBD = 0xc,
471             OMX_COMPONENT_GENERATE_START_DONE = 0xD,
472             OMX_COMPONENT_GENERATE_PAUSE_DONE = 0xE,
473             OMX_COMPONENT_GENERATE_RESUME_DONE = 0xF,
474             OMX_COMPONENT_GENERATE_STOP_DONE = 0x10,
475             OMX_COMPONENT_GENERATE_HARDWARE_ERROR = 0x11,
476             OMX_COMPONENT_GENERATE_LTRUSE_FAILED = 0x12,
477             OMX_COMPONENT_GENERATE_ETB_OPQ = 0x13,
478             OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING = 0x14,
479             OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD = 0x15,
480             OMX_COMPONENT_CLOSE_MSG = 0x16
481         };
482 
483         struct omx_event {
484             unsigned long param1;
485             unsigned long param2;
486             unsigned long id;
487         };
488 
489         struct omx_cmd_queue {
490             omx_event m_q[OMX_CORE_CONTROL_CMDQ_SIZE];
491             unsigned long m_read;
492             unsigned long m_write;
493             unsigned long m_size;
494 
495             omx_cmd_queue();
496             ~omx_cmd_queue();
497             bool insert_entry(unsigned long p1, unsigned long p2, unsigned long id);
498             bool pop_entry(unsigned long *p1,unsigned long *p2, unsigned long *id);
499             // get msgtype of the first ele from the queue
500             unsigned get_q_msg_type();
501 
502         };
503 
504         bool allocate_done(void);
505         bool allocate_input_done(void);
506         bool allocate_output_done(void);
507         bool allocate_input_extradata_done(void);
508         bool allocate_output_extradata_done(void);
509 
510         OMX_ERRORTYPE free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
511         OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
512         void free_input_extradata_buffer_header();
513         void free_output_extradata_buffer_header();
514 
515         OMX_ERRORTYPE allocate_client_input_extradata_headers();
516         OMX_ERRORTYPE allocate_client_output_extradata_headers();
517 
518         OMX_ERRORTYPE allocate_input_buffer(OMX_HANDLETYPE       hComp,
519                 OMX_BUFFERHEADERTYPE **bufferHdr,
520                 OMX_U32              port,
521                 OMX_PTR              appData,
522                 OMX_U32              bytes);
523 #ifdef _ANDROID_ICS_
524         OMX_ERRORTYPE allocate_input_meta_buffer(OMX_HANDLETYPE       hComp,
525                 OMX_BUFFERHEADERTYPE **bufferHdr,
526                 OMX_PTR              appData,
527                 OMX_U32              bytes);
528 #endif
529         OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE       hComp,
530                 OMX_BUFFERHEADERTYPE **bufferHdr,
531                 OMX_U32 port,OMX_PTR appData,
532                 OMX_U32              bytes);
533 
534         OMX_ERRORTYPE use_input_buffer(OMX_HANDLETYPE hComp,
535                 OMX_BUFFERHEADERTYPE  **bufferHdr,
536                 OMX_U32               port,
537                 OMX_PTR               appData,
538                 OMX_U32               bytes,
539                 OMX_U8                *buffer);
540 
541         OMX_ERRORTYPE use_output_buffer(OMX_HANDLETYPE hComp,
542                 OMX_BUFFERHEADERTYPE   **bufferHdr,
543                 OMX_U32                port,
544                 OMX_PTR                appData,
545                 OMX_U32                bytes,
546                 OMX_U8                 *buffer);
547 
548         OMX_ERRORTYPE use_client_input_extradata_buffer(OMX_HANDLETYPE hComp,
549                 OMX_BUFFERHEADERTYPE   **bufferHdr,
550                 OMX_U32                port,
551                 OMX_PTR                appData,
552                 OMX_U32                bytes,
553                 OMX_U8                 *buffer);
554 
555         OMX_ERRORTYPE use_client_output_extradata_buffer(OMX_HANDLETYPE hComp,
556                 OMX_BUFFERHEADERTYPE   **bufferHdr,
557                 OMX_U32                port,
558                 OMX_PTR                appData,
559                 OMX_U32                bytes,
560                 OMX_U8                 *buffer);
561 
562         bool execute_omx_flush(OMX_U32);
563         bool execute_output_flush(void);
564         bool execute_input_flush(void);
565         bool execute_flush_all(void);
566         OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE hComp,
567                 OMX_BUFFERHEADERTYPE * buffer);
568 
569         OMX_ERRORTYPE fill_buffer_done(OMX_HANDLETYPE hComp,
570                 OMX_BUFFERHEADERTYPE * buffer);
571         OMX_ERRORTYPE empty_this_buffer_proxy(OMX_HANDLETYPE hComp,
572                 OMX_BUFFERHEADERTYPE *buffer);
573         OMX_ERRORTYPE empty_this_buffer_opaque(OMX_HANDLETYPE hComp,
574                 OMX_BUFFERHEADERTYPE *buffer);
575         OMX_ERRORTYPE push_input_buffer(OMX_HANDLETYPE hComp);
576         OMX_ERRORTYPE convert_queue_buffer(OMX_HANDLETYPE hComp,
577                 struct pmem &Input_pmem_info,unsigned long &index);
578         OMX_ERRORTYPE queue_meta_buffer(OMX_HANDLETYPE hComp);
579         OMX_ERRORTYPE fill_this_buffer_proxy(OMX_HANDLETYPE hComp,
580                 OMX_BUFFERHEADERTYPE *buffer);
581         bool release_done();
582         OMX_ERRORTYPE handle_empty_eos_buffer();
583 
584         bool release_output_done();
585         bool release_input_done();
586         bool release_input_extradata_done();
587         bool release_output_extradata_done();
588 
589         OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE  hComp,
590                 OMX_COMMANDTYPE cmd,
591                 OMX_U32         param1,
592                 OMX_PTR         cmdData);
593         bool post_event( unsigned long p1,
594                 unsigned long p2,
595                 unsigned long id
596                    );
597 
omx_report_error()598         inline void omx_report_error () {
599             if (m_pCallbacks.EventHandler && !m_error_propogated && m_state != OMX_StateLoaded) {
600                 m_error_propogated = true;
601                 DEBUG_PRINT_ERROR("ERROR: send OMX_ErrorHardware to Client");
602                 m_pCallbacks.EventHandler(&m_cmp,m_app_data,
603                         OMX_EventError,OMX_ErrorHardware,0,NULL);
604             }
605         }
606 
omx_report_hw_overload()607         inline void omx_report_hw_overload ()
608         {
609             if (m_pCallbacks.EventHandler && !m_error_propogated && m_state != OMX_StateLoaded) {
610                 m_error_propogated = true;
611                 DEBUG_PRINT_ERROR("ERROR: send OMX_ErrorInsufficientResources to Client");
612                 m_pCallbacks.EventHandler(&m_cmp, m_app_data,
613                         OMX_EventError, OMX_ErrorInsufficientResources, 0, NULL);
614             }
615         }
616 
omx_report_unsupported_setting()617         inline void omx_report_unsupported_setting () {
618             if (m_pCallbacks.EventHandler && !m_error_propogated && m_state != OMX_StateLoaded) {
619                 m_error_propogated = true;
620                 m_pCallbacks.EventHandler(&m_cmp,m_app_data,
621                         OMX_EventError,OMX_ErrorUnsupportedSetting,0,NULL);
622             }
623         }
624 
625         client_extradata_info m_client_out_extradata_info;
626         client_extradata_info m_client_in_extradata_info;
627 
628         void complete_pending_buffer_done_cbs();
629         bool is_rotation_enabled();
630         bool is_conv_needed(private_handle_t *handle);
631         bool is_flip_conv_needed(private_handle_t *handle);
632         OMX_ERRORTYPE do_flip_conversion(struct pmem *buffer);
633         void initFastCV();
634         void print_debug_color_aspects(ColorAspects *aspects, const char *prefix);
635 
636         OMX_ERRORTYPE get_vendor_extension_config(
637                 OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE *ext);
638         OMX_ERRORTYPE set_vendor_extension_config(
639                 OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE *ext);
640         void init_vendor_extensions(VendorExtensionStore&);
641         // Extensions-store is immutable after initialization (i.e cannot add/remove/change
642         //  extensions once added !)
643         const VendorExtensionStore mVendorExtensionStore;
644 
645         char *ion_map(int fd, int len);
646         OMX_ERRORTYPE ion_unmap(int fd, void *bufaddr, int len);
647 #ifdef USE_ION
648         bool alloc_map_ion_memory(int size, venc_ion *ion_info,
649                                  int flag);
650         void free_ion_memory(struct venc_ion *buf_ion_info);
651 #endif
652 
653         //*************************************************************
654         //*******************MEMBER VARIABLES *************************
655         //*************************************************************
656 
657         pthread_mutex_t       m_lock;
658         sem_t                 m_cmd_lock;
659         bool              m_error_propogated;
660 
661         //sem to handle the minimum procesing of commands
662 
663 
664         // compression format
665         //OMX_VIDEO_CODINGTYPE eCompressionFormat;
666         // OMX State
667         OMX_STATETYPE m_state;
668         // Application data
669         OMX_PTR m_app_data;
670         OMX_BOOL m_use_input_pmem;
671         OMX_BOOL m_use_output_pmem;
672         // Application callbacks
673         OMX_CALLBACKTYPE m_pCallbacks;
674         OMX_PORT_PARAM_TYPE m_sPortParam;
675         OMX_VIDEO_PARAM_PROFILELEVELTYPE m_sParamProfileLevel;
676         OMX_VIDEO_PARAM_PORTFORMATTYPE m_sInPortFormat;
677         OMX_VIDEO_PARAM_PORTFORMATTYPE m_sOutPortFormat;
678         OMX_PARAM_PORTDEFINITIONTYPE m_sInPortDef;
679         OMX_PARAM_PORTDEFINITIONTYPE m_sOutPortDef;
680         OMX_VIDEO_PARAM_MPEG4TYPE m_sParamMPEG4;
681         OMX_VIDEO_PARAM_H263TYPE m_sParamH263;
682         OMX_VIDEO_PARAM_AVCTYPE m_sParamAVC;
683         OMX_VIDEO_PARAM_VP8TYPE m_sParamVP8;
684         OMX_VIDEO_PARAM_ANDROID_VP8ENCODERTYPE m_sParamVP8Encoder;
685         OMX_VIDEO_PARAM_HEVCTYPE m_sParamHEVC;
686         OMX_PORT_PARAM_TYPE m_sPortParam_img;
687         OMX_PORT_PARAM_TYPE m_sPortParam_audio;
688         OMX_VIDEO_CONFIG_BITRATETYPE m_sConfigBitrate;
689         OMX_CONFIG_FRAMERATETYPE m_sConfigFramerate;
690         OMX_VIDEO_PARAM_BITRATETYPE m_sParamBitrate;
691         OMX_PRIORITYMGMTTYPE m_sPriorityMgmt;
692         OMX_PARAM_BUFFERSUPPLIERTYPE m_sInBufSupplier;
693         OMX_PARAM_BUFFERSUPPLIERTYPE m_sOutBufSupplier;
694         OMX_CONFIG_ROTATIONTYPE m_sConfigFrameRotation;
695         OMX_CONFIG_MIRRORTYPE m_sConfigFrameMirror;
696         OMX_CONFIG_INTRAREFRESHVOPTYPE m_sConfigIntraRefreshVOP;
697         OMX_U32 m_QPSet;
698         OMX_VIDEO_PARAM_QUANTIZATIONTYPE m_sSessionQuantization;
699         OMX_QCOM_VIDEO_PARAM_IPB_QPRANGETYPE m_sSessionQPRange;
700         OMX_VIDEO_PARAM_AVCSLICEFMO m_sAVCSliceFMO;
701         QOMX_VIDEO_INTRAPERIODTYPE m_sIntraperiod;
702         OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE m_sErrorCorrection;
703         QOMX_VIDEO_PARAM_SLICE_SPACING_TYPE m_sSliceSpacing;
704         OMX_VIDEO_PARAM_INTRAREFRESHTYPE m_sIntraRefresh;
705         QOMX_VIDEO_PARAM_LTRCOUNT_TYPE m_sParamLTRCount;
706         QOMX_VIDEO_CONFIG_LTRUSE_TYPE m_sConfigLTRUse;
707         QOMX_VIDEO_CONFIG_LTRMARK_TYPE m_sConfigLTRMark;
708         OMX_VIDEO_CONFIG_AVCINTRAPERIOD m_sConfigAVCIDRPeriod;
709         OMX_VIDEO_VP8REFERENCEFRAMETYPE m_sConfigVp8ReferenceFrame;
710         QOMX_VIDEO_HIERARCHICALLAYERS m_sHierLayers;
711         QOMX_EXTNINDEX_VIDEO_HIER_P_LAYERS m_sHPlayers;
712         OMX_SKYPE_VIDEO_CONFIG_BASELAYERPID m_sBaseLayerID;
713         OMX_SKYPE_VIDEO_PARAM_DRIVERVER m_sDriverVer;
714         OMX_QCOM_VIDEO_CONFIG_QP m_sConfigQP;
715         QOMX_EXTNINDEX_VIDEO_VENC_SAR m_sSar;
716         QOMX_VIDEO_H264ENTROPYCODINGTYPE m_sParamEntropy;
717         QOMX_INDEXDOWNSCALAR m_sParamDownScalar;
718         PrependSPSPPSToIDRFramesParams m_sPrependSPSPPS;
719         struct timestamp_info {
720             OMX_S64 ts;
721             omx_cmd_queue deferred_inbufq;
722             pthread_mutex_t m_lock;
723         } m_TimeStampInfo;
724         OMX_U32 m_sExtraData;
725         OMX_U32 m_sParamConsumerUsage;
726         OMX_U32 m_input_msg_id;
727         OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE m_sConfigIntraRefresh;
728         OMX_QTI_VIDEO_CONFIG_BLURINFO       m_blurInfo;
729         DescribeColorAspectsParams m_sConfigColorAspects;
730         OMX_VIDEO_PARAM_ANDROID_TEMPORALLAYERINGTYPE m_sParamTemporalLayers;
731         OMX_VIDEO_CONFIG_ANDROID_TEMPORALLAYERINGTYPE m_sConfigTemporalLayers;
732         QOMX_ENABLETYPE m_sParamAVTimerTimestampMode;   // use VT-timestamps in gralloc-handle
733         QOMX_ENABLETYPE m_sParamControlInputQueue;
734         OMX_TIME_CONFIG_TIMESTAMPTYPE m_sConfigInputTrigTS;
735         QOMX_EXTNINDEX_VIDEO_LOW_LATENCY_MODE m_sParamLowLatency;
736         OMX_U32 m_nOperatingRate;
737         QOMX_ENABLETYPE m_sParamColorSpaceConversion;
738         OMX_VIDEO_PARAM_ANDROID_IMAGEGRIDTYPE m_sParamAndroidImageGrid;
739         QOMX_ENABLETYPE m_sParamLinearColorFormat;
740         OMX_EXTNINDEX_VIDEO_VBV_DELAY m_sParamVbvDelay;
741 
742         // fill this buffer queue
743         omx_cmd_queue m_ftb_q;
744         // Command Q for rest of the events
745         omx_cmd_queue m_cmd_q;
746         omx_cmd_queue m_etb_q;
747         // Input memory pointer
748         OMX_BUFFERHEADERTYPE *m_inp_mem_ptr;
749         // Output memory pointer
750         OMX_BUFFERHEADERTYPE *m_out_mem_ptr;
751         // Client extradata memory pointer
752         OMX_BUFFERHEADERTYPE  *m_client_input_extradata_mem_ptr;
753         OMX_BUFFERHEADERTYPE  *m_client_output_extradata_mem_ptr;
754         omx_cmd_queue m_opq_meta_q;
755         omx_cmd_queue m_opq_pmem_q;
756         OMX_BUFFERHEADERTYPE meta_buffer_hdr[MAX_NUM_INPUT_BUFFERS];
757         pthread_mutex_t m_buf_lock;
758 
759         bool input_flush_progress;
760         bool output_flush_progress;
761         bool input_use_buffer;
762         bool output_use_buffer;
763         int pending_input_buffers;
764         int pending_output_buffers;
765 
766         bool allocate_native_handle;
767 
768         uint64_t m_out_bm_count;
769         uint64_t m_client_out_bm_count;
770         uint64_t m_client_in_bm_count;
771         uint64_t m_inp_bm_count;
772         // bitmask array size for extradata
773         uint64_t m_in_extradata_bm_count;
774         uint64_t m_out_extradata_bm_count;
775         uint64_t m_flags;
776         uint64_t m_etb_count;
777         uint64_t m_fbd_count;
778         OMX_TICKS m_etb_timestamp;
779         // to know whether Event Port Settings change has been triggered or not.
780         bool m_event_port_settings_sent;
781         OMX_U8                m_cRole[OMX_MAX_STRINGNAME_SIZE];
782         bool hw_overload;
783         size_t m_graphicbuffer_size;
784         char m_platform[OMX_MAX_STRINGNAME_SIZE];
785 
786         bool m_buffer_freed;
787         bool profile_mode;
788         int profile_frame_count;
789         OMX_U64 profile_start_time;
790         OMX_U64 profile_last_time;
791         bool profile_etb();
792         int32_t m_no_vpss;
793         bool m_fastCV_init_done;
794 };
795 
796 #endif // __OMX_VIDEO_BASE_H__
797