mirror of
https://github.com/smallmain/cocos-enhance-kit.git
synced 2025-08-01 11:28:24 +00:00
258 lines
8.1 KiB
C++
258 lines
8.1 KiB
C++
|
/* ------------------------------------------------------------------
|
||
|
* Copyright (C) 1998-2009 PacketVideo
|
||
|
*
|
||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
* you may not use this file except in compliance with the License.
|
||
|
* You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
|
||
|
* express or implied.
|
||
|
* See the License for the specific language governing permissions
|
||
|
* and limitations under the License.
|
||
|
* -------------------------------------------------------------------
|
||
|
*/
|
||
|
/*
|
||
|
------------------------------------------------------------------------------
|
||
|
|
||
|
PacketVideo Corp.
|
||
|
MP3 Decoder Library
|
||
|
|
||
|
Filename: pvmp3_getbits.cpp
|
||
|
|
||
|
|
||
|
Date: 09/21/2007
|
||
|
|
||
|
------------------------------------------------------------------------------
|
||
|
REVISION HISTORY
|
||
|
|
||
|
|
||
|
Description:
|
||
|
|
||
|
------------------------------------------------------------------------------
|
||
|
INPUT AND OUTPUT DEFINITIONS
|
||
|
|
||
|
Inputs:
|
||
|
|
||
|
tmp3Bits *inputStream, structure holding the input stream parameters
|
||
|
int32 neededBits number of bits to read from the bit stream
|
||
|
|
||
|
Outputs:
|
||
|
|
||
|
word parsed from teh bitstream, with size neededBits-bits,
|
||
|
|
||
|
------------------------------------------------------------------------------
|
||
|
FUNCTION DESCRIPTION
|
||
|
|
||
|
|
||
|
------------------------------------------------------------------------------
|
||
|
REQUIREMENTS
|
||
|
|
||
|
|
||
|
------------------------------------------------------------------------------
|
||
|
REFERENCES
|
||
|
[1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
|
||
|
ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
|
||
|
|
||
|
|
||
|
------------------------------------------------------------------------------
|
||
|
PSEUDO-CODE
|
||
|
|
||
|
------------------------------------------------------------------------------
|
||
|
*/
|
||
|
|
||
|
/*----------------------------------------------------------------------------
|
||
|
; INCLUDES
|
||
|
----------------------------------------------------------------------------*/
|
||
|
#include "pvmp3_getbits.h"
|
||
|
|
||
|
/*----------------------------------------------------------------------------
|
||
|
; MACROS
|
||
|
; Define module specific macros here
|
||
|
----------------------------------------------------------------------------*/
|
||
|
|
||
|
|
||
|
/*----------------------------------------------------------------------------
|
||
|
; DEFINES
|
||
|
; Include all pre-processor statements here. Include conditional
|
||
|
; compile variables also.
|
||
|
----------------------------------------------------------------------------*/
|
||
|
|
||
|
|
||
|
/*----------------------------------------------------------------------------
|
||
|
; LOCAL FUNCTION DEFINITIONS
|
||
|
; Function Prototype declaration
|
||
|
----------------------------------------------------------------------------*/
|
||
|
|
||
|
/*----------------------------------------------------------------------------
|
||
|
; LOCAL STORE/BUFFER/POINTER DEFINITIONS
|
||
|
; Variable declaration - defined here and used outside this module
|
||
|
----------------------------------------------------------------------------*/
|
||
|
|
||
|
/*----------------------------------------------------------------------------
|
||
|
; EXTERNAL FUNCTION REFERENCES
|
||
|
; Declare functions defined elsewhere and referenced in this module
|
||
|
----------------------------------------------------------------------------*/
|
||
|
|
||
|
/*----------------------------------------------------------------------------
|
||
|
; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
|
||
|
; Declare variables used in this module but defined elsewhere
|
||
|
----------------------------------------------------------------------------*/
|
||
|
|
||
|
|
||
|
/*----------------------------------------------------------------------------
|
||
|
; FUNCTION CODE
|
||
|
----------------------------------------------------------------------------*/
|
||
|
|
||
|
uint32 getNbits(tmp3Bits *ptBitStream,
|
||
|
int32 neededBits) /* number of bits to read from the bitstream (up to 25) */
|
||
|
{
|
||
|
|
||
|
uint32 offset;
|
||
|
uint32 bitIndex;
|
||
|
uint8 Elem; /* Needs to be same type as pInput->pBuffer */
|
||
|
uint8 Elem1;
|
||
|
uint8 Elem2;
|
||
|
uint8 Elem3;
|
||
|
uint32 returnValue = 0;
|
||
|
|
||
|
if (!neededBits)
|
||
|
{
|
||
|
return (returnValue);
|
||
|
}
|
||
|
|
||
|
offset = (ptBitStream->usedBits) >> INBUF_ARRAY_INDEX_SHIFT;
|
||
|
|
||
|
Elem = *(ptBitStream->pBuffer + module(offset , BUFSIZE));
|
||
|
Elem1 = *(ptBitStream->pBuffer + module(offset + 1, BUFSIZE));
|
||
|
Elem2 = *(ptBitStream->pBuffer + module(offset + 2, BUFSIZE));
|
||
|
Elem3 = *(ptBitStream->pBuffer + module(offset + 3, BUFSIZE));
|
||
|
|
||
|
|
||
|
returnValue = (((uint32)(Elem)) << 24) |
|
||
|
(((uint32)(Elem1)) << 16) |
|
||
|
(((uint32)(Elem2)) << 8) |
|
||
|
((uint32)(Elem3));
|
||
|
|
||
|
/* Remove extra high bits by shifting up */
|
||
|
bitIndex = module(ptBitStream->usedBits, INBUF_BIT_WIDTH);
|
||
|
|
||
|
/* This line is faster than to mask off the high bits. */
|
||
|
returnValue <<= bitIndex;
|
||
|
|
||
|
/* Move the field down. */
|
||
|
returnValue >>= (32 - neededBits);
|
||
|
|
||
|
ptBitStream->usedBits += neededBits;
|
||
|
|
||
|
return (returnValue);
|
||
|
}
|
||
|
|
||
|
/*----------------------------------------------------------------------------
|
||
|
; FUNCTION CODE
|
||
|
----------------------------------------------------------------------------*/
|
||
|
|
||
|
uint16 getUpTo9bits(tmp3Bits *ptBitStream,
|
||
|
int32 neededBits) /* number of bits to read from the bit stream 2 to 9 */
|
||
|
{
|
||
|
|
||
|
uint32 offset;
|
||
|
uint32 bitIndex;
|
||
|
uint8 Elem; /* Needs to be same type as pInput->pBuffer */
|
||
|
uint8 Elem1;
|
||
|
uint16 returnValue;
|
||
|
|
||
|
offset = (ptBitStream->usedBits) >> INBUF_ARRAY_INDEX_SHIFT;
|
||
|
|
||
|
Elem = *(ptBitStream->pBuffer + module(offset , BUFSIZE));
|
||
|
Elem1 = *(ptBitStream->pBuffer + module(offset + 1, BUFSIZE));
|
||
|
|
||
|
|
||
|
returnValue = (((uint16)(Elem)) << 8) |
|
||
|
((uint16)(Elem1));
|
||
|
|
||
|
/* Remove extra high bits by shifting up */
|
||
|
bitIndex = module(ptBitStream->usedBits, INBUF_BIT_WIDTH);
|
||
|
|
||
|
ptBitStream->usedBits += neededBits;
|
||
|
/* This line is faster than to mask off the high bits. */
|
||
|
returnValue = (returnValue << (bitIndex));
|
||
|
|
||
|
/* Move the field down. */
|
||
|
|
||
|
return (uint16)(returnValue >> (16 - neededBits));
|
||
|
|
||
|
}
|
||
|
|
||
|
/*----------------------------------------------------------------------------
|
||
|
; FUNCTION CODE
|
||
|
----------------------------------------------------------------------------*/
|
||
|
|
||
|
uint32 getUpTo17bits(tmp3Bits *ptBitStream,
|
||
|
int32 neededBits) /* number of bits to read from the bit stream 2 to 8 */
|
||
|
{
|
||
|
|
||
|
uint32 offset;
|
||
|
uint32 bitIndex;
|
||
|
uint8 Elem; /* Needs to be same type as pInput->pBuffer */
|
||
|
uint8 Elem1;
|
||
|
uint8 Elem2;
|
||
|
uint32 returnValue;
|
||
|
|
||
|
offset = (ptBitStream->usedBits) >> INBUF_ARRAY_INDEX_SHIFT;
|
||
|
|
||
|
Elem = *(ptBitStream->pBuffer + module(offset , BUFSIZE));
|
||
|
Elem1 = *(ptBitStream->pBuffer + module(offset + 1, BUFSIZE));
|
||
|
Elem2 = *(ptBitStream->pBuffer + module(offset + 2, BUFSIZE));
|
||
|
|
||
|
|
||
|
returnValue = (((uint32)(Elem)) << 16) |
|
||
|
(((uint32)(Elem1)) << 8) |
|
||
|
((uint32)(Elem2));
|
||
|
|
||
|
/* Remove extra high bits by shifting up */
|
||
|
bitIndex = module(ptBitStream->usedBits, INBUF_BIT_WIDTH);
|
||
|
|
||
|
ptBitStream->usedBits += neededBits;
|
||
|
/* This line is faster than to mask off the high bits. */
|
||
|
returnValue = 0xFFFFFF & (returnValue << (bitIndex));
|
||
|
|
||
|
/* Move the field down. */
|
||
|
|
||
|
return (uint32)(returnValue >> (24 - neededBits));
|
||
|
|
||
|
}
|
||
|
|
||
|
/*----------------------------------------------------------------------------
|
||
|
; FUNCTION CODE
|
||
|
----------------------------------------------------------------------------*/
|
||
|
|
||
|
uint8 get1bit(tmp3Bits *ptBitStream) /* number of bits to read from the bit stream */
|
||
|
{
|
||
|
|
||
|
uint32 offset;
|
||
|
uint32 bitIndex;
|
||
|
uint8 returnValue;
|
||
|
|
||
|
offset = (ptBitStream->usedBits) >> INBUF_ARRAY_INDEX_SHIFT;
|
||
|
|
||
|
returnValue = *(ptBitStream->pBuffer + module(offset , BUFSIZE));
|
||
|
|
||
|
/* Remove extra high bits by shifting up */
|
||
|
bitIndex = module(ptBitStream->usedBits, INBUF_BIT_WIDTH);
|
||
|
ptBitStream->usedBits++;
|
||
|
|
||
|
/* This line is faster than to mask off the high bits. */
|
||
|
returnValue = (returnValue << (bitIndex));
|
||
|
|
||
|
return (uint8)(returnValue >> 7);
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|