102f5b5447de349216a40086ca6061efefb5a3025James Dong/* ------------------------------------------------------------------ 202f5b5447de349216a40086ca6061efefb5a3025James Dong * Copyright (C) 1998-2009 PacketVideo 302f5b5447de349216a40086ca6061efefb5a3025James Dong * 402f5b5447de349216a40086ca6061efefb5a3025James Dong * Licensed under the Apache License, Version 2.0 (the "License"); 502f5b5447de349216a40086ca6061efefb5a3025James Dong * you may not use this file except in compliance with the License. 602f5b5447de349216a40086ca6061efefb5a3025James Dong * You may obtain a copy of the License at 702f5b5447de349216a40086ca6061efefb5a3025James Dong * 802f5b5447de349216a40086ca6061efefb5a3025James Dong * http://www.apache.org/licenses/LICENSE-2.0 902f5b5447de349216a40086ca6061efefb5a3025James Dong * 1002f5b5447de349216a40086ca6061efefb5a3025James Dong * Unless required by applicable law or agreed to in writing, software 1102f5b5447de349216a40086ca6061efefb5a3025James Dong * distributed under the License is distributed on an "AS IS" BASIS, 1202f5b5447de349216a40086ca6061efefb5a3025James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 1302f5b5447de349216a40086ca6061efefb5a3025James Dong * express or implied. 1402f5b5447de349216a40086ca6061efefb5a3025James Dong * See the License for the specific language governing permissions 1502f5b5447de349216a40086ca6061efefb5a3025James Dong * and limitations under the License. 1602f5b5447de349216a40086ca6061efefb5a3025James Dong * ------------------------------------------------------------------- 1702f5b5447de349216a40086ca6061efefb5a3025James Dong */ 1802f5b5447de349216a40086ca6061efefb5a3025James Dong#include "mp4dec_lib.h" 1902f5b5447de349216a40086ca6061efefb5a3025James Dong#include "vlc_decode.h" 2002f5b5447de349216a40086ca6061efefb5a3025James Dong#include "bitstream.h" 2102f5b5447de349216a40086ca6061efefb5a3025James Dong 2202f5b5447de349216a40086ca6061efefb5a3025James Dong 2302f5b5447de349216a40086ca6061efefb5a3025James Dong/***********************************************************CommentBegin****** 2402f5b5447de349216a40086ca6061efefb5a3025James Dong* 04/13/2000 : initial modification to the new PV-Decoder 2502f5b5447de349216a40086ca6061efefb5a3025James Dong* Lib format. 2602f5b5447de349216a40086ca6061efefb5a3025James Dong* 04/16/2001 : Removed PV_END_OF_BUFFER case, error resilience 2702f5b5447de349216a40086ca6061efefb5a3025James Dong***********************************************************CommentEnd********/ 2802f5b5447de349216a40086ca6061efefb5a3025James DongPV_STATUS PV_ReadVideoPacketHeader(VideoDecData *video, int *next_MB) 2902f5b5447de349216a40086ca6061efefb5a3025James Dong{ 3002f5b5447de349216a40086ca6061efefb5a3025James Dong PV_STATUS status; 3102f5b5447de349216a40086ca6061efefb5a3025James Dong Vol *currVol = video->vol[video->currLayer]; 3202f5b5447de349216a40086ca6061efefb5a3025James Dong Vop *currVop = video->currVop; 3302f5b5447de349216a40086ca6061efefb5a3025James Dong BitstreamDecVideo *stream = video->bitstream; 3402f5b5447de349216a40086ca6061efefb5a3025James Dong int fcode_forward; 3502f5b5447de349216a40086ca6061efefb5a3025James Dong int resync_marker_length; 3602f5b5447de349216a40086ca6061efefb5a3025James Dong int nbits = video->nBitsForMBID; 3702f5b5447de349216a40086ca6061efefb5a3025James Dong uint32 tmpvar32; 3802f5b5447de349216a40086ca6061efefb5a3025James Dong uint tmpvar16; 3902f5b5447de349216a40086ca6061efefb5a3025James Dong int16 quantizer; 4002f5b5447de349216a40086ca6061efefb5a3025James Dong int nTotalMB = video->nTotalMB; 4102f5b5447de349216a40086ca6061efefb5a3025James Dong 4202f5b5447de349216a40086ca6061efefb5a3025James Dong fcode_forward = currVop->fcodeForward; 4302f5b5447de349216a40086ca6061efefb5a3025James Dong resync_marker_length = 17; 4402f5b5447de349216a40086ca6061efefb5a3025James Dong 4502f5b5447de349216a40086ca6061efefb5a3025James Dong if (currVop->predictionType != I_VOP) resync_marker_length = 16 + fcode_forward; 4602f5b5447de349216a40086ca6061efefb5a3025James Dong 4702f5b5447de349216a40086ca6061efefb5a3025James Dong status = PV_BitstreamShowBitsByteAlign(stream, resync_marker_length, &tmpvar32); 4802f5b5447de349216a40086ca6061efefb5a3025James Dong /* if (status != PV_SUCCESS && status != PV_END_OF_BUFFER) return status; */ 4902f5b5447de349216a40086ca6061efefb5a3025James Dong if (tmpvar32 == RESYNC_MARKER) 5002f5b5447de349216a40086ca6061efefb5a3025James Dong { 5102f5b5447de349216a40086ca6061efefb5a3025James Dong// DecNextStartCode(stream); 5202f5b5447de349216a40086ca6061efefb5a3025James Dong PV_BitstreamByteAlign(stream); 5302f5b5447de349216a40086ca6061efefb5a3025James Dong BitstreamReadBits32(stream, resync_marker_length); 5402f5b5447de349216a40086ca6061efefb5a3025James Dong 5502f5b5447de349216a40086ca6061efefb5a3025James Dong *next_MB = (int) BitstreamReadBits16(stream, nbits); 5602f5b5447de349216a40086ca6061efefb5a3025James Dong// if (*next_MB <= video->mbnum) /* needs more investigation */ 5702f5b5447de349216a40086ca6061efefb5a3025James Dong// *next_MB = video->mbnum+1; 5802f5b5447de349216a40086ca6061efefb5a3025James Dong 5902f5b5447de349216a40086ca6061efefb5a3025James Dong if (*next_MB >= nTotalMB) /* fix 04/05/01 */ 6002f5b5447de349216a40086ca6061efefb5a3025James Dong { 6102f5b5447de349216a40086ca6061efefb5a3025James Dong *next_MB = video->mbnum + 1; 6202f5b5447de349216a40086ca6061efefb5a3025James Dong if (*next_MB >= nTotalMB) /* this check is needed */ 6302f5b5447de349216a40086ca6061efefb5a3025James Dong *next_MB = nTotalMB - 1; 6402f5b5447de349216a40086ca6061efefb5a3025James Dong } 6502f5b5447de349216a40086ca6061efefb5a3025James Dong quantizer = (int16) BitstreamReadBits16(stream, currVol->quantPrecision); 6602f5b5447de349216a40086ca6061efefb5a3025James Dong if (quantizer == 0) return PV_FAIL; /* 04/03/01 */ 6702f5b5447de349216a40086ca6061efefb5a3025James Dong 6802f5b5447de349216a40086ca6061efefb5a3025James Dong currVop->quantizer = quantizer; 6902f5b5447de349216a40086ca6061efefb5a3025James Dong 7002f5b5447de349216a40086ca6061efefb5a3025James Dong /* if we have HEC, read some redundant VOP header information */ 7102f5b5447de349216a40086ca6061efefb5a3025James Dong /* this part needs improvement 04/05/01 */ 7202f5b5447de349216a40086ca6061efefb5a3025James Dong if (BitstreamRead1Bits(stream)) 7302f5b5447de349216a40086ca6061efefb5a3025James Dong { 7402f5b5447de349216a40086ca6061efefb5a3025James Dong int time_base = -1; 7502f5b5447de349216a40086ca6061efefb5a3025James Dong 7602f5b5447de349216a40086ca6061efefb5a3025James Dong /* modulo_time_base (? bits) */ 7702f5b5447de349216a40086ca6061efefb5a3025James Dong do 7802f5b5447de349216a40086ca6061efefb5a3025James Dong { 7902f5b5447de349216a40086ca6061efefb5a3025James Dong time_base++; 8002f5b5447de349216a40086ca6061efefb5a3025James Dong tmpvar16 = BitstreamRead1Bits(stream); 8102f5b5447de349216a40086ca6061efefb5a3025James Dong } 8202f5b5447de349216a40086ca6061efefb5a3025James Dong while (tmpvar16 == 1); 8302f5b5447de349216a40086ca6061efefb5a3025James Dong 8402f5b5447de349216a40086ca6061efefb5a3025James Dong /* marker bit */ 8502f5b5447de349216a40086ca6061efefb5a3025James Dong BitstreamRead1Bits(stream); 8602f5b5447de349216a40086ca6061efefb5a3025James Dong 8702f5b5447de349216a40086ca6061efefb5a3025James Dong /* vop_time_increment (1-15 bits) */ 8802f5b5447de349216a40086ca6061efefb5a3025James Dong BitstreamReadBits16(stream, currVol->nbitsTimeIncRes); 8902f5b5447de349216a40086ca6061efefb5a3025James Dong 9002f5b5447de349216a40086ca6061efefb5a3025James Dong /* marker bit */ 9102f5b5447de349216a40086ca6061efefb5a3025James Dong BitstreamRead1Bits(stream); 9202f5b5447de349216a40086ca6061efefb5a3025James Dong 9302f5b5447de349216a40086ca6061efefb5a3025James Dong /* vop_prediction_type (2 bits) */ 9402f5b5447de349216a40086ca6061efefb5a3025James Dong BitstreamReadBits16(stream, 2); 9502f5b5447de349216a40086ca6061efefb5a3025James Dong 9602f5b5447de349216a40086ca6061efefb5a3025James Dong /* Added intra_dc_vlc_thr reading */ 9702f5b5447de349216a40086ca6061efefb5a3025James Dong BitstreamReadBits16(stream, 3); 9802f5b5447de349216a40086ca6061efefb5a3025James Dong 9902f5b5447de349216a40086ca6061efefb5a3025James Dong /* fcodes */ 10002f5b5447de349216a40086ca6061efefb5a3025James Dong if (currVop->predictionType != I_VOP) 10102f5b5447de349216a40086ca6061efefb5a3025James Dong { 10202f5b5447de349216a40086ca6061efefb5a3025James Dong fcode_forward = (int) BitstreamReadBits16(stream, 3); 10302f5b5447de349216a40086ca6061efefb5a3025James Dong 10402f5b5447de349216a40086ca6061efefb5a3025James Dong if (currVop->predictionType == B_VOP) 10502f5b5447de349216a40086ca6061efefb5a3025James Dong { 10602f5b5447de349216a40086ca6061efefb5a3025James Dong BitstreamReadBits16(stream, 3); 10702f5b5447de349216a40086ca6061efefb5a3025James Dong } 10802f5b5447de349216a40086ca6061efefb5a3025James Dong } 10902f5b5447de349216a40086ca6061efefb5a3025James Dong 11002f5b5447de349216a40086ca6061efefb5a3025James Dong } 11102f5b5447de349216a40086ca6061efefb5a3025James Dong } 11202f5b5447de349216a40086ca6061efefb5a3025James Dong else 11302f5b5447de349216a40086ca6061efefb5a3025James Dong { 11402f5b5447de349216a40086ca6061efefb5a3025James Dong PV_BitstreamByteAlign(stream); /* */ 11502f5b5447de349216a40086ca6061efefb5a3025James Dong status = BitstreamCheckEndBuffer(stream); /* return end_of_VOP 03/30/01 */ 11602f5b5447de349216a40086ca6061efefb5a3025James Dong if (status != PV_SUCCESS) 11702f5b5447de349216a40086ca6061efefb5a3025James Dong { 11802f5b5447de349216a40086ca6061efefb5a3025James Dong return status; 11902f5b5447de349216a40086ca6061efefb5a3025James Dong } 12002f5b5447de349216a40086ca6061efefb5a3025James Dong status = BitstreamShowBits32HC(stream, &tmpvar32); /* 07/07/01 */ 12102f5b5447de349216a40086ca6061efefb5a3025James Dong /* -16 = 0xFFFFFFF0*/ 12202f5b5447de349216a40086ca6061efefb5a3025James Dong if ((tmpvar32 & 0xFFFFFFF0) == VISUAL_OBJECT_SEQUENCE_START_CODE) /* start code mask 00 00 01 */ 12302f5b5447de349216a40086ca6061efefb5a3025James Dong 12402f5b5447de349216a40086ca6061efefb5a3025James Dong { 12502f5b5447de349216a40086ca6061efefb5a3025James Dong /* we don't have to check for legl stuffing here. 05/08/2000 */ 12602f5b5447de349216a40086ca6061efefb5a3025James Dong return PV_END_OF_VOP; 12702f5b5447de349216a40086ca6061efefb5a3025James Dong } 12802f5b5447de349216a40086ca6061efefb5a3025James Dong else 12902f5b5447de349216a40086ca6061efefb5a3025James Dong { 13002f5b5447de349216a40086ca6061efefb5a3025James Dong return PV_FAIL; 13102f5b5447de349216a40086ca6061efefb5a3025James Dong } 13202f5b5447de349216a40086ca6061efefb5a3025James Dong } 13302f5b5447de349216a40086ca6061efefb5a3025James Dong 13402f5b5447de349216a40086ca6061efefb5a3025James Dong return PV_SUCCESS; 13502f5b5447de349216a40086ca6061efefb5a3025James Dong} 13602f5b5447de349216a40086ca6061efefb5a3025James Dong 13702f5b5447de349216a40086ca6061efefb5a3025James Dong 13802f5b5447de349216a40086ca6061efefb5a3025James Dong 13902f5b5447de349216a40086ca6061efefb5a3025James Dong/***********************************************************CommentBegin****** 14002f5b5447de349216a40086ca6061efefb5a3025James Dong* 3/10/00 : initial modification to the 14102f5b5447de349216a40086ca6061efefb5a3025James Dong* new PV-Decoder Lib format. 14202f5b5447de349216a40086ca6061efefb5a3025James Dong* 04/17/01 : remove PV_END_OF_BUFFER, error checking 14302f5b5447de349216a40086ca6061efefb5a3025James Dong***********************************************************CommentEnd********/ 14402f5b5447de349216a40086ca6061efefb5a3025James DongPV_STATUS PV_GobHeader(VideoDecData *video) 14502f5b5447de349216a40086ca6061efefb5a3025James Dong{ 14602f5b5447de349216a40086ca6061efefb5a3025James Dong uint32 tmpvar; 14702f5b5447de349216a40086ca6061efefb5a3025James Dong Vop *currVop = video->currVop; 14802f5b5447de349216a40086ca6061efefb5a3025James Dong BitstreamDecVideo *stream = video->bitstream; 14902f5b5447de349216a40086ca6061efefb5a3025James Dong int quantPrecision = 5; 15002f5b5447de349216a40086ca6061efefb5a3025James Dong int16 quantizer; 15102f5b5447de349216a40086ca6061efefb5a3025James Dong 15202f5b5447de349216a40086ca6061efefb5a3025James Dong BitstreamShowBits32(stream, GOB_RESYNC_MARKER_LENGTH, &tmpvar); 15302f5b5447de349216a40086ca6061efefb5a3025James Dong 15402f5b5447de349216a40086ca6061efefb5a3025James Dong if (tmpvar != GOB_RESYNC_MARKER) 15502f5b5447de349216a40086ca6061efefb5a3025James Dong { 15602f5b5447de349216a40086ca6061efefb5a3025James Dong PV_BitstreamShowBitsByteAlign(stream, GOB_RESYNC_MARKER_LENGTH, &tmpvar); 15702f5b5447de349216a40086ca6061efefb5a3025James Dong 15802f5b5447de349216a40086ca6061efefb5a3025James Dong if (tmpvar != GOB_RESYNC_MARKER) 15902f5b5447de349216a40086ca6061efefb5a3025James Dong { 16002f5b5447de349216a40086ca6061efefb5a3025James Dong return PV_FAIL; 16102f5b5447de349216a40086ca6061efefb5a3025James Dong } 16202f5b5447de349216a40086ca6061efefb5a3025James Dong else 16302f5b5447de349216a40086ca6061efefb5a3025James Dong PV_BitstreamByteAlign(stream); /* if bytealigned GOBHEADER search is performed */ 16402f5b5447de349216a40086ca6061efefb5a3025James Dong /* then no more noforcestuffing */ 16502f5b5447de349216a40086ca6061efefb5a3025James Dong } 16602f5b5447de349216a40086ca6061efefb5a3025James Dong 16702f5b5447de349216a40086ca6061efefb5a3025James Dong /* we've got a GOB header info here */ 16802f5b5447de349216a40086ca6061efefb5a3025James Dong BitstreamShowBits32(stream, GOB_RESYNC_MARKER_LENGTH + 5, &tmpvar); 16902f5b5447de349216a40086ca6061efefb5a3025James Dong tmpvar &= 0x1F; 17002f5b5447de349216a40086ca6061efefb5a3025James Dong 17102f5b5447de349216a40086ca6061efefb5a3025James Dong if (tmpvar == 0) 17202f5b5447de349216a40086ca6061efefb5a3025James Dong { 17302f5b5447de349216a40086ca6061efefb5a3025James Dong return PV_END_OF_VOP; 17402f5b5447de349216a40086ca6061efefb5a3025James Dong } 17502f5b5447de349216a40086ca6061efefb5a3025James Dong 17602f5b5447de349216a40086ca6061efefb5a3025James Dong if (tmpvar == 31) 17702f5b5447de349216a40086ca6061efefb5a3025James Dong { 17802f5b5447de349216a40086ca6061efefb5a3025James Dong PV_BitstreamFlushBits(stream, GOB_RESYNC_MARKER_LENGTH + 5); 17902f5b5447de349216a40086ca6061efefb5a3025James Dong BitstreamByteAlignNoForceStuffing(stream); 18002f5b5447de349216a40086ca6061efefb5a3025James Dong return PV_END_OF_VOP; 18102f5b5447de349216a40086ca6061efefb5a3025James Dong } 18202f5b5447de349216a40086ca6061efefb5a3025James Dong 18302f5b5447de349216a40086ca6061efefb5a3025James Dong PV_BitstreamFlushBits(stream, GOB_RESYNC_MARKER_LENGTH + 5); 18402f5b5447de349216a40086ca6061efefb5a3025James Dong currVop->gobNumber = (int) tmpvar; 18502f5b5447de349216a40086ca6061efefb5a3025James Dong if (currVop->gobNumber >= video->nGOBinVop) return PV_FAIL; 18602f5b5447de349216a40086ca6061efefb5a3025James Dong currVop->gobFrameID = (int) BitstreamReadBits16(stream, 2); 18702f5b5447de349216a40086ca6061efefb5a3025James Dong quantizer = (int16) BitstreamReadBits16(stream, quantPrecision); 18802f5b5447de349216a40086ca6061efefb5a3025James Dong if (quantizer == 0) return PV_FAIL; /* 04/03/01 */ 18902f5b5447de349216a40086ca6061efefb5a3025James Dong 19002f5b5447de349216a40086ca6061efefb5a3025James Dong currVop->quantizer = quantizer; 19102f5b5447de349216a40086ca6061efefb5a3025James Dong return PV_SUCCESS; 19202f5b5447de349216a40086ca6061efefb5a3025James Dong} 19302f5b5447de349216a40086ca6061efefb5a3025James Dong#ifdef PV_ANNEX_IJKT_SUPPORT 19402f5b5447de349216a40086ca6061efefb5a3025James DongPV_STATUS PV_H263SliceHeader(VideoDecData *video, int *next_MB) 19502f5b5447de349216a40086ca6061efefb5a3025James Dong{ 19602f5b5447de349216a40086ca6061efefb5a3025James Dong PV_STATUS status; 19702f5b5447de349216a40086ca6061efefb5a3025James Dong uint32 tmpvar; 19802f5b5447de349216a40086ca6061efefb5a3025James Dong Vop *currVop = video->currVop; 19902f5b5447de349216a40086ca6061efefb5a3025James Dong BitstreamDecVideo *stream = video->bitstream; 20002f5b5447de349216a40086ca6061efefb5a3025James Dong int nTotalMB = video->nTotalMB; 20102f5b5447de349216a40086ca6061efefb5a3025James Dong int16 quantizer; 20202f5b5447de349216a40086ca6061efefb5a3025James Dong 20302f5b5447de349216a40086ca6061efefb5a3025James Dong PV_BitstreamShowBitsByteAlignNoForceStuffing(stream, 17, &tmpvar); 20402f5b5447de349216a40086ca6061efefb5a3025James Dong if (tmpvar == RESYNC_MARKER) 20502f5b5447de349216a40086ca6061efefb5a3025James Dong { 20602f5b5447de349216a40086ca6061efefb5a3025James Dong BitstreamByteAlignNoForceStuffing(stream); 20702f5b5447de349216a40086ca6061efefb5a3025James Dong PV_BitstreamFlushBits(stream, 17); 20802f5b5447de349216a40086ca6061efefb5a3025James Dong if (!BitstreamRead1Bits(stream)) 20902f5b5447de349216a40086ca6061efefb5a3025James Dong { 21002f5b5447de349216a40086ca6061efefb5a3025James Dong return PV_FAIL; 21102f5b5447de349216a40086ca6061efefb5a3025James Dong } 21202f5b5447de349216a40086ca6061efefb5a3025James Dong *next_MB = BitstreamReadBits16(stream, video->nBitsForMBID); 21302f5b5447de349216a40086ca6061efefb5a3025James Dong if (*next_MB >= nTotalMB) /* fix 04/05/01 */ 21402f5b5447de349216a40086ca6061efefb5a3025James Dong { 21502f5b5447de349216a40086ca6061efefb5a3025James Dong *next_MB = video->mbnum + 1; 21602f5b5447de349216a40086ca6061efefb5a3025James Dong if (*next_MB >= nTotalMB) /* this check is needed */ 21702f5b5447de349216a40086ca6061efefb5a3025James Dong *next_MB = nTotalMB - 1; 21802f5b5447de349216a40086ca6061efefb5a3025James Dong } 21902f5b5447de349216a40086ca6061efefb5a3025James Dong /* we will not parse sebp2 for large pictures 3GPP */ 22002f5b5447de349216a40086ca6061efefb5a3025James Dong quantizer = (int16) BitstreamReadBits16(stream, 5); 22102f5b5447de349216a40086ca6061efefb5a3025James Dong if (quantizer == 0) return PV_FAIL; 22202f5b5447de349216a40086ca6061efefb5a3025James Dong 22302f5b5447de349216a40086ca6061efefb5a3025James Dong currVop->quantizer = quantizer; 22402f5b5447de349216a40086ca6061efefb5a3025James Dong if (!BitstreamRead1Bits(stream)) 22502f5b5447de349216a40086ca6061efefb5a3025James Dong { 22602f5b5447de349216a40086ca6061efefb5a3025James Dong return PV_FAIL; 22702f5b5447de349216a40086ca6061efefb5a3025James Dong } 22802f5b5447de349216a40086ca6061efefb5a3025James Dong currVop->gobFrameID = (int) BitstreamReadBits16(stream, 2); 22902f5b5447de349216a40086ca6061efefb5a3025James Dong } 23002f5b5447de349216a40086ca6061efefb5a3025James Dong else 23102f5b5447de349216a40086ca6061efefb5a3025James Dong { 23202f5b5447de349216a40086ca6061efefb5a3025James Dong status = BitstreamCheckEndBuffer(stream); /* return end_of_VOP 03/30/01 */ 23302f5b5447de349216a40086ca6061efefb5a3025James Dong if (status != PV_SUCCESS) 23402f5b5447de349216a40086ca6061efefb5a3025James Dong { 23502f5b5447de349216a40086ca6061efefb5a3025James Dong return status; 23602f5b5447de349216a40086ca6061efefb5a3025James Dong } 23702f5b5447de349216a40086ca6061efefb5a3025James Dong PV_BitstreamShowBitsByteAlign(stream, SHORT_VIDEO_START_MARKER_LENGTH, &tmpvar); 23802f5b5447de349216a40086ca6061efefb5a3025James Dong 23902f5b5447de349216a40086ca6061efefb5a3025James Dong if (tmpvar == SHORT_VIDEO_START_MARKER) 24002f5b5447de349216a40086ca6061efefb5a3025James Dong { 24102f5b5447de349216a40086ca6061efefb5a3025James Dong /* we don't have to check for legal stuffing here. 05/08/2000 */ 24202f5b5447de349216a40086ca6061efefb5a3025James Dong return PV_END_OF_VOP; 24302f5b5447de349216a40086ca6061efefb5a3025James Dong } 24402f5b5447de349216a40086ca6061efefb5a3025James Dong else 24502f5b5447de349216a40086ca6061efefb5a3025James Dong { 24602f5b5447de349216a40086ca6061efefb5a3025James Dong return PV_FAIL; 24702f5b5447de349216a40086ca6061efefb5a3025James Dong } 24802f5b5447de349216a40086ca6061efefb5a3025James Dong } 24902f5b5447de349216a40086ca6061efefb5a3025James Dong return PV_SUCCESS; 25002f5b5447de349216a40086ca6061efefb5a3025James Dong} 25102f5b5447de349216a40086ca6061efefb5a3025James Dong#endif 25202f5b5447de349216a40086ca6061efefb5a3025James Dong 253