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

DVD

开发平台:

Unix_Linux

  1. /*
  2.    File: header.cc
  3. */
  4. #ifdef __GNUG__
  5. #pragma implementation
  6. #endif
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <fstream.h>
  10. #include <iomanip.h>
  11. #include "athread.hh"
  12. #include "error.hh"
  13. #include "debug.hh"
  14. #include "util.hh"
  15. #include "sync.hh"
  16. #include "mpeg2const.hh"
  17. #include "mpeg2buff.hh"
  18. #include "astream.hh"
  19. #include "crc.hh"
  20. #include "header.hh"
  21. const uint32 Header::frequencies[3] = { 44100, 48000, 32000 };
  22. int Header::read_header(AudioStream *stream, Crc16 **crcp){
  23.   TRACER("bool Header::read_header(AudioStream *stream, Crc16 **crcp)");
  24.   uint32 headerstring=0;
  25.   if (stream->get_header(headerstring)==False){
  26.     cerr << "invalid syncword 0x" << hex << setw (3) << setfill ('0')
  27.          << ((headerstring & 0xfff00000) >> 20)
  28.          << " found at fileoffset " << dec << 'n';
  29.     TRACER("could not get_header");
  30.     return 0;
  31.   }
  32.   if ((headerstring & 0xf0000000) == 0x80000000)
  33.     return 2;    /* Ac-3 audio */
  34. #ifdef NOT // moved to get_header to recover from errors  
  35.   if ((headerstring & 0xfff00000) != 0xfff00000){
  36.     cerr << "invalid syncword 0x" << hex << setw (3) << setfill ('0')
  37.          << ((headerstring & 0xfff00000) >> 20)
  38.          << " found at fileoffset " << dec << 'n';    
  39.     // Try to recover from errors
  40.     while ((headerstring & 0xFFF00000) != 0xFFF00000)
  41.       if (!stream->get_header(headerstring)) return False;
  42.   }
  43. #endif
  44.   if ((h_layer = (headerstring >> 17) & 3) == 0){
  45.     cerr << "unknown layer identifier found!n";
  46.     exit (1);
  47.   }
  48.   h_layer = 4 - h_layer; // now 1 means Layer I and 3 means Layer III
  49.   if (h_layer == 3){
  50.     cerr << "Sorry, Layer III not implemented!n";
  51.     exit (1);
  52.   }
  53.   h_protection_bit = (headerstring >> 16) & 1;
  54.   if ((h_bitrate_index = (headerstring >> 12) & 0xF) == 15){
  55.     cerr << "unknown bitrate index found!n";
  56.     exit (1);
  57.   }
  58.   if (!h_bitrate_index){
  59.     cerr << "free format not yet implemented!n";
  60.     exit (1);
  61.   }
  62.   if ((h_sample_frequency = (e_sample_frequency)((headerstring >> 10) & 3)) == 3){
  63.     cerr << "unknown sample frequency!n";
  64.     exit (1);
  65.   }
  66.   h_padding_bit = (headerstring >> 9) & 1;
  67.   h_mode = (e_mode)((headerstring >> 6) & 3);
  68.   if (h_layer == 2)
  69.     // testing validity of mode and bitrate:
  70.     if ((((h_bitrate_index >= 1 && h_bitrate_index <= 3) || h_bitrate_index == 5) &&
  71.  h_mode != single_channel) ||
  72. (h_bitrate_index >= 11 && h_mode == single_channel))
  73.     {
  74.       cerr << "illegal combination of mode and bitrate in a layer II stream:n"
  75.       "  mode: " << mode_string ()
  76.    << "n  bitrate: " << bitrate_string () << 'n';
  77.       exit (1);
  78.     }
  79.   h_mode_extension = (headerstring >> 4) & 3;
  80.   if (h_mode == joint_stereo)
  81.         h_intensity_stereo_bound = (h_mode_extension << 2) + 4;
  82.   else  h_intensity_stereo_bound = 0; // should never be used
  83.   h_copyright = ((headerstring >> 3) & 1) ? True : False;
  84.   h_original = ((headerstring >> 2) & 1) ? True : False;
  85.   // calculate number of subbands:
  86.   if (h_layer == 1) h_number_of_subbands = 32;
  87.   else {
  88.     uint32 channel_bitrate = h_bitrate_index;
  89.     // calculate bitrate per channel:
  90.     if (h_mode != single_channel)
  91.       if (channel_bitrate == 4)
  92. channel_bitrate = 1;
  93.       else
  94. channel_bitrate -= 4;
  95.     if (channel_bitrate == 1 || channel_bitrate == 2)
  96.       if (h_sample_frequency == thirtytwo)
  97. h_number_of_subbands = 12;
  98.       else
  99. h_number_of_subbands = 8;
  100.     else
  101.       if (h_sample_frequency == fourtyeight || (channel_bitrate >= 3 && channel_bitrate <= 5))
  102. h_number_of_subbands = 27;
  103.       else
  104. h_number_of_subbands = 30;
  105.   }
  106.   if (h_intensity_stereo_bound > h_number_of_subbands)
  107.     h_intensity_stereo_bound = h_number_of_subbands;
  108.   // read framedata:
  109.   if (!stream->read_frame (calculate_framesize ())) return False;
  110.   if (!h_protection_bit){
  111.     // frame contains a crc checksum
  112.     checksum = (uint16)stream->get_bits (16);
  113.     if (!crc) crc = new Crc16;
  114.     crc->add_bits (headerstring, 16);
  115.     *crcp = crc;
  116.   }
  117.   else *crcp = (Crc16 *)0;
  118.   return 1;
  119. }
  120. uint32 Header::calculate_framesize(){
  121. /* calculates framesize in bytes excluding header size */
  122.   static const uint32 bitrates_layer_1[15] = {
  123.     0 /*free format*/, 32000, 64000, 96000, 128000, 160000, 192000,
  124.     224000, 256000, 288000, 320000, 352000, 384000, 416000, 448000 };
  125.   static const uint32 bitrates_layer_2[15] = {
  126.     0 /*free format*/, 32000, 48000, 56000, 64000, 80000, 96000,
  127.     112000, 128000, 160000, 192000, 224000, 256000, 320000, 384000 };
  128.   static const uint32 samplefrequencies[3] = { 44100, 48000, 32000 };
  129.   uint32 framesize;
  130.   if (h_layer == 1)
  131.   {
  132.     framesize = (12 * bitrates_layer_1[h_bitrate_index]) / samplefrequencies[h_sample_frequency];
  133.     if (h_sample_frequency == fourtyfour_point_one && h_padding_bit)
  134.       ++framesize;
  135.     framesize <<= 2; // one slot is 4 bytes long
  136.   }
  137.   else
  138.   {
  139.     framesize = (144 * bitrates_layer_2[h_bitrate_index]) / samplefrequencies[h_sample_frequency];
  140.     if (h_sample_frequency == fourtyfour_point_one && h_padding_bit)
  141.       ++framesize;
  142.   }
  143.   return framesize - 4; // subtract header size
  144. }
  145. const char *Header::layer_string (void){
  146.   switch (h_layer){
  147.   case 1: return "I";
  148.   case 2: return "II";
  149.   case 3: return "III (not implemented!)";
  150.   }
  151.   return NULL; // dummy
  152. }
  153. const char *Header::bitrate_string (void){
  154.   static const char *layer1_bitrates[16] = {
  155.     "free format", "32 kbis/s", "64 kbit/s", "96 kbit/s", "128 kbit/s", "160 kbit/s", 
  156.     "192 kbit/s", "224 kbit/s", "256 kbit/s", "288 kbit/s", "320 kbit/s", "352 kbit/s",
  157.     "384 kbit/s", "416 kbit/s", "448 kbit/s", "forbidden"
  158.   };
  159.   static const char *layer2_bitrates[16] = {
  160.     "free format", "32 kbis/s", "48 kbit/s", "56 kbit/s", "64 kbit/s", "80 kbit/s", 
  161.     "96 kbit/s", "112 kbit/s", "128 kbit/s", "160 kbit/s", "192 kbit/s", "224 kbit/s",
  162.     "256 kbit/s", "320 kbit/s", "384 kbit/s", "forbidden"
  163.   };
  164.   if (h_layer == 1)
  165.     return layer1_bitrates[h_bitrate_index];
  166.   else
  167.     return layer2_bitrates[h_bitrate_index];
  168. }
  169. const char *Header::sample_frequency_string (void)
  170. {
  171.   switch (h_sample_frequency)
  172.   {
  173.     case thirtytwo:
  174.       return "32 kHz";
  175.     case fourtyfour_point_one:
  176.       return "44.1 kHz";
  177.     case fourtyeight:
  178.       return "48 kHz";
  179.   }
  180.   return NULL; // dummy
  181. }
  182. const char *Header::mode_string (void)
  183. {
  184.   switch (h_mode)
  185.   {
  186.     case stereo:
  187.       return "stereo";
  188.     case joint_stereo:
  189.       return "joint stereo";
  190.     case dual_channel:
  191.       return "dual channel";
  192.     case single_channel:
  193.       return "single channel";
  194.   }
  195.   return NULL; // dummy
  196. }