13306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ------------------------------------------------------------------
23306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Copyright (C) 1998-2009 PacketVideo
33306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
43306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Licensed under the Apache License, Version 2.0 (the "License");
53306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * you may not use this file except in compliance with the License.
63306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * You may obtain a copy of the License at
73306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
83306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *      http://www.apache.org/licenses/LICENSE-2.0
93306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *
103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Unless required by applicable law or agreed to in writing, software
113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * distributed under the License is distributed on an "AS IS" BASIS,
123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * express or implied.
143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * See the License for the specific language governing permissions
153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * and limitations under the License.
163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * -------------------------------------------------------------------
173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong */
183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "bitstream.h"
193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "mp4dec_lib.h"
203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#define OSCL_DISABLE_WARNING_CONDITIONAL_IS_CONSTANT
233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* to mask the n least significant bits of an integer */
243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongstatic const uint32 msk[33] =
253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    0x00000000, 0x00000001, 0x00000003, 0x00000007,
273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f,
283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff,
293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff,
303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    0x0000ffff, 0x0001ffff, 0x0003ffff, 0x0007ffff,
313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff,
323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    0x00ffffff, 0x01ffffff, 0x03ffffff, 0x07ffffff,
333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff,
343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    0xffffffff
353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong};
363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : BitstreamFillCache()                                         */
403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 08/29/2000                                                   */
413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : Read more bitstream data into buffer & the 24-byte cache.    */
423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*              This function is different from BitstreamFillBuffer in      */
433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*              that the buffer is the frame-based buffer provided by       */
443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*              the application.                                            */
453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   : PV_SUCCESS if successed, PV_FAIL if failed.                  */
473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified : 4/16/01  : removed return of PV_END_OF_BUFFER                */
483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS BitstreamFillCache(BitstreamDecVideo *stream)
503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *bitstreamBuffer = stream->bitstreamBuffer;
523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *v;
533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int num_bits, i;
543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->curr_word |= (stream->next_word >> stream->incnt);   // stream->incnt cannot be 32
563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->next_word <<= (31 - stream->incnt);
573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->next_word <<= 1;
583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    num_bits = stream->incnt_next + stream->incnt;
593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (num_bits >= 32)
603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        stream->incnt_next -= (32 - stream->incnt);
623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        stream->incnt = 32;
633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_SUCCESS;
643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* this check can be removed if there is additional extra 4 bytes at the end of the bitstream */
663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    v = bitstreamBuffer + stream->read_point;
673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (stream->read_point > stream->data_end_pos - 4)
693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (stream->data_end_pos <= stream->read_point)
713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            stream->incnt = num_bits;
733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            stream->incnt_next = 0;
743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            return PV_SUCCESS;
753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        stream->next_word = 0;
783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        for (i = 0; i < stream->data_end_pos - stream->read_point; i++)
803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            stream->next_word |= (v[i] << ((3 - i) << 3));
823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        stream->read_point = stream->data_end_pos;
853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        stream->curr_word |= (stream->next_word >> num_bits); // this is safe
863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        stream->next_word <<= (31 - num_bits);
883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        stream->next_word <<= 1;
893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        num_bits = i << 3;
903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        stream->incnt += stream->incnt_next;
913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        stream->incnt_next = num_bits - (32 - stream->incnt);
923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (stream->incnt_next < 0)
933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            stream->incnt +=  num_bits;
953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            stream->incnt_next = 0;
963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            stream->incnt = 32;
1003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
1013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_SUCCESS;
1023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
1033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->next_word = ((uint32)v[0] << 24) | (v[1] << 16) | (v[2] << 8) | v[3];
1053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->read_point += 4;
1063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->curr_word |= (stream->next_word >> num_bits); // this is safe
1083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->next_word <<= (31 - num_bits);
1093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->next_word <<= 1;
1103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->incnt_next += stream->incnt;
1113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->incnt = 32;
1123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_SUCCESS;
1133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
1143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
1173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : BitstreamReset()                                             */
1183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 08/29/2000                                                   */
1193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : Initialize the bitstream buffer for frame-based decoding.    */
1203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
1213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   :                                                              */
1223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
1233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
1243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid BitstreamReset(BitstreamDecVideo *stream, uint8 *buffer, int32 buffer_size)
1253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
1263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* set up frame-based bitstream buffer */
1273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    oscl_memset(stream, 0, sizeof(BitstreamDecVideo));
1283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->data_end_pos = buffer_size;
1293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->bitstreamBuffer = buffer;
1303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
1313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
1343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : BitstreamOpen()                                              */
1353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : Initialize the bitstream data structure.                     */
1363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
1373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   :                                                              */
1383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
1393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
1403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongint BitstreamOpen(BitstreamDecVideo *stream, int)
1413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
1423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int buffer_size = 0;
1433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* set up linear bitstream buffer */
1443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//  stream->currentBytePos = 0;
1453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->data_end_pos = 0;
1463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->incnt = 0;
1483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->incnt_next = 0;
1493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->bitcnt = 0;
1503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->curr_word = stream->next_word = 0;
1513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->read_point = stream->data_end_pos;
1523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return buffer_size;
1533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
1543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
1573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : BitstreamClose()                                             */
1583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : Cleanup the bitstream data structure.                        */
1593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
1603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   :                                                              */
1613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
1623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
1633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid BitstreamClose(BitstreamDecVideo *)
1643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
1653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return;
1663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
1673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin******
1703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
1713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* -- BitstreamShowBits32HC
1723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* Shows 32 bits
1733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong***********************************************************CommentEnd********/
1743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS BitstreamShowBits32HC(BitstreamDecVideo *stream, uint32 *code)
1763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
1773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status = PV_SUCCESS;
1783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (stream->incnt < 32)
1803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
1813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* frame-based decoding */
1823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamFillCache(stream);
1833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
1843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *code = stream->curr_word;
1853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return status;
1863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
1873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/***********************************************************CommentBegin******
1893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*
1903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* -- BitstreamShowBits32
1913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* Shows upto and including 31 bits
1923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong***********************************************************CommentEnd********/
1933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS BitstreamShowBits32(BitstreamDecVideo *stream, int nbits, uint32 *code)
1943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
1953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status = PV_SUCCESS;
1963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
1973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (stream->incnt < nbits)
1983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
1993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* frame-based decoding */
2003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamFillCache(stream);
2013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *code = stream->curr_word >> (32 - nbits);
2033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return status;
2043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
2053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifndef PV_BS_INLINE
2083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*========================================================================= */
2093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function:   BitstreamShowBits16()                                       */
2103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date:       12/18/2000                                                  */
2113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose:    To see the next "nbits"(nbits<=16) bitstream bits           */
2123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*              without advancing the read pointer                          */
2133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*                                                                          */
2143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* =========================================================================*/
2153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS BitstreamShowBits16(BitstreamDecVideo *stream, int nbits, uint *code)
2163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
2173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status = PV_SUCCESS;
2183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (stream->incnt < nbits)
2213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
2223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* frame-based decoding */
2233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamFillCache(stream);
2243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *code = stream->curr_word >> (32 - nbits);
2273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return status;
2283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
2293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*========================================================================= */
2323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function:   BitstreamShow15Bits()                                       */
2333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date:       01/23/2001                                                  */
2343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose:    To see the next 15 bitstream bits                           */
2353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*              without advancing the read pointer                          */
2363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*                                                                          */
2373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* =========================================================================*/
2383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS BitstreamShow15Bits(BitstreamDecVideo *stream, uint *code)
2393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
2403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status = PV_SUCCESS;
2413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (stream->incnt < 15)
2433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
2443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* frame-based decoding */
2453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamFillCache(stream);
2463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *code = stream->curr_word >> 17;
2483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return status;
2493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
2503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*========================================================================= */
2513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function: BitstreamShow13Bits                                           */
2523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date:       050923                                              */
2533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose:    Faciliate and speed up showing 13 bit from bitstream        */
2543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*              used in VlcTCOEFF decoding                                  */
2553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified:                            */
2563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* =========================================================================*/
2573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS BitstreamShow13Bits(BitstreamDecVideo *stream, uint *code)
2583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
2593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status = PV_SUCCESS;
2603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (stream->incnt < 13)
2623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
2633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* frame-based decoding */
2643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamFillCache(stream);
2653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *code = stream->curr_word >> 19;
2673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return status;
2683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
2693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Donguint BitstreamReadBits16_INLINE(BitstreamDecVideo *stream, int nbits)
2713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
2723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint code;
2733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status;
2743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (stream->incnt < nbits)
2763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
2773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* frame-based decoding */
2783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamFillCache(stream);
2793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    code = stream->curr_word >> (32 - nbits);
2813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_BitstreamFlushBits(stream, nbits);
2823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return code;
2833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
2843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Donguint BitstreamRead1Bits_INLINE(BitstreamDecVideo *stream)
2873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
2883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status = PV_SUCCESS;
2893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint    code;
2903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
2923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (stream->incnt < 1)
2933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
2943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* frame-based decoding */
2953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamFillCache(stream);
2963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
2973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    code = stream->curr_word >> 31;
2983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_BitstreamFlushBits(stream, 1);
2993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return code;
3013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
3023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
3043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
3063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : BitstreamReadBits16()                                        */
3073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : Read bits (nbits <=16) from bitstream buffer.                */
3083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
3093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   :                                                              */
3103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
3113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Donguint BitstreamReadBits16(BitstreamDecVideo *stream, int nbits)
3123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
3133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint code;
3143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (stream->incnt < nbits)
3163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* frame-based decoding */
3183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        BitstreamFillCache(stream);
3193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    code = stream->curr_word >> (32 - nbits);
3213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_BitstreamFlushBits(stream, nbits);
3223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return code;
3233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
3243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
3263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : BitstreamRead1Bits()                                         */
3273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 10/23/2000                                                   */
3283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : Faciliate and speed up reading 1 bit from bitstream.         */
3293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
3303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   :                                                              */
3313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
3323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Donguint BitstreamRead1Bits(BitstreamDecVideo *stream)
3343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
3353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint    code;
3363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (stream->incnt < 1)
3383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* frame-based decoding */
3403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        BitstreamFillCache(stream);
3413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    code = stream->curr_word >> 31;
3433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_BitstreamFlushBits(stream, 1);
3443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return code;
3463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
3473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
3493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : PV_BitstreamFlushBitsCheck()                                 */
3503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : Flush nbits bits from bitstream buffer. Check for cache      */
3513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
3523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   :                                                              */
3533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
3543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
3553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS PV_BitstreamFlushBitsCheck(BitstreamDecVideo *stream, int nbits)
3563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
3573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status = PV_SUCCESS;
3583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->bitcnt += nbits;
3603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->incnt -= nbits;
3613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (stream->incnt < 0)
3623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* frame-based decoding */
3643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamFillCache(stream);
3653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (stream->incnt < 0)
3673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
3683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            stream->bitcnt += stream->incnt;
3693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            stream->incnt = 0;
3703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
3713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->curr_word <<= nbits;
3733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return status;
3743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
3753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
3773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : BitstreamReadBits32()                                        */
3783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : Read bits from bitstream buffer.                             */
3793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
3803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   :                                                              */
3813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
3823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Donguint32 BitstreamReadBits32(BitstreamDecVideo *stream, int nbits)
3833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
3843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint32 code;
3853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (stream->incnt < nbits)
3873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
3883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* frame-based decoding */
3893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        BitstreamFillCache(stream);
3903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
3913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    code = stream->curr_word >> (32 - nbits);
3923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_BitstreamFlushBits(stream, nbits);
3933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return code;
3943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
3953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
3963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Donguint32 BitstreamReadBits32HC(BitstreamDecVideo *stream)
3973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
3983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint32 code;
3993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamShowBits32HC(stream, &code);
4013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->bitcnt += 32;
4023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->incnt = 0;
4033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->curr_word = 0;
4043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return code;
4053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
4063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
4083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : BitstreamCheckEndBuffer()                                    */
4093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 03/30/2001                                                   */
4103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : Check to see if we are at the end of buffer                  */
4113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
4123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   :                                                              */
4133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
4143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
4153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS BitstreamCheckEndBuffer(BitstreamDecVideo *stream)
4163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
4173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (stream->read_point >= stream->data_end_pos && stream->incnt <= 0) return PV_END_OF_VOP;
4183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_SUCCESS;
4193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
4203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS PV_BitstreamShowBitsByteAlign(BitstreamDecVideo *stream, int nbits, uint32 *code)
4233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
4243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status = PV_SUCCESS;
4253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int n_stuffed;
4273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    n_stuffed = 8 - (stream->bitcnt & 0x7); /*  07/05/01 */
4293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (stream->incnt < (nbits + n_stuffed))
4313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
4323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* frame-based decoding */
4333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamFillCache(stream);
4343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
4353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *code = (stream->curr_word << n_stuffed) >> (32 - nbits);
4373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return status;
4383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
4393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT
4413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS PV_BitstreamShowBitsByteAlignNoForceStuffing(BitstreamDecVideo *stream, int nbits, uint32 *code)
4423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
4433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status = PV_SUCCESS;
4443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int n_stuffed;
4463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    n_stuffed = (8 - (stream->bitcnt & 0x7)) & 7;
4483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (stream->incnt < (nbits + n_stuffed))
4503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
4513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* frame-based decoding */
4523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamFillCache(stream);
4533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
4543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    *code = (stream->curr_word << n_stuffed) >> (32 - nbits);
4563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return status;
4573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
4583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
4593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS PV_BitstreamByteAlign(BitstreamDecVideo *stream)
4613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
4623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status = PV_SUCCESS;
4633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int n_stuffed;
4643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    n_stuffed = 8 - (stream->bitcnt & 0x7); /*  07/05/01 */
4663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    /* We have to make sure we have enough bits in the cache.   08/15/2000 */
4683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (stream->incnt < n_stuffed)
4693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
4703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        /* frame-based decoding */
4713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamFillCache(stream);
4723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
4733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->bitcnt += n_stuffed;
4763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->incnt -= n_stuffed;
4773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->curr_word <<= n_stuffed;
4783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (stream->incnt < 0)
4793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
4803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        stream->bitcnt += stream->incnt;
4813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        stream->incnt = 0;
4823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
4833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return status;
4843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
4853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS BitstreamByteAlignNoForceStuffing(BitstreamDecVideo *stream)
4883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
4893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint n_stuffed;
4903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    n_stuffed = (8 - (stream->bitcnt & 0x7)) & 0x7; /*  07/05/01 */
4923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->bitcnt += n_stuffed;
4943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->incnt -= n_stuffed;
4953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
4963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (stream->incnt < 0)
4973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
4983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        stream->bitcnt += stream->incnt;
4993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        stream->incnt = 0;
5003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->curr_word <<= n_stuffed;
5023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_SUCCESS;
5033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
5043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ==================================================================== */
5073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : getPointer()                                             */
5083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 10/98                                                    */
5093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : get current position of file pointer                     */
5103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                          */
5113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   :                                                          */
5123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ==================================================================== */
5133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongint32 getPointer(BitstreamDecVideo *stream)
5143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
5153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return stream->bitcnt;
5163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
5173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ====================================================================== /
5223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongFunction : movePointerTo()
5233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongDate     : 05/14/2004
5243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPurpose  : move bitstream pointer to a desired position
5253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongIn/out   :
5263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongReturn   :
5273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongModified :
5283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/ ====================================================================== */
5293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS movePointerTo(BitstreamDecVideo *stream, int32 pos)
5303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
5313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 byte_pos;
5323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (pos < 0)
5333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        pos = 0;
5353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    byte_pos = pos >> 3;
5383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (byte_pos > stream->data_end_pos)
5403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        byte_pos = stream->data_end_pos;
5423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->read_point = byte_pos & -4;
5453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->bitcnt = stream->read_point << 3;;
5463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->curr_word = 0;
5473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->next_word = 0;
5483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->incnt = 0;
5493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->incnt_next = 0;
5503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamFillCache(stream);
5513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_BitstreamFlushBits(stream, ((pos & 0x7) + ((byte_pos & 0x3) << 3)));
5523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_SUCCESS;
5533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
5543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
5573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : validStuffing()                                              */
5583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 04/11/2000                                                   */
5593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : Check whether we have valid stuffing at current position.    */
5603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
5613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   : PV_TRUE if successed, PV_FALSE if failed.                    */
5623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified : 12/18/2000 : changed the pattern type to uint    */
5633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*             04/01/2001 : removed PV_END_OF_BUFFER                        */
5643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
5653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongBool validStuffing(BitstreamDecVideo *stream)
5663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
5673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint n_stuffed;
5683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint pattern;
5693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    n_stuffed = 8 - (stream->bitcnt & 0x7);
5723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamShowBits16(stream, n_stuffed, &pattern);
5733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (pattern == msk[n_stuffed-1]) return PV_TRUE;
5743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_FALSE;
5753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
5763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT
5773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongBool validStuffing_h263(BitstreamDecVideo *stream)
5783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
5793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint n_stuffed;
5803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint pattern;
5813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    n_stuffed = (8 - (stream->bitcnt & 0x7)) & 7;  //  stream->incnt % 8
5843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (n_stuffed == 0)
5853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
5863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        return PV_TRUE;
5873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
5883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamShowBits16(stream, n_stuffed, &pattern);
5893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (pattern == 0) return PV_TRUE;
5903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return PV_FALSE;
5913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
5923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
5933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
5953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
5963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : PVSearchNextH263Frame()                                      */
5973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 04/08/2005                                                   */
5983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : search for 0x00 0x00 0x80                                    */
5993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
6003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   : PV_SUCCESS if succeeded  or PV_END_OF_VOP if failed          */
6013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
6023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
6033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS PVSearchNextH263Frame(BitstreamDecVideo *stream)
6043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
6053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status = PV_SUCCESS;
6063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *ptr;
6073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 i;
6083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 initial_byte_aligned_position = (stream->bitcnt + 7) >> 3;
6093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ptr = stream->bitstreamBuffer + initial_byte_aligned_position;
6113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    i = PVLocateH263FrameHeader(ptr, stream->data_end_pos - initial_byte_aligned_position);
6133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (stream->data_end_pos <= initial_byte_aligned_position + i)
6143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
6153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = PV_END_OF_VOP;
6163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
6173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    (void)movePointerTo(stream, ((i + initial_byte_aligned_position) << 3)); /* ptr + i */
6183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return status;
6193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
6203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
6233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : PVSearchNextM4VFrame()                                       */
6243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 04/08/2005                                                   */
6253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : search for 0x00 0x00 0x01 and move the pointer to the        */
6263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  beginning of the start code                                             */
6273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
6283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   : PV_SUCCESS if succeeded  or PV_END_OF_VOP if failed          */
6293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
6303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
6313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS PVSearchNextM4VFrame(BitstreamDecVideo *stream)
6333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
6343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status = PV_SUCCESS;
6353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *ptr;
6363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 i;
6373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 initial_byte_aligned_position = (stream->bitcnt + 7) >> 3;
6383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ptr = stream->bitstreamBuffer + initial_byte_aligned_position;
6403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    i = PVLocateFrameHeader(ptr, stream->data_end_pos - initial_byte_aligned_position);
6423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (stream->data_end_pos <= initial_byte_aligned_position + i)
6433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
6443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = PV_END_OF_VOP;
6453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
6463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    (void)movePointerTo(stream, ((i + initial_byte_aligned_position) << 3)); /* ptr + i */
6473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return status;
6483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
6493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid PVLocateM4VFrameBoundary(BitstreamDecVideo *stream)
6533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
6543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *ptr;
6553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 byte_pos = (stream->bitcnt >> 3);
6563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->searched_frame_boundary = 1;
6583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ptr = stream->bitstreamBuffer + byte_pos;
6593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->data_end_pos = PVLocateFrameHeader(ptr, (int32)stream->data_end_pos - byte_pos) + byte_pos;
6613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
6623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid PVLocateH263FrameBoundary(BitstreamDecVideo *stream)
6643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
6653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint8 *ptr;
6663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int32 byte_pos = (stream->bitcnt >> 3);
6673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->searched_frame_boundary = 1;
6693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    ptr = stream->bitstreamBuffer + byte_pos;
6703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    stream->data_end_pos = PVLocateH263FrameHeader(ptr, (int32)stream->data_end_pos - byte_pos) + byte_pos;
6723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
6733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
6753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : quickSearchVideoPacketHeader()               */
6763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 05/08/2000                           */
6773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : Quick search for the next video packet header        */
6783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                              */
6793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   : PV_TRUE if successed, PV_FALSE if failed.            */
6803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                              */
6813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
6823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS quickSearchVideoPacketHeader(BitstreamDecVideo *stream, int marker_length)
6833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
6843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status = PV_SUCCESS;
6853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint32 tmpvar;
6863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (stream->searched_frame_boundary == 0)
6893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
6903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PVLocateM4VFrameBoundary(stream);
6913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
6923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
6933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    do
6943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
6953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamCheckEndBuffer(stream);
6963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (status == PV_END_OF_VOP) break;
6973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamShowBitsByteAlign(stream, marker_length, &tmpvar);
6983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (tmpvar == RESYNC_MARKER) break;
6993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamFlushBits(stream, 8);
7003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
7013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (status == PV_SUCCESS);
7023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return status;
7043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
7053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef PV_ANNEX_IJKT_SUPPORT
7063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS quickSearchH263SliceHeader(BitstreamDecVideo *stream)
7073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
7083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status = PV_SUCCESS;
7093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint32 tmpvar;
7103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (stream->searched_frame_boundary == 0)
7133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
7143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PVLocateH263FrameBoundary(stream);
7153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
7163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    do
7183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
7193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamCheckEndBuffer(stream);
7203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (status == PV_END_OF_VOP) break;
7213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamShowBitsByteAlignNoForceStuffing(stream, 17, &tmpvar);
7223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (tmpvar == RESYNC_MARKER) break;
7233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamFlushBits(stream, 8);
7243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
7253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (status == PV_SUCCESS);
7263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    return status;
7283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
7293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif
7303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
7313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*          The following functions are for Error Concealment.              */
7323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
7333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/****************************************************/
7353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//  01/22/99 Quick search of Resync Marker
7363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong// (actually the first part of it, i.e. 16 0's and a 1.
7373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* We are not using the fastest algorithm possible. What this function does is
7393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongto locate 11 consecutive 0's and then check if the 5 bits before them and
7403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongthe 1 bit after them are all 1's.
7413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*/
7423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//  Table used for quick search of markers. Gives the last `1' in
7443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong// 4 bits. The MSB is bit #1, the LSB is bit #4.
7453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongconst int lastOne[] =
7463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
7473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    0,  4,  3,  4,  2,  4,  3,  4,
7483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    1,  4,  3,  4,  2,  4,  3,  4
7493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong};
7503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//  Table used for quick search of markers. Gives the last `0' in
7523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong// 4 bits. The MSB is bit #1, the LSB is bit #4.
7533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*const int lastZero[]=
7543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
7553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    4,  3,  4,  2,  4,  3,  4,  1,
7563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        4,  3,  4,  2,  4,  3,  4,  0
7573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong};
7583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong*/
7593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//  Table used for quick search of markers. Gives the first `0' in
7603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong// 4 bits. The MSB is bit #1, the LSB is bit #4.
7613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongconst int firstZero[] =
7623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
7633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    1, 1, 1, 1, 1, 1, 1, 1,
7643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    2, 2, 2, 2, 3, 3, 4, 0
7653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong};
7663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//  Table used for quick search of markers. Gives the first `1' in
7683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong// 4 bits. The MSB is bit #1, the LSB is bit #4.
7693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongconst int firstOne[] =
7703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
7713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    0, 4, 3, 3, 2, 2, 2, 2,
7723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    1, 1, 1, 1, 1, 1, 1, 1
7733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong};
7743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
7773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : quickSearchMarkers()                                         */
7783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 01/25/99                                                     */
7793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : Quick search for Motion marker                               */
7803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
7813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   : Boolean true of false                                        */
7823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified : 12/18/2000 : 32-bit version                    */
7833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
7843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS quickSearchMotionMarker(BitstreamDecVideo *stream)
7853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong// MM: (11111000000000001)
7863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
7873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status;
7883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint32 tmpvar, tmpvar2;
7893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (stream->searched_frame_boundary == 0)
7913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
7923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PVLocateM4VFrameBoundary(stream);
7933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
7943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
7953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (TRUE)
7963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
7973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamCheckEndBuffer(stream);
7983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (status == PV_END_OF_VOP) return PV_END_OF_VOP;
7993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        BitstreamShowBits32(stream, 17, &tmpvar);
8013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (!tmpvar) return PV_FAIL;
8023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (tmpvar & 1) //  Check if the 17th bit from the curr bit pos is a '1'
8043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
8053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (tmpvar == MOTION_MARKER_COMB)
8063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
8073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                return PV_SUCCESS; //  Found
8083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
8093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
8103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
8113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                tmpvar >>= 1;
8123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                tmpvar &= 0xF;
8133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                PV_BitstreamFlushBits(stream, (int)(12 + firstZero[tmpvar]));
8143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
8153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
8163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
8173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
8183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            //  01/25/99 Get the first 16 bits
8193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tmpvar >>= 1;
8203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tmpvar2 = tmpvar & 0xF;
8213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            //  01/26/99 Check bits #13 ~ #16
8233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (tmpvar2)
8243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
8253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                PV_BitstreamFlushBits(stream, (int)(7 + lastOne[tmpvar2]));
8263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
8273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
8283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
8293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                tmpvar >>= 4;
8303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                tmpvar2 = tmpvar & 0xF;
8313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                //  01/26/99 Check bits #9 ~ #12
8333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (tmpvar2)
8343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
8353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    PV_BitstreamFlushBits(stream, (int)(3 + lastOne[tmpvar2]));
8363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
8373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else
8383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
8393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    tmpvar >>= 4;
8403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    tmpvar2 = tmpvar & 0xF;
8413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    //  01/26/99 Check bits #5 ~ #8
8433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    // We don't need to check further
8443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    // for the first 5 bits should be all 1's
8453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (lastOne[tmpvar2] < 2)
8463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
8473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        /* we already have too many consecutive 0's. */
8483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        /* Go directly pass the last of the 17 bits. */
8493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        PV_BitstreamFlushBits(stream, 17);
8503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
8513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    else
8523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
8533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        PV_BitstreamFlushBits(stream, (int)(lastOne[tmpvar2] - 1));
8543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
8553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
8563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
8573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
8583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
8603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
8613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
8633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : quickSearchDCM()                                             */
8643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 01/22/99                                                     */
8653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : Quick search for DC Marker                                   */
8663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*              We are not using the fastest algorithm possible.  What this */
8673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*              function does is to locate 11 consecutive 0's and then      */
8683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*              check if the 7 bits before them and the 1 bit after them    */
8693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*              are correct.  (actually the first part of it, i.e. 16 0's   */
8703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*              and a 1.                                                    */
8713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
8723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   : Boolean true of false                                        */
8733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified : 12/18/2000 : 32-bit version                    */
8743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
8753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS quickSearchDCM(BitstreamDecVideo *stream)
8763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong// DCM: (110 1011 0000 0000 0001)
8773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
8783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status;
8793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    uint32 tmpvar, tmpvar2;
8803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (stream->searched_frame_boundary == 0)
8823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
8833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PVLocateM4VFrameBoundary(stream);
8843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
8853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (TRUE)
8873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
8883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamCheckEndBuffer(stream);
8893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (status == PV_END_OF_VOP) return PV_END_OF_VOP;
8903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        BitstreamShowBits32(stream, 19, &tmpvar);
8913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
8923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (tmpvar & 1) //  Check if the 17th bit from the curr bit pos is a '1'
8933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
8943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (tmpvar == DC_MARKER)
8953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
8963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                return PV_SUCCESS; //  Found
8973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
8983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
8993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
9003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                //  01/25/99 We treat the last of the 19 bits as its 7th bit (which is
9013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                // also a `1'
9023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                PV_BitstreamFlushBits(stream, 12);
9033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
9043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
9053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        else
9063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
9073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tmpvar >>= 1;
9083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            tmpvar2 = tmpvar & 0xF;
9093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (tmpvar2)
9113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
9123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                PV_BitstreamFlushBits(stream, (int)(7 + lastOne[tmpvar2]));
9133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
9143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            else
9153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
9163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                tmpvar >>= 4;
9173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                tmpvar2 = tmpvar & 0xF;
9183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (tmpvar2)
9193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
9203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    PV_BitstreamFlushBits(stream, (int)(3 + lastOne[tmpvar2]));
9213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
9223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else
9233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
9243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    tmpvar >>= 4;
9253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    tmpvar2 = tmpvar & 0xF;
9263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    if (lastOne[tmpvar2] < 2)
9273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
9283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        /* we already have too many consecutive 0's. */
9293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        /* Go directly pass the last of the 17 bits. */
9303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        PV_BitstreamFlushBits(stream, 19);
9313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
9323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    else
9333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    {
9343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                        PV_BitstreamFlushBits(stream, (int)(lastOne[tmpvar2] - 1));
9353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    }
9363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
9373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
9383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
9393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
9403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
9413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
9433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Function : quickSearchGOBHeader()   0000 0000 0000 0000 1               */
9443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Date     : 07/06/01                                                     */
9453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Purpose  : Quick search of GOBHeader (not byte aligned)                 */
9463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  In/out   :                                                              */
9473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Return   : Integer value indicates type of marker found                 */
9483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*  Modified :                                                              */
9493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ======================================================================== */
9503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames DongPV_STATUS quickSearchGOBHeader(BitstreamDecVideo *stream)
9513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{
9523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    PV_STATUS status;
9533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    int byte0, byte1, byte2, shift, tmpvar;
9543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    BitstreamByteAlignNoForceStuffing(stream);
9563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    if (stream->searched_frame_boundary == 0)
9583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
9593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PVLocateH263FrameBoundary(stream);
9603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
9613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    while (TRUE)
9633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    {
9643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        status = BitstreamCheckEndBuffer(stream);
9653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (status == PV_END_OF_VOP) return PV_END_OF_VOP;
9663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (stream->incnt < 24)
9683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
9693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            status = BitstreamFillCache(stream);
9703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
9713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        byte1 = (stream->curr_word << 8) >> 24;
9743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        if (byte1 == 0)
9753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        {
9763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            byte2 = (stream->curr_word << 16) >> 24;
9773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            if (byte2)
9783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            {
9793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                tmpvar = byte2 >> 4;
9803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if (tmpvar)
9823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
9833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    shift = 9 - firstOne[tmpvar];
9843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
9853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                else
9863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
9873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    shift = 5 - firstOne[byte2];
9883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
9893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                byte0 = stream->curr_word >> 24;
9903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                if ((byte0 & msk[shift]) == 0)
9913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                {
9923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    PV_BitstreamFlushBits(stream, 8 - shift);
9933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                    return PV_SUCCESS;
9943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                }
9953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong                PV_BitstreamFlushBits(stream, 8);    /* third_byte is not zero */
9963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong            }
9973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        }
9983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong
9993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong        PV_BitstreamFlushBits(stream, 8);
10003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong    }
10013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong}
1002