1
2/*
3 * Copyright (C) Texas Instruments - http://www.ti.com/
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 * Lesser General Public License for more details.
15 *
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
20 */
21/* ====================================================================
22*             Texas Instruments OMAP(TM) Platform Software
23* (c) Copyright Texas Instruments, Incorporated. All Rights Reserved.
24*
25* Use of this software is controlled by the terms and conditions found
26* in the license agreement under which this software has been supplied.
27* ==================================================================== */
28
29/** LCML_dspcodec.h
30 *  The LCML header file contains the definitions used by both the
31 *  application and the component to access common items.
32 */
33
34
35#ifndef __LCML_DSPCODEC_H__
36#define __LCML_DSPCODEC_H__
37
38#define MAX_OBJS                10
39#define MAX_STREAMS             10
40
41/* 720p implementation */
42#define MAX_DMM_BUFFERS 20
43
44/*DSP specific*/
45#define DSP_DOF_IMAGE           "baseimage.dof"
46#define TI_PROCESSOR_DSP        0
47#define LCML_MAX_NUM_OF_DLLs    10
48#define END_OF_CR_PHASE_ARGS    0xFC25
49#define LCML_DATA_SIZE          42
50#define DMM_PAGE_SIZE           4096
51#define QUEUE_SIZE              20
52#define ROUND_TO_PAGESIZE(n)    ((((n)+4095)/DMM_PAGE_SIZE)*DMM_PAGE_SIZE)
53
54#define __ERROR_PROPAGATION__
55
56
57/*switch on/off here */
58#ifndef UNDER_CE
59#ifdef ANDROID
60    #include <utils/Log.h>
61#endif
62#else
63    #include <oaf_osal.h>
64    #include <oaf_debug.h>
65#endif
66
67
68#ifdef __PERF_INSTRUMENTATION__
69#include "perf.h"
70#endif
71
72#include <LCML_Types.h>
73#include <LCML_CodecInterface.h>
74#include <pthread.h>
75
76/*DSP specific*/
77
78#define DSP_ERROR_EXIT(err, msg, label)                \
79    if (DSP_FAILED (err)) {                        \
80        printf("\n****************LCML ERROR : DSP ************************\n");\
81        printf("Error: %s : Err Num = %lx", msg, err);  \
82        eError = OMX_ErrorHardware;                \
83        printf("\n****************LCML ERROR : DSP ************************\n");\
84        goto label;                               \
85    }                                              /**/
86
87/* ======================================================================= */
88/**
89 * This enum is mean to abtract the enumerations of messages that are
90 * sent to dsp processor.
91 */
92/*  ====================================================================== */
93typedef enum {
94    DSPMSG_AUDIO_UID = 1,
95    DSPMSG_AUDIO_PARAMETERS,
96    DSPMSG_PLAY,
97    DSPMSG_PAUSE,
98    DSPMSG_STOP,
99    DSPMSG_MODE,
100    DSPMSG_PLAYCOMPLETED
101} DSP_Messages;
102
103/**
104 * USN structure
105 */
106typedef struct
107{
108    OMX_U32 iBufferPtr; /* storing buffer pointer MAPPED */
109    OMX_U32 iBufferSize; /*buffer size */
110    OMX_U32 iParamPtr;/*storing param pointer MAPPED */
111    OMX_U32 iParamSize;/*param size */
112    OMX_U32 iBufSizeUsed; /* Modified as USN chnages*/
113    OMX_U32 iEOSFlag;
114    OMX_U32 tBufState;
115    OMX_U32 bBufActive;
116    OMX_U32 unBufID;
117    OMX_U32 ulReserved;
118    OMX_U32 iArmArg;/* storing dsp mapped address of structure*/
119    OMX_U32 iArmbufferArg;/* ARM side buffer pointer*/
120    OMX_U32 iArmParamArg;/*ARM side Param pointer*/
121    OMX_U32 Bufoutindex;/* buffer index*/
122    OMX_U32 BufInindex;/*buffer i/p index*/
123    OMX_U32 iUsrArg;/*Usr argument*/
124    OMX_U32 iStreamID;
125} TArmDspCommunicationStruct;
126
127
128
129/*API needs to be exposed to application*/
130
131/** ========================================================================
132*  Initialise the OMX Component specific handle to LCML. The memory is
133*  allocated and the dsp node is created. Add notification object to listener
134*  thread.
135*
136*  @param  hInterface - Handle to LCML which is allocated and filled
137*  @param  codecName - not used
138*  @param  toCodecInitParams - not used yet
139*  @param  fromCodecInfoStruct - not used yet
140*  @param  pCallbacks - List of callback that uses to call OMX
141* ==========================================================================*/
142#define LCML_InitMMCodec(                                  \
143        hInterface,                                        \
144        codecName,                                         \
145        toCodecInitParams,                                 \
146        fromCodecInfoStruct ,                              \
147        pCallbacks                                         \
148        )                                                  \
149    ((LCML_CODEC_INTERFACE*)hInterface)->InitMMCodec(      \
150        hInterface,                                        \
151        codecName,                                         \
152        toCodecInitParams,                                 \
153        fromCodecInfoStruct ,                              \
154        pCallbacks                                         \
155        )                          /* Macro End */
156
157
158#define LCML_InitMMCodecEx(                                \
159        hInterface,                                        \
160        codecName,                                         \
161        toCodecInitParams,                                 \
162        fromCodecInfoStruct ,                              \
163        pCallbacks,                                        \
164        Args)                                              \
165    ((LCML_CODEC_INTERFACE*)hInterface)->InitMMCodecEx(    \
166        hInterface,                                        \
167        codecName,                                         \
168        toCodecInitParams,                                 \
169        fromCodecInfoStruct ,                              \
170        pCallbacks,                                        \
171        Args)                          /* Macro End */
172
173/** ========================================================================
174*  The LCML_WaitForEvent Wait for a event sychronously
175*  @param  hInterface -  Handle of the component to be accessed.  This is the
176*      component handle returned by the call to the GetHandle function.
177*  @param  event - Event occured
178*  @param  args - Array of "void *" that contains the associated arguments for
179*             occured event
180*
181*  @return OMX_ERRORTYPE
182*      If the command successfully executes, the return code will be
183*      OMX_NoError.  Otherwise the appropriate OMX error will be returned.
184** ==========================================================================*/
185#define LCML_WaitForEvent(                                 \
186        hInterface,                                        \
187        event,                                             \
188        args)                                              \
189    ((LCML_CODEC_INTERFACE*)hInterface)->ControlCodec(     \
190        hInterface,                                        \
191        event,                                             \
192        args)                          /* Macro End */
193
194
195/** ========================================================================
196*  The LCML_QueueBuffer send data to DSP convert it into USN format and send
197*  it to DSP via setbuff
198*  @param [in] hInterface -  Handle of the component to be accessed.  This is
199*      the component handle returned by the call to the GetHandle function.
200*  @param  bufType - type of buffer
201*  @param  buffer - pointer to buffer
202*  @param  bufferLen - length of  buffer
203*  @param  bufferSizeUsed - length of used buffer
204*  @param  auxInfo - pointer to parameter
205*  @param  auxInfoLen - length of  parameter
206*  @param  usrArg - not used
207*  @return OMX_ERRORTYPE
208*      If the command successfully executes, the return code will be
209*      OMX_NoError.  Otherwise the appropriate OMX error will be returned.
210* ==========================================================================*/
211#define LCML_QueueBuffer(                                  \
212        hInterface,                                        \
213        bufType,                                           \
214        buffer,                                            \
215        bufferLen,                                         \
216        bufferSizeUsed,                                    \
217        auxInfo,                                           \
218        auxInfoLen,                                        \
219        usrArg)                                            \
220    ((LCML_CODEC_INTERFACE*)hInterface)->QueueBuffer(      \
221        hInterface,                                        \
222        bufType,                                           \
223        buffer,                                            \
224        bufferLen,                                         \
225        bufferSizeUsed,                                    \
226        auxInfo,                                           \
227        auxInfoLen,                                        \
228        usrArg)
229
230/** ========================================================================
231*  The LCML_ControlCodec send command to DSP convert it into USN format and
232*  send it to DSP
233*  @param  hInterface -  Handle of the component to be accessed.  This is the
234*      component handle returned by the call to the GetHandle function.
235*  @param  bufType - type of buffer
236*  @param  iCodecCmd -  command refer TControlCmd
237*  @param  args - pointer to send some specific command to DSP
238*
239*  @return OMX_ERRORTYPE
240*      If the command successfully executes, the return code will be
241*      OMX_NoError.  Otherwise the appropriate OMX error will be returned.
242** ==========================================================================*/
243#define LCML_ControlCodec(                                 \
244        hInterface,                                        \
245        iCodecCmd,                                         \
246        args)                                              \
247    ((LCML_CODEC_INTERFACE*)hInterface)->ControlCodec(     \
248        hInterface,                                        \
249        iCodecCmd,                                         \
250        args)                          /* Macro End */
251
252
253
254
255/**
256* First function needs to be called by application
257*/
258OMX_ERRORTYPE GetHandle (OMX_HANDLETYPE* hInterface );
259
260/**
261* Struct derives codec interface which have interface to implement for using
262* generic codec and also have pointer to DSP specific data and have queues for
263* storing input and output data
264*/
265typedef struct LCML_DSP_INTERFACE
266{
267    OMX_HANDLETYPE pCodecinterfacehandle;  /* handle to interface struct LCML_CODEC_INTERFACE *dspcodecinterface */
268    struct LCML_DSP *dspCodec;
269    OMX_PTR pComponentPrivate;
270    void * iUsrArg;
271    /*queue to store USN structure*/
272    TArmDspCommunicationStruct* Armoutputstorage[QUEUE_SIZE];
273    TArmDspCommunicationStruct* Arminputstorage[QUEUE_SIZE];
274    TArmDspCommunicationStruct * commStruct;
275    OMX_U32 iBufinputcount;
276    OMX_U32 iBufoutputcount;
277    OMX_U32 pshutdownFlag;
278#ifdef __ERROR_PROPAGATION__
279    struct DSP_NOTIFICATION * g_aNotificationObjects[3];
280#else
281    struct DSP_NOTIFICATION * g_aNotificationObjects[1];
282#endif
283    pthread_t g_tidMessageThread;
284    OMX_U32 algcntlmapped[QUEUE_SIZE];
285    DMM_BUFFER_OBJ *pAlgcntlDmmBuf[QUEUE_SIZE];
286    OMX_U32 strmcntlmapped[QUEUE_SIZE];
287    DMM_BUFFER_OBJ *pStrmcntlDmmBuf[QUEUE_SIZE];
288    pthread_mutex_t mutex;
289    OMX_U32 flush_pending[4];
290    OMX_BOOL bUsnEos;
291
292#ifdef __PERF_INSTRUMENTATION__
293    PERF_OBJHANDLE pPERF, pPERFcomp;
294#endif
295    DMM_BUFFER_OBJ mapped_dmm_buffers[MAX_DMM_BUFFERS];
296    OMX_U32 mapped_buffer_count;
297    OMX_BOOL ReUseMap;
298    pthread_mutex_t m_isStopped_mutex;
299
300}LCML_DSP_INTERFACE;
301
302#endif /* __MMDSPCODEC_H__ */
303
304
305