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 Matroska files
10 //
11 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
12 
13 //---------------------------------------------------------------------------
14 #ifndef MediaInfo_File_MatroskaH
15 #define MediaInfo_File_MatroskaH
16 //---------------------------------------------------------------------------
17 
18 //---------------------------------------------------------------------------
19 #include "MediaInfo/File__Analyze.h"
20 //---------------------------------------------------------------------------
21 
22 namespace MediaInfoLib
23 {
24 
25 //***************************************************************************
26 // Classe File_Matroska
27 //***************************************************************************
28 
29 class File_Mk : public File__Analyze
30 {
31 protected :
32     //Streams management
33     void Streams_Finish();
34 
35 public :
36     File_Mk();
37     ~File_Mk();
38 
39 private :
40     //Buffer - Synchro
41     bool Synchronize();
42 
43     //Buffer - Global
44     void Read_Buffer_Continue();
45 
46     //Buffer - Global
47     void Read_Buffer_Unsynched();
48     #if MEDIAINFO_SEEK
49     size_t Read_Buffer_Seek (size_t Method, int64u Value, int64u ID);
50     #endif //MEDIAINFO_SEEK
51 
52     //Buffer
53     bool Header_Begin();
54     void Header_Parse();
55     void Data_Parse();
56 
57     //Elements
58     void Zero();
59     void CRC32();
60     void Void();
Ebml()61     void Ebml(){};
Ebml_Version()62     void Ebml_Version(){UInteger_Info();};
63     void Ebml_ReadVersion();
Ebml_MaxIDLength()64     void Ebml_MaxIDLength(){UInteger_Info();};
65     void Ebml_MaxSizeLength();
66     void Ebml_DocType();
67     void Ebml_DocTypeVersion();
68     void Ebml_DocTypeReadVersion();
69     void Rawcooked_BeforeData();
70     void Rawcooked_BeforeData(bool HasMask, bool UseMask=false);
71     void Rawcooked_AfterData();
72     void Rawcooked_AfterData(bool HasMask, bool UseMask=false);
73     void Rawcooked_FileName();
74     void Rawcooked_FileName(bool HasMask, bool UseMask=false);
75     void RawcookedBlock();
RawcookedBlock_BeforeData()76     void RawcookedBlock_BeforeData() { Rawcooked_BeforeData(false); }
RawcookedBlock_AfterData()77     void RawcookedBlock_AfterData() { Rawcooked_AfterData(false); }
78     void RawcookedBlock_FileHash();
RawcookedBlock_FileName()79     void RawcookedBlock_FileName() { Rawcooked_FileName(false); }
RawcookedBlock_MaskAdditionBeforeData()80     void RawcookedBlock_MaskAdditionBeforeData() { Rawcooked_BeforeData(true, true); }
RawcookedBlock_MaskAdditionAfterData()81     void RawcookedBlock_MaskAdditionAfterData() { Rawcooked_AfterData(true, true); }
RawcookedBlock_MaskAdditionFileName()82     void RawcookedBlock_MaskAdditionFileName() { Rawcooked_FileName(true, true); }
83     void RawcookedSegment();
84     void RawcookedSegment_LibraryName();
85     void RawcookedSegment_LibraryVersion();
86     void RawcookedTrack();
RawcookedTrack_BeforeData()87     void RawcookedTrack_BeforeData() { RawcookedBlock_BeforeData(); }
RawcookedTrack_AfterData()88     void RawcookedTrack_AfterData() { RawcookedBlock_AfterData(); }
RawcookedTrack_FileHash()89     void RawcookedTrack_FileHash() { RawcookedBlock_FileHash(); }
RawcookedTrack_FileName()90     void RawcookedTrack_FileName() { RawcookedBlock_FileName(); }
RawcookedTrack_MaskBaseBeforeData()91     void RawcookedTrack_MaskBaseBeforeData() { Rawcooked_BeforeData(true, false); }
RawcookedTrack_MaskBaseAfterData()92     void RawcookedTrack_MaskBaseAfterData() { Rawcooked_AfterData(true, false); }
RawcookedTrack_MaskBaseFileName()93     void RawcookedTrack_MaskBaseFileName() { Rawcooked_FileName(true, false); }
94     void Segment();
95     void Segment_SeekHead();
96     void Segment_SeekHead_Seek();
97     void Segment_SeekHead_Seek_SeekID();
98     void Segment_SeekHead_Seek_SeekPosition();
99     void Segment_Info();
100     void Segment_Info_SegmentUID();
Segment_Info_SegmentFilename()101     void Segment_Info_SegmentFilename(){UTF8_Info();};
Segment_Info_PrevUID()102     void Segment_Info_PrevUID(){UInteger_Info();};
Segment_Info_PrevFilename()103     void Segment_Info_PrevFilename(){UTF8_Info();};
Segment_Info_NextUID()104     void Segment_Info_NextUID(){UInteger_Info();};
Segment_Info_NextFilename()105     void Segment_Info_NextFilename(){UTF8_Info();};
Segment_Info_SegmentFamily()106     void Segment_Info_SegmentFamily(){Skip_XX(Element_Size, "Data");};
Segment_Info_ChapterTranslate()107     void Segment_Info_ChapterTranslate(){};
Segment_Info_ChapterTranslate_ChapterTranslateEditionUID()108     void Segment_Info_ChapterTranslate_ChapterTranslateEditionUID(){UInteger_Info();};
Segment_Info_ChapterTranslate_ChapterTranslateCodec()109     void Segment_Info_ChapterTranslate_ChapterTranslateCodec(){UInteger_Info();};
Segment_Info_ChapterTranslate_ChapterTranslateID()110     void Segment_Info_ChapterTranslate_ChapterTranslateID(){Skip_XX(Element_Size, "Data");};
111     void Segment_Info_TimecodeScale();
112     void Segment_Info_Duration();
113     void Segment_Info_DateUTC();
114     void Segment_Info_Title();
115     void Segment_Info_MuxingApp();
116     void Segment_Info_WritingApp();
117     void Segment_Cluster();
118     void Segment_Cluster_Timecode();
Segment_Cluster_SilentTracks()119     void Segment_Cluster_SilentTracks(){};
Segment_Cluster_SilentTracks_SilentTrackNumber()120     void Segment_Cluster_SilentTracks_SilentTrackNumber(){UInteger_Info();};
Segment_Cluster_Position()121     void Segment_Cluster_Position(){UInteger_Info();};
Segment_Cluster_PrevSize()122     void Segment_Cluster_PrevSize(){UInteger_Info();};
123     void Segment_Cluster_SimpleBlock();
124     void Segment_Cluster_BlockGroup();
125     void Segment_Cluster_BlockGroup_Block();
126     void Segment_Cluster_BlockGroup_Block_Lace();
Segment_Cluster_BlockGroup_BlockVirtual()127     void Segment_Cluster_BlockGroup_BlockVirtual(){Skip_XX(Element_Size, "Data");};
Segment_Cluster_BlockGroup_BlockAdditions()128     void Segment_Cluster_BlockGroup_BlockAdditions(){};
Segment_Cluster_BlockGroup_BlockAdditions_BlockMore()129     void Segment_Cluster_BlockGroup_BlockAdditions_BlockMore(){};
Segment_Cluster_BlockGroup_BlockAdditions_BlockMore_BlockAddID()130     void Segment_Cluster_BlockGroup_BlockAdditions_BlockMore_BlockAddID(){UInteger_Info();};
Segment_Cluster_BlockGroup_BlockAdditions_BlockMore_BlockAdditional()131     void Segment_Cluster_BlockGroup_BlockAdditions_BlockMore_BlockAdditional(){Skip_XX(Element_Size, "Data");};
132     void Segment_Cluster_BlockGroup_BlockDuration();
Segment_Cluster_BlockGroup_ReferencePriority()133     void Segment_Cluster_BlockGroup_ReferencePriority(){UInteger_Info();};
Segment_Cluster_BlockGroup_ReferenceBlock()134     void Segment_Cluster_BlockGroup_ReferenceBlock(){UInteger_Info();};
Segment_Cluster_BlockGroup_ReferenceVirtual()135     void Segment_Cluster_BlockGroup_ReferenceVirtual(){UInteger_Info();};
Segment_Cluster_BlockGroup_CodecState()136     void Segment_Cluster_BlockGroup_CodecState(){Skip_XX(Element_Size, "Data");};
Segment_Cluster_BlockGroup_DiscardPadding()137     void Segment_Cluster_BlockGroup_DiscardPadding(){UInteger_Info();};
Segment_Cluster_BlockGroup_Slices()138     void Segment_Cluster_BlockGroup_Slices(){};
Segment_Cluster_BlockGroup_Slices_TimeSlice()139     void Segment_Cluster_BlockGroup_Slices_TimeSlice(){};
Segment_Cluster_BlockGroup_Slices_TimeSlice_LaceNumber()140     void Segment_Cluster_BlockGroup_Slices_TimeSlice_LaceNumber(){UInteger_Info();};
Segment_Cluster_BlockGroup_Slices_TimeSlice_FrameNumber()141     void Segment_Cluster_BlockGroup_Slices_TimeSlice_FrameNumber(){UInteger_Info();};
Segment_Cluster_BlockGroup_Slices_TimeSlice_BlockAdditionID()142     void Segment_Cluster_BlockGroup_Slices_TimeSlice_BlockAdditionID(){UInteger_Info();};
Segment_Cluster_BlockGroup_Slices_TimeSlice_Delay()143     void Segment_Cluster_BlockGroup_Slices_TimeSlice_Delay(){UInteger_Info();};
Segment_Cluster_BlockGroup_Slices_TimeSlice_SliceDuration()144     void Segment_Cluster_BlockGroup_Slices_TimeSlice_SliceDuration(){UInteger_Info();};
Segment_Cluster_BlockGroup_ReferenceFrame()145     void Segment_Cluster_BlockGroup_ReferenceFrame(){};
Segment_Cluster_BlockGroup_ReferenceFrame_ReferenceOffset()146     void Segment_Cluster_BlockGroup_ReferenceFrame_ReferenceOffset(){UInteger_Info();};
Segment_Cluster_BlockGroup_ReferenceFrame_ReferenceTimeCode()147     void Segment_Cluster_BlockGroup_ReferenceFrame_ReferenceTimeCode(){UInteger_Info();};
Segment_Cluster_EncryptedBlock()148     void Segment_Cluster_EncryptedBlock(){Skip_XX(Element_Size, "Data");};
149     void Segment_Tracks();
150     void Segment_Tracks_TrackEntry();
151     void Segment_Tracks_TrackEntry_TrackNumber();
152     void Segment_Tracks_TrackEntry_TrackUID();
153     void Segment_Tracks_TrackEntry_TrackType();
Segment_Tracks_TrackEntry_FlagEnabled()154     void Segment_Tracks_TrackEntry_FlagEnabled(){UInteger_Info();};
155     void Segment_Tracks_TrackEntry_FlagDefault();
156     void Segment_Tracks_TrackEntry_FlagForced();
Segment_Tracks_TrackEntry_FlagLacing()157     void Segment_Tracks_TrackEntry_FlagLacing(){UInteger_Info();};
Segment_Tracks_TrackEntry_MinCache()158     void Segment_Tracks_TrackEntry_MinCache(){UInteger_Info();};
Segment_Tracks_TrackEntry_MaxCache()159     void Segment_Tracks_TrackEntry_MaxCache(){UInteger_Info();};
160     void Segment_Tracks_TrackEntry_DefaultDuration();
Segment_Tracks_TrackEntry_DefaultDecodedFieldDuration()161     void Segment_Tracks_TrackEntry_DefaultDecodedFieldDuration(){UInteger_Info();};
Segment_Tracks_TrackEntry_TrackTimecodeScale()162     void Segment_Tracks_TrackEntry_TrackTimecodeScale(){Float_Info();};
Segment_Tracks_TrackEntry_TrackOffset()163     void Segment_Tracks_TrackEntry_TrackOffset(){UInteger_Info();};
Segment_Tracks_TrackEntry_MaxBlockAdditionID()164     void Segment_Tracks_TrackEntry_MaxBlockAdditionID(){UInteger_Info();};
165     void Segment_Tracks_TrackEntry_Name();
166     void Segment_Tracks_TrackEntry_Language();
Segment_Tracks_TrackEntry_LanguageIETF()167     void Segment_Tracks_TrackEntry_LanguageIETF(){String_Info();};
168     void Segment_Tracks_TrackEntry_CodecID();
169     void Segment_Tracks_TrackEntry_CodecPrivate();
Segment_Tracks_TrackEntry_CodecName()170     void Segment_Tracks_TrackEntry_CodecName(){UTF8_Info();};
Segment_Tracks_TrackEntry_AttachmentLink()171     void Segment_Tracks_TrackEntry_AttachmentLink(){UInteger_Info();};
Segment_Tracks_TrackEntry_CodecSettings()172     void Segment_Tracks_TrackEntry_CodecSettings(){UTF8_Info();};
Segment_Tracks_TrackEntry_CodecInfoURL()173     void Segment_Tracks_TrackEntry_CodecInfoURL(){String_Info();};
Segment_Tracks_TrackEntry_CodecDownloadURL()174     void Segment_Tracks_TrackEntry_CodecDownloadURL(){String_Info();};
Segment_Tracks_TrackEntry_CodecDecodeAll()175     void Segment_Tracks_TrackEntry_CodecDecodeAll(){UInteger_Info();};
Segment_Tracks_TrackEntry_TrackOverlay()176     void Segment_Tracks_TrackEntry_TrackOverlay(){UInteger_Info();};
Segment_Tracks_TrackEntry_CodecDelay()177     void Segment_Tracks_TrackEntry_CodecDelay(){UInteger_Info();};
Segment_Tracks_TrackEntry_SeekPreRoll()178     void Segment_Tracks_TrackEntry_SeekPreRoll(){UInteger_Info();};
Segment_Tracks_TrackEntry_TrackTranslate()179     void Segment_Tracks_TrackEntry_TrackTranslate(){};
Segment_Tracks_TrackEntry_TrackTranslate_TrackTranslateEditionUID()180     void Segment_Tracks_TrackEntry_TrackTranslate_TrackTranslateEditionUID(){UInteger_Info();};
Segment_Tracks_TrackEntry_TrackTranslate_TrackTranslateCodec()181     void Segment_Tracks_TrackEntry_TrackTranslate_TrackTranslateCodec(){UInteger_Info();};
Segment_Tracks_TrackEntry_TrackTranslate_TrackTranslateTrackID()182     void Segment_Tracks_TrackEntry_TrackTranslate_TrackTranslateTrackID(){Skip_XX(Element_Size, "Data");};
183     void Segment_Tracks_TrackEntry_Video();
Segment_Tracks_TrackEntry_Video_FlagInterlaced()184     void Segment_Tracks_TrackEntry_Video_FlagInterlaced(){UInteger_Info();};
185     void Segment_Tracks_TrackEntry_Video_FieldOrder();
186     void Segment_Tracks_TrackEntry_Video_StereoMode();
Segment_Tracks_TrackEntry_Video_AlphaMode()187     void Segment_Tracks_TrackEntry_Video_AlphaMode(){UInteger_Info();};
188     void Segment_Tracks_TrackEntry_Video_OldStereoMode();
189     void Segment_Tracks_TrackEntry_Video_PixelWidth();
190     void Segment_Tracks_TrackEntry_Video_PixelHeight();
191     void Segment_Tracks_TrackEntry_Video_PixelCropBottom();
192     void Segment_Tracks_TrackEntry_Video_PixelCropTop();
193     void Segment_Tracks_TrackEntry_Video_PixelCropLeft();
194     void Segment_Tracks_TrackEntry_Video_PixelCropRight();
195     void Segment_Tracks_TrackEntry_Video_DisplayWidth();
196     void Segment_Tracks_TrackEntry_Video_DisplayHeight();
Segment_Tracks_TrackEntry_Video_DisplayUnit()197     void Segment_Tracks_TrackEntry_Video_DisplayUnit(){UInteger_Info();};
Segment_Tracks_TrackEntry_Video_AspectRatioType()198     void Segment_Tracks_TrackEntry_Video_AspectRatioType(){UInteger_Info();};
Segment_Tracks_TrackEntry_Video_ColourSpace()199     void Segment_Tracks_TrackEntry_Video_ColourSpace(){Skip_XX(Element_Size, "Data");};
Segment_Tracks_TrackEntry_Video_GammaValue()200     void Segment_Tracks_TrackEntry_Video_GammaValue(){Float_Info();};
201     void Segment_Tracks_TrackEntry_Video_FrameRate();
Segment_Tracks_TrackEntry_Video_Colour()202     void Segment_Tracks_TrackEntry_Video_Colour(){};
203     void Segment_Tracks_TrackEntry_Video_Colour_MatrixCoefficients();
204     void Segment_Tracks_TrackEntry_Video_Colour_BitsPerChannel();
Segment_Tracks_TrackEntry_Video_Colour_ChromaSubsamplingHorz()205     void Segment_Tracks_TrackEntry_Video_Colour_ChromaSubsamplingHorz(){UInteger_Info();};
Segment_Tracks_TrackEntry_Video_Colour_ChromaSubsamplingVert()206     void Segment_Tracks_TrackEntry_Video_Colour_ChromaSubsamplingVert(){UInteger_Info();};
Segment_Tracks_TrackEntry_Video_Colour_CbSubsamplingHorz()207     void Segment_Tracks_TrackEntry_Video_Colour_CbSubsamplingHorz(){UInteger_Info();};
Segment_Tracks_TrackEntry_Video_Colour_CbSubsamplingVert()208     void Segment_Tracks_TrackEntry_Video_Colour_CbSubsamplingVert(){UInteger_Info();};
Segment_Tracks_TrackEntry_Video_Colour_ChromaSitingHorz()209     void Segment_Tracks_TrackEntry_Video_Colour_ChromaSitingHorz(){UInteger_Info();};
Segment_Tracks_TrackEntry_Video_Colour_ChromaSitingVert()210     void Segment_Tracks_TrackEntry_Video_Colour_ChromaSitingVert(){UInteger_Info();};
211     void Segment_Tracks_TrackEntry_Video_Colour_Range();
212     void Segment_Tracks_TrackEntry_Video_Colour_TransferCharacteristics();
213     void Segment_Tracks_TrackEntry_Video_Colour_Primaries();
214     void Segment_Tracks_TrackEntry_Video_Colour_MaxCLL();
215     void Segment_Tracks_TrackEntry_Video_Colour_MaxFALL();
Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata()216     void Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata(){};
Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_PrimaryRChromaticityX()217     void Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_PrimaryRChromaticityX()   {Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_Primary(2*2  );};
Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_PrimaryRChromaticityY()218     void Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_PrimaryRChromaticityY()   {Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_Primary(2*2+1);};
Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_PrimaryGChromaticityX()219     void Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_PrimaryGChromaticityX()   {Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_Primary(0*2  );};
Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_PrimaryGChromaticityY()220     void Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_PrimaryGChromaticityY()   {Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_Primary(0*2+1);};
Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_PrimaryBChromaticityX()221     void Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_PrimaryBChromaticityX()   {Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_Primary(1*2  );};
Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_PrimaryBChromaticityY()222     void Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_PrimaryBChromaticityY()   {Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_Primary(1*2+1);};
Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_WhitePointChromaticityX()223     void Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_WhitePointChromaticityX() {Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_Primary(3*2  );};
Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_WhitePointChromaticityY()224     void Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_WhitePointChromaticityY() {Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_Primary(3*2+1);};
Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_LuminanceMax()225     void Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_LuminanceMax()            {Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_Luminance(1);};
Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_LuminanceMin()226     void Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_LuminanceMin()            {Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_Luminance(0);};
Segment_Tracks_TrackEntry_Video_Projection()227     void Segment_Tracks_TrackEntry_Video_Projection(){};
Segment_Tracks_TrackEntry_Video_Projection_ProjectionType()228     void Segment_Tracks_TrackEntry_Video_Projection_ProjectionType(){UInteger_Info();};
Segment_Tracks_TrackEntry_Video_Projection_ProjectionPrivate()229     void Segment_Tracks_TrackEntry_Video_Projection_ProjectionPrivate(){Skip_XX(Element_Size, "Data");};
Segment_Tracks_TrackEntry_Video_Projection_ProjectionPoseYaw()230     void Segment_Tracks_TrackEntry_Video_Projection_ProjectionPoseYaw(){Float_Info();};
Segment_Tracks_TrackEntry_Video_Projection_ProjectionPosePitch()231     void Segment_Tracks_TrackEntry_Video_Projection_ProjectionPosePitch(){Float_Info();};
Segment_Tracks_TrackEntry_Video_Projection_ProjectionPoseRoll()232     void Segment_Tracks_TrackEntry_Video_Projection_ProjectionPoseRoll(){Float_Info();};
233     void Segment_Tracks_TrackEntry_Audio();
234     void Segment_Tracks_TrackEntry_Audio_SamplingFrequency();
235     void Segment_Tracks_TrackEntry_Audio_OutputSamplingFrequency();
236     void Segment_Tracks_TrackEntry_Audio_Channels();
Segment_Tracks_TrackEntry_Audio_ChannelPositions()237     void Segment_Tracks_TrackEntry_Audio_ChannelPositions(){Skip_XX(Element_Size, "Data");};
238     void Segment_Tracks_TrackEntry_Audio_BitDepth();
Segment_Tracks_TrackEntry_TrackOperation()239     void Segment_Tracks_TrackEntry_TrackOperation(){};
Segment_Tracks_TrackEntry_TrackOperation_TrackCombinePlanes()240     void Segment_Tracks_TrackEntry_TrackOperation_TrackCombinePlanes(){};
Segment_Tracks_TrackEntry_TrackOperation_TrackCombinePlanes_TrackPlane()241     void Segment_Tracks_TrackEntry_TrackOperation_TrackCombinePlanes_TrackPlane(){};
Segment_Tracks_TrackEntry_TrackOperation_TrackCombinePlanes_TrackPlane_TrackPlaneUID()242     void Segment_Tracks_TrackEntry_TrackOperation_TrackCombinePlanes_TrackPlane_TrackPlaneUID(){UInteger_Info();};
Segment_Tracks_TrackEntry_TrackOperation_TrackCombinePlanes_TrackPlane_TrackPlaneType()243     void Segment_Tracks_TrackEntry_TrackOperation_TrackCombinePlanes_TrackPlane_TrackPlaneType(){UInteger_Info();};
Segment_Tracks_TrackEntry_TrackOperation_TrackJoinBlocks()244     void Segment_Tracks_TrackEntry_TrackOperation_TrackJoinBlocks(){};
Segment_Tracks_TrackEntry_TrackOperation_TrackJoinBlocks_TrackJoinUID()245     void Segment_Tracks_TrackEntry_TrackOperation_TrackJoinBlocks_TrackJoinUID(){UInteger_Info();};
Segment_Tracks_TrackEntry_TrickTrackUID()246     void Segment_Tracks_TrackEntry_TrickTrackUID(){UInteger_Info();};
Segment_Tracks_TrackEntry_TrickTrackSegmentUID()247     void Segment_Tracks_TrackEntry_TrickTrackSegmentUID(){UInteger_Info();};
Segment_Tracks_TrackEntry_TrickTrackFlag()248     void Segment_Tracks_TrackEntry_TrickTrackFlag(){UInteger_Info();};
Segment_Tracks_TrackEntry_TrickMasterTrackUID()249     void Segment_Tracks_TrackEntry_TrickMasterTrackUID(){UInteger_Info();};
Segment_Tracks_TrackEntry_TrickMasterTrackSegmentUID()250     void Segment_Tracks_TrackEntry_TrickMasterTrackSegmentUID(){UInteger_Info();};
Segment_Tracks_TrackEntry_BlockAdditionMapping()251     void Segment_Tracks_TrackEntry_BlockAdditionMapping(){};
Segment_Tracks_TrackEntry_BlockAdditionMapping_BlockAddIDName()252     void Segment_Tracks_TrackEntry_BlockAdditionMapping_BlockAddIDName(){UTF8_Info();};
253     void Segment_Tracks_TrackEntry_BlockAdditionMapping_BlockAddIDType();
254     void Segment_Tracks_TrackEntry_BlockAdditionMapping_BlockAddIDExtraData();
Segment_Tracks_TrackEntry_BlockAdditionMapping_BlockAddIDValue()255     void Segment_Tracks_TrackEntry_BlockAdditionMapping_BlockAddIDValue(){UInteger_Info();};
Segment_Tracks_TrackEntry_ContentEncodings()256     void Segment_Tracks_TrackEntry_ContentEncodings(){};
Segment_Tracks_TrackEntry_ContentEncodings_ContentEncoding()257     void Segment_Tracks_TrackEntry_ContentEncodings_ContentEncoding(){};
Segment_Tracks_TrackEntry_ContentEncodings_ContentEncoding_ContentEncodingOrder()258     void Segment_Tracks_TrackEntry_ContentEncodings_ContentEncoding_ContentEncodingOrder(){UInteger_Info();};
Segment_Tracks_TrackEntry_ContentEncodings_ContentEncoding_ContentEncodingScope()259     void Segment_Tracks_TrackEntry_ContentEncodings_ContentEncoding_ContentEncodingScope(){UInteger_Info();};
Segment_Tracks_TrackEntry_ContentEncodings_ContentEncoding_ContentEncodingType()260     void Segment_Tracks_TrackEntry_ContentEncodings_ContentEncoding_ContentEncodingType(){UInteger_Info();};
261     void Segment_Tracks_TrackEntry_ContentEncodings_ContentEncoding_ContentCompression();
262     void Segment_Tracks_TrackEntry_ContentEncodings_ContentEncoding_ContentCompression_ContentCompAlgo();
263     void Segment_Tracks_TrackEntry_ContentEncodings_ContentEncoding_ContentCompression_ContentCompSettings();
Segment_Tracks_TrackEntry_ContentEncodings_ContentEncoding_ContentEncryption()264     void Segment_Tracks_TrackEntry_ContentEncodings_ContentEncoding_ContentEncryption(){};
Segment_Tracks_TrackEntry_ContentEncodings_ContentEncoding_ContentEncryption_ContentEncAlgo()265     void Segment_Tracks_TrackEntry_ContentEncodings_ContentEncoding_ContentEncryption_ContentEncAlgo(){UInteger_Info();};
Segment_Tracks_TrackEntry_ContentEncodings_ContentEncoding_ContentEncryption_ContentEncKeyID()266     void Segment_Tracks_TrackEntry_ContentEncodings_ContentEncoding_ContentEncryption_ContentEncKeyID(){Skip_XX(Element_Size, "Data");};
Segment_Tracks_TrackEntry_ContentEncodings_ContentEncoding_ContentEncryption_ContentSignature()267     void Segment_Tracks_TrackEntry_ContentEncodings_ContentEncoding_ContentEncryption_ContentSignature(){Skip_XX(Element_Size, "Data");};
Segment_Tracks_TrackEntry_ContentEncodings_ContentEncoding_ContentEncryption_ContentSigKeyID()268     void Segment_Tracks_TrackEntry_ContentEncodings_ContentEncoding_ContentEncryption_ContentSigKeyID(){Skip_XX(Element_Size, "Data");};
Segment_Tracks_TrackEntry_ContentEncodings_ContentEncoding_ContentEncryption_ContentSigAlgo()269     void Segment_Tracks_TrackEntry_ContentEncodings_ContentEncoding_ContentEncryption_ContentSigAlgo(){UInteger_Info();};
Segment_Tracks_TrackEntry_ContentEncodings_ContentEncoding_ContentEncryption_ContentSigHashAlgo()270     void Segment_Tracks_TrackEntry_ContentEncodings_ContentEncoding_ContentEncryption_ContentSigHashAlgo(){UInteger_Info();};
271     void Segment_Cues();
272     void Segment_Cues_CuePoint();
Segment_Cues_CuePoint_CueTime()273     void Segment_Cues_CuePoint_CueTime(){UInteger_Info();};
Segment_Cues_CuePoint_CueTrackPositions()274     void Segment_Cues_CuePoint_CueTrackPositions(){};
Segment_Cues_CuePoint_CueTrackPositions_CueTrack()275     void Segment_Cues_CuePoint_CueTrackPositions_CueTrack(){UInteger_Info();};
Segment_Cues_CuePoint_CueTrackPositions_CueClusterPosition()276     void Segment_Cues_CuePoint_CueTrackPositions_CueClusterPosition(){UInteger_Info();};
Segment_Cues_CuePoint_CueTrackPositions_CueRelativePosition()277     void Segment_Cues_CuePoint_CueTrackPositions_CueRelativePosition(){UInteger_Info();};
Segment_Cues_CuePoint_CueTrackPositions_CueDuration()278     void Segment_Cues_CuePoint_CueTrackPositions_CueDuration(){UInteger_Info();};
Segment_Cues_CuePoint_CueTrackPositions_CueBlockNumber()279     void Segment_Cues_CuePoint_CueTrackPositions_CueBlockNumber(){UInteger_Info();};
Segment_Cues_CuePoint_CueTrackPositions_CueCodecState()280     void Segment_Cues_CuePoint_CueTrackPositions_CueCodecState(){UInteger_Info();};
Segment_Cues_CuePoint_CueTrackPositions_CueReference()281     void Segment_Cues_CuePoint_CueTrackPositions_CueReference(){};
Segment_Cues_CuePoint_CueTrackPositions_CueReference_CueRefTime()282     void Segment_Cues_CuePoint_CueTrackPositions_CueReference_CueRefTime(){UInteger_Info();};
Segment_Cues_CuePoint_CueTrackPositions_CueReference_CueRefCluster()283     void Segment_Cues_CuePoint_CueTrackPositions_CueReference_CueRefCluster(){UInteger_Info();};
Segment_Cues_CuePoint_CueTrackPositions_CueReference_CueRefNumber()284     void Segment_Cues_CuePoint_CueTrackPositions_CueReference_CueRefNumber(){UInteger_Info();};
Segment_Cues_CuePoint_CueTrackPositions_CueReference_CueRefCodecState()285     void Segment_Cues_CuePoint_CueTrackPositions_CueReference_CueRefCodecState(){UInteger_Info();};
Segment_Attachments()286     void Segment_Attachments(){};
287     void Segment_Attachments_AttachedFile();
288     void Segment_Attachments_AttachedFile_FileDescription();
289     void Segment_Attachments_AttachedFile_FileName();
290     void Segment_Attachments_AttachedFile_FileMimeType();
291     void Segment_Attachments_AttachedFile_FileData();
Segment_Attachments_AttachedFile_FileUID()292     void Segment_Attachments_AttachedFile_FileUID(){UInteger_Info();};
Segment_Attachments_AttachedFile_FileReferral()293     void Segment_Attachments_AttachedFile_FileReferral(){Skip_XX(Element_Size, "Data");};
Segment_Attachments_AttachedFile_FileUsedStartTime()294     void Segment_Attachments_AttachedFile_FileUsedStartTime(){UInteger_Info();};
Segment_Attachments_AttachedFile_FileUsedEndTime()295     void Segment_Attachments_AttachedFile_FileUsedEndTime(){UInteger_Info();};
Segment_Chapters()296     void Segment_Chapters(){};
297     void Segment_Chapters_EditionEntry();
Segment_Chapters_EditionEntry_EditionUID()298     void Segment_Chapters_EditionEntry_EditionUID(){UInteger_Info();};
Segment_Chapters_EditionEntry_EditionFlagHidden()299     void Segment_Chapters_EditionEntry_EditionFlagHidden(){UInteger_Info();};
Segment_Chapters_EditionEntry_EditionFlagDefault()300     void Segment_Chapters_EditionEntry_EditionFlagDefault(){UInteger_Info();};
Segment_Chapters_EditionEntry_EditionFlagOrdered()301     void Segment_Chapters_EditionEntry_EditionFlagOrdered(){UInteger_Info();};
302     void Segment_Chapters_EditionEntry_ChapterAtom();
Segment_Chapters_EditionEntry_ChapterAtom_ChapterUID()303     void Segment_Chapters_EditionEntry_ChapterAtom_ChapterUID(){UInteger_Info();};
Segment_Chapters_EditionEntry_ChapterAtom_ChapterStringUID()304     void Segment_Chapters_EditionEntry_ChapterAtom_ChapterStringUID(){UTF8_Info();};
305     void Segment_Chapters_EditionEntry_ChapterAtom_ChapterTimeStart();
Segment_Chapters_EditionEntry_ChapterAtom_ChapterTimeEnd()306     void Segment_Chapters_EditionEntry_ChapterAtom_ChapterTimeEnd(){UInteger_Info();};
Segment_Chapters_EditionEntry_ChapterAtom_ChapterFlagHidden()307     void Segment_Chapters_EditionEntry_ChapterAtom_ChapterFlagHidden(){UInteger_Info();};
Segment_Chapters_EditionEntry_ChapterAtom_ChapterFlagEnabled()308     void Segment_Chapters_EditionEntry_ChapterAtom_ChapterFlagEnabled(){UInteger_Info();};
Segment_Chapters_EditionEntry_ChapterAtom_ChapterSegmentUID()309     void Segment_Chapters_EditionEntry_ChapterAtom_ChapterSegmentUID(){UInteger_Info();};
Segment_Chapters_EditionEntry_ChapterAtom_ChapterSegmentEditionUID()310     void Segment_Chapters_EditionEntry_ChapterAtom_ChapterSegmentEditionUID(){UInteger_Info();};
Segment_Chapters_EditionEntry_ChapterAtom_ChapterPhysicalEquiv()311     void Segment_Chapters_EditionEntry_ChapterAtom_ChapterPhysicalEquiv(){UInteger_Info();};
Segment_Chapters_EditionEntry_ChapterAtom_ChapterTrack()312     void Segment_Chapters_EditionEntry_ChapterAtom_ChapterTrack(){};
Segment_Chapters_EditionEntry_ChapterAtom_ChapterTrack_ChapterTrackNumber()313     void Segment_Chapters_EditionEntry_ChapterAtom_ChapterTrack_ChapterTrackNumber(){UInteger_Info();};
314     void Segment_Chapters_EditionEntry_ChapterAtom_ChapterDisplay();
315     void Segment_Chapters_EditionEntry_ChapterAtom_ChapterDisplay_ChapString();
316     void Segment_Chapters_EditionEntry_ChapterAtom_ChapterDisplay_ChapLanguage();
Segment_Chapters_EditionEntry_ChapterAtom_ChapterDisplay_ChapLanguageIETF()317     void Segment_Chapters_EditionEntry_ChapterAtom_ChapterDisplay_ChapLanguageIETF(){String_Info();};
Segment_Chapters_EditionEntry_ChapterAtom_ChapterDisplay_ChapCountry()318     void Segment_Chapters_EditionEntry_ChapterAtom_ChapterDisplay_ChapCountry(){String_Info();};
Segment_Chapters_EditionEntry_ChapterAtom_ChapProcess()319     void Segment_Chapters_EditionEntry_ChapterAtom_ChapProcess(){};
Segment_Chapters_EditionEntry_ChapterAtom_ChapProcess_ChapProcessCodecID()320     void Segment_Chapters_EditionEntry_ChapterAtom_ChapProcess_ChapProcessCodecID(){UInteger_Info();};
Segment_Chapters_EditionEntry_ChapterAtom_ChapProcess_ChapProcessPrivate()321     void Segment_Chapters_EditionEntry_ChapterAtom_ChapProcess_ChapProcessPrivate(){Skip_XX(Element_Size, "Data");};
Segment_Chapters_EditionEntry_ChapterAtom_ChapProcess_ChapProcessCommand()322     void Segment_Chapters_EditionEntry_ChapterAtom_ChapProcess_ChapProcessCommand(){};
Segment_Chapters_EditionEntry_ChapterAtom_ChapProcess_ChapProcessCommand_ChapProcessTime()323     void Segment_Chapters_EditionEntry_ChapterAtom_ChapProcess_ChapProcessCommand_ChapProcessTime(){UInteger_Info();};
Segment_Chapters_EditionEntry_ChapterAtom_ChapProcess_ChapProcessCommand_ChapProcessData()324     void Segment_Chapters_EditionEntry_ChapterAtom_ChapProcess_ChapProcessCommand_ChapProcessData(){Skip_XX(Element_Size, "Data");};
325     void Segment_Tags();
326     void Segment_Tags_Tag();
Segment_Tags_Tag_Targets()327     void Segment_Tags_Tag_Targets(){};
Segment_Tags_Tag_Targets_TargetTypeValue()328     void Segment_Tags_Tag_Targets_TargetTypeValue(){UInteger_Info();};
Segment_Tags_Tag_Targets_TargetType()329     void Segment_Tags_Tag_Targets_TargetType(){String_Info();};
330     void Segment_Tags_Tag_Targets_TagTrackUID();
Segment_Tags_Tag_Targets_TagEditionUID()331     void Segment_Tags_Tag_Targets_TagEditionUID(){UInteger_Info();};
Segment_Tags_Tag_Targets_TagChapterUID()332     void Segment_Tags_Tag_Targets_TagChapterUID(){UInteger_Info();};
Segment_Tags_Tag_Targets_TagAttachmentUID()333     void Segment_Tags_Tag_Targets_TagAttachmentUID(){UInteger_Info();};
Segment_Tags_Tag_SimpleTag()334     void Segment_Tags_Tag_SimpleTag(){};
335     void Segment_Tags_Tag_SimpleTag_TagName();
336     void Segment_Tags_Tag_SimpleTag_TagLanguage();
Segment_Tags_Tag_SimpleTag_TagLanguageIETF()337     void Segment_Tags_Tag_SimpleTag_TagLanguageIETF(){String_Info();};
Segment_Tags_Tag_SimpleTag_TagDefault()338     void Segment_Tags_Tag_SimpleTag_TagDefault(){UInteger_Info();};
339     void Segment_Tags_Tag_SimpleTag_TagString();
Segment_Tags_Tag_SimpleTag_TagBinary()340     void Segment_Tags_Tag_SimpleTag_TagBinary(){Skip_XX(Element_Size, "Data");};
341 
342     struct stream
343     {
344         std::vector<int64u>     TimeCodes;
345         int64u                  TimeCode_Start;
346         int64u                  TrackUID;
347         File__Analyze*          Parser;
348         stream_t                StreamKind;
349         size_t                  StreamPos;
350         size_t                  PacketCount;
351         int32u                  AvgBytesPerSec; //Only used by x_MS/* codecIDs
352         float32                 DisplayAspectRatio;
353         float64                 FrameRate;
354         bool                    Searching_Payload;
355         bool                    Searching_TimeStamps;
356         bool                    Searching_TimeStamp_Start;
357         bool                    Default;
358         bool                    Forced;
359         int64u                  ContentCompAlgo;
360         size_t                  ContentCompSettings_Buffer_Size;
361         int8u*                  ContentCompSettings_Buffer;
362         std::map<std::string, Ztring> Infos;
363         int64u                  TrackDefaultDuration;
364         std::map<int64u, int64u> Segment_Cluster_BlockGroup_BlockDuration_Counts;
365         int64u                  PixelCropBottom;
366         int64u                  PixelCropLeft;
367         int64u                  PixelCropRight;
368         int64u                  PixelCropTop;
369         mastering_metadata_2086      MasteringMetadata;
370         #if MEDIAINFO_TRACE
371             size_t Trace_Segment_Cluster_Block_Count;
372         #endif // MEDIAINFO_TRACE
373 
streamstream374         stream()
375         {
376             TimeCode_Start=(int64u)-1;
377             TrackUID=(int64u)-1;
378             Parser=NULL;
379             StreamKind=Stream_Max;
380             StreamPos=0;
381             PacketCount=0;
382             AvgBytesPerSec=0;
383             DisplayAspectRatio=0;
384             FrameRate=0;
385             Searching_Payload=true;
386             Searching_TimeStamps=false;
387             Searching_TimeStamp_Start=false;
388             Default=true;
389             Forced=false;
390             ContentCompAlgo=(int32u)-1;
391             ContentCompSettings_Buffer_Size=0;
392             ContentCompSettings_Buffer=NULL;
393             TrackDefaultDuration=0;
394             PixelCropBottom=0;
395             PixelCropLeft=0;
396             PixelCropRight=0;
397             PixelCropTop=0;
398             memset(&MasteringMetadata, 0xFF, sizeof(MasteringMetadata));
399             #if MEDIAINFO_TRACE
400                 Trace_Segment_Cluster_Block_Count=0;
401             #endif // MEDIAINFO_TRACE
402         }
403 
~streamstream404         ~stream()
405         {
406             delete Parser; //Parser=NULL;
407             delete[] ContentCompSettings_Buffer; //ContentCompSettings_Buffer=NULL;
408         }
409     };
410     std::map<int64u, stream> Stream;
411     size_t                   Stream_Count;
412 
413     //Data
414     int64u   UInteger_Get();
415     int128u  UInteger16_Get();
416     void     UInteger_Info();
417 
418     float64  Float_Get();
419     void     Float_Info();
420 
421     Ztring   UTF8_Get();
422     void     UTF8_Info();
423 
424     Ztring   String_Get();
425     void     String_Info();
426 
427     //Temp - TrackEntry
428     int8u*   CodecPrivate;
429     size_t   CodecPrivate_Size;
430     void     CodecPrivate_Manage();
431     void     Audio_Manage();
432     Ztring   CodecID;
433     infocodecid_format_t InfoCodecID_Format_Type;
434     void     CodecID_Manage();
435     int64u   TrackType;
436     int64u   AudioBitDepth;
437 
438     //Temp
439     int8u   InvalidByteMax;
440     int64u  Format_Version;
441     int64u  TimecodeScale;
442     float64 Duration;
443     int64u  TrackNumber;
444     int64u  TrackVideoDisplayWidth;
445     int64u  TrackVideoDisplayHeight;
446     int32u  AvgBytesPerSec;
447     int64u  Segment_Cluster_TimeCode_Value;
448     size_t  Segment_Info_Count;
449     size_t  Segment_Tracks_Count;
450     size_t  Segment_Cluster_Count;
451     typedef std::map<Ztring, Ztring> tagspertrack;
452     typedef std::map<int64u, tagspertrack> tags;
453     tags    Segment_Tags_Tag_Items;
454     int64u  Segment_Tags_Tag_Targets_TagTrackUID_Value;
455     bool    CurrentAttachmentIsCover;
456     bool    CoverIsSetFromAttachment;
457     string  AttachedFile_FileName;
458     string  AttachedFile_FileMimeType;
459     string  AttachedFile_FileDescription;
460     int64u  BlockAddIDType;
461     struct crc32
462     {
463         int64u  Pos;
464         int64u  From;
465         int64u  UpTo;
466         int32u  Computed;
467         int32u  Expected;
468     };
469     std::vector<crc32> CRC32Compute;
470     int64u CRC32Compute_SkipUpTo;
471 
472     //Chapters
473     struct chapterdisplay
474     {
475         Ztring ChapLanguage;
476         Ztring ChapString;
477     };
478     struct chapteratom
479     {
480         int64u ChapterTimeStart;
481         std::vector<chapterdisplay> ChapterDisplays;
482 
chapteratomchapteratom483         chapteratom()
484         {
485             ChapterTimeStart=(int64u)-1;
486         }
487     };
488     struct editionentry
489     {
490         std::vector<chapteratom> ChapterAtoms;
491     };
492     std::vector<editionentry> EditionEntries;
493     size_t EditionEntries_Pos;
494     size_t ChapterAtoms_Pos;
495     size_t ChapterDisplays_Pos;
496     int64u              Segment_Offset_Begin;
497     int64u              Segment_Offset_End;
498     int64u              IsParsingSegmentTrack_SeekBackTo;
499     int64u              SegmentTrack_Offset_End;
500     struct seek
501     {
502         int64u SeekID;
503         int64u SeekPosition;
504 
seekseek505         seek()
506             : SeekID(0)
507             , SeekPosition(0)
508         {}
509 
510         bool operator < (const seek &s) const
511         {
512             return SeekPosition < s.SeekPosition;
513         }
514     };
515     std::vector<seek>   Segment_Seeks;
516     size_t              Segment_Seeks_Pos;
517     std::vector<Ztring> Segment_Tag_SimpleTag_TagNames;
518     int64u Segment_Cluster_BlockGroup_BlockDuration_Value;
519     int64u Segment_Cluster_BlockGroup_BlockDuration_TrackNumber;
520     std::vector<int64u> Laces;
521     size_t              Laces_Pos;
522     #if MEDIAINFO_DEMUX
523         int64u              Demux_EventWasSent;
524     #endif //MEDIAINFO_DEMUX
525 
526     //RAWcooked data
527     struct rawcookedtrack
528     {
529         struct mask
530         {
531             int8u*      Buffer;
532             size_t      Size;
533 
534             //mask(); //Init done in rawcookedtrack() in 1 shot
~maskrawcookedtrack::mask535             ~mask()
536             {
537                 delete[] Buffer;
538             }
539         };
540         int64u          FramePos;
541         mask            MaskBaseFileName;
542         mask            MaskBaseBeforeData;
543 
rawcookedtrackrawcookedtrack544         rawcookedtrack()
545         {
546             memset(this, 0x00, sizeof(rawcookedtrack));
547         }
548     };
549     rawcookedtrack RawcookedTrack_Data;
550     const int8u* Rawcooked_Compressed_Save_Buffer;
551     size_t Rawcooked_Compressed_Save_Buffer_Offset;
552     int64u Rawcooked_Compressed_Save_Element_Offset;
553     int64u Rawcooked_Compressed_Save_Element_Size;
554     bool   Trace_Activated_Save;
555     bool Rawcooked_Compressed_Start(rawcookedtrack::mask* Mask=NULL, bool UseMask=false);
556     void Rawcooked_Compressed_End(rawcookedtrack::mask* Mask=NULL, bool UseMask=false);
557 
558     //Hints
559     size_t*                 File_Buffer_Size_Hint_Pointer;
560 
561     //Helpers
562     void Segment_Tracks_TrackEntry_CodecPrivate__Parse();
563     void Segment_Tracks_TrackEntry_CodecPrivate_auds();
564     void Segment_Tracks_TrackEntry_CodecPrivate_auds_ExtensibleWave(int16u BitsPerSample);
565     void Segment_Tracks_TrackEntry_CodecPrivate_vids();
566     void Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_Primary(int8u i);
567     void Segment_Tracks_TrackEntry_Video_Colour_MasteringMetadata_Luminance(int8u i);
568     void JumpTo(int64u GoTo);
569     void TestMultipleInstances(size_t* Instances=NULL);
570     void CRC32_Check();
571     #if MEDIAINFO_TRACE
572         bool CRC32_Check_In_Node(const std::string& ToSearchInInfo, const std::string& info, element_details::Element_Node *node);
573         size_t Trace_Segment_Cluster_Count;
574         size_t Trace_Segment_Cues_CuePoint_Count;
575         size_t Trace_Segment_SeekHead_Seek_Count;
576     #endif // MEDIAINFO_TRACE
577 };
578 
579 } //NameSpace
580 
581 #endif
582 
583