header.h
上传用户:hxb_1234
上传日期:2010-03-30
资源大小:8328k
文件大小:4k
源码类别:

VC书籍

开发平台:

Visual C++

  1. /* header.h
  2. Declarations for MPEG header class
  3. A few layer III, MPEG-2 LSF, and seeking modifications made by Jeff Tsay.
  4.    Last modified : 04/19/97 */
  5. /*
  6.  *  @(#) header.h 1.7, last edit: 6/15/94 16:55:33
  7.  *  @(#) Copyright (C) 1993, 1994 Tobias Bading (bading@cs.tu-berlin.de)
  8.  *  @(#) Berlin University of Technology
  9.  *
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 2 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  23.  */
  24. #ifndef HEADER_H
  25. #define HEADER_H
  26. #include "all.h"
  27. #include "ibitstr.h"
  28. #include "crc.h"
  29. enum e_version { MPEG2_LSF, MPEG1 };
  30. enum e_mode { stereo, joint_stereo, dual_channel, single_channel };
  31. enum e_sample_frequency { fourtyfour_point_one, fourtyeight, thirtytwo };
  32. // Class for extraction information from a frame header:
  33. class Header
  34. {
  35. private:
  36.   static const uint32 frequencies[2][4];
  37.   uint32 h_layer, h_protection_bit, h_bitrate_index,
  38. h_padding_bit, h_mode_extension;
  39.   e_version h_version;
  40.   e_mode h_mode;
  41.   e_sample_frequency h_sample_frequency;
  42.   uint32 h_number_of_subbands, h_intensity_stereo_bound;
  43.   bool h_copyright, h_original;
  44.   bool      initial_sync;
  45.   Crc16 *crc;
  46.   uint32    *offset;
  47.   uint16 checksum;
  48.   uint32    framesize;
  49.   uint32    nSlots;
  50. public:
  51.   Header();
  52.   Header(const Header &h0);
  53.   ~Header();
  54.   Header& operator = (const Header &h0);
  55.   bool read_header(Ibitstream *stream, Crc16 **crc);
  56.   // read a 32-bit header from the bitstream
  57.   // functions to query header contents:
  58.   e_version version()  const { return h_version; }
  59.   uint32 layer()         const { return h_layer; }
  60.   uint32 bitrate_index() const { return h_bitrate_index; }
  61.   e_sample_frequency sample_frequency() const
  62.   {
  63.      return h_sample_frequency;
  64.   }
  65.   uint32 frequency() const
  66.   {
  67.      return frequencies[h_version][h_sample_frequency];
  68.   }
  69.   e_mode mode()         const { return h_mode; }
  70.   bool checksums()    const { return (bool) !h_protection_bit; }
  71.   bool copyright()    const { return h_copyright; }
  72.   bool original()     const { return h_original; }
  73.   bool checksum_ok () const { return (bool) (checksum == crc->checksum ()); }
  74. // compares computed checksum with stream checksum
  75.   // Seeking and layer III stuff
  76.   bool      padding()        const { return (bool) h_padding_bit; }
  77.   uint32    slots()          const { return nSlots; }
  78.   uint32 mode_extension() const { return h_mode_extension; }
  79.   uint32 calculate_framesize(); // made public
  80.   // functions which return header informations as strings:
  81.   const char * layer_string() const;
  82.   const char * bitrate_string() const;
  83.   const char * sample_frequency_string() const;
  84.   const char * mode_string() const;
  85.   const char * version_string() const;
  86.   uint32 number_of_subbands() const
  87.   // returns the number of subbands in the current frame
  88.   {
  89.      return h_number_of_subbands;
  90.   }
  91.   uint32 intensity_stereo_bound() const
  92.   // (Layer II joint stereo only)
  93.   // returns the number of subbands which are in stereo mode,
  94.   // subbands above that limit are in intensity stereo mode
  95.   {
  96.      return h_intensity_stereo_bound;
  97.   }
  98.   // Scrolling stuff
  99. #ifdef SEEK_STOP
  100.   bool      stream_seek(Ibitstream *stream, uint32 seek_pos);
  101. #endif // SEEK_STOP
  102.   uint32    max_number_of_frames(Ibitstream *stream) const;
  103.   uint32    min_number_of_frames(Ibitstream *stream) const;
  104.   real      ms_per_frame() const;
  105.    // milliseconds per frame, for time display
  106.   real      total_ms(Ibitstream *stream) const;
  107. };
  108. #endif