13306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ------------------------------------------------------------------
23306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Copyright (C) 1998-2009 PacketVideo
33306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
43306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Licensed under the Apache License, Version 2.0 (the "License");
53306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * you may not use this file except in compliance with the License.
63306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * You may obtain a copy of the License at
73306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
83306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *      http://www.apache.org/licenses/LICENSE-2.0
93306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Unless required by applicable law or agreed to in writing, software
113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * distributed under the License is distributed on an "AS IS" BASIS,
123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * express or implied.
143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * See the License for the specific language governing permissions
153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * and limitations under the License.
163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * -------------------------------------------------------------------
173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong */
182ad2a92318a3b9daf78ebcdc597085adbf32600dMarco Nelissen#define LOG_TAG "pvdec_api"
192ad2a92318a3b9daf78ebcdc597085adbf32600dMarco Nelissen#include <log/log.h>
203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "mp4dec_lib.h"
213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "vlc_decode.h"
223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "bitstream.h"
233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
249abb7401df730b5c510f6b8dac2716a0928d9623Abhishek Arya#ifndef INT32_MAX
259abb7401df730b5c510f6b8dac2716a0928d9623Abhishek Arya#define INT32_MAX 0x7fffffff
269abb7401df730b5c510f6b8dac2716a0928d9623Abhishek Arya#endif
279abb7401df730b5c510f6b8dac2716a0928d9623Abhishek Arya
289abb7401df730b5c510f6b8dac2716a0928d9623Abhishek Arya#ifndef SIZE_MAX
299abb7401df730b5c510f6b8dac2716a0928d9623Abhishek Arya#define SIZE_MAX ((size_t) -1)
309abb7401df730b5c510f6b8dac2716a0928d9623Abhishek Arya#endif
319abb7401df730b5c510f6b8dac2716a0928d9623Abhishek Arya
323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#define OSCL_DISABLE_WARNING_CONDITIONAL_IS_CONSTANT
333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef DEC_INTERNAL_MEMORY_OPT
353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#define QCIF_MBS 99
363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#define QCIF_BS (4*QCIF_MBS)
373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#define QCIF_MB_ROWS 11
383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongextern uint8                IMEM_sliceNo[QCIF_MBS];
393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongextern uint8                IMEM_acPredFlag[QCIF_MBS];
403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongextern uint8                IMEM_headerInfo_Mode[QCIF_MBS];
413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongextern uint8                IMEM_headerInfo_CBP[QCIF_MBS];
423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongextern int                  IMEM_headerInfo_QPMB[QCIF_MBS];
433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongextern MacroBlock           IMEM_mblock;
443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongextern MOT                  IMEM_motX[QCIF_BS];
453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongextern MOT                  IMEM_motY[QCIF_BS];
463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongextern BitstreamDecVideo    IMEM_BitstreamDecVideo[4];
473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongextern typeDCStore          IMEM_predDC[QCIF_MBS];
483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongextern typeDCACStore        IMEM_predDCAC_col[QCIF_MB_ROWS+1];
493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongextern VideoDecData         IMEM_VideoDecData[1];
513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongextern Vop                  IMEM_currVop[1];
523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongextern Vop                  IMEM_prevVop[1];
533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongextern PIXEL                IMEM_currVop_yChan[QCIF_MBS*128*3];
543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongextern PIXEL                IMEM_prevVop_yChan[QCIF_MBS*128*3];
553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongextern uint8                IMEM_pstprcTypCur[6*QCIF_MBS];
563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongextern uint8                IMEM_pstprcTypPrv[6*QCIF_MBS];
573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongextern Vop                  IMEM_vopHEADER[2];
603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongextern Vol                  IMEM_VOL[2];
613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongextern Vop                  IMEM_vopHeader[2][1];
623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongextern Vol                  IMEM_vol[2][1];
633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : PVInitVideoDecoder()                                         */
683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 04/11/2000, 08/29/2000                                       */
693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : Initialization of the MPEG-4 video decoder library.          */
703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*             The return type is Bool instead of PV_STATUS because         */
713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*             we don't want to expose PV_STATUS to (outside) programmers   */
723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*             that use our decoder library SDK.                            */
733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   : PV_TRUE if successed, PV_FALSE if failed.                    */
753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongOSCL_EXPORT_REF Bool PVInitVideoDecoder(VideoDecControls *decCtrl, uint8 *volbuf[],
783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        int32 *volbuf_size, int nLayers, int width, int height, MP4DecodingMode mode)
793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VideoDecData *video = (VideoDecData *) decCtrl->videoDecoderData;
813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Bool status = PV_TRUE;
823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int idx;
833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamDecVideo *stream;
843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    oscl_memset(decCtrl, 0, sizeof(VideoDecControls)); /* fix a size bug.   03/28/2001 */
873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    decCtrl->nLayers = nLayers;
883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    for (idx = 0; idx < nLayers; idx++)
893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        decCtrl->volbuf[idx] = volbuf[idx];
913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        decCtrl->volbuf_size[idx] = volbuf_size[idx];
923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* memory allocation & initialization */
953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef DEC_INTERNAL_MEMORY_OPT
963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video = IMEM_VideoDecData;
973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#else
983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video = (VideoDecData *) oscl_malloc(sizeof(VideoDecData));
993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
1003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video != NULL)
1013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
1023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        oscl_memset(video, 0, sizeof(VideoDecData));
1033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->memoryUsage = sizeof(VideoDecData);
1043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->numberOfLayers = nLayers;
1053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef DEC_INTERNAL_MEMORY_OPT
1063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->vol = (Vol **) IMEM_VOL;
1073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#else
108b62a73b860757143d3b140b2985fdae71e18d675Wei Jia        if ((size_t)nLayers > SIZE_MAX / sizeof(Vol *)) {
109b62a73b860757143d3b140b2985fdae71e18d675Wei Jia            status = PV_FALSE;
110b62a73b860757143d3b140b2985fdae71e18d675Wei Jia            goto fail;
111b62a73b860757143d3b140b2985fdae71e18d675Wei Jia        }
112b62a73b860757143d3b140b2985fdae71e18d675Wei Jia
1133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->vol = (Vol **) oscl_malloc(nLayers * sizeof(Vol *));
1143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
1153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->vol == NULL) status = PV_FALSE;
1163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->memoryUsage += nLayers * sizeof(Vol *);
1173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* we need to setup this pointer for the application to */
1203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /*    pass it around.                                   */
1213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        decCtrl->videoDecoderData = (void *) video;
1223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->videoDecControls = decCtrl;  /* yes. we have a cyclic */
1233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* references here :)    */
1243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* Allocating Vop space, this has to change when we add */
1263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /*    spatial scalability to the decoder                */
1273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef DEC_INTERNAL_MEMORY_OPT
1283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->currVop = IMEM_currVop;
1293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->currVop == NULL) status = PV_FALSE;
1303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else oscl_memset(video->currVop, 0, sizeof(Vop));
1313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->prevVop = IMEM_prevVop;
1323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->prevVop == NULL) status = PV_FALSE;
1333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else oscl_memset(video->prevVop, 0, sizeof(Vop));
1343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->memoryUsage += (sizeof(Vop) * 2);
1353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->vopHeader = (Vop **) IMEM_vopHEADER;
1363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#else
1373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->currVop = (Vop *) oscl_malloc(sizeof(Vop));
1393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->currVop == NULL) status = PV_FALSE;
1403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else oscl_memset(video->currVop, 0, sizeof(Vop));
1413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->prevVop = (Vop *) oscl_malloc(sizeof(Vop));
1423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->prevVop == NULL) status = PV_FALSE;
1433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else oscl_memset(video->prevVop, 0, sizeof(Vop));
1443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->memoryUsage += (sizeof(Vop) * 2);
1453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
146b62a73b860757143d3b140b2985fdae71e18d675Wei Jia        if ((size_t)nLayers > SIZE_MAX / sizeof(Vop *)) {
147b62a73b860757143d3b140b2985fdae71e18d675Wei Jia            status = PV_FALSE;
148b62a73b860757143d3b140b2985fdae71e18d675Wei Jia            goto fail;
149b62a73b860757143d3b140b2985fdae71e18d675Wei Jia        }
150b62a73b860757143d3b140b2985fdae71e18d675Wei Jia
1513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->vopHeader = (Vop **) oscl_malloc(sizeof(Vop *) * nLayers);
1523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
1533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->vopHeader == NULL) status = PV_FALSE;
1543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else oscl_memset(video->vopHeader, 0, sizeof(Vop *)*nLayers);
1553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->memoryUsage += (sizeof(Vop *) * nLayers);
1563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->initialized = PV_FALSE;
1583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* Decode the header to get all information to allocate data */
1593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (status == PV_TRUE)
1603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
1613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* initialize decoded frame counter.   04/24/2001 */
1623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->frame_idx = -1;
1633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            for (idx = 0; idx < nLayers; idx++)
1663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
1673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef DEC_INTERNAL_MEMORY_OPT
1693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->vopHeader[idx] = IMEM_vopHeader[idx];
1703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#else
1713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->vopHeader[idx] = (Vop *) oscl_malloc(sizeof(Vop));
1723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
1733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (video->vopHeader[idx] == NULL)
1743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
1753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    status = PV_FALSE;
1763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    break;
1773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
1783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else
1793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
1803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    oscl_memset(video->vopHeader[idx], 0, sizeof(Vop));
1813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    video->vopHeader[idx]->timeStamp = 0;
1823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    video->memoryUsage += (sizeof(Vop));
1833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
1843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef DEC_INTERNAL_MEMORY_OPT
1853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->vol[idx] = IMEM_vol[idx];
1863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->memoryUsage += sizeof(Vol);
1873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                oscl_memset(video->vol[idx], 0, sizeof(Vol));
1883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (video->vol[idx] == NULL) status = PV_FALSE;
1893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                stream = IMEM_BitstreamDecVideo;
1903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#else
1913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->vol[idx] = (Vol *) oscl_malloc(sizeof(Vol));
1923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (video->vol[idx] == NULL)
1933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
1943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    status = PV_FALSE;
1953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    break;
1963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
1973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else
1983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
1993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    video->memoryUsage += sizeof(Vol);
2003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    oscl_memset(video->vol[idx], 0, sizeof(Vol));
2013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
2023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                stream = (BitstreamDecVideo *) oscl_malloc(sizeof(BitstreamDecVideo));
2043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
2053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->memoryUsage += sizeof(BitstreamDecVideo);
2063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (stream == NULL)
2073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
2083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    status = PV_FALSE;
2093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    break;
2103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
2113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else
2123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
2133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    int32 buffer_size;
2143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if ((buffer_size = BitstreamOpen(stream, idx)) < 0)
2153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
2163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        mp4dec_log("InitVideoDecoder(): Can't allocate bitstream buffer.\n");
2173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        status = PV_FALSE;
2183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        break;
2193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
2203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    video->memoryUsage += buffer_size;
2213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    video->vol[idx]->bitstream = stream;
2223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    video->vol[idx]->volID = idx;
2233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    video->vol[idx]->timeInc_offset = 0;  /*  11/12/01 */
2243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    video->vlcDecCoeffIntra = &VlcDecTCOEFShortHeader;
2253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    video->vlcDecCoeffInter = &VlcDecTCOEFShortHeader;
2263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (mode == MPEG4_MODE)
2273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
2283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        /* Set up VOL header bitstream for frame-based decoding.  08/30/2000 */
2293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        BitstreamReset(stream, decCtrl->volbuf[idx], decCtrl->volbuf_size[idx]);
2303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        switch (DecodeVOLHeader(video, idx))
2323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        {
2333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            case PV_SUCCESS :
2343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                if (status == PV_TRUE)
2353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    status = PV_TRUE;   /*  we want to make sure that if first layer is bad, second layer is good return PV_FAIL */
2363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                else
2373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                    status = PV_FALSE;
2383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                break;
2393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_TOLERATE_VOL_ERRORS
2403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            case PV_BAD_VOLHEADER:
2413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                status = PV_TRUE;
2423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                break;
2433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
2443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            default :
2453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                status = PV_FALSE;
2463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                break;
2473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        }
2483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
2503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    else
2513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
2523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        video->shortVideoHeader = PV_TRUE;
2533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
2543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (video->shortVideoHeader == PV_TRUE)
2563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
2573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        mode = H263_MODE;
2583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        /* Set max width and height.  In H.263 mode, we use    */
2593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        /*  volbuf_size[0] to pass in width and volbuf_size[1] */
2603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        /*  to pass in height.                    04/23/2001 */
2613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        video->prevVop->temporalRef = 0; /*  11/12/01 */
2623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        /* Compute some convenience variables:   04/23/2001 */
2633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        video->vol[idx]->quantType = 0;
2643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        video->vol[idx]->quantPrecision = 5;
2653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        video->vol[idx]->errorResDisable = 1;
2663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        video->vol[idx]->dataPartitioning = 0;
2673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        video->vol[idx]->useReverseVLC = 0;
2683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        video->intra_acdcPredDisable = 1;
2693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        video->vol[idx]->scalability = 0;
2703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
27155dfeeb53fdd2e940d0b7c7e3661152ca51ed85eRonghua Wu                        video->displayWidth = width;
27255dfeeb53fdd2e940d0b7c7e3661152ca51ed85eRonghua Wu                        video->displayHeight = height;
27355dfeeb53fdd2e940d0b7c7e3661152ca51ed85eRonghua Wu                        video->width = (width + 15) & -16;
27455dfeeb53fdd2e940d0b7c7e3661152ca51ed85eRonghua Wu                        video->height = (height + 15) & -16;
27555dfeeb53fdd2e940d0b7c7e3661152ca51ed85eRonghua Wu                        video->size = (int32)video->width * video->height;
27655dfeeb53fdd2e940d0b7c7e3661152ca51ed85eRonghua Wu
2773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT
2783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        video->modified_quant = 0;
2793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        video->advanced_INTRA = 0;
2803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        video->deblocking = 0;
2813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        video->slice_structure = 0;
2823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
2833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
2843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
2863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
2873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
2893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (status != PV_FALSE)
2903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
2913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = PVAllocVideoData(decCtrl, width, height, nLayers);
2923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->initialized = PV_TRUE;
2933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
2943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
2963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
2973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = PV_FALSE;
2983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
300b62a73b860757143d3b140b2985fdae71e18d675Wei Jiafail:
3013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (status == PV_FALSE) PVCleanUpVideoDecoder(decCtrl);
3023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return status;
3043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
3053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongBool PVAllocVideoData(VideoDecControls *decCtrl, int width, int height, int nLayers)
3073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
3083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VideoDecData *video = (VideoDecData *) decCtrl->videoDecoderData;
3093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Bool status = PV_TRUE;
3103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int nTotalMB;
3113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int nMBPerRow;
3123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 size;
3133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->shortVideoHeader == PV_TRUE)
3153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
316841d22b0645ff48a03e7f500f95458f3d70a0a61Ronghua Wu        video->displayWidth = width;
317841d22b0645ff48a03e7f500f95458f3d70a0a61Ronghua Wu        video->displayHeight = height;
318841d22b0645ff48a03e7f500f95458f3d70a0a61Ronghua Wu        video->width = (width + 15) & -16;
319841d22b0645ff48a03e7f500f95458f3d70a0a61Ronghua Wu        video->height = (height + 15) & -16;
3203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->nMBPerRow =
3223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->nMBinGOB  = video->width / MB_SIZE;
3233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->nMBPerCol =
3243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->nGOBinVop = video->height / MB_SIZE;
3253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->nTotalMB =
3263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->nMBPerRow * video->nMBPerCol;
3273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
329b62a73b860757143d3b140b2985fdae71e18d675Wei Jia    if (((uint64_t)video->width * video->height) > (uint64_t)INT32_MAX / sizeof(PIXEL)) {
330b62a73b860757143d3b140b2985fdae71e18d675Wei Jia        return PV_FALSE;
331b62a73b860757143d3b140b2985fdae71e18d675Wei Jia    }
332b62a73b860757143d3b140b2985fdae71e18d675Wei Jia
3333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    size = (int32)sizeof(PIXEL) * video->width * video->height;
3343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_MEMORY_POOL
3353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    decCtrl->size = size;
3363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#else
3373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef DEC_INTERNAL_MEMORY_OPT
3383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->currVop->yChan = IMEM_currVop_yChan; /* Allocate memory for all VOP OKA 3/2/1*/
3393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->currVop->yChan == NULL) status = PV_FALSE;
3403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->currVop->uChan = video->currVop->yChan + size;
3413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->currVop->vChan = video->currVop->uChan + (size >> 2);
3423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->prevVop->yChan = IMEM_prevVop_yChan; /* Allocate memory for all VOP OKA 3/2/1*/
3443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->prevVop->yChan == NULL) status = PV_FALSE;
3453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->prevVop->uChan = video->prevVop->yChan + size;
3463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->prevVop->vChan = video->prevVop->uChan + (size >> 2);
3473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#else
348b2ae4351539de9aa4667fcb3e02ba40d9c6bd094Wei Jia    if (size > INT32_MAX / 3) {
349b62a73b860757143d3b140b2985fdae71e18d675Wei Jia        return PV_FALSE;
350b62a73b860757143d3b140b2985fdae71e18d675Wei Jia    }
3513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->currVop->yChan = (PIXEL *) oscl_malloc(size * 3 / 2); /* Allocate memory for all VOP OKA 3/2/1*/
3523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->currVop->yChan == NULL) status = PV_FALSE;
3533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->currVop->uChan = video->currVop->yChan + size;
3553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->currVop->vChan = video->currVop->uChan + (size >> 2);
3563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->prevVop->yChan = (PIXEL *) oscl_malloc(size * 3 / 2); /* Allocate memory for all VOP OKA 3/2/1*/
3573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->prevVop->yChan == NULL) status = PV_FALSE;
3583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->prevVop->uChan = video->prevVop->yChan + size;
3603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->prevVop->vChan = video->prevVop->uChan + (size >> 2);
3613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
3623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->memoryUsage += (size * 3);
3633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif   // MEMORY_POOL
3643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Note that baseVop, enhcVop is only used to hold enhancement */
3653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*    layer header information.                  05/04/2000  */
3663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (nLayers > 1)
3673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->prevEnhcVop = (Vop *) oscl_malloc(sizeof(Vop));
3693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->memoryUsage += (sizeof(Vop));
3703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->prevEnhcVop == NULL)
3713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = PV_FALSE;
3733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
3753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            oscl_memset(video->prevEnhcVop, 0, sizeof(Vop));
3773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifndef PV_MEMORY_POOL
378b2ae4351539de9aa4667fcb3e02ba40d9c6bd094Wei Jia            if (size > INT32_MAX / 3) {
379b62a73b860757143d3b140b2985fdae71e18d675Wei Jia                return PV_FALSE;
380b62a73b860757143d3b140b2985fdae71e18d675Wei Jia            }
381b62a73b860757143d3b140b2985fdae71e18d675Wei Jia
3823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->prevEnhcVop->yChan = (PIXEL *) oscl_malloc(size * 3 / 2); /* Allocate memory for all VOP OKA 3/2/1*/
3833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->prevEnhcVop->yChan == NULL) status = PV_FALSE;
3843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->prevEnhcVop->uChan = video->prevEnhcVop->yChan + size;
3853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->prevEnhcVop->vChan = video->prevEnhcVop->uChan + (size >> 2);
3863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->memoryUsage += (3 * size / 2);
3873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
3883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Allocating space for slices, AC prediction flag, and */
3923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*    AC/DC prediction storage */
3933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    nTotalMB = video->nTotalMB;
3943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    nMBPerRow = video->nMBPerRow;
3953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef DEC_INTERNAL_MEMORY_OPT
3973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->sliceNo = (uint8 *)(IMEM_sliceNo);
3983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->sliceNo == NULL) status = PV_FALSE;
3993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->memoryUsage += nTotalMB;
4003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->acPredFlag = (uint8 *)(IMEM_acPredFlag);
4013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->acPredFlag == NULL) status = PV_FALSE;
4023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->memoryUsage += (nTotalMB);
4033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->predDC = (typeDCStore *)(IMEM_predDC);
4043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->predDC == NULL) status = PV_FALSE;
4053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->memoryUsage += (nTotalMB * sizeof(typeDCStore));
4063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->predDCAC_col = (typeDCACStore *)(IMEM_predDCAC_col);
4073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->predDCAC_col == NULL) status = PV_FALSE;
4083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->memoryUsage += ((nMBPerRow + 1) * sizeof(typeDCACStore));
4093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->predDCAC_row = video->predDCAC_col + 1;
4103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->headerInfo.Mode = (uint8 *)(IMEM_headerInfo_Mode);
4113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->headerInfo.Mode == NULL) status = PV_FALSE;
4123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->memoryUsage += nTotalMB;
4133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->headerInfo.CBP = (uint8 *)(IMEM_headerInfo_CBP);
4143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->headerInfo.CBP == NULL) status = PV_FALSE;
4153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->memoryUsage += nTotalMB;
4163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->QPMB = (int *)(IMEM_headerInfo_QPMB);
4173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->QPMB == NULL) status = PV_FALSE;
4183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->memoryUsage += (nTotalMB * sizeof(int));
4193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->mblock = &IMEM_mblock;
4203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->mblock == NULL) status = PV_FALSE;
4213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    oscl_memset(video->mblock->block, 0, sizeof(int16)*6*NCOEFF_BLOCK); //  Aug 23,2005
4223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->memoryUsage += sizeof(MacroBlock);
4243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->motX = (MOT *)(IMEM_motX);
4253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->motX == NULL) status = PV_FALSE;
4263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->motY = (MOT *)(IMEM_motY);
4273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->motY == NULL) status = PV_FALSE;
4283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->memoryUsage += (sizeof(MOT) * 8 * nTotalMB);
4293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#else
4303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->sliceNo = (uint8 *) oscl_malloc(nTotalMB);
4313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->sliceNo == NULL) status = PV_FALSE;
4323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->memoryUsage += nTotalMB;
4333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->acPredFlag = (uint8 *) oscl_malloc(nTotalMB * sizeof(uint8));
4353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->acPredFlag == NULL) status = PV_FALSE;
4363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->memoryUsage += (nTotalMB);
4373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
438b62a73b860757143d3b140b2985fdae71e18d675Wei Jia    if ((size_t)nTotalMB > SIZE_MAX / sizeof(typeDCStore)) {
439b62a73b860757143d3b140b2985fdae71e18d675Wei Jia        return PV_FALSE;
440b62a73b860757143d3b140b2985fdae71e18d675Wei Jia    }
4413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->predDC = (typeDCStore *) oscl_malloc(nTotalMB * sizeof(typeDCStore));
4423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->predDC == NULL) status = PV_FALSE;
4433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->memoryUsage += (nTotalMB * sizeof(typeDCStore));
4443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
445b62a73b860757143d3b140b2985fdae71e18d675Wei Jia    if (nMBPerRow > INT32_MAX - 1
446b62a73b860757143d3b140b2985fdae71e18d675Wei Jia            || (size_t)(nMBPerRow + 1) > SIZE_MAX / sizeof(typeDCACStore)) {
447b62a73b860757143d3b140b2985fdae71e18d675Wei Jia        return PV_FALSE;
448b62a73b860757143d3b140b2985fdae71e18d675Wei Jia    }
4493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->predDCAC_col = (typeDCACStore *) oscl_malloc((nMBPerRow + 1) * sizeof(typeDCACStore));
4503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->predDCAC_col == NULL) status = PV_FALSE;
4513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->memoryUsage += ((nMBPerRow + 1) * sizeof(typeDCACStore));
4523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* element zero will be used for storing vertical (col) AC coefficients */
4543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*  the rest will be used for storing horizontal (row) AC coefficients  */
4553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->predDCAC_row = video->predDCAC_col + 1;        /*  ACDC */
4563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Allocating HeaderInfo structure & Quantizer array */
4583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->headerInfo.Mode = (uint8 *) oscl_malloc(nTotalMB);
4593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->headerInfo.Mode == NULL) status = PV_FALSE;
4603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->memoryUsage += nTotalMB;
4613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->headerInfo.CBP = (uint8 *) oscl_malloc(nTotalMB);
4623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->headerInfo.CBP == NULL) status = PV_FALSE;
4633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->memoryUsage += nTotalMB;
464b62a73b860757143d3b140b2985fdae71e18d675Wei Jia
465b62a73b860757143d3b140b2985fdae71e18d675Wei Jia    if ((size_t)nTotalMB > SIZE_MAX / sizeof(int16)) {
466b62a73b860757143d3b140b2985fdae71e18d675Wei Jia        return PV_FALSE;
467b62a73b860757143d3b140b2985fdae71e18d675Wei Jia    }
4683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->QPMB = (int16 *) oscl_malloc(nTotalMB * sizeof(int16));
4693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->QPMB == NULL) status = PV_FALSE;
4703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->memoryUsage += (nTotalMB * sizeof(int));
4713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Allocating macroblock space */
4733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->mblock = (MacroBlock *) oscl_malloc(sizeof(MacroBlock));
4743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->mblock == NULL)
4753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
4763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = PV_FALSE;
4773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
4783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
4793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
4803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        oscl_memset(video->mblock->block, 0, sizeof(int16)*6*NCOEFF_BLOCK); //  Aug 23,2005
4813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->memoryUsage += sizeof(MacroBlock);
4833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
4843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Allocating motion vector space */
485b62a73b860757143d3b140b2985fdae71e18d675Wei Jia    if ((size_t)nTotalMB > SIZE_MAX / (sizeof(MOT) * 4)) {
486b62a73b860757143d3b140b2985fdae71e18d675Wei Jia        return PV_FALSE;
487b62a73b860757143d3b140b2985fdae71e18d675Wei Jia    }
4883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->motX = (MOT *) oscl_malloc(sizeof(MOT) * 4 * nTotalMB);
4893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->motX == NULL) status = PV_FALSE;
4903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->motY = (MOT *) oscl_malloc(sizeof(MOT) * 4 * nTotalMB);
4913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->motY == NULL) status = PV_FALSE;
4923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->memoryUsage += (sizeof(MOT) * 8 * nTotalMB);
4933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
4943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON
4963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Allocating space for post-processing Mode */
4973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef DEC_INTERNAL_MEMORY_OPT
4983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->pstprcTypCur = IMEM_pstprcTypCur;
4993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->memoryUsage += (nTotalMB * 6);
5003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->pstprcTypCur == NULL)
5013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = PV_FALSE;
5033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
5053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        oscl_memset(video->pstprcTypCur, 0, 4*nTotalMB + 2*nTotalMB);
5073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->pstprcTypPrv = IMEM_pstprcTypPrv;
5103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->memoryUsage += (nTotalMB * 6);
5113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->pstprcTypPrv == NULL)
5123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = PV_FALSE;
5143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
5163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        oscl_memset(video->pstprcTypPrv, 0, nTotalMB*6);
5183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#else
521b62a73b860757143d3b140b2985fdae71e18d675Wei Jia    if (nTotalMB > INT32_MAX / 6) {
522b62a73b860757143d3b140b2985fdae71e18d675Wei Jia        return PV_FALSE;
523b62a73b860757143d3b140b2985fdae71e18d675Wei Jia    }
5243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->pstprcTypCur = (uint8 *) oscl_malloc(nTotalMB * 6);
5253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->memoryUsage += (nTotalMB * 6);
5263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->pstprcTypCur == NULL)
5273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = PV_FALSE;
5293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
5313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        oscl_memset(video->pstprcTypCur, 0, 4*nTotalMB + 2*nTotalMB);
5333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->pstprcTypPrv = (uint8 *) oscl_malloc(nTotalMB * 6);
5363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->memoryUsage += (nTotalMB * 6);
5373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->pstprcTypPrv == NULL)
5383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = PV_FALSE;
5403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
5423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        oscl_memset(video->pstprcTypPrv, 0, nTotalMB*6);
5443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
5473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
5493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* initialize the decoder library */
5513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->prevVop->predictionType = I_VOP;
5523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->prevVop->timeStamp = 0;
5533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifndef PV_MEMORY_POOL
5543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    oscl_memset(video->prevVop->yChan, 16, sizeof(uint8)*size);     /*  10/31/01 */
5553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    oscl_memset(video->prevVop->uChan, 128, sizeof(uint8)*size / 2);
5563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    oscl_memset(video->currVop->yChan, 0, sizeof(uint8)*size*3 / 2);
5583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (nLayers > 1)
5593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        oscl_memset(video->prevEnhcVop->yChan, 0, sizeof(uint8)*size*3 / 2);
5613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->prevEnhcVop->timeStamp = 0;
5623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->concealFrame = video->prevVop->yChan;               /*  07/07/2001 */
5643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    decCtrl->outputFrame = video->prevVop->yChan;              /*  06/19/2002 */
5653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
5663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* always start from base layer */
5683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->currLayer = 0;
5693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return status;
5703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
5713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
5733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : PVResetVideoDecoder()                                        */
5743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 01/14/2002                                                   */
5753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : Reset video timestamps                                       */
5763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
5773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   : PV_TRUE if successed, PV_FALSE if failed.                    */
5783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
5793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
5803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongBool PVResetVideoDecoder(VideoDecControls *decCtrl)
5813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
5823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VideoDecData *video = (VideoDecData *) decCtrl->videoDecoderData;
5833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int idx;
5843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    for (idx = 0; idx < decCtrl->nLayers; idx++)
5863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->vopHeader[idx]->timeStamp = 0;
5883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->prevVop->timeStamp = 0;
5903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (decCtrl->nLayers > 1)
5913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->prevEnhcVop->timeStamp = 0;
5923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    oscl_memset(video->mblock->block, 0, sizeof(int16)*6*NCOEFF_BLOCK); //  Aug 23,2005
5943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_TRUE;
5963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
5973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
6003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : PVCleanUpVideoDecoder()                                      */
6013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 04/11/2000, 08/29/2000                                       */
6023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : Cleanup of the MPEG-4 video decoder library.                 */
6033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
6043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   : PV_TRUE if successed, PV_FALSE if failed.                    */
6053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
6063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
6073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongOSCL_EXPORT_REF Bool PVCleanUpVideoDecoder(VideoDecControls *decCtrl)
6083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
6093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int idx;
6103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VideoDecData *video = (VideoDecData *) decCtrl->videoDecoderData;
6113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef DEC_INTERNAL_MEMORY_OPT
6123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video)
6133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
6143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON
6153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->pstprcTypCur = NULL;
6163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->pstprcTypPrv = NULL;
6173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
6183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->acPredFlag       = NULL;
6203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->sliceNo          = NULL;
6213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->motX             = NULL;
6223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->motY             = NULL;
6233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->mblock           = NULL;
6243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->QPMB             = NULL;
6253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->predDC           = NULL;
6263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->predDCAC_row     = NULL;
6273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->predDCAC_col     = NULL;
6283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->headerInfo.Mode  = NULL;
6293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->headerInfo.CBP   = NULL;
6303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->numberOfLayers > 1)
6313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
6323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->prevEnhcVop)
6333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
6343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->prevEnhcVop->uChan = NULL;
6353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->prevEnhcVop->vChan = NULL;
6363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (video->prevEnhcVop->yChan) oscl_free(video->prevEnhcVop->yChan);
6373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                oscl_free(video->prevEnhcVop);
6383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
6393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
6403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->currVop)
6413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
6423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->currVop->uChan = NULL;
6433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->currVop->vChan = NULL;
6443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->currVop->yChan)
6453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->currVop->yChan = NULL;
6463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->currVop = NULL;
6473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
6483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->prevVop)
6493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
6503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->prevVop->uChan = NULL;
6513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->prevVop->vChan = NULL;
6523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->prevVop->yChan)
6533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->prevVop->yChan = NULL;
6543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->prevVop = NULL;
6553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
6563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->vol)
6583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
6593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            for (idx = 0; idx < video->numberOfLayers; idx++)
6603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
6613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (video->vol[idx])
6623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
6633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    BitstreamClose(video->vol[idx]->bitstream);
6643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    video->vol[idx]->bitstream = NULL;
6653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    video->vol[idx] = NULL;
6663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
6673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->vopHeader[idx] = NULL;
6683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
6703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->vol = NULL;
6713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->vopHeader = NULL;
6723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
6733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video = NULL;
6753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        decCtrl->videoDecoderData = NULL;
6763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
6773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#else
6793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video)
6813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
6823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON
6833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->pstprcTypCur) oscl_free(video->pstprcTypCur);
6843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->pstprcTypPrv) oscl_free(video->pstprcTypPrv);
6853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
6863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->predDC) oscl_free(video->predDC);
6873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->predDCAC_row = NULL;
6883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->predDCAC_col) oscl_free(video->predDCAC_col);
6893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->motX) oscl_free(video->motX);
6903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->motY) oscl_free(video->motY);
6913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->mblock) oscl_free(video->mblock);
6923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->QPMB) oscl_free(video->QPMB);
6933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->headerInfo.Mode) oscl_free(video->headerInfo.Mode);
6943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->headerInfo.CBP) oscl_free(video->headerInfo.CBP);
6953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->sliceNo) oscl_free(video->sliceNo);
6963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->acPredFlag) oscl_free(video->acPredFlag);
6973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->numberOfLayers > 1)
6993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->prevEnhcVop)
7013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
7023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->prevEnhcVop->uChan = NULL;
7033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->prevEnhcVop->vChan = NULL;
7043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (video->prevEnhcVop->yChan) oscl_free(video->prevEnhcVop->yChan);
7053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                oscl_free(video->prevEnhcVop);
7063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
7073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->currVop)
7093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifndef PV_MEMORY_POOL
7123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->currVop->uChan = NULL;
7133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->currVop->vChan = NULL;
7143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->currVop->yChan)
7153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                oscl_free(video->currVop->yChan);
7163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
7173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            oscl_free(video->currVop);
7183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->prevVop)
7203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifndef PV_MEMORY_POOL
7223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->prevVop->uChan = NULL;
7233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->prevVop->vChan = NULL;
7243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->prevVop->yChan)
7253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                oscl_free(video->prevVop->yChan);
7263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
7273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            oscl_free(video->prevVop);
7283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->vol)
7313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            for (idx = 0; idx < video->numberOfLayers; idx++)
7333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
7343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (video->vol[idx])
7353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
7363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (video->vol[idx]->bitstream)
7373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
7383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        BitstreamClose(video->vol[idx]->bitstream);
7393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        oscl_free(video->vol[idx]->bitstream);
7403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
7413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    oscl_free(video->vol[idx]);
7423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
7433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
7453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            oscl_free(video->vol);
7463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        for (idx = 0; idx < video->numberOfLayers; idx++)
7493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
7503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->vopHeader[idx]) oscl_free(video->vopHeader[idx]);
7513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
7523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->vopHeader) oscl_free(video->vopHeader);
7543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        oscl_free(video);
7563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        decCtrl->videoDecoderData = NULL;
7573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
7583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
7593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_TRUE;
7603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
7613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
7623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : PVGetVideoDimensions()                                       */
7633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 040505                                                       */
7643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  :                                                              */
7653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
7663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   : the display_width and display_height of                      */
7673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*          the frame in the current layer.                                 */
7683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Note     : This is not a macro or inline function because we do         */
7693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*              not want to expose our internal data structure.             */
7703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
7713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
7723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongOSCL_EXPORT_REF void PVGetVideoDimensions(VideoDecControls *decCtrl, int32 *display_width, int32 *display_height)
7733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
7743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VideoDecData *video = (VideoDecData *)decCtrl->videoDecoderData;
7753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *display_width = video->displayWidth;
7763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *display_height = video->displayHeight;
7773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
7783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
779b9ff4b4f631239a6a37fe6588e025cb387150c0eAndreas HuberOSCL_EXPORT_REF void PVGetBufferDimensions(VideoDecControls *decCtrl, int32 *width, int32 *height) {
780b9ff4b4f631239a6a37fe6588e025cb387150c0eAndreas Huber    VideoDecData *video = (VideoDecData *)decCtrl->videoDecoderData;
781b9ff4b4f631239a6a37fe6588e025cb387150c0eAndreas Huber    *width = video->width;
782b9ff4b4f631239a6a37fe6588e025cb387150c0eAndreas Huber    *height = video->height;
783b9ff4b4f631239a6a37fe6588e025cb387150c0eAndreas Huber}
784b9ff4b4f631239a6a37fe6588e025cb387150c0eAndreas Huber
7853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
7863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : PVGetVideoTimeStamp()                                        */
7873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 04/27/2000, 08/29/2000                                       */
7883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  :                                                              */
7893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
7903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   : current time stamp in millisecond.                           */
7913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Note     :                                                              */
7923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
7933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
7943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Donguint32 PVGetVideoTimeStamp(VideoDecControls *decCtrl)
7953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
7963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VideoDecData *video = (VideoDecData *)decCtrl->videoDecoderData;
7973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return video->currTimestamp;
7983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
7993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
8023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : PVSetPostProcType()                                          */
8033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 07/07/2000                                                   */
8043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  :                                                              */
8053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
8063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   : Set post-processing filter type.                             */
8073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Note     :                                                              */
8083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified : . 08/29/2000 changes the name for consistency.               */
8093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
8103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongOSCL_EXPORT_REF void PVSetPostProcType(VideoDecControls *decCtrl, int mode)
8113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
8123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VideoDecData *video = (VideoDecData *)decCtrl->videoDecoderData;
8133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->postFilterType = mode;
8143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
8153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
8183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : PVGetDecBitrate()                                            */
8193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 08/23/2000                                                   */
8203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  :                                                              */
8213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
8223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   : This function returns the average bits per second.           */
8233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Note     :                                                              */
8243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
8253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
8263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongint PVGetDecBitrate(VideoDecControls *decCtrl)
8273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
8283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VideoDecData *video = (VideoDecData *)decCtrl->videoDecoderData;
8293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int     idx;
8303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32   sum = 0;
8313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    for (idx = 0; idx < BITRATE_AVERAGE_WINDOW; idx++)
8333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
8343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        sum += video->nBitsPerVop[idx];
8353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
8363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    sum = (sum * video->frameRate) / (10 * BITRATE_AVERAGE_WINDOW);
8373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return (int) sum;
8383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
8393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
8423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : PVGetDecFramerate()                                          */
8433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 08/23/2000                                                   */
8443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  :                                                              */
8453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
8463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   : This function returns the average frame per 10 second.       */
8473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Note     : The fps can be calculated by PVGetDecFramerate()/10          */
8483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
8493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
8503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongint PVGetDecFramerate(VideoDecControls *decCtrl)
8513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
8523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VideoDecData *video = (VideoDecData *)decCtrl->videoDecoderData;
8533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return video->frameRate;
8553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
8563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
8583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : PVGetOutputFrame()                                           */
8593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 05/07/2001                                                   */
8603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  :                                                              */
8613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
8623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   : This function returns the pointer to the output frame        */
8633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Note     :                                                              */
8643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
8653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
8663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Donguint8 *PVGetDecOutputFrame(VideoDecControls *decCtrl)
8673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
8683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return decCtrl->outputFrame;
8693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
8703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
8723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : PVGetLayerID()                                               */
8733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 07/09/2001                                                   */
8743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  :                                                              */
8753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
8763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   : This function returns decoded frame layer id (BASE/ENHANCE)  */
8773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Note     :                                                              */
8783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
8793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
8803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongint PVGetLayerID(VideoDecControls *decCtrl)
8813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
8823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VideoDecData *video = (VideoDecData *)decCtrl->videoDecoderData;
8833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return video->currLayer;
8843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
8853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
8863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : PVGetDecMemoryUsage()                                        */
8873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 08/23/2000                                                   */
8883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  :                                                              */
8893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
8903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   : This function returns the amount of memory used.             */
8913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Note     :                                                              */
8923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
8933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
8943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongint32 PVGetDecMemoryUsage(VideoDecControls *decCtrl)
8953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
8963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VideoDecData *video = (VideoDecData *)decCtrl->videoDecoderData;
8973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return video->memoryUsage;
8983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
8993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
9023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : PVGetDecBitstreamMode()                                      */
9033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 08/23/2000                                                   */
9043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  :                                                              */
9053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
9063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   : This function returns the decoding mode of the baselayer     */
9073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*              bitstream.                                                  */
9083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Note     :                                                              */
9093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
9103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
9113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongOSCL_EXPORT_REF MP4DecodingMode PVGetDecBitstreamMode(VideoDecControls *decCtrl)
9123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
9133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VideoDecData *video = (VideoDecData *)decCtrl->videoDecoderData;
9143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->shortVideoHeader)
9153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
9163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return H263_MODE;
9173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
9183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
9193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
9203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return MPEG4_MODE;
9213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
9223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
9233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
9263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : PVExtractVolHeader()                                         */
9273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 08/29/2000                                                   */
9283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  :                                                              */
9293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
9303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   : Extract vol header of the bitstream from buffer[].           */
9313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Note     :                                                              */
9323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
9333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
9343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongBool PVExtractVolHeader(uint8 *video_buffer, uint8 *vol_header, int32 *vol_header_size)
9353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
9363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int idx = -1;
9373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 start_code_prefix[] = { 0x00, 0x00, 0x01 };
9383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 h263_prefix[] = { 0x00, 0x00, 0x80 };
9393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (oscl_memcmp(h263_prefix, video_buffer, 3) == 0) /* we have short header stream */
9413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
9423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        oscl_memcpy(vol_header, video_buffer, 32);
9433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *vol_header_size = 32;
9443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return TRUE;
9453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
9463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
9473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
9483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (oscl_memcmp(start_code_prefix, video_buffer, 3) ||
9493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                (video_buffer[3] != 0xb0 && video_buffer[3] >= 0x20)) return FALSE;
9503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        do
9523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
9533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            idx++;
9543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            while (oscl_memcmp(start_code_prefix, video_buffer + idx, 3))
9553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
9563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                idx++;
9573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (idx + 3 >= *vol_header_size) goto quit;
9583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
9593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
9603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        while (video_buffer[idx+3] != 0xb3 && video_buffer[idx+3] != 0xb6);
9613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        oscl_memcpy(vol_header, video_buffer, idx);
9633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        *vol_header_size = idx;
9643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return TRUE;
9653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
9663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongquit:
9683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    oscl_memcpy(vol_header, video_buffer, *vol_header_size);
9693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return FALSE;
9703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
9713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
9743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : PVLocateFrameHeader()                                        */
9753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 04/8/2005                                                    */
9763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  :                                                              */
9773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
9783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   : Return the offset to the first SC in the buffer              */
9793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Note     :                                                              */
9803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
9813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
9823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongint32 PVLocateFrameHeader(uint8 *ptr, int32 size)
9833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
9843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int count = 0;
9853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 i = size;
9863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (size < 1)
9883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
9893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return 0;
9903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
9913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (i--)
9923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
9933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if ((count > 1) && (*ptr == 0x01))
9943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
9953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            i += 2;
9963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            break;
9973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
9983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (*ptr++)
10003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            count = 0;
10013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
10023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            count++;
10033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
10043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return (size - (i + 1));
10053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
10063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
10093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : PVLocateH263FrameHeader()                                    */
10103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 04/8/2005                                                    */
10113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  :                                                              */
10123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
10133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   : Return the offset to the first SC in the buffer              */
10143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Note     :                                                              */
10153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
10163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
10173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongint32 PVLocateH263FrameHeader(uint8 *ptr, int32 size)
10183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
10193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int count = 0;
10203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 i = size;
10213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (size < 1)
10233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
10243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return 0;
10253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
10263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (i--)
10283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
10293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if ((count > 1) && ((*ptr & 0xFC) == 0x80))
10303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
10313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            i += 2;
10323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            break;
10333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
10343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (*ptr++)
10363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            count = 0;
10373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
10383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            count++;
10393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
10403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return (size - (i + 1));
10413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
10423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
10453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : PVDecodeVideoFrame()                                         */
10463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 08/29/2000                                                   */
10473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : Decode one video frame and return a YUV-12 image.            */
10483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
10493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   :                                                              */
10503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Note     :                                                              */
10513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified : 04/17/2001 removed PV_EOS, PV_END_OF_BUFFER              */
10523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*           : 08/22/2002 break up into 2 functions PVDecodeVopHeader and */
10533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*                          PVDecodeVopBody                                 */
10543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
10553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongOSCL_EXPORT_REF Bool PVDecodeVideoFrame(VideoDecControls *decCtrl, uint8 *buffer[],
10563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                                        uint32 timestamp[], int32 buffer_size[], uint use_ext_timestamp[], uint8 *currYUV)
10573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
10583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status = PV_FAIL;
10593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VopHeaderInfo header_info;
10603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    status = (PV_STATUS)PVDecodeVopHeader(decCtrl, buffer, timestamp, buffer_size, &header_info, use_ext_timestamp, currYUV);
10623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (status != PV_TRUE)
10633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_FALSE;
10643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (PVDecodeVopBody(decCtrl, buffer_size) != PV_TRUE)
10663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
10673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_FALSE;
10683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
10693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_TRUE;
10713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
10723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
10743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : PVDecodeVopHeader()                                          */
10753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 08/22/2002                                                   */
10763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : Determine target layer and decode vop header, modified from  */
10773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*              original PVDecodeVideoFrame.                                */
10783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
10793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   :                                                              */
10803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Note     :                                                              */
10813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
10823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
10833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongBool PVDecodeVopHeader(VideoDecControls *decCtrl, uint8 *buffer[],
10843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                       uint32 timestamp[], int32 buffer_size[], VopHeaderInfo *header_info, uint use_ext_timestamp [], uint8 *currYUV)
10853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
10863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VideoDecData *video = (VideoDecData *) decCtrl->videoDecoderData;
10873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Vol *currVol;
10883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Vop *currVop = video->currVop;
10893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Vop **vopHeader = video->vopHeader;
10903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamDecVideo *stream;
10913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int target_layer;
10933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_SUPPORT_TEMPORAL_SCALABILITY
10953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status = PV_FAIL;
10963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int idx;
10973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 display_time;
10983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
10993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* decide which frame to decode next */
11003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (decCtrl->nLayers > 1)
11013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
11023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        display_time = target_layer = -1;
11033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        for (idx = 0; idx < decCtrl->nLayers; idx++)
11043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
11053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* do we have data for this layer? */
11063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (buffer_size[idx] <= 0)
11073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
11083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                timestamp[idx] = -1;
11093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                continue;
11103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
11113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* did the application provide a timestamp for this vop? */
11133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (timestamp[idx] < 0)
11143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
11153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (vopHeader[idx]->timeStamp < 0)
11163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
11173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /* decode the timestamp in the bitstream */
11183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    video->currLayer = idx;
11193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    stream = video->vol[idx]->bitstream;
11203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    BitstreamReset(stream, buffer[idx], buffer_size[idx]);
11213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    while ((status = DecodeVOPHeader(video, vopHeader[idx], FALSE)) != PV_SUCCESS)
11233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
11243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        /* Try to find a VOP header in the buffer.   08/30/2000. */
11253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        if (PVSearchNextM4VFrame(stream) != PV_SUCCESS)
11263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        {
11273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            /* if we don't have data for enhancement layer, */
11283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            /*    don't just stop.   09/07/2000.          */
11293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            buffer_size[idx] = 0;
11303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            break;
11313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        }
11323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
11333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (status == PV_SUCCESS)
11343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
11353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        vopHeader[idx]->timeStamp =
11363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            timestamp[idx] = CalcVopDisplayTime(video->vol[idx], vopHeader[idx], video->shortVideoHeader);
11373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        if (idx == 0) vopHeader[idx]->refSelectCode = 1;
11383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
11393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
11403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else
11413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
11423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /* We've decoded this vop header in the previous run already. */
11433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    timestamp[idx] = vopHeader[idx]->timeStamp;
11443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
11453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
11463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Use timestamps to select the next VOP to be decoded */
11483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (timestamp[idx] >= 0 && (display_time < 0 || display_time > timestamp[idx]))
11493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
11503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                display_time = timestamp[idx];
11513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                target_layer = idx;
11523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
11533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else if (display_time == timestamp[idx])
11543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
11553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* we have to handle either SNR or spatial scalability here. */
11563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
11573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
11583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (target_layer < 0) return PV_FALSE;
11593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* set up for decoding the target layer */
11613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->currLayer = target_layer;
11623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        currVol = video->vol[target_layer];
11633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->bitstream = stream = currVol->bitstream;
11643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* We need to decode the vop header if external timestamp   */
11663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /*    is provided.    10/04/2000                            */
11673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (vopHeader[target_layer]->timeStamp < 0)
11683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
11693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            stream = video->vol[target_layer]->bitstream;
11703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            BitstreamReset(stream, buffer[target_layer], buffer_size[target_layer]);
11713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            while (DecodeVOPHeader(video, vopHeader[target_layer], TRUE) != PV_SUCCESS)
11733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
11743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* Try to find a VOP header in the buffer.   08/30/2000. */
11753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (PVSearchNextM4VFrame(stream) != PV_SUCCESS)
11763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
11773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /* if we don't have data for enhancement layer, */
11783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /*    don't just stop.   09/07/2000.          */
11793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    buffer_size[target_layer] = 0;
11803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    break;
11813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
11823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
11833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->vol[target_layer]->timeInc_offset = vopHeader[target_layer]->timeInc;
11843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->vol[target_layer]->moduloTimeBase = timestamp[target_layer];
11853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            vopHeader[target_layer]->timeStamp = timestamp[target_layer];
11863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (target_layer == 0) vopHeader[target_layer]->refSelectCode = 1;
11873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
11883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
11893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else /* base layer only decoding */
11903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
11913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
11923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->currLayer = target_layer = 0;
11933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        currVol = video->vol[0];
11943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->bitstream = stream = currVol->bitstream;
11953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (buffer_size[0] <= 0) return PV_FALSE;
11963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        BitstreamReset(stream, buffer[0], buffer_size[0]);
11973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
11983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->shortVideoHeader)
11993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
12003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            while (DecodeShortHeader(video, vopHeader[0]) != PV_SUCCESS)
12013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
12023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (PVSearchNextH263Frame(stream) != PV_SUCCESS)
12033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
12043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /* There is no vop header in the buffer,    */
12053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /*   clean bitstream buffer.     2/5/2001   */
12063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    buffer_size[0] = 0;
12073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (video->initialized == PV_FALSE)
12083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
12093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        video->displayWidth = video->width = 0;
12103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        video->displayHeight = video->height = 0;
12113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
12123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    return PV_FALSE;
12133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
12143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
12153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (use_ext_timestamp[0])
12173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
12183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* MTB for H263 is absolute TR */
12193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* following line is equivalent to  round((timestamp[0]*30)/1001);   11/13/2001 */
12203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->vol[0]->moduloTimeBase = 30 * ((timestamp[0] + 17) / 1001) + (30 * ((timestamp[0] + 17) % 1001) / 1001);
12213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                vopHeader[0]->timeStamp = timestamp[0];
12223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
12233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
12243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                vopHeader[0]->timeStamp = CalcVopDisplayTime(currVol, vopHeader[0], video->shortVideoHeader);
12253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
12263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
12273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
12283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            while (DecodeVOPHeader(video, vopHeader[0], FALSE) != PV_SUCCESS)
12293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
12303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                /* Try to find a VOP header in the buffer.   08/30/2000. */
12313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (PVSearchNextM4VFrame(stream) != PV_SUCCESS)
12323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
12333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /* There is no vop header in the buffer,    */
12343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /*   clean bitstream buffer.     2/5/2001   */
12353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    buffer_size[0] = 0;
12363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    return PV_FALSE;
12373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
12383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
12393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (use_ext_timestamp[0])
12413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
12423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->vol[0]->timeInc_offset = vopHeader[0]->timeInc;
12433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->vol[0]->moduloTimeBase = timestamp[0];  /*  11/12/2001 */
12443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                vopHeader[0]->timeStamp = timestamp[0];
12453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
12463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
12473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
12483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                vopHeader[0]->timeStamp = CalcVopDisplayTime(currVol, vopHeader[0], video->shortVideoHeader);
12493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
12503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
12513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* set up some base-layer only parameters */
12533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        vopHeader[0]->refSelectCode = 1;
12543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_SUPPORT_TEMPORAL_SCALABILITY
12553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
12563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
12573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    timestamp[target_layer] = video->currTimestamp = vopHeader[target_layer]->timeStamp;
12583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_MEMORY_POOL
12593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    vopHeader[target_layer]->yChan = (PIXEL *)currYUV;
12603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    vopHeader[target_layer]->uChan = (PIXEL *)currYUV + decCtrl->size;
12613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    vopHeader[target_layer]->vChan = (PIXEL *)(vopHeader[target_layer]->uChan) + (decCtrl->size >> 2);
12623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#else
12633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    vopHeader[target_layer]->yChan = currVop->yChan;
12643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    vopHeader[target_layer]->uChan = currVop->uChan;
12653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    vopHeader[target_layer]->vChan = currVop->vChan;
12663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
12673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    oscl_memcpy(currVop, vopHeader[target_layer], sizeof(Vop));
12683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_SUPPORT_TEMPORAL_SCALABILITY
12703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    vopHeader[target_layer]->timeStamp = -1;
12713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
12723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* put header info into the structure */
12733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    header_info->currLayer = target_layer;
12743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    header_info->timestamp = video->currTimestamp;
12753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    header_info->frameType = (MP4FrameType)currVop->predictionType;
12763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    header_info->refSelCode = vopHeader[target_layer]->refSelectCode;
12773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    header_info->quantizer = currVop->quantizer;
12783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /***************************************/
12793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_TRUE;
12813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
12823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
12843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
12853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : PVDecodeVopBody()                                            */
12863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 08/22/2002                                                   */
12873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : Decode vop body after the header is decoded, modified from   */
12883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*              original PVDecodeVideoFrame.                                */
12893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
12903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   :                                                              */
12913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Note     :                                                              */
12923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
12933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
12943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongBool PVDecodeVopBody(VideoDecControls *decCtrl, int32 buffer_size[])
12953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
12963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status = PV_FAIL;
12973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VideoDecData *video = (VideoDecData *) decCtrl->videoDecoderData;
12983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int target_layer = video->currLayer;
12993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Vol *currVol = video->vol[target_layer];
13003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Vop *currVop = video->currVop;
13013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Vop *prevVop = video->prevVop;
13023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Vop *tempVopPtr;
13033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int bytes_consumed = 0; /* Record how many bits we used in the buffer.   04/24/2001 */
13043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int idx;
13063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (currVop->vopCoded == 0)                  /*  07/03/2001 */
13083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
13093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamByteAlign(currVol->bitstream);
13103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* We should always clear up bitstream buffer.   10/10/2000 */
13113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        bytes_consumed = (getPointer(currVol->bitstream) + 7) >> 3;
13123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (bytes_consumed > currVol->bitstream->data_end_pos)
13143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
13153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            bytes_consumed = currVol->bitstream->data_end_pos;
13163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
13173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (bytes_consumed < buffer_size[target_layer])
13193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
13203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* If we only consume part of the bits in the buffer, take those */
13213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /*  out.     04/24/2001 */
13223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /*          oscl_memcpy(buffer[target_layer], buffer[target_layer]+bytes_consumed,
13233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            (buffer_size[target_layer]-=bytes_consumed)); */
13243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            buffer_size[target_layer] -= bytes_consumed;
13253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
13263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
13273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
13283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            buffer_size[target_layer] = 0;
13293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
13303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_MEMORY_POOL
13313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (target_layer)
13333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
13343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (video->prevEnhcVop->timeStamp > video->prevVop->timeStamp)
13353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
13363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->prevVop = video->prevEnhcVop;
13373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
13383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
13393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13402ad2a92318a3b9daf78ebcdc597085adbf32600dMarco Nelissen        if (!video->prevVop->yChan) {
13412ad2a92318a3b9daf78ebcdc597085adbf32600dMarco Nelissen            ALOGE("b/35269635");
13422ad2a92318a3b9daf78ebcdc597085adbf32600dMarco Nelissen            android_errorWriteLog(0x534e4554, "35269635");
13432ad2a92318a3b9daf78ebcdc597085adbf32600dMarco Nelissen            return PV_FALSE;
13442ad2a92318a3b9daf78ebcdc597085adbf32600dMarco Nelissen        }
13453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        oscl_memcpy(currVop->yChan, video->prevVop->yChan, (decCtrl->size*3) / 2);
13463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->prevVop = prevVop;
13483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->concealFrame = currVop->yChan;       /*  07/07/2001 */
13503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->vop_coding_type = currVop->predictionType; /*  07/09/01 */
13523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        decCtrl->outputFrame = currVop->yChan;
13543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* Swap VOP pointers.  No enhc. frame oscl_memcpy() anymore!   04/24/2001 */
13563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (target_layer)
13573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
13583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tempVopPtr = video->prevEnhcVop;
13593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->prevEnhcVop = video->currVop;
13603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->currVop = tempVopPtr;
13613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
13623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
13633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
13643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tempVopPtr = video->prevVop;
13653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->prevVop = video->currVop;
13663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->currVop = tempVopPtr;
13673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
13683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#else
13693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (target_layer)       /* this is necessary to avoid flashback problems   06/21/2002*/
13703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
13713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->prevEnhcVop->timeStamp = currVop->timeStamp;
13723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
13733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
13743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
13753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->prevVop->timeStamp = currVop->timeStamp;
13763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
13773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
13783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->vop_coding_type = currVop->predictionType; /*  07/09/01 */
13793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* the following is necessary to avoid displaying an notCoded I-VOP at the beginning of a session
13803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        or after random positioning  07/03/02*/
13813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (currVop->predictionType == I_VOP)
13823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
13833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->vop_coding_type = P_VOP;
13843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
13853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_TRUE;
13883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
13893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* ======================================================= */
13903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /*  Decode vop body (if there is no error in the header!)  */
13913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* ======================================================= */
13923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
13933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* first, we need to select a reference frame */
13943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (decCtrl->nLayers > 1)
13953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
13963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (currVop->predictionType == I_VOP)
13973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
13983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* do nothing here */
13993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
14003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else if (currVop->predictionType == P_VOP)
14013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
14023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            switch (currVop->refSelectCode)
14033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
14043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                case 0 : /* most recently decoded enhancement vop */
14053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    /* Setup video->prevVop before we call PV_DecodeVop().   04/24/2001 */
14063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (video->prevEnhcVop->timeStamp >= video->prevVop->timeStamp)
14073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        video->prevVop = video->prevEnhcVop;
14083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    break;
14093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                case 1 : /* most recently displayed base-layer vop */
14113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (target_layer)
14123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
14133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        if (video->prevEnhcVop->timeStamp > video->prevVop->timeStamp)
14143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                            video->prevVop = video->prevEnhcVop;
14153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
14163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    break;
14173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                case 2 : /* next base-layer vop in display order */
14193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    break;
14203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                case 3 : /* temporally coincident base-layer vop (no MV's) */
14223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    break;
14233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
14243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
14253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else /* we have a B-Vop */
14263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
14273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            mp4dec_log("DecodeVideoFrame(): B-VOP not supported.\n");
14283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
14293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
14303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* This is for the calculation of the frame rate and bitrate. */
14323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    idx = ++video->frame_idx % BITRATE_AVERAGE_WINDOW;
14333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Calculate bitrate for this layer.   08/23/2000 */
14353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    status = PV_DecodeVop(video);
14363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->nBitsPerVop[idx] = getPointer(currVol->bitstream);
14373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->prevTimestamp[idx] = currVop->timeStamp;
14383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* restore video->prevVop after PV_DecodeVop().   04/24/2001 */
14403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//  if (currVop->refSelectCode == 0) video->prevVop = prevVop;
14413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->prevVop = prevVop;
14423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* Estimate the frame rate.   08/23/2000 */
14443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->duration = video->prevTimestamp[idx];
14453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->duration -= video->prevTimestamp[(++idx)%BITRATE_AVERAGE_WINDOW];
14463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->duration > 0)
14473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    { /* Only update framerate when the timestamp is right */
14483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        video->frameRate = (int)(FRAMERATE_SCALE) / video->duration;
14493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
14503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* We should always clear up bitstream buffer.   10/10/2000 */
14523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    bytes_consumed = (getPointer(currVol->bitstream) + 7) >> 3; /*  11/4/03 */
14533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (bytes_consumed > currVol->bitstream->data_end_pos)
14553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
14563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        bytes_consumed = currVol->bitstream->data_end_pos;
14573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
14583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (bytes_consumed < buffer_size[target_layer])
14603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
14613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* If we only consume part of the bits in the buffer, take those */
14623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /*  out.     04/24/2001 */
14633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /*      oscl_memcpy(buffer[target_layer], buffer[target_layer]+bytes_consumed,
14643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    (buffer_size[target_layer]-=bytes_consumed)); */
14653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        buffer_size[target_layer] -= bytes_consumed;
14663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
14673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
14683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
14693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        buffer_size[target_layer] = 0;
14703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
14713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    switch (status)
14723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
14733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        case PV_FAIL :
14743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_FALSE;        /* this will take care of concealment if we lose whole frame  */
14753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        case PV_END_OF_VOP :
14773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* we may want to differenciate PV_END_OF_VOP and PV_SUCCESS */
14783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /*    in the future.     05/10/2000                      */
14793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        case PV_SUCCESS :
14813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Nohting is wrong :). */
14823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->concealFrame = video->currVop->yChan;       /*  07/07/2001 */
14853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            video->vop_coding_type = video->currVop->predictionType; /*  07/09/01 */
14873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            decCtrl->outputFrame = video->currVop->yChan;
14893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
14903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Swap VOP pointers.  No enhc. frame oscl_memcpy() anymore!   04/24/2001 */
14913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (target_layer)
14923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
14933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                tempVopPtr = video->prevEnhcVop;
14943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->prevEnhcVop = video->currVop;
14953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->currVop = tempVopPtr;
14963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
14973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
14983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
14993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                tempVopPtr = video->prevVop;
15003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->prevVop = video->currVop;
15013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                video->currVop = tempVopPtr;
15023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
15033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            break;
15043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        default :
15063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* This will never happen */
15073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            break;
15083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
15093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_TRUE;
15113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
15123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_MEMORY_POOL
15143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongOSCL_EXPORT_REF void PVSetReferenceYUV(VideoDecControls *decCtrl, uint8 *YUV)
15153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
15163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VideoDecData *video = (VideoDecData *)decCtrl->videoDecoderData;
15173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->prevVop->yChan = (PIXEL *)YUV;
15183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->prevVop->uChan = (PIXEL *)YUV + video->size;
15193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->prevVop->vChan = (PIXEL *)video->prevVop->uChan + (decCtrl->size >> 2);
15203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    oscl_memset(video->prevVop->yChan, 16, sizeof(uint8)*decCtrl->size);     /*  10/31/01 */
15213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    oscl_memset(video->prevVop->uChan, 128, sizeof(uint8)*decCtrl->size / 2);
15223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->concealFrame = video->prevVop->yChan;               /*  07/07/2001 */
15233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    decCtrl->outputFrame = video->prevVop->yChan;              /*  06/19/2002 */
15243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
15253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
15263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
15293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : VideoDecoderErrorDetected()                                  */
15303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 06/20/2000                                                   */
15313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  :                                                              */
15323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
15333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   : This function will be called everytime an error int the      */
15343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*              bitstream is detected.                                      */
15353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Note     :                                                              */
15363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
15373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
15383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Donguint VideoDecoderErrorDetected(VideoDecData *)
15393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
15403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* This is only used for trapping bitstream error for debuging */
15413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return 0;
15423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
15433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef ENABLE_LOG
15453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include <stdio.h>
15463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include <stdarg.h>
15473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
15483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : m4vdec_dprintf()                                             */
15493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 08/15/2000                                                   */
15503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : This is a function that logs messages in the mpeg4 video     */
15513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*             decoder.  We can call the standard PacketVideo PVMessage     */
15523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*             from inside this function if necessary.                      */
15533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
15543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   :                                                              */
15553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Note     : To turn on the logging, LOG_MP4DEC_MESSAGE must be defined   */
15563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*              when compiling this file (only this file).                  */
15573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
15583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
15593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid m4vdec_dprintf(char *format, ...)
15603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
15613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    FILE *log_fp;
15623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    va_list args;
15633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    va_start(args, format);
15643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* open the log file */
15663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    log_fp = fopen("\\mp4dec_log.txt", "a+");
15673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (log_fp == NULL) return;
15683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* output the message */
15693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    vfprintf(log_fp, format, args);
15703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    fclose(log_fp);
15713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    va_end(args);
15733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
15743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
15753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
15783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : IsIntraFrame()                                               */
15793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 05/29/2000                                                   */
15803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  :                                                              */
15813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
15823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   : The most recently decoded frame is an Intra frame.           */
15833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Note     :                                                              */
15843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
15853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
15863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongBool IsIntraFrame(VideoDecControls *decCtrl)
15873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
15883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VideoDecData *video = (VideoDecData *)decCtrl->videoDecoderData;
15893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return (video->vop_coding_type == I_VOP);
15903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
15913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
15923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
15933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : PVDecPostProcess()                                           */
15943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 01/09/2002                                                   */
15953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : PostProcess one video frame and return a YUV-12 image.       */
15963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
15973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   :                                                              */
15983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Note     :                                                              */
15993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
16003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
16013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid PVDecPostProcess(VideoDecControls *decCtrl, uint8 *outputYUV)
16023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
16033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *outputBuffer;
16043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_POSTPROC_ON
16053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VideoDecData *video = (VideoDecData *) decCtrl->videoDecoderData;
16063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 tmpvar;
16073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (outputYUV)
16083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
16093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        outputBuffer = outputYUV;
16103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
16113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
16123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
16133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (video->postFilterType)
16143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
16153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            outputBuffer = video->currVop->yChan;
16163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
16173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
16183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
16193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            outputBuffer = decCtrl->outputFrame;
16203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
16213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
16223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
16233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->postFilterType)
16243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
16253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* Post-processing,  */
16263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PostFilter(video, video->postFilterType, outputBuffer);
16273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
16283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    else
16293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
16303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (outputYUV)
16313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
16323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            /* Copy decoded frame to the output buffer. */
16333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tmpvar = (int32)video->width * video->height;
16343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            oscl_memcpy(outputBuffer, decCtrl->outputFrame, tmpvar*3 / 2);           /*  3/3/01 */
16353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
16363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
16373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#else
16383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    outputBuffer = decCtrl->outputFrame;
16393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    outputYUV;
16403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
16413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    decCtrl->outputFrame = outputBuffer;
16423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return;
16433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
16443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
16453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
16463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
16473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : PVDecSetReference(VideoDecControls *decCtrl, uint8 *refYUV,  */
16483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*                              int32 timestamp)                            */
16493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 07/22/2003                                                   */
16503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : Get YUV reference frame from external source.                */
16513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   : YUV 4-2-0 frame containing new reference frame in the same   */
16523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*   : dimension as original, i.e., doesn't have to be multiple of 16 !!!.  */
16533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   :                                                              */
16543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Note     :                                                              */
16553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
16563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
16573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongBool PVDecSetReference(VideoDecControls *decCtrl, uint8 *refYUV, uint32 timestamp)
16583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
16593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VideoDecData *video = (VideoDecData *) decCtrl->videoDecoderData;
16603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Vop *prevVop = video->prevVop;
16613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int width = video->width;
16623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *dstPtr, *orgPtr, *dstPtr2, *orgPtr2;
16633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 size = (int32)width * video->height;
16643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
16653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
16663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* set new parameters */
16673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    prevVop->timeStamp = timestamp;
16683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    prevVop->predictionType = I_VOP;
16693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
16703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    dstPtr = prevVop->yChan;
16713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    orgPtr = refYUV;
16723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    oscl_memcpy(dstPtr, orgPtr, size);
16733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    dstPtr = prevVop->uChan;
16743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    dstPtr2 = prevVop->vChan;
16753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    orgPtr = refYUV + size;
16763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    orgPtr2 = orgPtr + (size >> 2);
16773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    oscl_memcpy(dstPtr, orgPtr, (size >> 2));
16783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    oscl_memcpy(dstPtr2, orgPtr2, (size >> 2));
16793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
16803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->concealFrame = video->prevVop->yChan;
16813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->vop_coding_type = I_VOP;
16823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    decCtrl->outputFrame = video->prevVop->yChan;
16833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
16843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_TRUE;
16853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
16863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
16873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
16883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : PVDecSetEnhReference(VideoDecControls *decCtrl, uint8 *refYUV,   */
16893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*                              int32 timestamp)                            */
16903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 07/23/2003                                                   */
16913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : Get YUV enhance reference frame from external source.        */
16923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   : YUV 4-2-0 frame containing new reference frame in the same   */
16933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*   : dimension as original, i.e., doesn't have to be multiple of 16 !!!.  */
16943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   :                                                              */
16953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Note     :                                                              */
16963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
16973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
16983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongBool PVDecSetEnhReference(VideoDecControls *decCtrl, uint8 *refYUV, uint32 timestamp)
16993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
17003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    VideoDecData *video = (VideoDecData *) decCtrl->videoDecoderData;
17013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Vop *prevEnhcVop = video->prevEnhcVop;
17023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *dstPtr, *orgPtr, *dstPtr2, *orgPtr2;
17033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 size = (int32) video->width * video->height;
17043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
17053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (video->numberOfLayers <= 1)
17063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_FALSE;
17073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
17083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
17093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* set new parameters */
17103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    prevEnhcVop->timeStamp = timestamp;
17113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    prevEnhcVop->predictionType = I_VOP;
17123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
17133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    dstPtr = prevEnhcVop->yChan;
17143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    orgPtr = refYUV;
17153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    oscl_memcpy(dstPtr, orgPtr, size);
17163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    dstPtr = prevEnhcVop->uChan;
17173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    dstPtr2 = prevEnhcVop->vChan;
17183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    orgPtr = refYUV + size;
17193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    orgPtr2 = orgPtr + (size >> 2);
17203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    oscl_memcpy(dstPtr, orgPtr, (size >> 2));
17213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    oscl_memcpy(dstPtr2, orgPtr2, (size >> 2));
17223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->concealFrame = video->prevEnhcVop->yChan;
17233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    video->vop_coding_type = I_VOP;
17243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    decCtrl->outputFrame = video->prevEnhcVop->yChan;
17253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
17263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_TRUE;
17273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
17283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
17293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
17303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
17313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : PVGetVolInfo()                                               */
17323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 08/06/2003                                                   */
17333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : Get the vol info(only base-layer).                           */
17343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
17353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   :                                                              */
17363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Note     :                                                              */
17373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified : 06/24/2004                                                   */
17383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
17393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongBool PVGetVolInfo(VideoDecControls *decCtrl, VolInfo *pVolInfo)
17403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
17413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    Vol *currVol;
17423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
17433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (pVolInfo == NULL || decCtrl == NULL || decCtrl->videoDecoderData == NULL ||
17443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            ((VideoDecData *)decCtrl->videoDecoderData)->vol[0] == NULL) return PV_FALSE;
17453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
17463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    currVol = ((VideoDecData *)(decCtrl->videoDecoderData))->vol[0];
17473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
17483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    // get the VOL info
17493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pVolInfo->shortVideoHeader = (int32)((VideoDecData *)(decCtrl->videoDecoderData))->shortVideoHeader;
17503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pVolInfo->dataPartitioning = (int32)currVol->dataPartitioning;
17513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pVolInfo->errorResDisable  = (int32)currVol->errorResDisable;
17523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pVolInfo->useReverseVLC    = (int32)currVol->useReverseVLC;
17533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pVolInfo->scalability      = (int32)currVol->scalability;
17543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pVolInfo->nbitsTimeIncRes  = (int32)currVol->nbitsTimeIncRes;
17553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    pVolInfo->profile_level_id = (int32)currVol->profile_level_id;
17563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
17573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_TRUE;
17583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
17593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
17603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
17613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1762