/* ------------------------------------------------------------------
 * Copyright (C) 2008 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;

}





