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