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