Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (c) 2010, 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  */
     32 
     33 /**
     34  *  @file  omx_proxy_videodecoder.c
     35  *         This file contains methods that provides the functionality for
     36  *         the OpenMAX1.1 DOMX Framework Tunnel Proxy component.
     37  *********************************************************************************************
     38  This is the proxy specific wrapper that passes the component name to the generic proxy init()
     39  The proxy wrapper also does some runtime/static time onfig on per proxy basis
     40  This is a thin wrapper that is called when componentiit() of the proxy is called
     41  static OMX_ERRORTYPE PROXY_Wrapper_init(OMX_HANDLETYPE hComponent, OMX_PTR pAppData);
     42  this layer gets called first whenever a proxy's get handle is called
     43  ************************************************************************************************
     44  *  @path WTSD_DucatiMMSW\omx\omx_il_1_x\omx_proxy_component\src
     45  *
     46  *  @rev 1.0
     47  */
     48 
     49 /*==============================================================
     50  *! Revision History
     51  *! ============================
     52  *! 20-August-2010 Sarthak Aggarwal sarthak (at) ti.com: Initial Version
     53  *================================================================*/
     54 
     55 /******************************************************************
     56  *   INCLUDE FILES
     57  ******************************************************************/
     58 #include <stdio.h>
     59 #include <string.h>
     60 #include <assert.h>
     61 #include "omx_proxy_common.h"
     62 #include <timm_osal_interfaces.h>
     63 #include "OMX_TI_IVCommon.h"
     64 #include "OMX_TI_Video.h"
     65 #include "OMX_TI_Index.h"
     66 
     67 #define COMPONENT_NAME "OMX.TI.DUCATI1.VIDEO.DECODER"
     68 /* needs to be specific for every configuration wrapper */
     69 
     70 #ifdef USE_ENHANCED_PORTRECONFIG
     71 //Define port indices in video decoder proxy
     72 #define OMX_VIDEODECODER_INPUT_PORT 0
     73 #define OMX_VIDEODECODER_OUTPUT_PORT 1
     74 #endif
     75 
     76 #ifdef SET_STRIDE_PADDING_FROM_PROXY
     77 
     78 #define LINUX_PAGE_SIZE (4 * 1024)
     79 #define TOTAL_DEC_PORTS 2
     80 #define HAL_NV12_PADDED_PIXEL_FORMAT (OMX_TI_COLOR_FormatYUV420PackedSemiPlanar - OMX_COLOR_FormatVendorStartUnused)
     81 
     82 static OMX_ERRORTYPE RPC_UTIL_SetStrideAndPadding(OMX_COMPONENTTYPE * hRemoteComp, PROXY_COMPONENT_PRIVATE * pCompPrv);
     83 
     84 OMX_ERRORTYPE PROXY_VIDDEC_SendCommand(OMX_IN OMX_HANDLETYPE hComponent,
     85     OMX_IN OMX_COMMANDTYPE eCmd,
     86     OMX_IN OMX_U32 nParam, OMX_IN OMX_PTR pCmdData);
     87 
     88 OMX_ERRORTYPE PROXY_VIDDEC_EventHandler(OMX_HANDLETYPE hComponent,
     89     OMX_PTR pAppData, OMX_EVENTTYPE eEvent, OMX_U32 nData1, OMX_U32 nData2,
     90     OMX_PTR pEventData);
     91 
     92 #endif //SET_STRIDE_PADDING_FROM_PROXY
     93 
     94 OMX_ERRORTYPE PROXY_VIDDEC_GetExtensionIndex(OMX_IN OMX_HANDLETYPE hComponent,
     95     OMX_IN OMX_STRING cParameterName, OMX_OUT OMX_INDEXTYPE * pIndexType);
     96 
     97 #ifdef ANDROID_QUIRK_CHANGE_PORT_VALUES
     98 
     99 OMX_ERRORTYPE PROXY_VIDDEC_GetParameter(OMX_IN OMX_HANDLETYPE hComponent,
    100     OMX_IN OMX_INDEXTYPE nParamIndex, OMX_INOUT OMX_PTR pParamStruct);
    101 
    102 OMX_ERRORTYPE PROXY_VIDDEC_SetParameter(OMX_IN OMX_HANDLETYPE hComponent,
    103     OMX_IN OMX_INDEXTYPE nParamIndex, OMX_INOUT OMX_PTR pParamStruct);
    104 
    105 #endif
    106 
    107 #ifdef ANDROID_QUIRK_LOCK_BUFFER
    108 #include <hardware/gralloc.h>
    109 #include <hardware/hardware.h>
    110 #include "hal_public.h"
    111 
    112 OMX_ERRORTYPE PROXY_VIDDEC_FillThisBuffer(OMX_HANDLETYPE hComponent, OMX_BUFFERHEADERTYPE * pBufferHdr);
    113 OMX_ERRORTYPE PROXY_VIDDEC_FillBufferDone(OMX_HANDLETYPE hComponent,
    114     OMX_U32 remoteBufHdr, OMX_U32 nfilledLen, OMX_U32 nOffset, OMX_U32 nFlags,
    115     OMX_TICKS nTimeStamp, OMX_HANDLETYPE hMarkTargetComponent,
    116     OMX_PTR pMarkData);
    117 
    118 #endif
    119 
    120 OMX_ERRORTYPE OMX_ComponentInit(OMX_HANDLETYPE hComponent)
    121 {
    122 	OMX_ERRORTYPE eError = OMX_ErrorNone;
    123 	OMX_COMPONENTTYPE *pHandle = NULL;
    124 	PROXY_COMPONENT_PRIVATE *pComponentPrivate = NULL;
    125 	pHandle = (OMX_COMPONENTTYPE *) hComponent;
    126 
    127 	DOMX_ENTER("");
    128 
    129 	DOMX_DEBUG("Component name provided is %s", COMPONENT_NAME);
    130 
    131 	pHandle->pComponentPrivate =
    132 	    (PROXY_COMPONENT_PRIVATE *)
    133 	    TIMM_OSAL_Malloc(sizeof(PROXY_COMPONENT_PRIVATE), TIMM_OSAL_TRUE,
    134 	    0, TIMMOSAL_MEM_SEGMENT_INT);
    135 
    136 	PROXY_assert(pHandle->pComponentPrivate != NULL,
    137 	    OMX_ErrorInsufficientResources,
    138 	    "ERROR IN ALLOCATING PROXY COMPONENT PRIVATE STRUCTURE");
    139 
    140 	pComponentPrivate =
    141 	    (PROXY_COMPONENT_PRIVATE *) pHandle->pComponentPrivate;
    142 
    143 	TIMM_OSAL_Memset(pComponentPrivate, 0,
    144 		sizeof(PROXY_COMPONENT_PRIVATE));
    145 
    146 	pComponentPrivate->cCompName =
    147 	    TIMM_OSAL_Malloc(MAX_COMPONENT_NAME_LENGTH * sizeof(OMX_U8),
    148 	    TIMM_OSAL_TRUE, 0, TIMMOSAL_MEM_SEGMENT_INT);
    149 
    150 	PROXY_assert(pComponentPrivate->cCompName != NULL,
    151 	    OMX_ErrorInsufficientResources,
    152 	    " Error in Allocating space for proxy component table");
    153 
    154 	eError = OMX_ProxyViddecInit(hComponent);
    155 
    156 	EXIT:
    157 		return eError;
    158 }
    159 
    160 OMX_ERRORTYPE OMX_ProxyViddecInit(OMX_HANDLETYPE hComponent)
    161 {
    162 	OMX_ERRORTYPE eError = OMX_ErrorNone;
    163 	OMX_COMPONENTTYPE *pHandle = NULL;
    164 	PROXY_COMPONENT_PRIVATE *pComponentPrivate = NULL;
    165 	pHandle = (OMX_COMPONENTTYPE *) hComponent;
    166         OMX_TI_PARAM_ENHANCEDPORTRECONFIG tParamStruct;
    167 
    168 #ifdef ANDROID_QUIRK_LOCK_BUFFER
    169 	OMX_U32 err;
    170 	hw_module_t const* module;
    171 #endif
    172 	DOMX_ENTER("");
    173 
    174 	DOMX_DEBUG("Component name provided is %s", COMPONENT_NAME);
    175 
    176         pComponentPrivate =
    177             (PROXY_COMPONENT_PRIVATE *) pHandle->pComponentPrivate;
    178 
    179 	// Copying component Name - this will be picked up in the proxy common
    180 	PROXY_assert(strlen(COMPONENT_NAME) + 1 < MAX_COMPONENT_NAME_LENGTH,
    181 	    OMX_ErrorInvalidComponentName,
    182 	    "Length of component name is longer than the max allowed");
    183 	TIMM_OSAL_Memcpy(pComponentPrivate->cCompName, COMPONENT_NAME,
    184 	    strlen(COMPONENT_NAME) + 1);
    185 
    186 	eError = OMX_ProxyCommonInit(hComponent);	// Calling Proxy Common Init()
    187 	PROXY_assert(eError == OMX_ErrorNone, eError, "Proxy common init returned error");
    188 #ifdef ANDROID_QUIRK_CHANGE_PORT_VALUES
    189 	pHandle->SetParameter = PROXY_VIDDEC_SetParameter;
    190         pHandle->GetParameter = PROXY_VIDDEC_GetParameter;
    191 #endif
    192 	pHandle->GetExtensionIndex = PROXY_VIDDEC_GetExtensionIndex;
    193 
    194 #ifdef  SET_STRIDE_PADDING_FROM_PROXY
    195         pHandle->SendCommand = PROXY_VIDDEC_SendCommand;
    196 	pComponentPrivate->proxyEventHandler = PROXY_VIDDEC_EventHandler;
    197 	pComponentPrivate->IsLoadedState = OMX_TRUE;
    198 #endif
    199 
    200 #ifdef ANDROID_QUIRK_LOCK_BUFFER
    201         pComponentPrivate->proxyFillBufferDone = PROXY_VIDDEC_FillBufferDone;
    202 	pHandle->FillThisBuffer = PROXY_VIDDEC_FillThisBuffer;
    203 
    204         err = hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &module);
    205         if (err == 0)
    206 	{
    207                 pComponentPrivate->grallocModule = (gralloc_module_t const *)module;
    208         }
    209 	else
    210 	{
    211                 DOMX_ERROR("FATAL: gralloc api hw_get_module() returned error: Can't find \
    212 		 %s module err = %x", GRALLOC_HARDWARE_MODULE_ID, err);
    213 		eError = OMX_ErrorInsufficientResources;
    214 		return eError;
    215 	}
    216 #endif
    217 
    218 #ifdef USE_ENHANCED_PORTRECONFIG
    219 	/*Initializing Structure */
    220 	tParamStruct.nSize = sizeof(OMX_TI_PARAM_ENHANCEDPORTRECONFIG);
    221 	tParamStruct.nVersion.s.nVersionMajor = OMX_VER_MAJOR;
    222 	tParamStruct.nVersion.s.nVersionMinor = OMX_VER_MINOR;
    223 	tParamStruct.nVersion.s.nRevision = 0x0;
    224 	tParamStruct.nVersion.s.nStep = 0x0;
    225 	tParamStruct.nPortIndex = OMX_VIDEODECODER_OUTPUT_PORT;
    226         tParamStruct.bUsePortReconfigForCrop = OMX_TRUE;
    227         tParamStruct.bUsePortReconfigForPadding = OMX_TRUE;
    228 
    229 	eError = PROXY_SetParameter(hComponent,(OMX_INDEXTYPE)OMX_TI_IndexParamUseEnhancedPortReconfig,
    230 	   &tParamStruct);
    231 	PROXY_assert(eError == OMX_ErrorNone,
    232 	    eError," Error in Proxy SetParameter for Enhanced port reconfig usage");
    233 #endif
    234 
    235       EXIT:
    236 	if (eError != OMX_ErrorNone)
    237 	{
    238 		DOMX_DEBUG("Error in Initializing Proxy");
    239 		if (pComponentPrivate->cCompName != NULL)
    240 		{
    241 			TIMM_OSAL_Free(pComponentPrivate->cCompName);
    242 			pComponentPrivate->cCompName = NULL;
    243 		}
    244 		if (pComponentPrivate != NULL)
    245 		{
    246 			TIMM_OSAL_Free(pComponentPrivate);
    247 			pComponentPrivate = NULL;
    248 		}
    249 	}
    250 	return eError;
    251 }
    252 
    253 /* ===========================================================================*/
    254 /**
    255  * @name PROXY_VIDDEC_GetExtensionIndex()
    256  * @brief
    257  * @param void
    258  * @return OMX_ErrorNone = Successful
    259  * @sa TBD
    260  *
    261  */
    262 /* ===========================================================================*/
    263 OMX_ERRORTYPE PROXY_VIDDEC_GetExtensionIndex(OMX_IN OMX_HANDLETYPE hComponent,
    264 		OMX_IN OMX_STRING cParameterName, OMX_OUT OMX_INDEXTYPE * pIndexType)
    265 {
    266 	OMX_ERRORTYPE eError = OMX_ErrorNone;
    267 	PROXY_COMPONENT_PRIVATE *pCompPrv = NULL;
    268 	OMX_COMPONENTTYPE *hComp = (OMX_COMPONENTTYPE *) hComponent;
    269 
    270 	PROXY_require((hComp->pComponentPrivate != NULL), OMX_ErrorBadParameter, NULL);
    271 	PROXY_require(cParameterName != NULL, OMX_ErrorBadParameter, NULL);
    272 	PROXY_require(pIndexType != NULL, OMX_ErrorBadParameter, NULL);
    273 
    274 	DOMX_ENTER("hComponent = %p, cParameterName = %p", hComponent, cParameterName);
    275 
    276 #ifdef ENABLE_GRALLOC_BUFFERS
    277 	// Ensure that String length is not greater than Max allowed length
    278 	PROXY_require(strlen(cParameterName) <= 127, OMX_ErrorBadParameter, NULL);
    279 
    280 	if (strcmp(cParameterName, "OMX.google.android.index.getAndroidNativeBufferUsage") == 0)
    281 	{
    282 		*pIndexType = (OMX_INDEXTYPE) OMX_TI_IndexAndroidNativeBufferUsage;
    283 	}
    284 	else
    285 	{
    286 		eError = PROXY_GetExtensionIndex(hComponent, cParameterName, pIndexType);
    287 		PROXY_assert(eError == OMX_ErrorNone,
    288 		    eError," Error in PROXY_GetExtensionIndex");
    289 	}
    290 #else
    291 	eError = PROXY_GetExtensionIndex(hComponent, cParameterName, pIndexType);
    292 	PROXY_assert(eError == OMX_ErrorNone,
    293 		eError," Error in PROXY_GetExtensionIndex");
    294 #endif
    295 	EXIT:
    296 	DOMX_EXIT("eError: %d", eError);
    297 	return eError;
    298 }
    299 
    300 #ifdef  ANDROID_QUIRK_CHANGE_PORT_VALUES
    301 
    302 /* ===========================================================================*/
    303 /**
    304  * @name PROXY_GetParameter()
    305  * @brief
    306  * @param void
    307  * @return OMX_ErrorNone = Successful
    308  * @sa TBD
    309  *
    310  */
    311 /* ===========================================================================*/
    312 OMX_ERRORTYPE PROXY_VIDDEC_GetParameter(OMX_IN OMX_HANDLETYPE hComponent,
    313     OMX_IN OMX_INDEXTYPE nParamIndex, OMX_INOUT OMX_PTR pParamStruct)
    314 {
    315 	OMX_ERRORTYPE eError = OMX_ErrorNone;
    316 	PROXY_COMPONENT_PRIVATE *pCompPrv = NULL;
    317 	OMX_COMPONENTTYPE *hComp = (OMX_COMPONENTTYPE *) hComponent;
    318 	OMX_PARAM_PORTDEFINITIONTYPE* pPortDef = NULL;
    319 	OMX_VIDEO_PARAM_PORTFORMATTYPE* pPortParam = NULL;
    320 	OMX_TI_PARAMNATIVEBUFFERUSAGE *pUsage = NULL;
    321 
    322 	PROXY_require((pParamStruct != NULL), OMX_ErrorBadParameter, NULL);
    323 	PROXY_assert((hComp->pComponentPrivate != NULL),
    324 	    OMX_ErrorBadParameter, NULL);
    325 
    326 	pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate;
    327 
    328 	DOMX_ENTER
    329 	    ("hComponent = %p, pCompPrv = %p, nParamIndex = %d, pParamStruct = %p",
    330 	    hComponent, pCompPrv, nParamIndex, pParamStruct);
    331 
    332 #ifdef ENABLE_GRALLOC_BUFFERS
    333 	if( nParamIndex == OMX_TI_IndexAndroidNativeBufferUsage)
    334 	{
    335 		pUsage = (OMX_TI_PARAMNATIVEBUFFERUSAGE*)pParamStruct;
    336 		if(pCompPrv->proxyPortBuffers[pUsage->nPortIndex].proxyBufferType == GrallocPointers)
    337 		{
    338 			PROXY_CHK_VERSION(pParamStruct, OMX_TI_PARAMNATIVEBUFFERUSAGE);
    339 			pUsage->nUsage = GRALLOC_USAGE_HW_RENDER;
    340 			goto EXIT;
    341 		}
    342 	}
    343 #endif
    344 	eError = PROXY_GetParameter(hComponent,nParamIndex, pParamStruct);
    345 	PROXY_assert((eError == OMX_ErrorNone) || (eError == OMX_ErrorNoMore),
    346 		    eError," Error in Proxy GetParameter");
    347 
    348 	if( nParamIndex == OMX_IndexParamPortDefinition)
    349 	{
    350 		PROXY_CHK_VERSION(pParamStruct, OMX_PARAM_PORTDEFINITIONTYPE);
    351 		pPortDef = (OMX_PARAM_PORTDEFINITIONTYPE *)pParamStruct;
    352 		if(pPortDef->format.video.eColorFormat == OMX_COLOR_FormatYUV420PackedSemiPlanar)
    353 		{
    354 			if(pCompPrv->proxyPortBuffers[pPortDef->nPortIndex].proxyBufferType == GrallocPointers)
    355 			{
    356 				pPortDef->format.video.eColorFormat = HAL_NV12_PADDED_PIXEL_FORMAT;
    357 			}
    358 			else
    359 			{
    360 				pPortDef->format.video.eColorFormat = OMX_TI_COLOR_FormatYUV420PackedSemiPlanar;
    361 			}
    362 		}
    363 	}
    364 	else if ( nParamIndex == OMX_IndexParamVideoPortFormat)
    365 	{
    366 		PROXY_CHK_VERSION(pParamStruct, OMX_VIDEO_PARAM_PORTFORMATTYPE);
    367 		pPortParam = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)pParamStruct;
    368 		if(pPortParam->eColorFormat == OMX_COLOR_FormatYUV420PackedSemiPlanar)
    369 		{
    370 			if(pCompPrv->proxyPortBuffers[pPortParam->nPortIndex].proxyBufferType == GrallocPointers)
    371 			{
    372 				pPortParam->eColorFormat = HAL_NV12_PADDED_PIXEL_FORMAT;
    373 			}
    374 			else
    375 			{
    376 				pPortParam->eColorFormat = OMX_TI_COLOR_FormatYUV420PackedSemiPlanar;
    377 			}
    378 		}
    379 	}
    380 
    381       EXIT:
    382 	DOMX_EXIT("eError: %d", eError);
    383 	return eError;
    384 }
    385 
    386 /* ===========================================================================*/
    387 /**
    388  * @name PROXY_SetParameter()
    389  * @brief
    390  * @param void
    391  * @return OMX_ErrorNone = Successful
    392  * @sa TBD
    393  *
    394  */
    395 /* ===========================================================================*/
    396 OMX_ERRORTYPE PROXY_VIDDEC_SetParameter(OMX_IN OMX_HANDLETYPE hComponent,
    397     OMX_IN OMX_INDEXTYPE nParamIndex, OMX_IN OMX_PTR pParamStruct)
    398 {
    399 	OMX_ERRORTYPE eError = OMX_ErrorNone;
    400 	PROXY_COMPONENT_PRIVATE *pCompPrv = NULL;
    401 	OMX_COMPONENTTYPE *hComp = (OMX_COMPONENTTYPE *) hComponent;
    402 	OMX_PARAM_PORTDEFINITIONTYPE* pPortDef = (OMX_PARAM_PORTDEFINITIONTYPE *)pParamStruct;
    403 	OMX_VIDEO_PARAM_PORTFORMATTYPE* pPortParams = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)pParamStruct;
    404 
    405 	PROXY_require((pParamStruct != NULL), OMX_ErrorBadParameter, NULL);
    406 	PROXY_require((hComp->pComponentPrivate != NULL),
    407 	    OMX_ErrorBadParameter, NULL);
    408 
    409 	pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate;
    410 	DOMX_ENTER
    411 	    ("hComponent = %p, pCompPrv = %p, nParamIndex = %d, pParamStruct = %p",
    412 	    hComponent, pCompPrv, nParamIndex, pParamStruct);
    413 	if(nParamIndex == OMX_IndexParamPortDefinition)
    414 	{
    415 		if(pPortDef->format.video.eColorFormat == OMX_TI_COLOR_FormatYUV420PackedSemiPlanar
    416 			|| pPortDef->format.video.eColorFormat == HAL_NV12_PADDED_PIXEL_FORMAT)
    417 		{
    418 			pPortDef->format.video.eColorFormat = OMX_COLOR_FormatYUV420PackedSemiPlanar;
    419 		}
    420 	}
    421 	else if(nParamIndex == OMX_IndexParamVideoPortFormat)
    422 	{
    423 		if(pPortParams->eColorFormat == OMX_TI_COLOR_FormatYUV420PackedSemiPlanar
    424 			|| pPortParams->eColorFormat == HAL_NV12_PADDED_PIXEL_FORMAT)
    425 		{
    426 			pPortParams->eColorFormat = OMX_COLOR_FormatYUV420PackedSemiPlanar;
    427 		}
    428 	}
    429 
    430 	eError = PROXY_SetParameter(hComponent, nParamIndex, pParamStruct);
    431 	PROXY_assert(eError == OMX_ErrorNone,
    432 		    eError," Error in Proxy SetParameter");
    433 
    434 	EXIT:
    435 	DOMX_EXIT("eError: %d", eError);
    436 	return eError;
    437 }
    438 
    439 #endif
    440 
    441 #ifdef SET_STRIDE_PADDING_FROM_PROXY
    442 /* ===========================================================================*/
    443 /**
    444  * @name PROXY_VIDDEC_SendCommand()
    445  * @brief
    446  * @return OMX_ErrorNone = Successful
    447  * @sa TBD
    448  *
    449  */
    450 /* ===========================================================================*/
    451 OMX_ERRORTYPE PROXY_VIDDEC_SendCommand(OMX_IN OMX_HANDLETYPE hComponent,
    452     OMX_IN OMX_COMMANDTYPE eCmd,
    453     OMX_IN OMX_U32 nParam, OMX_IN OMX_PTR pCmdData)
    454 {
    455 	OMX_ERRORTYPE eError = OMX_ErrorNone;
    456 	PROXY_COMPONENT_PRIVATE *pCompPrv = NULL;
    457 	OMX_COMPONENTTYPE *hComp = (OMX_COMPONENTTYPE *) hComponent;
    458 
    459 	PROXY_require((hComp->pComponentPrivate != NULL),
    460 	    OMX_ErrorBadParameter, NULL);
    461 
    462 	pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate;
    463 
    464 	DOMX_ENTER
    465 	    ("hComponent = %p, pCompPrv = %p, eCmd = %d, nParam = %d, pCmdData = %p",
    466 	    hComponent, pCompPrv, eCmd, nParam, pCmdData);
    467 
    468 	if(eCmd == OMX_CommandStateSet)
    469 	{
    470 		//Set appropriate stride before Loaded to Idle transition.
    471 		if((OMX_STATETYPE)nParam == OMX_StateIdle && pCompPrv->IsLoadedState == OMX_TRUE)
    472 		{
    473 			eError = RPC_UTIL_SetStrideAndPadding(hComponent, pCompPrv);
    474 			PROXY_require(eError == OMX_ErrorNone, eError,
    475                                "Stride and padding setting from proxy returned");
    476 			pCompPrv->IsLoadedState = OMX_FALSE;
    477 		}
    478 	}
    479 	else if(eCmd == OMX_CommandPortEnable)
    480 	{
    481 		if(nParam == OMX_ALL || nParam == OMX_VIDEODECODER_OUTPUT_PORT)
    482 		{
    483 			eError = RPC_UTIL_SetStrideAndPadding(hComponent, pCompPrv);
    484 			PROXY_require(eError == OMX_ErrorNone, eError,
    485                                "Stride and padding setting from proxy returned");
    486 		}
    487 	}
    488 
    489 	eError =
    490 	    PROXY_SendCommand(hComponent, eCmd, nParam, pCmdData);
    491 
    492       EXIT:
    493 	DOMX_EXIT("eError: %d", eError);
    494 	return eError;
    495 }
    496 
    497 /* ===========================================================================*/
    498 /**
    499  * @name PROXY_EventHandler()
    500  * @brief
    501  * @param void
    502  * @return OMX_ErrorNone = Successful
    503  * @sa TBD
    504  *
    505  */
    506 /* ===========================================================================*/
    507 OMX_ERRORTYPE PROXY_VIDDEC_EventHandler(OMX_HANDLETYPE hComponent,
    508     OMX_PTR pAppData, OMX_EVENTTYPE eEvent, OMX_U32 nData1, OMX_U32 nData2,
    509     OMX_PTR pEventData)
    510 {
    511 	OMX_ERRORTYPE eError = OMX_ErrorNone;
    512 	PROXY_COMPONENT_PRIVATE *pCompPrv = NULL;
    513 	OMX_COMPONENTTYPE *hComp = (OMX_COMPONENTTYPE *) hComponent;
    514 
    515 	pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate;
    516 
    517 	PROXY_require((hComp->pComponentPrivate != NULL),
    518 	    OMX_ErrorBadParameter,
    519 	    "This is fatal error, processing cant proceed - please debug");
    520 
    521 	DOMX_ENTER
    522 	    ("hComponent=%p, pCompPrv=%p, eEvent=%p, nData1=%p, nData2=%p, pEventData=%p",
    523 	    hComponent, pCompPrv, eEvent, nData1, nData2, pEventData);
    524 
    525 	if((eEvent ==  OMX_EventCmdComplete) && ((OMX_COMMANDTYPE)nData1 == OMX_CommandStateSet))
    526 	{
    527 		if((OMX_STATETYPE)nData2 == OMX_StateLoaded)
    528 		{
    529 			pCompPrv->IsLoadedState = OMX_TRUE;
    530 		}
    531 	}
    532 	eError = PROXY_EventHandler(hComponent, pAppData, eEvent, nData1, nData2, pEventData);
    533 
    534 	EXIT:
    535 		return eError;
    536 }
    537 
    538 /* ===========================================================================*/
    539 /**
    540  * @name RPC_UTIL_RPC_UTIL_SetStrideAndPadding()
    541  * @brief Gets stride on this port. Used to set stride on OMX to tell whether buffer is 1D or 2D
    542  * @param hRemoteComp [IN]  : Remote component handle.
    543  * @return OMX_ErrorNone = Successful
    544  */
    545 /* ===========================================================================*/
    546 OMX_ERRORTYPE RPC_UTIL_SetStrideAndPadding(OMX_COMPONENTTYPE * hComponent,PROXY_COMPONENT_PRIVATE * pCompPrv)
    547 {
    548 	OMX_ERRORTYPE eError = OMX_ErrorNone;
    549 	OMX_PARAM_PORTDEFINITIONTYPE sPortDef;
    550 	OMX_CONFIG_RECTTYPE tParamStruct;
    551 	OMX_U32 nPortIndex = 0;
    552 
    553 	for(nPortIndex=0; nPortIndex < TOTAL_DEC_PORTS ;nPortIndex++ )
    554 	{
    555 		/*Initializing Structure */
    556 		sPortDef.nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
    557 		sPortDef.nVersion.s.nVersionMajor = OMX_VER_MAJOR;
    558 		sPortDef.nVersion.s.nVersionMinor = OMX_VER_MINOR;
    559 		sPortDef.nVersion.s.nRevision = 0x0;
    560 		sPortDef.nVersion.s.nStep = 0x0;
    561 		sPortDef.nPortIndex = nPortIndex;
    562 
    563 		eError = PROXY_GetParameter(hComponent,OMX_IndexParamPortDefinition,
    564 			   &sPortDef);
    565 		PROXY_assert(eError == OMX_ErrorNone,
    566 			    eError," Error in Proxy GetParameter for Port Def");
    567 
    568 		if (sPortDef.eDomain == OMX_PortDomainVideo && sPortDef.format.video.eCompressionFormat == OMX_VIDEO_CodingUnused)
    569 		{
    570 			if(pCompPrv->proxyPortBuffers[nPortIndex].IsBuffer2D == OMX_TRUE)
    571 			{
    572 				sPortDef.format.video.nStride = LINUX_PAGE_SIZE;
    573 			}
    574 			else
    575 			{
    576 				tParamStruct.nSize = sizeof(OMX_CONFIG_RECTTYPE);
    577 				tParamStruct.nVersion.s.nVersionMajor = OMX_VER_MAJOR;
    578 				tParamStruct.nVersion.s.nVersionMinor = OMX_VER_MINOR;
    579 				tParamStruct.nVersion.s.nRevision = 0x0;
    580 				tParamStruct.nVersion.s.nStep = 0x0;
    581 				tParamStruct.nPortIndex = nPortIndex;
    582 
    583 				eError = PROXY_GetParameter(hComponent,(OMX_INDEXTYPE)OMX_TI_IndexParam2DBufferAllocDimension,
    584 						  &tParamStruct);
    585 				PROXY_assert(eError == OMX_ErrorNone,
    586 					    eError," Error in Proxy GetParameter for 2D index");
    587 
    588 				sPortDef.format.video.nStride = tParamStruct.nWidth;
    589 			}
    590 			eError = PROXY_SetParameter(hComponent,OMX_IndexParamPortDefinition,
    591 				   &sPortDef);
    592 			PROXY_assert(eError == OMX_ErrorNone,
    593 				    eError," Error in Proxy SetParameter for Port Def");
    594 		}
    595 	}
    596 
    597       EXIT:
    598 	return eError;
    599 }
    600 
    601 #endif
    602 
    603 #ifdef ANDROID_QUIRK_LOCK_BUFFER
    604 /* ===========================================================================*/
    605 /**
    606  * @name PROXY_VIDDEC_FillThisBuffer()
    607  * @brief Gets stride on this port. Used to set stride on OMX to tell whether buffer is 1D or 2D
    608  */
    609 /* ===========================================================================*/
    610 OMX_ERRORTYPE PROXY_VIDDEC_FillThisBuffer(OMX_HANDLETYPE hComponent, OMX_BUFFERHEADERTYPE * pBufferHdr)
    611 {
    612 	OMX_ERRORTYPE eError = OMX_ErrorNone, eCompReturn = OMX_ErrorNone;
    613 	RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
    614 	PROXY_COMPONENT_PRIVATE *pCompPrv;
    615 	OMX_COMPONENTTYPE *hComp = (OMX_COMPONENTTYPE *) hComponent;
    616 	OMX_U32 count = 0;
    617 	IMG_native_handle_t*  grallocHandle;
    618 	OMX_PARAM_PORTDEFINITIONTYPE sPortDef;
    619 
    620 	PROXY_require(pBufferHdr != NULL, OMX_ErrorBadParameter, NULL);
    621 	PROXY_require(hComp->pComponentPrivate != NULL, OMX_ErrorBadParameter,
    622 	    NULL);
    623 	PROXY_CHK_VERSION(pBufferHdr, OMX_BUFFERHEADERTYPE);
    624 
    625 	pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate;
    626 
    627 	if(pCompPrv->proxyPortBuffers[OMX_VIDEODECODER_OUTPUT_PORT].proxyBufferType
    628 			== GrallocPointers)
    629 	{
    630 		/* Lock the Gralloc buffer till it gets rendered completely */
    631 		/* Extract the Gralloc handle from the Header and then call lock on that */
    632 		/* Note# There is no error check for the pBufferHdr here*/
    633 		grallocHandle = (IMG_native_handle_t*)pBufferHdr->pBuffer;
    634 
    635 		/*Initializing Structure */
    636 		sPortDef.nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE);
    637 		sPortDef.nVersion.s.nVersionMajor = OMX_VER_MAJOR;
    638 		sPortDef.nVersion.s.nVersionMinor = OMX_VER_MINOR;
    639 		sPortDef.nVersion.s.nRevision = 0x0;
    640 		sPortDef.nVersion.s.nStep = 0x0;
    641 		sPortDef.nPortIndex = OMX_VIDEODECODER_INPUT_PORT;
    642 		eError = PROXY_GetParameter(hComponent,OMX_IndexParamPortDefinition,
    643 				&sPortDef);
    644 		PROXY_assert(eError == OMX_ErrorNone,
    645 				eError," Error in Proxy GetParameter for Port Def");
    646 
    647 		pCompPrv->grallocModule->lock((gralloc_module_t const *) pCompPrv->grallocModule,
    648 				(buffer_handle_t)grallocHandle, GRALLOC_USAGE_HW_RENDER,
    649 				0,0,sPortDef.format.video.nFrameWidth, sPortDef.format.video.nFrameHeight,NULL);
    650 	}
    651 
    652         eRPCError = PROXY_FillThisBuffer(hComponent, pBufferHdr);
    653 
    654 	PROXY_assert(eError == OMX_ErrorNone,
    655 	    eError," Error in Proxy SetParameter for Port Def");
    656 
    657       EXIT:
    658 	DOMX_EXIT("eError: %d", eError);
    659 	return eError;
    660 }
    661 
    662 /* ===========================================================================*/
    663 /**
    664  * @name PROXY_VIDDEC_FillBufferDone()
    665  * @brief Gets stride on this port. Used to set stride on OMX to tell whether buffer is 1D or 2D
    666  */
    667 /* ===========================================================================*/
    668 OMX_ERRORTYPE PROXY_VIDDEC_FillBufferDone(OMX_HANDLETYPE hComponent,
    669     OMX_U32 remoteBufHdr, OMX_U32 nfilledLen, OMX_U32 nOffset, OMX_U32 nFlags,
    670     OMX_TICKS nTimeStamp, OMX_HANDLETYPE hMarkTargetComponent,
    671     OMX_PTR pMarkData)
    672 {
    673 	OMX_ERRORTYPE eError = OMX_ErrorNone, eCompReturn = OMX_ErrorNone;
    674 	RPC_OMX_ERRORTYPE eRPCError = RPC_OMX_ErrorNone;
    675 	PROXY_COMPONENT_PRIVATE *pCompPrv = NULL;
    676 	OMX_COMPONENTTYPE *hComp = (OMX_COMPONENTTYPE *) hComponent;
    677 	OMX_U32 count = 0;
    678 	IMG_native_handle_t*  grallocHandle;
    679 
    680 	PROXY_require((hComp->pComponentPrivate != NULL),
    681 			OMX_ErrorBadParameter,
    682 			"This is fatal error, processing cant proceed - please debug");
    683 
    684 	pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate;
    685 
    686 	/* Lock the Gralloc buffer till it gets rendered completely */
    687 	/* Extract the Gralloc handle from the Header and then call lock on that */
    688 	/* Note# There is no error check for the pBufferHdr here*/
    689 
    690 	if(pCompPrv->proxyPortBuffers[OMX_VIDEODECODER_OUTPUT_PORT].proxyBufferType
    691 			== GrallocPointers) {
    692 		for (count = 0; count < pCompPrv->nTotalBuffers; ++count)
    693 		{
    694 			if (pCompPrv->tBufList[count].pBufHeaderRemote == remoteBufHdr)
    695 			{
    696 				grallocHandle = (IMG_native_handle_t*)(pCompPrv->tBufList[count].pBufHeader)->pBuffer;
    697 				break;
    698 			}
    699 		}
    700 
    701 		PROXY_assert((count != pCompPrv->nTotalBuffers),
    702 				OMX_ErrorBadParameter,
    703 				"Received invalid-buffer header from OMX component");
    704 		pCompPrv->grallocModule->unlock((gralloc_module_t const *) pCompPrv->grallocModule, (buffer_handle_t)grallocHandle);
    705 	}
    706 
    707 	eRPCError = PROXY_FillBufferDone(hComponent,remoteBufHdr, nfilledLen, nOffset, nFlags,
    708 		nTimeStamp, hMarkTargetComponent, pMarkData);
    709 
    710 	PROXY_assert(eError == OMX_ErrorNone,
    711 			eError," Error in PROXY FillBufferDone for Port Def");
    712 
    713 EXIT:
    714 	DOMX_EXIT("eError: %d", eError);
    715 	return eError;
    716 }
    717 
    718 #endif
    719 
    720