pvdec_api.cpp revision 3306cfee3bf38ab207a0504e49c2d492bb73ffbf
1d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ------------------------------------------------------------------
2d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne * Copyright (C) 1998-2009 PacketVideo
3d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne *
4d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne * Licensed under the Apache License, Version 2.0 (the "License");
5d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne * you may not use this file except in compliance with the License.
6d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne * You may obtain a copy of the License at
7d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne *
8d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne *      http://www.apache.org/licenses/LICENSE-2.0
9d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne *
10d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne * Unless required by applicable law or agreed to in writing, software
11d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne * distributed under the License is distributed on an "AS IS" BASIS,
12d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne * express or implied.
14d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne * See the License for the specific language governing permissions
15d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne * and limitations under the License.
16d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne * -------------------------------------------------------------------
17d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne */
18d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#include "mp4dec_lib.h"
193aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn#include "vlc_decode.h"
203aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn#include "bitstream.h"
213aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn
22098e7fb5875c31aede4e6d40a3acec876d948527Adam Powell#define OSCL_DISABLE_WARNING_CONDITIONAL_IS_CONSTANT
233aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn
243aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn#ifdef DEC_INTERNAL_MEMORY_OPT
253aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn#define QCIF_MBS 99
263aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn#define QCIF_BS (4*QCIF_MBS)
2744fd8d24f761f82d21e9b00932648a1b6bf91449John Reck#define QCIF_MB_ROWS 11
28057a585fba01d92c38f27a8c080622dfd0c6f556Adam Powellextern uint8                IMEM_sliceNo[QCIF_MBS];
29776abc24cdd18610232a50b997cce3cffa74609bAdam Lesinskiextern uint8                IMEM_acPredFlag[QCIF_MBS];
30098e7fb5875c31aede4e6d40a3acec876d948527Adam Powellextern uint8                IMEM_headerInfo_Mode[QCIF_MBS];
31057a585fba01d92c38f27a8c080622dfd0c6f556Adam Powellextern uint8                IMEM_headerInfo_CBP[QCIF_MBS];
32057a585fba01d92c38f27a8c080622dfd0c6f556Adam Powellextern int                  IMEM_headerInfo_QPMB[QCIF_MBS];
33d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunneextern MacroBlock           IMEM_mblock;
341b15ba5d194c1db71d0a34ee110bd1ab169c8a29Luca Zanolinextern MOT                  IMEM_motX[QCIF_BS];
351b15ba5d194c1db71d0a34ee110bd1ab169c8a29Luca Zanolinextern MOT                  IMEM_motY[QCIF_BS];
36d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunneextern BitstreamDecVideo    IMEM_BitstreamDecVideo[4];
37d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunneextern typeDCStore          IMEM_predDC[QCIF_MBS];
38d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunneextern typeDCACStore        IMEM_predDCAC_col[QCIF_MB_ROWS+1];
39d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
40d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunneextern VideoDecData         IMEM_VideoDecData[1];
41d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunneextern Vop                  IMEM_currVop[1];
42d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunneextern Vop                  IMEM_prevVop[1];
43d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunneextern PIXEL                IMEM_currVop_yChan[QCIF_MBS*128*3];
4483b68ba4ad7e80dd0afe34f9f53dde5884325f58Yohei Yukawaextern PIXEL                IMEM_prevVop_yChan[QCIF_MBS*128*3];
45d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunneextern uint8                IMEM_pstprcTypCur[6*QCIF_MBS];
46d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunneextern uint8                IMEM_pstprcTypPrv[6*QCIF_MBS];
47d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
48d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
49d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunneextern Vop                  IMEM_vopHEADER[2];
50d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunneextern Vol                  IMEM_VOL[2];
51d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunneextern Vop                  IMEM_vopHeader[2][1];
52d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunneextern Vol                  IMEM_vol[2][1];
53d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
54d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#endif
55d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
56d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
57d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Function : PVInitVideoDecoder()                                         */
58d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Date     : 04/11/2000, 08/29/2000                                       */
59d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Purpose  : Initialization of the MPEG-4 video decoder library.          */
60d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*             The return type is Bool instead of PV_STATUS because         */
61d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*             we don't want to expose PV_STATUS to (outside) programmers   */
62d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*             that use our decoder library SDK.                            */
63d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  In/out   :                                                              */
64d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Return   : PV_TRUE if successed, PV_FALSE if failed.                    */
65d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Modified :                                                              */
66d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
67d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles DebunneOSCL_EXPORT_REF Bool PVInitVideoDecoder(VideoDecControls *decCtrl, uint8 *volbuf[],
68d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                                        int32 *volbuf_size, int nLayers, int width, int height, MP4DecodingMode mode)
69d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne{
70d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    VideoDecData *video = (VideoDecData *) decCtrl->videoDecoderData;
71d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    Bool status = PV_TRUE;
72d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    int idx;
73d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    BitstreamDecVideo *stream;
74d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
75d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
76d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    oscl_memset(decCtrl, 0, sizeof(VideoDecControls)); /* fix a size bug.   03/28/2001 */
77d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    decCtrl->nLayers = nLayers;
78d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    for (idx = 0; idx < nLayers; idx++)
79d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
80d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        decCtrl->volbuf[idx] = volbuf[idx];
81f666ad7046c0b1b255835f75aeb7d1391067df93John Reck        decCtrl->volbuf_size[idx] = volbuf_size[idx];
82d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
83d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
84d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    /* memory allocation & initialization */
85d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#ifdef DEC_INTERNAL_MEMORY_OPT
86d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video = IMEM_VideoDecData;
87d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#else
88d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video = (VideoDecData *) oscl_malloc(sizeof(VideoDecData));
89d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#endif
90d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (video != NULL)
91d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
92057a585fba01d92c38f27a8c080622dfd0c6f556Adam Powell        oscl_memset(video, 0, sizeof(VideoDecData));
93057a585fba01d92c38f27a8c080622dfd0c6f556Adam Powell        video->memoryUsage = sizeof(VideoDecData);
94d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->numberOfLayers = nLayers;
95d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#ifdef DEC_INTERNAL_MEMORY_OPT
96d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->vol = (Vol **) IMEM_VOL;
97d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#else
98d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->vol = (Vol **) oscl_malloc(nLayers * sizeof(Vol *));
9983b68ba4ad7e80dd0afe34f9f53dde5884325f58Yohei Yukawa#endif
100d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (video->vol == NULL) status = PV_FALSE;
101d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->memoryUsage += nLayers * sizeof(Vol *);
102d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
103d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
104d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        /* we need to setup this pointer for the application to */
105d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        /*    pass it around.                                   */
106d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        decCtrl->videoDecoderData = (void *) video;
107d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->videoDecControls = decCtrl;  /* yes. we have a cyclic */
108d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        /* references here :)    */
109d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
110d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        /* Allocating Vop space, this has to change when we add */
111d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        /*    spatial scalability to the decoder                */
112d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#ifdef DEC_INTERNAL_MEMORY_OPT
113d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->currVop = IMEM_currVop;
114d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (video->currVop == NULL) status = PV_FALSE;
115d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        else oscl_memset(video->currVop, 0, sizeof(Vop));
116d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->prevVop = IMEM_prevVop;
117d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (video->prevVop == NULL) status = PV_FALSE;
118d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        else oscl_memset(video->prevVop, 0, sizeof(Vop));
119d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->memoryUsage += (sizeof(Vop) * 2);
120057a585fba01d92c38f27a8c080622dfd0c6f556Adam Powell        video->vopHeader = (Vop **) IMEM_vopHEADER;
1213aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn#else
122057a585fba01d92c38f27a8c080622dfd0c6f556Adam Powell
123d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->currVop = (Vop *) oscl_malloc(sizeof(Vop));
124d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (video->currVop == NULL) status = PV_FALSE;
125d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        else oscl_memset(video->currVop, 0, sizeof(Vop));
126d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->prevVop = (Vop *) oscl_malloc(sizeof(Vop));
1273aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn        if (video->prevVop == NULL) status = PV_FALSE;
1283aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn        else oscl_memset(video->prevVop, 0, sizeof(Vop));
1293aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn        video->memoryUsage += (sizeof(Vop) * 2);
1303aa49b6fece334ace7525d42c1f6d0b7cdc1fbfbDianne Hackborn
131d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->vopHeader = (Vop **) oscl_malloc(sizeof(Vop *) * nLayers);
132d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#endif
133d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (video->vopHeader == NULL) status = PV_FALSE;
134d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        else oscl_memset(video->vopHeader, 0, sizeof(Vop *)*nLayers);
135d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->memoryUsage += (sizeof(Vop *) * nLayers);
136d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
137d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->initialized = PV_FALSE;
138d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        /* Decode the header to get all information to allocate data */
139d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (status == PV_TRUE)
140d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
141d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            /* initialize decoded frame counter.   04/24/2001 */
142d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->frame_idx = -1;
143d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1447558aa708160c287552f4e1e33c33d8b191e9f0eJohn Reck
145f666ad7046c0b1b255835f75aeb7d1391067df93John Reck            for (idx = 0; idx < nLayers; idx++)
1467558aa708160c287552f4e1e33c33d8b191e9f0eJohn Reck            {
1477558aa708160c287552f4e1e33c33d8b191e9f0eJohn Reck
1487558aa708160c287552f4e1e33c33d8b191e9f0eJohn Reck#ifdef DEC_INTERNAL_MEMORY_OPT
149119907cd2575c56b1ebf66348b52e67aaf6a88d8John Reck                video->vopHeader[idx] = IMEM_vopHeader[idx];
1507558aa708160c287552f4e1e33c33d8b191e9f0eJohn Reck#else
1517558aa708160c287552f4e1e33c33d8b191e9f0eJohn Reck                video->vopHeader[idx] = (Vop *) oscl_malloc(sizeof(Vop));
1527558aa708160c287552f4e1e33c33d8b191e9f0eJohn Reck#endif
1537558aa708160c287552f4e1e33c33d8b191e9f0eJohn Reck                if (video->vopHeader[idx] == NULL)
154d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                {
155d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    status = PV_FALSE;
156d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    break;
157d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                }
158d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                else
159d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                {
160d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    oscl_memset(video->vopHeader[idx], 0, sizeof(Vop));
161d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    video->vopHeader[idx]->timeStamp = 0;
162d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    video->memoryUsage += (sizeof(Vop));
163d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                }
164d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#ifdef DEC_INTERNAL_MEMORY_OPT
165d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                video->vol[idx] = IMEM_vol[idx];
166d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                video->memoryUsage += sizeof(Vol);
167d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                oscl_memset(video->vol[idx], 0, sizeof(Vol));
168d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                if (video->vol[idx] == NULL) status = PV_FALSE;
169d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                stream = IMEM_BitstreamDecVideo;
170d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#else
171d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                video->vol[idx] = (Vol *) oscl_malloc(sizeof(Vol));
172d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                if (video->vol[idx] == NULL)
173d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                {
174d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    status = PV_FALSE;
1751957d281ea123e4925e51fa5ad22ce239ef2a07dFabrice Di Meglio                    break;
176d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                }
177d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                else
178d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                {
179d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    video->memoryUsage += sizeof(Vol);
180d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    oscl_memset(video->vol[idx], 0, sizeof(Vol));
181d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                }
182d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
183d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                stream = (BitstreamDecVideo *) oscl_malloc(sizeof(BitstreamDecVideo));
184d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#endif
1853473b2b1f495f0f5a31e7ed687557c423c63abffGilles Debunne                video->memoryUsage += sizeof(BitstreamDecVideo);
186057a585fba01d92c38f27a8c080622dfd0c6f556Adam Powell                if (stream == NULL)
187057a585fba01d92c38f27a8c080622dfd0c6f556Adam Powell                {
188d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    status = PV_FALSE;
189d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    break;
190d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                }
191d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                else
192d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                {
193d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    int32 buffer_size;
194d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    if ((buffer_size = BitstreamOpen(stream, idx)) < 0)
195d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    {
196d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                        mp4dec_log("InitVideoDecoder(): Can't allocate bitstream buffer.\n");
197d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                        status = PV_FALSE;
198d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                        break;
199d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    }
200d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    video->memoryUsage += buffer_size;
201d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    video->vol[idx]->bitstream = stream;
202d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    video->vol[idx]->volID = idx;
203d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    video->vol[idx]->timeInc_offset = 0;  /*  11/12/01 */
204d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    video->vlcDecCoeffIntra = &VlcDecTCOEFShortHeader;
205d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    video->vlcDecCoeffInter = &VlcDecTCOEFShortHeader;
206d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    if (mode == MPEG4_MODE)
207d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    {
208d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                        /* Set up VOL header bitstream for frame-based decoding.  08/30/2000 */
209baf3094ecaa073e1cb3e807fa17d096f826c3968Jean Chalard                        BitstreamReset(stream, decCtrl->volbuf[idx], decCtrl->volbuf_size[idx]);
210baf3094ecaa073e1cb3e807fa17d096f826c3968Jean Chalard
211baf3094ecaa073e1cb3e807fa17d096f826c3968Jean Chalard                        switch (DecodeVOLHeader(video, idx))
212baf3094ecaa073e1cb3e807fa17d096f826c3968Jean Chalard                        {
213d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                            case PV_SUCCESS :
214d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                                if (status == PV_TRUE)
215d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                                    status = PV_TRUE;   /*  we want to make sure that if first layer is bad, second layer is good return PV_FAIL */
216d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                                else
217d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                                    status = PV_FALSE;
218d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                                break;
219d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#ifdef PV_TOLERATE_VOL_ERRORS
220d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                            case PV_BAD_VOLHEADER:
22183b68ba4ad7e80dd0afe34f9f53dde5884325f58Yohei Yukawa                                status = PV_TRUE;
22283b68ba4ad7e80dd0afe34f9f53dde5884325f58Yohei Yukawa                                break;
223d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#endif
224d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                            default :
225d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                                status = PV_FALSE;
226d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                                break;
227d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                        }
228d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
229d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    }
230d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    else
231d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    {
232057a585fba01d92c38f27a8c080622dfd0c6f556Adam Powell                        video->shortVideoHeader = PV_TRUE;
233d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    }
234d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
235d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    if (video->shortVideoHeader == PV_TRUE)
236d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    {
237d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                        mode = H263_MODE;
238d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                        /* Set max width and height.  In H.263 mode, we use    */
239d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                        /*  volbuf_size[0] to pass in width and volbuf_size[1] */
240d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                        /*  to pass in height.                    04/23/2001 */
241057a585fba01d92c38f27a8c080622dfd0c6f556Adam Powell                        video->prevVop->temporalRef = 0; /*  11/12/01 */
242d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                        /* Compute some convenience variables:   04/23/2001 */
243d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                        video->vol[idx]->quantType = 0;
244d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                        video->vol[idx]->quantPrecision = 5;
245d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                        video->vol[idx]->errorResDisable = 1;
246057a585fba01d92c38f27a8c080622dfd0c6f556Adam Powell                        video->vol[idx]->dataPartitioning = 0;
247057a585fba01d92c38f27a8c080622dfd0c6f556Adam Powell                        video->vol[idx]->useReverseVLC = 0;
248057a585fba01d92c38f27a8c080622dfd0c6f556Adam Powell                        video->intra_acdcPredDisable = 1;
249057a585fba01d92c38f27a8c080622dfd0c6f556Adam Powell                        video->vol[idx]->scalability = 0;
250057a585fba01d92c38f27a8c080622dfd0c6f556Adam Powell                        video->size = (int32)width * height;
251057a585fba01d92c38f27a8c080622dfd0c6f556Adam Powell
252057a585fba01d92c38f27a8c080622dfd0c6f556Adam Powell                        video->displayWidth = video->width = width;
253057a585fba01d92c38f27a8c080622dfd0c6f556Adam Powell                        video->displayHeight = video->height = height;
254057a585fba01d92c38f27a8c080622dfd0c6f556Adam Powell#ifdef PV_ANNEX_IJKT_SUPPORT
255057a585fba01d92c38f27a8c080622dfd0c6f556Adam Powell                        video->modified_quant = 0;
256057a585fba01d92c38f27a8c080622dfd0c6f556Adam Powell                        video->advanced_INTRA = 0;
25783b68ba4ad7e80dd0afe34f9f53dde5884325f58Yohei Yukawa                        video->deblocking = 0;
25883b68ba4ad7e80dd0afe34f9f53dde5884325f58Yohei Yukawa                        video->slice_structure = 0;
259d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#endif
260d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    }
261d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
26283b68ba4ad7e80dd0afe34f9f53dde5884325f58Yohei Yukawa                }
26383b68ba4ad7e80dd0afe34f9f53dde5884325f58Yohei Yukawa            }
264d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
265d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        }
266d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (status != PV_FALSE)
267d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
268d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            status = PVAllocVideoData(decCtrl, width, height, nLayers);
269d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->initialized = PV_TRUE;
270d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        }
271d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
272d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    else
273d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
274d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        status = PV_FALSE;
275d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
276d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
277d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (status == PV_FALSE) PVCleanUpVideoDecoder(decCtrl);
278d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
279d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    return status;
280d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne}
281d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
282d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles DebunneBool PVAllocVideoData(VideoDecControls *decCtrl, int width, int height, int nLayers)
283d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne{
2847558aa708160c287552f4e1e33c33d8b191e9f0eJohn Reck    VideoDecData *video = (VideoDecData *) decCtrl->videoDecoderData;
285d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    Bool status = PV_TRUE;
286d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    int nTotalMB;
287d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    int nMBPerRow;
288d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    int32 size;
289d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
290d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (video->shortVideoHeader == PV_TRUE)
291d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
292d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->displayWidth = video->width = width;
293057a585fba01d92c38f27a8c080622dfd0c6f556Adam Powell        video->displayHeight = video->height = height;
294d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
295057a585fba01d92c38f27a8c080622dfd0c6f556Adam Powell        video->nMBPerRow =
296057a585fba01d92c38f27a8c080622dfd0c6f556Adam Powell            video->nMBinGOB  = video->width / MB_SIZE;
297d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->nMBPerCol =
298d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->nGOBinVop = video->height / MB_SIZE;
2997558aa708160c287552f4e1e33c33d8b191e9f0eJohn Reck        video->nTotalMB =
3007558aa708160c287552f4e1e33c33d8b191e9f0eJohn Reck            video->nMBPerRow * video->nMBPerCol;
3017558aa708160c287552f4e1e33c33d8b191e9f0eJohn Reck    }
302f666ad7046c0b1b255835f75aeb7d1391067df93John Reck
3037558aa708160c287552f4e1e33c33d8b191e9f0eJohn Reck    size = (int32)sizeof(PIXEL) * video->width * video->height;
3047558aa708160c287552f4e1e33c33d8b191e9f0eJohn Reck#ifdef PV_MEMORY_POOL
305be34f2f3b340196426bdf558b28951359a4d84faJohn Reck    decCtrl->size = size;
3067558aa708160c287552f4e1e33c33d8b191e9f0eJohn Reck#else
3077558aa708160c287552f4e1e33c33d8b191e9f0eJohn Reck#ifdef DEC_INTERNAL_MEMORY_OPT
3087558aa708160c287552f4e1e33c33d8b191e9f0eJohn Reck    video->currVop->yChan = IMEM_currVop_yChan; /* Allocate memory for all VOP OKA 3/2/1*/
3097558aa708160c287552f4e1e33c33d8b191e9f0eJohn Reck    if (video->currVop->yChan == NULL) status = PV_FALSE;
3107558aa708160c287552f4e1e33c33d8b191e9f0eJohn Reck    video->currVop->uChan = video->currVop->yChan + size;
311d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->currVop->vChan = video->currVop->uChan + (size >> 2);
312d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
313d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->prevVop->yChan = IMEM_prevVop_yChan; /* Allocate memory for all VOP OKA 3/2/1*/
314d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (video->prevVop->yChan == NULL) status = PV_FALSE;
315d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->prevVop->uChan = video->prevVop->yChan + size;
316d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->prevVop->vChan = video->prevVop->uChan + (size >> 2);
317d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#else
318d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->currVop->yChan = (PIXEL *) oscl_malloc(size * 3 / 2); /* Allocate memory for all VOP OKA 3/2/1*/
319d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (video->currVop->yChan == NULL) status = PV_FALSE;
320d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
321d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->currVop->uChan = video->currVop->yChan + size;
322d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->currVop->vChan = video->currVop->uChan + (size >> 2);
323d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->prevVop->yChan = (PIXEL *) oscl_malloc(size * 3 / 2); /* Allocate memory for all VOP OKA 3/2/1*/
324d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (video->prevVop->yChan == NULL) status = PV_FALSE;
325d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
326d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->prevVop->uChan = video->prevVop->yChan + size;
327d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->prevVop->vChan = video->prevVop->uChan + (size >> 2);
328d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#endif
329d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->memoryUsage += (size * 3);
330d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#endif   // MEMORY_POOL
331d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    /* Note that baseVop, enhcVop is only used to hold enhancement */
332d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    /*    layer header information.                  05/04/2000  */
333d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (nLayers > 1)
334d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
335d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->prevEnhcVop = (Vop *) oscl_malloc(sizeof(Vop));
336d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->memoryUsage += (sizeof(Vop));
337d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (video->prevEnhcVop == NULL)
338d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
339d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            status = PV_FALSE;
340d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        }
341d1cc1878cc7a07c794feec51c840fd566f59d523Romain Guy        else
342d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
3435acc379c5488e846093efd2347d408069509830aFabrice Di Meglio            oscl_memset(video->prevEnhcVop, 0, sizeof(Vop));
344d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#ifndef PV_MEMORY_POOL
345d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->prevEnhcVop->yChan = (PIXEL *) oscl_malloc(size * 3 / 2); /* Allocate memory for all VOP OKA 3/2/1*/
346d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            if (video->prevEnhcVop->yChan == NULL) status = PV_FALSE;
347d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->prevEnhcVop->uChan = video->prevEnhcVop->yChan + size;
348d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->prevEnhcVop->vChan = video->prevEnhcVop->uChan + (size >> 2);
349d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->memoryUsage += (3 * size / 2);
350d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#endif
351f4ecc55657c535b8b2d7113095903b3808e903e9Daniel        }
3525acc379c5488e846093efd2347d408069509830aFabrice Di Meglio    }
353d1cc1878cc7a07c794feec51c840fd566f59d523Romain Guy
3545acc379c5488e846093efd2347d408069509830aFabrice Di Meglio    /* Allocating space for slices, AC prediction flag, and */
3555acc379c5488e846093efd2347d408069509830aFabrice Di Meglio    /*    AC/DC prediction storage */
3565acc379c5488e846093efd2347d408069509830aFabrice Di Meglio    nTotalMB = video->nTotalMB;
357d1cc1878cc7a07c794feec51c840fd566f59d523Romain Guy    nMBPerRow = video->nMBPerRow;
358d1cc1878cc7a07c794feec51c840fd566f59d523Romain Guy
359d1cc1878cc7a07c794feec51c840fd566f59d523Romain Guy#ifdef DEC_INTERNAL_MEMORY_OPT
360d1cc1878cc7a07c794feec51c840fd566f59d523Romain Guy    video->sliceNo = (uint8 *)(IMEM_sliceNo);
361bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    if (video->sliceNo == NULL) status = PV_FALSE;
362bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    video->memoryUsage += nTotalMB;
363f7a5cdfac62cf2335f192581ca299d241d83e195Fabrice Di Meglio    video->acPredFlag = (uint8 *)(IMEM_acPredFlag);
364d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (video->acPredFlag == NULL) status = PV_FALSE;
365bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    video->memoryUsage += (nTotalMB);
366bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    video->predDC = (typeDCStore *)(IMEM_predDC);
367bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    if (video->predDC == NULL) status = PV_FALSE;
368bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    video->memoryUsage += (nTotalMB * sizeof(typeDCStore));
369bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    video->predDCAC_col = (typeDCACStore *)(IMEM_predDCAC_col);
370d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (video->predDCAC_col == NULL) status = PV_FALSE;
371d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->memoryUsage += ((nMBPerRow + 1) * sizeof(typeDCACStore));
372d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->predDCAC_row = video->predDCAC_col + 1;
373d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->headerInfo.Mode = (uint8 *)(IMEM_headerInfo_Mode);
374d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (video->headerInfo.Mode == NULL) status = PV_FALSE;
375d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->memoryUsage += nTotalMB;
376d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->headerInfo.CBP = (uint8 *)(IMEM_headerInfo_CBP);
377d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (video->headerInfo.CBP == NULL) status = PV_FALSE;
378d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->memoryUsage += nTotalMB;
379d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->QPMB = (int *)(IMEM_headerInfo_QPMB);
380d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (video->QPMB == NULL) status = PV_FALSE;
381d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->memoryUsage += (nTotalMB * sizeof(int));
382d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->mblock = &IMEM_mblock;
383bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    if (video->mblock == NULL) status = PV_FALSE;
384d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    oscl_memset(video->mblock->block, 0, sizeof(int16)*6*NCOEFF_BLOCK); //  Aug 23,2005
385d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
386d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->memoryUsage += sizeof(MacroBlock);
387d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->motX = (MOT *)(IMEM_motX);
388d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (video->motX == NULL) status = PV_FALSE;
389d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->motY = (MOT *)(IMEM_motY);
390d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (video->motY == NULL) status = PV_FALSE;
391d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->memoryUsage += (sizeof(MOT) * 8 * nTotalMB);
392d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#else
393d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->sliceNo = (uint8 *) oscl_malloc(nTotalMB);
394bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    if (video->sliceNo == NULL) status = PV_FALSE;
395bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    video->memoryUsage += nTotalMB;
396bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio
397bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    video->acPredFlag = (uint8 *) oscl_malloc(nTotalMB * sizeof(uint8));
398bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    if (video->acPredFlag == NULL) status = PV_FALSE;
399bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    video->memoryUsage += (nTotalMB);
400bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio
401bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    video->predDC = (typeDCStore *) oscl_malloc(nTotalMB * sizeof(typeDCStore));
402bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    if (video->predDC == NULL) status = PV_FALSE;
403bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    video->memoryUsage += (nTotalMB * sizeof(typeDCStore));
404bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio
405bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    video->predDCAC_col = (typeDCACStore *) oscl_malloc((nMBPerRow + 1) * sizeof(typeDCACStore));
406bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    if (video->predDCAC_col == NULL) status = PV_FALSE;
407bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    video->memoryUsage += ((nMBPerRow + 1) * sizeof(typeDCACStore));
408bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio
409bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    /* element zero will be used for storing vertical (col) AC coefficients */
410bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    /*  the rest will be used for storing horizontal (row) AC coefficients  */
411d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->predDCAC_row = video->predDCAC_col + 1;        /*  ACDC */
412d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
413d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    /* Allocating HeaderInfo structure & Quantizer array */
414d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->headerInfo.Mode = (uint8 *) oscl_malloc(nTotalMB);
415d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (video->headerInfo.Mode == NULL) status = PV_FALSE;
416d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->memoryUsage += nTotalMB;
417d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->headerInfo.CBP = (uint8 *) oscl_malloc(nTotalMB);
418d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (video->headerInfo.CBP == NULL) status = PV_FALSE;
419d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->memoryUsage += nTotalMB;
420d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->QPMB = (int16 *) oscl_malloc(nTotalMB * sizeof(int16));
421d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (video->QPMB == NULL) status = PV_FALSE;
422d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->memoryUsage += (nTotalMB * sizeof(int));
423d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
424d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    /* Allocating macroblock space */
425d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->mblock = (MacroBlock *) oscl_malloc(sizeof(MacroBlock));
426d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (video->mblock == NULL)
427bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    {
428bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio        status = PV_FALSE;
429bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    }
430bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    else
431bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    {
432bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio        oscl_memset(video->mblock->block, 0, sizeof(int16)*6*NCOEFF_BLOCK); //  Aug 23,2005
433bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio
434bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio        video->memoryUsage += sizeof(MacroBlock);
435bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    }
436bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    /* Allocating motion vector space */
437bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    video->motX = (MOT *) oscl_malloc(sizeof(MOT) * 4 * nTotalMB);
438bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    if (video->motX == NULL) status = PV_FALSE;
439bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    video->motY = (MOT *) oscl_malloc(sizeof(MOT) * 4 * nTotalMB);
440bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    if (video->motY == NULL) status = PV_FALSE;
441d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->memoryUsage += (sizeof(MOT) * 8 * nTotalMB);
442d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#endif
443d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
444d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#ifdef PV_POSTPROC_ON
445d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    /* Allocating space for post-processing Mode */
446d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#ifdef DEC_INTERNAL_MEMORY_OPT
447bb0cbae441f04c052dd1a73448ae58fbffaca65dFabrice Di Meglio    video->pstprcTypCur = IMEM_pstprcTypCur;
448d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->memoryUsage += (nTotalMB * 6);
449d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (video->pstprcTypCur == NULL)
450d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
451d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        status = PV_FALSE;
452d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
453d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    else
454d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
455d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        oscl_memset(video->pstprcTypCur, 0, 4*nTotalMB + 2*nTotalMB);
456d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
457d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
458d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->pstprcTypPrv = IMEM_pstprcTypPrv;
459d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->memoryUsage += (nTotalMB * 6);
460d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (video->pstprcTypPrv == NULL)
461d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
462d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        status = PV_FALSE;
463d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
464d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    else
465d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
466d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        oscl_memset(video->pstprcTypPrv, 0, nTotalMB*6);
467d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
468d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
469d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#else
470d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->pstprcTypCur = (uint8 *) oscl_malloc(nTotalMB * 6);
471d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->memoryUsage += (nTotalMB * 6);
472d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (video->pstprcTypCur == NULL)
473d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
474d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        status = PV_FALSE;
475d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
476d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    else
477d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
478d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        oscl_memset(video->pstprcTypCur, 0, 4*nTotalMB + 2*nTotalMB);
479d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
480d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
481d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->pstprcTypPrv = (uint8 *) oscl_malloc(nTotalMB * 6);
482d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->memoryUsage += (nTotalMB * 6);
483d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (video->pstprcTypPrv == NULL)
484d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
485d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        status = PV_FALSE;
486d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
487d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    else
488d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
489d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        oscl_memset(video->pstprcTypPrv, 0, nTotalMB*6);
490d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
491d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
492d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#endif
493d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
494d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#endif
495d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
496d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    /* initialize the decoder library */
497d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->prevVop->predictionType = I_VOP;
498d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->prevVop->timeStamp = 0;
499d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#ifndef PV_MEMORY_POOL
500d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    oscl_memset(video->prevVop->yChan, 16, sizeof(uint8)*size);     /*  10/31/01 */
501d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    oscl_memset(video->prevVop->uChan, 128, sizeof(uint8)*size / 2);
502d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
503d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    oscl_memset(video->currVop->yChan, 0, sizeof(uint8)*size*3 / 2);
504d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (nLayers > 1)
505d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
506d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        oscl_memset(video->prevEnhcVop->yChan, 0, sizeof(uint8)*size*3 / 2);
507d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->prevEnhcVop->timeStamp = 0;
508d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
509d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->concealFrame = video->prevVop->yChan;               /*  07/07/2001 */
510d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    decCtrl->outputFrame = video->prevVop->yChan;              /*  06/19/2002 */
511d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#endif
512d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
513baf3094ecaa073e1cb3e807fa17d096f826c3968Jean Chalard    /* always start from base layer */
514baf3094ecaa073e1cb3e807fa17d096f826c3968Jean Chalard    video->currLayer = 0;
515d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    return status;
516d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne}
517d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
518d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
519d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Function : PVResetVideoDecoder()                                        */
520d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Date     : 01/14/2002                                                   */
521d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Purpose  : Reset video timestamps                                       */
522d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  In/out   :                                                              */
523d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Return   : PV_TRUE if successed, PV_FALSE if failed.                    */
524d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Modified :                                                              */
525d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
526d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles DebunneBool PVResetVideoDecoder(VideoDecControls *decCtrl)
527d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne{
528d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    VideoDecData *video = (VideoDecData *) decCtrl->videoDecoderData;
529d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    int idx;
530d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
531d7429c15e6f4dd9a43b81d94a1bbf65b17d46a16Satoshi Kataoka    for (idx = 0; idx < decCtrl->nLayers; idx++)
532d7429c15e6f4dd9a43b81d94a1bbf65b17d46a16Satoshi Kataoka    {
533d7429c15e6f4dd9a43b81d94a1bbf65b17d46a16Satoshi Kataoka        video->vopHeader[idx]->timeStamp = 0;
534d7429c15e6f4dd9a43b81d94a1bbf65b17d46a16Satoshi Kataoka    }
535d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->prevVop->timeStamp = 0;
536d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (decCtrl->nLayers > 1)
537d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->prevEnhcVop->timeStamp = 0;
538d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
539d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    oscl_memset(video->mblock->block, 0, sizeof(int16)*6*NCOEFF_BLOCK); //  Aug 23,2005
540d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
541d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    return PV_TRUE;
542d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne}
543d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
544d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
545d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
546d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Function : PVCleanUpVideoDecoder()                                      */
547d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Date     : 04/11/2000, 08/29/2000                                       */
548d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Purpose  : Cleanup of the MPEG-4 video decoder library.                 */
549d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  In/out   :                                                              */
550d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Return   : PV_TRUE if successed, PV_FALSE if failed.                    */
551d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Modified :                                                              */
552d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
553d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles DebunneOSCL_EXPORT_REF Bool PVCleanUpVideoDecoder(VideoDecControls *decCtrl)
554d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne{
555d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    int idx;
556d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    VideoDecData *video = (VideoDecData *) decCtrl->videoDecoderData;
557d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#ifdef DEC_INTERNAL_MEMORY_OPT
558d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (video)
559d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
560d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#ifdef PV_POSTPROC_ON
561d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->pstprcTypCur = NULL;
562d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->pstprcTypPrv = NULL;
563d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#endif
564d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
565d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->acPredFlag       = NULL;
566d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->sliceNo          = NULL;
567d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->motX             = NULL;
568d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->motY             = NULL;
569d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->mblock           = NULL;
570d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->QPMB             = NULL;
571d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->predDC           = NULL;
572d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->predDCAC_row     = NULL;
573d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->predDCAC_col     = NULL;
574d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->headerInfo.Mode  = NULL;
575d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->headerInfo.CBP   = NULL;
576d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (video->numberOfLayers > 1)
577d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
578d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            if (video->prevEnhcVop)
579d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            {
580d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                video->prevEnhcVop->uChan = NULL;
581d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                video->prevEnhcVop->vChan = NULL;
582d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                if (video->prevEnhcVop->yChan) oscl_free(video->prevEnhcVop->yChan);
583d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                oscl_free(video->prevEnhcVop);
584d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            }
585d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        }
586d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (video->currVop)
587d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
588d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->currVop->uChan = NULL;
589d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->currVop->vChan = NULL;
590d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            if (video->currVop->yChan)
591d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                video->currVop->yChan = NULL;
592d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->currVop = NULL;
593d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        }
594d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (video->prevVop)
595d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
596d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->prevVop->uChan = NULL;
597d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->prevVop->vChan = NULL;
598d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            if (video->prevVop->yChan)
599d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                video->prevVop->yChan = NULL;
600d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->prevVop = NULL;
601d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        }
602d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
603d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (video->vol)
604d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
605d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            for (idx = 0; idx < video->numberOfLayers; idx++)
606d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            {
607d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                if (video->vol[idx])
608d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                {
609d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    BitstreamClose(video->vol[idx]->bitstream);
610d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    video->vol[idx]->bitstream = NULL;
611d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    video->vol[idx] = NULL;
612d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                }
613d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                video->vopHeader[idx] = NULL;
614d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
615d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            }
616d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->vol = NULL;
617d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->vopHeader = NULL;
618d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        }
619d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
620d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video = NULL;
621d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        decCtrl->videoDecoderData = NULL;
622d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
623d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
624d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#else
625d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
626d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (video)
627d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
628d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#ifdef PV_POSTPROC_ON
629d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (video->pstprcTypCur) oscl_free(video->pstprcTypCur);
630d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (video->pstprcTypPrv) oscl_free(video->pstprcTypPrv);
631d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#endif
632d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (video->predDC) oscl_free(video->predDC);
633d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->predDCAC_row = NULL;
634d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (video->predDCAC_col) oscl_free(video->predDCAC_col);
635d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (video->motX) oscl_free(video->motX);
636d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (video->motY) oscl_free(video->motY);
637d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (video->mblock) oscl_free(video->mblock);
638d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (video->QPMB) oscl_free(video->QPMB);
639d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (video->headerInfo.Mode) oscl_free(video->headerInfo.Mode);
640d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (video->headerInfo.CBP) oscl_free(video->headerInfo.CBP);
641d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (video->sliceNo) oscl_free(video->sliceNo);
642d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (video->acPredFlag) oscl_free(video->acPredFlag);
643d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
644d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (video->numberOfLayers > 1)
645d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
646d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            if (video->prevEnhcVop)
647d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            {
648d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                video->prevEnhcVop->uChan = NULL;
649d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                video->prevEnhcVop->vChan = NULL;
650d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                if (video->prevEnhcVop->yChan) oscl_free(video->prevEnhcVop->yChan);
651d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                oscl_free(video->prevEnhcVop);
652d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            }
653d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        }
654d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (video->currVop)
655d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
656d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
657d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#ifndef PV_MEMORY_POOL
658d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->currVop->uChan = NULL;
659d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->currVop->vChan = NULL;
660d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            if (video->currVop->yChan)
661d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                oscl_free(video->currVop->yChan);
662d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#endif
663d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            oscl_free(video->currVop);
664d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        }
665d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (video->prevVop)
666d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
667d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#ifndef PV_MEMORY_POOL
668d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->prevVop->uChan = NULL;
669d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->prevVop->vChan = NULL;
670d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            if (video->prevVop->yChan)
671d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                oscl_free(video->prevVop->yChan);
672d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#endif
673d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            oscl_free(video->prevVop);
674d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        }
675d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
676d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (video->vol)
677d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
678d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            for (idx = 0; idx < video->numberOfLayers; idx++)
679d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            {
680d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                if (video->vol[idx])
681d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                {
682d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    if (video->vol[idx]->bitstream)
683d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    {
684d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                        BitstreamClose(video->vol[idx]->bitstream);
685d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                        oscl_free(video->vol[idx]->bitstream);
686d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    }
687d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    oscl_free(video->vol[idx]);
688d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                }
689d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
690d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            }
691d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            oscl_free(video->vol);
692d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        }
693d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
694d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        for (idx = 0; idx < video->numberOfLayers; idx++)
695d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
696d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            if (video->vopHeader[idx]) oscl_free(video->vopHeader[idx]);
697d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        }
698d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
699d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (video->vopHeader) oscl_free(video->vopHeader);
700d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
701d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        oscl_free(video);
702d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        decCtrl->videoDecoderData = NULL;
703d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
704d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#endif
705d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    return PV_TRUE;
706d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne}
707d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
708d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Function : PVGetVideoDimensions()                                       */
709d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Date     : 040505                                                       */
710d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Purpose  :                                                              */
711d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  In/out   :                                                              */
712d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Return   : the display_width and display_height of                      */
713d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*          the frame in the current layer.                                 */
714d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Note     : This is not a macro or inline function because we do         */
715d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*              not want to expose our internal data structure.             */
716d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Modified :                                                              */
717d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
718d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles DebunneOSCL_EXPORT_REF void PVGetVideoDimensions(VideoDecControls *decCtrl, int32 *display_width, int32 *display_height)
719d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne{
720d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    VideoDecData *video = (VideoDecData *)decCtrl->videoDecoderData;
721d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    *display_width = video->displayWidth;
722d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    *display_height = video->displayHeight;
723d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne}
724d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
725d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
726d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Function : PVGetVideoTimeStamp()                                        */
727d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Date     : 04/27/2000, 08/29/2000                                       */
728d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Purpose  :                                                              */
729d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  In/out   :                                                              */
730d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Return   : current time stamp in millisecond.                           */
731d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Note     :                                                              */
732d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Modified :                                                              */
733d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
734d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunneuint32 PVGetVideoTimeStamp(VideoDecControls *decCtrl)
735d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne{
736d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    VideoDecData *video = (VideoDecData *)decCtrl->videoDecoderData;
737d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    return video->currTimestamp;
738d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne}
739d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
740d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
741d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
742d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Function : PVSetPostProcType()                                          */
743d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Date     : 07/07/2000                                                   */
744d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Purpose  :                                                              */
745d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  In/out   :                                                              */
746d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Return   : Set post-processing filter type.                             */
747d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Note     :                                                              */
748d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Modified : . 08/29/2000 changes the name for consistency.               */
749d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
750d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles DebunneOSCL_EXPORT_REF void PVSetPostProcType(VideoDecControls *decCtrl, int mode)
751d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne{
752d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    VideoDecData *video = (VideoDecData *)decCtrl->videoDecoderData;
753d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->postFilterType = mode;
754d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne}
755d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
756d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
757d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
758d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Function : PVGetDecBitrate()                                            */
759d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Date     : 08/23/2000                                                   */
760d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Purpose  :                                                              */
761d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  In/out   :                                                              */
762d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Return   : This function returns the average bits per second.           */
763d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Note     :                                                              */
764d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Modified :                                                              */
765d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
766d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunneint PVGetDecBitrate(VideoDecControls *decCtrl)
767d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne{
768d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    VideoDecData *video = (VideoDecData *)decCtrl->videoDecoderData;
769d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    int     idx;
770d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    int32   sum = 0;
771d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
772d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    for (idx = 0; idx < BITRATE_AVERAGE_WINDOW; idx++)
773d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
774d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        sum += video->nBitsPerVop[idx];
775d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
776d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    sum = (sum * video->frameRate) / (10 * BITRATE_AVERAGE_WINDOW);
777d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    return (int) sum;
778d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne}
779d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
780d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
781d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
782d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Function : PVGetDecFramerate()                                          */
783d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Date     : 08/23/2000                                                   */
784d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Purpose  :                                                              */
785d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  In/out   :                                                              */
786d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Return   : This function returns the average frame per 10 second.       */
787d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Note     : The fps can be calculated by PVGetDecFramerate()/10          */
788d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Modified :                                                              */
789d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
790d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunneint PVGetDecFramerate(VideoDecControls *decCtrl)
791d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne{
79283b68ba4ad7e80dd0afe34f9f53dde5884325f58Yohei Yukawa    VideoDecData *video = (VideoDecData *)decCtrl->videoDecoderData;
793d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
794d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    return video->frameRate;
795d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne}
796d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
797d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
798d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Function : PVGetOutputFrame()                                           */
799d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Date     : 05/07/2001                                                   */
800d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Purpose  :                                                              */
801d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  In/out   :                                                              */
802d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Return   : This function returns the pointer to the output frame        */
803d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Note     :                                                              */
804d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Modified :                                                              */
805d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
806d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunneuint8 *PVGetDecOutputFrame(VideoDecControls *decCtrl)
807d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne{
808d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    return decCtrl->outputFrame;
809d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne}
810d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
811d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
812d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Function : PVGetLayerID()                                               */
813d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Date     : 07/09/2001                                                   */
814d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Purpose  :                                                              */
815d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  In/out   :                                                              */
816d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Return   : This function returns decoded frame layer id (BASE/ENHANCE)  */
817d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Note     :                                                              */
818d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Modified :                                                              */
819d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
820d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunneint PVGetLayerID(VideoDecControls *decCtrl)
821d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne{
822d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    VideoDecData *video = (VideoDecData *)decCtrl->videoDecoderData;
823d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    return video->currLayer;
824d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne}
825d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
826d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Function : PVGetDecMemoryUsage()                                        */
827d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Date     : 08/23/2000                                                   */
828d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Purpose  :                                                              */
829d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  In/out   :                                                              */
830d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Return   : This function returns the amount of memory used.             */
831d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Note     :                                                              */
832d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Modified :                                                              */
833d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
834b9b77aecf22307300bbf923fbde39422c8c12e80Victoria Leaseint32 PVGetDecMemoryUsage(VideoDecControls *decCtrl)
835b9b77aecf22307300bbf923fbde39422c8c12e80Victoria Lease{
836d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    VideoDecData *video = (VideoDecData *)decCtrl->videoDecoderData;
837d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    return video->memoryUsage;
838d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne}
839d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
840d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
841d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
842d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Function : PVGetDecBitstreamMode()                                      */
843d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Date     : 08/23/2000                                                   */
844d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Purpose  :                                                              */
845d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  In/out   :                                                              */
846d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Return   : This function returns the decoding mode of the baselayer     */
847d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*              bitstream.                                                  */
848d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Note     :                                                              */
849d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Modified :                                                              */
850d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
851d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles DebunneOSCL_EXPORT_REF MP4DecodingMode PVGetDecBitstreamMode(VideoDecControls *decCtrl)
852d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne{
853d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    VideoDecData *video = (VideoDecData *)decCtrl->videoDecoderData;
854d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (video->shortVideoHeader)
855d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
856d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        return H263_MODE;
857d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
858d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    else
859d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
860d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        return MPEG4_MODE;
861d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
862d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne}
863d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
864d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
865d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
866d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Function : PVExtractVolHeader()                                         */
867d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Date     : 08/29/2000                                                   */
868d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Purpose  :                                                              */
869d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  In/out   :                                                              */
870d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Return   : Extract vol header of the bitstream from buffer[].           */
871d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Note     :                                                              */
872d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Modified :                                                              */
873d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
874d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles DebunneBool PVExtractVolHeader(uint8 *video_buffer, uint8 *vol_header, int32 *vol_header_size)
875d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne{
876d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    int idx = -1;
877d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    uint8 start_code_prefix[] = { 0x00, 0x00, 0x01 };
878d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    uint8 h263_prefix[] = { 0x00, 0x00, 0x80 };
879d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
880d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (oscl_memcmp(h263_prefix, video_buffer, 3) == 0) /* we have short header stream */
881d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
882d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        oscl_memcpy(vol_header, video_buffer, 32);
883d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        *vol_header_size = 32;
884d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        return TRUE;
885d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
886d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    else
887d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
888d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (oscl_memcmp(start_code_prefix, video_buffer, 3) ||
889d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                (video_buffer[3] != 0xb0 && video_buffer[3] >= 0x20)) return FALSE;
890d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
891d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        do
892d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
893d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            idx++;
894d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            while (oscl_memcmp(start_code_prefix, video_buffer + idx, 3))
895d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            {
896d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                idx++;
897d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                if (idx + 3 >= *vol_header_size) goto quit;
898d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            }
899d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        }
900d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        while (video_buffer[idx+3] != 0xb3 && video_buffer[idx+3] != 0xb6);
901d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
902d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        oscl_memcpy(vol_header, video_buffer, idx);
903d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        *vol_header_size = idx;
904d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        return TRUE;
905d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
906d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
907d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunnequit:
908d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    oscl_memcpy(vol_header, video_buffer, *vol_header_size);
909d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    return FALSE;
910d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne}
911d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
912d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
913d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
914d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Function : PVLocateFrameHeader()                                        */
915d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Date     : 04/8/2005                                                    */
916d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Purpose  :                                                              */
917d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  In/out   :                                                              */
918d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Return   : Return the offset to the first SC in the buffer              */
919d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Note     :                                                              */
920d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Modified :                                                              */
921d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
922d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunneint32 PVLocateFrameHeader(uint8 *ptr, int32 size)
923d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne{
924d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    int count = 0;
925d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    int32 i = size;
926d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
927d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (size < 1)
928d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
929d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        return 0;
930d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
931d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    while (i--)
932d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
933d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if ((count > 1) && (*ptr == 0x01))
934d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
935d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            i += 2;
936d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            break;
937d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        }
938d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
939d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (*ptr++)
940d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            count = 0;
941d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        else
942d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            count++;
943d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
944d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    return (size - (i + 1));
945d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne}
946d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
947d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
948d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
949d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Function : PVLocateH263FrameHeader()                                    */
950d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Date     : 04/8/2005                                                    */
951d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Purpose  :                                                              */
952d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  In/out   :                                                              */
953d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Return   : Return the offset to the first SC in the buffer              */
954d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Note     :                                                              */
955d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Modified :                                                              */
956d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
957d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunneint32 PVLocateH263FrameHeader(uint8 *ptr, int32 size)
958d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne{
959d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    int count = 0;
960d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    int32 i = size;
961d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
962d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (size < 1)
963d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
964d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        return 0;
965d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
966d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
967d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    while (i--)
968d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
969d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if ((count > 1) && ((*ptr & 0xFC) == 0x80))
970d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
971d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            i += 2;
972d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            break;
973d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        }
974d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
975d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (*ptr++)
976d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            count = 0;
977d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        else
978d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            count++;
979d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
980d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    return (size - (i + 1));
981d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne}
982057a585fba01d92c38f27a8c080622dfd0c6f556Adam Powell
983d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
984057a585fba01d92c38f27a8c080622dfd0c6f556Adam Powell/* ======================================================================== */
985d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Function : PVDecodeVideoFrame()                                         */
986d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Date     : 08/29/2000                                                   */
987d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Purpose  : Decode one video frame and return a YUV-12 image.            */
988d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  In/out   :                                                              */
989d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Return   :                                                              */
990d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Note     :                                                              */
991d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Modified : 04/17/2001 removed PV_EOS, PV_END_OF_BUFFER              */
992d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*           : 08/22/2002 break up into 2 functions PVDecodeVopHeader and */
993d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*                          PVDecodeVopBody                                 */
994d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
995d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles DebunneOSCL_EXPORT_REF Bool PVDecodeVideoFrame(VideoDecControls *decCtrl, uint8 *buffer[],
996d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                                        uint32 timestamp[], int32 buffer_size[], uint use_ext_timestamp[], uint8 *currYUV)
997d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne{
998d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    PV_STATUS status = PV_FAIL;
999d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    VopHeaderInfo header_info;
1000d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1001d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    status = (PV_STATUS)PVDecodeVopHeader(decCtrl, buffer, timestamp, buffer_size, &header_info, use_ext_timestamp, currYUV);
1002d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (status != PV_TRUE)
1003d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        return PV_FALSE;
1004d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1005d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (PVDecodeVopBody(decCtrl, buffer_size) != PV_TRUE)
1006d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
1007d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        return PV_FALSE;
1008d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
1009d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1010d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    return PV_TRUE;
1011d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne}
1012d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1013d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
1014d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Function : PVDecodeVopHeader()                                          */
1015d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Date     : 08/22/2002                                                   */
1016d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Purpose  : Determine target layer and decode vop header, modified from  */
1017d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*              original PVDecodeVideoFrame.                                */
1018d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  In/out   :                                                              */
1019d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Return   :                                                              */
1020d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Note     :                                                              */
1021d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Modified :                                                              */
1022d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
1023d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles DebunneBool PVDecodeVopHeader(VideoDecControls *decCtrl, uint8 *buffer[],
1024d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                       uint32 timestamp[], int32 buffer_size[], VopHeaderInfo *header_info, uint use_ext_timestamp [], uint8 *currYUV)
1025d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne{
1026d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    VideoDecData *video = (VideoDecData *) decCtrl->videoDecoderData;
1027d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    Vol *currVol;
1028d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    Vop *currVop = video->currVop;
1029d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    Vop **vopHeader = video->vopHeader;
1030d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    BitstreamDecVideo *stream;
1031d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1032d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    int target_layer;
1033d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1034d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#ifdef PV_SUPPORT_TEMPORAL_SCALABILITY
1035d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    PV_STATUS status = PV_FAIL;
1036d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    int idx;
1037d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    int32 display_time;
1038d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1039d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    /* decide which frame to decode next */
1040d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (decCtrl->nLayers > 1)
1041d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
1042d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        display_time = target_layer = -1;
1043d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        for (idx = 0; idx < decCtrl->nLayers; idx++)
1044d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
1045d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            /* do we have data for this layer? */
1046d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            if (buffer_size[idx] <= 0)
1047d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            {
1048d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                timestamp[idx] = -1;
1049d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                continue;
1050d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            }
1051d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1052d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            /* did the application provide a timestamp for this vop? */
1053d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            if (timestamp[idx] < 0)
1054d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            {
1055d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                if (vopHeader[idx]->timeStamp < 0)
1056d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                {
1057d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    /* decode the timestamp in the bitstream */
1058d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    video->currLayer = idx;
1059d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    stream = video->vol[idx]->bitstream;
1060c72fba82a68992fe5bec05e4415ae98deaa66ea3Gilles Debunne                    BitstreamReset(stream, buffer[idx], buffer_size[idx]);
1061c72fba82a68992fe5bec05e4415ae98deaa66ea3Gilles Debunne
1062d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    while ((status = DecodeVOPHeader(video, vopHeader[idx], FALSE)) != PV_SUCCESS)
1063d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    {
1064d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                        /* Try to find a VOP header in the buffer.   08/30/2000. */
1065d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                        if (PVSearchNextM4VFrame(stream) != PV_SUCCESS)
1066d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                        {
1067d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                            /* if we don't have data for enhancement layer, */
1068d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                            /*    don't just stop.   09/07/2000.          */
1069d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                            buffer_size[idx] = 0;
1070d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                            break;
1071d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                        }
1072d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    }
1073d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    if (status == PV_SUCCESS)
1074d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    {
1075d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                        vopHeader[idx]->timeStamp =
1076d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                            timestamp[idx] = CalcVopDisplayTime(video->vol[idx], vopHeader[idx], video->shortVideoHeader);
1077d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                        if (idx == 0) vopHeader[idx]->refSelectCode = 1;
1078d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    }
1079d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                }
1080d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                else
1081d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                {
1082d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    /* We've decoded this vop header in the previous run already. */
1083d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    timestamp[idx] = vopHeader[idx]->timeStamp;
1084d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                }
1085d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            }
1086d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1087d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            /* Use timestamps to select the next VOP to be decoded */
1088d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            if (timestamp[idx] >= 0 && (display_time < 0 || display_time > timestamp[idx]))
1089d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            {
1090d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                display_time = timestamp[idx];
1091d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                target_layer = idx;
1092d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            }
1093d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            else if (display_time == timestamp[idx])
1094d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            {
1095d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                /* we have to handle either SNR or spatial scalability here. */
1096d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            }
1097d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        }
1098d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (target_layer < 0) return PV_FALSE;
1099d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1100d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        /* set up for decoding the target layer */
1101d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->currLayer = target_layer;
1102d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        currVol = video->vol[target_layer];
1103d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->bitstream = stream = currVol->bitstream;
1104d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1105d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        /* We need to decode the vop header if external timestamp   */
1106d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        /*    is provided.    10/04/2000                            */
1107d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (vopHeader[target_layer]->timeStamp < 0)
1108d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
1109d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            stream = video->vol[target_layer]->bitstream;
1110d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            BitstreamReset(stream, buffer[target_layer], buffer_size[target_layer]);
1111d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1112d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            while (DecodeVOPHeader(video, vopHeader[target_layer], TRUE) != PV_SUCCESS)
1113d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            {
1114d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                /* Try to find a VOP header in the buffer.   08/30/2000. */
1115d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                if (PVSearchNextM4VFrame(stream) != PV_SUCCESS)
1116d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                {
1117d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    /* if we don't have data for enhancement layer, */
1118d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    /*    don't just stop.   09/07/2000.          */
1119d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    buffer_size[target_layer] = 0;
1120d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    break;
1121d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                }
1122d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            }
1123d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->vol[target_layer]->timeInc_offset = vopHeader[target_layer]->timeInc;
1124d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->vol[target_layer]->moduloTimeBase = timestamp[target_layer];
1125d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            vopHeader[target_layer]->timeStamp = timestamp[target_layer];
1126d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            if (target_layer == 0) vopHeader[target_layer]->refSelectCode = 1;
1127d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        }
1128d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
1129d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    else /* base layer only decoding */
1130d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
1131d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#endif
1132d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->currLayer = target_layer = 0;
1133d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        currVol = video->vol[0];
1134d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->bitstream = stream = currVol->bitstream;
1135c99d33fb4dcf332b66281a0a6a31710407fc829dJean Chalard        if (buffer_size[0] <= 0) return PV_FALSE;
1136d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        BitstreamReset(stream, buffer[0], buffer_size[0]);
1137d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1138c99d33fb4dcf332b66281a0a6a31710407fc829dJean Chalard        if (video->shortVideoHeader)
1139c99d33fb4dcf332b66281a0a6a31710407fc829dJean Chalard        {
1140c99d33fb4dcf332b66281a0a6a31710407fc829dJean Chalard            while (DecodeShortHeader(video, vopHeader[0]) != PV_SUCCESS)
1141d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            {
1142d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                if (PVSearchNextH263Frame(stream) != PV_SUCCESS)
1143d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                {
1144d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    /* There is no vop header in the buffer,    */
1145d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    /*   clean bitstream buffer.     2/5/2001   */
1146d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    buffer_size[0] = 0;
1147d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    if (video->initialized == PV_FALSE)
1148d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    {
1149d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                        video->displayWidth = video->width = 0;
1150d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                        video->displayHeight = video->height = 0;
1151d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    }
1152d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    return PV_FALSE;
1153d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                }
1154d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            }
1155d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1156d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            if (use_ext_timestamp[0])
1157d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            {
1158d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                /* MTB for H263 is absolute TR */
1159d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                /* following line is equivalent to  round((timestamp[0]*30)/1001);   11/13/2001 */
1160d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                video->vol[0]->moduloTimeBase = 30 * ((timestamp[0] + 17) / 1001) + (30 * ((timestamp[0] + 17) % 1001) / 1001);
1161d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                vopHeader[0]->timeStamp = timestamp[0];
1162d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            }
1163d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            else
1164d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                vopHeader[0]->timeStamp = CalcVopDisplayTime(currVol, vopHeader[0], video->shortVideoHeader);
1165d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        }
1166d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        else
1167d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
1168d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            while (DecodeVOPHeader(video, vopHeader[0], FALSE) != PV_SUCCESS)
1169d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            {
1170d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                /* Try to find a VOP header in the buffer.   08/30/2000. */
1171d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                if (PVSearchNextM4VFrame(stream) != PV_SUCCESS)
1172d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                {
1173d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    /* There is no vop header in the buffer,    */
1174d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    /*   clean bitstream buffer.     2/5/2001   */
1175d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    buffer_size[0] = 0;
1176d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    return PV_FALSE;
1177d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                }
1178d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            }
1179d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1180d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            if (use_ext_timestamp[0])
1181d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            {
1182d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                video->vol[0]->timeInc_offset = vopHeader[0]->timeInc;
1183d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                video->vol[0]->moduloTimeBase = timestamp[0];  /*  11/12/2001 */
1184d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                vopHeader[0]->timeStamp = timestamp[0];
1185d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            }
1186d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            else
1187d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            {
1188d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                vopHeader[0]->timeStamp = CalcVopDisplayTime(currVol, vopHeader[0], video->shortVideoHeader);
1189d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            }
1190d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        }
1191d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1192d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        /* set up some base-layer only parameters */
1193d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        vopHeader[0]->refSelectCode = 1;
1194d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#ifdef PV_SUPPORT_TEMPORAL_SCALABILITY
1195d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
1196d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#endif
1197d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    timestamp[target_layer] = video->currTimestamp = vopHeader[target_layer]->timeStamp;
1198d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#ifdef PV_MEMORY_POOL
1199d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    vopHeader[target_layer]->yChan = (PIXEL *)currYUV;
1200d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    vopHeader[target_layer]->uChan = (PIXEL *)currYUV + decCtrl->size;
1201d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    vopHeader[target_layer]->vChan = (PIXEL *)(vopHeader[target_layer]->uChan) + (decCtrl->size >> 2);
1202d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#else
1203d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    vopHeader[target_layer]->yChan = currVop->yChan;
1204d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    vopHeader[target_layer]->uChan = currVop->uChan;
1205d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    vopHeader[target_layer]->vChan = currVop->vChan;
1206d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#endif
1207d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    oscl_memcpy(currVop, vopHeader[target_layer], sizeof(Vop));
1208d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1209d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#ifdef PV_SUPPORT_TEMPORAL_SCALABILITY
1210d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    vopHeader[target_layer]->timeStamp = -1;
1211d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#endif
1212d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    /* put header info into the structure */
1213d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    header_info->currLayer = target_layer;
1214d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    header_info->timestamp = video->currTimestamp;
1215d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    header_info->frameType = (MP4FrameType)currVop->predictionType;
1216d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    header_info->refSelCode = vopHeader[target_layer]->refSelectCode;
1217d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    header_info->quantizer = currVop->quantizer;
1218d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    /***************************************/
1219d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1220d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    return PV_TRUE;
1221d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne}
1222d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1223d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1224d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
1225d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Function : PVDecodeVopBody()                                            */
1226d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Date     : 08/22/2002                                                   */
1227d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Purpose  : Decode vop body after the header is decoded, modified from   */
1228c62589cbecef6e748bcc6c6f4ea6a8ff7656923fGilles Debunne/*              original PVDecodeVideoFrame.                                */
1229d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  In/out   :                                                              */
1230d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Return   :                                                              */
1231d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Note     :                                                              */
1232d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Modified :                                                              */
1233d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
1234d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles DebunneBool PVDecodeVopBody(VideoDecControls *decCtrl, int32 buffer_size[])
1235d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne{
1236d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    PV_STATUS status = PV_FAIL;
1237d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    VideoDecData *video = (VideoDecData *) decCtrl->videoDecoderData;
1238d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    int target_layer = video->currLayer;
1239d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    Vol *currVol = video->vol[target_layer];
1240c62589cbecef6e748bcc6c6f4ea6a8ff7656923fGilles Debunne    Vop *currVop = video->currVop;
1241d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    Vop *prevVop = video->prevVop;
1242d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    Vop *tempVopPtr;
1243c62589cbecef6e748bcc6c6f4ea6a8ff7656923fGilles Debunne    int bytes_consumed = 0; /* Record how many bits we used in the buffer.   04/24/2001 */
1244c62589cbecef6e748bcc6c6f4ea6a8ff7656923fGilles Debunne
1245c62589cbecef6e748bcc6c6f4ea6a8ff7656923fGilles Debunne    int idx;
1246c62589cbecef6e748bcc6c6f4ea6a8ff7656923fGilles Debunne
1247c62589cbecef6e748bcc6c6f4ea6a8ff7656923fGilles Debunne    if (currVop->vopCoded == 0)                  /*  07/03/2001 */
1248d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
1249d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        PV_BitstreamByteAlign(currVol->bitstream);
1250d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        /* We should always clear up bitstream buffer.   10/10/2000 */
1251d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        bytes_consumed = (getPointer(currVol->bitstream) + 7) >> 3;
1252d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1253d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (bytes_consumed > currVol->bitstream->data_end_pos)
1254d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
1255d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            bytes_consumed = currVol->bitstream->data_end_pos;
1256d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        }
1257d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1258d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (bytes_consumed < buffer_size[target_layer])
1259d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
1260d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            /* If we only consume part of the bits in the buffer, take those */
1261df7c72f68c2fe32546aa119e98be9acf8fffd66dJean Chalard            /*  out.     04/24/2001 */
1262df7c72f68c2fe32546aa119e98be9acf8fffd66dJean Chalard            /*          oscl_memcpy(buffer[target_layer], buffer[target_layer]+bytes_consumed,
1263df7c72f68c2fe32546aa119e98be9acf8fffd66dJean Chalard                            (buffer_size[target_layer]-=bytes_consumed)); */
1264df7c72f68c2fe32546aa119e98be9acf8fffd66dJean Chalard            buffer_size[target_layer] -= bytes_consumed;
1265df7c72f68c2fe32546aa119e98be9acf8fffd66dJean Chalard        }
1266df7c72f68c2fe32546aa119e98be9acf8fffd66dJean Chalard        else
1267df7c72f68c2fe32546aa119e98be9acf8fffd66dJean Chalard        {
1268df7c72f68c2fe32546aa119e98be9acf8fffd66dJean Chalard            buffer_size[target_layer] = 0;
1269df7c72f68c2fe32546aa119e98be9acf8fffd66dJean Chalard        }
1270df7c72f68c2fe32546aa119e98be9acf8fffd66dJean Chalard#ifdef PV_MEMORY_POOL
1271df7c72f68c2fe32546aa119e98be9acf8fffd66dJean Chalard
1272df7c72f68c2fe32546aa119e98be9acf8fffd66dJean Chalard        if (target_layer)
1273df7c72f68c2fe32546aa119e98be9acf8fffd66dJean Chalard        {
1274c99d33fb4dcf332b66281a0a6a31710407fc829dJean Chalard            if (video->prevEnhcVop->timeStamp > video->prevVop->timeStamp)
1275c99d33fb4dcf332b66281a0a6a31710407fc829dJean Chalard            {
1276df7c72f68c2fe32546aa119e98be9acf8fffd66dJean Chalard                video->prevVop = video->prevEnhcVop;
1277df7c72f68c2fe32546aa119e98be9acf8fffd66dJean Chalard            }
1278df7c72f68c2fe32546aa119e98be9acf8fffd66dJean Chalard        }
1279df7c72f68c2fe32546aa119e98be9acf8fffd66dJean Chalard
1280df7c72f68c2fe32546aa119e98be9acf8fffd66dJean Chalard        oscl_memcpy(currVop->yChan, video->prevVop->yChan, (decCtrl->size*3) / 2);
1281df7c72f68c2fe32546aa119e98be9acf8fffd66dJean Chalard
1282d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->prevVop = prevVop;
1283d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1284d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->concealFrame = currVop->yChan;       /*  07/07/2001 */
1285d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1286d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->vop_coding_type = currVop->predictionType; /*  07/09/01 */
1287d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1288d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        decCtrl->outputFrame = currVop->yChan;
1289d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1290d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        /* Swap VOP pointers.  No enhc. frame oscl_memcpy() anymore!   04/24/2001 */
1291d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (target_layer)
1292d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
1293d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            tempVopPtr = video->prevEnhcVop;
1294d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->prevEnhcVop = video->currVop;
1295d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->currVop = tempVopPtr;
1296d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        }
1297d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        else
1298d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
1299d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            tempVopPtr = video->prevVop;
1300d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->prevVop = video->currVop;
1301d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->currVop = tempVopPtr;
1302d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        }
1303d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#else
1304d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (target_layer)       /* this is necessary to avoid flashback problems   06/21/2002*/
1305d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
1306d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->prevEnhcVop->timeStamp = currVop->timeStamp;
1307d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        }
1308d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        else
1309d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
1310d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->prevVop->timeStamp = currVop->timeStamp;
1311d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        }
1312d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#endif
1313d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        video->vop_coding_type = currVop->predictionType; /*  07/09/01 */
1314d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        /* the following is necessary to avoid displaying an notCoded I-VOP at the beginning of a session
1315d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        or after random positioning  07/03/02*/
1316d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (currVop->predictionType == I_VOP)
1317d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
1318d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->vop_coding_type = P_VOP;
1319d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        }
1320d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1321d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1322d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        return PV_TRUE;
1323d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
1324d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    /* ======================================================= */
1325d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    /*  Decode vop body (if there is no error in the header!)  */
1326d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    /* ======================================================= */
1327d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1328d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    /* first, we need to select a reference frame */
1329d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (decCtrl->nLayers > 1)
1330d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
1331d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (currVop->predictionType == I_VOP)
1332d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
1333d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            /* do nothing here */
1334776abc24cdd18610232a50b997cce3cffa74609bAdam Lesinski        }
1335d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        else if (currVop->predictionType == P_VOP)
1336d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
1337d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            switch (currVop->refSelectCode)
1338157aafcbee0eabda798a3be406ccc4200ee86756Gilles Debunne            {
1339d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                case 0 : /* most recently decoded enhancement vop */
1340d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    /* Setup video->prevVop before we call PV_DecodeVop().   04/24/2001 */
1341955beb2b96a78cf6ee990d0f20bcaf2d22ce608bSangkyu Lee                    if (video->prevEnhcVop->timeStamp >= video->prevVop->timeStamp)
1342d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                        video->prevVop = video->prevEnhcVop;
1343d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    break;
1344d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1345d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                case 1 : /* most recently displayed base-layer vop */
1346157aafcbee0eabda798a3be406ccc4200ee86756Gilles Debunne                    if (target_layer)
1347d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    {
1348d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                        if (video->prevEnhcVop->timeStamp > video->prevVop->timeStamp)
1349d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                            video->prevVop = video->prevEnhcVop;
1350d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    }
1351d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    break;
1352d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1353157aafcbee0eabda798a3be406ccc4200ee86756Gilles Debunne                case 2 : /* next base-layer vop in display order */
1354d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    break;
1355d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1356d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                case 3 : /* temporally coincident base-layer vop (no MV's) */
1357d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                    break;
13587558aa708160c287552f4e1e33c33d8b191e9f0eJohn Reck            }
13597558aa708160c287552f4e1e33c33d8b191e9f0eJohn Reck        }
13607558aa708160c287552f4e1e33c33d8b191e9f0eJohn Reck        else /* we have a B-Vop */
1361d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
1362d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            mp4dec_log("DecodeVideoFrame(): B-VOP not supported.\n");
13637558aa708160c287552f4e1e33c33d8b191e9f0eJohn Reck        }
1364f666ad7046c0b1b255835f75aeb7d1391067df93John Reck    }
1365955beb2b96a78cf6ee990d0f20bcaf2d22ce608bSangkyu Lee
1366157aafcbee0eabda798a3be406ccc4200ee86756Gilles Debunne    /* This is for the calculation of the frame rate and bitrate. */
1367157aafcbee0eabda798a3be406ccc4200ee86756Gilles Debunne    idx = ++video->frame_idx % BITRATE_AVERAGE_WINDOW;
1368157aafcbee0eabda798a3be406ccc4200ee86756Gilles Debunne
1369fd5bc01f70c8d9270162d38bb9f675308b5a19b0Gilles Debunne    /* Calculate bitrate for this layer.   08/23/2000 */
1370fd5bc01f70c8d9270162d38bb9f675308b5a19b0Gilles Debunne    status = PV_DecodeVop(video);
1371fd5bc01f70c8d9270162d38bb9f675308b5a19b0Gilles Debunne    video->nBitsPerVop[idx] = getPointer(currVol->bitstream);
1372fd5bc01f70c8d9270162d38bb9f675308b5a19b0Gilles Debunne    video->prevTimestamp[idx] = currVop->timeStamp;
1373fd5bc01f70c8d9270162d38bb9f675308b5a19b0Gilles Debunne
1374fd5bc01f70c8d9270162d38bb9f675308b5a19b0Gilles Debunne    /* restore video->prevVop after PV_DecodeVop().   04/24/2001 */
1375fd5bc01f70c8d9270162d38bb9f675308b5a19b0Gilles Debunne//  if (currVop->refSelectCode == 0) video->prevVop = prevVop;
1376fd5bc01f70c8d9270162d38bb9f675308b5a19b0Gilles Debunne    video->prevVop = prevVop;
1377fd5bc01f70c8d9270162d38bb9f675308b5a19b0Gilles Debunne
1378fd5bc01f70c8d9270162d38bb9f675308b5a19b0Gilles Debunne    /* Estimate the frame rate.   08/23/2000 */
1379fd5bc01f70c8d9270162d38bb9f675308b5a19b0Gilles Debunne    video->duration = video->prevTimestamp[idx];
1380fd5bc01f70c8d9270162d38bb9f675308b5a19b0Gilles Debunne    video->duration -= video->prevTimestamp[(++idx)%BITRATE_AVERAGE_WINDOW];
1381157aafcbee0eabda798a3be406ccc4200ee86756Gilles Debunne    if (video->duration > 0)
1382955beb2b96a78cf6ee990d0f20bcaf2d22ce608bSangkyu Lee    { /* Only update framerate when the timestamp is right */
1383955beb2b96a78cf6ee990d0f20bcaf2d22ce608bSangkyu Lee        video->frameRate = (int)(FRAMERATE_SCALE) / video->duration;
138452036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
138552036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
1386955beb2b96a78cf6ee990d0f20bcaf2d22ce608bSangkyu Lee    /* We should always clear up bitstream buffer.   10/10/2000 */
138752036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    bytes_consumed = (getPointer(currVol->bitstream) + 7) >> 3; /*  11/4/03 */
138852036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy
1389955beb2b96a78cf6ee990d0f20bcaf2d22ce608bSangkyu Lee    if (bytes_consumed > currVol->bitstream->data_end_pos)
1390955beb2b96a78cf6ee990d0f20bcaf2d22ce608bSangkyu Lee    {
139152036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy        bytes_consumed = currVol->bitstream->data_end_pos;
139252036b19a5f82bc4d75cfcbff99c65df8d25a99bRomain Guy    }
1393955beb2b96a78cf6ee990d0f20bcaf2d22ce608bSangkyu Lee
13948de65a8e05285df52a1e6f0c1d5616dd233298a7John Reck    if (bytes_consumed < buffer_size[target_layer])
1395955beb2b96a78cf6ee990d0f20bcaf2d22ce608bSangkyu Lee    {
1396dd671599bed9d3ca28e2c744e8c224e1e15bc914Chet Haase        /* If we only consume part of the bits in the buffer, take those */
1397955beb2b96a78cf6ee990d0f20bcaf2d22ce608bSangkyu Lee        /*  out.     04/24/2001 */
1398d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        /*      oscl_memcpy(buffer[target_layer], buffer[target_layer]+bytes_consumed,
1399955beb2b96a78cf6ee990d0f20bcaf2d22ce608bSangkyu Lee                    (buffer_size[target_layer]-=bytes_consumed)); */
1400955beb2b96a78cf6ee990d0f20bcaf2d22ce608bSangkyu Lee        buffer_size[target_layer] -= bytes_consumed;
1401955beb2b96a78cf6ee990d0f20bcaf2d22ce608bSangkyu Lee    }
1402955beb2b96a78cf6ee990d0f20bcaf2d22ce608bSangkyu Lee    else
1403d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
1404d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        buffer_size[target_layer] = 0;
1405a7090e0cfd7c719a6d4c03aae34f5db98754cbddChris Craik    }
1406157aafcbee0eabda798a3be406ccc4200ee86756Gilles Debunne    switch (status)
1407fd5bc01f70c8d9270162d38bb9f675308b5a19b0Gilles Debunne    {
1408157aafcbee0eabda798a3be406ccc4200ee86756Gilles Debunne        case PV_FAIL :
1409d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            return PV_FALSE;        /* this will take care of concealment if we lose whole frame  */
1410955beb2b96a78cf6ee990d0f20bcaf2d22ce608bSangkyu Lee
1411955beb2b96a78cf6ee990d0f20bcaf2d22ce608bSangkyu Lee        case PV_END_OF_VOP :
1412d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            /* we may want to differenciate PV_END_OF_VOP and PV_SUCCESS */
1413d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            /*    in the future.     05/10/2000                      */
1414d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1415d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        case PV_SUCCESS :
1416d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            /* Nohting is wrong :). */
1417d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1418d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1419d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->concealFrame = video->currVop->yChan;       /*  07/07/2001 */
1420d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1421d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            video->vop_coding_type = video->currVop->predictionType; /*  07/09/01 */
1422d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1423d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            decCtrl->outputFrame = video->currVop->yChan;
1424d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1425d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            /* Swap VOP pointers.  No enhc. frame oscl_memcpy() anymore!   04/24/2001 */
1426d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            if (target_layer)
1427d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            {
1428d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                tempVopPtr = video->prevEnhcVop;
1429d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                video->prevEnhcVop = video->currVop;
1430d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                video->currVop = tempVopPtr;
1431d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            }
1432d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            else
1433d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            {
1434776abc24cdd18610232a50b997cce3cffa74609bAdam Lesinski                tempVopPtr = video->prevVop;
1435d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                video->prevVop = video->currVop;
1436d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne                video->currVop = tempVopPtr;
1437d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            }
1438d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            break;
1439d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1440d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        default :
1441d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            /* This will never happen */
1442d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            break;
1443d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
1444d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1445d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    return PV_TRUE;
1446d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne}
1447ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunne
1448ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunne#ifdef PV_MEMORY_POOL
1449ebc86af1dc186c77f723c8970951e8ff00b4866bGilles DebunneOSCL_EXPORT_REF void PVSetReferenceYUV(VideoDecControls *decCtrl, uint8 *YUV)
1450ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunne{
1451ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunne    VideoDecData *video = (VideoDecData *)decCtrl->videoDecoderData;
1452ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunne    video->prevVop->yChan = (PIXEL *)YUV;
1453ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunne    video->prevVop->uChan = (PIXEL *)YUV + video->size;
1454ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunne    video->prevVop->vChan = (PIXEL *)video->prevVop->uChan + (decCtrl->size >> 2);
1455ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunne    oscl_memset(video->prevVop->yChan, 16, sizeof(uint8)*decCtrl->size);     /*  10/31/01 */
1456ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunne    oscl_memset(video->prevVop->uChan, 128, sizeof(uint8)*decCtrl->size / 2);
1457ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunne    video->concealFrame = video->prevVop->yChan;               /*  07/07/2001 */
1458ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunne    decCtrl->outputFrame = video->prevVop->yChan;              /*  06/19/2002 */
1459ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunne}
1460ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunne#endif
1461ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunne
1462ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunne
1463ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunne/* ======================================================================== */
1464ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunne/*  Function : VideoDecoderErrorDetected()                                  */
1465ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunne/*  Date     : 06/20/2000                                                   */
1466ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunne/*  Purpose  :                                                              */
1467ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunne/*  In/out   :                                                              */
1468ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunne/*  Return   : This function will be called everytime an error int the      */
1469ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunne/*              bitstream is detected.                                      */
1470ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunne/*  Note     :                                                              */
14717558aa708160c287552f4e1e33c33d8b191e9f0eJohn Reck/*  Modified :                                                              */
1472ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunne/* ======================================================================== */
1473ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunneuint VideoDecoderErrorDetected(VideoDecData *)
1474ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunne{
1475ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunne    /* This is only used for trapping bitstream error for debuging */
1476ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunne    return 0;
1477ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunne}
1478ebc86af1dc186c77f723c8970951e8ff00b4866bGilles Debunne
1479d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#ifdef ENABLE_LOG
1480d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#include <stdio.h>
1481d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#include <stdarg.h>
14827558aa708160c287552f4e1e33c33d8b191e9f0eJohn Reck/* ======================================================================== */
1483d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Function : m4vdec_dprintf()                                             */
1484d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Date     : 08/15/2000                                                   */
1485d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Purpose  : This is a function that logs messages in the mpeg4 video     */
1486d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*             decoder.  We can call the standard PacketVideo PVMessage     */
1487d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*             from inside this function if necessary.                      */
1488d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  In/out   :                                                              */
1489d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Return   :                                                              */
1490d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Note     : To turn on the logging, LOG_MP4DEC_MESSAGE must be defined   */
1491d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*              when compiling this file (only this file).                  */
1492d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Modified :                                                              */
1493d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
14940ed59fae6fc85c2c4a223d3be88b79cf797908abFabrice Di Megliovoid m4vdec_dprintf(char *format, ...)
1495d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne{
1496d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    FILE *log_fp;
1497d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    va_list args;
1498d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    va_start(args, format);
1499d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1500d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    /* open the log file */
1501d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    log_fp = fopen("\\mp4dec_log.txt", "a+");
1502d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (log_fp == NULL) return;
1503d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    /* output the message */
1504d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    vfprintf(log_fp, format, args);
1505d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    fclose(log_fp);
1506d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1507d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    va_end(args);
1508afe8e9b6d033cb854afa3024d8198a32896a804aRaph Levien}
1509afe8e9b6d033cb854afa3024d8198a32896a804aRaph Levien#endif
1510afe8e9b6d033cb854afa3024d8198a32896a804aRaph Levien
1511d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1512d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
1513afe8e9b6d033cb854afa3024d8198a32896a804aRaph Levien/*  Function : IsIntraFrame()                                               */
1514afe8e9b6d033cb854afa3024d8198a32896a804aRaph Levien/*  Date     : 05/29/2000                                                   */
1515d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Purpose  :                                                              */
1516d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  In/out   :                                                              */
1517d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Return   : The most recently decoded frame is an Intra frame.           */
1518afe8e9b6d033cb854afa3024d8198a32896a804aRaph Levien/*  Note     :                                                              */
1519afe8e9b6d033cb854afa3024d8198a32896a804aRaph Levien/*  Modified :                                                              */
15200ed59fae6fc85c2c4a223d3be88b79cf797908abFabrice Di Meglio/* ======================================================================== */
15210ed59fae6fc85c2c4a223d3be88b79cf797908abFabrice Di MeglioBool IsIntraFrame(VideoDecControls *decCtrl)
15220ed59fae6fc85c2c4a223d3be88b79cf797908abFabrice Di Meglio{
1523afe8e9b6d033cb854afa3024d8198a32896a804aRaph Levien    VideoDecData *video = (VideoDecData *)decCtrl->videoDecoderData;
15240ed59fae6fc85c2c4a223d3be88b79cf797908abFabrice Di Meglio    return (video->vop_coding_type == I_VOP);
1525afe8e9b6d033cb854afa3024d8198a32896a804aRaph Levien}
15260ed59fae6fc85c2c4a223d3be88b79cf797908abFabrice Di Meglio
15270ed59fae6fc85c2c4a223d3be88b79cf797908abFabrice Di Meglio/* ======================================================================== */
15280ed59fae6fc85c2c4a223d3be88b79cf797908abFabrice Di Meglio/*  Function : PVDecPostProcess()                                           */
1529d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Date     : 01/09/2002                                                   */
1530d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Purpose  : PostProcess one video frame and return a YUV-12 image.       */
1531d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  In/out   :                                                              */
1532d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Return   :                                                              */
1533d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Note     :                                                              */
1534d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Modified :                                                              */
1535d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
1536d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunnevoid PVDecPostProcess(VideoDecControls *decCtrl, uint8 *outputYUV)
1537d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne{
1538d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    uint8 *outputBuffer;
1539d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#ifdef PV_POSTPROC_ON
1540d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    VideoDecData *video = (VideoDecData *) decCtrl->videoDecoderData;
1541d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    int32 tmpvar;
1542d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (outputYUV)
1543d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
1544d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        outputBuffer = outputYUV;
1545d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
1546d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    else
1547d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
1548d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (video->postFilterType)
1549d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
1550d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            outputBuffer = video->currVop->yChan;
1551d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        }
1552d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        else
1553d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
1554d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            outputBuffer = decCtrl->outputFrame;
1555d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        }
1556d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
1557d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1558d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (video->postFilterType)
1559d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
1560d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        /* Post-processing,  */
1561d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        PostFilter(video, video->postFilterType, outputBuffer);
15623473b2b1f495f0f5a31e7ed687557c423c63abffGilles Debunne    }
1563d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    else
1564d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    {
1565d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        if (outputYUV)
1566d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        {
1567d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            /* Copy decoded frame to the output buffer. */
1568d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            tmpvar = (int32)video->width * video->height;
1569d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            oscl_memcpy(outputBuffer, decCtrl->outputFrame, tmpvar*3 / 2);           /*  3/3/01 */
1570d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        }
1571d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    }
1572d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#else
1573d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    outputBuffer = decCtrl->outputFrame;
1574d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    outputYUV;
1575d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne#endif
1576d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    decCtrl->outputFrame = outputBuffer;
1577d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    return;
1578d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne}
1579d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1580d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1581d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
1582d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Function : PVDecSetReference(VideoDecControls *decCtrl, uint8 *refYUV,  */
1583d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*                              int32 timestamp)                            */
1584d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Date     : 07/22/2003                                                   */
1585d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Purpose  : Get YUV reference frame from external source.                */
1586d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  In/out   : YUV 4-2-0 frame containing new reference frame in the same   */
1587d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*   : dimension as original, i.e., doesn't have to be multiple of 16 !!!.  */
1588d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Return   :                                                              */
1589d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Note     :                                                              */
1590d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Modified :                                                              */
1591d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
1592d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles DebunneBool PVDecSetReference(VideoDecControls *decCtrl, uint8 *refYUV, uint32 timestamp)
1593d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne{
1594d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    VideoDecData *video = (VideoDecData *) decCtrl->videoDecoderData;
1595d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    Vop *prevVop = video->prevVop;
1596d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    int width = video->width;
1597d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    uint8 *dstPtr, *orgPtr, *dstPtr2, *orgPtr2;
1598d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    int32 size = (int32)width * video->height;
1599d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1600d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1601d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    /* set new parameters */
1602d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    prevVop->timeStamp = timestamp;
1603d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    prevVop->predictionType = I_VOP;
1604d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1605d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    dstPtr = prevVop->yChan;
1606d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    orgPtr = refYUV;
1607d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    oscl_memcpy(dstPtr, orgPtr, size);
1608d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    dstPtr = prevVop->uChan;
1609d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    dstPtr2 = prevVop->vChan;
1610d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    orgPtr = refYUV + size;
1611d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    orgPtr2 = orgPtr + (size >> 2);
1612d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    oscl_memcpy(dstPtr, orgPtr, (size >> 2));
1613d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    oscl_memcpy(dstPtr2, orgPtr2, (size >> 2));
1614d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1615d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->concealFrame = video->prevVop->yChan;
1616d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->vop_coding_type = I_VOP;
1617d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    decCtrl->outputFrame = video->prevVop->yChan;
1618d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1619d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    return PV_TRUE;
1620d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne}
1621d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1622d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
1623d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Function : PVDecSetEnhReference(VideoDecControls *decCtrl, uint8 *refYUV,   */
1624d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*                              int32 timestamp)                            */
1625d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Date     : 07/23/2003                                                   */
1626d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Purpose  : Get YUV enhance reference frame from external source.        */
1627d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  In/out   : YUV 4-2-0 frame containing new reference frame in the same   */
1628d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*   : dimension as original, i.e., doesn't have to be multiple of 16 !!!.  */
1629d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Return   :                                                              */
1630d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Note     :                                                              */
1631d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Modified :                                                              */
1632d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
1633d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles DebunneBool PVDecSetEnhReference(VideoDecControls *decCtrl, uint8 *refYUV, uint32 timestamp)
1634d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne{
1635d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    VideoDecData *video = (VideoDecData *) decCtrl->videoDecoderData;
1636d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    Vop *prevEnhcVop = video->prevEnhcVop;
1637d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    uint8 *dstPtr, *orgPtr, *dstPtr2, *orgPtr2;
1638d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    int32 size = (int32) video->width * video->height;
1639d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1640d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (video->numberOfLayers <= 1)
1641d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne        return PV_FALSE;
1642d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1643d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1644d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    /* set new parameters */
1645d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    prevEnhcVop->timeStamp = timestamp;
1646d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    prevEnhcVop->predictionType = I_VOP;
1647d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1648d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    dstPtr = prevEnhcVop->yChan;
1649d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    orgPtr = refYUV;
1650d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    oscl_memcpy(dstPtr, orgPtr, size);
1651d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    dstPtr = prevEnhcVop->uChan;
1652d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    dstPtr2 = prevEnhcVop->vChan;
1653d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    orgPtr = refYUV + size;
1654d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    orgPtr2 = orgPtr + (size >> 2);
1655d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    oscl_memcpy(dstPtr, orgPtr, (size >> 2));
1656d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    oscl_memcpy(dstPtr2, orgPtr2, (size >> 2));
1657d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->concealFrame = video->prevEnhcVop->yChan;
1658d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    video->vop_coding_type = I_VOP;
1659d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    decCtrl->outputFrame = video->prevEnhcVop->yChan;
1660d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1661d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    return PV_TRUE;
1662d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne}
1663d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1664d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1665d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
1666d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Function : PVGetVolInfo()                                               */
1667d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Date     : 08/06/2003                                                   */
1668d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Purpose  : Get the vol info(only base-layer).                           */
1669d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  In/out   :                                                              */
1670d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Return   :                                                              */
1671d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Note     :                                                              */
1672d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/*  Modified : 06/24/2004                                                   */
1673d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne/* ======================================================================== */
1674d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles DebunneBool PVGetVolInfo(VideoDecControls *decCtrl, VolInfo *pVolInfo)
1675d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne{
1676d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    Vol *currVol;
1677d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1678d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    if (pVolInfo == NULL || decCtrl == NULL || decCtrl->videoDecoderData == NULL ||
1679d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne            ((VideoDecData *)decCtrl->videoDecoderData)->vol[0] == NULL) return PV_FALSE;
1680d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1681d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    currVol = ((VideoDecData *)(decCtrl->videoDecoderData))->vol[0];
1682d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1683d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    // get the VOL info
1684d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    pVolInfo->shortVideoHeader = (int32)((VideoDecData *)(decCtrl->videoDecoderData))->shortVideoHeader;
1685d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    pVolInfo->dataPartitioning = (int32)currVol->dataPartitioning;
1686d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    pVolInfo->errorResDisable  = (int32)currVol->errorResDisable;
1687d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    pVolInfo->useReverseVLC    = (int32)currVol->useReverseVLC;
1688d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    pVolInfo->scalability      = (int32)currVol->scalability;
1689d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    pVolInfo->nbitsTimeIncRes  = (int32)currVol->nbitsTimeIncRes;
1690d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    pVolInfo->profile_level_id = (int32)currVol->profile_level_id;
16918eea3ea5591e59f55cbb4f6b2b7e9363a285ced3Alan Viverette
1692d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne    return PV_TRUE;
1693d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne}
1694d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1695d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1696d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne
1697d88876a72f9ceebd2c93eb9ba1be4bcff971e754Gilles Debunne