00001 00006 #ifndef _MP3FRAME_H_ 00007 #define _MP3FRAME_H_ 00008 00009 #include "bitstream.h" 00010 #include "frameheader.h" 00011 #include "dataheader.h" 00012 #include "channelheader.h" 00013 #include "audiodata.h" 00014 00015 class MP3Stream; 00016 00035 class MP3Frame 00036 { 00037 public: 00038 00040 enum { nowrite, 00041 fastwrite, 00042 normal 00043 }; 00044 00054 MP3Frame(MP3Stream *stream, MP3Frame *prev = 0); 00055 00059 ~MP3Frame(); 00060 00066 MP3Frame *Destroy(); 00067 00073 MP3Frame *Next(); 00074 00086 void Write(Bitstream &bs); 00087 00098 void SetDataBegin(int startpos); 00099 00110 void Enlarge(int num); 00111 00127 void WriteData(Bitstream &bs, MP3Frame *frame, int cutstart, int cutend); 00128 00136 void SetFirst(); 00137 00147 bool isLocked() const; 00148 00157 bool CorruptionFound() const; 00158 00164 int Bitrate() const; 00165 00174 int DataSize() const; 00175 00181 void ChangeGain(int n); 00182 00192 bool isSilent() const; 00193 00201 void ShowInfo(std::ostream &str) const; 00202 00203 private: 00204 //Initialize frame (may fail because of exception, called in loop) 00205 bool Init(MP3Frame *prev); 00206 void Cleanup(); //Delete everything 00207 void SetZeroes(); //Set all variables to zero 00208 void WriteHeaders(Bitstream &bs); //Write frame headers 00209 00210 FrameHeader *m_fh; //Frame header 00211 DataHeader *m_dh; //Data header (may be mono or stereo) 00212 ChannelHeader *m_ch[2][2]; //Header of each channel in each granule 00213 AudioData *m_data; //Raw audio data 00214 MP3Stream *m_stream; //Stream to read frame from 00215 MP3Frame *m_next; //Next frame (linked list) 00216 unsigned int m_CRC; //CRC code (rarely used) 00217 bool m_locked; //If the frame can't be deleted 00218 bool m_corruption; //If there was corruption before frame 00219 bool m_firstframe; //If the frame is first in a file 00220 int m_spacesize; //Size of part for data (without headers) in bytes 00221 int m_datasize; //Size of data belonging to frame 00222 int m_stuffing; //Number of added zero bytes 00223 int m_databegin; //Offset of first dfata byte in input stream 00224 int m_newdatabegin; //Offset in output stream 00225 int m_totalbytes; //Sum of space bytes in previius frames 00226 int m_framesize; //Total size of frame 00227 int m_sizechange; //Change of size after resize (bitrate change) 00228 }; 00229 00230 #endif //_MP3FRAME_H_