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