• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*--------------------------------------------------------------------------
2 Copyright (c) 2010 - 2013, 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 
51 static ptrdiff_t x;
52 
53 #ifdef _ANDROID_
54 #ifdef MAX_RES_720P
55 #define LOG_TAG "OMX-VDEC-720P"
56 #elif MAX_RES_1080P
57 #define LOG_TAG "OMX-VDEC-1080P"
58 #else
59 #define LOG_TAG "OMX-VDEC"
60 #endif
61 
62 #ifdef USE_ION
63 #include <linux/msm_ion.h>
64 //#include <binder/MemoryHeapIon.h>
65 //#else
66 #endif
67 #include <binder/MemoryHeapBase.h>
68 #include <ui/ANativeObjectBase.h>
69 extern "C" {
70 #include <utils/Log.h>
71 }
72 #include <linux/videodev2.h>
73 #include <poll.h>
74 #define TIMEOUT 5000
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 #ifdef _MSM8974_
83 #define DEBUG_PRINT_LOW
84 #define DEBUG_PRINT_HIGH printf
85 #define DEBUG_PRINT_ERROR printf
86 #endif
87 
88 #if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
89 #include <media/hardware/HardwareAPI.h>
90 #endif
91 
92 #include <unistd.h>
93 
94 #if defined (_ANDROID_ICS_)
95 #include <gralloc_priv.h>
96 #endif
97 
98 #include <pthread.h>
99 #ifndef PC_DEBUG
100 #include <semaphore.h>
101 #endif
102 #include "OMX_Core.h"
103 #include "OMX_QCOMExtns.h"
104 #include "qc_omx_component.h"
105 #include <linux/msm_vidc_dec.h>
106 #include <media/msm_vidc.h>
107 #include "frameparser.h"
108 #ifdef MAX_RES_1080P
109 #include "mp4_utils.h"
110 #endif
111 #include <linux/android_pmem.h>
112 #include "extra_data_handler.h"
113 #include "ts_parser.h"
114 #include "vidc_color_converter.h"
115 extern "C" {
116     OMX_API void * get_omx_component_factory_fn(void);
117 }
118 
119 #ifdef _ANDROID_
120 using namespace android;
121 #ifdef USE_ION
122 class VideoHeap : public MemoryHeapBase
123 {
124     public:
125         VideoHeap(int devicefd, size_t size, void* base,struct ion_handle *handle,int mapfd);
~VideoHeap()126         virtual ~VideoHeap() {}
127     private:
128         int m_ion_device_fd;
129         struct ion_handle *m_ion_handle;
130 };
131 #else
132 // local pmem heap object
133 class VideoHeap : public MemoryHeapBase
134 {
135     public:
136         VideoHeap(int fd, size_t size, void* base);
~VideoHeap()137         virtual ~VideoHeap() {}
138 };
139 #endif
140 #endif // _ANDROID_
141 //////////////////////////////////////////////////////////////////////////////
142 //                       Module specific globals
143 //////////////////////////////////////////////////////////////////////////////
144 #define OMX_SPEC_VERSION  0x00000101
145 
146 
147 //////////////////////////////////////////////////////////////////////////////
148 //               Macros
149 //////////////////////////////////////////////////////////////////////////////
150 #define PrintFrameHdr(bufHdr) DEBUG_PRINT("bufHdr %x buf %x size %d TS %d\n",\
151         (unsigned) bufHdr,\
152         (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->pBuffer,\
153         (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nFilledLen,\
154         (unsigned)((OMX_BUFFERHEADERTYPE *)bufHdr)->nTimeStamp)
155 
156 // BitMask Management logic
157 #define BITS_PER_BYTE        32
158 #define BITMASK_SIZE(mIndex) (((mIndex) + BITS_PER_BYTE - 1)/BITS_PER_BYTE)
159 #define BITMASK_OFFSET(mIndex) ((mIndex)/BITS_PER_BYTE)
160 #define BITMASK_FLAG(mIndex) (1 << ((mIndex) % BITS_PER_BYTE))
161 #define BITMASK_CLEAR(mArray,mIndex) (mArray)[BITMASK_OFFSET(mIndex)] \
162     &=  ~(BITMASK_FLAG(mIndex))
163 #define BITMASK_SET(mArray,mIndex)  (mArray)[BITMASK_OFFSET(mIndex)] \
164     |=  BITMASK_FLAG(mIndex)
165 #define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \
166         & BITMASK_FLAG(mIndex))
167 #define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
168             & BITMASK_FLAG(mIndex)) == 0x0)
169 #define BITMASK_PRESENT(mArray,mIndex) ((mArray)[BITMASK_OFFSET(mIndex)] \
170         & BITMASK_FLAG(mIndex))
171 #define BITMASK_ABSENT(mArray,mIndex) (((mArray)[BITMASK_OFFSET(mIndex)] \
172             & BITMASK_FLAG(mIndex)) == 0x0)
173 
174 #define OMX_CORE_CONTROL_CMDQ_SIZE   100
175 #define OMX_CORE_QCIF_HEIGHT         144
176 #define OMX_CORE_QCIF_WIDTH          176
177 #define OMX_CORE_VGA_HEIGHT          480
178 #define OMX_CORE_VGA_WIDTH           640
179 #define OMX_CORE_WVGA_HEIGHT         480
180 #define OMX_CORE_WVGA_WIDTH          800
181 
182 #define DESC_BUFFER_SIZE (8192 * 16)
183 
184 #ifdef _ANDROID_
185 #define MAX_NUM_INPUT_OUTPUT_BUFFERS 32
186 #endif
187 
188 #define OMX_FRAMEINFO_EXTRADATA 0x00010000
189 #define OMX_INTERLACE_EXTRADATA 0x00020000
190 #define OMX_TIMEINFO_EXTRADATA  0x00040000
191 #define OMX_PORTDEF_EXTRADATA   0x00080000
192 #define OMX_EXTNUSER_EXTRADATA  0x00100000
193 #define DRIVER_EXTRADATA_MASK   0x0000FFFF
194 
195 #define OMX_INTERLACE_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
196             sizeof(OMX_STREAMINTERLACEFORMAT) + 3)&(~3))
197 #define OMX_FRAMEINFO_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
198             sizeof(OMX_QCOM_EXTRADATA_FRAMEINFO) + 3)&(~3))
199 #define OMX_PORTDEF_EXTRADATA_SIZE ((sizeof(OMX_OTHER_EXTRADATATYPE) +\
200             sizeof(OMX_PARAM_PORTDEFINITIONTYPE) + 3)&(~3))
201 
202 //  Define next macro with required values to enable default extradata,
203 //    VDEC_EXTRADATA_MB_ERROR_MAP
204 //    OMX_INTERLACE_EXTRADATA
205 //    OMX_FRAMEINFO_EXTRADATA
206 //    OMX_TIMEINFO_EXTRADATA
207 
208 //#define DEFAULT_EXTRADATA (OMX_FRAMEINFO_EXTRADATA|OMX_INTERLACE_EXTRADATA)
209 
210 enum port_indexes {
211     OMX_CORE_INPUT_PORT_INDEX        =0,
212     OMX_CORE_OUTPUT_PORT_INDEX       =1
213 };
214 #ifdef USE_ION
215 struct vdec_ion {
216     int ion_device_fd;
217     struct ion_fd_data fd_ion_data;
218     struct ion_allocation_data ion_alloc_data;
219 };
220 #endif
221 
222 #ifdef _MSM8974_
223 struct extradata_buffer_info {
224     int buffer_size;
225     char* uaddr;
226     int count;
227     int size;
228 #ifdef USE_ION
229     struct vdec_ion ion;
230 #endif
231 };
232 #endif
233 
234 struct video_driver_context {
235     int video_driver_fd;
236     enum vdec_codec decoder_format;
237     enum vdec_output_fromat output_format;
238     enum vdec_interlaced_format interlace;
239     enum vdec_output_order picture_order;
240     struct vdec_picsize video_resolution;
241     struct vdec_allocatorproperty ip_buf;
242     struct vdec_allocatorproperty op_buf;
243     struct vdec_bufferpayload *ptr_inputbuffer;
244     struct vdec_bufferpayload *ptr_outputbuffer;
245     struct vdec_output_frameinfo *ptr_respbuffer;
246 #ifdef USE_ION
247     struct vdec_ion *ip_buf_ion_info;
248     struct vdec_ion *op_buf_ion_info;
249     struct vdec_ion h264_mv;
250     struct vdec_ion meta_buffer;
251     struct vdec_ion meta_buffer_iommu;
252 #endif
253     struct vdec_framerate frame_rate;
254     unsigned extradata;
255     bool timestamp_adjust;
256     char kind[128];
257     bool idr_only_decoding;
258     unsigned disable_dmx;
259 #ifdef _MSM8974_
260     struct extradata_buffer_info extradata_info;
261     int num_planes;
262 #endif
263 };
264 
265 #ifdef _ANDROID_
266 class DivXDrmDecrypt;
267 #endif //_ANDROID_
268 
269 struct video_decoder_capability {
270     unsigned int min_width;
271     unsigned int max_width;
272     unsigned int min_height;
273     unsigned int max_height;
274 };
275 
276 struct dynamic_buf_list {
277     OMX_U32 fd;
278     OMX_U32 dup_fd;
279     OMX_U32 offset;
280     OMX_U32 ref_count;
281 };
282 
283 // OMX video decoder class
284 class omx_vdec: public qc_omx_component
285 {
286 
287     public:
288         omx_vdec();  // constructor
289         virtual ~omx_vdec();  // destructor
290 
291         static int async_message_process (void *context, void* message);
292         static void process_event_cb(void *ctxt,unsigned char id);
293 
294         OMX_ERRORTYPE allocate_buffer(
295                 OMX_HANDLETYPE hComp,
296                 OMX_BUFFERHEADERTYPE **bufferHdr,
297                 OMX_U32 port,
298                 OMX_PTR appData,
299                 OMX_U32 bytes
300                 );
301 
302 
303         OMX_ERRORTYPE component_deinit(OMX_HANDLETYPE hComp);
304 
305         OMX_ERRORTYPE component_init(OMX_STRING role);
306 
307         OMX_ERRORTYPE component_role_enum(
308                 OMX_HANDLETYPE hComp,
309                 OMX_U8 *role,
310                 OMX_U32 index
311                 );
312 
313         OMX_ERRORTYPE component_tunnel_request(
314                 OMX_HANDLETYPE hComp,
315                 OMX_U32 port,
316                 OMX_HANDLETYPE  peerComponent,
317                 OMX_U32 peerPort,
318                 OMX_TUNNELSETUPTYPE *tunnelSetup
319                 );
320 
321         OMX_ERRORTYPE empty_this_buffer(
322                 OMX_HANDLETYPE hComp,
323                 OMX_BUFFERHEADERTYPE *buffer
324                 );
325 
326 
327 
328         OMX_ERRORTYPE fill_this_buffer(
329                 OMX_HANDLETYPE hComp,
330                 OMX_BUFFERHEADERTYPE *buffer
331                 );
332 
333 
334         OMX_ERRORTYPE free_buffer(
335                 OMX_HANDLETYPE hComp,
336                 OMX_U32 port,
337                 OMX_BUFFERHEADERTYPE *buffer
338                 );
339 
340         OMX_ERRORTYPE get_component_version(
341                 OMX_HANDLETYPE hComp,
342                 OMX_STRING componentName,
343                 OMX_VERSIONTYPE *componentVersion,
344                 OMX_VERSIONTYPE *specVersion,
345                 OMX_UUIDTYPE *componentUUID
346                 );
347 
348         OMX_ERRORTYPE get_config(
349                 OMX_HANDLETYPE hComp,
350                 OMX_INDEXTYPE configIndex,
351                 OMX_PTR configData
352                 );
353 
354         OMX_ERRORTYPE get_extension_index(
355                 OMX_HANDLETYPE hComp,
356                 OMX_STRING paramName,
357                 OMX_INDEXTYPE *indexType
358                 );
359 
360         OMX_ERRORTYPE get_parameter(OMX_HANDLETYPE hComp,
361                 OMX_INDEXTYPE  paramIndex,
362                 OMX_PTR        paramData);
363 
364         OMX_ERRORTYPE get_state(OMX_HANDLETYPE hComp,
365                 OMX_STATETYPE *state);
366 
367 
368 
369         OMX_ERRORTYPE send_command(OMX_HANDLETYPE  hComp,
370                 OMX_COMMANDTYPE cmd,
371                 OMX_U32         param1,
372                 OMX_PTR         cmdData);
373 
374 
375         OMX_ERRORTYPE set_callbacks(OMX_HANDLETYPE   hComp,
376                 OMX_CALLBACKTYPE *callbacks,
377                 OMX_PTR          appData);
378 
379         OMX_ERRORTYPE set_config(OMX_HANDLETYPE hComp,
380                 OMX_INDEXTYPE  configIndex,
381                 OMX_PTR        configData);
382 
383         OMX_ERRORTYPE set_parameter(OMX_HANDLETYPE hComp,
384                 OMX_INDEXTYPE  paramIndex,
385                 OMX_PTR        paramData);
386 
387         OMX_ERRORTYPE use_buffer(OMX_HANDLETYPE      hComp,
388                 OMX_BUFFERHEADERTYPE **bufferHdr,
389                 OMX_U32              port,
390                 OMX_PTR              appData,
391                 OMX_U32              bytes,
392                 OMX_U8               *buffer);
393 
394         OMX_ERRORTYPE  use_input_heap_buffers(
395                 OMX_HANDLETYPE            hComp,
396                 OMX_BUFFERHEADERTYPE** bufferHdr,
397                 OMX_U32                   port,
398                 OMX_PTR                   appData,
399                 OMX_U32                   bytes,
400                 OMX_U8*                   buffer);
401 
402         OMX_ERRORTYPE use_EGL_image(OMX_HANDLETYPE     hComp,
403                 OMX_BUFFERHEADERTYPE **bufferHdr,
404                 OMX_U32              port,
405                 OMX_PTR              appData,
406                 void *               eglImage);
407         void complete_pending_buffer_done_cbs();
408         struct video_driver_context drv_ctx;
409 #ifdef _MSM8974_
410         OMX_ERRORTYPE allocate_extradata();
411         void free_extradata();
412         int update_resolution(int width, int height, int stride, int scan_lines);
413         OMX_ERRORTYPE is_video_session_supported();
414 #endif
415         int  m_pipe_in;
416         int  m_pipe_out;
417         pthread_t msg_thread_id;
418         pthread_t async_thread_id;
419         bool is_component_secure();
420         void buf_ref_add(OMX_U32 fd, OMX_U32 offset);
421         void buf_ref_remove(OMX_U32 fd, OMX_U32 offset);
422 
423     private:
424         // Bit Positions
425         enum flags_bit_positions {
426             // Defer transition to IDLE
427             OMX_COMPONENT_IDLE_PENDING            =0x1,
428             // Defer transition to LOADING
429             OMX_COMPONENT_LOADING_PENDING         =0x2,
430             // First  Buffer Pending
431             OMX_COMPONENT_FIRST_BUFFER_PENDING    =0x3,
432             // Second Buffer Pending
433             OMX_COMPONENT_SECOND_BUFFER_PENDING   =0x4,
434             // Defer transition to Enable
435             OMX_COMPONENT_INPUT_ENABLE_PENDING    =0x5,
436             // Defer transition to Enable
437             OMX_COMPONENT_OUTPUT_ENABLE_PENDING   =0x6,
438             // Defer transition to Disable
439             OMX_COMPONENT_INPUT_DISABLE_PENDING   =0x7,
440             // Defer transition to Disable
441             OMX_COMPONENT_OUTPUT_DISABLE_PENDING  =0x8,
442             //defer flush notification
443             OMX_COMPONENT_OUTPUT_FLUSH_PENDING    =0x9,
444             OMX_COMPONENT_INPUT_FLUSH_PENDING    =0xA,
445             OMX_COMPONENT_PAUSE_PENDING          =0xB,
446             OMX_COMPONENT_EXECUTE_PENDING        =0xC,
447             OMX_COMPONENT_OUTPUT_FLUSH_IN_DISABLE_PENDING =0xD,
448             OMX_COMPONENT_DISABLE_OUTPUT_DEFERRED=0xE
449         };
450 
451         // Deferred callback identifiers
452         enum {
453             //Event Callbacks from the vdec component thread context
454             OMX_COMPONENT_GENERATE_EVENT       = 0x1,
455             //Buffer Done callbacks from the vdec component thread context
456             OMX_COMPONENT_GENERATE_BUFFER_DONE = 0x2,
457             //Frame Done callbacks from the vdec component thread context
458             OMX_COMPONENT_GENERATE_FRAME_DONE  = 0x3,
459             //Buffer Done callbacks from the vdec component thread context
460             OMX_COMPONENT_GENERATE_FTB         = 0x4,
461             //Frame Done callbacks from the vdec component thread context
462             OMX_COMPONENT_GENERATE_ETB         = 0x5,
463             //Command
464             OMX_COMPONENT_GENERATE_COMMAND     = 0x6,
465             //Push-Pending Buffers
466             OMX_COMPONENT_PUSH_PENDING_BUFS    = 0x7,
467             // Empty Buffer Done callbacks
468             OMX_COMPONENT_GENERATE_EBD         = 0x8,
469             //Flush Event Callbacks from the vdec component thread context
470             OMX_COMPONENT_GENERATE_EVENT_FLUSH       = 0x9,
471             OMX_COMPONENT_GENERATE_EVENT_INPUT_FLUSH = 0x0A,
472             OMX_COMPONENT_GENERATE_EVENT_OUTPUT_FLUSH = 0x0B,
473             OMX_COMPONENT_GENERATE_FBD = 0xc,
474             OMX_COMPONENT_GENERATE_START_DONE = 0xD,
475             OMX_COMPONENT_GENERATE_PAUSE_DONE = 0xE,
476             OMX_COMPONENT_GENERATE_RESUME_DONE = 0xF,
477             OMX_COMPONENT_GENERATE_STOP_DONE = 0x10,
478             OMX_COMPONENT_GENERATE_HARDWARE_ERROR = 0x11,
479             OMX_COMPONENT_GENERATE_ETB_ARBITRARY = 0x12,
480             OMX_COMPONENT_GENERATE_PORT_RECONFIG = 0x13,
481             OMX_COMPONENT_GENERATE_EOS_DONE = 0x14,
482             OMX_COMPONENT_GENERATE_INFO_PORT_RECONFIG = 0x15,
483             OMX_COMPONENT_GENERATE_INFO_FIELD_DROPPED = 0x16,
484             OMX_COMPONENT_GENERATE_UNSUPPORTED_SETTING = 0x17,
485         };
486 
487         enum vc1_profile_type {
488             VC1_SP_MP_RCV = 1,
489             VC1_AP = 2
490         };
491 
492 #ifdef _MSM8974_
493         enum v4l2_ports {
494             CAPTURE_PORT,
495             OUTPUT_PORT,
496             MAX_PORT
497         };
498 #endif
499 
500         struct omx_event {
501             unsigned param1;
502             unsigned param2;
503             unsigned id;
504         };
505 
506         struct omx_cmd_queue {
507             omx_event m_q[OMX_CORE_CONTROL_CMDQ_SIZE];
508             unsigned m_read;
509             unsigned m_write;
510             unsigned m_size;
511 
512             omx_cmd_queue();
513             ~omx_cmd_queue();
514             bool insert_entry(unsigned p1, unsigned p2, unsigned id);
515             bool pop_entry(unsigned *p1,unsigned *p2, unsigned *id);
516             // get msgtype of the first ele from the queue
517             unsigned get_q_msg_type();
518 
519         };
520 
521 #ifdef _ANDROID_
522         struct ts_entry {
523             OMX_TICKS timestamp;
524             bool valid;
525         };
526 
527         struct ts_arr_list {
528             ts_entry m_ts_arr_list[MAX_NUM_INPUT_OUTPUT_BUFFERS];
529 
530             ts_arr_list();
531             ~ts_arr_list();
532 
533             bool insert_ts(OMX_TICKS ts);
534             bool pop_min_ts(OMX_TICKS &ts);
535             bool reset_ts_list();
536         };
537 #endif
538 
539         struct desc_buffer_hdr {
540             OMX_U8 *buf_addr;
541             OMX_U32 desc_data_size;
542         };
543         bool allocate_done(void);
544         bool allocate_input_done(void);
545         bool allocate_output_done(void);
546 
547         OMX_ERRORTYPE free_input_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
548         OMX_ERRORTYPE free_input_buffer(unsigned int bufferindex,
549                 OMX_BUFFERHEADERTYPE *pmem_bufferHdr);
550         OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
551         void free_output_buffer_header();
552         void free_input_buffer_header();
553 
554         OMX_ERRORTYPE allocate_input_heap_buffer(OMX_HANDLETYPE       hComp,
555                 OMX_BUFFERHEADERTYPE **bufferHdr,
556                 OMX_U32              port,
557                 OMX_PTR              appData,
558                 OMX_U32              bytes);
559 
560 
561         OMX_ERRORTYPE allocate_input_buffer(OMX_HANDLETYPE       hComp,
562                 OMX_BUFFERHEADERTYPE **bufferHdr,
563                 OMX_U32              port,
564                 OMX_PTR              appData,
565                 OMX_U32              bytes);
566 
567         OMX_ERRORTYPE allocate_output_buffer(OMX_HANDLETYPE       hComp,
568                 OMX_BUFFERHEADERTYPE **bufferHdr,
569                 OMX_U32 port,OMX_PTR appData,
570                 OMX_U32              bytes);
571         OMX_ERRORTYPE use_output_buffer(OMX_HANDLETYPE hComp,
572                 OMX_BUFFERHEADERTYPE   **bufferHdr,
573                 OMX_U32                port,
574                 OMX_PTR                appData,
575                 OMX_U32                bytes,
576                 OMX_U8                 *buffer);
577 #ifdef MAX_RES_720P
578         OMX_ERRORTYPE get_supported_profile_level_for_720p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType);
579 #endif
580 #ifdef MAX_RES_1080P
581         OMX_ERRORTYPE get_supported_profile_level_for_1080p(OMX_VIDEO_PARAM_PROFILELEVELTYPE *profileLevelType);
582 #endif
583 
584         OMX_ERRORTYPE allocate_desc_buffer(OMX_U32 index);
585         OMX_ERRORTYPE allocate_output_headers();
586         bool execute_omx_flush(OMX_U32);
587         bool execute_output_flush();
588         bool execute_input_flush();
589         OMX_ERRORTYPE empty_buffer_done(OMX_HANDLETYPE hComp,
590                 OMX_BUFFERHEADERTYPE * buffer);
591 
592         OMX_ERRORTYPE fill_buffer_done(OMX_HANDLETYPE hComp,
593                 OMX_BUFFERHEADERTYPE * buffer);
594         OMX_ERRORTYPE empty_this_buffer_proxy(OMX_HANDLETYPE       hComp,
595                 OMX_BUFFERHEADERTYPE *buffer);
596 
597         OMX_ERRORTYPE empty_this_buffer_proxy_arbitrary(OMX_HANDLETYPE hComp,
598                 OMX_BUFFERHEADERTYPE *buffer
599                 );
600 
601         OMX_ERRORTYPE push_input_buffer (OMX_HANDLETYPE hComp);
602         OMX_ERRORTYPE push_input_sc_codec (OMX_HANDLETYPE hComp);
603         OMX_ERRORTYPE push_input_h264 (OMX_HANDLETYPE hComp);
604         OMX_ERRORTYPE push_input_vc1 (OMX_HANDLETYPE hComp);
605 
606         OMX_ERRORTYPE fill_this_buffer_proxy(OMX_HANDLETYPE       hComp,
607                 OMX_BUFFERHEADERTYPE *buffer);
608         bool release_done();
609 
610         bool release_output_done();
611         bool release_input_done();
612         OMX_ERRORTYPE get_buffer_req(vdec_allocatorproperty *buffer_prop);
613         OMX_ERRORTYPE set_buffer_req(vdec_allocatorproperty *buffer_prop);
614         OMX_ERRORTYPE start_port_reconfig();
615         OMX_ERRORTYPE update_picture_resolution();
616         int stream_off(OMX_U32 port);
617         void adjust_timestamp(OMX_S64 &act_timestamp);
618         void set_frame_rate(OMX_S64 act_timestamp);
619         void handle_extradata_secure(OMX_BUFFERHEADERTYPE *p_buf_hdr);
620         void handle_extradata(OMX_BUFFERHEADERTYPE *p_buf_hdr);
621         void print_debug_extradata(OMX_OTHER_EXTRADATATYPE *extra);
622 #ifdef _MSM8974_
623         void append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
624                 OMX_U32 interlaced_format_type);
625         OMX_ERRORTYPE enable_extradata(OMX_U32 requested_extradata, bool is_internal,
626                 bool enable = true);
627         void append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
628                 OMX_U32 num_conceal_mb,
629                 OMX_U32 picture_type,
630                 OMX_U32 frame_rate,
631                 struct msm_vidc_panscan_window_payload *panscan_payload,
632                 struct vdec_aspectratioinfo *aspect_ratio_info);
633 #else
634         void append_interlace_extradata(OMX_OTHER_EXTRADATATYPE *extra,
635                 OMX_U32 interlaced_format_type, OMX_U32 buf_index);
636         OMX_ERRORTYPE enable_extradata(OMX_U32 requested_extradata, bool enable = true);
637 #endif
638         void append_frame_info_extradata(OMX_OTHER_EXTRADATATYPE *extra,
639                 OMX_U32 num_conceal_mb,
640                 OMX_U32 picture_type,
641                 OMX_S64 timestamp,
642                 OMX_U32 frame_rate,
643                 struct vdec_aspectratioinfo *aspect_ratio_info);
644         void fill_aspect_ratio_info(struct vdec_aspectratioinfo *aspect_ratio_info,
645                 OMX_QCOM_EXTRADATA_FRAMEINFO *frame_info);
646         void append_terminator_extradata(OMX_OTHER_EXTRADATATYPE *extra);
647         OMX_ERRORTYPE update_portdef(OMX_PARAM_PORTDEFINITIONTYPE *portDefn);
648         void append_portdef_extradata(OMX_OTHER_EXTRADATATYPE *extra);
649         void append_extn_extradata(OMX_OTHER_EXTRADATATYPE *extra, OMX_OTHER_EXTRADATATYPE *p_extn);
650         void append_user_extradata(OMX_OTHER_EXTRADATATYPE *extra, OMX_OTHER_EXTRADATATYPE *p_user);
651         void insert_demux_addr_offset(OMX_U32 address_offset);
652         void extract_demux_addr_offsets(OMX_BUFFERHEADERTYPE *buf_hdr);
653         OMX_ERRORTYPE handle_demux_data(OMX_BUFFERHEADERTYPE *buf_hdr);
654         OMX_U32 count_MB_in_extradata(OMX_OTHER_EXTRADATATYPE *extra);
655 
656         bool align_pmem_buffers(int pmem_fd, OMX_U32 buffer_size,
657                 OMX_U32 alignment);
658 #ifdef USE_ION
659         int alloc_map_ion_memory(OMX_U32 buffer_size,
660                 OMX_U32 alignment, struct ion_allocation_data *alloc_data,
661                 struct ion_fd_data *fd_data,int flag);
662         void free_ion_memory(struct vdec_ion *buf_ion_info);
663 #endif
664 
665 
666         OMX_ERRORTYPE send_command_proxy(OMX_HANDLETYPE  hComp,
667                 OMX_COMMANDTYPE cmd,
668                 OMX_U32         param1,
669                 OMX_PTR         cmdData);
670         bool post_event( unsigned int p1,
671                 unsigned int p2,
672                 unsigned int id
673                    );
clip2(int x)674         inline int clip2(int x) {
675             x = x -1;
676             x = x | x >> 1;
677             x = x | x >> 2;
678             x = x | x >> 4;
679             x = x | x >> 16;
680             x = x + 1;
681             return x;
682         }
683 
684 #ifdef MAX_RES_1080P
685         OMX_ERRORTYPE vdec_alloc_h264_mv();
686         void vdec_dealloc_h264_mv();
687         OMX_ERRORTYPE vdec_alloc_meta_buffers();
688         void vdec_dealloc_meta_buffers();
689 #endif
690 
omx_report_error()691         inline void omx_report_error () {
692             if (m_cb.EventHandler && !m_error_propogated) {
693                 ALOGE("\nERROR: Sending OMX_EventError to Client");
694                 m_error_propogated = true;
695                 m_cb.EventHandler(&m_cmp,m_app_data,
696                         OMX_EventError,OMX_ErrorHardware,0,NULL);
697             }
698         }
699 
omx_report_unsupported_setting()700         inline void omx_report_unsupported_setting () {
701             if (m_cb.EventHandler && !m_error_propogated) {
702                 DEBUG_PRINT_ERROR(
703                         "\nERROR: Sending OMX_ErrorUnsupportedSetting to Client");
704                 m_error_propogated = true;
705                 m_cb.EventHandler(&m_cmp,m_app_data,
706                         OMX_EventError,OMX_ErrorUnsupportedSetting,0,NULL);
707             }
708         }
709 #ifdef _ANDROID_
710         OMX_ERRORTYPE createDivxDrmContext();
711 #endif //_ANDROID_
712 #if defined (_ANDROID_HONEYCOMB_) || defined (_ANDROID_ICS_)
713         OMX_ERRORTYPE use_android_native_buffer(OMX_IN OMX_HANDLETYPE hComp, OMX_PTR data);
714 #endif
715 #if defined (_ANDROID_ICS_)
716         struct nativebuffer {
717             native_handle_t *nativehandle;
718             private_handle_t *privatehandle;
719             int inuse;
720         };
721         nativebuffer native_buffer[MAX_NUM_INPUT_OUTPUT_BUFFERS];
722 #endif
723 
724         class auto_lock {
725             public:
auto_lock(pthread_mutex_t * lock)726             auto_lock(pthread_mutex_t *lock)
727                 : mLock(lock) {
728                 if (mLock)
729                     pthread_mutex_lock(mLock);
730             }
~auto_lock()731             ~auto_lock() {
732                 if (mLock)
733                     pthread_mutex_unlock(mLock);
734             }
735             private:
736             pthread_mutex_t *mLock;
737         };
738         //*************************************************************
739         //*******************MEMBER VARIABLES *************************
740         //*************************************************************
741         pthread_mutex_t       m_lock;
742         pthread_mutex_t       c_lock;
743         pthread_mutex_t       e_lock;
744         //sem to handle the minimum procesing of commands
745         sem_t                 m_cmd_lock;
746         bool              m_error_propogated;
747         // compression format
748         OMX_VIDEO_CODINGTYPE eCompressionFormat;
749         // OMX State
750         OMX_STATETYPE m_state;
751         // Application data
752         OMX_PTR m_app_data;
753         // Application callbacks
754         OMX_CALLBACKTYPE m_cb;
755         OMX_PRIORITYMGMTTYPE m_priority_mgm ;
756         OMX_PARAM_BUFFERSUPPLIERTYPE m_buffer_supplier;
757         // fill this buffer queue
758         omx_cmd_queue         m_ftb_q;
759         // Command Q for rest of the events
760         omx_cmd_queue         m_cmd_q;
761         omx_cmd_queue         m_etb_q;
762         // Input memory pointer
763         OMX_BUFFERHEADERTYPE  *m_inp_mem_ptr;
764         // Output memory pointer
765         OMX_BUFFERHEADERTYPE  *m_out_mem_ptr;
766         // number of input bitstream error frame count
767         unsigned int m_inp_err_count;
768 #ifdef _ANDROID_
769         // Timestamp list
770         ts_arr_list           m_timestamp_list;
771 #endif
772 
773         bool input_flush_progress;
774         bool output_flush_progress;
775         bool input_use_buffer;
776         bool output_use_buffer;
777         bool ouput_egl_buffers;
778         OMX_BOOL m_use_output_pmem;
779         OMX_BOOL m_out_mem_region_smi;
780         OMX_BOOL m_out_pvt_entry_pmem;
781 
782         int pending_input_buffers;
783         int pending_output_buffers;
784         // bitmask array size for output side
785         unsigned int m_out_bm_count;
786         // bitmask array size for input side
787         unsigned int m_inp_bm_count;
788         //Input port Populated
789         OMX_BOOL m_inp_bPopulated;
790         //Output port Populated
791         OMX_BOOL m_out_bPopulated;
792         // encapsulate the waiting states.
793         unsigned int m_flags;
794 
795 #ifdef _ANDROID_
796         // Heap pointer to frame buffers
797         struct vidc_heap {
798             sp<MemoryHeapBase>    video_heap_ptr;
799         };
800         struct vidc_heap *m_heap_ptr;
801         unsigned int m_heap_count;
802 #endif //_ANDROID_
803         // store I/P PORT state
804         OMX_BOOL m_inp_bEnabled;
805         // store O/P PORT state
806         OMX_BOOL m_out_bEnabled;
807         OMX_U32 m_in_alloc_cnt;
808         OMX_U8                m_cRole[OMX_MAX_STRINGNAME_SIZE];
809         // Platform specific details
810         OMX_QCOM_PLATFORM_PRIVATE_LIST      *m_platform_list;
811         OMX_QCOM_PLATFORM_PRIVATE_ENTRY     *m_platform_entry;
812         OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO *m_pmem_info;
813         // SPS+PPS sent as part of set_config
814         OMX_VENDOR_EXTRADATATYPE            m_vendor_config;
815 
816         /*Variables for arbitrary Byte parsing support*/
817         frame_parse m_frame_parser;
818         omx_cmd_queue m_input_pending_q;
819         omx_cmd_queue m_input_free_q;
820         bool arbitrary_bytes;
821         OMX_BUFFERHEADERTYPE  h264_scratch;
822         OMX_BUFFERHEADERTYPE  *psource_frame;
823         OMX_BUFFERHEADERTYPE  *pdest_frame;
824         OMX_BUFFERHEADERTYPE  *m_inp_heap_ptr;
825         OMX_BUFFERHEADERTYPE  **m_phdr_pmem_ptr;
826         unsigned int m_heap_inp_bm_count;
827         codec_type codec_type_parse;
828         bool first_frame_meta;
829         unsigned frame_count;
830         unsigned nal_count;
831         unsigned nal_length;
832         bool look_ahead_nal;
833         int first_frame;
834         unsigned char *first_buffer;
835         int first_frame_size;
836         unsigned char m_hwdevice_name[80];
837         FILE *m_device_file_ptr;
838         enum vc1_profile_type m_vc1_profile;
839         OMX_S64 h264_last_au_ts;
840         OMX_U32 h264_last_au_flags;
841         OMX_U32 m_demux_offsets[8192];
842         OMX_U32 m_demux_entries;
843         OMX_U32 m_disp_hor_size;
844         OMX_U32 m_disp_vert_size;
845 
846         OMX_S64 prev_ts;
847         bool rst_prev_ts;
848         OMX_U32 frm_int;
849 
850         struct vdec_allocatorproperty op_buf_rcnfg;
851         bool in_reconfig;
852         OMX_NATIVE_WINDOWTYPE m_display_id;
853         h264_stream_parser *h264_parser;
854         OMX_U32 client_extradata;
855 #ifdef _ANDROID_
856         bool m_debug_timestamp;
857         bool perf_flag;
858         OMX_U32 proc_frms, latency;
859         perf_metrics fps_metrics;
860         perf_metrics dec_time;
861         bool m_enable_android_native_buffers;
862         bool m_use_android_native_buffers;
863         bool m_debug_extradata;
864         bool m_debug_concealedmb;
865         bool m_reject_avc_1080p_mp;
866 #endif
867 #ifdef MAX_RES_1080P
868         MP4_Utils mp4_headerparser;
869 #endif
870 
871         struct h264_mv_buffer {
872             unsigned char* buffer;
873             int size;
874             int count;
875             int pmem_fd;
876             int offset;
877         };
878         h264_mv_buffer h264_mv_buff;
879 
880         struct meta_buffer {
881             unsigned char* buffer;
882             int size;
883             int count;
884             int pmem_fd;
885             int pmem_fd_iommu;
886             int offset;
887         };
888         meta_buffer meta_buff;
889         extra_data_handler extra_data_handle;
890 #ifdef _ANDROID_
891         DivXDrmDecrypt* iDivXDrmDecrypt;
892 #endif //_ANDROID_
893         OMX_PARAM_PORTDEFINITIONTYPE m_port_def;
894         omx_time_stamp_reorder time_stamp_dts;
895         desc_buffer_hdr *m_desc_buffer_ptr;
896         bool secure_mode;
897         bool external_meta_buffer;
898         bool external_meta_buffer_iommu;
899         OMX_QCOM_EXTRADATA_FRAMEINFO *m_extradata;
900         bool codec_config_flag;
901 #ifdef _MSM8974_
902         int capture_capability;
903         int output_capability;
904         bool streaming[MAX_PORT];
905         OMX_CONFIG_RECTTYPE rectangle;
906         int prev_n_filled_len;
907 #endif
908         bool m_power_hinted;
909         OMX_ERRORTYPE power_module_register();
910         OMX_ERRORTYPE power_module_deregister();
911         bool msg_thread_created;
912         bool async_thread_created;
913 
914         OMX_VIDEO_PARAM_PROFILELEVELTYPE m_profile_lvl;
915         OMX_U32 m_profile;
916 
917         //variables to handle dynamic buffer mode
918         bool dynamic_buf_mode;
919         struct dynamic_buf_list *out_dynamic_list;
920 
921         //added for smoothstreaming
922         bool mInSmoothstreamingMode;
923 
924         unsigned int m_fill_output_msg;
925         bool client_set_fps;
926         class allocate_color_convert_buf
927         {
928             public:
929                 allocate_color_convert_buf();
930                 ~allocate_color_convert_buf();
931                 void set_vdec_client(void *);
932                 void update_client();
933                 bool set_color_format(OMX_COLOR_FORMATTYPE dest_color_format);
934                 bool get_color_format(OMX_COLOR_FORMATTYPE &dest_color_format);
935                 bool update_buffer_req();
936                 bool get_buffer_req(unsigned int &buffer_size);
937                 OMX_BUFFERHEADERTYPE* get_il_buf_hdr();
938                 OMX_BUFFERHEADERTYPE* get_il_buf_hdr(OMX_BUFFERHEADERTYPE *input_hdr);
939                 OMX_BUFFERHEADERTYPE* get_dr_buf_hdr(OMX_BUFFERHEADERTYPE *input_hdr);
940                 OMX_BUFFERHEADERTYPE* convert(OMX_BUFFERHEADERTYPE *header);
941                 OMX_BUFFERHEADERTYPE* queue_buffer(OMX_BUFFERHEADERTYPE *header);
942                 OMX_ERRORTYPE allocate_buffers_color_convert(OMX_HANDLETYPE hComp,
943                         OMX_BUFFERHEADERTYPE **bufferHdr,OMX_U32 port,OMX_PTR appData,
944                         OMX_U32 bytes);
945                 OMX_ERRORTYPE free_output_buffer(OMX_BUFFERHEADERTYPE *bufferHdr);
946             private:
947 #define MAX_COUNT 32
948                 omx_vdec *omx;
949                 bool enabled;
950                 OMX_COLOR_FORMATTYPE ColorFormat;
951                 void init_members();
952                 bool color_convert_mode;
953                 ColorConvertFormat dest_format;
954                 class omx_c2d_conv c2d;
955                 unsigned int allocated_count;
956                 unsigned int buffer_size_req;
957                 unsigned int buffer_alignment_req;
958                 OMX_QCOM_PLATFORM_PRIVATE_LIST      m_platform_list_client[MAX_COUNT];
959                 OMX_QCOM_PLATFORM_PRIVATE_ENTRY     m_platform_entry_client[MAX_COUNT];
960                 OMX_QCOM_PLATFORM_PRIVATE_PMEM_INFO m_pmem_info_client[MAX_COUNT];
961                 OMX_BUFFERHEADERTYPE  m_out_mem_ptr_client[MAX_COUNT];
962 #ifdef USE_ION
963                 struct vdec_ion op_buf_ion_info[MAX_COUNT];
964 #endif
965                 unsigned char *pmem_baseaddress[MAX_COUNT];
966                 int pmem_fd[MAX_COUNT];
967                 struct vidc_heap {
968                     sp<MemoryHeapBase>    video_heap_ptr;
969                 };
970                 struct vidc_heap m_heap_ptr[MAX_COUNT];
971         };
972 #if  defined (_MSM8960_) || defined (_MSM8974_)
973         allocate_color_convert_buf client_buffers;
974 #endif
975         struct video_decoder_capability m_decoder_capability;
976 #ifdef _MSM8974_
977         void send_codec_config();
978 #endif
979 };
980 
981 #ifdef _MSM8974_
982 enum instance_state {
983     MSM_VIDC_CORE_UNINIT_DONE = 0x0001,
984     MSM_VIDC_CORE_INIT,
985     MSM_VIDC_CORE_INIT_DONE,
986     MSM_VIDC_OPEN,
987     MSM_VIDC_OPEN_DONE,
988     MSM_VIDC_LOAD_RESOURCES,
989     MSM_VIDC_LOAD_RESOURCES_DONE,
990     MSM_VIDC_START,
991     MSM_VIDC_START_DONE,
992     MSM_VIDC_STOP,
993     MSM_VIDC_STOP_DONE,
994     MSM_VIDC_RELEASE_RESOURCES,
995     MSM_VIDC_RELEASE_RESOURCES_DONE,
996     MSM_VIDC_CLOSE,
997     MSM_VIDC_CLOSE_DONE,
998     MSM_VIDC_CORE_UNINIT,
999 };
1000 
1001 enum vidc_resposes_id {
1002     MSM_VIDC_DECODER_FLUSH_DONE = 0x11,
1003     MSM_VIDC_DECODER_EVENT_CHANGE,
1004 };
1005 
1006 #endif // _MSM8974_
1007 
1008 #endif // __OMX_VDEC_H__
1009