videoeditorengine/mp3aacManipLib/MP3Gain/src/l3huffman.cpp
changeset 9 d87d32eab1a9
parent 0 951a5db380a0
--- a/videoeditorengine/mp3aacManipLib/MP3Gain/src/l3huffman.cpp	Fri Jan 29 14:08:33 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,378 +0,0 @@
-/*
-* Copyright (c) 2010 Ixonos Plc.
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - Initial contribution
-*
-* Contributors:
-* Ixonos Plc
-*
-* Description:
-*
-*/
-
-
-/**************************************************************************
-  l3huffman.cpp - Huffman decoding subroutines for layer III.
-
-  Author(s): Juha Ojanpera
-  Copyright (c) 1999-2004 by Nokia Research Center, Speech and Audio Systems.
-  *************************************************************************/
-
-/**************************************************************************
-  External Objects Needed
-  *************************************************************************/
-
-/*-- Project Headers --*/
-#include "mpaud.h"
-#include "mp3tables.h"
-
-/**************************************************************************
-  Internal Objects
-  *************************************************************************/
-
-/*
-   Purpose:     Table to hold the Huffman symbol codebooks.
-   Explanation: - 
-const int16 *huff_symbols_tbl[] = {
-NULL, huff_symbols1, huff_symbols2, huff_symbols3, NULL, huff_symbols5,
-huff_symbols6, huff_symbols7, huff_symbols8, huff_symbols9, huff_symbols10,
-huff_symbols11, huff_symbols12, huff_symbols13, NULL, huff_symbols15,
-huff_symbols16, huff_symbols24, huff_symbols32};
-
-
-   Purpose:     Table to hold the Huffman codeword codebooks.
-   Explanation: - 
-   
-const int16 *huff_cwords_tbl[] = {
-NULL, huff_cwords1, huff_cwords2, huff_cwords3, NULL, huff_cwords5,
-huff_cwords6, huff_cwords7, huff_cwords8, huff_cwords9, huff_cwords10,
-huff_cwords11, huff_cwords12, huff_cwords13, NULL, huff_cwords15, huff_cwords16,
-huff_cwords24, huff_cwords32};
-*/
-
-/**************************************************************************
-  Title        : InitL3Huffman
-
-  Purpose      : Allocates resources for layer III Huffman decoding.
-
-  Usage        : InitL3Huffman(huf)
-
-  Output       : huf - Huffman tables
-
-  Author(s)    : Juha Ojanpera
-  *************************************************************************/
-
-void
-InitL3Huffman(CHuffman *huf)
-{
-  int16 i, j;
-
-
-  /*
-   Purpose:     Table to hold the Huffman symbol codebooks.
-   Explanation: - */
-const int16 *huff_symbols_tbl[] = {
-NULL, huff_symbols1, huff_symbols2, huff_symbols3, NULL, huff_symbols5,
-huff_symbols6, huff_symbols7, huff_symbols8, huff_symbols9, huff_symbols10,
-huff_symbols11, huff_symbols12, huff_symbols13, NULL, huff_symbols15,
-huff_symbols16, huff_symbols24, huff_symbols32};
-
-/*
-   Purpose:     Table to hold the Huffman codeword codebooks.
-   Explanation: - */
-const int16 *huff_cwords_tbl[] = {
-NULL, huff_cwords1, huff_cwords2, huff_cwords3, NULL, huff_cwords5,
-huff_cwords6, huff_cwords7, huff_cwords8, huff_cwords9, huff_cwords10,
-huff_cwords11, huff_cwords12, huff_cwords13, NULL, huff_cwords15, huff_cwords16,
-huff_cwords24, huff_cwords32};
-
-
-  for(i = 0; i < 33; i++)
-  {
-    huf[i].tree_len = huf_tree_len[i];
-    huf[i].linbits = linbits[i];
-  }
-
-  for(i = 0; i < 16; i++)
-  {
-    huf[i].codeword = huff_cwords_tbl[i];
-    huf[i].packed_symbols = huff_symbols_tbl[i];
-  }
-
-  j = i;
-  while(j < 24)
-  {
-    huf[j].codeword = huff_cwords_tbl[i];
-    huf[j].packed_symbols = huff_symbols_tbl[i];
-    j++;
-  }
-
-  i++;
-  while(j < 32)
-  {
-    huf[j].codeword = huff_cwords_tbl[i];
-    huf[j].packed_symbols = huff_symbols_tbl[i];
-    j++;
-  }
-
-  i++;
-  huf[j].codeword = huff_cwords_tbl[i];
-  huf[j].packed_symbols = huff_symbols_tbl[i];
-}
-
-
-/**************************************************************************
-  Title        : L3decode_codeword
-
-  Purpose      : Decodes one Huffman codeword from the bitstream and returns
-                 the corresponding symbol.
-
-  Usage        : L3decode_codeword(br, h)
-
-  Input        : br - bitstream parameters
-                 h  - Huffman table to be utilized
-
-  Explanation  : This decoding routine works only if the codewords are
-                 sorted according to their length, i.e, the codeword that has
-                 the minimum length appears first in the Huffman table, the
-                 length of the second codeword in the table is either greater
-                 or equal than the first one and so on.
-
-  Author(s)    : Juha Ojanpera
-  *************************************************************************/
-
-INLINE int16
-L3decode_codeword(TBitStream *br, CHuffman *h)
-{
-  const int16 *h_len = h->packed_symbols;
-  const int16 *h_codeword = h->codeword;
-  uint16 clen, items;
-  uint16 shift, N = 19; /* N = 19 maximum codeword length */
-  uint32 cand_codeword;
-  uint32 codeword;
-
-  /* Read the maximum codeword. */
-  cand_codeword = BsLookAhead(br, N);
-
-  /*
-   * Length of the codeword that has the
-   * highest probability.
-   */
-  shift = N - (*h_len & 31);
-
-  /* Candidate codeword for the first codebook entry. */
-  codeword = cand_codeword >> shift;
-
-  /*
-   * Sequentially goes through the whole Huffman table
-   * until a match has been found.
-   */
-  items = 1;
-  while(items < h->tree_len && codeword != (uint16)*h_codeword)
-  {
-    h_len++;
-    h_codeword++;
-    items++;
-
-    /* How many bits the codeword need to be updated. */
-    clen = *h_len & 31;
-    if(clen)
-    {
-      shift -= clen;
-
-      /* New candidate codeword. */
-      codeword = cand_codeword >> shift;
-    }
-  }
-
-  /* # of bits actually read. */
-  BsSkipNBits(br, N - shift);
-
-  /* Decoded Huffman symbol. */
-  return (*h_len >> 5);
-}
-
-/**************************************************************************
-  Layer III subroutines for decoding spectral samples.
-
-  Author(s): Juha Ojanpera
-  Copyright (c) 1999-2004 by Nokia Research Center, Speech and Audio Systems.
-  *************************************************************************/
-
-int16
-III_huffman_decode(CMP_Stream *mp, int16 gr, int16 ch, int32 part2)
-{
-  int16 i, x, region1Start, region2Start, table_num, limit;
-  int16 *quant, count1Len;
-  TGranule_Info *gr_info;
-
-  /* Quantized spectral samples. */
-  quant = mp->frame->ch_quant[ch];
-
-  /* Granule info for this frame. */
-  gr_info = mp->side_info->ch_info[ch]->gr_info[gr];
-
-  /* Find region boundaries. */
-  region1Start = mp->side_info->sfbData->sfbLong[gr_info->region0_count + 1];
-  region2Start = mp->side_info->sfbData->sfbLong[gr_info->region0_count +
-                            gr_info->region1_count + 2];
-
-  /*
-   * How many samples actually need to be Huffman decoded.
-   */
-  limit = mp->side_info->sfbData->bandLimit;
-  if(gr_info->big_values > limit)
-    gr_info->big_values = limit;
-
-  /* Read bigvalues area. */
-  int16 section1 = MIN(gr_info->big_values, region1Start);
-  if(section1 > 0)
-  {
-    pairtable(mp, section1, gr_info->table_select[0], quant);
-    quant += section1;
-  }
-
-  int16 section2 = MIN(gr_info->big_values, region2Start) - region1Start;
-  if(section2 > 0)
-  {
-    pairtable(mp, section2, gr_info->table_select[1], quant);
-    quant += section2;
-  }
-
-  int16 section3 = gr_info->big_values - region2Start;
-  if(section3 > 0)
-  {
-    pairtable(mp, section3, gr_info->table_select[2], quant);
-    quant += section3;
-  }
-
-  count1Len = 0;
-  i = gr_info->big_values;
-  part2 += gr_info->part2_3_length;
-
-  /* Check whether the samples between -1,...,1 need to be Huffman decoded. */
-  if(i < limit)
-  {
-    /* Read count1 area. */
-    table_num = 32 + ((gr_info->flags & COUNT_1_TABLE_SELECT) ? 1 : 0);
-
-    x = quadtable(mp, i, part2, table_num, quant, limit);
-    count1Len = x - i;
-    quant += count1Len;
-    count1Len >>= 2;
-    i = x;
-  }
-
-  if(BsGetBitsRead(mp->br) > (uint32)part2)
-  {
-    count1Len--;
-    quant -= 4; i -= 4;
-    BsRewindNBits(mp->br, BsGetBitsRead(mp->br) - part2);
-  }
-
-  /* Dismiss stuffing Bits */
-  if(BsGetBitsRead(mp->br) < (uint32)part2)
-    BsSkipNBits(mp->br, part2 - BsGetBitsRead(mp->br));
-
-  gr_info->zero_part_start = (i < limit) ? i : limit;
-
-  return (count1Len);
-}
-
-void
-pairtable(CMP_Stream *mp, int16 section_length, int16 table_num, int16 *quant)
-{
-  register CHuffman *h = &mp->huffman[table_num];
-
-  if(h->tree_len == 0)
-      Mem::Fill(quant, section_length << 1 /** sizeof(int16)*/, 0);
-  else
-  {
-    if(h->linbits)
-    {
-      register int16 *q = quant;
-
-      for(int16 i = 0; i < section_length; i += 2, q += 2)
-      {
-        uint32 codeword = L3decode_codeword(mp->br, h);
-
-        /* Unpack coefficients. */
-        *q = codeword >> 4;
-        q[1] = codeword & 15;
-
-        /* Read extra bits (if needed) and sign bits (if needed). */
-        if(*q == 15)
-          *q += BsGetBits(mp->br, h->linbits);
-        if(*q)
-          *q = (BsGetBits(mp->br, 1)) ? -*q : *q;
-
-        if(q[1] == 15)
-          q[1] += BsGetBits(mp->br, h->linbits);
-        if(q[1])
-          q[1] = (BsGetBits(mp->br, 1)) ? -q[1] : q[1];
-      }
-    }
-    else /* no linbits */
-    {
-      register int16 *q = quant;
-
-      for(int16 i = 0; i < section_length; i += 2, q += 2)
-      {
-        uint32 codeword = L3decode_codeword(mp->br, h);
-
-        /* Unpack coefficients. */
-        *q = codeword >> 4;
-        q[1] = codeword & 15;
-
-        /* Read extra bits (not needed) and sign bits (if needed). */
-        if(*q)
-          *q = (BsGetBits(mp->br, 1)) ? -*q : *q;
-
-        if(q[1])
-          q[1] = (BsGetBits(mp->br, 1)) ? -q[1] : q[1];
-      }
-    }
-  }
-}
-
-int16
-quadtable(CMP_Stream *mp, int16 start, int16 part2, int16 table_num, int16 *quant,
-          int16 max_sfb_bins)
-{
-  int16 i;
-  register int16 *q = quant;
-
-  for(i = start; (BsGetBitsRead(mp->br) < (uint32)part2 && i < max_sfb_bins);
-      i += 4, q += 4)
-  {
-    uint32 codeword;
-    uint16 mask = 8, sbits = 0;
-
-    if(table_num == 33)
-      codeword = 15 - BsGetBits(mp->br, 4);
-    else
-      codeword = L3decode_codeword(mp->br, &mp->huffman[table_num]);
-
-    /* Unpack coefficients. */
-    *q = (codeword >> 3) & 1;
-    q[1] = (codeword >> 2) & 1;
-    q[2] = (codeword >> 1) & 1;
-    q[3] = codeword & 1;
-
-    /* Sign bits. */
-    codeword = BsLookAhead(mp->br, 4);
-    if(*q)   { sbits++;   *q = (codeword & mask) ?   -*q : *q;   mask >>= 1; }  
-    if(q[1]) { sbits++; q[1] = (codeword & mask) ? -q[1] : q[1]; mask >>= 1; }
-    if(q[2]) { sbits++; q[2] = (codeword & mask) ? -q[2] : q[2]; mask >>= 1; }
-    if(q[3]) { sbits++; q[3] = (codeword & mask) ? -q[3] : q[3]; mask >>= 1; }
-    if(sbits) BsSkipBits(mp->br, sbits);
-  }
-
-  return (i);
-}