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