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