00001 00006 #ifndef _DATAHEADER_H_ 00007 #define _DATAHEADER_H_ 00008 00009 #include "mp3_format.h" 00010 #include "bitarray.h" 00011 00018 class DataHeader 00019 { 00020 public: 00021 00029 DataHeader(Bitstream &bs) {} 00030 00036 virtual int Size() const = 0; 00037 00043 virtual void Write(Bitstream &bs) = 0; 00044 00052 virtual int DataBegin() const = 0; 00053 00059 virtual int MaxDataBegin() const = 0; 00060 00066 virtual void SetDataBegin(int databegin) = 0; 00067 00073 virtual ~DataHeader() {} 00074 }; 00075 00076 template<class T> class DataHeaderTemplate : public DataHeader 00077 { 00078 public: 00079 DataHeaderTemplate<T>(Bitstream &bs) : DataHeader(bs), m_dh(bs) {} 00080 int Size() const { return T::size; } 00081 void Write(Bitstream &bs) { m_dh.Write(bs); } 00082 int DataBegin() const { return m_dh^T::main_data_begin; } 00083 int MaxDataBegin() const { return m_dh.Max(T::main_data_begin); } 00084 void SetDataBegin(int databegin) { m_dh.Set(T::main_data_begin, databegin); } 00085 00086 private: 00087 Bitarray<T> m_dh; //Data (bit struct) 00088 }; 00089 00090 extern template class DataHeaderTemplate<mp3_data_header_mpeg1_1ch>; 00091 extern template class DataHeaderTemplate<mp3_data_header_mpeg1_2ch>; 00092 extern template class DataHeaderTemplate<mp3_data_header_mpeg2_1ch>; 00093 extern template class DataHeaderTemplate<mp3_data_header_mpeg2_2ch>; 00094 00095 typedef DataHeaderTemplate<mp3_data_header_mpeg1_1ch> DataHeaderMPEG1Mono; 00096 typedef DataHeaderTemplate<mp3_data_header_mpeg1_2ch> DataHeaderMPEG1Stereo; 00097 typedef DataHeaderTemplate<mp3_data_header_mpeg2_1ch> DataHeaderMPEG2Mono; 00098 typedef DataHeaderTemplate<mp3_data_header_mpeg2_2ch> DataHeaderMPEG2Stereo; 00099 00100 #endif //_DATAHEADER_H_