blob: 6637021e0c5ebef1dc7e4a97ec597b73cadcd528 [file] [log] [blame]
Shalaj Jain273b3e02012-06-22 19:08:03 -07001/*--------------------------------------------------------------------------
vivek mehtaa75c69f2014-01-10 21:50:37 -08002Copyright (c) 2010 - 2014, The Linux Foundation. All rights reserved.
Shalaj Jain273b3e02012-06-22 19:08:03 -07003
Anurag Singh77e5a1c2012-10-03 11:17:08 -07004 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions
6 are met:
7
Shalaj Jain273b3e02012-06-22 19:08:03 -07008 * Redistributions of source code must retain the above copyright
Anurag Singh77e5a1c2012-10-03 11:17:08 -07009 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.
Shalaj Jain273b3e02012-06-22 19:08:03 -070017
Anurag Singh77e5a1c2012-10-03 11:17:08 -070018THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
19WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
20MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
21ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
22BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
25BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
27OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
28IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Shalaj Jain273b3e02012-06-22 19:08:03 -070029--------------------------------------------------------------------------*/
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>
Deva Ramasubramanian1fd93812014-03-26 15:17:15 -070050#include <cutils/atomic.h>
Shalaj Jain273b3e02012-06-22 19:08:03 -070051
52static ptrdiff_t x;
53
54#ifdef _ANDROID_
David Ng1d9befe2012-07-18 15:31:08 -070055#ifdef MAX_RES_720P
56#define LOG_TAG "OMX-VDEC-720P"
57#elif MAX_RES_1080P
58#define LOG_TAG "OMX-VDEC-1080P"
59#else
60#define LOG_TAG "OMX-VDEC"
61#endif
62
Shalaj Jain273b3e02012-06-22 19:08:03 -070063#ifdef USE_ION
Arun Menona7881862012-09-11 14:24:16 -070064#include <linux/msm_ion.h>
Shalaj Jain273b3e02012-06-22 19:08:03 -070065//#include <binder/MemoryHeapIon.h>
66//#else
67#endif
68#include <binder/MemoryHeapBase.h>
69#include <ui/ANativeObjectBase.h>
Arun Menon906de572013-06-18 17:01:40 -070070extern "C" {
David Ng1d9befe2012-07-18 15:31:08 -070071#include <utils/Log.h>
Shalaj Jain273b3e02012-06-22 19:08:03 -070072}
73#include <linux/videodev2.h>
74#include <poll.h>
75#define TIMEOUT 5000
Shalaj Jain273b3e02012-06-22 19:08:03 -070076#endif // _ANDROID_
77
78#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
79#include <media/hardware/HardwareAPI.h>
80#endif
81
82#include <unistd.h>
83
84#if defined (_ANDROID_ICS_)
85#include <gralloc_priv.h>
86#endif
87
88#include <pthread.h>
89#ifndef PC_DEBUG
90#include <semaphore.h>
91#endif
92#include "OMX_Core.h"
93#include "OMX_QCOMExtns.h"
Praveen Chavan898df262015-04-20 18:52:19 -070094#include "OMX_IndexExt.h"
Shalaj Jain273b3e02012-06-22 19:08:03 -070095#include "qc_omx_component.h"
96#include <linux/msm_vidc_dec.h>
Praneeth Paladugu48a9a8a2012-12-06 12:12:19 -080097#include <media/msm_vidc.h>
Shalaj Jain273b3e02012-06-22 19:08:03 -070098#include "frameparser.h"
99#ifdef MAX_RES_1080P
100#include "mp4_utils.h"
101#endif
102#include <linux/android_pmem.h>
103#include "extra_data_handler.h"
104#include "ts_parser.h"
Gopikrishnaiah Anand5a99cfb2013-01-08 20:28:10 +0530105#include "vidc_color_converter.h"
Jayasena Sangaraboinac4dfc282013-08-08 12:41:39 -0700106#include "vidc_debug.h"
Jayasena Sangaraboina51230642013-08-21 18:02:13 -0700107#ifdef _ANDROID_
108#include <cutils/properties.h>
109#else
110#define PROPERTY_VALUE_MAX 92
111#endif
Shalaj Jain273b3e02012-06-22 19:08:03 -0700112extern "C" {
Arun Menon906de572013-06-18 17:01:40 -0700113 OMX_API void * get_omx_component_factory_fn(void);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700114}
115
116#ifdef _ANDROID_
Arun Menon906de572013-06-18 17:01:40 -0700117using namespace android;
Shalaj Jain273b3e02012-06-22 19:08:03 -0700118#ifdef USE_ION
Arun Menon906de572013-06-18 17:01:40 -0700119class VideoHeap : public MemoryHeapBase
120{
Shalaj Jain273b3e02012-06-22 19:08:03 -0700121 public:
Mitchel Humpherys2294c232013-12-10 12:14:04 -0800122 VideoHeap(int devicefd, size_t size, void* base,ion_user_handle_t handle,int mapfd);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700123 virtual ~VideoHeap() {}
124 private:
Arun Menon906de572013-06-18 17:01:40 -0700125 int m_ion_device_fd;
Mitchel Humpherys2294c232013-12-10 12:14:04 -0800126 ion_user_handle_t m_ion_handle;
Arun Menon906de572013-06-18 17:01:40 -0700127};
Gopikrishnaiah Anand5a99cfb2013-01-08 20:28:10 +0530128#else
Arun Menon906de572013-06-18 17:01:40 -0700129// local pmem heap object
130class VideoHeap : public MemoryHeapBase
131{
Shalaj Jain273b3e02012-06-22 19:08:03 -0700132 public:
133 VideoHeap(int fd, size_t size, void* base);
134 virtual ~VideoHeap() {}
Arun Menon906de572013-06-18 17:01:40 -0700135};
Shalaj Jain273b3e02012-06-22 19:08:03 -0700136#endif
137#endif // _ANDROID_
138//////////////////////////////////////////////////////////////////////////////
139// Module specific globals
140//////////////////////////////////////////////////////////////////////////////
141#define OMX_SPEC_VERSION 0x00000101
142
143
144//////////////////////////////////////////////////////////////////////////////
145// Macros
146//////////////////////////////////////////////////////////////////////////////
147#define PrintFrameHdr(bufHdr) DEBUG_PRINT("bufHdr %x buf %x size %d TS %d\n",\
Arun Menon906de572013-06-18 17:01:40 -0700148 (unsigned) bufHdr,\
149 (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->pBuffer,\
150 (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nFilledLen,\
151 (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nTimeStamp)
Shalaj Jain273b3e02012-06-22 19:08:03 -0700152
153// BitMask Management logic
Deva Ramasubramanianeb819322014-07-17 14:23:35 -0700154#define BITS_PER_INDEX 64
155#define BITMASK_SIZE(mIndex) (((mIndex) + BITS_PER_INDEX - 1)/BITS_PER_INDEX)
156#define BITMASK_OFFSET(mIndex) ((mIndex)/BITS_PER_INDEX)
157#define BITMASK_FLAG(mIndex) ((uint64_t)1 << ((mIndex) % BITS_PER_INDEX))
Shalaj Jain273b3e02012-06-22 19:08:03 -0700158#define BITMASK_CLEAR(mArray,mIndex) (mArray)[BITMASK_OFFSET(mIndex)] \
Arun Menon906de572013-06-18 17:01:40 -0700159 &= ~(BITMASK_FLAG(mIndex))
Shalaj Jain273b3e02012-06-22 19:08:03 -0700160#define BITMASK_SET(mArray,mIndex) (mArray)[BITMASK_OFFSET(mIndex)] \
Arun Menon906de572013-06-18 17:01:40 -0700161 |= BITMASK_FLAG(mIndex)
Shalaj Jain273b3e02012-06-22 19:08:03 -0700162#define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \
163 & BITMASK_FLAG(mIndex))
164#define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
Arun Menon906de572013-06-18 17:01:40 -0700165 & BITMASK_FLAG(mIndex)) == 0x0)
Shalaj Jain273b3e02012-06-22 19:08:03 -0700166#define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \
167 & BITMASK_FLAG(mIndex))
168#define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
Arun Menon906de572013-06-18 17:01:40 -0700169 & BITMASK_FLAG(mIndex)) == 0x0)
Shalaj Jain273b3e02012-06-22 19:08:03 -0700170
171#define OMX_CORE_CONTROL_CMDQ_SIZE 100
172#define OMX_CORE_QCIF_HEIGHT 144
173#define OMX_CORE_QCIF_WIDTH 176
174#define OMX_CORE_VGA_HEIGHT 480
175#define OMX_CORE_VGA_WIDTH 640
176#define OMX_CORE_WVGA_HEIGHT 480
177#define OMX_CORE_WVGA_WIDTH 800
178
179#define DESC_BUFFER_SIZE (8192 * 16)
180
181#ifdef _ANDROID_
Praveen Chavan88256fe2016-04-11 17:32:45 -0700182#define MAX_NUM_INPUT_OUTPUT_BUFFERS 64
Shalaj Jain273b3e02012-06-22 19:08:03 -0700183#endif
184
185#define OMX_FRAMEINFO_EXTRADATA 0x00010000
186#define OMX_INTERLACE_EXTRADATA 0x00020000
187#define OMX_TIMEINFO_EXTRADATA 0x00040000
188#define OMX_PORTDEF_EXTRADATA 0x00080000
Shobhit Pandeyfe6c3da2012-08-01 14:27:11 +0530189#define OMX_EXTNUSER_EXTRADATA 0x00100000
Maheshwar Ajjad2df2182013-10-24 19:20:34 +0530190#define OMX_FRAMEPACK_EXTRADATA 0x00400000
Jorge Solano Altamiranob10850d2014-01-08 11:17:58 -0800191#define OMX_QP_EXTRADATA 0x00800000
Jorge Solano Altamirano54338452014-01-08 11:04:57 -0800192#define OMX_BITSINFO_EXTRADATA 0x01000000
Shalaj Jain273b3e02012-06-22 19:08:03 -0700193#define DRIVER_EXTRADATA_MASK 0x0000FFFF
194
195#define OMX_INTERLACE_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
Arun Menon906de572013-06-18 17:01:40 -0700196 sizeof(OMX_STREAMINTERLACEFORMAT) + 3)&(~3))
Shalaj Jain273b3e02012-06-22 19:08:03 -0700197#define OMX_FRAMEINFO_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
Arun Menon906de572013-06-18 17:01:40 -0700198 sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO) + 3)&(~3))
Shalaj Jain273b3e02012-06-22 19:08:03 -0700199#define OMX_PORTDEF_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
Arun Menon906de572013-06-18 17:01:40 -0700200 sizeof(OMX_PARAM_PORTDEFINITIONTYPE) + 3)&(~3))
Maheshwar Ajjad2df2182013-10-24 19:20:34 +0530201#define OMX_FRAMEPACK_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
202 sizeof(OMX_QCOM_FRAME_PACK_ARRANGEMENT) + 3)&(~3))
Jorge Solano Altamiranob10850d2014-01-08 11:17:58 -0800203#define OMX_QP_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
204 sizeof(OMX_QCOM_EXTRADATA_QP) + 3)&(~3))
Jorge Solano Altamirano54338452014-01-08 11:04:57 -0800205#define OMX_BITSINFO_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
206 sizeof(OMX_QCOM_EXTRADATA_BITS_INFO) + 3)&(~3))
Jorge Solano Altamirano1ae09be2014-01-16 12:21:52 -0800207#define OMX_USERDATA_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
Deva Ramasubramanian2ebfed32014-04-24 13:34:24 -0700208 + 3)&(~3))
Shalaj Jain273b3e02012-06-22 19:08:03 -0700209
210// Define next macro with required values to enable default extradata,
211// VDEC_EXTRADATA_MB_ERROR_MAP
212// OMX_INTERLACE_EXTRADATA
213// OMX_FRAMEINFO_EXTRADATA
214// OMX_TIMEINFO_EXTRADATA
215
216//#define DEFAULT_EXTRADATA (OMX_FRAMEINFO_EXTRADATA|OMX_INTERLACE_EXTRADATA)
217
Arun Menon906de572013-06-18 17:01:40 -0700218enum port_indexes {
Shalaj Jain273b3e02012-06-22 19:08:03 -0700219 OMX_CORE_INPUT_PORT_INDEX =0,
220 OMX_CORE_OUTPUT_PORT_INDEX =1
221};
222#ifdef USE_ION
Arun Menon906de572013-06-18 17:01:40 -0700223struct vdec_ion {
Shalaj Jain273b3e02012-06-22 19:08:03 -0700224 int ion_device_fd;
225 struct ion_fd_data fd_ion_data;
226 struct ion_allocation_data ion_alloc_data;
227};
228#endif
229
Vinay Kalia0e75e9a2012-09-27 15:41:53 -0700230#ifdef _MSM8974_
231struct extradata_buffer_info {
Arun Menon906de572013-06-18 17:01:40 -0700232 int buffer_size;
233 char* uaddr;
234 int count;
235 int size;
Vinay Kalia0e75e9a2012-09-27 15:41:53 -0700236#ifdef USE_ION
Arun Menon906de572013-06-18 17:01:40 -0700237 struct vdec_ion ion;
Vinay Kalia0e75e9a2012-09-27 15:41:53 -0700238#endif
239};
240#endif
241
Arun Menon906de572013-06-18 17:01:40 -0700242struct video_driver_context {
Shalaj Jain273b3e02012-06-22 19:08:03 -0700243 int video_driver_fd;
244 enum vdec_codec decoder_format;
245 enum vdec_output_fromat output_format;
246 enum vdec_interlaced_format interlace;
247 enum vdec_output_order picture_order;
Maheshwar Ajjac366ad22014-07-09 17:31:13 +0530248 struct vdec_framesize frame_size;
Shalaj Jain273b3e02012-06-22 19:08:03 -0700249 struct vdec_picsize video_resolution;
250 struct vdec_allocatorproperty ip_buf;
251 struct vdec_allocatorproperty op_buf;
252 struct vdec_bufferpayload *ptr_inputbuffer;
253 struct vdec_bufferpayload *ptr_outputbuffer;
254 struct vdec_output_frameinfo *ptr_respbuffer;
255#ifdef USE_ION
256 struct vdec_ion *ip_buf_ion_info;
257 struct vdec_ion *op_buf_ion_info;
258 struct vdec_ion h264_mv;
Deepak Verma24e76762012-12-05 13:54:51 +0530259 struct vdec_ion meta_buffer;
260 struct vdec_ion meta_buffer_iommu;
Shalaj Jain273b3e02012-06-22 19:08:03 -0700261#endif
262 struct vdec_framerate frame_rate;
263 unsigned extradata;
264 bool timestamp_adjust;
265 char kind[128];
266 bool idr_only_decoding;
267 unsigned disable_dmx;
Vinay Kalia0e75e9a2012-09-27 15:41:53 -0700268#ifdef _MSM8974_
Arun Menon906de572013-06-18 17:01:40 -0700269 struct extradata_buffer_info extradata_info;
270 int num_planes;
Vinay Kalia0e75e9a2012-09-27 15:41:53 -0700271#endif
Shalaj Jain273b3e02012-06-22 19:08:03 -0700272};
273
Arun Menon6836ba02013-02-19 20:37:40 -0800274struct video_decoder_capability {
275 unsigned int min_width;
276 unsigned int max_width;
277 unsigned int min_height;
278 unsigned int max_height;
279};
Jayasena Sangaraboina51230642013-08-21 18:02:13 -0700280
281struct debug_cap {
282 bool in_buffer_log;
283 bool out_buffer_log;
284 char infile_name[PROPERTY_VALUE_MAX + 36];
285 char outfile_name[PROPERTY_VALUE_MAX + 36];
286 char log_loc[PROPERTY_VALUE_MAX];
287 FILE *infile;
288 FILE *outfile;
289};
290
Arun Menonbdb80b02013-08-12 17:45:54 -0700291struct dynamic_buf_list {
292 OMX_U32 fd;
293 OMX_U32 dup_fd;
294 OMX_U32 offset;
295 OMX_U32 ref_count;
296};
Arun Menonbdb80b02013-08-12 17:45:54 -0700297
Shalaj Jain273b3e02012-06-22 19:08:03 -0700298// OMX video decoder class
299class omx_vdec: public qc_omx_component
300{
301
Arun Menon906de572013-06-18 17:01:40 -0700302 public:
303 omx_vdec(); // constructor
304 virtual ~omx_vdec(); // destructor
Shalaj Jain273b3e02012-06-22 19:08:03 -0700305
Arun Menon906de572013-06-18 17:01:40 -0700306 static int async_message_process (void *context, void* message);
307 static void process_event_cb(void *ctxt,unsigned char id);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700308
Arun Menon906de572013-06-18 17:01:40 -0700309 OMX_ERRORTYPE allocate_buffer(
310 OMX_HANDLETYPE hComp,
311 OMX_BUFFERHEADERTYPE **bufferHdr,
312 OMX_U32 port,
313 OMX_PTR appData,
314 OMX_U32 bytes
315 );
Shalaj Jain273b3e02012-06-22 19:08:03 -0700316
317
Arun Menon906de572013-06-18 17:01:40 -0700318 OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700319
Arun Menon906de572013-06-18 17:01:40 -0700320 OMX_ERRORTYPE component_init(OMX_STRING role);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700321
Arun Menon906de572013-06-18 17:01:40 -0700322 OMX_ERRORTYPE component_role_enum(
323 OMX_HANDLETYPE hComp,
324 OMX_U8 *role,
325 OMX_U32 index
326 );
Shalaj Jain273b3e02012-06-22 19:08:03 -0700327
Arun Menon906de572013-06-18 17:01:40 -0700328 OMX_ERRORTYPE component_tunnel_request(
329 OMX_HANDLETYPE hComp,
330 OMX_U32 port,
331 OMX_HANDLETYPE peerComponent,
332 OMX_U32 peerPort,
333 OMX_TUNNELSETUPTYPE *tunnelSetup
334 );
Shalaj Jain273b3e02012-06-22 19:08:03 -0700335
Arun Menon906de572013-06-18 17:01:40 -0700336 OMX_ERRORTYPE empty_this_buffer(
337 OMX_HANDLETYPE hComp,
338 OMX_BUFFERHEADERTYPE *buffer
339 );
Shalaj Jain273b3e02012-06-22 19:08:03 -0700340
341
342
Arun Menon906de572013-06-18 17:01:40 -0700343 OMX_ERRORTYPE fill_this_buffer(
344 OMX_HANDLETYPE hComp,
345 OMX_BUFFERHEADERTYPE *buffer
346 );
Shalaj Jain273b3e02012-06-22 19:08:03 -0700347
348
Arun Menon906de572013-06-18 17:01:40 -0700349 OMX_ERRORTYPE free_buffer(
350 OMX_HANDLETYPE hComp,
351 OMX_U32 port,
352 OMX_BUFFERHEADERTYPE *buffer
353 );
Shalaj Jain273b3e02012-06-22 19:08:03 -0700354
Arun Menon906de572013-06-18 17:01:40 -0700355 OMX_ERRORTYPE get_component_version(
356 OMX_HANDLETYPE hComp,
357 OMX_STRING componentName,
358 OMX_VERSIONTYPE *componentVersion,
359 OMX_VERSIONTYPE *specVersion,
360 OMX_UUIDTYPE *componentUUID
361 );
Shalaj Jain273b3e02012-06-22 19:08:03 -0700362
Arun Menon906de572013-06-18 17:01:40 -0700363 OMX_ERRORTYPE get_config(
364 OMX_HANDLETYPE hComp,
365 OMX_INDEXTYPE configIndex,
366 OMX_PTR configData
367 );
Shalaj Jain273b3e02012-06-22 19:08:03 -0700368
Arun Menon906de572013-06-18 17:01:40 -0700369 OMX_ERRORTYPE get_extension_index(
370 OMX_HANDLETYPE hComp,
371 OMX_STRING paramName,
372 OMX_INDEXTYPE *indexType
373 );
Shalaj Jain273b3e02012-06-22 19:08:03 -0700374
Arun Menon906de572013-06-18 17:01:40 -0700375 OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE hComp,
376 OMX_INDEXTYPE paramIndex,
377 OMX_PTR paramData);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700378
Arun Menon906de572013-06-18 17:01:40 -0700379 OMX_ERRORTYPE get_state(OMX_HANDLETYPE hComp,
380 OMX_STATETYPE *state);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700381
382
383
Arun Menon906de572013-06-18 17:01:40 -0700384 OMX_ERRORTYPE send_command(OMX_HANDLETYPE hComp,
385 OMX_COMMANDTYPE cmd,
386 OMX_U32 param1,
387 OMX_PTR cmdData);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700388
389
Arun Menon906de572013-06-18 17:01:40 -0700390 OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE hComp,
391 OMX_CALLBACKTYPE *callbacks,
392 OMX_PTR appData);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700393
Arun Menon906de572013-06-18 17:01:40 -0700394 OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp,
395 OMX_INDEXTYPE configIndex,
396 OMX_PTR configData);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700397
Arun Menon906de572013-06-18 17:01:40 -0700398 OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp,
399 OMX_INDEXTYPE paramIndex,
400 OMX_PTR paramData);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700401
Arun Menon906de572013-06-18 17:01:40 -0700402 OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE hComp,
403 OMX_BUFFERHEADERTYPE **bufferHdr,
404 OMX_U32 port,
405 OMX_PTR appData,
406 OMX_U32 bytes,
407 OMX_U8 *buffer);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700408
Arun Menon906de572013-06-18 17:01:40 -0700409 OMX_ERRORTYPE use_input_heap_buffers(
410 OMX_HANDLETYPE hComp,
411 OMX_BUFFERHEADERTYPE** bufferHdr,
412 OMX_U32 port,
413 OMX_PTR appData,
414 OMX_U32 bytes,
415 OMX_U8* buffer);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700416
Arun Menon906de572013-06-18 17:01:40 -0700417 OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE hComp,
418 OMX_BUFFERHEADERTYPE **bufferHdr,
419 OMX_U32 port,
420 OMX_PTR appData,
421 void * eglImage);
422 void complete_pending_buffer_done_cbs();
423 struct video_driver_context drv_ctx;
Vinay Kalia0e75e9a2012-09-27 15:41:53 -0700424#ifdef _MSM8974_
Arun Menon906de572013-06-18 17:01:40 -0700425 OMX_ERRORTYPE allocate_extradata();
426 void free_extradata();
427 int update_resolution(int width, int height, int stride, int scan_lines);
428 OMX_ERRORTYPE is_video_session_supported();
Vinay Kalia0e75e9a2012-09-27 15:41:53 -0700429#endif
Arun Menon906de572013-06-18 17:01:40 -0700430 int m_pipe_in;
431 int m_pipe_out;
432 pthread_t msg_thread_id;
433 pthread_t async_thread_id;
434 bool is_component_secure();
Arun Menonbdb80b02013-08-12 17:45:54 -0700435 void buf_ref_add(OMX_U32 fd, OMX_U32 offset);
436 void buf_ref_remove(OMX_U32 fd, OMX_U32 offset);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700437
Arun Menon906de572013-06-18 17:01:40 -0700438 private:
439 // Bit Positions
440 enum flags_bit_positions {
441 // Defer transition to IDLE
442 OMX_COMPONENT_IDLE_PENDING =0x1,
443 // Defer transition to LOADING
444 OMX_COMPONENT_LOADING_PENDING =0x2,
445 // First Buffer Pending
446 OMX_COMPONENT_FIRST_BUFFER_PENDING =0x3,
447 // Second Buffer Pending
448 OMX_COMPONENT_SECOND_BUFFER_PENDING =0x4,
449 // Defer transition to Enable
450 OMX_COMPONENT_INPUT_ENABLE_PENDING =0x5,
451 // Defer transition to Enable
452 OMX_COMPONENT_OUTPUT_ENABLE_PENDING =0x6,
453 // Defer transition to Disable
454 OMX_COMPONENT_INPUT_DISABLE_PENDING =0x7,
455 // Defer transition to Disable
456 OMX_COMPONENT_OUTPUT_DISABLE_PENDING =0x8,
457 //defer flush notification
458 OMX_COMPONENT_OUTPUT_FLUSH_PENDING =0x9,
459 OMX_COMPONENT_INPUT_FLUSH_PENDING =0xA,
460 OMX_COMPONENT_PAUSE_PENDING =0xB,
461 OMX_COMPONENT_EXECUTE_PENDING =0xC,
462 OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING =0xD,
Pushkaraj Patilc7e0b9a2015-01-22 18:31:13 +0530463 OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED=0xE,
464 OMX_COMPONENT_FLUSH_DEFERRED = 0xF
Arun Menon906de572013-06-18 17:01:40 -0700465 };
Shalaj Jain273b3e02012-06-22 19:08:03 -0700466
Arun Menon906de572013-06-18 17:01:40 -0700467 // Deferred callback identifiers
468 enum {
469 //Event Callbacks from the vdec component thread context
470 OMX_COMPONENT_GENERATE_EVENT = 0x1,
471 //Buffer Done callbacks from the vdec component thread context
472 OMX_COMPONENT_GENERATE_BUFFER_DONE = 0x2,
473 //Frame Done callbacks from the vdec component thread context
474 OMX_COMPONENT_GENERATE_FRAME_DONE = 0x3,
475 //Buffer Done callbacks from the vdec component thread context
476 OMX_COMPONENT_GENERATE_FTB = 0x4,
477 //Frame Done callbacks from the vdec component thread context
478 OMX_COMPONENT_GENERATE_ETB = 0x5,
479 //Command
480 OMX_COMPONENT_GENERATE_COMMAND = 0x6,
481 //Push-Pending Buffers
482 OMX_COMPONENT_PUSH_PENDING_BUFS = 0x7,
483 // Empty Buffer Done callbacks
484 OMX_COMPONENT_GENERATE_EBD = 0x8,
485 //Flush Event Callbacks from the vdec component thread context
486 OMX_COMPONENT_GENERATE_EVENT_FLUSH = 0x9,
487 OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH = 0x0A,
488 OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH = 0x0B,
489 OMX_COMPONENT_GENERATE_FBD = 0xc,
490 OMX_COMPONENT_GENERATE_START_DONE = 0xD,
491 OMX_COMPONENT_GENERATE_PAUSE_DONE = 0xE,
492 OMX_COMPONENT_GENERATE_RESUME_DONE = 0xF,
493 OMX_COMPONENT_GENERATE_STOP_DONE = 0x10,
494 OMX_COMPONENT_GENERATE_HARDWARE_ERROR = 0x11,
495 OMX_COMPONENT_GENERATE_ETB_ARBITRARY = 0x12,
496 OMX_COMPONENT_GENERATE_PORT_RECONFIG = 0x13,
497 OMX_COMPONENT_GENERATE_EOS_DONE = 0x14,
498 OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG = 0x15,
499 OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED = 0x16,
500 OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING = 0x17,
Deepak Verma24720fb2014-01-29 16:57:40 +0530501 OMX_COMPONENT_GENERATE_HARDWARE_OVERLOAD = 0x18,
Arun Menon906de572013-06-18 17:01:40 -0700502 };
Shalaj Jain273b3e02012-06-22 19:08:03 -0700503
Arun Menon906de572013-06-18 17:01:40 -0700504 enum vc1_profile_type {
505 VC1_SP_MP_RCV = 1,
506 VC1_AP = 2
507 };
Shalaj Jain273b3e02012-06-22 19:08:03 -0700508
David Ng1d9befe2012-07-18 15:31:08 -0700509#ifdef _MSM8974_
Arun Menon906de572013-06-18 17:01:40 -0700510 enum v4l2_ports {
511 CAPTURE_PORT,
512 OUTPUT_PORT,
513 MAX_PORT
514 };
Shalaj Jain273b3e02012-06-22 19:08:03 -0700515#endif
516
Arun Menon906de572013-06-18 17:01:40 -0700517 struct omx_event {
518 unsigned param1;
519 unsigned param2;
520 unsigned id;
521 };
Shalaj Jain273b3e02012-06-22 19:08:03 -0700522
Arun Menon906de572013-06-18 17:01:40 -0700523 struct omx_cmd_queue {
524 omx_event m_q[OMX_CORE_CONTROL_CMDQ_SIZE];
525 unsigned m_read;
526 unsigned m_write;
527 unsigned m_size;
Shalaj Jain273b3e02012-06-22 19:08:03 -0700528
Arun Menon906de572013-06-18 17:01:40 -0700529 omx_cmd_queue();
530 ~omx_cmd_queue();
531 bool insert_entry(unsigned p1, unsigned p2, unsigned id);
532 bool pop_entry(unsigned *p1,unsigned *p2, unsigned *id);
533 // get msgtype of the first ele from the queue
534 unsigned get_q_msg_type();
Shalaj Jain273b3e02012-06-22 19:08:03 -0700535
Arun Menon906de572013-06-18 17:01:40 -0700536 };
Shalaj Jain273b3e02012-06-22 19:08:03 -0700537
538#ifdef _ANDROID_
Arun Menon906de572013-06-18 17:01:40 -0700539 struct ts_entry {
540 OMX_TICKS timestamp;
541 bool valid;
542 };
Shalaj Jain273b3e02012-06-22 19:08:03 -0700543
Arun Menon906de572013-06-18 17:01:40 -0700544 struct ts_arr_list {
545 ts_entry m_ts_arr_list[MAX_NUM_INPUT_OUTPUT_BUFFERS];
Shalaj Jain273b3e02012-06-22 19:08:03 -0700546
Arun Menon906de572013-06-18 17:01:40 -0700547 ts_arr_list();
548 ~ts_arr_list();
Shalaj Jain273b3e02012-06-22 19:08:03 -0700549
Arun Menon906de572013-06-18 17:01:40 -0700550 bool insert_ts(OMX_TICKS ts);
551 bool pop_min_ts(OMX_TICKS &ts);
552 bool reset_ts_list();
553 };
Shalaj Jain273b3e02012-06-22 19:08:03 -0700554#endif
555
Arun Menon906de572013-06-18 17:01:40 -0700556 struct desc_buffer_hdr {
557 OMX_U8 *buf_addr;
558 OMX_U32 desc_data_size;
559 };
560 bool allocate_done(void);
561 bool allocate_input_done(void);
562 bool allocate_output_done(void);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700563
Arun Menon906de572013-06-18 17:01:40 -0700564 OMX_ERRORTYPE free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
565 OMX_ERRORTYPE free_input_buffer(unsigned int bufferindex,
566 OMX_BUFFERHEADERTYPE *pmem_bufferHdr);
567 OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
568 void free_output_buffer_header();
569 void free_input_buffer_header();
Shalaj Jain273b3e02012-06-22 19:08:03 -0700570
Arun Menon906de572013-06-18 17:01:40 -0700571 OMX_ERRORTYPE allocate_input_heap_buffer(OMX_HANDLETYPE hComp,
572 OMX_BUFFERHEADERTYPE **bufferHdr,
573 OMX_U32 port,
574 OMX_PTR appData,
575 OMX_U32 bytes);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700576
577
Arun Menon906de572013-06-18 17:01:40 -0700578 OMX_ERRORTYPE allocate_input_buffer(OMX_HANDLETYPE hComp,
579 OMX_BUFFERHEADERTYPE **bufferHdr,
580 OMX_U32 port,
581 OMX_PTR appData,
582 OMX_U32 bytes);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700583
Arun Menon906de572013-06-18 17:01:40 -0700584 OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE hComp,
585 OMX_BUFFERHEADERTYPE **bufferHdr,
586 OMX_U32 port,OMX_PTR appData,
587 OMX_U32 bytes);
588 OMX_ERRORTYPE use_output_buffer(OMX_HANDLETYPE hComp,
589 OMX_BUFFERHEADERTYPE **bufferHdr,
590 OMX_U32 port,
591 OMX_PTR appData,
592 OMX_U32 bytes,
593 OMX_U8 *buffer);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700594#ifdef MAX_RES_720P
Arun Menon906de572013-06-18 17:01:40 -0700595 OMX_ERRORTYPE get_supported_profile_level_for_720p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700596#endif
597#ifdef MAX_RES_1080P
Arun Menon906de572013-06-18 17:01:40 -0700598 OMX_ERRORTYPE get_supported_profile_level_for_1080p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700599#endif
600
Arun Menon906de572013-06-18 17:01:40 -0700601 OMX_ERRORTYPE allocate_desc_buffer(OMX_U32 index);
602 OMX_ERRORTYPE allocate_output_headers();
603 bool execute_omx_flush(OMX_U32);
604 bool execute_output_flush();
605 bool execute_input_flush();
606 OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE hComp,
607 OMX_BUFFERHEADERTYPE * buffer);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700608
Arun Menon906de572013-06-18 17:01:40 -0700609 OMX_ERRORTYPE fill_buffer_done(OMX_HANDLETYPE hComp,
610 OMX_BUFFERHEADERTYPE * buffer);
611 OMX_ERRORTYPE empty_this_buffer_proxy(OMX_HANDLETYPE hComp,
612 OMX_BUFFERHEADERTYPE *buffer);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700613
Arun Menon906de572013-06-18 17:01:40 -0700614 OMX_ERRORTYPE empty_this_buffer_proxy_arbitrary(OMX_HANDLETYPE hComp,
615 OMX_BUFFERHEADERTYPE *buffer
616 );
Shalaj Jain273b3e02012-06-22 19:08:03 -0700617
Arun Menon906de572013-06-18 17:01:40 -0700618 OMX_ERRORTYPE push_input_buffer (OMX_HANDLETYPE hComp);
619 OMX_ERRORTYPE push_input_sc_codec (OMX_HANDLETYPE hComp);
620 OMX_ERRORTYPE push_input_h264 (OMX_HANDLETYPE hComp);
621 OMX_ERRORTYPE push_input_vc1 (OMX_HANDLETYPE hComp);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700622
Arun Menon906de572013-06-18 17:01:40 -0700623 OMX_ERRORTYPE fill_this_buffer_proxy(OMX_HANDLETYPE hComp,
624 OMX_BUFFERHEADERTYPE *buffer);
625 bool release_done();
Shalaj Jain273b3e02012-06-22 19:08:03 -0700626
Arun Menon906de572013-06-18 17:01:40 -0700627 bool release_output_done();
628 bool release_input_done();
629 OMX_ERRORTYPE get_buffer_req(vdec_allocatorproperty *buffer_prop);
630 OMX_ERRORTYPE set_buffer_req(vdec_allocatorproperty *buffer_prop);
631 OMX_ERRORTYPE start_port_reconfig();
632 OMX_ERRORTYPE update_picture_resolution();
633 int stream_off(OMX_U32 port);
634 void adjust_timestamp(OMX_S64 &act_timestamp);
635 void set_frame_rate(OMX_S64 act_timestamp);
636 void handle_extradata_secure(OMX_BUFFERHEADERTYPE *p_buf_hdr);
637 void handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr);
638 void print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra);
Deepak Vermae88d0d22012-10-09 20:34:47 +0530639#ifdef _MSM8974_
Arun Menon906de572013-06-18 17:01:40 -0700640 void append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
Arun Menon7b6fd642014-02-13 16:48:36 -0800641 OMX_U32 interlaced_format_type, bool is_mbaff);
Arun Menon906de572013-06-18 17:01:40 -0700642 OMX_ERRORTYPE enable_extradata(OMX_U32 requested_extradata, bool is_internal,
643 bool enable = true);
644 void append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
645 OMX_U32 num_conceal_mb,
646 OMX_U32 picture_type,
647 OMX_U32 frame_rate,
Rajeshwar Kurapaty90a98112013-09-17 16:07:14 +0530648 OMX_TICKS time_stamp,
Arun Menon906de572013-06-18 17:01:40 -0700649 struct msm_vidc_panscan_window_payload *panscan_payload,
650 struct vdec_aspectratioinfo *aspect_ratio_info);
Deepak Vermae88d0d22012-10-09 20:34:47 +0530651#else
Arun Menon906de572013-06-18 17:01:40 -0700652 void append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
653 OMX_U32 interlaced_format_type, OMX_U32 buf_index);
654 OMX_ERRORTYPE enable_extradata(OMX_U32 requested_extradata, bool enable = true);
Deepak Vermae88d0d22012-10-09 20:34:47 +0530655#endif
Arun Menon906de572013-06-18 17:01:40 -0700656 void append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
657 OMX_U32 num_conceal_mb,
658 OMX_U32 picture_type,
659 OMX_S64 timestamp,
660 OMX_U32 frame_rate,
661 struct vdec_aspectratioinfo *aspect_ratio_info);
662 void fill_aspect_ratio_info(struct vdec_aspectratioinfo *aspect_ratio_info,
663 OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info);
664 void append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra);
665 OMX_ERRORTYPE update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn);
666 void append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra);
667 void append_extn_extradata(OMX_OTHER_EXTRADATATYPE *extra, OMX_OTHER_EXTRADATATYPE *p_extn);
668 void append_user_extradata(OMX_OTHER_EXTRADATATYPE *extra, OMX_OTHER_EXTRADATATYPE *p_user);
Pushkaraj Patil0ddb2e02013-11-12 11:53:58 +0530669 void append_concealmb_extradata(OMX_OTHER_EXTRADATATYPE *extra,
670 OMX_OTHER_EXTRADATATYPE *p_concealmb, OMX_U8 *conceal_mb_data);
Maheshwar Ajjad2df2182013-10-24 19:20:34 +0530671 void append_framepack_extradata(OMX_OTHER_EXTRADATATYPE *extra,
672 struct msm_vidc_s3d_frame_packing_payload *s3d_frame_packing_payload);
Jorge Solano Altamiranob10850d2014-01-08 11:17:58 -0800673 void append_qp_extradata(OMX_OTHER_EXTRADATATYPE *extra,
674 struct msm_vidc_frame_qp_payload *qp_payload);
Jorge Solano Altamirano54338452014-01-08 11:04:57 -0800675 void append_bitsinfo_extradata(OMX_OTHER_EXTRADATATYPE *extra,
676 struct msm_vidc_frame_bits_info_payload *bits_payload);
Arun Menon906de572013-06-18 17:01:40 -0700677 void insert_demux_addr_offset(OMX_U32 address_offset);
678 void extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr);
679 OMX_ERRORTYPE handle_demux_data(OMX_BUFFERHEADERTYPE *buf_hdr);
680 OMX_U32 count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700681
Arun Menon906de572013-06-18 17:01:40 -0700682 bool align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
683 OMX_U32 alignment);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700684#ifdef USE_ION
Arun Menon906de572013-06-18 17:01:40 -0700685 int alloc_map_ion_memory(OMX_U32 buffer_size,
686 OMX_U32 alignment, struct ion_allocation_data *alloc_data,
687 struct ion_fd_data *fd_data,int flag);
688 void free_ion_memory(struct vdec_ion *buf_ion_info);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700689#endif
690
691
Arun Menon906de572013-06-18 17:01:40 -0700692 OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE hComp,
693 OMX_COMMANDTYPE cmd,
694 OMX_U32 param1,
695 OMX_PTR cmdData);
696 bool post_event( unsigned int p1,
697 unsigned int p2,
698 unsigned int id
699 );
700 inline int clip2(int x) {
701 x = x -1;
702 x = x | x >> 1;
703 x = x | x >> 2;
704 x = x | x >> 4;
705 x = x | x >> 16;
706 x = x + 1;
707 return x;
708 }
Shalaj Jain273b3e02012-06-22 19:08:03 -0700709
710#ifdef MAX_RES_1080P
Arun Menon906de572013-06-18 17:01:40 -0700711 OMX_ERRORTYPE vdec_alloc_h264_mv();
712 void vdec_dealloc_h264_mv();
713 OMX_ERRORTYPE vdec_alloc_meta_buffers();
714 void vdec_dealloc_meta_buffers();
Shalaj Jain273b3e02012-06-22 19:08:03 -0700715#endif
716
Arun Menon906de572013-06-18 17:01:40 -0700717 inline void omx_report_error () {
718 if (m_cb.EventHandler && !m_error_propogated) {
Jia Meng1e236c82014-04-03 10:54:39 +0800719 DEBUG_PRINT_ERROR("ERROR: Sending OMX_ErrorHardware to Client");
Arun Menon906de572013-06-18 17:01:40 -0700720 m_error_propogated = true;
721 m_cb.EventHandler(&m_cmp,m_app_data,
722 OMX_EventError,OMX_ErrorHardware,0,NULL);
723 }
Shalaj Jain273b3e02012-06-22 19:08:03 -0700724 }
Arun Menon6836ba02013-02-19 20:37:40 -0800725
Arun Menon906de572013-06-18 17:01:40 -0700726 inline void omx_report_unsupported_setting () {
727 if (m_cb.EventHandler && !m_error_propogated) {
728 DEBUG_PRINT_ERROR(
Deepak Verma24720fb2014-01-29 16:57:40 +0530729 "ERROR: Sending OMX_ErrorUnsupportedSetting to Client");
Arun Menon906de572013-06-18 17:01:40 -0700730 m_error_propogated = true;
Jia Meng1e236c82014-04-03 10:54:39 +0800731 m_cb.EventHandler(&m_cmp, m_app_data,
732 OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL);
Arun Menon906de572013-06-18 17:01:40 -0700733 }
Arun Menon6836ba02013-02-19 20:37:40 -0800734 }
Deepak Verma24720fb2014-01-29 16:57:40 +0530735 inline void omx_report_hw_overload () {
736 if (m_cb.EventHandler && !m_error_propogated) {
737 DEBUG_PRINT_ERROR(
Jia Meng1e236c82014-04-03 10:54:39 +0800738 "ERROR: Sending OMX_ErrorInsufficientResources to Client");
Deepak Verma24720fb2014-01-29 16:57:40 +0530739 m_error_propogated = true;
Jia Meng1e236c82014-04-03 10:54:39 +0800740 m_cb.EventHandler(&m_cmp, m_app_data,
741 OMX_EventError, OMX_ErrorInsufficientResources, 0, NULL);
Deepak Verma24720fb2014-01-29 16:57:40 +0530742 }
743 }
744
Shalaj Jain273b3e02012-06-22 19:08:03 -0700745#if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
Arun Menon906de572013-06-18 17:01:40 -0700746 OMX_ERRORTYPE use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data);
Shalaj Jain273b3e02012-06-22 19:08:03 -0700747#endif
748#if defined (_ANDROID_ICS_)
Arun Menon906de572013-06-18 17:01:40 -0700749 struct nativebuffer {
750 native_handle_t *nativehandle;
751 private_handle_t *privatehandle;
752 int inuse;
753 };
754 nativebuffer native_buffer[MAX_NUM_INPUT_OUTPUT_BUFFERS];
Shalaj Jain273b3e02012-06-22 19:08:03 -0700755#endif
756
Arun Menon906de572013-06-18 17:01:40 -0700757 //*************************************************************
758 //*******************MEMBER VARIABLES *************************
759 //*************************************************************
760 pthread_mutex_t m_lock;
761 pthread_mutex_t c_lock;
Praveen Chavaneac7fd02016-04-25 10:03:42 -0700762 pthread_mutex_t buf_lock;
Arun Menon906de572013-06-18 17:01:40 -0700763 //sem to handle the minimum procesing of commands
764 sem_t m_cmd_lock;
Deva Ramasubramanian1fd93812014-03-26 15:17:15 -0700765 sem_t m_safe_flush;
Arun Menon906de572013-06-18 17:01:40 -0700766 bool m_error_propogated;
767 // compression format
768 OMX_VIDEO_CODINGTYPE eCompressionFormat;
769 // OMX State
770 OMX_STATETYPE m_state;
771 // Application data
772 OMX_PTR m_app_data;
773 // Application callbacks
774 OMX_CALLBACKTYPE m_cb;
775 OMX_PRIORITYMGMTTYPE m_priority_mgm ;
776 OMX_PARAM_BUFFERSUPPLIERTYPE m_buffer_supplier;
777 // fill this buffer queue
778 omx_cmd_queue m_ftb_q;
779 // Command Q for rest of the events
780 omx_cmd_queue m_cmd_q;
781 omx_cmd_queue m_etb_q;
782 // Input memory pointer
783 OMX_BUFFERHEADERTYPE *m_inp_mem_ptr;
784 // Output memory pointer
785 OMX_BUFFERHEADERTYPE *m_out_mem_ptr;
786 // number of input bitstream error frame count
787 unsigned int m_inp_err_count;
Shalaj Jain273b3e02012-06-22 19:08:03 -0700788#ifdef _ANDROID_
Arun Menon906de572013-06-18 17:01:40 -0700789 // Timestamp list
790 ts_arr_list m_timestamp_list;
Shalaj Jain273b3e02012-06-22 19:08:03 -0700791#endif
792
Arun Menon906de572013-06-18 17:01:40 -0700793 bool input_flush_progress;
794 bool output_flush_progress;
795 bool input_use_buffer;
796 bool output_use_buffer;
797 bool ouput_egl_buffers;
798 OMX_BOOL m_use_output_pmem;
799 OMX_BOOL m_out_mem_region_smi;
800 OMX_BOOL m_out_pvt_entry_pmem;
Shalaj Jain273b3e02012-06-22 19:08:03 -0700801
Arun Menon906de572013-06-18 17:01:40 -0700802 int pending_input_buffers;
803 int pending_output_buffers;
804 // bitmask array size for output side
Deva Ramasubramanianeb819322014-07-17 14:23:35 -0700805 uint64_t m_out_bm_count;
Arun Menon906de572013-06-18 17:01:40 -0700806 // bitmask array size for input side
Deva Ramasubramanianeb819322014-07-17 14:23:35 -0700807 uint64_t m_inp_bm_count;
Arun Menon906de572013-06-18 17:01:40 -0700808 //Input port Populated
809 OMX_BOOL m_inp_bPopulated;
810 //Output port Populated
811 OMX_BOOL m_out_bPopulated;
812 // encapsulate the waiting states.
813 unsigned int m_flags;
Shalaj Jain273b3e02012-06-22 19:08:03 -0700814
815#ifdef _ANDROID_
Arun Menon906de572013-06-18 17:01:40 -0700816 // Heap pointer to frame buffers
817 struct vidc_heap {
Gopikrishnaiah Anand5a99cfb2013-01-08 20:28:10 +0530818 sp<MemoryHeapBase> video_heap_ptr;
819 };
Arun Menon906de572013-06-18 17:01:40 -0700820 struct vidc_heap *m_heap_ptr;
821 unsigned int m_heap_count;
822#endif //_ANDROID_
823 // store I/P PORT state
824 OMX_BOOL m_inp_bEnabled;
825 // store O/P PORT state
826 OMX_BOOL m_out_bEnabled;
827 OMX_U32 m_in_alloc_cnt;
828 OMX_U8 m_cRole[OMX_MAX_STRINGNAME_SIZE];
829 // Platform specific details
830 OMX_QCOM_PLATFORM_PRIVATE_LIST *m_platform_list;
831 OMX_QCOM_PLATFORM_PRIVATE_ENTRY *m_platform_entry;
832 OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *m_pmem_info;
833 // SPS+PPS sent as part of set_config
834 OMX_VENDOR_EXTRADATATYPE m_vendor_config;
835
836 /*Variables for arbitrary Byte parsing support*/
837 frame_parse m_frame_parser;
838 omx_cmd_queue m_input_pending_q;
839 omx_cmd_queue m_input_free_q;
840 bool arbitrary_bytes;
841 OMX_BUFFERHEADERTYPE h264_scratch;
842 OMX_BUFFERHEADERTYPE *psource_frame;
843 OMX_BUFFERHEADERTYPE *pdest_frame;
844 OMX_BUFFERHEADERTYPE *m_inp_heap_ptr;
845 OMX_BUFFERHEADERTYPE **m_phdr_pmem_ptr;
846 unsigned int m_heap_inp_bm_count;
847 codec_type codec_type_parse;
848 bool first_frame_meta;
849 unsigned frame_count;
850 unsigned nal_count;
851 unsigned nal_length;
852 bool look_ahead_nal;
853 int first_frame;
854 unsigned char *first_buffer;
855 int first_frame_size;
856 unsigned char m_hwdevice_name[80];
857 FILE *m_device_file_ptr;
858 enum vc1_profile_type m_vc1_profile;
859 OMX_S64 h264_last_au_ts;
860 OMX_U32 h264_last_au_flags;
861 OMX_U32 m_demux_offsets[8192];
862 OMX_U32 m_demux_entries;
863 OMX_U32 m_disp_hor_size;
864 OMX_U32 m_disp_vert_size;
Arun Menon906de572013-06-18 17:01:40 -0700865 OMX_S64 prev_ts;
Ashray Kulkarni6ecd0372015-09-02 17:51:20 -0700866 OMX_S64 prev_ts_actual;
Arun Menon906de572013-06-18 17:01:40 -0700867 bool rst_prev_ts;
868 OMX_U32 frm_int;
869
870 struct vdec_allocatorproperty op_buf_rcnfg;
871 bool in_reconfig;
872 OMX_NATIVE_WINDOWTYPE m_display_id;
873 h264_stream_parser *h264_parser;
874 OMX_U32 client_extradata;
875#ifdef _ANDROID_
876 bool m_debug_timestamp;
877 bool perf_flag;
878 OMX_U32 proc_frms, latency;
879 perf_metrics fps_metrics;
880 perf_metrics dec_time;
Surajit Podderd2644d52013-08-28 17:59:06 +0530881 bool m_reject_avc_1080p_mp;
Arun Menon906de572013-06-18 17:01:40 -0700882 bool m_enable_android_native_buffers;
883 bool m_use_android_native_buffers;
884 bool m_debug_extradata;
885 bool m_debug_concealedmb;
Jia Meng3a3c6492013-12-19 17:16:52 +0800886 OMX_U32 m_conceal_color;
Gopikrishnaiah Anand5a99cfb2013-01-08 20:28:10 +0530887#endif
Arun Menon906de572013-06-18 17:01:40 -0700888#ifdef MAX_RES_1080P
889 MP4_Utils mp4_headerparser;
890#endif
891
892 struct h264_mv_buffer {
893 unsigned char* buffer;
894 int size;
895 int count;
896 int pmem_fd;
897 int offset;
898 };
899 h264_mv_buffer h264_mv_buff;
900
901 struct meta_buffer {
902 unsigned char* buffer;
903 int size;
904 int count;
905 int pmem_fd;
906 int pmem_fd_iommu;
907 int offset;
908 };
909 meta_buffer meta_buff;
910 extra_data_handler extra_data_handle;
Arun Menon906de572013-06-18 17:01:40 -0700911 OMX_PARAM_PORTDEFINITIONTYPE m_port_def;
Maheshwar Ajjad2df2182013-10-24 19:20:34 +0530912 OMX_QCOM_FRAME_PACK_ARRANGEMENT m_frame_pack_arrangement;
Arun Menon906de572013-06-18 17:01:40 -0700913 omx_time_stamp_reorder time_stamp_dts;
914 desc_buffer_hdr *m_desc_buffer_ptr;
915 bool secure_mode;
Praveen Chavand443c0d2016-04-19 12:25:46 -0700916 bool allocate_native_handle;
Arun Menon906de572013-06-18 17:01:40 -0700917 bool external_meta_buffer;
918 bool external_meta_buffer_iommu;
919 OMX_QCOM_EXTRADATA_FRAMEINFO *m_extradata;
Pushkaraj Patil0ddb2e02013-11-12 11:53:58 +0530920 OMX_OTHER_EXTRADATATYPE *m_other_extradata;
Arun Menon906de572013-06-18 17:01:40 -0700921 bool codec_config_flag;
922#ifdef _MSM8974_
923 int capture_capability;
924 int output_capability;
925 bool streaming[MAX_PORT];
Maheshwar Ajja3cdbad42014-08-12 17:00:59 +0530926 OMX_FRAMESIZETYPE framesize;
Arun Menon906de572013-06-18 17:01:40 -0700927 OMX_CONFIG_RECTTYPE rectangle;
Maheshwar Ajjac366ad22014-07-09 17:31:13 +0530928 OMX_U32 prev_n_filled_len;
Praneeth Paladugu42306bb2013-08-27 22:01:28 -0700929 bool is_down_scalar_enabled;
Arun Menon906de572013-06-18 17:01:40 -0700930#endif
Pushkaraj Patil8d273cb2014-07-21 10:43:22 +0530931 struct custom_buffersize {
932 OMX_U32 input_buffersize;
933 } m_custom_buffersize;
Arun Menon906de572013-06-18 17:01:40 -0700934 bool m_power_hinted;
Deepak Vermaa2efdb12013-12-26 12:30:05 +0530935 bool is_q6_platform;
Arun Menon906de572013-06-18 17:01:40 -0700936 OMX_ERRORTYPE power_module_register();
937 OMX_ERRORTYPE power_module_deregister();
938 bool msg_thread_created;
939 bool async_thread_created;
940
941 OMX_VIDEO_PARAM_PROFILELEVELTYPE m_profile_lvl;
942 OMX_U32 m_profile;
943
Arun Menonbdb80b02013-08-12 17:45:54 -0700944 //variables to handle dynamic buffer mode
945 bool dynamic_buf_mode;
946 struct dynamic_buf_list *out_dynamic_list;
Arun Menonbdb80b02013-08-12 17:45:54 -0700947
Praveen Chavancf924182013-12-06 23:16:23 -0800948 bool m_smoothstreaming_mode;
949 OMX_U32 m_smoothstreaming_width;
950 OMX_U32 m_smoothstreaming_height;
951 OMX_ERRORTYPE enable_smoothstreaming();
Arun Menon1fc764f2014-04-17 15:41:27 -0700952 OMX_ERRORTYPE enable_adaptive_playback(unsigned long width, unsigned long height);
Praveen Chavancf924182013-12-06 23:16:23 -0800953
Arun Menon906de572013-06-18 17:01:40 -0700954 unsigned int m_fill_output_msg;
955 bool client_set_fps;
956 class allocate_color_convert_buf
957 {
958 public:
959 allocate_color_convert_buf();
960 ~allocate_color_convert_buf();
961 void set_vdec_client(void *);
962 void update_client();
963 bool set_color_format(OMX_COLOR_FORMATTYPE dest_color_format);
964 bool get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format);
965 bool update_buffer_req();
966 bool get_buffer_req(unsigned int &buffer_size);
967 OMX_BUFFERHEADERTYPE* get_il_buf_hdr();
968 OMX_BUFFERHEADERTYPE* get_il_buf_hdr(OMX_BUFFERHEADERTYPE *input_hdr);
969 OMX_BUFFERHEADERTYPE* get_dr_buf_hdr(OMX_BUFFERHEADERTYPE *input_hdr);
970 OMX_BUFFERHEADERTYPE* convert(OMX_BUFFERHEADERTYPE *header);
971 OMX_BUFFERHEADERTYPE* queue_buffer(OMX_BUFFERHEADERTYPE *header);
972 OMX_ERRORTYPE allocate_buffers_color_convert(OMX_HANDLETYPE hComp,
973 OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,
974 OMX_U32 bytes);
975 OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
976 private:
977#define MAX_COUNT 32
978 omx_vdec *omx;
979 bool enabled;
980 OMX_COLOR_FORMATTYPE ColorFormat;
981 void init_members();
982 bool color_convert_mode;
983 ColorConvertFormat dest_format;
984 class omx_c2d_conv c2d;
985 unsigned int allocated_count;
986 unsigned int buffer_size_req;
987 unsigned int buffer_alignment_req;
988 OMX_QCOM_PLATFORM_PRIVATE_LIST m_platform_list_client[MAX_COUNT];
989 OMX_QCOM_PLATFORM_PRIVATE_ENTRY m_platform_entry_client[MAX_COUNT];
990 OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO m_pmem_info_client[MAX_COUNT];
991 OMX_BUFFERHEADERTYPE m_out_mem_ptr_client[MAX_COUNT];
992#ifdef USE_ION
993 struct vdec_ion op_buf_ion_info[MAX_COUNT];
994#endif
995 unsigned char *pmem_baseaddress[MAX_COUNT];
996 int pmem_fd[MAX_COUNT];
997 struct vidc_heap {
998 sp<MemoryHeapBase> video_heap_ptr;
999 };
1000 struct vidc_heap m_heap_ptr[MAX_COUNT];
1001 };
1002#if defined (_MSM8960_) || defined (_MSM8974_)
1003 allocate_color_convert_buf client_buffers;
1004#endif
1005 struct video_decoder_capability m_decoder_capability;
Jayasena Sangaraboina51230642013-08-21 18:02:13 -07001006 struct debug_cap m_debug;
1007 int log_input_buffers(const char *, int);
1008 int log_output_buffers(OMX_BUFFERHEADERTYPE *);
Leena Winterrowd974fd1f2013-10-30 10:58:02 -07001009#ifdef _MSM8974_
1010 void send_codec_config();
1011#endif
vivek mehtaa75c69f2014-01-10 21:50:37 -08001012 OMX_TICKS m_last_rendered_TS;
Manikanta Kanamarlapudi78b7fb62014-04-04 11:46:02 -07001013
1014 static OMX_COLOR_FORMATTYPE getPreferredColorFormatNonSurfaceMode(OMX_U32 index) {
1015 //On Android, we default to standard YUV formats for non-surface use-cases
1016 //where apps prefer known color formats.
1017 OMX_COLOR_FORMATTYPE formatsNonSurfaceMode[] = {
1018 [0] = OMX_COLOR_FormatYUV420SemiPlanar,
1019 [1] = OMX_COLOR_FormatYUV420Planar,
1020 [2] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m,
1021 [3] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView,
1022 };
1023 return (index < sizeof(formatsNonSurfaceMode) / sizeof(OMX_COLOR_FORMATTYPE)) ?
1024 formatsNonSurfaceMode[index] : OMX_COLOR_FormatMax;
1025 }
1026
1027 static OMX_COLOR_FORMATTYPE getPreferredColorFormatDefaultMode(OMX_U32 index) {
1028 //for surface mode (normal playback), advertise native/accelerated formats first
1029 OMX_COLOR_FORMATTYPE formatsDefault[] = {
1030 [0] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32m,
Balamurugan Alagarsamyf10149e2015-03-24 16:15:51 +05301031 [1] = OMX_COLOR_FormatYUV420SemiPlanar,
1032 [2] = OMX_COLOR_FormatYUV420Planar,
Manikanta Kanamarlapudi78b7fb62014-04-04 11:46:02 -07001033 [3] = (OMX_COLOR_FORMATTYPE)QOMX_COLOR_FORMATYUV420PackedSemiPlanar32mMultiView,
1034 };
1035 return (index < sizeof(formatsDefault) / sizeof(OMX_COLOR_FORMATTYPE)) ?
1036 formatsDefault[index] : OMX_COLOR_FormatMax;
1037 }
Deva Ramasubramanian1fd93812014-03-26 15:17:15 -07001038
1039 volatile int32_t m_queued_codec_config_count;
Praveen Chavan09a82b72014-10-18 09:09:45 -07001040
1041 static OMX_ERRORTYPE describeColorFormat(OMX_PTR params);
Shalaj Jain273b3e02012-06-22 19:08:03 -07001042};
1043
David Ng1d9befe2012-07-18 15:31:08 -07001044#ifdef _MSM8974_
Shalaj Jain273b3e02012-06-22 19:08:03 -07001045enum instance_state {
Arun Menon906de572013-06-18 17:01:40 -07001046 MSM_VIDC_CORE_UNINIT_DONE = 0x0001,
1047 MSM_VIDC_CORE_INIT,
1048 MSM_VIDC_CORE_INIT_DONE,
1049 MSM_VIDC_OPEN,
1050 MSM_VIDC_OPEN_DONE,
1051 MSM_VIDC_LOAD_RESOURCES,
1052 MSM_VIDC_LOAD_RESOURCES_DONE,
1053 MSM_VIDC_START,
1054 MSM_VIDC_START_DONE,
1055 MSM_VIDC_STOP,
1056 MSM_VIDC_STOP_DONE,
1057 MSM_VIDC_RELEASE_RESOURCES,
1058 MSM_VIDC_RELEASE_RESOURCES_DONE,
1059 MSM_VIDC_CLOSE,
1060 MSM_VIDC_CLOSE_DONE,
1061 MSM_VIDC_CORE_UNINIT,
Shalaj Jain273b3e02012-06-22 19:08:03 -07001062};
1063
1064enum vidc_resposes_id {
Arun Menon906de572013-06-18 17:01:40 -07001065 MSM_VIDC_DECODER_FLUSH_DONE = 0x11,
1066 MSM_VIDC_DECODER_EVENT_CHANGE,
Shalaj Jain273b3e02012-06-22 19:08:03 -07001067};
1068
David Ng1d9befe2012-07-18 15:31:08 -07001069#endif // _MSM8974_
Shalaj Jain273b3e02012-06-22 19:08:03 -07001070
1071#endif // __OMX_VDEC_H__