1e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen/* 2e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * Copyright (c) 2010, Texas Instruments Incorporated 3e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * All rights reserved. 4e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * 5e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * Redistribution and use in source and binary forms, with or without 6e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * modification, are permitted provided that the following conditions 7e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * are met: 8e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * 9e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * * Redistributions of source code must retain the above copyright 10e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * notice, this list of conditions and the following disclaimer. 11e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * 12e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * * Redistributions in binary form must reproduce the above copyright 13e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * notice, this list of conditions and the following disclaimer in the 14e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * documentation and/or other materials provided with the distribution. 15e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * 16e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * * Neither the name of Texas Instruments Incorporated nor the names of 17e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * its contributors may be used to endorse or promote products derived 18e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * from this software without specific prior written permission. 19e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * 20e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 22e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 24e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 25e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 26e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 27e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 28e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 29e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 30e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen */ 32e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 33e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen/*============================================================== 34e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen *! Revision History 35e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen *! ============================ 36e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen *! 21-Oct-2011 Rajesh vandanapu sarthav@ti.com: Initial Version 37e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen *================================================================*/ 38e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 39e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen/****************************************************************** 40e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * INCLUDE FILES 41e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen ******************************************************************/ 42e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen#include <stdio.h> 43e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen#include <string.h> 44e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen#include <assert.h> 45e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen#include "omx_proxy_common.h" 46e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen#include <timm_osal_interfaces.h> 47e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen#include "OMX_TI_IVCommon.h" 48e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen#include "OMX_TI_Video.h" 49e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen#include "OMX_TI_Index.h" 50e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 51e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen#ifdef ENABLE_RAW_BUFFERS_DUMP_UTILITY 52e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen#define LOG_TAG "OMXPROXYVIDEODEC" 53e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen#include <fcntl.h> 54e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen#include <cutils/properties.h> 55e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen#include <utils/Log.h> 56e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen#include <stdlib.h> 57e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen#include <errno.h> 58e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen#endif 59e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 60e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen#define COMPONENT_NAME "OMX.TI.DUCATI1.VIDEO.DECODER" 61e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen/* needs to be specific for every configuration wrapper */ 62e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 63e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen/* DEFINITIONS for parsing the config information & sequence header for WMV*/ 64e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen#define VIDDEC_GetUnalignedDword( pb, dw ) \ 65e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen (dw) = ((OMX_U32) *(pb + 3) << 24) + \ 66e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen ((OMX_U32) *(pb + 2) << 16) + \ 67e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen ((OMX_U16) *(pb + 1) << 8) + *pb; 68e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 69e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen#define VIDDEC_GetUnalignedDwordEx( pb, dw ) VIDDEC_GetUnalignedDword( pb, dw ); (pb) += sizeof(OMX_U32); 70e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen#define VIDDEC_LoadDWORD( dw, p ) VIDDEC_GetUnalignedDwordEx( p, dw ) 71e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen#define VIDDEC_MAKEFOURCC(ch0, ch1, ch2, ch3) \ 72e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen ((OMX_U32)(OMX_U8)(ch0) | ((OMX_U32)(OMX_U8)(ch1) << 8) | \ 73e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen ((OMX_U32)(OMX_U8)(ch2) << 16) | ((OMX_U32)(OMX_U8)(ch3) << 24 )) 74e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 75e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen#define VIDDEC_FOURCC(ch0, ch1, ch2, ch3) VIDDEC_MAKEFOURCC(ch0, ch1, ch2, ch3) 76e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 77e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen#define FOURCC_WMV3 VIDDEC_FOURCC('W','M','V','3') 78e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen#define FOURCC_WMV2 VIDDEC_FOURCC('W','M','V','2') 79e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen#define FOURCC_WMV1 VIDDEC_FOURCC('W','M','V','1') 80e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen#define FOURCC_WVC1 VIDDEC_FOURCC('W','V','C','1') 81e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 82e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen#define CSD_POSITION 51 /*Codec Specific Data position on the "stream propierties object"(ASF spec)*/ 83e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 84e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chentypedef struct VIDDEC_WMV_RCV_struct { 85e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_U32 nNumFrames : 24; 86e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_U32 nFrameType : 8; 87e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_U32 nID : 32; 88e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_U32 nStructData : 32; //STRUCT_C 89e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_U32 nVertSize; //STRUCT_A-1 90e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_U32 nHorizSize; //STRUCT_A-2 91e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_U32 nID2 : 32; 92e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_U32 nSequenceHdr : 32; //STRUCT_B 93e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen} VIDDEC_WMV_RCV_struct; 94e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 95e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chentypedef struct VIDDEC_WMV_VC1_struct { 96e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_U32 nNumFrames : 24; 97e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_U32 nFrameType : 8; 98e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_U32 nID : 32; 99e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_U32 nStructData : 32; //STRUCT_C 100e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_U32 nVertSize; //STRUCT_A-1 101e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_U32 nHorizSize; //STRUCT_A-2 102e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_U32 nID2 : 32; 103e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_U32 nSequenceHdr : 32; //STRUCT_B 104e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen} VIDDEC_WMV_VC1_struct; 105e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 106e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 107e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. ChenOMX_ERRORTYPE PrearrageEmptyThisBuffer(OMX_HANDLETYPE hComponent, 108e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_BUFFERHEADERTYPE * pBufferHdr) 109e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen{ 110e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_ERRORTYPE eError = OMX_ErrorNone; 111e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen PROXY_COMPONENT_PRIVATE *pCompPrv = NULL; 112e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_COMPONENTTYPE *hComp = (OMX_COMPONENTTYPE *) hComponent; 113e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_U8* pBuffer = NULL; 114e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_U8* pData = NULL; 115e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_U32 nValue = 0; 116e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_U32 nWidth = 0; 117e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_U32 nHeight = 0; 118e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_U32 nActualCompression = 0; 119e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_U8* pCSD = NULL; 120e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_U32 nSize_CSD = 0; 121e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen DOMX_ENTER(""); 122e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 123e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen PROXY_assert(pBufferHdr != NULL, OMX_ErrorBadParameter, NULL); 124e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 125e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen if (pBufferHdr->nFlags & OMX_BUFFERFLAG_CODECCONFIG){ 126e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen PROXY_assert(hComp->pComponentPrivate != NULL, OMX_ErrorBadParameter, NULL); 127e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 128e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen pCompPrv = (PROXY_COMPONENT_PRIVATE *) hComp->pComponentPrivate; 129e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen /* Get component role */ 130e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_PARAM_COMPONENTROLETYPE compRole; 131e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen compRole.nSize = sizeof(OMX_PARAM_COMPONENTROLETYPE); 132e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen compRole.nVersion.s.nVersionMajor = 1; 133e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen compRole.nVersion.s.nVersionMinor = 1; //Ducati OMX version 134e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen compRole.nVersion.s.nRevision = 0; 135e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen compRole.nVersion.s.nStep = 0; 136e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 137e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen eError = PROXY_GetParameter(hComp, OMX_IndexParamStandardComponentRole, &compRole); 138e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen if(eError != OMX_ErrorNone){ 139e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen DOMX_ERROR("Error getting OMX_IndexParamStandardComponentRole"); 140e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen } 141e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 142e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen if(!strcmp((char *)(compRole.cRole), "video_decoder.wmv")){ 143e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen pBuffer = pBufferHdr->pBuffer; 144e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 145e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen VIDDEC_WMV_RCV_struct sStructRCV; 146e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 147e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen DOMX_DEBUG("nFlags: %x", pBufferHdr->nFlags); 148e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 149e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen pData = pBufferHdr->pBuffer + 15; /*Position to Width & Height*/ 150e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen VIDDEC_LoadDWORD(nValue, pData); 151e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen nWidth = nValue; 152e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen VIDDEC_LoadDWORD(nValue, pData); 153e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen nHeight = nValue; 154e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 155e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen pData += 4; /*Position to compression type*/ 156e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen VIDDEC_LoadDWORD(nValue, pData); 157e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen nActualCompression = nValue; 158e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 159e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen /*Seting pCSD to proper position*/ 160e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen pCSD = pBufferHdr->pBuffer; 161e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen pCSD += CSD_POSITION; 162e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen nSize_CSD = pBufferHdr->nFilledLen - CSD_POSITION; 163e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 164e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen if(nActualCompression == FOURCC_WMV3){ 165e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 166e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen //From VC-1 spec: Table 265: Sequence Layer Data Structure 167e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen sStructRCV.nNumFrames = 0xFFFFFF; /*Infinite frame number*/ 168e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen sStructRCV.nFrameType = 0xc5; /*0x85 is the value given by ASF to rcv converter*/ 169e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen sStructRCV.nID = 0x04; /*WMV3*/ 170e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen sStructRCV.nStructData = 0x018a3106; /*0x06318a01zero fill 0x018a3106*/ 171e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen sStructRCV.nVertSize = nHeight; 172e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen sStructRCV.nHorizSize = nWidth; 173e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen sStructRCV.nID2 = 0x0c; /* Fix value */ 174e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen sStructRCV.nSequenceHdr = 0x00002a9f; /* This value is not provided by parser, so giving a value from a video*/ 175e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 176e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen DOMX_DEBUG("initial: nStructData: %x", sStructRCV.nStructData); 177e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen DOMX_DEBUG("pCSD = %x", (OMX_U32)*pCSD); 178e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 179e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen sStructRCV.nStructData = (OMX_U32)pCSD[0] << 0 | 180e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen pCSD[1] << 8 | 181e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen pCSD[2] << 16 | 182e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen pCSD[3] << 24; 183e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 184e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen DOMX_DEBUG("FINAL: nStructData: %x", sStructRCV.nStructData); 185e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 186e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen //Copy RCV structure to actual buffer 187e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen assert(pBufferHdr->nFilledLen < pBufferHdr->nAllocLen); 188e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen pBufferHdr->nFilledLen = sizeof(VIDDEC_WMV_RCV_struct); 189e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen TIMM_OSAL_Memcpy(pBufferHdr->pBuffer, (OMX_U8*)(&sStructRCV), 190e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen pBufferHdr->nFilledLen); 191e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 192e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen } 193e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen else if (nActualCompression == FOURCC_WVC1){ 194e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen DOMX_DEBUG("VC-1 Advance Profile prearrange"); 195e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen pBufferHdr->nOffset = pBufferHdr->nOffset+52; 196e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen pBufferHdr->nFilledLen= pBufferHdr->nFilledLen-52; 197e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen } 198e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen } 199e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen } 200e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 201e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen EXIT: 202e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen DOMX_EXIT("eError: %d", eError); 203e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 204e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen return PROXY_EmptyThisBuffer(hComponent, pBufferHdr); 205e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen} 206e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 207e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen#ifdef ENABLE_RAW_BUFFERS_DUMP_UTILITY 208e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen/** 209e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen* Usage# 210e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen* By default this feature is kept disabled to avoid security leaks. 211e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen* 212e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen* (1) Uncomment the below 2 lines from Android.mk 213e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen* #LOCAL_CFLAGS += -DENABLE_RAW_BUFFERS_DUMP_UTILITY 214e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen* #LOCAL_SHARED_LIBRARIES += libcutils 215e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen* And rebuild the omx proxy common component 216e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen* 217e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen* (2) Before start playback, make sure that "data" folder has r/w 218e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen* permissions. For this, execute the below 219e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen* mount -o rw,remount -t ext3 /dev/block/mmcblk0p1 /data/ 220e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen* chmod 777 /data/ 221e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen* 222e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen* (3) Set the property for number of frames to dump 223e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen* eg: setprop debug.video.dumpframe 10:20 224e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen* would dump frames from 10 to 20. 225e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen* 226e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen* (4) Pull the frames to PC over adb 227e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen* adb pull /data/frame_10.txt 228e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen* 229e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen* (5) Analyse on PC tools. 230e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen*/ 231e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 232e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen/* 233e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen* Method to convert NV12 to YUV420p for PC analysis 234e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen*/ 235e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chenstatic void convertNV12ToYuv420(DebugFrame_Dump *frameInfo, void *dst) 236e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen{ 237e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen int stride = 4096; /* ARM Page size = 4k */ 238e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen uint32_t ybuf_offset = frameInfo->frame_yoffset * stride + frameInfo->frame_xoffset; 239e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen uint8_t* p1y = (uint8_t*)frameInfo->y_uv[0] + ybuf_offset; 240e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen uint8_t* p2y = (uint8_t*) dst; 241e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen int i, j, j1; 242e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen int width = frameInfo->frame_width; 243e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen int height = frameInfo->frame_height; 244e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 245e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen LOGD("Coverting NV-12 to YUV420p Width[%d], Height[%d] and Stride[%d] offset[%d]", 246e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen width, height, stride, ybuf_offset); 247e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 248e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen /* copy y-buffer, almost bytewise copy, except for stride jumps.*/ 249e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen for(i=0;i<height;i++) 250e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen { 251e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen /* copy whole row of Y pixels. source and desination will point to new row each time.*/ 252e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen memcpy(p2y+i*width, p1y+i*stride, width); 253e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen } 254e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 255e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen /** copy uv buffers 256e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * rearrange from packed planar [uvuvuv] to planar [uuu][vvvv] packages pixel wise 257e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen * calculate the offset for UV buffer 258e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen */ 259e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen uint32_t UV_offset = frameInfo->frame_xoffset + 260e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen (frameInfo->frame_yoffset * stride)/2; 261e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 262e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen const uint8_t* p1uv = (uint8_t*)frameInfo->y_uv[1] + UV_offset; 263e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 264e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen uint8_t* p2u = ((uint8_t*) dst + (width * height)); 265e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen uint8_t* p2v = ((uint8_t*) p2u + ((width/2) * (height/2))); 266e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen for(i=0;(i < height/2);i++) 267e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen { 268e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen for(j=0,j1=0;(j< width/2);j++,j1+=2) 269e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen { 270e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen p2u[j] = p1uv[j1]; 271e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen p2v[j] = p1uv[j1+1]; 272e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen } 273e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen p1uv+=stride; 274e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen p2u+=width/2; 275e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen p2v+=width/2; 276e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen } 277e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen} 278e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 279e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chenvoid DumpVideoFrame(DebugFrame_Dump *frameInfo) 280e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen{ 281e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen /* First convert the frame to 420p and then write to SD Card */ 282e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_U32 framesize = (frameInfo->frame_width * 283e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen frameInfo->frame_height * 3) / 2; 284e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen OMX_U8* localbuffer = malloc(framesize); 285e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen if (localbuffer == NULL) 286e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen { 287e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen LOGE("NO HEAP"); 288e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen goto EXIT; 289e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen } 290e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen convertNV12ToYuv420(frameInfo, localbuffer); 291e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen int filedes = -1; 292e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen char framenumber[100]; 293e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen sprintf(framenumber, "/data/frame_%ld.txt", frameInfo->runningFrame); 294e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen LOGD("file path %s",framenumber); 295e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen filedes = open(framenumber, O_CREAT | O_WRONLY | O_SYNC | O_TRUNC, 0777); 296e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen if(filedes < 0) 297e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen { 298e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen LOGE("\n!!!!!!!!!Error in file open!!!!!!!! [%d][%s]\n", filedes, strerror(errno)); 299e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen goto EXIT; 300e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen } 301e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen int ret = write (filedes, (void*)localbuffer, framesize); 302e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen if (ret < (int)framesize) 303e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen { 304e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen LOGE("File Write Failed"); 305e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen } 306e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. ChenEXIT: 307e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen if (localbuffer) 308e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen { 309e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen free(localbuffer); 310e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen localbuffer = NULL; 311e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen } 312e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen if (filedes > 0) 313e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen { 314e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen close(filedes); 315e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen } 316e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen} 317e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen 318e4b5eb97c1ebb41905d9acb8cf1c0992688152e9Mike J. Chen#endif 319