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