blob: ff815dc62271b4248f4469a7d34aafb381a12dfd [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:
int32 is[],
granuleInfo *grInfo, information for the given channel and granule
tmp3dec_file *pVars, decoder state structure
int32 part2_start, index to beginning of part 2 data
mp3Header *info mp3 header info
Outputs:
int32 is[], uncompressed data
Return:
non zero frequency lines
------------------------------------------------------------------------------
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 "pv_mp3_huffman.h"
#include "s_mp3bits.h"
#include "mp3_mem_funcs.h"
#include "pvmp3_tables.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
----------------------------------------------------------------------------*/
int32 pvmp3_huffman_parsing(int32 is[SUBBANDS_NUMBER*FILTERBANK_BANDS],
granuleInfo *grInfo,
tmp3dec_file *pVars,
int32 part2_start,
mp3Header *info)
{
int32 i;
int32 region1Start;
int32 region2Start;
int32 sfreq;
uint32 grBits;
void(*pt_huff)(struct huffcodetab *, int32 *, tmp3Bits *);
struct huffcodetab *h;
tmp3Bits *pMainData = &pVars->mainDataStream;
/*int32 bt = (*si).ch[ch].gr[gr].window_switching_flag && ((*si).ch[ch].gr[gr].block_type == 2);*/
sfreq = info->sampling_frequency + info->version_x + (info->version_x << 1);
/* Find region boundary for short block case. */
if ((grInfo->window_switching_flag) && (grInfo->block_type == 2))
{
if (info->version_x == MPEG_1)
{
/* Region2. */
region1Start = 12;
}
else
{
/* Region2. */
i = grInfo->region0_count + 1;
region1Start = mp3_sfBandIndex[sfreq].s[i/3];
}
region1Start += region1Start << 1;
region2Start = 576; /* No Region2 for short block case. */
}
else
{ /* Find region boundary for long block case. */
i = grInfo->region0_count + 1;
region1Start = mp3_sfBandIndex[sfreq].l[i];
region2Start = mp3_sfBandIndex[sfreq].l[i + grInfo->region1_count + 1];
}
/* Read bigvalues area. */
if (grInfo->big_values > (FILTERBANK_BANDS*SUBBANDS_NUMBER >> 1))
{
grInfo->big_values = (FILTERBANK_BANDS * SUBBANDS_NUMBER >> 1);
}
if ((grInfo->big_values << 1) > (uint32)region2Start)
{
h = &(pVars->ht[grInfo->table_select[0]]);
if (h->linbits)
{
pt_huff = pvmp3_huffman_pair_decoding_linbits;
}
else
{
pt_huff = pvmp3_huffman_pair_decoding;
}
for (i = 0; i < region1Start; i += 2)
{
(*pt_huff)(h, &is[i], pMainData);
}
h = &(pVars->ht[grInfo->table_select[1]]);
if (h->linbits)
{
pt_huff = pvmp3_huffman_pair_decoding_linbits;
}
else
{
pt_huff = pvmp3_huffman_pair_decoding;
}
for (; i < region2Start; i += 2)
{
(*pt_huff)(h, &is[i], pMainData);
}
h = &(pVars->ht[grInfo->table_select[2]]);
if (h->linbits)
{
pt_huff = pvmp3_huffman_pair_decoding_linbits;
}
else
{
pt_huff = pvmp3_huffman_pair_decoding;
}
for (; (uint32)i < (grInfo->big_values << 1); i += 2)
{
(*pt_huff)(h, &is[i], pMainData);
}
}
else if ((grInfo->big_values << 1) > (uint32)region1Start)
{
h = &(pVars->ht[grInfo->table_select[0]]);
if (h->linbits)
{
pt_huff = pvmp3_huffman_pair_decoding_linbits;
}
else
{
pt_huff = pvmp3_huffman_pair_decoding;
}
for (i = 0; i < region1Start; i += 2)
{
(*pt_huff)(h, &is[i], pMainData);
}
h = &(pVars->ht[grInfo->table_select[1]]);
if (h->linbits)
{
pt_huff = pvmp3_huffman_pair_decoding_linbits;
}
else
{
pt_huff = pvmp3_huffman_pair_decoding;
}
for (; (uint32)i < (grInfo->big_values << 1); i += 2)
{
(*pt_huff)(h, &is[i], pMainData);
}
}
else
{
h = &(pVars->ht[grInfo->table_select[0]]);
if (h->linbits)
{
pt_huff = pvmp3_huffman_pair_decoding_linbits;
}
else
{
pt_huff = pvmp3_huffman_pair_decoding;
}
for (i = 0; (uint32)i < (grInfo->big_values << 1); i += 2)
{
(*pt_huff)(h, &is[i], pMainData);
}
}
/* Read count1 area. */
h = &(pVars->ht[grInfo->count1table_select+32]);
grBits = part2_start + grInfo->part2_3_length;
while ((pMainData->usedBits < grBits) &&
(i < FILTERBANK_BANDS*SUBBANDS_NUMBER - 4))
{
pvmp3_huffman_quad_decoding(h, &is[i], pMainData);
i += 4;
}
if ((pMainData->usedBits < grBits) &&
(i < FILTERBANK_BANDS*SUBBANDS_NUMBER))
{
pvmp3_huffman_quad_decoding(h, &is[i], pMainData);
i += 4;
if ((i - 2) >= FILTERBANK_BANDS*SUBBANDS_NUMBER)
{
i -= 2;
is[i] = 0;
is[(i+1)] = 0;
}
}
if (pMainData->usedBits > grBits)
{
i -= 4;
if (i < 0 || i > FILTERBANK_BANDS*SUBBANDS_NUMBER - 4)
{
/* illegal parameters may cause invalid access, set i to 0 */
i = 0;
}
is[i] = 0;
is[(i+1)] = 0;
is[(i+2)] = 0;
is[(i+3)] = 0;
}
pMainData->usedBits = grBits;
return (i);
}