1 /*--------------------------------------------------------------------------
2 Copyright (c) 2010 - 2018, 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
6   are met:
7 
8     * Redistributions of source code must retain the above copyright
9   notice, this list of conditions and the following disclaimer.
10     * Redistributions in binary form must reproduce the above
11   copyright notice, this list of conditions and the following
12       disclaimer in the documentation and/or other materials provided
13       with the distribution.
14     * Neither the name of The Linux Foundation nor the names of its
15       contributors may be used to endorse or promote products derived
16       from this software without specific prior written permission.
17 
18 THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
19 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
20 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
21 ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
22 BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
25 BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
27 OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
28 IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 --------------------------------------------------------------------------*/
30 #ifndef __OMX_VDEC_H__
31 #define __OMX_VDEC_H__
32 /*============================================================================
33                             O p e n M A X   Component
34                                 Video Decoder
35 
36 *//** @file comx_vdec.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 <string.h>
48 #include <inttypes.h>
49 #include <cstddef>
50 #include <cutils/atomic.h>
51 #include <qdMetaData.h>
52 #include <color_metadata.h>
53 #include <media/msm_media_info.h>
54 
55 static ptrdiff_t x;
56 
57 #ifdef _ANDROID_
58 #ifdef MAX_RES_720P
59 #define LOG_TAG "OMX-VDEC-720P"
60 #elif MAX_RES_1080P
61 #define LOG_TAG "OMX-VDEC-1080P"
62 #else
63 #define LOG_TAG "OMX-VDEC"
64 #endif
65 
66 #ifdef USE_ION
67 #include <linux/msm_ion.h>
68 //#include <binder/MemoryHeapIon.h>
69 //#else
70 #endif
71 extern "C" {
72 #include <utils/Log.h>
73 }
74 #include <linux/videodev2.h>
75 #include <poll.h>
76 #include "hevc_utils.h"
77 #define TIMEOUT 5000
78 #endif // _ANDROID_
79 
80 #if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
81 #define STRINGIFY_ENUMS
82 #include <media/hardware/HardwareAPI.h>
83 #endif
84 
85 #include <unistd.h>
86 
87 #if defined (_ANDROID_ICS_)
88 #include <gralloc_priv.h>
89 #endif
90 
91 #include <pthread.h>
92 #ifndef PC_DEBUG
93 #include <semaphore.h>
94 #endif
95 #include "OMX_Core.h"
96 #include "OMX_QCOMExtns.h"
97 #include "OMX_Skype_VideoExtensions.h"
98 #include "OMX_VideoExt.h"
99 #include "OMX_IndexExt.h"
100 #include "qc_omx_component.h"
101 #include <linux/msm_vidc_dec.h>
102 #include <media/msm_vidc.h>
103 #include "frameparser.h"
104 #ifdef MAX_RES_1080P
105 #include "mp4_utils.h"
106 #endif
107 #include "extra_data_handler.h"
108 #include "ts_parser.h"
109 #include "vidc_color_converter.h"
110 #include "vidc_debug.h"
111 #include "vidc_vendor_extensions.h"
112 #ifdef _ANDROID_
113 #include <cutils/properties.h>
114 #else
115 #define PROPERTY_VALUE_MAX 92
116 #endif
117 extern "C" {
118     OMX_API void * get_omx_component_factory_fn(void);
119 }
120 
121 //////////////////////////////////////////////////////////////////////////////
122 //                       Module specific globals
123 //////////////////////////////////////////////////////////////////////////////
124 #define OMX_SPEC_VERSION  0x00000101
125 #define OMX_INIT_STRUCT(_s_, _name_)         \
126     memset((_s_), 0x0, sizeof(_name_));      \
127 (_s_)->nSize = sizeof(_name_);               \
128 (_s_)->nVersion.nVersion = OMX_SPEC_VERSION  \
129 
130 
131 //////////////////////////////////////////////////////////////////////////////
132 //               Macros
133 //////////////////////////////////////////////////////////////////////////////
134 #define PrintFrameHdr(bufHdr) DEBUG_PRINT("bufHdr %x buf %x size %d TS %d\n",\
135         (unsigned) bufHdr,\
136         (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->pBuffer,\
137         (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nFilledLen,\
138         (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nTimeStamp)
139 
140 // BitMask Management logic
141 #define BITS_PER_INDEX        64
142 #define BITMASK_SIZE(mIndex) (((mIndex) + BITS_PER_INDEX - 1)/BITS_PER_INDEX)
143 #define BITMASK_OFFSET(mIndex) ((mIndex)/BITS_PER_INDEX)
144 #define BITMASK_FLAG(mIndex) ((uint64_t)1 << ((mIndex) % BITS_PER_INDEX))
145 #define BITMASK_CLEAR(mArray,mIndex) (mArray)[BITMASK_OFFSET(mIndex)] \
146     &=  ~(BITMASK_FLAG(mIndex))
147 #define BITMASK_SET(mArray,mIndex)  (mArray)[BITMASK_OFFSET(mIndex)] \
148     |=  BITMASK_FLAG(mIndex)
149 #define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \
150         & BITMASK_FLAG(mIndex))
151 #define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
152             & BITMASK_FLAG(mIndex)) == 0x0)
153 #define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \
154         & BITMASK_FLAG(mIndex))
155 #define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
156             & BITMASK_FLAG(mIndex)) == 0x0)
157 
158 #define OMX_CORE_CONTROL_CMDQ_SIZE   100
159 #define OMX_CORE_QCIF_HEIGHT         144
160 #define OMX_CORE_QCIF_WIDTH          176
161 #define OMX_CORE_VGA_HEIGHT          480
162 #define OMX_CORE_VGA_WIDTH           640
163 #define OMX_CORE_WVGA_HEIGHT         480
164 #define OMX_CORE_WVGA_WIDTH          800
165 #define OMX_CORE_FWVGA_HEIGHT        480
166 #define OMX_CORE_FWVGA_WIDTH         864
167 
168 #define DESC_BUFFER_SIZE (8192 * 16)
169 
170 #ifdef _ANDROID_
171 #define MAX_NUM_INPUT_OUTPUT_BUFFERS 64
172 #endif
173 
174 #define MIN_NUM_INPUT_OUTPUT_EXTRADATA_BUFFERS 32 // 32 (max cap when VPP enabled)
175 
176 #define OMX_FRAMEINFO_EXTRADATA 0x00010000
177 #define OMX_INTERLACE_EXTRADATA 0x00020000
178 #define OMX_TIMEINFO_EXTRADATA  0x00040000
179 #define OMX_PORTDEF_EXTRADATA   0x00080000
180 #define OMX_EXTNUSER_EXTRADATA  0x00100000
181 #define OMX_FRAMEDIMENSION_EXTRADATA  0x00200000
182 #define OMX_FRAMEPACK_EXTRADATA 0x00400000
183 #define OMX_QP_EXTRADATA        0x00800000
184 #define OMX_BITSINFO_EXTRADATA  0x01000000
185 #define OMX_VQZIPSEI_EXTRADATA  0x02000000
186 #define OMX_OUTPUTCROP_EXTRADATA 0x04000000
187 
188 #define OMX_VUI_DISPLAY_INFO_EXTRADATA  0x08000000
189 #define OMX_MPEG2_SEQDISP_INFO_EXTRADATA 0x10000000
190 #define OMX_VPX_COLORSPACE_INFO_EXTRADATA  0x20000000
191 #define OMX_VC1_SEQDISP_INFO_EXTRADATA  0x40000000
192 #define OMX_DISPLAY_INFO_EXTRADATA  0x80000000
193 #define OMX_HDR_COLOR_INFO_EXTRADATA  0x100000000
194 #define DRIVER_EXTRADATA_MASK   0x0000FFFF
195 
196 #define OMX_INTERLACE_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
197             sizeof(OMX_STREAMINTERLACEFORMAT) + 3)&(~3))
198 #define OMX_FRAMEINFO_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
199             sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO) + 3)&(~3))
200 #define OMX_PORTDEF_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
201             sizeof(OMX_PARAM_PORTDEFINITIONTYPE) + 3)&(~3))
202 #define OMX_FRAMEDIMENSION_EXTRADATA_SIZE (sizeof(OMX_OTHER_EXTRADATATYPE) +\
203             sizeof(OMX_QCOM_EXTRADATA_FRAMEDIMENSION) + 3)&(~3)
204 #define OMX_FRAMEPACK_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
205             sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT) + 3)&(~3))
206 #define OMX_QP_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
207             sizeof(OMX_QCOM_EXTRADATA_QP) + 3)&(~3))
208 #define OMX_BITSINFO_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
209             sizeof(OMX_QCOM_EXTRADATA_BITS_INFO) + 3)&(~3))
210 #define OMX_VQZIPSEI_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
211             sizeof(OMX_QCOM_EXTRADATA_VQZIPSEI) + 3)&(~3))
212 #define OMX_USERDATA_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
213             + 3)&(~3))
214 
215 //  Define next macro with required values to enable default extradata,
216 //    VDEC_EXTRADATA_MB_ERROR_MAP
217 //    OMX_INTERLACE_EXTRADATA
218 //    OMX_FRAMEINFO_EXTRADATA
219 //    OMX_TIMEINFO_EXTRADATA
220 
221 //#define DEFAULT_EXTRADATA (OMX_FRAMEINFO_EXTRADATA|OMX_INTERLACE_EXTRADATA)
222 
223 enum port_indexes {
224     OMX_CORE_INPUT_PORT_INDEX        =0,
225     OMX_CORE_OUTPUT_PORT_INDEX       =1,
226     OMX_CORE_INPUT_EXTRADATA_INDEX   =2,
227     OMX_CORE_OUTPUT_EXTRADATA_INDEX  =3
228 };
229 enum vidc_perf_level {
230     VIDC_SVS = 0,
231     VIDC_NOMINAL = 1,
232     VIDC_TURBO = 2
233 };
234 
235 enum turbo_mode {
236     TURBO_MODE_NONE = 0x0,
237     TURBO_MODE_CLIENT_REQUESTED = 0x1,
238     TURBO_MODE_HIGH_FPS = 0x2,
239     TURBO_MODE_MAX = 0xFF
240 };
241 
242 #ifdef USE_ION
243 struct vdec_ion {
244     int ion_device_fd;
245     struct ion_fd_data fd_ion_data;
246     struct ion_allocation_data ion_alloc_data;
247 };
248 #endif
249 
250 struct vdec_ion_map_info {
251     bool free_buffer;
252     unsigned char *base_address;
253     int map_size;
254     int offset;
255 };
256 
257 #ifdef _MSM8974_
258 struct extradata_buffer_info {
259     unsigned long buffer_size;
260     char* uaddr;
261     int count;
262     int size;
263 #ifdef USE_ION
264     struct vdec_ion ion;
265 #endif
266 };
267 #endif
268 
269 struct video_driver_context {
270     int video_driver_fd;
271     enum vdec_codec decoder_format;
272     enum vdec_output_fromat output_format;
273     enum vdec_interlaced_format interlace;
274     enum vdec_output_order picture_order;
275     struct vdec_framesize frame_size;
276     struct vdec_picsize video_resolution;
277     struct vdec_allocatorproperty ip_buf;
278     struct vdec_allocatorproperty op_buf;
279     struct vdec_bufferpayload *ptr_inputbuffer;
280     struct vdec_bufferpayload *ptr_outputbuffer;
281     struct vdec_output_frameinfo *ptr_respbuffer;
282 #ifdef USE_ION
283     struct vdec_ion *ip_buf_ion_info;
284     struct vdec_ion *op_buf_ion_info;
285     struct vdec_ion h264_mv;
286     struct vdec_ion meta_buffer;
287     struct vdec_ion meta_buffer_iommu;
288 #endif
289     struct vdec_ion_map_info *op_buf_map_info;
290     struct vdec_framerate frame_rate;
291     unsigned extradata;
292     bool timestamp_adjust;
293     char kind[128];
294     bool idr_only_decoding;
295     unsigned disable_dmx;
296 #ifdef _MSM8974_
297     struct extradata_buffer_info extradata_info;
298     int num_planes;
299 #endif
300 };
301 
302 struct video_decoder_capability {
303     unsigned int min_width;
304     unsigned int max_width;
305     unsigned int min_height;
306     unsigned int max_height;
307 };
308 
309 struct debug_cap {
310     bool in_buffer_log;
311     bool out_buffer_log;
312     bool out_meta_buffer_log;
313     char infile_name[PROPERTY_VALUE_MAX + 36];
314     char outfile_name[PROPERTY_VALUE_MAX + 36];
315     char out_ymetafile_name[PROPERTY_VALUE_MAX + 36];
316     char out_uvmetafile_name[PROPERTY_VALUE_MAX + 36];
317     char log_loc[PROPERTY_VALUE_MAX];
318     FILE *infile;
319     FILE *outfile;
320     FILE *out_ymeta_file;
321     FILE *out_uvmeta_file;
322 };
323 
324 struct dynamic_buf_list {
325     long fd;
326     long dup_fd;
327     OMX_U32 offset;
328     OMX_U32 ref_count;
329     void *buffaddr;
330     long mapped_size;
331 };
332 
333 struct extradata_info {
334     OMX_BOOL output_crop_updated;
335     OMX_CONFIG_RECTTYPE output_crop_rect;
336     OMX_U32 output_width;
337     OMX_U32 output_height;
338 };
339 
340 // OMX video decoder class
341 class omx_vdec: public qc_omx_component
342 {
343 
344     public:
345         omx_vdec();  // constructor
346         virtual ~omx_vdec();  // destructor
347 
348         static int async_message_process (void *context, void* message);
349         static void process_event_cb(void *ctxt,unsigned char id);
350 
351         OMX_ERRORTYPE allocate_buffer(
352                 OMX_HANDLETYPE hComp,
353                 OMX_BUFFERHEADERTYPE **bufferHdr,
354                 OMX_U32 port,
355                 OMX_PTR appData,
356                 OMX_U32 bytes
357                 );
358 
359 
360         OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp);
361 
362         OMX_ERRORTYPE component_init(OMX_STRING role);
363 
364         OMX_ERRORTYPE component_role_enum(
365                 OMX_HANDLETYPE hComp,
366                 OMX_U8 *role,
367                 OMX_U32 index
368                 );
369 
370         OMX_ERRORTYPE component_tunnel_request(
371                 OMX_HANDLETYPE hComp,
372                 OMX_U32 port,
373                 OMX_HANDLETYPE  peerComponent,
374                 OMX_U32 peerPort,
375                 OMX_TUNNELSETUPTYPE *tunnelSetup
376                 );
377 
378         OMX_ERRORTYPE empty_this_buffer(
379                 OMX_HANDLETYPE hComp,
380                 OMX_BUFFERHEADERTYPE *buffer
381                 );
382 
383 
384 
385         OMX_ERRORTYPE fill_this_buffer(
386                 OMX_HANDLETYPE hComp,
387                 OMX_BUFFERHEADERTYPE *buffer
388                 );
389 
390 
391         OMX_ERRORTYPE free_buffer(
392                 OMX_HANDLETYPE hComp,
393                 OMX_U32 port,
394                 OMX_BUFFERHEADERTYPE *buffer
395                 );
396 
397         OMX_ERRORTYPE get_component_version(
398                 OMX_HANDLETYPE hComp,
399                 OMX_STRING componentName,
400                 OMX_VERSIONTYPE *componentVersion,
401                 OMX_VERSIONTYPE *specVersion,
402                 OMX_UUIDTYPE *componentUUID
403                 );
404 
405         OMX_ERRORTYPE get_config(
406                 OMX_HANDLETYPE hComp,
407                 OMX_INDEXTYPE configIndex,
408                 OMX_PTR configData
409                 );
410 
411         OMX_ERRORTYPE get_extension_index(
412                 OMX_HANDLETYPE hComp,
413                 OMX_STRING paramName,
414                 OMX_INDEXTYPE *indexType
415                 );
416 
417         OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE hComp,
418                 OMX_INDEXTYPE  paramIndex,
419                 OMX_PTR        paramData);
420 
421         OMX_ERRORTYPE get_state(OMX_HANDLETYPE hComp,
422                 OMX_STATETYPE *state);
423 
424 
425 
426         OMX_ERRORTYPE send_command(OMX_HANDLETYPE  hComp,
427                 OMX_COMMANDTYPE cmd,
428                 OMX_U32         param1,
429                 OMX_PTR         cmdData);
430 
431 
432         OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE   hComp,
433                 OMX_CALLBACKTYPE *callbacks,
434                 OMX_PTR          appData);
435 
436         OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp,
437                 OMX_INDEXTYPE  configIndex,
438                 OMX_PTR        configData);
439 
440         OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp,
441                 OMX_INDEXTYPE  paramIndex,
442                 OMX_PTR        paramData);
443 
444         OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE      hComp,
445                 OMX_BUFFERHEADERTYPE **bufferHdr,
446                 OMX_U32              port,
447                 OMX_PTR              appData,
448                 OMX_U32              bytes,
449                 OMX_U8               *buffer);
450 
451         OMX_ERRORTYPE  use_input_heap_buffers(
452                 OMX_HANDLETYPE            hComp,
453                 OMX_BUFFERHEADERTYPE** bufferHdr,
454                 OMX_U32                   port,
455                 OMX_PTR                   appData,
456                 OMX_U32                   bytes,
457                 OMX_U8*                   buffer);
458 
459         OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE     hComp,
460                 OMX_BUFFERHEADERTYPE **bufferHdr,
461                 OMX_U32              port,
462                 OMX_PTR              appData,
463                 void *               eglImage);
464         void complete_pending_buffer_done_cbs();
465         struct video_driver_context drv_ctx;
466         int m_poll_efd;
467 #ifdef _MSM8974_
468         OMX_ERRORTYPE allocate_extradata();
469         void free_extradata();
470         int update_resolution(int width, int height, int stride, int scan_lines);
471         OMX_ERRORTYPE is_video_session_supported();
472 #endif
473         int  m_pipe_in;
474         int  m_pipe_out;
475         pthread_t msg_thread_id;
476         pthread_t async_thread_id;
477         bool is_component_secure();
478         void buf_ref_add(int nPortIndex);
479         void buf_ref_remove();
480         OMX_BUFFERHEADERTYPE* get_omx_output_buffer_header(int index);
481         OMX_ERRORTYPE set_dpb(bool is_split_mode, int dpb_color_format);
482         OMX_ERRORTYPE decide_dpb_buffer_mode(bool split_opb_dpb_with_same_color_fmt);
483         void request_perf_level(enum vidc_perf_level perf_level);
484         int dpb_bit_depth;
485         bool async_thread_force_stop;
486         volatile bool message_thread_stop;
487         struct extradata_info m_extradata_info;
488         int m_progressive;
489 
490         enum dither_type {
491             DITHER_DISABLE = 0,
492             DITHER_COLORSPACE_EXCEPTBT2020,
493             DITHER_ALL_COLORSPACE
494         };
495         enum dither_type m_dither_config;
496 
497         enum color_space_type {
498             BT2020 = 0,
499             EXCEPT_BT2020,
500             UNKNOWN
501         };
502         enum color_space_type m_color_space;
503 
504     private:
505         // Bit Positions
506         enum flags_bit_positions {
507             // Defer transition to IDLE
508             OMX_COMPONENT_IDLE_PENDING            =0x1,
509             // Defer transition to LOADING
510             OMX_COMPONENT_LOADING_PENDING         =0x2,
511             // First  Buffer Pending
512             OMX_COMPONENT_FIRST_BUFFER_PENDING    =0x3,
513             // Second Buffer Pending
514             OMX_COMPONENT_SECOND_BUFFER_PENDING   =0x4,
515             // Defer transition to Enable
516             OMX_COMPONENT_INPUT_ENABLE_PENDING    =0x5,
517             // Defer transition to Enable
518             OMX_COMPONENT_OUTPUT_ENABLE_PENDING   =0x6,
519             // Defer transition to Disable
520             OMX_COMPONENT_INPUT_DISABLE_PENDING   =0x7,
521             // Defer transition to Disable
522             OMX_COMPONENT_OUTPUT_DISABLE_PENDING  =0x8,
523             //defer flush notification
524             OMX_COMPONENT_OUTPUT_FLUSH_PENDING    =0x9,
525             OMX_COMPONENT_INPUT_FLUSH_PENDING    =0xA,
526             OMX_COMPONENT_PAUSE_PENDING          =0xB,
527             OMX_COMPONENT_EXECUTE_PENDING        =0xC,
528             OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING =0xD,
529             OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED=0xE,
530             OMX_COMPONENT_FLUSH_DEFERRED = 0xF
531         };
532 
533         // Deferred callback identifiers
534         enum {
535             //Event Callbacks from the vdec component thread context
536             OMX_COMPONENT_GENERATE_EVENT       = 0x1,
537             //Buffer Done callbacks from the vdec component thread context
538             OMX_COMPONENT_GENERATE_BUFFER_DONE = 0x2,
539             //Frame Done callbacks from the vdec component thread context
540             OMX_COMPONENT_GENERATE_FRAME_DONE  = 0x3,
541             //Buffer Done callbacks from the vdec component thread context
542             OMX_COMPONENT_GENERATE_FTB         = 0x4,
543             //Frame Done callbacks from the vdec component thread context
544             OMX_COMPONENT_GENERATE_ETB         = 0x5,
545             //Command
546             OMX_COMPONENT_GENERATE_COMMAND     = 0x6,
547             //Push-Pending Buffers
548             OMX_COMPONENT_PUSH_PENDING_BUFS    = 0x7,
549             // Empty Buffer Done callbacks
550             OMX_COMPONENT_GENERATE_EBD         = 0x8,
551             //Flush Event Callbacks from the vdec component thread context
552             OMX_COMPONENT_GENERATE_EVENT_FLUSH       = 0x9,
553             OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH = 0x0A,
554             OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH = 0x0B,
555             OMX_COMPONENT_GENERATE_FBD = 0xc,
556             OMX_COMPONENT_GENERATE_START_DONE = 0xD,
557             OMX_COMPONENT_GENERATE_PAUSE_DONE = 0xE,
558             OMX_COMPONENT_GENERATE_RESUME_DONE = 0xF,
559             OMX_COMPONENT_GENERATE_STOP_DONE = 0x10,
560             OMX_COMPONENT_GENERATE_HARDWARE_ERROR = 0x11,
561             OMX_COMPONENT_GENERATE_ETB_ARBITRARY = 0x12,
562             OMX_COMPONENT_GENERATE_PORT_RECONFIG = 0x13,
563             OMX_COMPONENT_GENERATE_EOS_DONE = 0x14,
564             OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG = 0x15,
565             OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED = 0x16,
566             OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING = 0x17,
567             OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD = 0x18,
568             OMX_COMPONENT_CLOSE_MSG = 0x19
569         };
570 
571         enum vc1_profile_type {
572             VC1_SP_MP_RCV = 1,
573             VC1_AP = 2
574         };
575 
576 #ifdef _MSM8974_
577         enum v4l2_ports {
578             CAPTURE_PORT,
579             OUTPUT_PORT,
580             MAX_PORT
581         };
582 #endif
583 
584         struct omx_event {
585             unsigned long param1;
586             unsigned long param2;
587             unsigned long id;
588         };
589 
590         struct omx_cmd_queue {
591             omx_event m_q[OMX_CORE_CONTROL_CMDQ_SIZE];
592             unsigned long m_read;
593             unsigned long m_write;
594             unsigned long m_size;
595 
596             omx_cmd_queue();
597             ~omx_cmd_queue();
598             bool insert_entry(unsigned long p1, unsigned long p2, unsigned long id);
599             bool pop_entry(unsigned long *p1,unsigned long *p2, unsigned long *id);
600             // get msgtype of the first ele from the queue
601             unsigned get_q_msg_type();
602 
603         };
604         struct v4l2_capability cap;
605 #ifdef _ANDROID_
606         struct ts_entry {
607             OMX_TICKS timestamp;
608             bool valid;
609         };
610 
611         struct ts_arr_list {
612             ts_entry m_ts_arr_list[MAX_NUM_INPUT_OUTPUT_BUFFERS];
613 
614             ts_arr_list();
615             ~ts_arr_list();
616 
617             bool insert_ts(OMX_TICKS ts);
618             bool pop_min_ts(OMX_TICKS &ts);
619             bool reset_ts_list();
620         };
621 #endif
622 
623         struct desc_buffer_hdr {
624             OMX_U8 *buf_addr;
625             OMX_U32 desc_data_size;
626         };
627         bool allocate_done(void);
628         bool allocate_input_done(void);
629         bool allocate_output_done(void);
630         bool allocate_output_extradata_done(void);
631 
632         OMX_ERRORTYPE free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
633         OMX_ERRORTYPE free_input_buffer(unsigned int bufferindex,
634                 OMX_BUFFERHEADERTYPE *pmem_bufferHdr);
635         OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
636         void free_output_buffer_header();
637         void free_input_buffer_header();
638         void free_output_extradata_buffer_header();
639 
640         OMX_ERRORTYPE allocate_input_heap_buffer(OMX_HANDLETYPE       hComp,
641                 OMX_BUFFERHEADERTYPE **bufferHdr,
642                 OMX_U32              port,
643                 OMX_PTR              appData,
644                 OMX_U32              bytes);
645 
646 
647         OMX_ERRORTYPE allocate_input_buffer(OMX_HANDLETYPE       hComp,
648                 OMX_BUFFERHEADERTYPE **bufferHdr,
649                 OMX_U32              port,
650                 OMX_PTR              appData,
651                 OMX_U32              bytes);
652 
653         OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE       hComp,
654                 OMX_BUFFERHEADERTYPE **bufferHdr,
655                 OMX_U32 port,OMX_PTR appData,
656                 OMX_U32              bytes);
657         OMX_ERRORTYPE use_output_buffer(OMX_HANDLETYPE hComp,
658                 OMX_BUFFERHEADERTYPE   **bufferHdr,
659                 OMX_U32                port,
660                 OMX_PTR                appData,
661                 OMX_U32                bytes,
662                 OMX_U8                 *buffer);
663         OMX_ERRORTYPE use_client_output_extradata_buffer(OMX_HANDLETYPE hComp,
664                 OMX_BUFFERHEADERTYPE   **bufferHdr,
665                 OMX_U32                port,
666                 OMX_PTR                appData,
667                 OMX_U32                bytes,
668                 OMX_U8                 *buffer);
669         OMX_ERRORTYPE get_supported_profile_level(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType);
670 
671         OMX_ERRORTYPE allocate_desc_buffer(OMX_U32 index);
672         OMX_ERRORTYPE allocate_output_headers();
673         OMX_ERRORTYPE allocate_client_output_extradata_headers();
674         bool execute_omx_flush(OMX_U32);
675         bool execute_output_flush();
676         bool execute_input_flush();
677         void notify_flush_done(void *ctxt);
678         OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE hComp,
679                 OMX_BUFFERHEADERTYPE * buffer);
680 
681         OMX_ERRORTYPE fill_buffer_done(OMX_HANDLETYPE hComp,
682                 OMX_BUFFERHEADERTYPE * buffer);
683         OMX_ERRORTYPE empty_this_buffer_proxy(OMX_HANDLETYPE       hComp,
684                 OMX_BUFFERHEADERTYPE *buffer);
685 
686         OMX_ERRORTYPE empty_this_buffer_proxy_arbitrary(OMX_HANDLETYPE hComp,
687                 OMX_BUFFERHEADERTYPE *buffer
688                 );
689 
690         OMX_ERRORTYPE push_input_buffer (OMX_HANDLETYPE hComp);
691         OMX_ERRORTYPE push_input_sc_codec (OMX_HANDLETYPE hComp);
692         OMX_ERRORTYPE push_input_h264 (OMX_HANDLETYPE hComp);
693         OMX_ERRORTYPE push_input_hevc (OMX_HANDLETYPE hComp);
694         OMX_ERRORTYPE push_input_vc1 (OMX_HANDLETYPE hComp);
695 
696         OMX_ERRORTYPE fill_this_buffer_proxy(OMX_HANDLETYPE       hComp,
697                 OMX_BUFFERHEADERTYPE *buffer);
698         bool release_done();
699 
700         bool release_output_done();
701         bool release_input_done();
702         bool release_output_extradata_done();
703         OMX_ERRORTYPE get_buffer_req(vdec_allocatorproperty *buffer_prop);
704         OMX_ERRORTYPE set_buffer_req(vdec_allocatorproperty *buffer_prop);
705         OMX_ERRORTYPE start_port_reconfig();
706         OMX_ERRORTYPE update_picture_resolution();
707         int stream_off(OMX_U32 port);
708         void adjust_timestamp(OMX_S64 &act_timestamp);
709         void set_frame_rate(OMX_S64 act_timestamp);
710         void handle_extradata_secure(OMX_BUFFERHEADERTYPE *p_buf_hdr);
711         void handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr);
712         void convert_color_space_info(OMX_U32 primaries, OMX_U32 range,
713             OMX_U32 transfer, OMX_U32 matrix, ColorSpace_t *color_space,
714             ColorAspects *aspects);
715         bool handle_color_space_info(void *data,
716                                      ColorSpace_t *color_space,
717                                      ColorMetaData* color_mdata,
718                                      bool& set_color_aspects_only);
719         void set_colorspace_in_handle(ColorSpace_t color, unsigned int buf_index);
720         void print_debug_color_aspects(ColorAspects *aspects, const char *prefix);
721         void print_debug_hdr_color_info(HDRStaticInfo *hdr_info, const char *prefix);
722         void print_debug_hdr_color_info_mdata(ColorMetaData* color_mdata);
723         bool handle_content_light_level_info(void* data, ContentLightLevel* light_level_mdata);
724         bool handle_mastering_display_color_info(void* data, MasteringDisplay* mastering_display_mdata);
725         void print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra);
726         void set_colormetadata_in_handle(ColorMetaData *color_mdata, unsigned int buf_index);
727         void prepare_color_aspects_metadata(OMX_U32 primaries, OMX_U32 range,
728                                             OMX_U32 transfer, OMX_U32 matrix,
729                                             ColorMetaData *color_mdata);
730 #ifdef _MSM8974_
731         void append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
732                 OMX_U32 interlaced_format_type);
733         OMX_ERRORTYPE enable_extradata(OMX_U64 requested_extradata, bool is_internal,
734                 bool enable = true);
735         void append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
736                 OMX_U32 num_conceal_mb,
737                 OMX_U32 recovery_sei_flag,
738                 OMX_U32 picture_type,
739                 OMX_U32 frame_rate,
740                 OMX_TICKS time_stamp,
741                 struct msm_vidc_panscan_window_payload *panscan_payload,
742                 struct vdec_aspectratioinfo *aspect_ratio_info);
743 #else
744         void append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
745                 OMX_U32 interlaced_format_type, OMX_U32 buf_index);
746         OMX_ERRORTYPE enable_extradata(OMX_U32 requested_extradata, bool enable = true);
747 #endif
748         void append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
749                 OMX_U32 num_conceal_mb,
750                 OMX_U32 recovery_sei_flag,
751                 OMX_U32 picture_type,
752                 OMX_S64 timestamp,
753                 OMX_U32 frame_rate,
754                 struct vdec_aspectratioinfo *aspect_ratio_info);
755         void fill_aspect_ratio_info(struct vdec_aspectratioinfo *aspect_ratio_info,
756                 OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info);
757         void append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra);
758         OMX_ERRORTYPE update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn);
759         void append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra);
760         void append_frame_dimension_extradata(OMX_OTHER_EXTRADATATYPE *extra);
761         void append_extn_extradata(OMX_OTHER_EXTRADATATYPE *extra, OMX_OTHER_EXTRADATATYPE *p_extn);
762         void append_user_extradata(OMX_OTHER_EXTRADATATYPE *extra, OMX_OTHER_EXTRADATATYPE *p_user);
763         void append_concealmb_extradata(OMX_OTHER_EXTRADATATYPE *extra,
764                 OMX_OTHER_EXTRADATATYPE *p_concealmb, OMX_U8 *conceal_mb_data);
765         void append_framepack_extradata(OMX_OTHER_EXTRADATATYPE *extra,
766                 struct msm_vidc_s3d_frame_packing_payload *s3d_frame_packing_payload);
767         void append_qp_extradata(OMX_OTHER_EXTRADATATYPE *extra,
768                 struct msm_vidc_frame_qp_payload *qp_payload);
769         void append_bitsinfo_extradata(OMX_OTHER_EXTRADATATYPE *extra,
770                 struct msm_vidc_frame_bits_info_payload *bits_payload);
771         void append_vqzip_extradata(OMX_OTHER_EXTRADATATYPE *extra,
772                 struct msm_vidc_vqzip_sei_payload *vqzip_payload);
773         void insert_demux_addr_offset(OMX_U32 address_offset);
774         void extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr);
775         OMX_ERRORTYPE handle_demux_data(OMX_BUFFERHEADERTYPE *buf_hdr);
776         OMX_U32 count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra);
777 
778         bool align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
779                 OMX_U32 alignment);
780 #ifdef USE_ION
781         int alloc_map_ion_memory(OMX_U32 buffer_size,
782                 OMX_U32 alignment, struct ion_allocation_data *alloc_data,
783                 struct ion_fd_data *fd_data,int flag);
784         void free_ion_memory(struct vdec_ion *buf_ion_info);
785 #endif
786 
787 
788         OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE  hComp,
789                 OMX_COMMANDTYPE cmd,
790                 OMX_U32         param1,
791                 OMX_PTR         cmdData);
792         bool post_event( unsigned long p1,
793                 unsigned long p2,
794                 unsigned long id
795                    );
clip2(int x)796         inline int clip2(int x) {
797             x = x -1;
798             x = x | x >> 1;
799             x = x | x >> 2;
800             x = x | x >> 4;
801             x = x | x >> 16;
802             x = x + 1;
803             return x;
804         }
805 
806 #ifdef MAX_RES_1080P
807         OMX_ERRORTYPE vdec_alloc_h264_mv();
808         void vdec_dealloc_h264_mv();
809         OMX_ERRORTYPE vdec_alloc_meta_buffers();
810         void vdec_dealloc_meta_buffers();
811 #endif
812 
omx_report_error()813         inline void omx_report_error () {
814             if (m_cb.EventHandler && !m_error_propogated && m_state != OMX_StateLoaded) {
815                 DEBUG_PRINT_ERROR("ERROR: Sending OMX_ErrorHardware to Client");
816                 m_error_propogated = true;
817                 m_cb.EventHandler(&m_cmp,m_app_data,
818                         OMX_EventError,OMX_ErrorHardware,0,NULL);
819             }
820         }
821 
omx_report_unsupported_setting()822         inline void omx_report_unsupported_setting () {
823             if (m_cb.EventHandler && !m_error_propogated && m_state != OMX_StateLoaded) {
824                 DEBUG_PRINT_ERROR(
825                         "ERROR: Sending OMX_ErrorUnsupportedSetting to Client");
826                 m_error_propogated = true;
827                 m_cb.EventHandler(&m_cmp, m_app_data,
828                         OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL);
829             }
830         }
omx_report_hw_overload()831         inline void omx_report_hw_overload () {
832             if (m_cb.EventHandler && !m_error_propogated && m_state != OMX_StateLoaded) {
833                 DEBUG_PRINT_ERROR(
834                         "ERROR: Sending OMX_ErrorInsufficientResources to Client");
835                 m_error_propogated = true;
836                 m_cb.EventHandler(&m_cmp, m_app_data,
837                         OMX_EventError, OMX_ErrorInsufficientResources, 0, NULL);
838             }
839         }
840 
841 #if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
842         OMX_ERRORTYPE use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data);
843 #endif
844 #if defined (_ANDROID_ICS_)
845         struct nativebuffer {
846             native_handle_t *nativehandle;
847             private_handle_t *privatehandle;
848             int inuse;
849         };
850         nativebuffer native_buffer[MAX_NUM_INPUT_OUTPUT_BUFFERS];
851 #endif
852 
853         //*************************************************************
854         //*******************MEMBER VARIABLES *************************
855         //*************************************************************
856         pthread_mutex_t       m_lock;
857         pthread_mutex_t       c_lock;
858         pthread_mutex_t       buf_lock;
859         //sem to handle the minimum procesing of commands
860         sem_t                 m_cmd_lock;
861         sem_t                 m_safe_flush;
862         bool              m_error_propogated;
863         // compression format
864         OMX_VIDEO_CODINGTYPE eCompressionFormat;
865         // OMX State
866         OMX_STATETYPE m_state;
867         // Application data
868         OMX_PTR m_app_data;
869         // Application callbacks
870         OMX_CALLBACKTYPE m_cb;
871         OMX_PRIORITYMGMTTYPE m_priority_mgm ;
872         OMX_PARAM_BUFFERSUPPLIERTYPE m_buffer_supplier;
873         // fill this buffer queue
874         omx_cmd_queue         m_ftb_q;
875         // Command Q for rest of the events
876         omx_cmd_queue         m_cmd_q;
877         omx_cmd_queue         m_etb_q;
878         // Input memory pointer
879         OMX_BUFFERHEADERTYPE  *m_inp_mem_ptr;
880         // Output memory pointer
881         OMX_BUFFERHEADERTYPE  *m_out_mem_ptr;
882         // Client extradata memory pointer
883         OMX_BUFFERHEADERTYPE  *m_client_output_extradata_mem_ptr;
884         // number of input bitstream error frame count
885         unsigned int m_inp_err_count;
886 #ifdef _ANDROID_
887         // Timestamp list
888         ts_arr_list           m_timestamp_list;
889 #endif
890 
891         bool input_flush_progress;
892         bool output_flush_progress;
893         bool input_use_buffer;
894         bool output_use_buffer;
895         bool ouput_egl_buffers;
896         OMX_BOOL m_use_output_pmem;
897         OMX_BOOL m_out_mem_region_smi;
898         OMX_BOOL m_out_pvt_entry_pmem;
899 
900         int pending_input_buffers;
901         int pending_output_buffers;
902         // bitmask array size for output side
903         uint64_t m_out_bm_count;
904         // bitmask array size for input side
905         uint64_t m_inp_bm_count;
906         // bitmask array size for extradata
907         uint64_t m_out_extradata_bm_count;
908         //Input port Populated
909         OMX_BOOL m_inp_bPopulated;
910         //Output port Populated
911         OMX_BOOL m_out_bPopulated;
912         // encapsulate the waiting states.
913         uint64_t m_flags;
914 
915         // store I/P PORT state
916         OMX_BOOL m_inp_bEnabled;
917         // store O/P PORT state
918         OMX_BOOL m_out_bEnabled;
919         OMX_U32 m_in_alloc_cnt;
920         OMX_U8                m_cRole[OMX_MAX_STRINGNAME_SIZE];
921         // Platform specific details
922         OMX_QCOM_PLATFORM_PRIVATE_LIST      *m_platform_list;
923         OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *m_platform_entry;
924         OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *m_pmem_info;
925         // SPS+PPS sent as part of set_config
926         OMX_VENDOR_EXTRADATATYPE            m_vendor_config;
927 
928         /*Variables for arbitrary Byte parsing support*/
929         frame_parse m_frame_parser;
930         h264_stream_parser *h264_parser;
931         MP4_Utils mp4_headerparser;
932         HEVC_Utils m_hevc_utils;
933 
934         omx_cmd_queue m_input_pending_q;
935         omx_cmd_queue m_input_free_q;
936         bool arbitrary_bytes;
937         OMX_BUFFERHEADERTYPE  h264_scratch;
938         OMX_BUFFERHEADERTYPE  *psource_frame;
939         OMX_BUFFERHEADERTYPE  *pdest_frame;
940         OMX_BUFFERHEADERTYPE  *m_inp_heap_ptr;
941         OMX_BUFFERHEADERTYPE  **m_phdr_pmem_ptr;
942         unsigned int m_heap_inp_bm_count;
943         codec_type codec_type_parse;
944         bool first_frame_meta;
945         unsigned frame_count;
946         unsigned nal_count;
947         unsigned nal_length;
948         bool look_ahead_nal;
949         int first_frame;
950         unsigned char *first_buffer;
951         int first_frame_size;
952         unsigned char m_hwdevice_name[80];
953         FILE *m_device_file_ptr;
954         enum vc1_profile_type m_vc1_profile;
955         OMX_S64 h264_last_au_ts;
956         OMX_U32 h264_last_au_flags;
957         OMX_U32 m_demux_offsets[8192];
958         OMX_U32 m_demux_entries;
959         OMX_U32 m_disp_hor_size;
960         OMX_U32 m_disp_vert_size;
961         OMX_S64 prev_ts;
962         OMX_S64 prev_ts_actual;
963         bool rst_prev_ts;
964         OMX_U32 frm_int;
965         OMX_U32 m_fps_received;
966         float   m_fps_prev;
967         bool m_drc_enable;
968 
969         struct vdec_allocatorproperty op_buf_rcnfg;
970         bool in_reconfig;
971         OMX_NATIVE_WINDOWTYPE m_display_id;
972         OMX_U32 client_extradata;
973 #ifdef _ANDROID_
974         bool m_debug_timestamp;
975         bool perf_flag;
976         OMX_U32 proc_frms, latency;
977         perf_metrics fps_metrics;
978         perf_metrics dec_time;
979         bool m_reject_avc_1080p_mp;
980         bool m_enable_android_native_buffers;
981         bool m_use_android_native_buffers;
982         bool m_debug_extradata;
983         bool m_debug_concealedmb;
984         bool m_disable_dynamic_buf_mode;
985         OMX_U32 m_conceal_color;
986 #endif
987 
988 
989         struct h264_mv_buffer {
990             unsigned char* buffer;
991             int size;
992             int count;
993             int pmem_fd;
994             int offset;
995         };
996         h264_mv_buffer h264_mv_buff;
997 
998         struct meta_buffer {
999             unsigned char* buffer;
1000             int size;
1001             int count;
1002             int pmem_fd;
1003             int pmem_fd_iommu;
1004             int offset;
1005         };
1006         meta_buffer meta_buff;
1007         extra_data_handler extra_data_handle;
1008         OMX_PARAM_PORTDEFINITIONTYPE m_port_def;
1009         OMX_QCOM_FRAME_PACK_ARRANGEMENT m_frame_pack_arrangement;
1010         omx_time_stamp_reorder time_stamp_dts;
1011         desc_buffer_hdr *m_desc_buffer_ptr;
1012         bool secure_mode;
1013         bool allocate_native_handle;
1014         bool external_meta_buffer;
1015         bool external_meta_buffer_iommu;
1016         OMX_QCOM_EXTRADATA_FRAMEINFO *m_extradata;
1017         OMX_OTHER_EXTRADATATYPE *m_other_extradata;
1018         bool codec_config_flag;
1019 #ifdef _MSM8974_
1020         int capture_capability;
1021         int output_capability;
1022         bool streaming[MAX_PORT];
1023         OMX_FRAMESIZETYPE framesize;
1024         OMX_CONFIG_RECTTYPE rectangle;
1025         OMX_U32 prev_n_filled_len;
1026         bool is_down_scalar_enabled;
1027         bool m_force_down_scalar;
1028 #endif
1029         struct custom_buffersize {
1030             OMX_U32 input_buffersize;
1031         } m_custom_buffersize;
1032         bool m_power_hinted;
1033         bool is_q6_platform;
1034         OMX_ERRORTYPE power_module_register();
1035         OMX_ERRORTYPE power_module_deregister();
1036         bool msg_thread_created;
1037         bool async_thread_created;
1038 
1039         OMX_VIDEO_PARAM_PROFILELEVELTYPE m_profile_lvl;
1040         OMX_U32 m_profile;
1041 
1042         //variables to handle dynamic buffer mode
1043         bool dynamic_buf_mode;
1044         struct dynamic_buf_list *out_dynamic_list;
1045         OMX_U32 m_reconfig_width;
1046         OMX_U32 m_reconfig_height;
1047         bool m_smoothstreaming_mode;
1048         bool m_decode_order_mode;
1049 
1050         bool m_input_pass_buffer_fd;
1051         DescribeColorAspectsParams m_client_color_space;
1052         DescribeColorAspectsParams m_internal_color_space;
1053 
1054         // HDRStaticInfo defined in HardwareAPI.h
1055         DescribeHDRStaticInfoParams m_client_hdr_info;
1056         DescribeHDRStaticInfoParams m_internal_hdr_info;
1057         bool m_change_client_hdr_info;
1058         pthread_mutex_t m_hdr_info_client_lock;
1059         ColorMetaData m_color_mdata;
1060 
1061         OMX_U32 operating_frame_rate;
1062         uint8_t m_need_turbo;
1063 
1064         OMX_U32 m_smoothstreaming_width;
1065         OMX_U32 m_smoothstreaming_height;
1066         OMX_ERRORTYPE enable_smoothstreaming();
1067         OMX_ERRORTYPE enable_adaptive_playback(unsigned long width, unsigned long height);
1068         bool is_thulium_v1;
1069         bool m_disable_ubwc_mode;
1070         bool m_disable_split_mode;
1071         bool m_enable_downscalar;
1072         OMX_U32 m_downscalar_width;
1073         OMX_U32 m_downscalar_height;
1074         int decide_downscalar();
1075         int enable_downscalar();
1076         int disable_downscalar();
1077 
1078         unsigned int m_fill_output_msg;
1079         bool client_set_fps;
1080         unsigned int stereo_output_mode;
1081         class allocate_color_convert_buf
1082         {
1083             public:
1084                 allocate_color_convert_buf();
1085                 ~allocate_color_convert_buf();
1086                 void set_vdec_client(void *);
1087                 void update_client();
1088                 bool set_color_format(OMX_COLOR_FORMATTYPE dest_color_format);
1089                 bool get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format);
1090                 bool update_buffer_req();
1091                 bool get_buffer_req(unsigned int &buffer_size);
1092                 OMX_ERRORTYPE set_buffer_req(OMX_U32 buffer_size, OMX_U32 actual_count);
1093                 OMX_BUFFERHEADERTYPE* get_il_buf_hdr();
1094                 OMX_BUFFERHEADERTYPE* get_il_buf_hdr(OMX_BUFFERHEADERTYPE *input_hdr);
1095                 OMX_BUFFERHEADERTYPE* get_dr_buf_hdr(OMX_BUFFERHEADERTYPE *input_hdr);
1096                 OMX_BUFFERHEADERTYPE* convert(OMX_BUFFERHEADERTYPE *header);
1097                 OMX_BUFFERHEADERTYPE* queue_buffer(OMX_BUFFERHEADERTYPE *header);
1098                 OMX_ERRORTYPE allocate_buffers_color_convert(OMX_HANDLETYPE hComp,
1099                         OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,
1100                         OMX_U32 bytes);
1101                 OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
is_color_conversion_enabled()1102                 bool is_color_conversion_enabled() {return enabled;}
1103             private:
1104 #define MAX_COUNT MAX_NUM_INPUT_OUTPUT_BUFFERS
1105                 omx_vdec *omx;
1106                 bool enabled;
1107                 OMX_COLOR_FORMATTYPE ColorFormat;
1108                 void init_members();
1109                 bool color_convert_mode;
1110                 ColorConvertFormat dest_format;
1111                 class omx_c2d_conv c2d;
1112                 unsigned int allocated_count;
1113                 unsigned int buffer_size_req;
1114                 unsigned int buffer_alignment_req;
1115                 OMX_U32 m_c2d_width;
1116                 OMX_U32 m_c2d_height;
1117                 OMX_QCOM_PLATFORM_PRIVATE_LIST      m_platform_list_client[MAX_COUNT];
1118                 OMX_QCOM_PLATFORM_PRIVATE_ENTRY     m_platform_entry_client[MAX_COUNT];
1119                 OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO m_pmem_info_client[MAX_COUNT];
1120                 OMX_BUFFERHEADERTYPE  m_out_mem_ptr_client[MAX_COUNT];
1121 #ifdef USE_ION
1122                 struct vdec_ion op_buf_ion_info[MAX_COUNT];
1123 #endif
1124                 unsigned char *pmem_baseaddress[MAX_COUNT];
1125                 int pmem_fd[MAX_COUNT];
1126                 OMX_ERRORTYPE cache_ops(unsigned int index, unsigned int cmd);
cache_clean_buffer(unsigned int index)1127                 inline OMX_ERRORTYPE cache_clean_buffer(unsigned int index) {
1128                     return cache_ops(index, ION_IOC_CLEAN_CACHES);
1129                 }
cache_clean_invalidate_buffer(unsigned int index)1130                 OMX_ERRORTYPE cache_clean_invalidate_buffer(unsigned int index) {
1131                     return cache_ops(index, ION_IOC_CLEAN_INV_CACHES);
1132                 }
1133         };
1134 #if  defined (_MSM8960_) || defined (_MSM8974_)
1135         allocate_color_convert_buf client_buffers;
1136 #endif
1137         struct video_decoder_capability m_decoder_capability;
1138         struct debug_cap m_debug;
1139         int log_input_buffers(const char *, int);
1140         int log_output_buffers(OMX_BUFFERHEADERTYPE *);
1141 #ifdef _MSM8974_
1142         void send_codec_config();
1143 #endif
1144         OMX_TICKS m_last_rendered_TS;
1145         volatile int32_t m_queued_codec_config_count;
1146         OMX_U32 current_perf_level;
1147         bool secure_scaling_to_non_secure_opb;
1148 	bool m_force_compressed_for_dpb;
1149         bool m_is_display_session;
1150         class perf_lock {
1151             private:
1152                 pthread_mutex_t mlock;
1153 
1154             public:
perf_lock()1155                 perf_lock() {
1156                     pthread_mutex_init(&mlock, NULL);
1157                 }
1158 
~perf_lock()1159                 ~perf_lock() {
1160                     pthread_mutex_destroy(&mlock);
1161                 }
1162 
lock()1163                 void lock() {
1164                     pthread_mutex_lock(&mlock);
1165                 }
1166 
unlock()1167                 void unlock() {
1168                     pthread_mutex_unlock(&mlock);
1169                 }
1170         };
1171 
1172         class perf_control {
1173             // 2 cores will be requested if framerate is beyond 45 fps
1174             static const int MIN_FRAME_DURATION_FOR_PERF_REQUEST_US = (1e6 / 45);
1175             typedef int (*perf_lock_acquire_t)(int, int, int*, int);
1176             typedef int (*perf_lock_release_t)(int);
1177 
1178             private:
1179                 void *m_perf_lib;
1180                 int m_perf_handle;
1181                 perf_lock_acquire_t m_perf_lock_acquire;
1182                 perf_lock_release_t m_perf_lock_release;
1183                 bool load_lib();
1184                 struct mpctl_stats {
1185                   int vid_inst_count;
1186                   bool vid_acquired;
1187                   int vid_disp_handle;
1188                 };
1189                 static struct mpctl_stats mpctl_obj;
1190                 static perf_lock m_perf_lock;
1191 
1192             public:
1193                 perf_control();
1194                 ~perf_control();
1195                 void request_cores(int frame_duration_us);
1196                 void send_hint_to_mpctl(bool state);
1197         };
1198         perf_control m_perf_control;
1199 
getPreferredColorFormatNonSurfaceMode(OMX_U32 index)1200         static OMX_COLOR_FORMATTYPE getPreferredColorFormatNonSurfaceMode(OMX_U32 index) {
1201             //On Android, we default to standard YUV formats for non-surface use-cases
1202             //where apps prefer known color formats.
1203             OMX_COLOR_FORMATTYPE formatsNonSurfaceMode[] = {
1204                 [0] = OMX_COLOR_FormatYUV420SemiPlanar,
1205                 [1] = OMX_COLOR_FormatYUV420Planar,
1206                 [2] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m,
1207                 [3] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView,
1208                 [4] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed,
1209             };
1210             return (index < sizeof(formatsNonSurfaceMode) / sizeof(OMX_COLOR_FORMATTYPE)) ?
1211                 formatsNonSurfaceMode[index] : OMX_COLOR_FormatMax;
1212         }
1213 
getPreferredColorFormatDefaultMode(OMX_U32 index)1214         OMX_COLOR_FORMATTYPE getPreferredColorFormatDefaultMode(OMX_U32 index) {
1215             //for surface mode (normal playback), advertise native/accelerated formats first
1216             OMX_COLOR_FORMATTYPE format = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m;
1217 
1218             if (!m_disable_ubwc_mode) {
1219                 OMX_COLOR_FORMATTYPE formatsDefault[] = {
1220                     [0] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mCompressed,
1221                     [1] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m,
1222                     [2] = OMX_COLOR_FormatYUV420SemiPlanar,
1223                     [3] = OMX_COLOR_FormatYUV420Planar,
1224                     [4] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView,
1225                 };
1226                 format = (index < sizeof(formatsDefault) / sizeof(OMX_COLOR_FORMATTYPE)) ?
1227                     formatsDefault[index] : OMX_COLOR_FormatMax;
1228             } else {
1229                 OMX_COLOR_FORMATTYPE formatsDefault[] = {
1230                     [0] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m,
1231                     [1] = OMX_COLOR_FormatYUV420SemiPlanar,
1232                     [2] = OMX_COLOR_FormatYUV420Planar,
1233                     [3] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView,
1234                 };
1235                 format = (index < sizeof(formatsDefault) / sizeof(OMX_COLOR_FORMATTYPE)) ?
1236                     formatsDefault[index] : OMX_COLOR_FormatMax;
1237             }
1238             return format;
1239         }
1240 
1241         static OMX_ERRORTYPE describeColorFormat(OMX_PTR params);
1242         void prefetchNewBuffers();
1243 
1244         class client_extradata_info {
1245             private:
1246                 OMX_U32 size; // size of extradata of each frame
1247                 OMX_U32 buffer_count;
1248                 OMX_BOOL enable;
1249 
1250             public:
client_extradata_info()1251                 client_extradata_info() {
1252                     size = VENUS_EXTRADATA_SIZE(4096, 2160);;
1253                     buffer_count = 0;
1254                     enable = OMX_FALSE;
1255                 }
1256 
~client_extradata_info()1257                 ~client_extradata_info() {
1258                 }
1259 
set_extradata_info(OMX_U32 size,OMX_U32 buffer_count)1260                 bool set_extradata_info(OMX_U32 size, OMX_U32 buffer_count) {
1261                     this->size = size;
1262                     this->buffer_count = buffer_count;
1263                     return true;
1264                 }
enable_client_extradata(OMX_BOOL enable)1265                 void enable_client_extradata(OMX_BOOL enable) {
1266                     this->enable = enable;
1267                 }
is_client_extradata_enabled()1268                 bool is_client_extradata_enabled() {
1269                     return enable;
1270                 }
getSize()1271                 OMX_U32 getSize() const {
1272                     return size;
1273                 }
getBufferCount()1274                 OMX_U32 getBufferCount() const {
1275                     return buffer_count;
1276                 }
1277         };
1278         client_extradata_info m_client_out_extradata_info;
1279 
1280         OMX_ERRORTYPE get_vendor_extension_config(
1281                 OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE *ext);
1282         OMX_ERRORTYPE set_vendor_extension_config(
1283                 OMX_CONFIG_ANDROID_VENDOR_EXTENSIONTYPE *ext);
1284 
1285         void init_vendor_extensions (VendorExtensionStore&);
1286 
1287         // list of extensions is not mutable after initialization
1288         const VendorExtensionStore mVendorExtensionStore;
1289         bool m_buffer_error;
1290 };
1291 
1292 #ifdef _MSM8974_
1293 enum instance_state {
1294     MSM_VIDC_CORE_UNINIT_DONE = 0x0001,
1295     MSM_VIDC_CORE_INIT,
1296     MSM_VIDC_CORE_INIT_DONE,
1297     MSM_VIDC_OPEN,
1298     MSM_VIDC_OPEN_DONE,
1299     MSM_VIDC_LOAD_RESOURCES,
1300     MSM_VIDC_LOAD_RESOURCES_DONE,
1301     MSM_VIDC_START,
1302     MSM_VIDC_START_DONE,
1303     MSM_VIDC_STOP,
1304     MSM_VIDC_STOP_DONE,
1305     MSM_VIDC_RELEASE_RESOURCES,
1306     MSM_VIDC_RELEASE_RESOURCES_DONE,
1307     MSM_VIDC_CLOSE,
1308     MSM_VIDC_CLOSE_DONE,
1309     MSM_VIDC_CORE_UNINIT,
1310 };
1311 
1312 enum vidc_resposes_id {
1313     MSM_VIDC_DECODER_FLUSH_DONE = 0x11,
1314     MSM_VIDC_DECODER_EVENT_CHANGE,
1315 };
1316 
1317 #endif // _MSM8974_
1318 
1319 #endif // __OMX_VDEC_H__
1320