blob: 5d58cd2c227aee057ad19ecf87b666014a24b96b [file] [log] [blame]
/* ------------------------------------------------------------------
* 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_huffman_decoding.cpp
Funtions:
pvmp3_huffman_quad_decoding
pvmp3_huffman_pair_decoding
pvmp3_huffman_pair_decoding_linbits
Date: 09/21/2007
------------------------------------------------------------------------------
REVISION HISTORY
Description:
------------------------------------------------------------------------------
INPUT AND OUTPUT DEFINITIONS
Inputs:
struct huffcodetab *h, pointer to huffman code record
int32 *x, returns decoded x value
int32 *y, returns decoded y value
int32 *v, returns decoded v value (only in quad function)
int32 *w, returns decoded w value (only in quad function)
tbits *pMainData bit stream
Outputs:
------------------------------------------------------------------------------
FUNCTION DESCRIPTION
These functions are used to decode huffman codewords from the input
bitstream using combined binary search and look-up table approach.
------------------------------------------------------------------------------
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_dec_defs.h"
#include "pv_mp3_huffman.h"
#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
----------------------------------------------------------------------------*/
void pvmp3_huffman_quad_decoding(struct huffcodetab *h,
int32 *is,
tmp3Bits *pMainData)
{
int32 x;
int32 y;
int32 v;
int32 w;
y = (*h->pdec_huff_tab)(pMainData);
if (y)
{
v = (y >> 3);
if (v)
{
if (get1bit(pMainData))
{
v = -v;
}
}
w = (y >> 2) & 1;
if (w)
{
if (get1bit(pMainData))
{
w = -w;
}
}
x = (y >> 1) & 1;
if (x)
{
if (get1bit(pMainData))
{
x = -x;
}
}
y = y & 1;
if (y)
{
if (get1bit(pMainData))
{
y = -y;
}
}
}
else
{
v = 0;
w = 0;
x = 0;
}
*is = v;
*(is + 1) = w;
*(is + 2) = x;
*(is + 3) = y;
}
void pvmp3_huffman_pair_decoding(struct huffcodetab *h, /* pointer to huffman code record */
int32 *is,
tmp3Bits *pMainData)
{
/* Lookup in Huffman table. */
int32 x;
int32 y;
uint16 cw = (*h->pdec_huff_tab)(pMainData);
/* Process sign and escape encodings for dual tables. */
if (cw)
{
x = cw >> 4;
if (x)
{
if (get1bit(pMainData))
{
x = -x;
}
y = cw & 0xf;
if (y && get1bit(pMainData))
{
y = -y;
}
}
else
{
y = cw & 0xf;
if (get1bit(pMainData))
{
y = -y;
}
}
*is = x;
*(is + 1) = y;
}
else
{
*is = 0;
*(is + 1) = 0;
}
}
void pvmp3_huffman_pair_decoding_linbits(struct huffcodetab *h, /* pointer to huffman code record */
int32 *is,
tmp3Bits *pMainData)
{
int32 x;
int32 y;
uint16 cw;
/* Lookup in Huffman table. */
cw = (*h->pdec_huff_tab)(pMainData);
x = cw >> 4;
/* Process sign and escape encodings for dual tables. */
if (15 == (uint32)x)
{
int32 tmp = getUpTo17bits(pMainData, (h->linbits + 1));
x += tmp >> 1;
if (tmp&1)
{
x = -x;
}
}
else if (x)
{
if (get1bit(pMainData))
{
x = -x;
}
}
y = cw & 0xf;
if (15 == (uint32)y)
{
int32 tmp = getUpTo17bits(pMainData, (h->linbits + 1));
y += tmp >> 1;
if (tmp&1)
{
y = -y;
}
}
else if (y)
{
if (get1bit(pMainData))
{
y = -y;
}
}
*is = x;
*(is + 1) = y;
}