subband_layer_1.cc
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:8k
源码类别:

DVD

开发平台:

Unix_Linux

  1. /*
  2.    File: subband_layer_1.cc
  3.    Description:
  4. */
  5.    
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <fstream.h>
  10. #ifdef IRIX
  11. #include <dmedia/audio.h>
  12. #endif
  13. #ifdef SOLARIS
  14. #include <sys/audioio.h>
  15. #endif
  16. #include "athread.hh"
  17. #include "error.hh"
  18. #include "debug.hh"
  19. #include "util.hh"
  20. #include "sync.hh"
  21. #include "mpeg2const.hh"
  22. #include "mpeg2buff.hh"
  23. #include "astream.hh"
  24. #include "crc.hh"
  25. #include "header.hh"
  26. #include "obuffer.hh"
  27. #include "synthesis_filter.hh"
  28. #include "subband.hh"
  29. #include "subband_layer_1.hh"
  30. #include "scalefactors.hh"
  31. // factors and offsets for sample requantization:
  32. static const real table_factor[15] = {
  33.   0.0, (1.0/2.0) * (4.0/3.0), (1.0/4.0) * (8.0/7.0), (1.0/8.0) * (16.0/15.0),
  34.   (1.0/16.0) * (32.0/31.0), (1.0/32.0) * (64.0/63.0), (1.0/64.0) * (128.0/127.0),
  35.   (1.0/128.0) * (256.0/255.0), (1.0/256.0) * (512.0/511.0),
  36.   (1.0/512.0) * (1024.0/1023.0), (1.0/1024.0) * (2048.0/2047.0),
  37.   (1.0/2048.0) * (4096.0/4095.0), (1.0/4096.0) * (8192.0/8191.0),
  38.   (1.0/8192.0) * (16384.0/16383.0), (1.0/16384.0) * (32768.0/32767.0)
  39. };
  40. static const real table_offset[15] = {
  41.   0.0, ((1.0/2.0)-1.0) * (4.0/3.0), ((1.0/4.0)-1.0) * (8.0/7.0), ((1.0/8.0)-1.0) * (16.0/15.0),
  42.   ((1.0/16.0)-1.0) * (32.0/31.0), ((1.0/32.0)-1.0) * (64.0/63.0), ((1.0/64.0)-1.0) * (128.0/127.0),
  43.   ((1.0/128.0)-1.0) * (256.0/255.0), ((1.0/256.0)-1.0) * (512.0/511.0),
  44.   ((1.0/512.0)-1.0) * (1024.0/1023.0), ((1.0/1024.0)-1.0) * (2048.0/2047.0),
  45.   ((1.0/2048.0)-1.0) * (4096.0/4095.0), ((1.0/4096.0)-1.0) * (8192.0/8191.0),
  46.   ((1.0/8192.0)-1.0) * (16384.0/16383.0), ((1.0/16384.0)-1.0) * (32768.0/32767.0)
  47. };
  48. /**********************/ // used for single channel mode
  49. /*** Standard Class ***/ // and in derived class for intensity
  50. /**********************/ // stereo mode
  51. /* INLINE
  52. SubbandLayer1::SubbandLayer1 (uint32 subbandnumber){
  53.   this->subbandnumber = subbandnumber;
  54.   samplenumber = 0;
  55. }
  56. */
  57. void SubbandLayer1::read_allocation (AudioStream *stream, Header *, Crc16 *crc){
  58.   if ((allocation = stream->get_bits (4)) == 15)
  59.     cerr << "WARNING: stream contains an illegal allocation!n"; // MPEG-stream is corrupted!
  60.   if (crc) crc->add_bits (allocation, 4);
  61.   if (allocation){
  62.     samplelength = allocation + 1;
  63.     factor = table_factor[allocation];
  64.     offset = table_offset[allocation];
  65.   }
  66. }
  67. void SubbandLayer1::read_scalefactor (AudioStream *stream, Header *){
  68.   if (allocation)
  69.     if ((scalefactor = stream->get_bits (6)) == 63)
  70.       cerr << "WARNING: stream contains an illegal scalefactor!n"; // MPEG-stream is corrupted!
  71. }
  72. bool SubbandLayer1::read_sampledata (AudioStream *stream){
  73.   if (allocation){
  74.     sample = real (stream->get_bits (samplelength));
  75. #ifdef DEBUG
  76.     if (sample == (1 << samplelength) - 1)
  77. cerr << "WARNING: stream contains an illegal subband sample!n";  // MPEG-stream is corrupted!
  78. #endif
  79.   }
  80.   if (++samplenumber == 12){
  81.     samplenumber = 0;
  82.     return True;
  83.   }
  84.   else return False;
  85. }
  86. bool SubbandLayer1::put_next_sample(e_channels channels,
  87.                                     SynthesisFilter *filter1, SynthesisFilter*){
  88.   if (allocation && channels != right){
  89.     register real scaled_sample = (sample * factor + offset) * scalefactors[scalefactor];
  90. #ifdef DEBUG
  91.     if (scaled_sample < -1.0 || scaled_sample > 1.0)
  92.       cerr << "WARNING: rescaled subband sample is not in [-1.0, 1.0]n";
  93.       // this should never occur
  94. #endif
  95.     if (scaled_sample < -1.0E-7 || scaled_sample > 1.0E-7)
  96.       filter1->input_sample (scaled_sample, subbandnumber);
  97.   }
  98.   return True;
  99. }
  100. /******************************/
  101. /*** Intensity Stereo Class ***/
  102. /******************************/
  103. /* INLINE
  104. SubbandLayer1IntensityStereo::SubbandLayer1IntensityStereo (uint32 subbandnumber)
  105. : SubbandLayer1 (subbandnumber)
  106. {
  107. }
  108. */
  109. void SubbandLayer1IntensityStereo::read_scalefactor (AudioStream *stream, Header *)
  110. {
  111.   if (allocation)
  112.   {
  113.     scalefactor = stream->get_bits (6);
  114.     channel2_scalefactor = stream->get_bits (6);
  115.     if (scalefactor == 63 || channel2_scalefactor == 63)
  116.       cerr << "WARNING: stream contains an illegal scalefactor!n";
  117.       // MPEG-stream is corrupted!
  118.   }
  119. }
  120. bool SubbandLayer1IntensityStereo::put_next_sample (e_channels channels,
  121. SynthesisFilter *filter1, SynthesisFilter *filter2){
  122.   if (allocation){
  123.     sample = sample * factor + offset; // requantization
  124.     if (channels == both){
  125.       register real sample1 = sample * scalefactors[scalefactor],
  126.     sample2 = sample * scalefactors[channel2_scalefactor];
  127. #ifdef DEBUG
  128.       if (sample1 < -1.0 || sample1 > 1.0 || sample2 < -1.0 || sample2 > 1.0)
  129. cerr << "WARNING: rescaled subband sample is not in [-1.0, 1.0]n";
  130. // this should never occur
  131. #endif
  132.       if (sample1 < -1.0E-7 || sample1 > 1.0E-7)
  133. filter1->input_sample (sample1, subbandnumber);
  134.       if (sample2 < -1.0E-7 || sample2 > 1.0E-7)
  135. filter2->input_sample (sample2, subbandnumber);
  136.     }
  137.     else if (channels == left)
  138.     {
  139.       register real sample1 = sample * scalefactors[scalefactor];
  140. #ifdef DEBUG
  141.       if (sample1 < -1.0 || sample1 > 1.0)
  142. cerr << "WARNING: rescaled subband sample is not in [-1.0, 1.0]n";
  143. // this should never occur
  144. #endif
  145.       if (sample1 < -1.0E-7 || sample1 > 1.0E-7)
  146. filter1->input_sample (sample1, subbandnumber);
  147.     }
  148.     else
  149.     {
  150.       register real sample2 = sample * scalefactors[channel2_scalefactor];
  151. #ifdef DEBUG
  152.       if (sample2 < -1.0 || sample2 > 1.0)
  153. cerr << "WARNING: rescaled subband sample is not in [-1.0, 1.0]n";
  154. // this should never occur
  155. #endif
  156.       if (sample2 < -1.0E-7 || sample2 > 1.0E-7)
  157. filter1->input_sample (sample2, subbandnumber);
  158.     }
  159.   }
  160.   return True;
  161. }
  162. /********************/
  163. /*** Stereo Class ***/
  164. /********************/
  165. /* INLINE
  166. SubbandLayer1Stereo::SubbandLayer1Stereo (uint32 subbandnumber)
  167. : SubbandLayer1 (subbandnumber)
  168. {
  169. }
  170. */
  171. void SubbandLayer1Stereo::read_allocation (AudioStream *stream, Header *, Crc16 *crc){
  172.   allocation = stream->get_bits (4);
  173.   channel2_allocation = stream->get_bits (4);
  174.   if (crc){
  175.     crc->add_bits (allocation, 4);
  176.     crc->add_bits (channel2_allocation, 4);
  177.   }
  178.   if (allocation == 15 || channel2_allocation == 15)
  179.     cerr << "WARNING: stream contains an illegal allocation!n"; // MPEG-stream is corrupted!
  180.   if (allocation)
  181.   {
  182.     samplelength = allocation + 1;
  183.     factor = table_factor[allocation];
  184.     offset = table_offset[allocation];
  185.   }
  186.   if (channel2_allocation)
  187.   {
  188.     channel2_samplelength = channel2_allocation + 1;
  189.     channel2_factor = table_factor[channel2_allocation];
  190.     channel2_offset = table_offset[channel2_allocation];
  191.   }
  192. }
  193. void SubbandLayer1Stereo::read_scalefactor (AudioStream *stream, Header *){
  194.   if (allocation)
  195.     if ((scalefactor = stream->get_bits (6)) == 63)
  196.       cerr << "WARNING: stream contains an illegal allocation!n"; // MPEG-stream is corrupted!
  197.   if (channel2_allocation)
  198.     if ((channel2_scalefactor = stream->get_bits (6)) == 63)
  199.       cerr << "WARNING: stream contains an illegal allocation!n"; // MPEG-stream is corrupted!
  200. }
  201. bool SubbandLayer1Stereo::read_sampledata (AudioStream *stream){
  202.   bool returnvalue = SubbandLayer1::read_sampledata (stream);
  203.   if (channel2_allocation)
  204.   {
  205.     channel2_sample = real (stream->get_bits (channel2_samplelength));
  206. #ifdef DEBUG
  207.     if (channel2_sample == (1 << channel2_samplelength) - 1)
  208. cerr << "WARNING: stream contains an illegal subband sample!n";  // MPEG-stream is corrupted!
  209. #endif
  210.   }
  211.   return returnvalue;
  212. }
  213. bool SubbandLayer1Stereo::put_next_sample (e_channels channels,
  214.    SynthesisFilter *filter1, SynthesisFilter *filter2)
  215. {
  216.   SubbandLayer1::put_next_sample (channels, filter1, filter2);
  217.   if (channel2_allocation && channels != left)
  218.   {
  219.     register float sample2 = (channel2_sample * channel2_factor + channel2_offset)
  220.      * scalefactors[channel2_scalefactor];
  221. #ifdef DEBUG
  222.     if (sample2 < -1.0 || sample2 > 1.0)
  223.       cerr << "WARNING: rescaled subband sample is not in [-1.0, 1.0]n";
  224.       // this should never occur
  225. #endif
  226.     if (sample2 < -1.0E-7 || sample2 > 1.0E-7)
  227.       if (channels == both)
  228. filter2->input_sample (sample2, subbandnumber);
  229.       else
  230. filter1->input_sample (sample2, subbandnumber);
  231.   }
  232.   return True;
  233. }