[DCE] Modify approach to pass parameters to IPC
[glsdk/libdce2.git] / libdce.c
1 /*
2  * Copyright (c) 2013, Texas Instruments Incorporated
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * *  Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  *
12  * *  Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * *  Neither the name of Texas Instruments Incorporated nor the names of
17  *    its contributors may be used to endorse or promote products derived
18  *    from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
33 /*
34 ********************************** Notes ******************************************
35 *******
36 ********************************* Memory *****************************************
37 *
38 *******
39 ********************************* IPC 3.x *****************************************
40 * Two approaches are followed for IPC MmRpc calls.
41 * 1. All the parameters which need to be sent and received to/from IPU are coupled in a struct
42 *     allocated from Shared Memory. Only the adrress of the struct is passed to MmRpc
43 *     as a pointer argument. This approach is useful as MmRpc in some cases to avoid multiple
44 *     translations.
45 *     This approach is followed for :
46 *     Engine_open(), Engine_close(), create(), control(), delete()
47 *     For understanding refer to the Mmrpc_test.c in IPC 3.x
48 * 2. All the parameters which need to be sent are given as separate arguments to
49 *     MmRpc. This appraoch is needed when you need to translate an address which is
50 *     ofsetted from a pointer which in itself needs to be translated.
51 *     This apporach is followed for : process()
52 *     For understanding, take the example of inbufs argument in process call(). Inbufs
53 *     allocated in Shared memory and needs to be translated, has the address of Input
54 *     buffer (allocated from Tiler). It is not possible to give the Input buffer as an argument
55 *     to Mmrpc for translation until inbufs is given as a parameter to Mmrpc. Therefore inbuf
56 *     can't be populated inside another Shared memory struct.
57 * 3. This approach is a workaround to use approach [1] by solving the issue posed by [2].
58 *     This approach is followed for : get_version()
59 *     Taking the example of inbufs to explain, the Input buffer address will be one of the
60 *     parameters of the struct (explained in [1]) along with inbufs address. Therefore the
61 *     Input buffer address will get translated here. At the IPU, this address needs to be
62 *     copied back to inbufs.
63 *********************************************************************************
64 */
66 #include <stdlib.h>
67 #include <string.h>
68 #include <stdio.h>
69 #include <pthread.h>
70 #include <errno.h>
72 #include <xdc/std.h>
74 #if defined(BUILDOS_GLP)
75 #include <xf86drm.h>
76 #include <omap_drm.h>
77 #include <omap_dce.h>
78 #include <omap_drmif.h>
79 #endif /* BUILDOS_GLP */
81 /* IPC Headers */
82 #include <MmRpc.h>
84 /*DCE Headers */
85 #include "libdce.h"
86 #include "dce_rpc.h"
87 #include "dce_priv.h"
88 #include "memplugin.h"
91 #if defined(BUILDOS_GLP)
92 #ifdef GLP_X11
93 int dce_auth_x11(int *fd);
94 #endif /* GLP_X11 */
95 #ifdef GLP_WAYLAND
96 int dce_auth_wayland(int *fd);
97 #endif /* GLP_WAYLAND */
99 static int                   fd = -1;
100 static struct omap_device   *dev;
101 static int                   ioctl_base;
102 #define CMD(name) (ioctl_base + DRM_OMAP_DCE_##name)
104 uint32_t    dce_debug = 3;
105 #endif /* BUILDOS_GLP */
108 /********************* GLOBALS ***********************/
109 /* Hande used for Remote Communication                               */
110 static MmRpc_Handle       MmRpcHandle = NULL;
111 static pthread_mutex_t    mutex = PTHREAD_MUTEX_INITIALIZER;
112 static int                count = 0;
115 /****************** INLINE FUNCTIONS ********************/
117 static inline void Fill_MmRpc_fxnCtx(MmRpc_FxnCtx *fxnCtx, int fxn_id, int num_params, int num_xlts, MmRpc_Xlt *xltAry)
119     fxnCtx->fxn_id = fxn_id;
120     fxnCtx->num_params = num_params;
121     fxnCtx->num_xlts = num_xlts;
122     fxnCtx->xltAry = xltAry;
125 static inline void Fill_MmRpc_fxnCtx_Ptr_Params(MmRpc_Param *mmrpc_params, int size, void *addr, void *handle)
127     mmrpc_params->type = MmRpc_ParamType_Ptr;
128     mmrpc_params->param.ptr.size = size;
129     mmrpc_params->param.ptr.addr = (size_t)addr;
130     mmrpc_params->param.ptr.handle = (size_t)handle;
133 static inline void Fill_MmRpc_fxnCtx_Scalar_Params(MmRpc_Param *mmrpc_params, int size, int data)
135     mmrpc_params->type = MmRpc_ParamType_Scalar;
136     mmrpc_params->param.scalar.size = size;
137     mmrpc_params->param.scalar.data = (size_t)data;
140 static inline void Fill_MmRpc_fxnCtx_Xlt_Array(MmRpc_Xlt *mmrpc_xlt, int index, int32_t base, int32_t addr, void *handle)
142     /* index : index of params filled in FxnCtx                                                                                        */
143     /* offset : calculated from address of index                                                                                      */
144     mmrpc_xlt->index = index;
145     mmrpc_xlt->offset = MmRpc_OFFSET(base, addr);
146     mmrpc_xlt->handle = (size_t)handle;
149 /************************ FUNCTIONS **************************/
150 /* Interface for QNX for parameter buffer allocation                                */
151 /* These interfaces are implemented to maintain Backward Compatability */
152 void *dce_alloc(int sz)
154     return (memplugin_alloc(sz, 0, TILER_1D_BUFFER));
157 void dce_free(void *ptr)
159     memplugin_free(ptr, TILER_1D_BUFFER);
162 /*************** Startup/Shutdown Functions ***********************/
163 static int dce_init(void)
165     dce_error_status    eError = DCE_EOK;
166     MmRpc_Params        args;
168     printf(" >> dce_init\n");
170     pthread_mutex_lock(&mutex);
172     count++;
173     /* Check if already Initialized */
174     _ASSERT(count == 1, DCE_EOK);
176     /* Create remote server insance */
177     MmRpc_Params_init(&args);
179     eError = MmRpc_create(DCE_DEVICE_NAME, &args, &MmRpcHandle);
181     _ASSERT_AND_EXECUTE(eError == DCE_EOK, DCE_EIPC_CREATE_FAIL, count--);
183     printf("open(/dev/" DCE_DEVICE_NAME ") -> 0x%x\n", (int)MmRpcHandle);
184 EXIT:
185     pthread_mutex_unlock(&mutex);
186     return (eError);
189 static void dce_deinit(void)
191     pthread_mutex_lock(&mutex);
193     count--;
194     if( count > 0 ) {
195         goto EXIT;
196     }
198     if( MmRpcHandle != NULL ) {
199         MmRpc_delete(&MmRpcHandle);
200     }
201     MmRpcHandle = NULL;
202 EXIT:
203     pthread_mutex_unlock(&mutex);
204     return;
207 /*===============================================================*/
208 /** Engine_open        : Open Codec Engine.
209  *
210  * @ param attrs  [in]       : Engine Attributes. This param is not passed to Remote core.
211  * @ param name [in]       : Name of Encoder or Decoder codec.
212  * @ param ec [out]         : Error returned by Codec Engine.
213  * @ return : Codec Engine Handle is returned to be used to create codec.
214  *                 In case of error, NULL is returned as Engine Handle.
215  */
216 Engine_Handle Engine_open(String name, Engine_Attrs *attrs, Engine_Error *ec)
218     MmRpc_FxnCtx        fxnCtx;
219     dce_error_status    eError = DCE_EOK;
220     dce_engine_open    *engine_open_msg = NULL;
221     Engine_Attrs       *engine_attrs = NULL;
222     Engine_Handle       engine_handle = NULL;
224     _ASSERT(name != '\0', DCE_EINVALID_INPUT);
226     /* Initialize DCE and IPC. In case of Error Deinitialize them */
227     _ASSERT_AND_EXECUTE(dce_init() == DCE_EOK, DCE_EIPC_CREATE_FAIL, dce_deinit());
229     printf(">> Engine_open Params::name = %s size = %d\n", name, strlen(name));
230     /* Allocate Shared memory for the engine_open rpc msg structure*/
231     /* Tiler Memory preferred in QNX */
232     engine_open_msg = memplugin_alloc(sizeof(dce_engine_open), 0, TILER_1D_BUFFER);
233     _ASSERT_AND_EXECUTE(engine_open_msg != NULL, DCE_EOUT_OF_MEMORY, engine_handle = NULL);
235     if( attrs ) {
236         engine_attrs = memplugin_alloc(sizeof(Engine_Attrs), 0, TILER_1D_BUFFER);
237         _ASSERT_AND_EXECUTE(engine_attrs != NULL, DCE_EOUT_OF_MEMORY, engine_handle = NULL);
238         *engine_attrs = *attrs;
239     }
240     /* Populating the msg structure with all the params */
241     /* Populating all params into a struct avoid individual address translations of name, ec */
242     strncpy(engine_open_msg->name, name, strlen(name));
243     engine_open_msg->engine_attrs = engine_attrs;
245     /* Marshall function arguments into the send buffer */
246     Fill_MmRpc_fxnCtx(&fxnCtx, DCE_RPC_ENGINE_OPEN, 1, 0, NULL);
247     Fill_MmRpc_fxnCtx_Ptr_Params(fxnCtx.params, sizeof(dce_engine_open), engine_open_msg, NULL);
249     /* Invoke the Remote function through MmRpc */
250     eError = MmRpc_call(MmRpcHandle, &fxnCtx, (int32_t *)(&engine_handle));
252     /* In case of Error, the Application will get a NULL Engine Handle */
253     _ASSERT_AND_EXECUTE(eError == DCE_EOK, DCE_EIPC_CALL_FAIL, engine_handle = NULL);
255     if( ec ) {
256         *ec = engine_open_msg->error_code;
257     }
258 EXIT:
259     memplugin_free(engine_open_msg, TILER_1D_BUFFER);
260     if( engine_attrs ) {
261         memplugin_free(engine_attrs, TILER_1D_BUFFER);
262     }
263     return ((Engine_Handle)engine_handle);
266 /*===============================================================*/
267 /** Engine_close           : Close Engine.
268  *
269  * @ param engine  [in]    : Engine Handle obtained in Engine_open() call.
270  */
271 Void Engine_close(Engine_Handle engine)
273     MmRpc_FxnCtx        fxnCtx;
274     int32_t             fxnRet;
275     dce_error_status    eError = DCE_EOK;
277     _ASSERT(engine != NULL, DCE_EINVALID_INPUT);
279     /* Marshall function arguments into the send buffer */
280     Fill_MmRpc_fxnCtx(&fxnCtx, DCE_RPC_ENGINE_CLOSE, 1, 0, NULL);
281     Fill_MmRpc_fxnCtx_Scalar_Params(fxnCtx.params, sizeof(Engine_Handle), (int32_t)engine);
283     /* Invoke the Remote function through MmRpc */
284     eError = MmRpc_call(MmRpcHandle, &fxnCtx, &fxnRet);
286     _ASSERT(eError == DCE_EOK, DCE_EIPC_CALL_FAIL);
288 EXIT:
289     dce_deinit();
290     return;
293 /*===============================================================*/
294 /** Functions create(), control(), get_version(), process(), delete() are common codec
295  * glue function signatures which are same for both encoder and decoder
296  */
297 /*===============================================================*/
298 /** create         : Create Encoder/Decoder codec.
299  *
300  * @ param engine  [in]    : Engine Handle obtained in Engine_open() call.
301  * @ param name [in]       : Name of Encoder or Decoder codec.
302  * @ param params [in]     : Static parameters of codec.
303  * @ param codec_id [in]  : To differentiate between Encoder and Decoder codecs.
304  * @ return : Codec Handle is returned to be used for control, process, delete calls.
305  *                 In case of error, NULL is returned.
306  */
307 static void *create(Engine_Handle engine, String name, void *params, dce_codec_type codec_id)
309     MmRpc_FxnCtx        fxnCtx;
310     dce_error_status    eError = DCE_EOK;
311     void               *codec_handle = NULL;
312     char               *codec_name = NULL;
314     _ASSERT(name != '\0', DCE_EINVALID_INPUT);
315     _ASSERT(engine != NULL, DCE_EINVALID_INPUT);
316     _ASSERT(params != NULL, DCE_EINVALID_INPUT);
318     /* Allocate shared memory for translating codec name to IPU */
319     codec_name = memplugin_alloc(MAX_NAME_LENGTH * sizeof(char), 0, TILER_1D_BUFFER);
320     _ASSERT_AND_EXECUTE(codec_name != NULL, DCE_EOUT_OF_MEMORY, codec_handle = NULL);
322     strncpy(codec_name, name, strlen(name));
324     /* Marshall function arguments into the send buffer */
325     Fill_MmRpc_fxnCtx(&fxnCtx, DCE_RPC_CODEC_CREATE, 4, 0, NULL);
326     Fill_MmRpc_fxnCtx_Scalar_Params(&(fxnCtx.params[0]), sizeof(int32_t), codec_id);
327     Fill_MmRpc_fxnCtx_Scalar_Params(&(fxnCtx.params[1]), sizeof(Engine_Handle), (int32_t)engine);
328     Fill_MmRpc_fxnCtx_Ptr_Params(&(fxnCtx.params[2]), (P2H(codec_name))->size, codec_name, NULL);
329     Fill_MmRpc_fxnCtx_Ptr_Params(&(fxnCtx.params[3]), (P2H(params))->size, params, NULL);
331     /* Invoke the Remote function through MmRpc */
332     eError = MmRpc_call(MmRpcHandle, &fxnCtx, (int32_t *)(&codec_handle));
334     /* In case of Error, the Application will get a NULL Codec Handle */
335     _ASSERT_AND_EXECUTE(eError == DCE_EOK, DCE_EIPC_CALL_FAIL, codec_handle = NULL);
337 EXIT:
338     memplugin_free(codec_name, TILER_1D_BUFFER);
339     return ((void *)codec_handle);
342 /*===============================================================*/
343 /** control               : Codec control call.
344  *
345  * @ param codec  [in]     : Codec Handle obtained in create() call.
346  * @ param id [in]            : Command id for XDM control operation.
347  * @ param dynParams [in] : Dynamic input parameters to Codec.
348  * @ param status [out]    : Codec returned status parameters.
349  * @ param codec_id [in]  : To differentiate between Encoder and Decoder codecs.
350  * @ return : Status of control() call is returned.
351  *                #XDM_EOK                  [0]   :  Success.
352  *                #XDM_EFAIL                [-1] :  Failure.
353  *                #IPC_FAIL                   [-2] : MmRpc Call failed.
354  *                #XDM_EUNSUPPORTED [-3] :  Unsupported request.
355  *                #OUT_OF_MEMORY       [-4] :  Out of Shared Memory.
356  */
357 static XDAS_Int32 control(void *codec, int id, void *dynParams, void *status, dce_codec_type codec_id)
359     MmRpc_FxnCtx        fxnCtx;
360     int32_t             fxnRet;
361     dce_error_status    eError = DCE_EOK;
363     _ASSERT(codec != NULL, DCE_EINVALID_INPUT);
364     _ASSERT(dynParams != NULL, DCE_EINVALID_INPUT);
365     _ASSERT(status != NULL, DCE_EINVALID_INPUT);
367     /* Marshall function arguments into the send buffer */
368     Fill_MmRpc_fxnCtx(&fxnCtx, DCE_RPC_CODEC_CONTROL, 5, 0, NULL);
369     Fill_MmRpc_fxnCtx_Scalar_Params(&(fxnCtx.params[0]), sizeof(int32_t), codec_id);
370     Fill_MmRpc_fxnCtx_Scalar_Params(&(fxnCtx.params[1]), sizeof(int32_t), (int32_t)codec);
371     Fill_MmRpc_fxnCtx_Scalar_Params(&(fxnCtx.params[2]), sizeof(int32_t), (int32_t)id);
372     Fill_MmRpc_fxnCtx_Ptr_Params(&(fxnCtx.params[3]), (P2H(dynParams))->size, dynParams, NULL);
373     Fill_MmRpc_fxnCtx_Ptr_Params(&(fxnCtx.params[4]), (P2H(status))->size, status, NULL);
375     /* Invoke the Remote function through MmRpc */
376     eError = MmRpc_call(MmRpcHandle, &fxnCtx, &fxnRet);
378     _ASSERT(eError == DCE_EOK, DCE_EIPC_CALL_FAIL);
380 EXIT:
381     return (fxnRet);
385 /*===============================================================*/
386 /** get_version        : Codec control call to get the codec version. This call has been made
387  *                                     separate from control call because it involves an additional version
388  *                                     buffer translation.
389  *
390  * @ param codec  [in]     : Codec Handle obtained in create() call.
391  * @ param id [in]            : Command id for XDM control operation.
392  * @ param dynParams [in] : Dynamic input parameters to Codec.
393  * @ param status [out]    : Codec returned status parameters.
394  * @ param codec_id [in]  : To differentiate between Encoder and Decoder codecs.
395  * @ return : Status of control() call is returned.
396  *                #XDM_EOK                  [0]   :  Success.
397  *                #XDM_EFAIL                [-1] :  Failure.
398  *                #IPC_FAIL                   [-2] : MmRpc Call failed.
399  *                #XDM_EUNSUPPORTED [-3] :  Unsupported request.
400  *                #OUT_OF_MEMORY       [-4] :  Out of Shared Memory.
401  */
402 static XDAS_Int32 get_version(void *codec, void *dynParams, void *status, dce_codec_type codec_id)
404     MmRpc_FxnCtx        fxnCtx;
405     MmRpc_Xlt           xltAry;
406     void             * *version_buf = NULL;
407     int32_t             fxnRet;
408     dce_error_status    eError = DCE_EOK;
410     _ASSERT(codec != NULL, DCE_EINVALID_INPUT);
411     _ASSERT(dynParams != NULL, DCE_EINVALID_INPUT);
412     _ASSERT(status != NULL, DCE_EINVALID_INPUT);
414     if( codec_id == OMAP_DCE_VIDDEC3 ) {
415         version_buf = (void * *)(&(((IVIDDEC3_Status *)status)->data.buf));
416     } else if( codec_id == OMAP_DCE_VIDENC2 ) {
417         version_buf = (void * *)(&(((IVIDENC2_Status *)status)->data.buf));
418     }
419     _ASSERT(*version_buf != NULL, DCE_EINVALID_INPUT);
421     /* Marshall function arguments into the send buffer */
422     Fill_MmRpc_fxnCtx(&fxnCtx, DCE_RPC_CODEC_GET_VERSION, 4, 1, &xltAry);
423     Fill_MmRpc_fxnCtx_Scalar_Params(&(fxnCtx.params[0]), sizeof(int32_t), codec_id);
424     Fill_MmRpc_fxnCtx_Scalar_Params(&(fxnCtx.params[1]), sizeof(int32_t), (int32_t)codec);
425     Fill_MmRpc_fxnCtx_Ptr_Params(&(fxnCtx.params[2]), (P2H(dynParams))->size, dynParams, NULL);
426     Fill_MmRpc_fxnCtx_Ptr_Params(&(fxnCtx.params[3]), (P2H(status))->size, status, NULL);
428     /* Address Translation needed for buffer for version Info */
429     Fill_MmRpc_fxnCtx_Xlt_Array(fxnCtx.xltAry, 3, (int32_t)status, (int32_t)version_buf, NULL);
431     /* Invoke the Remote function through MmRpc */
432     eError = MmRpc_call(MmRpcHandle, &fxnCtx, &fxnRet);
434     _ASSERT(eError == DCE_EOK, DCE_EIPC_CALL_FAIL);
436 EXIT:
437     return (fxnRet);
440 typedef enum process_call_params {
441     CODEC_ID_INDEX = 0,
442     CODEC_HANDLE_INDEX,
443     INBUFS_INDEX,
444     OUTBUFS_INDEX,
445     INARGS_INDEX,
446     OUTARGS_INDEX
447 } process_call_params;
449 /*===============================================================*/
450 /** process               : Encode/Decode process.
451  *
452  * @ param codec  [in]     : Codec Handle obtained in create() call.
453  * @ param inBufs [in]     : Input buffer details.
454  * @ param outBufs [in]    : Output buffer details.
455  * @ param inArgs [in]     : Input arguments.
456  * @ param outArgs [out]  : Output arguments.
457  * @ param codec_id [in]  : To differentiate between Encoder and Decoder codecs.
458  * @ return : Status of the process call.
459  *                #XDM_EOK                  [0]   :  Success.
460  *                #XDM_EFAIL                [-1] :  Failure.
461  *                #IPC_FAIL                   [-2] :  MmRpc Call failed.
462  *                #XDM_EUNSUPPORTED [-3] :  Unsupported request.
463  */
464 static XDAS_Int32 process(void *codec, void *inBufs, void *outBufs,
465                           void *inArgs, void *outArgs, dce_codec_type codec_id)
467     MmRpc_FxnCtx        fxnCtx;
468     MmRpc_Xlt           xltAry[MAX_TOTAl_BUF];
469     int                 fxnRet, count, total_count, numInBufs = 0, numOutBufs = 0, sz[OUTARGS_INDEX + 1] = { 0 };
470     dce_error_status    eError = DCE_EOK;
472     _ASSERT(codec != NULL, DCE_EINVALID_INPUT);
473     _ASSERT(inBufs != NULL, DCE_EINVALID_INPUT);
474     _ASSERT(outBufs != NULL, DCE_EINVALID_INPUT);
475     _ASSERT(inArgs != NULL, DCE_EINVALID_INPUT);
476     _ASSERT(outArgs != NULL, DCE_EINVALID_INPUT);
478     if( codec_id == OMAP_DCE_VIDDEC3 ) {
479         numInBufs = ((XDM2_BufDesc *)inBufs)->numBufs;
480         numOutBufs = ((XDM2_BufDesc *)outBufs)->numBufs;
481         sz[INBUFS_INDEX] = sizeof(XDM2_BufDesc);
482         sz[OUTBUFS_INDEX] = sizeof(XDM2_BufDesc);
483         sz[INARGS_INDEX] = sizeof(VIDDEC3_InArgs);
484         sz[OUTARGS_INDEX] = sizeof(VIDDEC3_OutArgs);
485     } else if( codec_id == OMAP_DCE_VIDENC2 ) {
486         numInBufs = ((IVIDEO2_BufDesc *)inBufs)->numPlanes;
487         numOutBufs = ((XDM2_BufDesc *)outBufs)->numBufs;
488         sz[INBUFS_INDEX] = sizeof(IVIDEO2_BufDesc);
489         sz[OUTBUFS_INDEX] = sizeof(XDM2_BufDesc);
490         sz[INARGS_INDEX] = sizeof(VIDENC2_InArgs);
491         sz[OUTARGS_INDEX] = sizeof(VIDENC2_OutArgs);
492     }
494     /* marshall function arguments into the send buffer                       */
495     /* Approach [2] as explained in "Notes" used for process               */
496     Fill_MmRpc_fxnCtx(&fxnCtx, DCE_RPC_CODEC_PROCESS, 6, numInBufs + numOutBufs, xltAry);
497     Fill_MmRpc_fxnCtx_Scalar_Params(&(fxnCtx.params[CODEC_ID_INDEX]), sizeof(int32_t), codec_id);
498     Fill_MmRpc_fxnCtx_Scalar_Params(&(fxnCtx.params[CODEC_HANDLE_INDEX]), sizeof(int32_t), (int32_t)codec);
499     Fill_MmRpc_fxnCtx_Ptr_Params(&(fxnCtx.params[INBUFS_INDEX]), sz[INBUFS_INDEX], inBufs, NULL);
500     Fill_MmRpc_fxnCtx_Ptr_Params(&(fxnCtx.params[OUTBUFS_INDEX]), sz[OUTBUFS_INDEX], outBufs, NULL);
501     Fill_MmRpc_fxnCtx_Ptr_Params(&(fxnCtx.params[INARGS_INDEX]), sz[INARGS_INDEX], inArgs, NULL);
502     Fill_MmRpc_fxnCtx_Ptr_Params(&(fxnCtx.params[OUTARGS_INDEX]), sz[OUTARGS_INDEX], outArgs, NULL);
504     /* InBufs, OutBufs, InArgs, OutArgs buffer need translation but since they have been */
505     /* individually mentioned as fxnCtx Params, they need not be mentioned below again */
506     /* Input and Output Buffers have to be mentioned for translation                               */
507     for( count = 0, total_count = 0; count < numInBufs; count++, total_count++ ) {
508         if( codec_id == OMAP_DCE_VIDDEC3 ) {
509             Fill_MmRpc_fxnCtx_Xlt_Array(&(fxnCtx.xltAry[total_count]), INBUFS_INDEX, (int32_t)inBufs, (int32_t)&(((XDM2_BufDesc *)inBufs)->descs[count].buf), NULL);
510         } else if( codec_id == OMAP_DCE_VIDENC2 ) {
511             Fill_MmRpc_fxnCtx_Xlt_Array(&(fxnCtx.xltAry[total_count]), INBUFS_INDEX, (int32_t)inBufs, (int32_t)&(((IVIDEO2_BufDesc *)inBufs)->planeDesc[count].buf), NULL);
512         }
513     }
515     for( count = 0; count < numOutBufs; count++, total_count++ ) {
516         Fill_MmRpc_fxnCtx_Xlt_Array(&(fxnCtx.xltAry[total_count]), OUTBUFS_INDEX, (int32_t)outBufs, (int32_t)&(((XDM2_BufDesc *)outBufs)->descs[count].buf), NULL);
517     }
519     /* Invoke the Remote function through MmRpc */
520     eError = MmRpc_call(MmRpcHandle, &fxnCtx, &fxnRet);
522     _ASSERT(eError == DCE_EOK, DCE_EIPC_CALL_FAIL);
524     eError = (dce_error_status)(fxnRet);
525 EXIT:
526     return (eError);
529 /*===============================================================*/
530 /** delete                : Delete Encode/Decode codec instance.
531  *
532  * @ param codec  [in]     : Codec Handle obtained in create() call.
533  * @ param codec_id [in]  : To differentiate between Encoder and Decoder codecs.
534  * @ return : NIL.
535  */
536 static void delete(void *codec, dce_codec_type codec_id)
538     MmRpc_FxnCtx        fxnCtx;
539     int32_t             fxnRet;
540     dce_error_status    eError = DCE_EOK;
542     _ASSERT(codec != NULL, DCE_EINVALID_INPUT);
544     /* Marshall function arguments into the send buffer */
545     Fill_MmRpc_fxnCtx(&fxnCtx, DCE_RPC_CODEC_DELETE, 2, 0, NULL);
546     Fill_MmRpc_fxnCtx_Scalar_Params(&(fxnCtx.params[0]), sizeof(int32_t), codec_id);
547     Fill_MmRpc_fxnCtx_Scalar_Params(&(fxnCtx.params[1]), sizeof(int32_t), (int32_t)codec);
549     /* Invoke the Remote function through MmRpc */
550     eError = MmRpc_call(MmRpcHandle, &fxnCtx, &fxnRet);
552     _ASSERT(eError == DCE_EOK, DCE_EIPC_CALL_FAIL);
554 EXIT:
555     return;
558 /*************** Deocder Codec Engine Functions ***********************/
559 VIDDEC3_Handle VIDDEC3_create(Engine_Handle engine, String name,
560                               VIDDEC3_Params *params)
562     VIDDEC3_Handle    codec;
564     DEBUG(">> engine=%p, name=%s, params=%p", engine, name, params);
565     codec = create(engine, name, params, OMAP_DCE_VIDDEC3);
566     DEBUG("<< codec=%p", codec);
567     return (codec);
570 XDAS_Int32 VIDDEC3_control(VIDDEC3_Handle codec, VIDDEC3_Cmd id,
571                            VIDDEC3_DynamicParams *dynParams, VIDDEC3_Status *status)
573     XDAS_Int32    ret;
575     DEBUG(">> codec=%p, id=%d, dynParams=%p, status=%p",
576           codec, id, dynParams, status);
577     if( id == XDM_GETVERSION ) {
578         ret = get_version(codec, dynParams, status, OMAP_DCE_VIDDEC3);
579     } else {
580         ret = control(codec, id, dynParams, status, OMAP_DCE_VIDDEC3);
581     }
582     DEBUG("<< ret=%d", ret);
583     return (ret);
586 XDAS_Int32 VIDDEC3_process(VIDDEC3_Handle codec,
587                            XDM2_BufDesc *inBufs, XDM2_BufDesc *outBufs,
588                            VIDDEC3_InArgs *inArgs, VIDDEC3_OutArgs *outArgs)
590     XDAS_Int32    ret;
592     DEBUG(">> codec=%p, inBufs=%p, outBufs=%p, inArgs=%p, outArgs=%p",
593           codec, inBufs, outBufs, inArgs, outArgs);
594     ret = process(codec, inBufs, outBufs, inArgs, outArgs, OMAP_DCE_VIDDEC3);
595     DEBUG("<< ret=%d", ret);
596     return (ret);
599 Void VIDDEC3_delete(VIDDEC3_Handle codec)
601     DEBUG(">> codec=%p", codec);
602     delete(codec, OMAP_DCE_VIDDEC3);
603     DEBUG("<<");
606 /*************** Enocder Codec Engine Functions ***********************/
607 VIDENC2_Handle VIDENC2_create(Engine_Handle engine, String name,
608                               VIDENC2_Params *params)
610     VIDENC2_Handle    codec;
612     DEBUG(">> engine=%p, name=%s, params=%p", engine, name, params);
613     codec = create(engine, name, params, OMAP_DCE_VIDENC2);
614     DEBUG("<< codec=%p", codec);
615     return (codec);
618 XDAS_Int32 VIDENC2_control(VIDENC2_Handle codec, VIDENC2_Cmd id,
619                            VIDENC2_DynamicParams *dynParams, VIDENC2_Status *status)
621     XDAS_Int32    ret;
623     DEBUG(">> codec=%p, id=%d, dynParams=%p, status=%p",
624           codec, id, dynParams, status);
625     ret = control(codec, id, dynParams, status, OMAP_DCE_VIDENC2);
626     DEBUG("<< ret=%d", ret);
627     return (ret);
630 XDAS_Int32 VIDENC2_process(VIDENC2_Handle codec,
631                            IVIDEO2_BufDesc *inBufs, XDM2_BufDesc *outBufs,
632                            VIDENC2_InArgs *inArgs, VIDENC2_OutArgs *outArgs)
634     XDAS_Int32    ret;
636     DEBUG(">> codec=%p, inBufs=%p, outBufs=%p, inArgs=%p, outArgs=%p",
637           codec, inBufs, outBufs, inArgs, outArgs);
638     ret = process(codec, inBufs, outBufs, inArgs, outArgs, OMAP_DCE_VIDENC2);
639     DEBUG("<< ret=%d", ret);
640     return (ret);
643 Void VIDENC2_delete(VIDENC2_Handle codec)
645     DEBUG(">> codec=%p", codec);
646     delete(codec, OMAP_DCE_VIDENC2);
647     DEBUG("<<");