sublay1.cpp
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:7k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /*  sublay1.cpp
  2.     Implementation of layer I subband objects */
  3. /*
  4.  *  @(#) subband_layer_1.cc 1.7, last edit: 6/15/94 16:51:49
  5.  *  @(#) Copyright (C) 1993, 1994 Tobias Bading (bading@cs.tu-berlin.de)
  6.  *  @(#) Berlin University of Technology
  7.  *
  8.  *  This program is free software; you can redistribute it and/or modify
  9.  *  it under the terms of the GNU General Public License as published by
  10.  *  the Free Software Foundation; either version 2 of the License, or
  11.  *  (at your option) any later version.
  12.  *
  13.  *  This program is distributed in the hope that it will be useful,
  14.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  *  GNU General Public License for more details.
  17.  *
  18.  *  You should have received a copy of the GNU General Public License
  19.  *  along with this program; if not, write to the Free Software
  20.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  */
  22. /*
  23.  *  Changes from version 1.1 to 1.2:
  24.  *    - scalefactors itself instead of scalefactor indices are stored in
  25.  *      SubbandLayer1... objects
  26.  *    - check for small values in [-1.0E-7, 1.0E-7] removed, because the
  27.  *      test itself was slower than some SynthesisFilter::input_sample() calls
  28.  *    - check for illegal scalefactor index 63 removed
  29.  */
  30. #include "sublay1.h"
  31. #include "scalfact.h"
  32. #ifdef __WIN32__
  33. #pragma warning (disable: 4305)
  34. #endif
  35. // factors and offsets for sample requantization:
  36. static const real table_factor[15] = {
  37.   0.0f, (1.0f/2.0f) * (4.0f/3.0f), (1.0f/4.0f) * (8.0f/7.0f), (1.0f/8.0f) * (16.0f/15.0f),
  38.   (1.0f/16.0f) * (32.0f/31.0f), (1.0f/32.0f) * (64.0f/63.0f), (1.0f/64.0f) * (128.0f/127.0f),
  39.   (1.0f/128.0f) * (256.0f/255.0f), (1.0f/256.0f) * (512.0f/511.0f),
  40.   (1.0f/512.0f) * (1024.0f/1023.0f), (1.0f/1024.0f) * (2048.0f/2047.0f),
  41.   (1.0f/2048.0f) * (4096.0f/4095.0f), (1.0f/4096.0f) * (8192.0f/8191.0f),
  42.   (1.0f/8192.0f) * (16384.0f/16383.0f), (1.0f/16384.0f) * (32768.0f/32767.0f)
  43. };
  44. static const real table_offset[15] = {
  45.   0.0f, ((1.0f/2.0f)-1.0f) * (4.0f/3.0f), ((1.0f/4.0f)-1.0f) * (8.0f/7.0f), ((1.0f/8.0f)-1.0f) * (16.0f/15.0f),
  46.   ((1.0f/16.0f)-1.0f) * (32.0f/31.0f), ((1.0f/32.0f)-1.0f) * (64.0f/63.0f), ((1.0f/64.0f)-1.0f) * (128.0f/127.0f),
  47.   ((1.0f/128.0f)-1.0f) * (256.0f/255.0f), ((1.0f/256.0f)-1.0f) * (512.0f/511.0f),
  48.   ((1.0f/512.0f)-1.0f) * (1024.0f/1023.0f), ((1.0f/1024.0f)-1.0f) * (2048.0f/2047.0f),
  49.   ((1.0f/2048.0f)-1.0f) * (4096.0f/4095.0f), ((1.0f/4096.0f)-1.0f) * (8192.0f/8191.0f),
  50.   ((1.0f/8192.0f)-1.0f) * (16384.0f/16383.0f), ((1.0f/16384.0f)-1.0f) * (32768.0f/32767.0f)
  51. };
  52. /**********************/ // used for single channel mode
  53. /*** Standard Class ***/ // and in derived class for intensity
  54. /**********************/ // stereo mode
  55. SubbandLayer1::SubbandLayer1 (uint32 subbandnumber)
  56. {
  57.   this->subbandnumber = subbandnumber;
  58.   samplenumber = 0;
  59. }
  60. void SubbandLayer1::read_allocation (Ibitstream *stream, Header *, Crc16 *crc)
  61. {
  62.   if ((allocation = stream->get_bits (4)) == 15) ;
  63. //  cerr << "WARNING: stream contains an illegal allocation!n"; // MPEG-stream is corrupted!
  64.   if (crc)
  65.  crc->add_bits (allocation, 4);
  66.   if (allocation)
  67.   {
  68.  samplelength = allocation + 1;
  69.  factor = table_factor[allocation];
  70.     offset = table_offset[allocation];
  71.   }
  72. }
  73. void SubbandLayer1::read_scalefactor (Ibitstream *stream, Header *)
  74. {
  75.   if (allocation)
  76.  scalefactor = scalefactors[stream->get_bits (6)];
  77. }
  78. bool SubbandLayer1::read_sampledata (Ibitstream *stream)
  79. {
  80.   if (allocation)
  81.   {
  82.  sample = real (stream->get_bits (samplelength));
  83.   }
  84.   if (++samplenumber == 12)
  85.   {
  86.  samplenumber = 0;
  87.  return true;
  88.   }
  89.   return false;
  90. }
  91. bool SubbandLayer1::put_next_sample (e_channels channels,
  92.   SynthesisFilter *filter1, SynthesisFilter *)
  93. {
  94.   if (allocation && channels != right)
  95.   {
  96.  register real scaled_sample = (sample * factor + offset) * scalefactor;
  97.  filter1->input_sample (scaled_sample, subbandnumber);
  98.   }
  99.   return true;
  100. }
  101. /******************************/
  102. /*** Intensity Stereo Class ***/
  103. /******************************/
  104. SubbandLayer1IntensityStereo::SubbandLayer1IntensityStereo (uint32 subbandnumber)
  105. : SubbandLayer1 (subbandnumber)
  106. {
  107. }
  108. void SubbandLayer1IntensityStereo::read_scalefactor (Ibitstream *stream, Header *)
  109. {
  110.   if (allocation)
  111.   {
  112.  scalefactor = scalefactors[stream->get_bits (6)];
  113.  channel2_scalefactor = scalefactors[stream->get_bits (6)];
  114.   }
  115. }
  116. bool SubbandLayer1IntensityStereo::put_next_sample (e_channels channels,
  117. SynthesisFilter *filter1, SynthesisFilter *filter2)
  118. {
  119.   if (allocation)
  120.   {
  121.     sample = sample * factor + offset; // requantization
  122.  if (channels == both)
  123.     {
  124. register real sample1 = sample * scalefactor,
  125.  sample2 = sample * channel2_scalefactor;
  126. filter1->input_sample (sample1, subbandnumber);
  127. filter2->input_sample (sample2, subbandnumber);
  128.  }
  129.  else if (channels == left)
  130.  {
  131. register real sample1 = sample * scalefactor;
  132. filter1->input_sample (sample1, subbandnumber);
  133.  }
  134.  else
  135.  {
  136. register real sample2 = sample * channel2_scalefactor;
  137. filter1->input_sample (sample2, subbandnumber);
  138.  }
  139.   }
  140.   return true;
  141. }
  142. /********************/
  143. /*** Stereo Class ***/
  144. /********************/
  145. SubbandLayer1Stereo::SubbandLayer1Stereo (uint32 subbandnumber)
  146. : SubbandLayer1 (subbandnumber)
  147. {
  148. }
  149. void SubbandLayer1Stereo::read_allocation (Ibitstream *stream, Header *, Crc16 *crc)
  150. {
  151.   allocation = stream->get_bits (4);
  152.   channel2_allocation = stream->get_bits (4);
  153.   if (crc)
  154.   {
  155.  crc->add_bits (allocation, 4);
  156.     crc->add_bits (channel2_allocation, 4);
  157.   }
  158.   if (allocation)
  159.   {
  160.  samplelength = allocation + 1;
  161.     factor = table_factor[allocation];
  162.     offset = table_offset[allocation];
  163.   }
  164.   if (channel2_allocation)
  165.   {
  166.     channel2_samplelength = channel2_allocation + 1;
  167.  channel2_factor = table_factor[channel2_allocation];
  168.  channel2_offset = table_offset[channel2_allocation];
  169.   }
  170. }
  171. void SubbandLayer1Stereo::read_scalefactor (Ibitstream *stream, Header *)
  172. {
  173.   if (allocation)
  174.  scalefactor = scalefactors[stream->get_bits (6)];
  175.   if (channel2_allocation)
  176.  channel2_scalefactor = scalefactors[stream->get_bits (6)];
  177. }
  178. bool SubbandLayer1Stereo::read_sampledata (Ibitstream *stream)
  179. {
  180.   bool returnvalue = SubbandLayer1::read_sampledata (stream);
  181.   if (channel2_allocation)
  182.   {
  183.  channel2_sample = real (stream->get_bits (channel2_samplelength));
  184.   }
  185.   return(returnvalue);
  186. }
  187. bool SubbandLayer1Stereo::put_next_sample (e_channels channels,
  188. SynthesisFilter *filter1, SynthesisFilter *filter2)
  189. {
  190.   SubbandLayer1::put_next_sample (channels, filter1, filter2);
  191.   if (channel2_allocation && channels != left)
  192.   {
  193.  register float sample2 = (channel2_sample * channel2_factor + channel2_offset) *
  194.   channel2_scalefactor;
  195.  if (channels == both)
  196. filter2->input_sample (sample2, subbandnumber);
  197.  else
  198. filter1->input_sample (sample2, subbandnumber);
  199.   }
  200.   return true;
  201. }