1 /*--------------------------------------------------------------------------
2 Copyright (c) 2013-2014, 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_VDPP_H__
31 #define __OMX_VDPP_H__
32 /*============================================================================
33                             O p e n M A X   Component
34                                 Video Decoder
35 
36 *//** @file omx_vdpp.h
37   This module contains the class definition for openMAX video post-processing 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 <math.h>
51 
52 #ifdef _ANDROID_
53 #define LOG_TAG "OMX-VDPP"
54 
55 #ifdef USE_ION
56 #include <linux/msm_ion.h>
57 #endif
58 #include <binder/MemoryHeapBase.h>
59 #include <ui/ANativeObjectBase.h>
60 extern "C"{
61 #include <utils/Log.h>
62 }
63 #include <linux/videodev2.h>
64 #include <poll.h>
65 #define TIMEOUT 5000
66 
67 
68 #define DEBUG_PRINT_LOW(x, ...) ALOGV("[Entry] "x, ##__VA_ARGS__)
69 #define DEBUG_PRINT_HIGH(x, ...) ALOGV("[Step] "x, ##__VA_ARGS__)
70 #define DEBUG_PRINT_ERROR(x, ...) ALOGE("[Error] "x, ##__VA_ARGS__)
71 
72 /*#define DEBUG_PRINT_LOW(x, ...)
73 #define DEBUG_PRINT_HIGH(x, ...)
74 #define DEBUG_PRINT_ERROR(x, ...) */
75 
76 #else //_ANDROID_
77 #define DEBUG_PRINT_LOW printf
78 #define DEBUG_PRINT_HIGH printf
79 #define DEBUG_PRINT_ERROR printf
80 #endif // _ANDROID_
81 
82 #if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
83 #include <media/hardware/HardwareAPI.h>
84 #endif
85 
86 #include <unistd.h>
87 
88 #if defined (_ANDROID_ICS_)
89 #include <gralloc_priv.h>
90 #endif
91 
92 #include <pthread.h>
93 #ifndef PC_DEBUG
94 #include <semaphore.h>
95 #endif
96 #include "OMX_Core.h"
97 #include "OMX_QCOMExtns.h"
98 #include "OMX_CoreExt.h"
99 #include "OMX_IndexExt.h"
100 #include "qc_omx_component.h"
101 #include <linux/android_pmem.h>
102 #include <dlfcn.h>
103 
104 #include <media/msm_vpu.h>
105 extern "C" {
106   OMX_API void * get_omx_component_factory_fn(void); //used by qc_omx_core
107 }
108 
109 #ifdef _ANDROID_
110     using namespace android;
111 #endif // _ANDROID_
112 //////////////////////////////////////////////////////////////////////////////
113 //                       Module specific globals
114 //////////////////////////////////////////////////////////////////////////////
115 #define OMX_SPEC_VERSION  0x00000101
116 
117 // #define OUTPUT_BUFFER_LOG 1
118 // #define INPUT_BUFFER_LOG  1
119 //////////////////////////////////////////////////////////////////////////////
120 //               Macros
121 //////////////////////////////////////////////////////////////////////////////
122 #define PrintFrameHdr(bufHdr) DEBUG_PRINT("bufHdr %x buf %x size %d TS %d\n",\
123                        (unsigned) bufHdr,\
124                        (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->pBuffer,\
125                        (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nFilledLen,\
126                        (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nTimeStamp)
127 
128 // BitMask Management logic
129 #define BITS_PER_BYTE        32
130 #define BITMASK_SIZE(mIndex) (((mIndex) + BITS_PER_BYTE - 1)/BITS_PER_BYTE)
131 #define BITMASK_OFFSET(mIndex) ((mIndex)/BITS_PER_BYTE)
132 #define BITMASK_FLAG(mIndex) (1 << ((mIndex) % BITS_PER_BYTE))
133 #define BITMASK_CLEAR(mArray,mIndex) (mArray)[BITMASK_OFFSET(mIndex)] \
134         &=  ~(BITMASK_FLAG(mIndex))
135 #define BITMASK_SET(mArray,mIndex)  (mArray)[BITMASK_OFFSET(mIndex)] \
136         |=  BITMASK_FLAG(mIndex)
137 #define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \
138         & BITMASK_FLAG(mIndex))
139 #define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
140         & BITMASK_FLAG(mIndex)) == 0x0)
141 #define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \
142         & BITMASK_FLAG(mIndex))
143 #define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
144         & BITMASK_FLAG(mIndex)) == 0x0)
145 
146 #define OMX_CORE_CONTROL_CMDQ_SIZE   200//100
147 #define OMX_CORE_QCIF_HEIGHT         144
148 #define OMX_CORE_QCIF_WIDTH          176
149 #define OMX_CORE_VGA_HEIGHT          480
150 #define OMX_CORE_VGA_WIDTH           640
151 #define OMX_CORE_WVGA_HEIGHT         480
152 #define OMX_CORE_WVGA_WIDTH          800
153 
154 #ifdef _ANDROID_
155 #define MAX_NUM_INPUT_OUTPUT_BUFFERS 32
156 #endif
157 
158 #define OMX_FRAMEINFO_EXTRADATA 0x00010000
159 #define OMX_INTERLACE_EXTRADATA 0x00020000
160 #define OMX_TIMEINFO_EXTRADATA  0x00040000
161 #define OMX_PORTDEF_EXTRADATA   0x00080000
162 #define OMX_EXTNUSER_EXTRADATA  0x00100000
163 #define DRIVER_EXTRADATA_MASK   0x0000FFFF
164 
165 #define OMX_INTERLACE_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
166                                        sizeof(OMX_STREAMINTERLACEFORMAT) + 3)&(~3))
167 #define OMX_FRAMEINFO_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
168                                        sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO) + 3)&(~3))
169 #define OMX_PORTDEF_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
170                                        sizeof(OMX_PARAM_PORTDEFINITIONTYPE) + 3)&(~3))
171 
172 #define VALID_TS(ts)      ((ts < LLONG_MAX)? true : false)
173 
174 /* STATUS CODES */
175 /* Base value for status codes */
176 #define VDPP_S_BASE	0x40000000
177 /* Success */
178 #define VDPP_S_SUCCESS	(VDPP_S_BASE)
179 /* General failure */
180 #define VDPP_S_EFAIL	(VDPP_S_BASE + 1)
181 /* Fatal irrecoverable  failure. Need to  tear down session. */
182 #define VDPP_S_EFATAL   (VDPP_S_BASE + 2)
183 /* Error detected in the passed  parameters */
184 #define VDPP_S_EBADPARAM	(VDPP_S_BASE + 3)
185 /* Command called in invalid  state. */
186 #define VDPP_S_EINVALSTATE	(VDPP_S_BASE + 4)
187  /* Insufficient OS  resources - thread, memory etc. */
188 #define VDPP_S_ENOSWRES	(VDPP_S_BASE + 5)
189  /* Insufficient HW resources -  core capacity  maxed  out. */
190 #define VDPP_S_ENOHWRES	(VDPP_S_BASE + 6)
191 /* Invalid command  called */
192 #define VDPP_S_EINVALCMD	(VDPP_S_BASE + 7)
193 /* Command timeout. */
194 #define VDPP_S_ETIMEOUT	(VDPP_S_BASE + 8)
195 /* Pre-requirement is  not met for API. */
196 #define VDPP_S_ENOPREREQ	(VDPP_S_BASE + 9)
197 /* Command queue is full. */
198 #define VDPP_S_ECMDQFULL	(VDPP_S_BASE + 10)
199 /* Command is not supported  by this driver */
200 #define VDPP_S_ENOTSUPP	(VDPP_S_BASE + 11)
201 /* Command is not implemented by thedriver. */
202 #define VDPP_S_ENOTIMPL	(VDPP_S_BASE + 12)
203 /* Command is not implemented by the driver.  */
204 #define VDPP_S_BUSY	(VDPP_S_BASE + 13)
205 #define VDPP_S_INPUT_BITSTREAM_ERR (VDPP_S_BASE + 14)
206 
207 #define VDPP_INTF_VER	1
208 #define VDPP_MSG_BASE	0x0000000
209 /* Codes to identify asynchronous message responses and events that driver
210   wants to communicate to the app.*/
211 #define VDPP_MSG_INVALID	(VDPP_MSG_BASE + 0)
212 #define VDPP_MSG_RESP_INPUT_BUFFER_DONE	(VDPP_MSG_BASE + 1)
213 #define VDPP_MSG_RESP_OUTPUT_BUFFER_DONE	(VDPP_MSG_BASE + 2)
214 #define VDPP_MSG_RESP_INPUT_FLUSHED	(VDPP_MSG_BASE + 3)
215 #define VDPP_MSG_RESP_OUTPUT_FLUSHED	(VDPP_MSG_BASE + 4)
216 #define VDPP_MSG_RESP_FLUSH_INPUT_DONE	(VDPP_MSG_BASE + 5)
217 #define VDPP_MSG_RESP_FLUSH_OUTPUT_DONE	(VDPP_MSG_BASE + 6)
218 #define VDPP_MSG_RESP_START_DONE	(VDPP_MSG_BASE + 7)
219 #define VDPP_MSG_RESP_STOP_DONE	(VDPP_MSG_BASE + 8)
220 #define VDPP_MSG_RESP_PAUSE_DONE	(VDPP_MSG_BASE + 9)
221 #define VDPP_MSG_RESP_RESUME_DONE	(VDPP_MSG_BASE + 10)
222 #define VDPP_MSG_RESP_RESOURCE_LOADED	(VDPP_MSG_BASE + 11)
223 #define VDPP_EVT_RESOURCES_LOST	(VDPP_MSG_BASE + 12)
224 #define VDPP_MSG_EVT_CONFIG_CHANGED	(VDPP_MSG_BASE + 13)
225 #define VDPP_MSG_EVT_HW_ERROR	(VDPP_MSG_BASE + 14)
226 #define VDPP_MSG_EVT_INFO_CONFIG_CHANGED	(VDPP_MSG_BASE + 15)
227 #define VDPP_MSG_EVT_INFO_FIELD_DROPPED	(VDPP_MSG_BASE + 16)
228 
229 #define VDPP_MSG_EVT_ACTIVE_REGION_DETECTION_STATUS	(VDPP_MSG_BASE + 17)
230 
231 
232 #define VP_INPUT_BUFFER_COUNT_INTERLACE 4
233 #define VP_OUTPUT_BUFFER_COUNT 4
234 
235 #define VDPP_SESSION 1
236 //#define STUB_VPU 1
237 //#define DEFAULT_EXTRADATA (OMX_FRAMEINFO_EXTRADATA|OMX_INTERLACE_EXTRADATA)
238 
239 enum port_indexes
240 {
241     OMX_CORE_INPUT_PORT_INDEX        =0,
242     OMX_CORE_OUTPUT_PORT_INDEX       =1
243 };
244 #ifdef USE_ION
245 struct vdpp_ion
246 {
247     int ion_device_fd;
248     struct ion_fd_data fd_ion_data;
249     struct ion_allocation_data ion_alloc_data;
250 };
251 #endif
252 
253 struct extradata_buffer_info {
254 	int buffer_size;
255 	char* uaddr;
256 	int count;
257 	int size;
258 #ifdef USE_ION
259 	struct vdpp_ion ion;
260 #endif
261 };
262 
263 struct vdpp_picsize {
264 	uint32_t frame_width;
265 	uint32_t frame_height;
266 	uint32_t stride;
267 	uint32_t scan_lines;
268 };
269 
270 enum vdpp_interlaced_format {
271 	VDPP_InterlaceFrameProgressive = 0x1,
272 	VDPP_InterlaceInterleaveFrameTopFieldFirst = 0x2,
273 	VDPP_InterlaceInterleaveFrameBottomFieldFirst = 0x4
274 };
275 
276 enum vdpp_buffer {
277 	VDPP_BUFFER_TYPE_INPUT,
278 	VDPP_BUFFER_TYPE_OUTPUT
279 };
280 
281 struct vdpp_allocatorproperty {
282 	enum vdpp_buffer buffer_type;
283 	uint32_t mincount;
284 	uint32_t maxcount;
285 	uint32_t actualcount;
286 	size_t buffer_size;
287 	uint32_t alignment;
288 	uint32_t buf_poolid;
289 	size_t frame_size;
290 };
291 
292 struct vdpp_bufferpayload {
293 	void *bufferaddr;
294 	size_t buffer_len;
295 	int pmem_fd;
296 	size_t offset;
297 	size_t mmaped_size;
298 };
299 
300 struct vdpp_framesize {
301 	uint32_t   left;
302 	uint32_t   top;
303 	uint32_t   right;
304 	uint32_t   bottom;
305 };
306 
307 struct vdpp_setbuffer_cmd {
308 	enum vdpp_buffer buffer_type;
309 	struct vdpp_bufferpayload buffer;
310 };
311 
312 struct vdpp_output_frameinfo {
313 	void *bufferaddr;
314 	size_t offset;
315 	size_t len;
316 	uint32_t flags;
317 	int64_t time_stamp;
318 	void *client_data;
319 	struct vdpp_framesize framesize;
320 
321 };
322 
323 union vdpp_msgdata {
324     struct v4l2_rect ar_result;
325 	struct vdpp_output_frameinfo output_frame;
326 	void *input_frame_clientdata;
327 };
328 
329 struct vdpp_msginfo {
330 	uint32_t status_code;
331 	uint32_t msgcode;
332 	union vdpp_msgdata msgdata;
333 	size_t msgdatasize;
334 };
335 
336 struct vdpp_framerate {
337 	unsigned long fps_denominator;
338 	unsigned long fps_numerator;
339 };
340 
341 #ifdef STUB_VPU
342 typedef struct vcap_etb_ftb_info
343 {
344     int etb_cnt; // only simulate 1-to-1
345     __u32	etb_index;
346 	size_t  etb_len;
347     int ftb_cnt;
348     __u32   ftb_index;
349 	size_t  ftb_len;
350 }vcap_etb_ftb_info;
351 #endif
352 
353 struct video_vpu_context
354 {
355     int video_vpu_fd;
356     uint32_t output_format;
357     enum   v4l2_field interlace;
358     struct vdpp_picsize video_resolution_input;
359     struct vdpp_picsize video_resolution_output;
360     struct vdpp_allocatorproperty ip_buf;
361     struct vdpp_allocatorproperty op_buf;
362     struct vdpp_bufferpayload *ptr_inputbuffer;
363     struct vdpp_bufferpayload *ptr_outputbuffer;
364     struct vdpp_output_frameinfo *ptr_respbuffer;
365 #ifdef USE_ION
366     struct vdpp_ion *ip_buf_ion_info;
367     struct vdpp_ion *op_buf_ion_info;
368 #endif
369     struct vdpp_framerate frame_rate;
370     bool timestamp_adjust;
371     char kind[128];
372 	struct extradata_buffer_info extradata_info;
373     int input_num_planes;
374     int output_num_planes;
375     double input_bytesperpixel[2];
376     double output_bytesperpixel[2];
377     int sessionsSupported;
378     int sessionAttached;
379 #ifdef STUB_VPU
380     bool thread_exit;
381     vcap_etb_ftb_info etb_ftb_info;
382     sem_t             async_lock;
383 #endif
384 };
385 
386 typedef struct _VdppExtensionData_t
387 {
388     bool                           activeRegionDetectionDirtyFlag;
389     QOMX_ACTIVEREGIONDETECTIONTYPE activeRegionDetection;
390     bool                                  activeRegionDetectionStatusDirtyFlag;
391     QOMX_ACTIVEREGIONDETECTION_STATUSTYPE activeRegionDetectionStatus;
392     bool                  scalingModeDirtyFlag;
393     QOMX_SCALINGMODETYPE  scalingMode;
394     bool                    noiseReductionDirtyFlag;
395     QOMX_NOISEREDUCTIONTYPE noiseReduction;
396     bool                      imageEnhancementDirtyFlag;
397     QOMX_IMAGEENHANCEMENTTYPE imageEnhancement;
398 } VdppExtensionData_t;
399 
400 // OMX video decoder class
401 class omx_vdpp: public qc_omx_component
402 {
403 
404 public:
405     omx_vdpp();  // constructor
406     virtual ~omx_vdpp();  // destructor
407 
408     static int async_message_process (void *context, void* message);
409     static void process_event_cb(void *ctxt,unsigned char id);
410     struct omx_event
411     {
412         unsigned param1;
413         unsigned param2;
414         unsigned id;
415     };
416     struct omx_cmd_queue
417     {
418         omx_event m_q[OMX_CORE_CONTROL_CMDQ_SIZE];
419         unsigned m_read;
420         unsigned m_write;
421         unsigned m_size;
422 
423         omx_cmd_queue();
424         ~omx_cmd_queue();
425         bool insert_entry(unsigned p1, unsigned p2, unsigned id);
426         bool pop_entry(unsigned *p1,unsigned *p2, unsigned *id);
427         // get msgtype of the first ele from the queue
428         unsigned get_q_msg_type();
429 
430     };
431 
432     OMX_ERRORTYPE allocate_buffer(
433                                    OMX_HANDLETYPE hComp,
434                                    OMX_BUFFERHEADERTYPE **bufferHdr,
435                                    OMX_U32 port,
436                                    OMX_PTR appData,
437                                    OMX_U32 bytes
438                                   );
439 
440 
441     OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp);
442 
443     OMX_ERRORTYPE component_init(OMX_STRING role);
444 
445     OMX_ERRORTYPE component_role_enum(
446                                        OMX_HANDLETYPE hComp,
447                                        OMX_U8 *role,
448                                        OMX_U32 index
449                                       );
450 
451     OMX_ERRORTYPE component_tunnel_request(
452                                             OMX_HANDLETYPE hComp,
453                                             OMX_U32 port,
454                                             OMX_HANDLETYPE  peerComponent,
455                                             OMX_U32 peerPort,
456                                             OMX_TUNNELSETUPTYPE *tunnelSetup
457                                            );
458 
459     OMX_ERRORTYPE empty_this_buffer(
460                                      OMX_HANDLETYPE hComp,
461                                      OMX_BUFFERHEADERTYPE *buffer
462                                     );
463 
464 
465 
466     OMX_ERRORTYPE fill_this_buffer(
467                                     OMX_HANDLETYPE hComp,
468                                     OMX_BUFFERHEADERTYPE *buffer
469                                    );
470 
471 
472     OMX_ERRORTYPE free_buffer(
473                               OMX_HANDLETYPE hComp,
474                               OMX_U32 port,
475                               OMX_BUFFERHEADERTYPE *buffer
476                               );
477 
478     OMX_ERRORTYPE get_component_version(
479                                         OMX_HANDLETYPE hComp,
480                                         OMX_STRING componentName,
481                                         OMX_VERSIONTYPE *componentVersion,
482                                         OMX_VERSIONTYPE *specVersion,
483                                         OMX_UUIDTYPE *componentUUID
484                                         );
485 
486     OMX_ERRORTYPE get_config(
487                               OMX_HANDLETYPE hComp,
488                               OMX_INDEXTYPE configIndex,
489                               OMX_PTR configData
490                              );
491 
492     OMX_ERRORTYPE get_extension_index(
493                                       OMX_HANDLETYPE hComp,
494                                       OMX_STRING paramName,
495                                       OMX_INDEXTYPE *indexType
496                                       );
497 
498     OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE hComp,
499                                 OMX_INDEXTYPE  paramIndex,
500                                 OMX_PTR        paramData);
501 
502     OMX_ERRORTYPE get_state(OMX_HANDLETYPE hComp,
503                             OMX_STATETYPE *state);
504 
505 
506 
507     OMX_ERRORTYPE send_command(OMX_HANDLETYPE  hComp,
508                                OMX_COMMANDTYPE cmd,
509                                OMX_U32         param1,
510                                OMX_PTR         cmdData);
511 
512 
513     OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE   hComp,
514                                 OMX_CALLBACKTYPE *callbacks,
515                                 OMX_PTR          appData);
516 
517     OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp,
518                              OMX_INDEXTYPE  configIndex,
519                              OMX_PTR        configData);
520 
521     OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp,
522                                 OMX_INDEXTYPE  paramIndex,
523                                 OMX_PTR        paramData);
524 
525     OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE      hComp,
526                              OMX_BUFFERHEADERTYPE **bufferHdr,
527                              OMX_U32              port,
528                              OMX_PTR              appData,
529                              OMX_U32              bytes,
530                              OMX_U8               *buffer);
531 
532     OMX_ERRORTYPE  use_input_heap_buffers(
533                           OMX_HANDLETYPE            hComp,
534                           OMX_BUFFERHEADERTYPE** bufferHdr,
535                           OMX_U32                   port,
536                           OMX_PTR                   appData,
537                           OMX_U32                   bytes,
538                           OMX_U8*                   buffer);
539 
540     OMX_ERRORTYPE  use_input_buffers(
541                           OMX_HANDLETYPE            hComp,
542                           OMX_BUFFERHEADERTYPE** bufferHdr,
543                           OMX_U32                   port,
544                           OMX_PTR                   appData,
545                           OMX_U32                   bytes,
546                           OMX_U8*                   buffer);
547 
548     OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE     hComp,
549                                 OMX_BUFFERHEADERTYPE **bufferHdr,
550                                 OMX_U32              port,
551                                 OMX_PTR              appData,
552                                 void *               eglImage);
553 
554     void complete_pending_buffer_done_cbs();
555     struct video_vpu_context drv_ctx;
556     int update_resolution(uint32_t width, uint32_t height, uint32_t stride, uint32_t scan_lines);
557 
558     int  m_pipe_in;
559     int  m_pipe_out;
560     int  m_ctrl_in;
561     int  m_ctrl_out;
562 
563     pthread_t msg_thread_id;
564     pthread_t async_thread_id;
565     omx_cmd_queue m_index_q_ftb;
566     omx_cmd_queue m_index_q_etb;
567     bool m_ar_callback_setup;
568 private:
569     // Bit Positions
570     enum flags_bit_positions
571     {
572         // Defer transition to IDLE
573         OMX_COMPONENT_IDLE_PENDING            =0x1,
574         // Defer transition to LOADING
575         OMX_COMPONENT_LOADING_PENDING         =0x2,
576         // First  Buffer Pending
577         OMX_COMPONENT_FIRST_BUFFER_PENDING    =0x3,
578         // Second Buffer Pending
579         OMX_COMPONENT_SECOND_BUFFER_PENDING   =0x4,
580         // Defer transition to Enable
581         OMX_COMPONENT_INPUT_ENABLE_PENDING    =0x5,
582         // Defer transition to Enable
583         OMX_COMPONENT_OUTPUT_ENABLE_PENDING   =0x6,
584         // Defer transition to Disable
585         OMX_COMPONENT_INPUT_DISABLE_PENDING   =0x7,
586         // Defer transition to Disable
587         OMX_COMPONENT_OUTPUT_DISABLE_PENDING  =0x8,
588         //defer flush notification
589         OMX_COMPONENT_OUTPUT_FLUSH_PENDING    =0x9,
590         OMX_COMPONENT_INPUT_FLUSH_PENDING    =0xA,
591         OMX_COMPONENT_PAUSE_PENDING          =0xB,
592         OMX_COMPONENT_EXECUTE_PENDING        =0xC,
593         OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING =0xD,
594         OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED=0xE
595     };
596 
597     // Deferred callback identifiers
598     enum
599     {
600         //Event Callbacks from the vidpp component thread context
601         OMX_COMPONENT_GENERATE_EVENT       = 0x1,
602         //Buffer Done callbacks from the vidpp component thread context
603         OMX_COMPONENT_GENERATE_BUFFER_DONE = 0x2,
604         //Frame Done callbacks from the vidpp component thread context
605         OMX_COMPONENT_GENERATE_FRAME_DONE  = 0x3,
606         //Buffer Done callbacks from the vidpp component thread context
607         OMX_COMPONENT_GENERATE_FTB         = 0x4,
608         //Frame Done callbacks from the vidpp component thread context
609         OMX_COMPONENT_GENERATE_ETB         = 0x5,
610         //Command
611         OMX_COMPONENT_GENERATE_COMMAND     = 0x6,
612         //Push-Pending Buffers
613         OMX_COMPONENT_PUSH_PENDING_BUFS    = 0x7,
614         // Empty Buffer Done callbacks
615         OMX_COMPONENT_GENERATE_EBD         = 0x8,
616         //Flush Event Callbacks from the vidpp component thread context
617         OMX_COMPONENT_GENERATE_EVENT_FLUSH       = 0x9,
618         OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH = 0x0A,
619         OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH = 0x0B,
620         OMX_COMPONENT_GENERATE_FBD = 0xc,
621         OMX_COMPONENT_GENERATE_START_DONE = 0xD,
622         OMX_COMPONENT_GENERATE_PAUSE_DONE = 0xE,
623         OMX_COMPONENT_GENERATE_RESUME_DONE = 0xF,
624         OMX_COMPONENT_GENERATE_STOP_DONE = 0x10,
625         OMX_COMPONENT_GENERATE_HARDWARE_ERROR = 0x11,
626         OMX_COMPONENT_GENERATE_ETB_ARBITRARY = 0x12,
627         OMX_COMPONENT_GENERATE_PORT_RECONFIG = 0x13,
628         OMX_COMPONENT_GENERATE_EOS_DONE = 0x14,
629         OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG = 0x15,
630         OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED = 0x16,
631         OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING = 0x17,
632 
633         // extensions
634         OMX_COMPONENT_GENERATE_ACTIVE_REGION_DETECTION_STATUS = 0x18,
635     };
636 
637     enum v4l2_ports
638     {
639         CAPTURE_PORT,
640         OUTPUT_PORT,
641         MAX_PORT
642     };
643 
644 #ifdef _ANDROID_
645     struct ts_entry
646     {
647         OMX_TICKS timestamp;
648         bool valid;
649     };
650 
651     struct ts_arr_list
652     {
653         ts_entry m_ts_arr_list[MAX_NUM_INPUT_OUTPUT_BUFFERS];
654 
655         ts_arr_list();
656         ~ts_arr_list();
657 
658         bool insert_ts(OMX_TICKS ts);
659         bool pop_min_ts(OMX_TICKS &ts);
660         bool reset_ts_list();
661     };
662 #endif
663 
664     bool allocate_done(void);
665     bool allocate_input_done(void);
666     bool allocate_output_done(void);
667 
668     OMX_ERRORTYPE free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
669     OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
670     void free_output_buffer_header();
671     void free_input_buffer_header();
672 
673     OMX_ERRORTYPE allocate_input_heap_buffer(OMX_HANDLETYPE       hComp,
674                                              OMX_BUFFERHEADERTYPE **bufferHdr,
675                                              OMX_U32              port,
676                                              OMX_PTR              appData,
677                                              OMX_U32              bytes);
678 
679     OMX_ERRORTYPE allocate_input_buffer(OMX_HANDLETYPE       hComp,
680                                         OMX_BUFFERHEADERTYPE **bufferHdr,
681                                         OMX_U32              port,
682                                         OMX_PTR              appData,
683                                         OMX_U32              bytes);
684 
685     OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE       hComp,
686                                          OMX_BUFFERHEADERTYPE **bufferHdr,
687                                          OMX_U32 port,OMX_PTR appData,
688                                          OMX_U32              bytes);
689     OMX_ERRORTYPE use_output_buffer(OMX_HANDLETYPE hComp,
690                                    OMX_BUFFERHEADERTYPE   **bufferHdr,
691                                    OMX_U32                port,
692                                    OMX_PTR                appData,
693                                    OMX_U32                bytes,
694                                    OMX_U8                 *buffer);
695 
696     OMX_ERRORTYPE allocate_output_headers();
697     bool execute_omx_flush(OMX_U32);
698     bool execute_output_flush();
699     bool execute_input_flush();
700     OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE hComp,
701                                     OMX_BUFFERHEADERTYPE * buffer);
702 
703     OMX_ERRORTYPE fill_buffer_done(OMX_HANDLETYPE hComp,
704                                     OMX_BUFFERHEADERTYPE * buffer);
705     OMX_ERRORTYPE empty_this_buffer_proxy(OMX_HANDLETYPE       hComp,
706                                         OMX_BUFFERHEADERTYPE *buffer);
707 
708     OMX_ERRORTYPE fill_this_buffer_proxy(OMX_HANDLETYPE       hComp,
709                                        OMX_BUFFERHEADERTYPE *buffer);
710     bool release_done();
711 
712     bool release_output_done();
713     bool release_input_done();
714     OMX_ERRORTYPE get_buffer_req(vdpp_allocatorproperty *buffer_prop);
715     OMX_ERRORTYPE set_buffer_req(vdpp_allocatorproperty *buffer_prop);
716     OMX_ERRORTYPE start_port_reconfig();
717 
718     int stream_off(OMX_U32 port);
719     void adjust_timestamp(OMX_S64 &act_timestamp);
720     void set_frame_rate(OMX_S64 act_timestamp);
721     OMX_ERRORTYPE enable_extradata(OMX_U32 requested_extradata, bool enable = true);
722     OMX_ERRORTYPE update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn);
723     bool align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
724                             OMX_U32 alignment);
725 #ifdef USE_ION
726     int alloc_map_ion_memory(OMX_U32 buffer_size,
727               OMX_U32 alignment, struct ion_allocation_data *alloc_data,
728               struct ion_fd_data *fd_data,int flag);
729     void free_ion_memory(struct vdpp_ion *buf_ion_info);
730 #endif
731 
732 
733     OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE  hComp,
734                                      OMX_COMMANDTYPE cmd,
735                                      OMX_U32         param1,
736                                      OMX_PTR         cmdData);
737     bool post_event( unsigned int p1,
738                      unsigned int p2,
739                      unsigned int id
740                     );
741 
742     void setFormatParams(int pixelFormat, double bytesperpixel[], unsigned char *planesCount);
743 
744     int openInput(const char* inputName);
745 
746     /**
747       * int clip2 - return an integer value in 2 to the nth power
748       * legacy code from video decoder  (rounded up till 256)
749       *
750       */
clip2(int x)751     inline int clip2(int x)
752     {
753         x = x -1;
754         x = x | x >> 1;
755         x = x | x >> 2;
756         x = x | x >> 4;
757         x = x | x >> 16;
758         x = x + 1;
759         return x;
760     }
761     /**
762       * int paddedFrameWidth - return frame width in a multiple of 128 (rounded up).
763       *
764       * @width - the original frame width.
765       */
paddedFrameWidth128(int width)766     inline int paddedFrameWidth128(int width)
767     {
768         return  (((width + 127) / 128 )* 128);
769     }
770 
771     /**
772       * int paddedFrameWidth32 - return frame width in a multiple of 32 (rounded up).
773       *
774       * @width - the original frame width.
775       */
paddedFrameWidth32(int width)776     inline int paddedFrameWidth32(int width)
777     {
778         return  (((width + 31) / 32 )* 32);
779     }
780 
781     /**
782       * int roundToNearestInt - round to nearest integer value.
783       *
784       * @value - the decimal value to be rounded to nearest integer.
785       */
roundToNearestInt(double value)786     inline int roundToNearestInt(double value)
787     {
788 	    if((ceil(value) - value) > 0.5)
789 		    return floor(value);
790 	    else
791 		    return ceil(value);
792     }
793 
omx_report_error()794     inline void omx_report_error ()
795     {
796         if (m_cb.EventHandler && !m_error_propogated)
797         {
798             ALOGE("\nERROR: Sending OMX_EventError to Client");
799             m_error_propogated = true;
800             m_cb.EventHandler(&m_cmp,m_app_data,
801                   OMX_EventError,OMX_ErrorHardware,0,NULL);
802         }
803     }
804 
omx_report_unsupported_setting()805     inline void omx_report_unsupported_setting ()
806     {
807         if (m_cb.EventHandler && !m_error_propogated)
808         {
809             DEBUG_PRINT_ERROR(
810                "\nERROR: Sending OMX_ErrorUnsupportedSetting to Client");
811             m_error_propogated = true;
812             m_cb.EventHandler(&m_cmp,m_app_data,
813                   OMX_EventError,OMX_ErrorUnsupportedSetting,0,NULL);
814         }
815     }
816 
817 #if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
818     OMX_ERRORTYPE use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data);
819 #endif
820 #if defined (_ANDROID_ICS_)
821     struct nativebuffer{
822         native_handle_t *nativehandle;
823 	private_handle_t *privatehandle;
824         int inuse;
825     };
826     nativebuffer native_buffer[MAX_NUM_INPUT_OUTPUT_BUFFERS];
827 #endif
828 
829 
830     //*************************************************************
831     //*******************MEMBER VARIABLES *************************
832     //*************************************************************
833     pthread_mutex_t       m_lock;
834     //sem to handle the minimum procesing of commands
835     sem_t                 m_cmd_lock;
836     bool              m_error_propogated;
837 
838     // OMX State
839     OMX_STATETYPE m_state;
840     // Application data
841     OMX_PTR m_app_data;
842     // Application callbacks
843     OMX_CALLBACKTYPE m_cb;
844     OMX_PRIORITYMGMTTYPE m_priority_mgm ;
845     OMX_PARAM_BUFFERSUPPLIERTYPE m_buffer_supplier;
846     // fill this buffer queue
847     omx_cmd_queue         m_ftb_q;
848     // Command Q for rest of the events
849     omx_cmd_queue         m_cmd_q;
850     omx_cmd_queue         m_etb_q;
851     // Input memory pointer
852     OMX_BUFFERHEADERTYPE  *m_inp_mem_ptr;
853     // Output memory pointer
854     OMX_BUFFERHEADERTYPE  *m_out_mem_ptr;
855     // number of input bitstream error frame count
856     unsigned int m_inp_err_count;
857 #ifdef _ANDROID_
858     // Timestamp list
859     ts_arr_list           m_timestamp_list;
860 #endif
861 
862     bool input_flush_progress;
863     bool output_flush_progress;
864     bool input_use_buffer;
865     bool output_use_buffer;
866     bool ouput_egl_buffers;
867     OMX_BOOL m_use_output_pmem;
868     OMX_BOOL m_out_mem_region_smi;
869     OMX_BOOL m_out_pvt_entry_pmem;
870 
871     int pending_input_buffers;
872     int pending_output_buffers;
873 
874     int input_qbuf_count;
875     int input_dqbuf_count;
876     int output_qbuf_count;
877     int output_dqbuf_count;
878 
879 #ifdef OUTPUT_BUFFER_LOG
880     int output_buffer_write_counter;
881     int input_buffer_write_counter;
882 #endif
883     // bitmask array size for output side
884     unsigned int m_out_bm_count;
885     // bitmask array size for input side
886     unsigned int m_inp_bm_count;
887     //Input port Populated
888     OMX_BOOL m_inp_bPopulated;
889     //Output port Populated
890     OMX_BOOL m_out_bPopulated;
891     // encapsulate the waiting states.
892     unsigned int m_flags;
893 
894     // store I/P PORT state
895     OMX_BOOL m_inp_bEnabled;
896     // store O/P PORT state
897     OMX_BOOL m_out_bEnabled;
898     OMX_U32 m_in_alloc_cnt;
899     OMX_U8                m_cRole[OMX_MAX_STRINGNAME_SIZE];
900     // Platform specific details
901     OMX_QCOM_PLATFORM_PRIVATE_LIST      *m_platform_list;
902     OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *m_platform_entry;
903     OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *m_pmem_info;
904 
905     /*Variables for arbitrary Byte parsing support*/
906     omx_cmd_queue m_input_pending_q;
907     omx_cmd_queue m_input_free_q;
908 
909     OMX_BUFFERHEADERTYPE  *psource_frame;
910     OMX_BUFFERHEADERTYPE  *pdest_frame;
911     OMX_BUFFERHEADERTYPE  *m_inp_heap_ptr;
912     OMX_BUFFERHEADERTYPE  **m_phdr_pmem_ptr;
913     unsigned int m_heap_inp_bm_count;
914 
915     OMX_S64 prev_ts;
916     bool rst_prev_ts;
917     OMX_U32 frm_int;
918 
919     struct vdpp_allocatorproperty op_buf_rcnfg;
920     bool in_reconfig;
921     OMX_U32 client_extradata;
922 #ifdef _ANDROID_
923     bool m_debug_timestamp;
924     bool perf_flag;
925     OMX_U32 proc_frms, latency;
926     bool m_enable_android_native_buffers;
927     bool m_use_android_native_buffers;
928     bool m_debug_extradata;
929     bool m_debug_concealedmb;
930 #endif
931 
932     OMX_PARAM_PORTDEFINITIONTYPE m_port_def;
933 
934     int capture_capability;
935     int output_capability;
936     bool streaming[MAX_PORT];
937     OMX_CONFIG_RECTTYPE rectangle;
938 	int prev_n_filled_len;
939 
940     bool msg_thread_created;
941     bool async_thread_created;
942 
943     unsigned int m_fill_output_msg;
944     bool client_set_fps;
945     bool interlace_user_flag;
946     // OMX extensions
947     VdppExtensionData_t mExtensionData;
948 };
949 #endif // __OMX_VDPP_H__
950