1/*
2 * Copyright (C) Texas Instruments - http://www.ti.com/
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 * Lesser General Public License for more details.
14 *
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
19 */
20
21#ifndef OMX_VIDDEC_UTILS__H
22#define OMX_VIDDEC_UTILS__H
23
24#define newmalloc(x) malloc(x)
25#define newfree(z) free(z)
26#ifdef ANDROID
27/* Log for Android system*/
28#include <utils/Log.h>
29#define LOG_TAG "TI_Video_Decoder"
30#endif
31#include <cutils/properties.h>
32
33#ifdef UNDER_CE
34    #include <windows.h>
35    #include <oaf_osal.h>
36    #include <omx_core.h>
37    #include <pthread.h>
38    #include <stdlib.h>
39#else
40    #define _XOPEN_SOURCE 600
41    #include <sys/select.h>
42    #include <signal.h>
43    #include <pthread.h>
44    #include <wchar.h>
45    #include <unistd.h>
46    #include <sys/types.h>
47    #include <malloc.h>
48    #include <memory.h>
49    #include <sys/wait.h>
50    #include <sys/types.h>
51    #include <sys/stat.h>
52    #include <fcntl.h>
53    #include <dbapi.h>
54    #include <string.h>
55    #include <stdio.h>
56    #include <dlfcn.h>
57    #include <stdarg.h>
58    #include <errno.h>
59    #include <sys/ioctl.h>
60    #include <sys/time.h>
61    #include <stdlib.h>
62    #include <semaphore.h>
63#endif
64
65#ifndef KHRONOS_1_1
66#define KHRONOS_1_1
67#endif
68
69#define KHRONOS_1_2
70#ifndef VIDDEC_SPARK_CODE
71    #define VIDDEC_SPARK_CODE
72#endif
73
74#ifndef VIDDEC_SN_R8_14
75    #define VIDDEC_SN_R8_14
76#endif
77
78#define VIDDEC_WAIT_CODE() sched_yield()
79
80#ifndef UNDER_CE
81#ifndef __ENV_CHANGE__
82#define __ENV_CHANGE__
83#endif
84#endif
85
86#ifndef VIDDEC_ACTIVATEPARSER
87    #define VIDDEC_ACTIVATEPARSER
88#endif
89
90#define VIDDEC_WMVPOINTERFIXED
91#define VIDDEC_HANDLE_FULL_STRM_PROP_OBJ
92
93#include <sched.h>
94#include <OMX_Core.h>
95#include <OMX_TI_Debug.h>
96#include "OMX_VideoDecoder.h"
97#include "OMX_VidDec_CustomCmd.h"
98#include "OMX_TI_Common.h"
99
100
101#ifdef KHRONOS_1_1
102typedef struct OMX_CONFIG_MACROBLOCKERRORMAPTYPE_TI {
103    OMX_U32 nSize;
104    OMX_VERSIONTYPE nVersion;
105    OMX_U32 nPortIndex;
106    OMX_U32 nErrMapSize;                /* Size of the Error Map in bytes*/
107    OMX_U8  ErrMap[(864 * 480) / 256]; /* Error map hint   */
108} OMX_CONFIG_MACROBLOCKERRORMAPTYPE_TI;
109#endif
110
111#define VIDDEC_MEMLEVELS 5
112typedef enum VIDDEC_ENUM_MEMLEVELS{
113    VIDDDEC_Enum_MemLevel0 = 0,
114    VIDDDEC_Enum_MemLevel1,
115    VIDDDEC_Enum_MemLevel2,
116    VIDDDEC_Enum_MemLevel3,
117    VIDDDEC_Enum_MemLevel4
118}VIDDEC_ENUM_MEMLEVELS;
119
120#include "LCML_DspCodec.h"
121#include "LCML_Types.h"
122#include "LCML_CodecInterface.h"
123
124#ifdef __PERF_INSTRUMENTATION__
125#include "perf.h"
126#endif
127
128/*#define RESOURCE_MANAGER_ENABLED*/
129#ifdef RESOURCE_MANAGER_ENABLED
130        #include <ResourceManagerProxyAPI.h>
131#endif
132
133#ifdef __ENV_CHANGE__
134    #ifndef ENV_CHANGE_DEF_AUTO
135        #define ENV_CHANGE_DEF_AUTO          "ON"
136    #endif
137    #ifndef ENV_CHANGE_DEF_VALUE
138        #define ENV_CHANGE_DEF_VALUE         "H264"
139    #endif
140    #define ENV_CHANGE_VAL_ON                "ON"
141    #define ENV_CHANGE_NAME_AUTO             "ENV_CHANGE_AUTO"
142    #define ENV_CHANGE_NAME_VALUE            "ENV_CHANGE_VALUE"
143    #define ENV_CHANGE_SET_H264              "H264"
144    #define ENV_CHANGE_SET_AVC               "AVC"
145    #define ENV_CHANGE_SET_H263              "H263"
146    #define ENV_CHANGE_SET_MPEG2             "MPEG2"
147    #define ENV_CHANGE_SET_MPEG4             "MPEG4"
148    #define ENV_CHANGE_SET_WMV9              "WMV"
149#ifdef VIDDEC_SPARK_CODE
150    #define ENV_CHANGE_SET_SPARK             "SPARK"
151#endif
152#endif
153
154#define VIDDEC_COMPONENTROLES_H263           "video_decoder.h263"
155#define VIDDEC_COMPONENTROLES_H264           "video_decoder.avc"
156#define VIDDEC_COMPONENTROLES_MPEG2          "video_decoder.mpeg2"
157#define VIDDEC_COMPONENTROLES_MPEG4          "video_decoder.mpeg4"
158#define VIDDEC_COMPONENTROLES_WMV9           "video_decoder.wmv"
159#ifdef VIDDEC_SPARK_CODE
160    #define VIDDEC_COMPONENTROLES_SPARK       "video_decoder.spark"
161#endif
162
163#define __STD_COMPONENT__
164
165/*
166 * MAX_PRIVATE_IN_BUFFERS and MAX_PRIVATE_OUT_BUFFERS must NOT be
167 * greater than MAX_PRIVATE_BUFFERS. MAX_PRIVATE_BUFFERS is set
168 * to 6 because 6 overlay buffers are currently being used for
169 * playback
170 */
171#define MAX_PRIVATE_IN_BUFFERS              6
172#define MAX_PRIVATE_OUT_BUFFERS             6
173#define MAX_PRIVATE_BUFFERS                 6
174#define NUM_OF_PORTS                        2
175#define VIDDEC_MAX_NAMESIZE                 128
176#define VIDDEC_NOPORT                       0xfffffffe
177#define VIDDEC_MPU                          50
178
179#define IUALG_CMD_SETSTATUS                 3
180
181#define VERSION_MAJOR                       1
182#ifdef KHRONOS_1_1
183#define VERSION_MINOR                       0
184#else
185#define VERSION_MINOR                       0
186#endif
187#define VERSION_REVISION                    0
188#define VERSION_STEP                        0
189
190#define VIDDEC_COLORFORMAT422               OMX_COLOR_FormatCbYCrY
191#define VIDDEC_COLORFORMAT420               OMX_COLOR_FormatYUV420Planar /*OMX_COLOR_FormatYUV420PackedPlanar is not working with OpenCore*/
192#define VIDDEC_COLORFORMATUNUSED            OMX_COLOR_FormatUnused
193
194#define VIDDEC_ZERO                         0
195#define VIDDEC_ONE                          1
196#define VIDDEC_MINUS                        -1
197#define VIDDEC_WMVHEADER                    20
198
199#define VIDDEC_BUFFERMINCOUNT                   VIDDEC_ONE
200#define VIDDEC_PORT_ENABLED                     OMX_TRUE
201#define VIDDEC_PORT_POPULATED                   OMX_FALSE
202#define VIDDEC_PORT_DOMAIN                      OMX_PortDomainVideo
203
204#define VIDDEC_DEFAULT_INPUT_BUFFER_SIZE        614400
205#define VIDDEC_DEFAULT_OUTPUT_BUFFER_SIZE       614400
206#define VIDDEC_DEFAULT_WIDTH                    640
207#define VIDDEC_DEFAULT_HEIGHT                   480
208#define VIDDEC_DEFAULT_PROCESSMODE              0      /* 0=frmmode; 1=strmmode */
209#define VIDDEC_DEFAULT_H264BITSTRMFMT           0      /* 0=bytestrm; 1->4=NAL-bitstrm */
210#define MAX_CCD_CNT                             128
211#define MAX_NALUDATA_CNT                        128
212
213#define VIDDEC_INPUT_PORT_COMPRESSIONFORMAT      OMX_VIDEO_CodingMPEG4
214#define VIDDEC_OUTPUT_PORT_COMPRESSIONFORMAT      OMX_VIDEO_CodingUnused
215#define VIDDEC_INPUT_PORT_BUFFERSUPPLIER        VIDDEC_ZERO
216#define VIDDEC_OUTPUT_PORT_BUFFERSUPPLIER       VIDDEC_ZERO
217
218#define VIDDEC_MIMETYPEH263                     "H263"
219#define VIDDEC_MIMETYPEH264                     "H264"
220#define VIDDEC_MIMETYPEMPEG4                    "MPEG4"
221#define VIDDEC_MIMETYPEWMV                      "WMV"
222#define VIDDEC_MIMETYPEYUV                      "YUV"
223#ifdef VIDDEC_SPARK_CODE
224    #define VIDDEC_MIMETYPEWMV_SPARK            "SPARK"
225#endif
226
227#define VIDDEC_INPUT_PORT_NATIVERENDER          NULL
228#define VIDDEC_INPUT_PORT_STRIDE                VIDDEC_MINUS
229#define VIDDEC_INPUT_PORT_SLICEHEIGHT           VIDDEC_MINUS
230
231#ifdef __STD_COMPONENT__
232    #define VIDDEC_INPUT_PORT_BITRATE           (64000)
233    #define VIDDEC_INPUT_PORT_FRAMERATE         (15 << 16)
234#else
235    #define VIDDEC_INPUT_PORT_BITRATE            VIDDEC_MINUS
236    #define VIDDEC_INPUT_PORT_FRAMERATE          VIDDEC_MINUS
237#endif
238#define VIDDEC_INPUT_PORT_FLAGERRORCONCEALMENT  OMX_FALSE
239
240#define VIDDEC_OUTPUT_PORT_NATIVERENDER         NULL
241#define VIDDEC_OUTPUT_PORT_STRIDE               VIDDEC_ZERO
242#define VIDDEC_OUTPUT_PORT_SLICEHEIGHT          VIDDEC_ZERO
243#define VIDDEC_OUTPUT_PORT_BITRATE              VIDDEC_ZERO
244#define VIDDEC_OUTPUT_PORT_FRAMERATE            VIDDEC_ZERO
245#define VIDDEC_OUTPUT_PORT_FLAGERRORCONCEALMENT OMX_FALSE
246
247#define VIDDEC_FACTORFORMAT422                  2
248#define VIDDEC_FACTORFORMAT420                  (1.5)
249
250#define VIDDEC_DEFAULT_MPEG4_PORTINDEX              VIDDEC_INPUT_PORT
251#define VIDDEC_DEFAULT_MPEG4_SLICEHEADERSPACING     VIDDEC_ZERO
252#define VIDDEC_DEFAULT_MPEG4_SVH                    OMX_FALSE
253#define VIDDEC_DEFAULT_MPEG4_GOV                    OMX_FALSE
254#define VIDDEC_DEFAULT_MPEG4_PFRAMES                VIDDEC_MINUS
255#define VIDDEC_DEFAULT_MPEG4_BFRAMES                VIDDEC_MINUS
256#define VIDDEC_DEFAULT_MPEG4_IDCVLCTHRESHOLD        VIDDEC_MINUS
257#define VIDDEC_DEFAULT_MPEG4_ACPRED                 OMX_FALSE
258#define VIDDEC_DEFAULT_MPEG4_MAXPACKETSIZE          VIDDEC_DEFAULT_INPUT_BUFFER_SIZE
259#define VIDDEC_DEFAULT_MPEG4_TIMEINCRES             VIDDEC_MINUS
260#define VIDDEC_DEFAULT_MPEG4_PROFILE                OMX_VIDEO_MPEG4ProfileSimple
261#define VIDDEC_DEFAULT_MPEG4_LEVEL                  OMX_VIDEO_MPEG4Level1
262#define VIDDEC_DEFAULT_MPEG4_ALLOWEDPICTURETYPES    VIDDEC_MINUS
263#define VIDDEC_DEFAULT_MPEG4_HEADEREXTENSION        VIDDEC_ONE
264#define VIDDEC_DEFAULT_MPEG4_REVERSIBLEVLC          OMX_FALSE
265
266#define VIDDEC_DEFAULT_MPEG2_PORTINDEX              VIDDEC_INPUT_PORT
267#define VIDDEC_DEFAULT_MPEG2_PFRAMES                VIDDEC_MINUS
268#define VIDDEC_DEFAULT_MPEG2_BFRAMES                VIDDEC_MINUS
269#define VIDDEC_DEFAULT_MPEG2_PROFILE                OMX_VIDEO_MPEG2ProfileSimple
270#define VIDDEC_DEFAULT_MPEG2_LEVEL                  OMX_VIDEO_MPEG2LevelLL
271#define VIDDEC_DEFAULT_H264_PORTINDEX                 VIDDEC_INPUT_PORT
272#define VIDDEC_DEFAULT_H264_SLICEHEADERSPACING        VIDDEC_ZERO
273#define VIDDEC_DEFAULT_H264_PFRAMES                   VIDDEC_MINUS
274#define VIDDEC_DEFAULT_H264_BFRAMES                   VIDDEC_MINUS
275#define VIDDEC_DEFAULT_H264_USEHADAMARD               OMX_FALSE
276#define VIDDEC_DEFAULT_H264_REFFRAMES                 VIDDEC_MINUS
277#define VIDDEC_DEFAULT_H264_REFIDX10ACTIVEMINUS1      VIDDEC_MINUS
278#define VIDDEC_DEFAULT_H264_REFIDX11ACTIVEMINUS1      VIDDEC_MINUS
279#define VIDDEC_DEFAULT_H264_ENABLEUEP                 OMX_FALSE
280#define VIDDEC_DEFAULT_H264_ENABLEFMO                 OMX_FALSE
281#define VIDDEC_DEFAULT_H264_ENABLEASO                 OMX_FALSE
282#define VIDDEC_DEFAULT_H264_ENABLERS                  OMX_FALSE
283#define VIDDEC_DEFAULT_H264_PROFILE                   OMX_VIDEO_AVCProfileBaseline
284#define VIDDEC_DEFAULT_H264_LEVEL                     OMX_VIDEO_AVCLevel1
285#define VIDDEC_DEFAULT_H264_ALLOWEDPICTURETYPES       VIDDEC_MINUS
286#define VIDDEC_DEFAULT_H264_FRAMEMBSONLY              OMX_FALSE
287#define VIDDEC_DEFAULT_H264_MBAFF                     OMX_FALSE
288#define VIDDEC_DEFAULT_H264_ENTROPYCODINGCABAC        OMX_FALSE
289#define VIDDEC_DEFAULT_H264_WEIGHTEDPPREDICTION       OMX_FALSE
290#define VIDDEC_DEFAULT_H264_WEIGHTEDBIPREDICITONMODE  VIDDEC_MINUS
291#define VIDDEC_DEFAULT_H264_CONSTIPRED                OMX_FALSE
292#define VIDDEC_DEFAULT_H264_DIRECT8X8INFERENCE        OMX_FALSE
293#define VIDDEC_DEFAULT_H264_DIRECTSPATIALTEMPORAL     OMX_FALSE
294#define VIDDEC_DEFAULT_H264_CABACINITIDC              VIDDEC_MINUS
295#define VIDDEC_DEFAULT_H264_LOOPFILTERMODE            OMX_VIDEO_AVCLoopFilterDisable
296
297#define VIDDEC_DEFAULT_H263_PORTINDEX                 VIDDEC_INPUT_PORT
298#define VIDDEC_DEFAULT_H263_PFRAMES                   VIDDEC_MINUS
299#define VIDDEC_DEFAULT_H263_BFRAMES                   VIDDEC_MINUS
300#define VIDDEC_DEFAULT_H263_PROFILE                   OMX_VIDEO_H263ProfileBaseline
301#define VIDDEC_DEFAULT_H263_LEVEL                     OMX_VIDEO_H263Level10
302#define VIDDEC_DEFAULT_H263_PLUSPTYPEALLOWED          OMX_FALSE
303#define VIDDEC_DEFAULT_H263_ALLOWEDPICTURETYPES       OMX_VIDEO_PictureTypeMax
304#define VIDDEC_DEFAULT_H263_FORCEROUNDINGTYPETOZERO   OMX_TRUE
305#define VIDDEC_DEFAULT_H263_PICTUREHEADERREPETITION   0
306#define VIDDEC_DEFAULT_H263_GOBHEADERINTERVAL         1
307
308#define VIDDEC_DEFAULT_WMV_PORTINDEX                  VIDDEC_INPUT_PORT
309#define VIDDEC_DEFAULT_WMV_FORMAT                     OMX_VIDEO_WMVFormat9
310
311#define VIDDEC_PIPE_WRITE                             VIDDEC_ONE
312#define VIDDEC_PIPE_READ                              VIDDEC_ZERO
313
314#define VIDDEC_PADDING_FULL                           256
315#define VIDDEC_PADDING_HALF                           VIDDEC_PADDING_FULL / 2
316
317#define VIDDEC_ALIGNMENT                              4
318
319#define VIDDEC_CLEARFLAGS                             0
320#define H264VDEC_SN_MAX_NALUNITS                      1200
321
322#define VIDDEC_RM_FREC_MPEG4_QCIF                     30
323#define VIDDEC_RM_FREC_MPEG4_CIF                      80
324#define VIDDEC_RM_FREC_MPEG4_VGA                      165
325#define VIDDEC_RM_FREC_MPEG4_720P                     401
326
327#define VIDDEC_RM_FREC_MPEG2_QCIF                     30
328#define VIDDEC_RM_FREC_MPEG2_CIF                      80
329#define VIDDEC_RM_FREC_MPEG2_VGA                      165
330
331#define VIDDEC_RM_FREC_H263_QCIF                      25
332#define VIDDEC_RM_FREC_H263_CIF                       60
333#define VIDDEC_RM_FREC_H263_VGA                       165
334
335#define VIDDEC_RM_FREC_H264_QCIF                      85
336#define VIDDEC_RM_FREC_H264_CIF                       160
337#define VIDDEC_RM_FREC_H264_VGA                       260
338
339#define VIDDEC_RM_FREC_WMV_QCIF                       55
340#define VIDDEC_RM_FREC_WMV_CIF                        100
341#define VIDDEC_RM_FREC_WMV_VGA                        300
342
343#ifdef VIDDEC_SPARK_CODE
344 #define VIDDEC_RM_FREC_SPARK_QCIF                    55
345 #define VIDDEC_RM_FREC_SPARK_CIF                     100
346 #define VIDDEC_RM_FREC_SPARK_VGA                     300
347#endif
348
349#define VIDDEC_MIN_WIDTH                              176
350#define VIDDEC_MIN_HEIGHT                             144
351
352#define VIDDEC_QCIF_WIDTH                             176
353#define VIDDEC_QCIF_HEIGHT                            144
354
355#define VIDDEC_QVGA_WIDTH                             320
356#define VIDDEC_QVGA_HEIGHT                            240
357
358#define VIDDEC_CIF_WIDTH                              352
359#define VIDDEC_CIF_HEIGHT                             288
360
361#define VIDDEC_VGA_WIDTH                              640
362#define VIDDEC_VGA_HEIGHT                             480
363
364#define VIDDEC_D1MAX_WIDTH                            864
365#define VIDDEC_D1MAX_HEIGHT                           VIDDEC_D1MAX_WIDTH
366
367/* In the current release the suport for : VIDDEC_MAX_FRAMERATE  & VIDDEC_MAX_BITRATE
368 * is not provided by the algorithm. But is require to set this field to a non-zero value */
369#define VIDDEC_MAX_FRAMERATE                        30000  /* Max frame rate to be suported * 1000 */
370#define VIDDEC_MAX_BITRATE                        8000000  /* Max bit rate (in bits per second) to be suported */
371
372#define VIDDEC_WMV_PROFILE_ID0                          0
373#define VIDDEC_WMV_PROFILE_ID1                          1
374#define VIDDEC_WMV_PROFILE_ID2                          2
375#define VIDDEC_WMV_PROFILE_ID3                          3
376#define VIDDEC_WMV_PROFILE_ID4                          4
377#define VIDDEC_WMV_PROFILE_ID5                          5
378#define VIDDEC_WMV_PROFILE_ID6                          6
379#define VIDDEC_WMV_PROFILE_ID7                          7
380#define VIDDEC_WMV_PROFILE_ID8                          8
381
382#define VIDDEC_MAX_QUEUE_SIZE                           256
383#define VIDDEC_WMV_BUFFER_OFFSET                        (255 - 4)
384#define VIDDEC_WMV_ELEMSTREAM                           0
385#define VIDDEC_WMV_RCVSTREAM                            1
386
387#define VIDDEC_SN_WMV_ELEMSTREAM                        1
388#define VIDDEC_SN_WMV_RCVSTREAM                         2
389
390#define CSD_POSITION                                    51 /*Codec Specific Data position on the "stream propierties object"(ASF spec)*/
391
392#ifndef KHRONOS_1_2
393 #define OMX_BUFFERFLAG_CODECCONFIG 0x00000080
394#endif
395
396typedef struct VIDDEC_CUSTOM_PARAM
397{
398    unsigned char cCustomParamName[128];
399    OMX_INDEXTYPE nCustomParamIndex;
400} VIDDEC_CUSTOM_PARAM;
401
402typedef enum VIDDEC_CUSTOM_PARAM_INDEX
403{
404#ifdef KHRONOS_1_2
405    VideoDecodeCustomParamProcessMode = (OMX_IndexVendorStartUnused + 1),
406#else
407    VideoDecodeCustomParamProcessMode = (OMX_IndexIndexVendorStartUnused + 1),
408#endif
409    VideoDecodeCustomParamH264BitStreamFormat,
410    VideoDecodeCustomParamWMVProfile,
411    VideoDecodeCustomParamWMVFileType,
412    VideoDecodeCustomParamParserEnabled,
413    VideoDecodeCustomParamIsNALBigEndian,
414#ifdef VIDDEC_SPARK_CODE
415    VideoDecodeCustomParamIsSparkInput,
416#endif
417    VideoDecodeCustomConfigDebug
418
419#ifdef ANDROID /*To be use by opencore multimedia framework*/
420    ,
421    PV_OMX_COMPONENT_CAPABILITY_TYPE_INDEX = 0xFF7A347
422#endif
423} VIDDEC_CUSTOM_PARAM_INDEX;
424
425typedef enum VIDDEC_LCML_STATES
426{
427    VidDec_LCML_State_Unload = 0,
428    VidDec_LCML_State_Load,
429    VidDec_LCML_State_Init,
430    VidDec_LCML_State_Pause,
431    VidDec_LCML_State_Start,
432    VidDec_LCML_State_Stop,
433    VidDec_LCML_State_Destroy
434} VIDDEC_LCML_STATES;
435
436typedef enum VIDDEC_RMPROXY_STATES
437{
438    VidDec_RMPROXY_State_Unload = 0,
439    VidDec_RMPROXY_State_Load,
440    VidDec_RMPROXY_State_Registered,
441} VIDDEC_RMPROXY_STATES;
442
443/* ======================================================================= */
444/**
445* @def WMV9DEC_YUVFORMAT_XYZ : YUV ouput chroma format.
446*/
447/* ==================================================================== */
448#define WMV9VIDDEC_YUVFORMAT_PLANAR420 (1)
449#define WMV9VIDDEC_YUVFORMAT_INTERLEAVED422 (4)
450
451/* ======================================================================= */
452/**
453* @def MP4VDEC_YUVFORMAT_XYZ : YUV ouput chroma format.
454*/
455/* ==================================================================== */
456#define MP4VIDDEC_YUVFORMAT_PLANAR420 (1)
457#define MP4VIDDEC_YUVFORMAT_INTERLEAVED422 (4)
458
459/* ======================================================================= */
460/**
461* @def H264VDEC_YUVFORMAT_XYZ : YUV ouput chroma format.
462*/
463/* ==================================================================== */
464#define H264VIDDEC_YUVFORMAT_PLANAR420 (0)
465#define H264VIDDEC_YUVFORMAT_INTERLEAVED422 (1)
466
467#define MP2VIDDEC_YUVFORMAT_PLANAR420 (1)
468#define MP2VIDDEC_YUVFORMAT_INTERLEAVED422 (4)
469
470/* ======================================================================= */
471/**
472* @def MP4VDEC_YUVFORMAT_XYZ : YUV ouput chroma format.
473*/
474/* ==================================================================== */
475#define SPARKVIDDEC_YUVFORMAT_PLANAR420 (1)
476#define SPARKVIDDEC_YUVFORMAT_INTERLEAVED422 (4)
477
478typedef enum VIDDEC_PORT_INDEX
479{
480    VIDDEC_INPUT_PORT,
481    VIDDEC_OUTPUT_PORT
482}VIDDEC_PORT_INDEX;
483
484typedef enum VIDDEC_DEFAULT_INPUT_INDEX
485{
486    VIDDEC_DEFAULT_INPUT_INDEX_H263,
487    VIDDEC_DEFAULT_INPUT_INDEX_H264,
488    VIDDEC_DEFAULT_INPUT_INDEX_MPEG4,
489    VIDDEC_DEFAULT_INPUT_INDEX_WMV9,
490    VIDDEC_DEFAULT_INPUT_INDEX_MPEG2,
491#ifdef VIDDEC_SPARK_CODE
492    VIDDEC_DEFAULT_INPUT_INDEX_SPARK,
493#endif
494    VIDDEC_DEFAULT_INPUT_INDEX_MAX = 0x7ffffff
495}VIDDEC_DEFAULT_INPUT_INDEX;
496
497typedef enum VIDDEC_DEFAULT_OUTPUT_INDEX
498{
499    VIDDEC_DEFAULT_OUTPUT_INDEX_INTERLEAVED422,
500    VIDDEC_DEFAULT_OUTPUT_INDEX_PLANAR420,
501    VIDDEC_DEFAULT_OUTPUT_INDEX_MAX = 0x7ffffff
502}VIDDEC_DEFAULT_OUTPUT_INDEX;
503
504typedef enum VIDDEC_BUFFER_OWNER
505{
506    VIDDEC_BUFFER_WITH_CLIENT = 0x0,
507    VIDDEC_BUFFER_WITH_COMPONENT,
508    VIDDEC_BUFFER_WITH_DSP,
509    VIDDEC_BUFFER_WITH_TUNNELEDCOMP
510} VIDDEC_BUFFER_OWNER;
511
512typedef enum VIDDEC_TYPE_ALLOCATE
513{
514    VIDDEC_TALLOC_USEBUFFER,
515    VIDDEC_TALLOC_ALLOCBUFFER
516}VIDDEC_TYPE_ALLOCATE;
517
518typedef enum VIDDEC_INIT_VALUE
519{
520    VIDDEC_INIT_ALL,
521    VIDDEC_INIT_STRUCTS,
522    VIDDEC_INIT_VARS,
523    VIDDEC_INIT_H263,
524    VIDDEC_INIT_H264,
525    VIDDEC_INIT_MPEG2,
526    VIDDEC_INIT_MPEG4,
527    VIDDEC_INIT_WMV9,
528#ifdef VIDDEC_SPARK_CODE
529    VIDDEC_INIT_SPARK,
530#endif
531    VIDDEC_INIT_PLANAR420,
532    VIDDEC_INIT_INTERLEAVED422,
533    VIDDEC_INIT_IDLEEXECUTING,
534    VIIDE_INIT_MAX = 0x7ffffff
535}VIDDEC_INIT_VALUE;
536
537typedef enum VIDDEC_WMV_PROFILES
538{
539    VIDDEC_WMV_PROFILE0,
540    VIDDEC_WMV_PROFILE1,
541    VIDDEC_WMV_PROFILE2,
542    VIDDEC_WMV_PROFILE3,
543    VIDDEC_WMV_PROFILE4,
544    VIDDEC_WMV_PROFILE5,
545    VIDDEC_WMV_PROFILE6,
546    VIDDEC_WMV_PROFILE7,
547    VIDDEC_WMV_PROFILE8,
548    VIDDEC_WMV_PROFILEMAX
549}VIDDEC_WMV_PROFILES;
550
551typedef struct VIDDEC_BUFFER_PRIVATE
552{
553    OMX_BUFFERHEADERTYPE* pBufferHdr;
554    OMX_PTR pUalgParam;
555    OMX_U32 nUalgParamSize;
556    VIDDEC_BUFFER_OWNER eBufferOwner;
557    VIDDEC_TYPE_ALLOCATE bAllocByComponent;
558    OMX_U32 nNumber;
559    OMX_U8* pOriginalBuffer;
560#ifdef VIDDEC_WMVPOINTERFIXED
561     OMX_U8* pTempBuffer;
562#endif
563} VIDDEC_BUFFER_PRIVATE;
564
565/*structures and defines for Circular Buffer*/
566#define VIDDEC_CBUFFER_LOCK
567#define MAX_MULTIPLY                        4
568#define CBUFFER_SIZE                        MAX_PRIVATE_BUFFERS * MAX_MULTIPLY
569
570typedef enum VIDDEC_QUEUE_TYPES {
571    VIDDEC_QUEUE_OMX_U32,
572    VIDDEC_QUEUE_OMX_MARKTYPE
573} VIDDEC_QUEUE_TYPES;
574
575typedef struct VIDDEC_QUEUE_TYPE {
576    OMX_PTR Elements;
577    OMX_U32 CounterElements[VIDDEC_MAX_QUEUE_SIZE];
578    OMX_U32 nHead;
579    OMX_S32 nTail;
580    OMX_U32 nElements;
581    OMX_U32 nErrorCount;
582    pthread_mutex_t mMutex;
583}VIDDEC_QUEUE_TYPE;
584
585typedef enum VIDDEC_CBUFFER_TYPE {
586    VIDDEC_CBUFFER_MARKDATA,
587    VIDDEC_CBUFFER_TIMESTAMP,
588    VIDDEC_CBUFFER_CMDMARKDATA
589} VIDDEC_CBUFFER_TYPE;
590
591typedef struct VIDDEC_CIRCULAR_BUFFER {
592    OMX_PTR pElement[CBUFFER_SIZE];
593    VIDDEC_CBUFFER_TYPE nType;
594#ifdef VIDDEC_CBUFFER_LOCK
595    pthread_mutex_t* m_lock;
596#endif
597    OMX_U8 nTail;
598    OMX_U8 nHead;
599    OMX_U8 nCount;
600} VIDDEC_CIRCULAR_BUFFER;
601
602typedef struct VIDDEC_CBUFFER_BUFFERFLAGS{
603    OMX_TICKS       nTimeStamp;
604    OMX_U32         nFlags;
605    OMX_U32         nTickCount;
606    OMX_PTR         pMarkData;
607    OMX_HANDLETYPE  hMarkTargetComponent;
608} VIDDEC_CBUFFER_BUFFERFLAGS;
609
610typedef struct VIDDEC_PORT_TYPE
611{
612    OMX_HANDLETYPE hTunnelComponent;
613    OMX_U32 nTunnelPort;
614    OMX_BUFFERSUPPLIERTYPE eSupplierSetting;
615    VIDDEC_BUFFER_PRIVATE* pBufferPrivate[MAX_PRIVATE_BUFFERS];
616    OMX_U8 nBufferCnt;
617    VIDDEC_CIRCULAR_BUFFER eTimeStamp;
618} VIDDEC_PORT_TYPE;
619
620typedef struct VIDDEC_MUTEX{
621    OMX_BOOL bEnabled;
622    OMX_BOOL bSignaled;
623    OMX_BOOL bInitialized;
624    OMX_S32 nErrorExist;
625    pthread_mutex_t mutex;
626    pthread_cond_t condition;
627} VIDDEC_MUTEX;
628
629typedef struct VIDDEC_SEMAPHORE{
630    OMX_BOOL bEnabled;
631    OMX_BOOL bSignaled;
632    OMX_BOOL bInitialized;
633    OMX_S32 nErrorExist;
634    sem_t sSemaphore;
635} VIDDEC_SEMAPHORE;
636
637#ifdef VIDDEC_ACTIVATEPARSER
638typedef struct VIDDEC_Point{
639    OMX_S32 nX;
640    OMX_S32 nY;
641}VIDDEC_Point;
642
643typedef struct VIDDEC_Rect{
644    VIDDEC_Point sTl;
645    VIDDEC_Point sBr;
646}VIDDEC_Rect;
647
648typedef struct VIDDEC_Size{
649    OMX_S32 nWidth;
650    OMX_S32 nHeight;
651}VIDDEC_Size;
652
653typedef struct VIDDEC_VideoPictureHeader{
654    OMX_U32 nOptions;
655    OMX_S32 nProfile;
656    OMX_S32 nLevel;
657    OMX_S32 nVersion;
658    OMX_U8* cnOptional;
659    VIDDEC_Size sSizeInMemory;
660    VIDDEC_Rect sDisplayedRect;
661    OMX_TICKS nPresentationTimestamp;
662    OMX_TICKS nDecodingTimestamp;
663    OMX_U32 nPreDecoderBufferSize;
664    OMX_U32 nPostDecoderBufferSize;
665    OMX_U32 nPictureNumber;
666    OMX_U32 nPictureLayer;
667    OMX_U8* pcSupplementalData;
668    OMX_BOOL bIsRandomAccessible;
669    OMX_S32 nRandomAccessBufferingPeriod;
670    OMX_U32 nRandomAccessBufferOccupancy;
671}VIDDEC_VideoPictureHeader;
672
673typedef struct VIDDEC_MPEG4VisualVbvParams{
674    OMX_TICKS nBitRate;
675    OMX_U32 nVbvBufferSize;
676    OMX_U32 nVbvOccupancy;
677}VIDDEC_MPEG4VisualVbvParams;
678
679typedef struct VIDDEC_MPEG4VisualVOLHeader{
680    OMX_U32 nVideoObjectLayerId;
681    OMX_BOOL bShortVideoHeader;
682    OMX_BOOL bRandomAccessibleVOL;
683    OMX_U32 nVideoObjectTypeIndication;
684    OMX_U32 nVideoObjectLayerVerId;
685    OMX_U32 nVideoObjectLayerPriority;
686    OMX_U32 nAspectRatioNum;
687    OMX_U32 nAspectRatioDenom;
688    VIDDEC_MPEG4VisualVbvParams sVbvParams;
689    OMX_U16 nVOPTimeIncrementResolution;
690    OMX_BOOL bnFnXedVopRate;
691    OMX_U16 nFnXedVOPTimeIncrement;
692    OMX_BOOL bDataPartitioning;
693    OMX_BOOL bReversibleVLC;
694    OMX_U8* pcUserData;
695}VIDDEC_MPEG4VisualVOLHeader ;
696
697typedef struct VIDDEC_MPEG4YuvConversionMatrix{
698    OMX_S32 iPostOffset;
699    OMX_S32 iMatrix;
700    OMX_S32 iPreOffset;
701}VIDDEC_MPEG4YuvConversionMatrix;
702
703typedef struct VIDDEC_MPEG4YuvFormat{
704    OMX_U32 iCoefficients;
705    OMX_U32 iPattern;
706    OMX_U32 iDataLayout;
707    VIDDEC_MPEG4YuvConversionMatrix * iYuv2RgbMatrix;
708    VIDDEC_MPEG4YuvConversionMatrix * iRgb2YuvMatrix;
709    OMX_U32 iAspectRatioNum;
710    OMX_U32 iAspectRatioDenom;
711}VIDDEC_MPEG4YuvFormat;
712
713typedef struct VIDDEC_MPEG4UncompressedVideoFormat{
714    OMX_U32 iDataFormat;
715    VIDDEC_MPEG4YuvFormat iYuvFormat;
716    OMX_U32 iRgbFormat;
717}VIDDEC_MPEG4UncompressedVideoFormat;
718
719typedef struct VIDDEC_AVC_ParserParam {
720    OMX_U32 nBitPosTemp;
721    OMX_U32 nForbiddenZeroBit;
722    OMX_U32 nNalRefIdc;
723    OMX_U32 nProfileIdc;
724    OMX_U32 nConstraintSet0Flag;
725    OMX_U32 nConstraintSet1Flag;
726    OMX_U32 nConstraintSet2Flag;
727    OMX_U32 nReservedZero5bits;
728    OMX_U32 nLevelIdc;
729    OMX_U32 nSeqParameterSetId;
730    OMX_U32 nLog2MaxFrameNumMinus4;
731    OMX_U32 nPicOrderCntType;
732    OMX_U32 nLog2MaxPicOrderCntLsbMinus4;
733    OMX_S32 nOffsetForNonRefPic;
734    OMX_S32 nOffsetForTopToBottomField;
735    OMX_U32 nNumRefFramesInPicOrderCntCycle;
736    OMX_U32 nNumRefFrames;
737    OMX_S32 nGapsInFrameNumValueAllowedFlag;
738    OMX_U32 nPicWidthInMbsMinus1;
739    OMX_U32 nPicHeightInMapUnitsMinus1;
740    OMX_U32 nFrameMbsOnlyFlag;
741    OMX_S32 nMBAdaptiveFrameFieldFlag ;
742    OMX_U32 nDirect8x8InferenceFlag;
743    OMX_U32 nFrameCroppingFlag;
744    OMX_U32 nFrameCropLeftOffset;
745    OMX_U32 nFrameCropRightOffset;
746    OMX_U32 nFrameCropTopOffset;
747    OMX_U32 nFrameCropBottomOffset;
748}VIDDEC_AVC_ParserParam;
749
750typedef struct VIDDEC_MPEG4_ParserParam {
751    OMX_U32 nIsVisualObjectIdentifier;
752    OMX_U32 nVisualObjectType;
753    OMX_U32 nVideoSignalType;
754    OMX_U32 nVideoFormat;
755    OMX_U32 nVideoRange;
756    OMX_U32 nColorDescription;
757    OMX_U32 NBitZero;
758    OMX_U32 nVideoObjectTypeIndication;
759    OMX_U32 nIsVisualObjectLayerIdentifier;
760    OMX_U32 nLayerVerId;
761    OMX_U32 nLayerPriority;
762    OMX_U32 nAspectRadio;
763    OMX_U32 nParWidth;
764    OMX_U32 nParHeight;
765    OMX_U32 nControlParameters;
766    OMX_U32 nChromaFormat;
767    OMX_U32 nLowDelay;
768    OMX_U32 nVbvParameters;
769    OMX_U32 nBitRate;
770    OMX_U32 nFirstHalfVbvBufferSize;
771    OMX_U32 nLatterHalfVbvBufferSize;
772    OMX_U32 nFirstHalfVbvOccupancy;
773    OMX_U32 nLatterHalfVbvOccupancy;
774    OMX_U32 nLayerShape;
775    OMX_U32 nTimeIncrementResolution;
776    OMX_U32 nFnXedVopRate;
777    OMX_U32 nNum_bits;
778    OMX_U32 nInterlaced;
779    OMX_U32 nObmc;
780    OMX_U32 nUFEP;
781    OMX_U32 NSpriteNotSupported;
782    OMX_U32 nNot8Bit;
783    OMX_U32 nQuantPrecision;
784    OMX_U32 nBitsPerPnXel;
785    OMX_U32 nIsInverseQuantMethodFirst;
786    OMX_U32 nComplexityEstimationDisable;
787    OMX_U32 nIsResyncMarkerDisabled;
788    OMX_U32 nIsDataPartitioned;
789    OMX_U32 nRvlc;
790    OMX_U32 nScalability;
791    OMX_S32 nSourceFormat;
792    OMX_BOOL nOutputFormat;
793    OMX_U32 nCPM;
794    OMX_U32 nPWI;
795    OMX_U32 nPHI;
796}VIDDEC_MPEG4_ParserParam;
797#endif
798
799#define VIDDEC_RCV_EXTHEADER_SIZE 4
800
801typedef struct VIDDEC_WMV_RCV_struct {
802    OMX_U32 nNumFrames : 24;
803    OMX_U32 nFrameType : 8;
804    OMX_U32 nID : 32;
805    OMX_U32 nStructData : 32;
806    OMX_U32 nVertSize;
807    OMX_U32 nHorizSize;
808} VIDDEC_WMV_RCV_struct;
809
810typedef union VIDDEC_WMV_RCV_header {
811    VIDDEC_WMV_RCV_struct sStructRCV;
812    OMX_U8 pBuffer[sizeof(VIDDEC_WMV_RCV_struct)];
813} VIDDEC_WMV_RCV_header;
814
815typedef struct VIDDEC_SAVE_BUFFER{
816    OMX_BOOL    bSaveFirstBuffer;
817    OMX_PTR     pFirstBufferSaved;
818    OMX_S32     nFilledLen;
819}VIDDEC_SAVE_BUFFER;
820
821#ifdef ANDROID
822/** Opencore specific, refer to OpenMax Call Sequences document section 3.2 **/
823typedef struct PV_OMXComponentCapabilityFlagsType
824{
825    ////////////////// OMX COMPONENT CAPABILITY RELATED MEMBERS
826    OMX_BOOL iIsOMXComponentMultiThreaded;
827    OMX_BOOL iOMXComponentSupportsExternalOutputBufferAlloc;
828    OMX_BOOL iOMXComponentSupportsExternalInputBufferAlloc;
829    OMX_BOOL iOMXComponentSupportsMovableInputBuffers;
830    OMX_BOOL iOMXComponentSupportsPartialFrames;
831    OMX_BOOL iOMXComponentUsesNALStartCodes;
832    OMX_BOOL iOMXComponentCanHandleIncompleteFrames;
833    OMX_BOOL iOMXComponentUsesFullAVCFrames;
834} PV_OMXComponentCapabilityFlagsType;
835#endif
836
837typedef struct VIDEO_PROFILE_LEVEL
838{
839    OMX_S32  nProfile;
840    OMX_S32  nLevel;
841} VIDEO_PROFILE_LEVEL_TYPE;
842
843/**
844 * Data structure used to ...
845 *
846 * STRUCT MEMBERS:
847 *  pPortParamType        : Add desc here...
848 *  pInPortDef            : Add desc here...
849 *  pOutPortDef           : Add desc here...
850 *  pInPortFormat         : Add desc here...
851 */
852typedef struct VIDDEC_COMPONENT_PRIVATE
853{
854    OMX_PARAM_PORTDEFINITIONTYPE* pInPortDef;
855    OMX_PARAM_PORTDEFINITIONTYPE* pOutPortDef;
856    OMX_VIDEO_PARAM_PORTFORMATTYPE* pInPortFormat;
857    OMX_VIDEO_PARAM_PORTFORMATTYPE* pOutPortFormat;
858    OMX_PRIORITYMGMTTYPE* pPriorityMgmt;
859    OMX_PARAM_BUFFERSUPPLIERTYPE* pInBufSupplier;
860    OMX_PARAM_BUFFERSUPPLIERTYPE* pOutBufSupplier;
861    OMX_VIDEO_PARAM_AVCTYPE* pH264;
862    OMX_VIDEO_PARAM_MPEG4TYPE* pMpeg4;
863    OMX_VIDEO_PARAM_H263TYPE* pH263;
864    OMX_VIDEO_PARAM_WMVTYPE* pWMV;
865    OMX_VIDEO_PARAM_MPEG2TYPE* pMpeg2; /* OMX_IndexParamVideoMpeg2 */
866    OMX_PORT_PARAM_TYPE* pPortParamType;
867    OMX_PARAM_DEBLOCKINGTYPE* pDeblockingParamType;
868#ifdef __STD_COMPONENT__
869    OMX_PORT_PARAM_TYPE* pPortParamTypeAudio;
870    OMX_PORT_PARAM_TYPE* pPortParamTypeImage;
871    OMX_PORT_PARAM_TYPE* pPortParamTypeOthers;
872
873#endif
874    OMX_CALLBACKTYPE cbInfo;
875    OMX_PARAM_PORTDEFINITIONTYPE* pPortDef[NUM_OF_PORTS];
876    OMX_U8 numPorts;
877    OMX_COMPONENTTYPE* pHandle;
878    OMX_STATETYPE eState;
879    OMX_VERSIONTYPE pComponentVersion;
880    OMX_VERSIONTYPE pSpecVersion;
881    OMX_STRING cComponentName;
882    pthread_t ComponentThread;
883    int free_inpBuf_Q[2];
884    int free_outBuf_Q[2];
885    int filled_inpBuf_Q[2];
886    int filled_outBuf_Q[2];
887    int cmdPipe[2];
888    int cmdDataPipe[2];
889    OMX_U32 bIsStopping;
890    OMX_U32 bIsPaused;
891    OMX_U32 bTransPause;
892    OMX_U32 ProcessMode;
893    OMX_U32 H264BitStreamFormat;
894    OMX_BOOL MPEG4Codec_IsTI;
895    OMX_BUFFERHEADERTYPE pTempBuffHead;  /*Used for EOS logic*/
896    OMX_U32 app_nBuf;
897    OMX_U32 lcml_compID;
898    void* pLcmlHandle;
899    void* pModLCML;
900    OMX_U16 arr[100];
901    int frameCounter;
902    LCML_DSP_INTERFACE* pLCML;
903    VIDDEC_PORT_TYPE* pCompPort[NUM_OF_PORTS];
904    VIDDEC_WMV_PROFILES wmvProfile;
905#ifdef __PERF_INSTRUMENTATION__
906    PERF_OBJHANDLE pPERF, pPERFcomp;
907    OMX_U32 lcml_nCntOpReceived;
908    OMX_U32 lcml_nCntIp;
909#endif
910#ifdef KHRONOS_1_1
911    OMX_PARAM_COMPONENTROLETYPE componentRole;
912    /*MBError Reporting code*/
913    OMX_CONFIG_MBERRORREPORTINGTYPE eMBErrorReport;
914    OMX_CONFIG_MACROBLOCKERRORMAPTYPE_TI eMBErrorMapType[MAX_PRIVATE_BUFFERS];
915    OMX_U8 cMBErrorIndexIn;
916    OMX_U8 cMBErrorIndexOut;
917#endif
918    OMX_U8 nInMarkBufIndex;                          /* for OMX_MARKTYPE */
919    OMX_U8 nOutMarkBufIndex;                         /* for OMX_MARKTYPE */
920    OMX_MARKTYPE arrMarkBufIndex[VIDDEC_MAX_QUEUE_SIZE]; /* for OMX_MARKTYPE */
921
922    OMX_U8 nInCmdMarkBufIndex;                          /* for OMX_MARKTYPE */
923    OMX_U8 nOutCmdMarkBufIndex;                         /* for OMX_MARKTYPE */
924    OMX_MARKTYPE arrCmdMarkBufIndex[VIDDEC_MAX_QUEUE_SIZE]; /* for OMX_MARKTYPE */
925    OMX_U8 nInBufIndex;                          /* for time stamps */
926    OMX_U8 nOutBufIndex;                         /* for time stamps */
927    OMX_U64 arrBufIndex[VIDDEC_MAX_QUEUE_SIZE]; /* for time stamps */
928    OMX_MARKTYPE           MTbuffMark;
929    VIDDEC_QUEUE_TYPE      qBuffMark;
930    VIDDEC_QUEUE_TYPE      qCmdMarkData;
931    VIDDEC_QUEUE_TYPE      qBytesSent;
932    OMX_U32                nBytesConsumed;
933    OMX_BOOL               bBuffMarkTaked;
934    OMX_BOOL               bBuffalreadyMarked;
935
936    OMX_STATETYPE eIdleToLoad;
937    OMX_STATETYPE eExecuteToIdle;
938    OMX_BOOL iEndofInputSent;
939    OMX_BOOL bPipeCleaned;
940    OMX_BOOL bFirstBuffer;
941
942    OMX_BOOL bParserEnabled;
943    OMX_BOOL bFlushOut;
944    void* pUalgParams;
945    OMX_BOOL bLCMLHalted;
946    OMX_BOOL bMult16Size;
947    OMX_BOOL bFirstHeader;
948    OMX_BOOL bDynamicConfigurationInProgress;
949    OMX_BOOL bInPortSettingsChanged;
950    OMX_BOOL bOutPortSettingsChanged;
951    VIDDEC_SAVE_BUFFER eFirstBuffer;
952
953
954#ifndef UNDER_CE
955    OMX_BOOL bLCMLOut;
956#endif
957    VIDDEC_RMPROXY_STATES eRMProxyState;
958
959    OMX_U8 nCountInputBFromDsp;
960    OMX_U8 nCountOutputBFromDsp;
961    OMX_U8 nCountInputBFromApp;
962    OMX_U8 nCountOutputBFromApp;
963
964    VIDDEC_CBUFFER_BUFFERFLAGS aBufferFlags[CBUFFER_SIZE];
965    VIDDEC_LCML_STATES eLCMLState;
966    OMX_U32 nWMVFileType;
967    OMX_BOOL bIsNALBigEndian;
968#ifdef VIDDEC_SPARK_CODE
969    OMX_BOOL bIsSparkInput;
970#endif
971    VIDDEC_MUTEX sMutex;
972    pthread_mutex_t mutexInputBFromApp;
973    pthread_mutex_t mutexOutputBFromApp;
974    pthread_mutex_t mutexInputBFromDSP;
975    pthread_mutex_t mutexOutputBFromDSP;
976    VIDDEC_MUTEX inputFlushCompletionMutex;
977    VIDDEC_MUTEX outputFlushCompletionMutex;
978    OMX_BOOL bIsInputFlushPending;
979    OMX_BOOL bIsOutputFlushPending;
980    VIDDEC_MUTEX sDynConfigMutex;
981    VIDDEC_SEMAPHORE sInSemaphore;
982    VIDDEC_SEMAPHORE sOutSemaphore;
983    /* used by RM callback */
984#ifdef RESOURCE_MANAGER_ENABLED
985    RMPROXY_CALLBACKTYPE rmproxyCallback;
986#endif
987    /* used to keep track of preempted state */
988    OMX_BOOL bPreempted;
989    /* desired state of this component */
990    OMX_STATETYPE eDesiredState;
991    VIDDEC_WMV_RCV_header pBufferRCV;
992    OMX_BUFFERHEADERTYPE pBufferTemp;
993    OMX_U32 pRCVExtendedHeader;
994    OMX_U32 nMemUsage[VIDDEC_MEMLEVELS];
995    OMX_U32 nDisplayWidth;
996    OMX_U8* pCodecData; /* codec-specific data coming from the demuxer */
997    OMX_U32 nCodecDataSize;
998    OMX_BOOL bVC1Fix;
999#ifdef ANDROID /* Specific flag for opencore mmframework */
1000    PV_OMXComponentCapabilityFlagsType* pPVCapabilityFlags;
1001#endif
1002
1003    /* Used to handle config buffer fragmentation on AVC*/
1004    OMX_BOOL bConfigBufferCompleteAVC;
1005    OMX_PTR pInternalConfigBufferAVC;
1006    OMX_U32 nInternalConfigBufferFilledAVC;
1007    struct OMX_TI_Debug dbg;
1008    /* track number of codec config data (CCD) units and sizes */
1009    OMX_U32 aCCDsize[MAX_CCD_CNT];
1010    OMX_U32 nCCDcnt;
1011
1012    /* indicate if codec config data (CCD)
1013     * buffer (e.g. SPS/PPS) has been copied
1014     * to the data buffer.  SPS,PPS,NAL1,...
1015     * */
1016    OMX_BOOL bCopiedCCDBuffer;
1017
1018    /* Reference count for pending state change requests */
1019    OMX_U32 nPendingStateChangeRequests;
1020    pthread_mutex_t mutexStateChangeRequest;
1021    pthread_cond_t StateChangeCondition;
1022
1023    // Signal first buffer after config data should have EOS flag
1024    OMX_BOOL firstBufferEos;
1025
1026} VIDDEC_COMPONENT_PRIVATE;
1027
1028/*****************macro definitions*********************/
1029/*----------------------------------------------------------------------------*/
1030/**
1031  * OMX_GET_DATABUFF_SIZE() Get the needed buffer data size base in the request.
1032  *
1033  * This method will give the needed data buffer size acording with
1034  * specific requirements from the codec and component.
1035  *
1036  * @param _nSizeBytes_     Requested size from client
1037  *
1038  **/
1039/*----------------------------------------------------------------------------*/
1040
1041#define OMX_GET_DATABUFF_SIZE(_nSizeBytes_)                         \
1042         (_nSizeBytes_ + VIDDEC_PADDING_FULL + VIDDEC_WMV_BUFFER_OFFSET + VIDDEC_ALIGNMENT)
1043
1044
1045#define OMX_MALLOC_STRUCT(_pStruct_, _sName_, _memusage_)           \
1046    _pStruct_ = (_sName_*)malloc(sizeof(_sName_));                  \
1047    if(_pStruct_ == NULL){                                          \
1048            eError = OMX_ErrorInsufficientResources;                \
1049                goto EXIT;                                          \
1050    }                                                               \
1051    /*(_memusage_) += sizeof(_sName_);                               */ \
1052    memset((_pStruct_), 0x0, sizeof(_sName_));
1053
1054
1055#define OMX_MALLOC_STRUCT_SIZED(_pStruct_, _sName_, _nSize_, _memusage_)    \
1056    _pStruct_ = (_sName_*)malloc(_nSize_);                                  \
1057    if(_pStruct_ == NULL){                                                  \
1058            eError = OMX_ErrorInsufficientResources;                        \
1059                goto EXIT;                                                  \
1060    }                                                                       \
1061    /*(_memusage_) += _nSize_;                                               */ \
1062    memset((_pStruct_), 0x0, _nSize_);
1063
1064#define VIDDEC_MEMUSAGE 0 /*\
1065    pComponentPrivate->nMemUsage[VIDDDEC_Enum_MemLevel0] + \
1066    pComponentPrivate->nMemUsage[VIDDDEC_Enum_MemLevel1] + \
1067    pComponentPrivate->nMemUsage[VIDDDEC_Enum_MemLevel2] + \
1068    pComponentPrivate->nMemUsage[VIDDDEC_Enum_MemLevel3] + \
1069    pComponentPrivate->nMemUsage[VIDDDEC_Enum_MemLevel4]*/
1070
1071
1072/*----------------------------------------------------------------------------*/
1073/**
1074  * OMX_ALIGN_BUFFER() Align the buffer to the desire number of bytes.
1075  *
1076  * This method will update the component function pointer to the handle
1077  *
1078  * @param _pBuffer_     Pointer to align
1079  * @param _nBytes_      # of byte to alignment desire
1080  *
1081  **/
1082/*----------------------------------------------------------------------------*/
1083
1084#define OMX_ALIGN_BUFFER(_pBuffer_, _nBytes_)                  \
1085    while((OMX_U8)_pBuffer_ & (_nBytes_-1)){                   \
1086       _pBuffer_++;                                            \
1087    }
1088
1089
1090
1091#define OMX_MALLOC_BUFFER_VIDDEC(_pBuffer_, _nSize_, _pOriginalBuffer_)	    \
1092    _pBuffer_ =  OMX_MALLOC_STRUCT_SIZED(_pBuffer_, OMX_U8, _nSize_ + VIDDEC_PADDING_FULL + VIDDEC_WMV_BUFFER_OFFSET + VIDDEC_ALIGNMENT, pComponentPrivate->nMemUsage[VIDDDEC_Enum_MemLevel1]);			\
1093    _pOriginalBuffer_ = _pBuffer_;					    \
1094    _pBuffer_ += VIDDEC_PADDING_HALF;					    \
1095    OMX_ALIGN_BUFFER(_pBuffer_, VIDDEC_ALIGNMENT);
1096
1097
1098/*----------------------------------------------------------------------------*/
1099/**
1100  * OMX_FREE() Free memory
1101  *
1102  * This method will free memory and set pointer to NULL
1103  *
1104  * @param _pBuffer_     Pointer to free
1105  *
1106  **/
1107/*----------------------------------------------------------------------------*/
1108
1109#define OMX_FREE_VIDDEC(_pBuffer_)					    \
1110    if(_pBuffer_ != NULL){                                                  \
1111	free(_pBuffer_);                                                    \
1112	_pBuffer_ = NULL;                                                   \
1113    }
1114
1115
1116
1117/*----------------------------------------------------------------------------*/
1118/**
1119  * OMX_FREE_BUFFER_VIDDEC() Free video decoder buffer
1120  *
1121  * This method will free video decoder buffer
1122  *
1123  * @param _pBuffHead_	    Buffer header pointer
1124  * @param _pCompPort_	    Component port will give us the reference to the
1125  *			    desire buffer to free
1126  *
1127  **/
1128/*----------------------------------------------------------------------------*/
1129
1130#define OMX_FREE_BUFFER_VIDDEC(_pBuffHead_, _pCompPort_)					    \
1131    {												    \
1132	int _nBufferCount_ = 0;									    \
1133	OMX_U8* _pTemp_ = NULL;									    \
1134												    \
1135	for(_nBufferCount_ = 0; _nBufferCount_ < MAX_PRIVATE_BUFFERS; _nBufferCount_++){	    \
1136            if(_pCompPort_->pBufferPrivate[_nBufferCount_]->pBufferHdr != NULL){		    \
1137                _pTemp_ = (OMX_U8*)_pCompPort_->pBufferPrivate[_nBufferCount_]->pBufferHdr->pBuffer;	\
1138                if(_pBuffHead_->pBuffer == _pTemp_){						    \
1139                    break;									    \
1140                }										    \
1141	    }											    \
1142        }											    \
1143												    \
1144        if(_nBufferCount_ == MAX_PRIVATE_BUFFERS){						    \
1145            OMX_ERROR4(pComponentPrivate->dbg, "Error: Buffer NOT found to free: %p \n", _pBuffHead_->pBuffer);	    \
1146            goto EXIT;										    \
1147        }											    \
1148												    \
1149        _pBuffHead_->pBuffer = _pCompPort_->pBufferPrivate[_nBufferCount_]->pOriginalBuffer;		    \
1150        OMX_PRBUFFER1(pComponentPrivate->dbg, "Free original allocated buffer: %p\n", _pBuffHead_->pBuffer);	\
1151        OMX_FREE_VIDDEC(_pBuffHead_->pBuffer);							    \
1152    }
1153/*----------------------------------------------------------------------------*/
1154/**
1155  * OMX_WMV_INSERT_CODEC_DATA()
1156  *
1157  * This method will insert the codec data to the first frame to be sent to
1158  * queue in LCML
1159  *
1160  * @param _pBuffHead_    Pointer to free
1161  * @param _pComponentPrivate_  Component private structure to provide needed
1162  *                             references
1163  *
1164  **/
1165/*----------------------------------------------------------------------------*/
1166
1167#define OMX_WMV_INSERT_CODEC_DATA(_pBuffHead_, _pComponentPrivate_)                     \
1168    {                                                                                   \
1169        OMX_U8* _pTempBuffer_ = NULL;                                                   \
1170        /* Copy frame data in a temporary buffer*/                                      \
1171        OMX_MALLOC_STRUCT_SIZED(_pTempBuffer_, OMX_U8, _pBuffHead_->nFilledLen, NULL);  \
1172        memcpy (_pTempBuffer_, _pBuffHead_->pBuffer, _pBuffHead_->nFilledLen);          \
1173                                                                                        \
1174        /*Copy configuration data at the begining of the buffer*/                       \
1175        memcpy (_pBuffHead_->pBuffer, _pComponentPrivate_->pCodecData, _pComponentPrivate_->nCodecDataSize);   \
1176        _pBuffHead_->pBuffer += _pComponentPrivate_->nCodecDataSize;                                           \
1177        /* Add frame start code */     \
1178        (*(_pBuffHead_->pBuffer++)) = 0x00;  \
1179        (*(_pBuffHead_->pBuffer++)) = 0x00;  \
1180        (*(_pBuffHead_->pBuffer++)) = 0x01;  \
1181        (*(_pBuffHead_->pBuffer++)) = 0x0d;  \
1182                                             \
1183        /* Insert again the frame buffer */  \
1184        memcpy (_pBuffHead_->pBuffer, _pTempBuffer_, _pBuffHead_->nFilledLen); \
1185        /* pTempBuffer no longer need*/                                        \
1186	OMX_FREE_VIDDEC(_pTempBuffer_);							\
1187                             \
1188        _pBuffHead_->pBuffer -= (pComponentPrivate->nCodecDataSize + 4);       \
1189        _pBuffHead_->nFilledLen += pComponentPrivate->nCodecDataSize + 4;      \
1190    }
1191
1192
1193
1194
1195#define OMX_CONF_INIT_STRUCT(_s_, _name_, dbg)       \
1196    memset((_s_), 0x0, sizeof(_name_));         \
1197    (_s_)->nSize = sizeof(_name_);              \
1198    (_s_)->nVersion.s.nVersionMajor = VERSION_MAJOR;      \
1199    (_s_)->nVersion.s.nVersionMinor = VERSION_MINOR;      \
1200    (_s_)->nVersion.s.nRevision = VERSION_REVISION;       \
1201    (_s_)->nVersion.s.nStep = VERSION_STEP;                                             \
1202    OMX_PRINT0(dbg, "INIT_STRUCT Major 0x%x Minor 0x%x nRevision 0x%x nStep 0x%x\n", \
1203        (_s_)->nVersion.s.nVersionMajor, (_s_)->nVersion.s.nVersionMinor, \
1204        (_s_)->nVersion.s.nRevision, (_s_)->nVersion.s.nStep);
1205
1206#define OMX_CONF_CHK_VERSION(_s_, _name_, _e_, dbg)              \
1207    OMX_PRINT0(dbg, "CHK_VERSION Size 0x%lx Major 0x%x Minor 0x%x nRevision 0x%x nStep 0x%x\n", \
1208        (_s_)->nSize, (_s_)->nVersion.s.nVersionMajor, (_s_)->nVersion.s.nVersionMinor, \
1209        (_s_)->nVersion.s.nRevision, (_s_)->nVersion.s.nStep);              \
1210    if((_s_)->nSize != sizeof(_name_)) _e_ = OMX_ErrorBadParameter; \
1211    if(((_s_)->nVersion.s.nVersionMajor != VERSION_MAJOR)||         \
1212       ((_s_)->nVersion.s.nVersionMinor != VERSION_MINOR)||         \
1213       ((_s_)->nVersion.s.nRevision != VERSION_REVISION)||              \
1214       ((_s_)->nVersion.s.nStep != VERSION_STEP)) _e_ = OMX_ErrorVersionMismatch;\
1215    if(_e_ != OMX_ErrorNone) goto EXIT;
1216
1217#define OMX_CONF_CHECK_CMD(_ptr1, _ptr2, _ptr3) \
1218{                                               \
1219    if(!_ptr1 || !_ptr2 || !_ptr3){             \
1220        eError = OMX_ErrorBadParameter;         \
1221        goto EXIT;                              \
1222    }                                           \
1223}
1224
1225#define OMX_CONF_SET_ERROR_BAIL(_eError, _eCode)\
1226{                                               \
1227    _eError = _eCode;                           \
1228    goto EXIT;                                  \
1229}
1230
1231
1232#define OMX_PARSER_CHECKLIMIT(_total, _actual, _step) /*  \
1233    if(((_actual + _step) >> 3) >= _total){                \
1234    printf("_total %d _actual %d\n",_total,((_actual + _step)>>3)); \
1235        eError = OMX_ErrorStreamCorrupt;                \
1236        goto EXIT;                                      \
1237    }*/
1238
1239/*sMutex*/
1240#define VIDDEC_PTHREAD_MUTEX_INIT(_mutex_)    \
1241    if(!((_mutex_).bInitialized)) {            \
1242        pthread_mutex_init (&((_mutex_).mutex), NULL);   \
1243        pthread_cond_init (&(_mutex_).condition, NULL);\
1244        (_mutex_).bInitialized = OMX_TRUE;   \
1245        (_mutex_).bSignaled = OMX_FALSE;     \
1246        (_mutex_).bEnabled = OMX_FALSE;      \
1247    }
1248
1249#define VIDDEC_PTHREAD_MUTEX_DESTROY(_mutex_) \
1250    if((_mutex_).bInitialized) {             \
1251        pthread_mutex_destroy (&((_mutex_).mutex));     \
1252        pthread_cond_destroy (&(_mutex_).condition); \
1253        (_mutex_).bInitialized = OMX_FALSE;  \
1254        (_mutex_).bEnabled = OMX_FALSE;      \
1255    }
1256
1257#define VIDDEC_PTHREAD_MUTEX_LOCK(_mutex_)    \
1258    VIDDEC_PTHREAD_MUTEX_INIT ((_mutex_));     \
1259    (_mutex_).bSignaled = OMX_FALSE;         \
1260    (_mutex_).nErrorExist = 0; \
1261    (_mutex_).nErrorExist = pthread_mutex_lock (&(_mutex_).mutex);
1262
1263#define VIDDEC_PTHREAD_MUTEX_UNLOCK(_mutex_)  \
1264    VIDDEC_PTHREAD_MUTEX_INIT ((_mutex_));      \
1265    (_mutex_).nErrorExist = 0; \
1266    (_mutex_).nErrorExist = pthread_mutex_unlock (&(_mutex_).mutex);
1267
1268#define VIDDEC_PTHREAD_MUTEX_TRYLOCK(_mutex_) \
1269    VIDDEC_PTHREAD_MUTEX_INIT ((_mutex_));      \
1270    (_mutex_).nErrorExist = 0; \
1271    (_mutex_).nErrorExist = pthread_mutex_trylock (&(_mutex_).mutex);
1272
1273#define VIDDEC_PTHREAD_MUTEX_SIGNAL(_mutex_)  \
1274    VIDDEC_PTHREAD_MUTEX_INIT ((_mutex_));      \
1275    /*if( (_mutex_).bEnabled) {  */              \
1276    (_mutex_).nErrorExist = 0; \
1277    (_mutex_).nErrorExist = pthread_cond_signal (&(_mutex_).condition); \
1278        /*(__mutex.bSignaled = OMX_TRUE;*/  \
1279    /*}*/
1280
1281#define VIDDEC_PTHREAD_MUTEX_WAIT(_mutex_)    \
1282    VIDDEC_PTHREAD_MUTEX_INIT ((_mutex_));      \
1283    (_mutex_).bEnabled = OMX_TRUE;           \
1284    /*if (!(__mutex.bSignaled){               */\
1285    (_mutex_).nErrorExist = 0; \
1286    (_mutex_).nErrorExist = pthread_cond_wait (&(_mutex_).condition, &(_mutex_).mutex);  \
1287        (_mutex_).bSignaled = OMX_FALSE;     \
1288        (_mutex_).bEnabled = OMX_FALSE;      \
1289    /*}*/
1290
1291#define VIDDEC_PTHREAD_SEMAPHORE_INIT(_semaphore_)    \
1292    if(!((_semaphore_).bInitialized)) {            \
1293        sem_init (&((_semaphore_).sSemaphore), 0, 0);   \
1294        (_semaphore_).bInitialized = OMX_TRUE;   \
1295        (_semaphore_).bEnabled = OMX_FALSE;      \
1296        (_semaphore_).bSignaled = OMX_FALSE;        \
1297    }
1298
1299#define VIDDEC_PTHREAD_SEMAPHORE_DESTROY(_semaphore_) \
1300    if((_semaphore_).bInitialized) {             \
1301        sem_destroy (&(_semaphore_).sSemaphore);     \
1302        (_semaphore_).bInitialized = OMX_FALSE;  \
1303        (_semaphore_).bSignaled = OMX_FALSE;     \
1304        (_semaphore_).bEnabled = OMX_FALSE;      \
1305    }
1306    /*
1307    printf("post signal %d Enable %d\n",(_semaphore_).bSignaled,(_semaphore_).bEnabled); \
1308    \
1309    printf("post out signal %d Enable %d\n",(_semaphore_).bSignaled,(_semaphore_).bEnabled); \
1310    \
1311    printf("wait out signal %d Enable %d\n",(_semaphore_).bSignaled,(_semaphore_).bEnabled); \
1312    printf("wait signal %d Enable %d\n",(_semaphore_).bSignaled,(_semaphore_).bEnabled); \
1313
1314    */
1315#define VIDDEC_PTHREAD_SEMAPHORE_POST(_semaphore_)    \
1316    VIDDEC_PTHREAD_SEMAPHORE_INIT ((_semaphore_));     \
1317    if((_semaphore_).bEnabled) {     \
1318        sem_post (&(_semaphore_).sSemaphore);       \
1319        (_semaphore_).bEnabled = OMX_FALSE;      \
1320    }               \
1321    else {          \
1322        (_semaphore_).bSignaled = OMX_TRUE;      \
1323        (_semaphore_).bEnabled = OMX_FALSE;     \
1324    }
1325
1326#define VIDDEC_PTHREAD_SEMAPHORE_WAIT(_semaphore_)  \
1327    VIDDEC_PTHREAD_SEMAPHORE_INIT ((_semaphore_));      \
1328    if(!(_semaphore_).bSignaled) {     \
1329        (_semaphore_).bEnabled = OMX_TRUE;     \
1330        sem_wait (&(_semaphore_).sSemaphore);   \
1331    }       \
1332    else {  \
1333        (_semaphore_).bEnabled = OMX_FALSE;     \
1334        (_semaphore_).bSignaled = OMX_FALSE;      \
1335    }
1336
1337#define VIDDEC_EXECUTETOIDLE                                \
1338    (((pComponentPrivate->eState == OMX_StatePause) ||      \
1339    (pComponentPrivate->eState == OMX_StateExecuting)) &&   \
1340    (pComponentPrivate->eExecuteToIdle == OMX_StateIdle))
1341
1342#define VIDDEC_IDLETOEXECUTE                                \
1343    (((pComponentPrivate->eState == OMX_StateIdle)) &&      \
1344    (pComponentPrivate->eExecuteToIdle == OMX_StateExecuting))
1345
1346#ifdef VIDDEC_SPARK_CODE
1347 #define VIDDEC_SPARKCHECK \
1348    ((pComponentPrivate->bIsSparkInput) && \
1349    (pComponentPrivate->pInPortDef->format.video.eCompressionFormat == OMX_VIDEO_CodingUnused))
1350#else
1351 #define VIDDEC_SPARKCHECK (OMX_FALSE)
1352#endif
1353
1354
1355/* DEFINITIONS for parsing the config information & sequence header for WMV*/
1356 #define VIDDEC_GetUnalignedDword( pb, dw ) \
1357             (dw) = ((OMX_U32) *(pb + 3) << 24) + \
1358                    ((OMX_U32) *(pb + 2) << 16) + \
1359                    ((OMX_U16) *(pb + 1) << 8) + *pb;
1360
1361 #define VIDDEC_GetUnalignedDwordEx( pb, dw )   VIDDEC_GetUnalignedDword( pb, dw ); (pb) += sizeof(OMX_U32);
1362 #define VIDDEC_LoadDWORD( dw, p )  VIDDEC_GetUnalignedDwordEx( p, dw )
1363 #ifndef VIDDEC_MAKEFOURCC
1364 #define VIDDEC_MAKEFOURCC(ch0, ch1, ch2, ch3) \
1365         ((OMX_U32)(OMX_U8)(ch0) | ((OMX_U32)(OMX_U8)(ch1) << 8) |   \
1366         ((OMX_U32)(OMX_U8)(ch2) << 16) | ((OMX_U32)(OMX_U8)(ch3) << 24 ))
1367
1368 #define VIDDEC_FOURCC(ch0, ch1, ch2, ch3)  VIDDEC_MAKEFOURCC(ch0, ch1, ch2, ch3)
1369 #endif
1370
1371 #define FOURCC_WMV3     VIDDEC_FOURCC('W','M','V','3')
1372 #define FOURCC_WMV2     VIDDEC_FOURCC('W','M','V','2')
1373 #define FOURCC_WMV1     VIDDEC_FOURCC('W','M','V','1')
1374 #define FOURCC_WVC1     VIDDEC_FOURCC('W','V','C','1')
1375
1376
1377/*-------function prototypes -------------------------------------------------*/
1378typedef OMX_ERRORTYPE (*VIDDEC_fpo)(OMX_HANDLETYPE);
1379
1380OMX_ERRORTYPE OMX_ComponentInit (OMX_HANDLETYPE hComponent);
1381OMX_ERRORTYPE VIDDEC_Start_ComponentThread (OMX_HANDLETYPE pHandle);
1382OMX_ERRORTYPE VIDDEC_Stop_ComponentThread(OMX_HANDLETYPE pComponent);
1383OMX_ERRORTYPE VIDDEC_HandleCommand (OMX_HANDLETYPE pHandle, OMX_U32 nParam1);
1384OMX_ERRORTYPE VIDDEC_DisablePort (VIDDEC_COMPONENT_PRIVATE* pComponentPrivate, OMX_U32 nParam1);
1385OMX_ERRORTYPE VIDDEC_EnablePort (VIDDEC_COMPONENT_PRIVATE* pComponentPrivate, OMX_U32 nParam1);
1386OMX_ERRORTYPE VIDDEC_HandleDataBuf_FromApp (VIDDEC_COMPONENT_PRIVATE* pComponentPrivate);
1387OMX_ERRORTYPE VIDDEC_HandleDataBuf_FromDsp (VIDDEC_COMPONENT_PRIVATE* pComponentPrivate);
1388OMX_ERRORTYPE VIDDEC_HandleFreeDataBuf (VIDDEC_COMPONENT_PRIVATE* pComponentPrivate);
1389OMX_ERRORTYPE VIDDEC_LCML_Callback (TUsnCodecEvent event, void* argsCb [10]);
1390OMX_ERRORTYPE VIDDEC_HandleFreeOutputBufferFromApp (VIDDEC_COMPONENT_PRIVATE* pComponentPrivate);
1391OMX_ERRORTYPE VIDDEC_InitDSP_Mpeg4Dec (VIDDEC_COMPONENT_PRIVATE* pComponentPrivate);
1392OMX_ERRORTYPE VIDDEC_InitDSP_Mpeg2Dec (VIDDEC_COMPONENT_PRIVATE* pComponentPrivate);
1393OMX_ERRORTYPE VIDDEC_InitDSP_H264Dec (VIDDEC_COMPONENT_PRIVATE* pComponentPrivate);
1394OMX_ERRORTYPE VIDDEC_InitDSP_WMVDec (VIDDEC_COMPONENT_PRIVATE* pComponentPrivate);
1395#ifdef VIDDEC_SPARK_CODE
1396OMX_ERRORTYPE VIDDEC_InitDSP_SparkDec (VIDDEC_COMPONENT_PRIVATE* pComponentPrivate);
1397#endif
1398OMX_ERRORTYPE VIDDEC_ReturnBuffers (VIDDEC_COMPONENT_PRIVATE* pComponentPrivate, OMX_U32 nParam1, OMX_BOOL bRetDSP);
1399OMX_ERRORTYPE VIDDEC_HandleCommandMarkBuffer(VIDDEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_U32 nParam1, OMX_PTR pCmdData);
1400OMX_ERRORTYPE VIDDEC_HandleCommandFlush(VIDDEC_COMPONENT_PRIVATE *pComponentPrivate, OMX_U32 nParam1, OMX_BOOL bPass);
1401OMX_ERRORTYPE VIDDEC_Load_Defaults (VIDDEC_COMPONENT_PRIVATE* pComponentPrivate, OMX_S32 nPassing);
1402OMX_U32 VIDDEC_GetRMFrecuency(VIDDEC_COMPONENT_PRIVATE* pComponentPrivate);
1403OMX_ERRORTYPE VIDDEC_Handle_InvalidState (VIDDEC_COMPONENT_PRIVATE* pComponentPrivate);
1404
1405OMX_ERRORTYPE VIDDEC_CircBuf_Init(VIDDEC_COMPONENT_PRIVATE* pComponentPrivate, VIDDEC_CBUFFER_TYPE nTypeIndex, VIDDEC_PORT_INDEX nPortIndex);
1406OMX_ERRORTYPE VIDDEC_CircBuf_Flush(VIDDEC_COMPONENT_PRIVATE* pComponentPrivate, VIDDEC_CBUFFER_TYPE nTypeIndex, VIDDEC_PORT_INDEX nPortIndex);
1407OMX_ERRORTYPE VIDDEC_CircBuf_DeInit(VIDDEC_COMPONENT_PRIVATE* pComponentPrivate, VIDDEC_CBUFFER_TYPE nTypeIndex, VIDDEC_PORT_INDEX nPortIndex);
1408OMX_ERRORTYPE VIDDEC_CircBuf_Add(VIDDEC_COMPONENT_PRIVATE* pComponentPrivate, VIDDEC_CBUFFER_TYPE nTypeIndex, VIDDEC_PORT_INDEX nPortIndex, OMX_PTR pElement);
1409OMX_ERRORTYPE VIDDEC_CircBuf_Remove(VIDDEC_COMPONENT_PRIVATE* pComponentPrivate, VIDDEC_CBUFFER_TYPE nTypeIndex, VIDDEC_PORT_INDEX nPortIndex, OMX_PTR* pElement);
1410OMX_ERRORTYPE VIDDEC_CircBuf_Count(VIDDEC_COMPONENT_PRIVATE* pComponentPrivate, VIDDEC_CBUFFER_TYPE nTypeIndex, VIDDEC_PORT_INDEX nPortIndex, OMX_U8* pCount);
1411OMX_U8 VIDDEC_CircBuf_GetHead(VIDDEC_COMPONENT_PRIVATE* pComponentPrivate, VIDDEC_CBUFFER_TYPE nTypeIndex, VIDDEC_PORT_INDEX nPortIndex);
1412OMX_ERRORTYPE VIDDEC_Propagate_Mark(VIDDEC_COMPONENT_PRIVATE* pComponentPrivate, OMX_BUFFERHEADERTYPE *pBuffHead);
1413OMX_ERRORTYPE VIDDEC_Queue_Init(VIDDEC_QUEUE_TYPE *queue, VIDDEC_QUEUE_TYPES type);
1414OMX_ERRORTYPE VIDDEC_Queue_Flush(VIDDEC_QUEUE_TYPE *queue);
1415OMX_ERRORTYPE VIDDEC_Queue_Add(VIDDEC_QUEUE_TYPE *queue, OMX_PTR pElement, VIDDEC_QUEUE_TYPES type);
1416OMX_ERRORTYPE VIDDEC_Queue_Remove(VIDDEC_QUEUE_TYPE *queue, OMX_PTR pElement, VIDDEC_QUEUE_TYPES type);
1417OMX_ERRORTYPE VIDDEC_Queue_Replace_Tail(VIDDEC_QUEUE_TYPE *queue, OMX_PTR pElement, VIDDEC_QUEUE_TYPES type);
1418OMX_ERRORTYPE VIDDEC_Queue_Get_Tail(VIDDEC_QUEUE_TYPE *queue, OMX_PTR pElement,VIDDEC_QUEUE_TYPES type);
1419OMX_ERRORTYPE VIDDEC_Queue_Free(VIDDEC_QUEUE_TYPE *queue);
1420#ifdef RESOURCE_MANAGER_ENABLED
1421void VIDDEC_ResourceManagerCallback(RMPROXY_COMMANDDATATYPE cbData);
1422#endif
1423#ifdef ANDROID
1424OMX_ERRORTYPE VIDDEC_SaveBuffer(VIDDEC_COMPONENT_PRIVATE* pComponentPrivate, OMX_BUFFERHEADERTYPE* pBuffHead);
1425OMX_ERRORTYPE VIDDEC_CopyBuffer(VIDDEC_COMPONENT_PRIVATE* pComponentPrivate, OMX_BUFFERHEADERTYPE* pBuffHead);
1426#endif
1427OMX_ERRORTYPE VIDDEC_UnloadCodec(VIDDEC_COMPONENT_PRIVATE* pComponentPrivate);
1428OMX_ERRORTYPE VIDDEC_LoadCodec(VIDDEC_COMPONENT_PRIVATE* pComponentPrivate);
1429OMX_ERRORTYPE VIDDEC_Set_SN_StreamType(VIDDEC_COMPONENT_PRIVATE* pComponentPrivate);
1430OMX_ERRORTYPE VIDDEC_SetMpeg4_Parameters(VIDDEC_COMPONENT_PRIVATE* pComponentPrivate);
1431
1432#ifdef VIDDEC_ACTIVATEPARSER
1433OMX_ERRORTYPE VIDDEC_ParseVideo_WMV9_VC1( OMX_S32* nWidth, OMX_S32* nHeight, OMX_BUFFERHEADERTYPE *pBuffHead);
1434OMX_ERRORTYPE VIDDEC_ParseVideo_WMV9_RCV( OMX_S32* nWidth, OMX_S32* nHeight, OMX_BUFFERHEADERTYPE *pBuffHead);
1435OMX_ERRORTYPE VIDDEC_ParseHeader(VIDDEC_COMPONENT_PRIVATE* pComponentPrivate, OMX_BUFFERHEADERTYPE *pBuffHead);
1436OMX_ERRORTYPE VIDDEC_ParseVideo_MPEG4( OMX_S32* nWidth, OMX_S32* nHeight, OMX_BUFFERHEADERTYPE *pBuffHead);
1437OMX_ERRORTYPE VIDDEC_ParseVideo_H264(VIDDEC_COMPONENT_PRIVATE* pComponentPrivate,
1438                                     OMX_BUFFERHEADERTYPE* pBuffHead,OMX_S32* nWidth,
1439                                     OMX_S32* nHeight, OMX_S32* nCropWidth, OMX_S32* nCropHeight, OMX_U32 nType);
1440OMX_ERRORTYPE VIDDEC_ParseVideo_MPEG2( OMX_S32* nWidth, OMX_S32* nHeight, OMX_BUFFERHEADERTYPE *pBuffHead);
1441OMX_U32 VIDDEC_GetBits(OMX_U32* nPosition, OMX_U8 nBits, OMX_U8* pBuffer, OMX_BOOL bIcreasePosition);
1442OMX_S32 VIDDEC_UVLC_dec(OMX_U32 *nPosition, OMX_U8* pBuffer);
1443OMX_ERRORTYPE AddStateTransition(VIDDEC_COMPONENT_PRIVATE* pComponentPrivate);
1444OMX_ERRORTYPE RemoveStateTransition(VIDDEC_COMPONENT_PRIVATE* pComponentPrivate, OMX_BOOL bEnableSignal);
1445OMX_ERRORTYPE IncrementCount (OMX_U8 * pCounter, pthread_mutex_t *pMutex);
1446OMX_ERRORTYPE DecrementCount (OMX_U8 * pCounter, pthread_mutex_t *pMutex);
1447
1448#endif
1449#endif
1450