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