1 /*  Copyright (c) MediaArea.net SARL. All Rights Reserved.
2  *
3  *  Use of this source code is governed by a BSD-style license that can
4  *  be found in the License.html file in the root of the source tree.
5  */
6 
7 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
8 //
9 // Information about ID3v2 tagged files
10 //
11 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
12 
13 //---------------------------------------------------------------------------
14 #ifndef MediaInfo_File_Id3v2H
15 #define MediaInfo_File_Id3v2H
16 //---------------------------------------------------------------------------
17 
18 //---------------------------------------------------------------------------
19 #include "MediaInfo/File__Analyze.h"
20 //---------------------------------------------------------------------------
21 
22 namespace MediaInfoLib
23 {
24 
25 ///***************************************************************************
26 // Class File_Id3v2
27 //***************************************************************************
28 
29 class File_Id3v2 : public File__Analyze
30 {
31 public :
32     //Constructor/Destructor
33     File_Id3v2();
34 
35     //Static stuff
36     static bool Static_Synchronize_Tags (const int8u* Buffer, size_t Buffer_Offset, size_t Buffer_Size, bool &Tag_Found);
37 
38 private :
39     //Streams management
40     void Streams_Fill();
41 
42     //Buffer - File header
43     void FileHeader_Parse ();
44 
45     //Buffer - Per element
46     void Header_Parse();
47     void Data_Parse();
48 
49     //Elements
50     #ifdef TEXT
51         #undef TEXT
52     #endif
53     void T___();
54     void T__X();
55     void W___();
56     void W__X();
AENC()57     void AENC()   {Skip_XX(Element_Size, "Data");}
58     void APIC();
ASPI()59     void ASPI()   {Skip_XX(Element_Size, "Data");}
60     void COMM();
COMR()61     void COMR()   {Skip_XX(Element_Size, "Data");}
ENCR()62     void ENCR()   {Skip_XX(Element_Size, "Data");}
EQU2()63     void EQU2()   {Skip_XX(Element_Size, "Data");}
EQUA()64     void EQUA()   {Skip_XX(Element_Size, "Data");}
ETCO()65     void ETCO()   {Skip_XX(Element_Size, "Data");}
GEOB()66     void GEOB()   {Skip_XX(Element_Size, "Data");}
GRID()67     void GRID()   {Skip_XX(Element_Size, "Data");}
IPLS()68     void IPLS()   {Skip_XX(Element_Size, "Data");}
LINK()69     void LINK()   {Skip_XX(Element_Size, "Data");}
MCDI()70     void MCDI()   {T___();}
MLLT()71     void MLLT()   {Skip_XX(Element_Size, "Data");}
OWNE()72     void OWNE()   {Skip_XX(Element_Size, "Data");}
PCNT()73     void PCNT()   {Skip_XX(Element_Size, "Data");}
POPM()74     void POPM()   {Skip_XX(Element_Size, "Data");}
POSS()75     void POSS()   {Skip_XX(Element_Size, "Data");}
76     void PRIV();
RBUF()77     void RBUF()   {Skip_XX(Element_Size, "Data");}
78     void RGAD();
RVA2()79     void RVA2()   {Skip_XX(Element_Size, "Data");}
RVRB()80     void RVRB()   {Skip_XX(Element_Size, "Data");}
SEEK()81     void SEEK()   {Skip_XX(Element_Size, "Data");}
SIGN()82     void SIGN()   {Skip_XX(Element_Size, "Data");}
83     void SYLT();
SYTC()84     void SYTC()   {Skip_XX(Element_Size, "Data");}
TALB()85     void TALB()   {T___();}
TBPM()86     void TBPM()   {T___();}
TCAT()87     void TCAT()   {T___();}
TCMP()88     void TCMP()   {T___();}
TCOM()89     void TCOM()   {T___();}
TCON()90     void TCON()   {T___();}
TCOP()91     void TCOP()   {T___();}
TDAT()92     void TDAT()   {T___();}
TDEN()93     void TDEN()   {T___();}
TDLY()94     void TDLY()   {T___();}
TDOR()95     void TDOR()   {T___();}
TDRC()96     void TDRC()   {T___();}
TDRL()97     void TDRL()   {T___();}
TDTG()98     void TDTG()   {T___();}
TENC()99     void TENC()   {T___();}
TEXT()100     void TEXT()   {T___();}
TFLT()101     void TFLT()   {T___();}
TIME()102     void TIME()   {T___();}
TIPL()103     void TIPL()   {T___();}
TIT1()104     void TIT1()   {T___();}
TIT2()105     void TIT2()   {T___();}
TIT3()106     void TIT3()   {T___();}
TKEY()107     void TKEY()   {T___();}
TLAN()108     void TLAN()   {T___();}
TLEN()109     void TLEN()   {T___();}
TMCL()110     void TMCL()   {T___();}
TMED()111     void TMED()   {T___();}
TMOO()112     void TMOO()   {T___();}
TOAL()113     void TOAL()   {T___();}
TOFN()114     void TOFN()   {T___();}
TOLY()115     void TOLY()   {T___();}
TOPE()116     void TOPE()   {T___();}
TORY()117     void TORY()   {T___();}
TOWN()118     void TOWN()   {T___();}
TPE1()119     void TPE1()   {T___();}
TPE2()120     void TPE2()   {T___();}
TPE3()121     void TPE3()   {T___();}
TPE4()122     void TPE4()   {T___();}
TPOS()123     void TPOS()   {T___();}
TPRO()124     void TPRO()   {T___();}
TPUB()125     void TPUB()   {T___();}
TRCK()126     void TRCK()   {T___();}
TRDA()127     void TRDA()   {T___();}
TRSN()128     void TRSN()   {T___();}
TRSO()129     void TRSO()   {T___();}
TSIZ()130     void TSIZ()   {T___();}
TSO2()131     void TSO2()   {T___();}
TSOA()132     void TSOA()   {T___();}
TSOC()133     void TSOC()   {T___();}
TSOP()134     void TSOP()   {T___();}
TSOT()135     void TSOT()   {T___();}
TSRC()136     void TSRC()   {T___();}
TSSE()137     void TSSE()   {T___();}
TSST()138     void TSST()   {T___();}
139     void TXXX();
TYER()140     void TYER()   {T___();}
UFID()141     void UFID()   {Skip_XX(Element_Size, "Data");}
USER()142     void USER()   {Skip_XX(Element_Size, "Data");}
143     void USLT();
WCOM()144     void WCOM()   {W___();}
WCOP()145     void WCOP()   {W___();}
WOAF()146     void WOAF()   {W___();}
WOAR()147     void WOAR()   {W___();}
WOAS()148     void WOAS()   {W___();}
WORS()149     void WORS()   {W___();}
WPAY()150     void WPAY()   {W___();}
WPUB()151     void WPUB()   {W___();}
152     void WXXX();
BUF()153     void BUF()    {Skip_XX(Element_Size, "Data");}
CNT()154     void CNT()    {Skip_XX(Element_Size, "Data");}
COM()155     void COM()    {COMM();}
CRA()156     void CRA()    {Skip_XX(Element_Size, "Data");}
CRM()157     void CRM()    {Skip_XX(Element_Size, "Data");}
EQU()158     void EQU()    {Skip_XX(Element_Size, "Data");}
ETC()159     void ETC()    {Skip_XX(Element_Size, "Data");}
GEO()160     void GEO()    {Skip_XX(Element_Size, "Data");}
IPL()161     void IPL()    {Skip_XX(Element_Size, "Data");}
LNK()162     void LNK()    {Skip_XX(Element_Size, "Data");}
MCI()163     void MCI()    {Skip_XX(Element_Size, "Data");}
MLL()164     void MLL()    {Skip_XX(Element_Size, "Data");}
PIC_()165     void PIC_()   {APIC();}
POP()166     void POP()    {Skip_XX(Element_Size, "Data");}
REV()167     void REV()    {Skip_XX(Element_Size, "Data");}
RVA()168     void RVA()    {Skip_XX(Element_Size, "Data");}
SLT()169     void SLT()    {Skip_XX(Element_Size, "Data");}
STC()170     void STC()    {Skip_XX(Element_Size, "Data");}
TAL()171     void TAL()    {T___();}
TBP()172     void TBP()    {T___();}
TCM()173     void TCM()    {T___();}
TCO()174     void TCO()    {T___();}
TCP()175     void TCP()    {Skip_XX(Element_Size, "Data");}
TCR()176     void TCR()    {T___();}
TDA()177     void TDA()    {T___();}
TDY()178     void TDY()    {T___();}
TEN()179     void TEN()    {T___();}
TFT()180     void TFT()    {T___();}
TIM()181     void TIM()    {T___();}
TKE()182     void TKE()    {T___();}
TLA()183     void TLA()    {T___();}
TLE()184     void TLE()    {T___();}
TMT()185     void TMT()    {T___();}
TOA()186     void TOA()    {T___();}
TOF()187     void TOF()    {T___();}
TOL()188     void TOL()    {T___();}
TOR()189     void TOR()    {T___();}
TOT()190     void TOT()    {T___();}
TP1()191     void TP1()    {T___();}
TP2()192     void TP2()    {T___();}
TP3()193     void TP3()    {T___();}
TP4()194     void TP4()    {T___();}
TPA()195     void TPA()    {T___();}
TPB()196     void TPB()    {T___();}
TRC()197     void TRC()    {T___();}
TRD()198     void TRD()    {T___();}
TRK()199     void TRK()    {T___();}
TSI()200     void TSI()    {T___();}
TSS()201     void TSS()    {T___();}
TT1()202     void TT1()    {T___();}
TT2()203     void TT2()    {T___();}
TT3()204     void TT3()    {T___();}
TXT()205     void TXT()    {T___();}
TXX()206     void TXX()    {TXXX();}
TYE()207     void TYE()    {T___();}
UFI()208     void UFI()    {Skip_XX(Element_Size, "Data");}
ULT()209     void ULT()    {USLT();}
WAF()210     void WAF()    {W___();}
WAR()211     void WAR()    {W___();}
WAS()212     void WAS()    {W___();}
WCM()213     void WCM()    {W___();}
WCP()214     void WCP()    {W___();}
WPB()215     void WPB()    {W___();}
WXX()216     void WXX()    {WXXX();}
XRVA()217     void XRVA()   {RVA2();}
218 
219     //Temp
220     ZtringList Element_Values;
221     Ztring Element_Value;
222     Ztring Year, Month, Day, Hour, Minute;
223     stream_t StreamKind;
224     int64u Id3v2_Size;
225     int8u  Id3v2_Version;
226     bool   Unsynchronisation_Global;
227     bool   Unsynchronisation_Frame;
228     bool   DataLengthIndicator;
229 
230     //Helpers
231     void Fill_Name();
232     void Normalize_Date (Ztring& Date);
233 };
234 
235 
236 } //NameSpace
237 
238 #endif
239