videoeditorengine/mp3aacManipLib/MP3Gain/src/l3huffman.cpp
changeset 0 951a5db380a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videoeditorengine/mp3aacManipLib/MP3Gain/src/l3huffman.cpp	Fri Jan 29 14:08:33 2010 +0200
@@ -0,0 +1,378 @@
+/*
+* 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);
+}