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