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 
236         omx_video();  // constructor
237         virtual ~omx_video();  // destructor
238 
239         // virtual int async_message_process (void *context, void* message);
240         void process_event_cb(void *ctxt);
241 
242         OMX_ERRORTYPE allocate_buffer(
243                 OMX_HANDLETYPE hComp,
244                 OMX_BUFFERHEADERTYPE **bufferHdr,
245                 OMX_U32 port,
246                 OMX_PTR appData,
247                 OMX_U32 bytes
248                 );
249 
250 
251         virtual OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp)= 0;
252 
253         virtual OMX_ERRORTYPE component_init(OMX_STRING role)= 0;
254 
255         virtual OMX_U32 dev_stop(void) = 0;
256         virtual OMX_U32 dev_pause(void) = 0;
257         virtual OMX_U32 dev_start(void) = 0;
258         virtual OMX_U32 dev_flush(unsigned) = 0;
259         virtual OMX_U32 dev_resume(void) = 0;
260         virtual OMX_U32 dev_start_done(void) = 0;
261         virtual OMX_U32 dev_set_message_thread_id(pthread_t) = 0;
262         virtual bool dev_use_buf(unsigned) = 0;
263         virtual bool dev_handle_empty_eos_buffer(void) = 0;
264         virtual bool dev_free_buf(void *,unsigned) = 0;
265         virtual bool dev_empty_buf(void *, void *,unsigned,unsigned) = 0;
266         virtual bool dev_fill_buf(void *buffer, void *,unsigned,unsigned) = 0;
267         virtual bool dev_is_meta_mode() = 0;
268         virtual bool dev_is_avtimer_needed() = 0;
269         virtual bool dev_get_buf_req(OMX_U32 *,OMX_U32 *,OMX_U32 *,OMX_U32) = 0;
270         virtual bool dev_get_dimensions(OMX_U32 ,OMX_U32 *,OMX_U32 *) = 0;
271         virtual bool is_streamon_done(OMX_U32 port) = 0;
272         virtual bool dev_get_seq_hdr(void *, unsigned, unsigned *) = 0;
273         virtual bool dev_loaded_start(void) = 0;
274         virtual bool dev_loaded_stop(void) = 0;
275         virtual bool dev_loaded_start_done(void) = 0;
276         virtual bool dev_loaded_stop_done(void) = 0;
277         virtual bool is_secure_session(void) = 0;
278         virtual int dev_handle_output_extradata(void*, int) = 0;
279         virtual int dev_set_format(int) = 0;
280         virtual bool dev_is_video_session_supported(OMX_U32 width, OMX_U32 height) = 0;
281         virtual bool dev_get_capability_ltrcount(OMX_U32 *, OMX_U32 *, OMX_U32 *) = 0;
282         virtual bool dev_get_vui_timing_info(OMX_U32 *) = 0;
283         virtual bool dev_get_peak_bitrate(OMX_U32 *) = 0;
284         virtual bool dev_get_batch_size(OMX_U32 *) = 0;
285         virtual bool dev_buffer_ready_to_queue(OMX_BUFFERHEADERTYPE *buffer) = 0;
286         virtual bool dev_get_temporal_layer_caps(OMX_U32 * /*nMaxLayers*/,
287                 OMX_U32 * /*nMaxBLayers*/, OMX_VIDEO_ANDROID_TEMPORALLAYERINGPATTERNTYPE */*SupportedPattern*/) = 0;
288         virtual OMX_ERRORTYPE dev_get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *) = 0;
289         virtual bool dev_get_supported_color_format(unsigned index, OMX_U32 *colorFormat) = 0;
290 #ifdef _ANDROID_ICS_
291         void omx_release_meta_buffer(OMX_BUFFERHEADERTYPE *buffer);
292 #endif
293         virtual bool dev_color_align(OMX_BUFFERHEADERTYPE *buffer, OMX_U32 width,
294                         OMX_U32 height) = 0;
295         virtual bool dev_get_output_log_flag() = 0;
296         virtual int dev_output_log_buffers(const char *buffer_addr, int buffer_len, uint64_t timestamp) = 0;
297         virtual int dev_extradata_log_buffers(char *buffer_addr, int index, bool input) = 0;
298         virtual bool dev_get_hevc_profile(OMX_U32*) = 0;
299         virtual bool dev_handle_client_input_extradata(void*) = 0;
300         virtual void dev_get_color_format_as_string(char * buf, int buf_len, unsigned colorformat) = 0;
301         virtual void dev_get_consumer_usage(OMX_U32*) = 0;
302         OMX_ERRORTYPE component_role_enum(
303                 OMX_HANDLETYPE hComp,
304                 OMX_U8 *role,
305                 OMX_U32 index
306                 );
307 
308         OMX_ERRORTYPE component_tunnel_request(
309                 OMX_HANDLETYPE hComp,
310                 OMX_U32 port,
311                 OMX_HANDLETYPE  peerComponent,
312                 OMX_U32 peerPort,
313                 OMX_TUNNELSETUPTYPE *tunnelSetup
314                 );
315 
316         OMX_ERRORTYPE empty_this_buffer(
317                 OMX_HANDLETYPE hComp,
318                 OMX_BUFFERHEADERTYPE *buffer
319                 );
320 
321 
322 
323         OMX_ERRORTYPE fill_this_buffer(
324                 OMX_HANDLETYPE hComp,
325                 OMX_BUFFERHEADERTYPE *buffer
326                 );
327 
328 
329         OMX_ERRORTYPE free_buffer(
330                 OMX_HANDLETYPE hComp,
331                 OMX_U32 port,
332                 OMX_BUFFERHEADERTYPE *buffer
333                 );
334 
335         OMX_ERRORTYPE get_component_version(
336                 OMX_HANDLETYPE hComp,
337                 OMX_STRING componentName,
338                 OMX_VERSIONTYPE *componentVersion,
339                 OMX_VERSIONTYPE *specVersion,
340                 OMX_UUIDTYPE *componentUUID
341                 );
342 
343         OMX_ERRORTYPE get_config(
344                 OMX_HANDLETYPE hComp,
345                 OMX_INDEXTYPE configIndex,
346                 OMX_PTR configData
347                 );
348 
349         OMX_ERRORTYPE get_extension_index(
350                 OMX_HANDLETYPE hComp,
351                 OMX_STRING paramName,
352                 OMX_INDEXTYPE *indexType
353                 );
354 
355         OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE hComp,
356                 OMX_INDEXTYPE  paramIndex,
357                 OMX_PTR        paramData);
358 
359         OMX_ERRORTYPE get_state(OMX_HANDLETYPE hComp,
360                 OMX_STATETYPE *state);
361 
362 
363 
364         OMX_ERRORTYPE send_command(OMX_HANDLETYPE  hComp,
365                 OMX_COMMANDTYPE cmd,
366                 OMX_U32         param1,
367                 OMX_PTR         cmdData);
368 
369 
370         OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE   hComp,
371                 OMX_CALLBACKTYPE *callbacks,
372                 OMX_PTR          appData);
373 
374         virtual OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp,
375                 OMX_INDEXTYPE  configIndex,
376                 OMX_PTR        configData) = 0;
377 
378         virtual OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp,
379                 OMX_INDEXTYPE  paramIndex,
380                 OMX_PTR        paramData) =0;
381 
382         OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE      hComp,
383                 OMX_BUFFERHEADERTYPE **bufferHdr,
384                 OMX_U32              port,
385                 OMX_PTR              appData,
386                 OMX_U32              bytes,
387                 OMX_U8               *buffer);
388 
389 
390         OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE     hComp,
391                 OMX_BUFFERHEADERTYPE **bufferHdr,
392                 OMX_U32              port,
393                 OMX_PTR              appData,
394                 void *               eglImage);
395 
396         Signal signal;
397 
398         pthread_t msg_thread_id;
399         pthread_t async_thread_id;
400         bool async_thread_created;
401         bool msg_thread_created;
402         volatile bool msg_thread_stop;
403 
404         OMX_U8 m_nkind[128];
405 
406 
407         //int *input_pmem_fd;
408         //int *output_pmem_fd;
409         struct pmem *m_pInput_pmem;
410         struct pmem *m_pOutput_pmem;
411 #ifdef USE_ION
412         struct venc_ion *m_pInput_ion;
413         struct venc_ion *m_pOutput_ion;
414 #endif
415 
416 
417 
418     public:
419         // Bit Positions
420         enum flags_bit_positions {
421             // Defer transition to IDLE
422             OMX_COMPONENT_IDLE_PENDING            =0x1,
423             // Defer transition to LOADING
424             OMX_COMPONENT_LOADING_PENDING         =0x2,
425             // First  Buffer Pending
426             OMX_COMPONENT_FIRST_BUFFER_PENDING    =0x3,
427             // Second Buffer Pending
428             OMX_COMPONENT_SECOND_BUFFER_PENDING   =0x4,
429             // Defer transition to Enable
430             OMX_COMPONENT_INPUT_ENABLE_PENDING    =0x5,
431             // Defer transition to Enable
432             OMX_COMPONENT_OUTPUT_ENABLE_PENDING   =0x6,
433             // Defer transition to Disable
434             OMX_COMPONENT_INPUT_DISABLE_PENDING   =0x7,
435             // Defer transition to Disable
436             OMX_COMPONENT_OUTPUT_DISABLE_PENDING  =0x8,
437             //defer flush notification
438             OMX_COMPONENT_OUTPUT_FLUSH_PENDING    =0x9,
439             OMX_COMPONENT_INPUT_FLUSH_PENDING    =0xA,
440             OMX_COMPONENT_PAUSE_PENDING          =0xB,
441             OMX_COMPONENT_EXECUTE_PENDING        =0xC,
442             OMX_COMPONENT_LOADED_START_PENDING = 0xD,
443             OMX_COMPONENT_LOADED_STOP_PENDING = 0xF,
444 
445         };
446 
447         // Deferred callback identifiers
448         enum {
449             //Event Callbacks from the venc component thread context
450             OMX_COMPONENT_GENERATE_EVENT       = 0x1,
451             //Buffer Done callbacks from the venc component thread context
452             OMX_COMPONENT_GENERATE_BUFFER_DONE = 0x2,
453             //Frame Done callbacks from the venc component thread context
454             OMX_COMPONENT_GENERATE_FRAME_DONE  = 0x3,
455             //Buffer Done callbacks from the venc component thread context
456             OMX_COMPONENT_GENERATE_FTB         = 0x4,
457             //Frame Done callbacks from the venc component thread context
458             OMX_COMPONENT_GENERATE_ETB         = 0x5,
459             //Command
460             OMX_COMPONENT_GENERATE_COMMAND     = 0x6,
461             //Push-Pending Buffers
462             OMX_COMPONENT_PUSH_PENDING_BUFS    = 0x7,
463             // Empty Buffer Done callbacks
464             OMX_COMPONENT_GENERATE_EBD         = 0x8,
465             //Flush Event Callbacks from the venc component thread context
466             OMX_COMPONENT_GENERATE_EVENT_FLUSH       = 0x9,
467             OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH = 0x0A,
468             OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH = 0x0B,
469             OMX_COMPONENT_GENERATE_FBD = 0xc,
470             OMX_COMPONENT_GENERATE_START_DONE = 0xD,
471             OMX_COMPONENT_GENERATE_PAUSE_DONE = 0xE,
472             OMX_COMPONENT_GENERATE_RESUME_DONE = 0xF,
473             OMX_COMPONENT_GENERATE_STOP_DONE = 0x10,
474             OMX_COMPONENT_GENERATE_HARDWARE_ERROR = 0x11,
475             OMX_COMPONENT_GENERATE_LTRUSE_FAILED = 0x12,
476             OMX_COMPONENT_GENERATE_ETB_OPQ = 0x13,
477             OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING = 0x14,
478             OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD = 0x15,
479             OMX_COMPONENT_CLOSE_MSG = 0x16
480         };
481 
482         struct omx_event {
483             unsigned long param1;
484             unsigned long param2;
485             unsigned long id;
486         };
487 
488         struct omx_cmd_queue {
489             omx_event m_q[OMX_CORE_CONTROL_CMDQ_SIZE];
490             unsigned long m_read;
491             unsigned long m_write;
492             unsigned long m_size;
493 
494             omx_cmd_queue();
495             ~omx_cmd_queue();
496             bool insert_entry(unsigned long p1, unsigned long p2, unsigned long id);
497             bool pop_entry(unsigned long *p1,unsigned long *p2, unsigned long *id);
498             // get msgtype of the first ele from the queue
499             unsigned get_q_msg_type();
500 
501         };
502 
503         bool allocate_done(void);
504         bool allocate_input_done(void);
505         bool allocate_output_done(void);
506         bool allocate_input_extradata_done(void);
507         bool allocate_output_extradata_done(void);
508 
509         OMX_ERRORTYPE free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
510         OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
511         void free_input_extradata_buffer_header();
512         void free_output_extradata_buffer_header();
513 
514         OMX_ERRORTYPE allocate_client_input_extradata_headers();
515         OMX_ERRORTYPE allocate_client_output_extradata_headers();
516 
517         OMX_ERRORTYPE allocate_input_buffer(OMX_HANDLETYPE       hComp,
518                 OMX_BUFFERHEADERTYPE **bufferHdr,
519                 OMX_U32              port,
520                 OMX_PTR              appData,
521                 OMX_U32              bytes);
522 #ifdef _ANDROID_ICS_
523         OMX_ERRORTYPE allocate_input_meta_buffer(OMX_HANDLETYPE       hComp,
524                 OMX_BUFFERHEADERTYPE **bufferHdr,
525                 OMX_PTR              appData,
526                 OMX_U32              bytes);
527 #endif
528         OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE       hComp,
529                 OMX_BUFFERHEADERTYPE **bufferHdr,
530                 OMX_U32 port,OMX_PTR appData,
531                 OMX_U32              bytes);
532 
533         OMX_ERRORTYPE use_input_buffer(OMX_HANDLETYPE hComp,
534                 OMX_BUFFERHEADERTYPE  **bufferHdr,
535                 OMX_U32               port,
536                 OMX_PTR               appData,
537                 OMX_U32               bytes,
538                 OMX_U8                *buffer);
539 
540         OMX_ERRORTYPE use_output_buffer(OMX_HANDLETYPE hComp,
541                 OMX_BUFFERHEADERTYPE   **bufferHdr,
542                 OMX_U32                port,
543                 OMX_PTR                appData,
544                 OMX_U32                bytes,
545                 OMX_U8                 *buffer);
546 
547         OMX_ERRORTYPE use_client_input_extradata_buffer(OMX_HANDLETYPE hComp,
548                 OMX_BUFFERHEADERTYPE   **bufferHdr,
549                 OMX_U32                port,
550                 OMX_PTR                appData,
551                 OMX_U32                bytes,
552                 OMX_U8                 *buffer);
553 
554         OMX_ERRORTYPE use_client_output_extradata_buffer(OMX_HANDLETYPE hComp,
555                 OMX_BUFFERHEADERTYPE   **bufferHdr,
556                 OMX_U32                port,
557                 OMX_PTR                appData,
558                 OMX_U32                bytes,
559                 OMX_U8                 *buffer);
560 
561         bool execute_omx_flush(OMX_U32);
562         bool execute_output_flush(void);
563         bool execute_input_flush(void);
564         bool execute_flush_all(void);
565         OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE hComp,
566                 OMX_BUFFERHEADERTYPE * buffer);
567 
568         OMX_ERRORTYPE fill_buffer_done(OMX_HANDLETYPE hComp,
569                 OMX_BUFFERHEADERTYPE * buffer);
570         OMX_ERRORTYPE empty_this_buffer_proxy(OMX_HANDLETYPE hComp,
571                 OMX_BUFFERHEADERTYPE *buffer);
572         OMX_ERRORTYPE empty_this_buffer_opaque(OMX_HANDLETYPE hComp,
573                 OMX_BUFFERHEADERTYPE *buffer);
574         OMX_ERRORTYPE push_input_buffer(OMX_HANDLETYPE hComp);
575         OMX_ERRORTYPE convert_queue_buffer(OMX_HANDLETYPE hComp,
576                 struct pmem &Input_pmem_info,unsigned long &index);
577         OMX_ERRORTYPE queue_meta_buffer(OMX_HANDLETYPE hComp);
578         OMX_ERRORTYPE fill_this_buffer_proxy(OMX_HANDLETYPE hComp,
579                 OMX_BUFFERHEADERTYPE *buffer);
580         bool release_done();
581         OMX_ERRORTYPE handle_empty_eos_buffer();
582 
583         bool release_output_done();
584         bool release_input_done();
585         bool release_input_extradata_done();
586         bool release_output_extradata_done();
587 
588         OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE  hComp,
589                 OMX_COMMANDTYPE cmd,
590                 OMX_U32         param1,
591                 OMX_PTR         cmdData);
592         bool post_event( unsigned long p1,
593                 unsigned long p2,
594                 unsigned long id
595                    );
596 
omx_report_error()597         inline void omx_report_error () {
598             if (m_pCallbacks.EventHandler && !m_error_propogated && m_state != OMX_StateLoaded) {
599                 m_error_propogated = true;
600                 DEBUG_PRINT_ERROR("ERROR: send OMX_ErrorHardware to Client");
601                 m_pCallbacks.EventHandler(&m_cmp,m_app_data,
602                         OMX_EventError,OMX_ErrorHardware,0,NULL);
603             }
604         }
605 
omx_report_hw_overload()606         inline void omx_report_hw_overload ()
607         {
608             if (m_pCallbacks.EventHandler && !m_error_propogated && m_state != OMX_StateLoaded) {
609                 m_error_propogated = true;
610                 DEBUG_PRINT_ERROR("ERROR: send OMX_ErrorInsufficientResources to Client");
611                 m_pCallbacks.EventHandler(&m_cmp, m_app_data,
612                         OMX_EventError, OMX_ErrorInsufficientResources, 0, NULL);
613             }
614         }
615 
omx_report_unsupported_setting()616         inline void omx_report_unsupported_setting () {
617             if (m_pCallbacks.EventHandler && !m_error_propogated && m_state != OMX_StateLoaded) {
618                 m_error_propogated = true;
619                 m_pCallbacks.EventHandler(&m_cmp,m_app_data,
620                         OMX_EventError,OMX_ErrorUnsupportedSetting,0,NULL);
621             }
622         }
623 
624         client_extradata_info m_client_out_extradata_info;
625         client_extradata_info m_client_in_extradata_info;
626 
627         void complete_pending_buffer_done_cbs();
628         bool is_rotation_enabled();
629         bool is_conv_needed(private_handle_t *handle);
630         bool is_flip_conv_needed(private_handle_t *handle);
631         OMX_ERRORTYPE do_flip_conversion(struct pmem *buffer);
632         void initFastCV();
633         void print_debug_color_aspects(ColorAspects *aspects, const char *prefix);
634 
635         OMX_ERRORTYPE get_vendor_extension_config(
636                 OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE *ext);
637         OMX_ERRORTYPE set_vendor_extension_config(
638                 OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE *ext);
639         void init_vendor_extensions(VendorExtensionStore&);
640         // Extensions-store is immutable after initialization (i.e cannot add/remove/change
641         //  extensions once added !)
642         const VendorExtensionStore mVendorExtensionStore;
643 
644         char *ion_map(int fd, int len);
645         OMX_ERRORTYPE ion_unmap(int fd, void *bufaddr, int len);
646 #ifdef USE_ION
647         bool alloc_map_ion_memory(int size, venc_ion *ion_info,
648                                  int flag);
649         void free_ion_memory(struct venc_ion *buf_ion_info);
650 #endif
651 
652         //*************************************************************
653         //*******************MEMBER VARIABLES *************************
654         //*************************************************************
655 
656         pthread_mutex_t       m_lock;
657         sem_t                 m_cmd_lock;
658         bool              m_error_propogated;
659 
660         //sem to handle the minimum procesing of commands
661 
662 
663         // compression format
664         //OMX_VIDEO_CODINGTYPE eCompressionFormat;
665         // OMX State
666         OMX_STATETYPE m_state;
667         // Application data
668         OMX_PTR m_app_data;
669         OMX_BOOL m_use_input_pmem;
670         OMX_BOOL m_use_output_pmem;
671         // Application callbacks
672         OMX_CALLBACKTYPE m_pCallbacks;
673         OMX_PORT_PARAM_TYPE m_sPortParam;
674         OMX_VIDEO_PARAM_PROFILELEVELTYPE m_sParamProfileLevel;
675         OMX_VIDEO_PARAM_PORTFORMATTYPE m_sInPortFormat;
676         OMX_VIDEO_PARAM_PORTFORMATTYPE m_sOutPortFormat;
677         OMX_PARAM_PORTDEFINITIONTYPE m_sInPortDef;
678         OMX_PARAM_PORTDEFINITIONTYPE m_sOutPortDef;
679         OMX_VIDEO_PARAM_MPEG4TYPE m_sParamMPEG4;
680         OMX_VIDEO_PARAM_H263TYPE m_sParamH263;
681         OMX_VIDEO_PARAM_AVCTYPE m_sParamAVC;
682         OMX_VIDEO_PARAM_VP8TYPE m_sParamVP8;
683         OMX_VIDEO_PARAM_ANDROID_VP8ENCODERTYPE m_sParamVP8Encoder;
684         OMX_VIDEO_PARAM_HEVCTYPE m_sParamHEVC;
685         OMX_PORT_PARAM_TYPE m_sPortParam_img;
686         OMX_PORT_PARAM_TYPE m_sPortParam_audio;
687         OMX_VIDEO_CONFIG_BITRATETYPE m_sConfigBitrate;
688         OMX_CONFIG_FRAMERATETYPE m_sConfigFramerate;
689         OMX_VIDEO_PARAM_BITRATETYPE m_sParamBitrate;
690         OMX_PRIORITYMGMTTYPE m_sPriorityMgmt;
691         OMX_PARAM_BUFFERSUPPLIERTYPE m_sInBufSupplier;
692         OMX_PARAM_BUFFERSUPPLIERTYPE m_sOutBufSupplier;
693         OMX_CONFIG_ROTATIONTYPE m_sConfigFrameRotation;
694         OMX_CONFIG_MIRRORTYPE m_sConfigFrameMirror;
695         OMX_CONFIG_INTRAREFRESHVOPTYPE m_sConfigIntraRefreshVOP;
696         OMX_U32 m_QPSet;
697         OMX_VIDEO_PARAM_QUANTIZATIONTYPE m_sSessionQuantization;
698         OMX_QCOM_VIDEO_PARAM_IPB_QPRANGETYPE m_sSessionQPRange;
699         OMX_VIDEO_PARAM_AVCSLICEFMO m_sAVCSliceFMO;
700         QOMX_VIDEO_INTRAPERIODTYPE m_sIntraperiod;
701         OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE m_sErrorCorrection;
702         QOMX_VIDEO_PARAM_SLICE_SPACING_TYPE m_sSliceSpacing;
703         OMX_VIDEO_PARAM_INTRAREFRESHTYPE m_sIntraRefresh;
704         QOMX_VIDEO_PARAM_LTRCOUNT_TYPE m_sParamLTRCount;
705         QOMX_VIDEO_CONFIG_LTRUSE_TYPE m_sConfigLTRUse;
706         QOMX_VIDEO_CONFIG_LTRMARK_TYPE m_sConfigLTRMark;
707         OMX_VIDEO_CONFIG_AVCINTRAPERIOD m_sConfigAVCIDRPeriod;
708         OMX_VIDEO_VP8REFERENCEFRAMETYPE m_sConfigVp8ReferenceFrame;
709         QOMX_VIDEO_HIERARCHICALLAYERS m_sHierLayers;
710         QOMX_EXTNINDEX_VIDEO_HIER_P_LAYERS m_sHPlayers;
711         OMX_SKYPE_VIDEO_CONFIG_BASELAYERPID m_sBaseLayerID;
712         OMX_SKYPE_VIDEO_PARAM_DRIVERVER m_sDriverVer;
713         OMX_QCOM_VIDEO_CONFIG_QP m_sConfigQP;
714         QOMX_EXTNINDEX_VIDEO_VENC_SAR m_sSar;
715         QOMX_VIDEO_H264ENTROPYCODINGTYPE m_sParamEntropy;
716         QOMX_INDEXDOWNSCALAR m_sParamDownScalar;
717         PrependSPSPPSToIDRFramesParams m_sPrependSPSPPS;
718         struct timestamp_info {
719             OMX_S64 ts;
720             omx_cmd_queue deferred_inbufq;
721             pthread_mutex_t m_lock;
722         } m_TimeStampInfo;
723         OMX_U32 m_sExtraData;
724         OMX_U32 m_sParamConsumerUsage;
725         OMX_U32 m_input_msg_id;
726         OMX_VIDEO_CONFIG_ANDROID_INTRAREFRESHTYPE m_sConfigIntraRefresh;
727         OMX_QTI_VIDEO_CONFIG_BLURINFO       m_blurInfo;
728         DescribeColorAspectsParams m_sConfigColorAspects;
729         OMX_VIDEO_PARAM_ANDROID_TEMPORALLAYERINGTYPE m_sParamTemporalLayers;
730         OMX_VIDEO_CONFIG_ANDROID_TEMPORALLAYERINGTYPE m_sConfigTemporalLayers;
731         QOMX_ENABLETYPE m_sParamAVTimerTimestampMode;   // use VT-timestamps in gralloc-handle
732         QOMX_ENABLETYPE m_sParamControlInputQueue;
733         OMX_TIME_CONFIG_TIMESTAMPTYPE m_sConfigInputTrigTS;
734         QOMX_EXTNINDEX_VIDEO_LOW_LATENCY_MODE m_sParamLowLatency;
735         OMX_U32 m_nOperatingRate;
736         QOMX_ENABLETYPE m_sParamColorSpaceConversion;
737         OMX_VIDEO_PARAM_ANDROID_IMAGEGRIDTYPE m_sParamAndroidImageGrid;
738         QOMX_ENABLETYPE m_sParamLinearColorFormat;
739         OMX_EXTNINDEX_VIDEO_VBV_DELAY m_sParamVbvDelay;
740 
741         // fill this buffer queue
742         omx_cmd_queue m_ftb_q;
743         // Command Q for rest of the events
744         omx_cmd_queue m_cmd_q;
745         omx_cmd_queue m_etb_q;
746         // Input memory pointer
747         OMX_BUFFERHEADERTYPE *m_inp_mem_ptr;
748         // Output memory pointer
749         OMX_BUFFERHEADERTYPE *m_out_mem_ptr;
750         // Client extradata memory pointer
751         OMX_BUFFERHEADERTYPE  *m_client_input_extradata_mem_ptr;
752         OMX_BUFFERHEADERTYPE  *m_client_output_extradata_mem_ptr;
753         omx_cmd_queue m_opq_meta_q;
754         omx_cmd_queue m_opq_pmem_q;
755         OMX_BUFFERHEADERTYPE meta_buffer_hdr[MAX_NUM_INPUT_BUFFERS];
756         pthread_mutex_t m_buf_lock;
757 
758         bool input_flush_progress;
759         bool output_flush_progress;
760         bool input_use_buffer;
761         bool output_use_buffer;
762         int pending_input_buffers;
763         int pending_output_buffers;
764 
765         bool allocate_native_handle;
766 
767         uint64_t m_out_bm_count;
768         uint64_t m_client_out_bm_count;
769         uint64_t m_client_in_bm_count;
770         uint64_t m_inp_bm_count;
771         // bitmask array size for extradata
772         uint64_t m_in_extradata_bm_count;
773         uint64_t m_out_extradata_bm_count;
774         uint64_t m_flags;
775         uint64_t m_etb_count;
776         uint64_t m_fbd_count;
777         OMX_TICKS m_etb_timestamp;
778         // to know whether Event Port Settings change has been triggered or not.
779         bool m_event_port_settings_sent;
780         OMX_U8                m_cRole[OMX_MAX_STRINGNAME_SIZE];
781         bool hw_overload;
782         size_t m_graphicbuffer_size;
783         char m_platform[OMX_MAX_STRINGNAME_SIZE];
784 
785         bool m_buffer_freed;
786         bool profile_mode;
787         int profile_frame_count;
788         OMX_U64 profile_start_time;
789         OMX_U64 profile_last_time;
790         bool profile_etb();
791         int32_t m_no_vpss;
792         bool m_fastCV_init_done;
793 };
794 
795 #endif // __OMX_VIDEO_BASE_H__
796