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 // Pre-compilation
9 #include "MediaInfo/PreComp.h"
10 #ifdef __BORLANDC__
11     #pragma hdrstop
12 #endif
13 //---------------------------------------------------------------------------
14 
15 //---------------------------------------------------------------------------
16 #include "MediaInfo/Setup.h"
17 //---------------------------------------------------------------------------
18 
19 //---------------------------------------------------------------------------
20 #if MEDIAINFO_IBI
21 //---------------------------------------------------------------------------
22 
23 //---------------------------------------------------------------------------
24 #include "MediaInfo/Multiple/File_Ibi.h"
25 #include "MediaInfo/MediaInfo_Config_MediaInfo.h"
26 #include <zlib.h>
27 //---------------------------------------------------------------------------
28 
29 namespace MediaInfoLib
30 {
31 
32 //***************************************************************************
33 // Constructor/Destructor
34 //***************************************************************************
35 
36 //---------------------------------------------------------------------------
File_Ibi()37 File_Ibi::File_Ibi()
38 :File__Analyze()
39 {
40     //Configuration
41     #if MEDIAINFO_DEMUX
42         Demux_Level=2; //Container
43     #endif //MEDIAINFO_DEMUX
44     DataMustAlwaysBeComplete=false;
45 
46     #if MEDIAINFO_IBIUSAGE
47         //In
48         Ibi=NULL;
49 
50         //Temp
51         Ibi_MustDelete=false;
52     #endif //MEDIAINFO_IBIUSAGE
53 }
54 
55 //---------------------------------------------------------------------------
~File_Ibi()56 File_Ibi::~File_Ibi()
57 {
58     #if MEDIAINFO_IBIUSAGE
59         if (Ibi_MustDelete)
60             delete Ibi; //Ibi=NULL;
61     #endif //MEDIAINFO_IBIUSAGE
62 }
63 
64 //***************************************************************************
65 // Get information
66 //***************************************************************************
67 
68 //---------------------------------------------------------------------------
69 #if MEDIAINFO_IBIUSAGE
Get(stream_t,size_t,const Ztring & Parameter,info_t,info_t)70 const Ztring &File_Ibi::Get (stream_t /*StreamKind*/, size_t /*StreamNumber*/, const Ztring &Parameter, info_t /*KindOfInfo*/, info_t /*KindOfSearch*/)
71 {
72     ibi::streams::iterator IbiStream_Temp=Ibi->Streams.begin(); //TODO: management of multiple streams
73     if (IbiStream_Temp!=Ibi->Streams.end() && !IbiStream_Temp->second->Infos.empty())
74     {
75         int64u FrameNumber=Parameter.To_int64u();
76 
77         for (size_t Pos=0; Pos<IbiStream_Temp->second->Infos.size()-1; Pos++)
78             if (IbiStream_Temp->second->Infos[Pos].FrameNumber==FrameNumber || IbiStream_Temp->second->Infos[Pos+1].FrameNumber>FrameNumber)
79             {
80                 Get_Temp=__T("StreamOffset=")+Ztring::ToZtring(IbiStream_Temp->second->Infos[Pos].StreamOffset)
81                        + __T(" / FrameNumber=")+Ztring::ToZtring(IbiStream_Temp->second->Infos[Pos].FrameNumber)
82                        + __T(" / Dts=")+Ztring::ToZtring(IbiStream_Temp->second->Infos[Pos].Dts);
83                 return Get_Temp;
84             }
85     }
86 
87     //Can not be found
88     Get_Temp.clear();
89     return Get_Temp;
90 }
91 #endif //MEDIAINFO_IBIUSAGE
92 
93 //***************************************************************************
94 // Streams management
95 //***************************************************************************
96 
97 //---------------------------------------------------------------------------
Streams_Accept()98 void File_Ibi::Streams_Accept()
99 {
100     Fill(Stream_General, 0, General_Format, "Ibi");
101 
102     #if MEDIAINFO_IBIUSAGE
103         if (Ibi==NULL)
104         {
105             Ibi=new ibi();
106             Ibi_MustDelete=true;
107         }
108     #endif //MEDIAINFO_IBIUSAGE
109 }
110 
111 //---------------------------------------------------------------------------
112 #if MEDIAINFO_IBIUSAGE
Streams_Finish()113 void File_Ibi::Streams_Finish()
114 {
115     Config->File_KeepInfo_Set(true); //In order to let Get() available
116 
117     if (Count_Get(Stream_Video)==0) //If not yet done by Inform part
118         for (ibi::streams::iterator IbiStream_Temp=Ibi->Streams.begin(); IbiStream_Temp!=Ibi->Streams.end(); ++IbiStream_Temp)
119         {
120             Stream_Prepare(Stream_Video);
121             Fill(Stream_Video, StreamPos_Last, General_ID, IbiStream_Temp->first);
122         }
123 }
124 #endif //MEDIAINFO_IBIUSAGE
125 
126 //***************************************************************************
127 // Buffer
128 //***************************************************************************
129 
130 //---------------------------------------------------------------------------
Header_Parse()131 void File_Ibi::Header_Parse()
132 {
133     //Test of zero padding
134     int8u Null;
135     Peek_B1(Null);
136     if (Null==0x00)
137     {
138         if (Buffer_Offset_Temp==0)
139             Buffer_Offset_Temp=Buffer_Offset+1;
140 
141         while (Buffer_Offset_Temp<Buffer_Size)
142         {
143             if (Buffer[Buffer_Offset_Temp])
144                 break;
145             Buffer_Offset_Temp++;
146         }
147         if (Buffer_Offset_Temp>=Buffer_Size)
148         {
149             Element_WaitForMoreData();
150             return;
151         }
152 
153         Header_Fill_Code((int32u)-1); //Should be (int64u)-1 but Borland C++ does not like this
154         Header_Fill_Size(Buffer_Offset_Temp-Buffer_Offset);
155         Buffer_Offset_Temp=0;
156 
157         return;
158     }
159 
160     //Parsing
161     int64u Name, Size;
162     Get_EB (Name,                                               "Name");
163     Get_EB (Size,                                               "Size");
164 
165     //Filling
166     Header_Fill_Code(Name, Ztring().From_Number(Name, 16));
167     Header_Fill_Size(Element_Offset+Size);
168 }
169 
170 //---------------------------------------------------------------------------
171 namespace Elements
172 {
173     //Common
174     const int64u Zero=(int32u)-1; //Should be (int64u)-1 but Borland C++ does not like this
175     const int64u CRC32=0x3F;
176     const int64u Void=0x6C;
177 
178     //EBML
179     const int64u Ebml=0xA45DFA3;
180     const int64u Ebml_Version=0x286;
181     const int64u Ebml_ReadVersion=0x2F7;
182     const int64u Ebml_MaxIDLength=0x2F2;
183     const int64u Ebml_MaxSizeLength=0x2F3;
184     const int64u Ebml_DocType=0x282;
185     const int64u Ebml_DocTypeVersion=0x287;
186     const int64u Ebml_DocTypeReadVersion=0x285;
187 
188     //Segment
189     const int64u Stream=1;
190     const int64u Stream_Header=1;
191     const int64u Stream_ByteOffset=2;
192     const int64u Stream_FrameNumber=3;
193     const int64u Stream_Dts=4;
194     const int64u CompressedIndex=2;
195     const int64u WritingApplication=3;
196     const int64u WritingApplication_Name=1;
197     const int64u WritingApplication_Version=2;
198     const int64u InformData=4;
199     const int64u SourceInfo=5;
200     const int64u SourceInfo_IndexCreationDate=1;
201     const int64u SourceInfo_SourceModificationDate=2;
202     const int64u SourceInfo_SourceSize=3;
203 }
204 
205 //---------------------------------------------------------------------------
Data_Parse()206 void File_Ibi::Data_Parse()
207 {
208     #define LIS2(_ATOM, _NAME) \
209         case Elements::_ATOM : \
210                 if (Level==Element_Level) \
211                 { \
212                     Element_Name(_NAME); \
213                     _ATOM(); \
214                     Element_ThisIsAList(); \
215                 } \
216 
217     #define ATO2(_ATOM, _NAME) \
218                 case Elements::_ATOM : \
219                         if (Level==Element_Level) \
220                         { \
221                             if (Element_IsComplete_Get()) \
222                             { \
223                                 Element_Name(_NAME); \
224                                 _ATOM(); \
225                             } \
226                             else \
227                             { \
228                                 Element_WaitForMoreData(); \
229                                 return; \
230                             } \
231                         } \
232                         break; \
233 
234     #define ATOM_END_MK \
235         ATOM(Zero) \
236         ATOM(CRC32) \
237         ATOM(Void) \
238         ATOM_END
239 
240     //Parsing
241     DATA_BEGIN
242     LIST(Ebml)
243         ATOM_BEGIN
244         ATOM(Ebml_Version)
245         ATOM(Ebml_ReadVersion)
246         ATOM(Ebml_MaxIDLength)
247         ATOM(Ebml_MaxSizeLength)
248         ATOM(Ebml_DocType)
249         ATOM(Ebml_DocTypeVersion)
250         ATOM(Ebml_DocTypeReadVersion)
251         ATOM_END_MK
252     LIST(Stream)
253         ATOM_BEGIN
254             ATOM(Stream_Header)
255             ATOM(Stream_ByteOffset)
256             ATOM(Stream_FrameNumber)
257             ATOM(Stream_Dts)
258         ATOM_END_MK
259     ATOM(CompressedIndex)
260     LIST(WritingApplication)
261         ATOM_BEGIN
262             ATOM(WritingApplication_Name)
263             ATOM(WritingApplication_Version)
264         ATOM_END_MK
265     LIST(SourceInfo)
266         ATOM_BEGIN
267             ATOM(SourceInfo_IndexCreationDate)
268             ATOM(SourceInfo_SourceModificationDate)
269             ATOM(SourceInfo_SourceSize)
270         ATOM_END_MK
271     ATOM(InformData)
272     DATA_END_DEFAULT
273 }
274 
275 //***************************************************************************
276 // Elements
277 //***************************************************************************
278 
279 //---------------------------------------------------------------------------
Zero()280 void File_Ibi::Zero()
281 {
282     Element_Name("ZeroPadding");
283 }
284 
285 //---------------------------------------------------------------------------
CRC32()286 void File_Ibi::CRC32()
287 {
288     Element_Name("CRC32");
289 
290     //Parsing
291     UInteger_Info();
292 }
293 
294 //---------------------------------------------------------------------------
Void()295 void File_Ibi::Void()
296 {
297     Element_Name("Void");
298 
299     //Parsing
300     UInteger_Info();
301 }
302 
303 //---------------------------------------------------------------------------
Ebml()304 void File_Ibi::Ebml()
305 {
306     Element_Name("Ebml");
307 }
308 
309 //---------------------------------------------------------------------------
Ebml_Version()310 void File_Ibi::Ebml_Version()
311 {
312     Element_Name("Version");
313 
314     //Parsing
315     UInteger_Info();
316 }
317 
318 //---------------------------------------------------------------------------
Ebml_ReadVersion()319 void File_Ibi::Ebml_ReadVersion()
320 {
321     Element_Name("ReadVersion");
322 
323     //Parsing
324     UInteger_Info();
325 }
326 
327 //---------------------------------------------------------------------------
Ebml_MaxIDLength()328 void File_Ibi::Ebml_MaxIDLength()
329 {
330     Element_Name("MaxIDLength");
331 
332     //Parsing
333     UInteger_Info();
334 }
335 
336 //---------------------------------------------------------------------------
Ebml_MaxSizeLength()337 void File_Ibi::Ebml_MaxSizeLength()
338 {
339     Element_Name("MaxSizeLength");
340 
341     //Parsing
342     UInteger_Info();
343 }
344 
345 //---------------------------------------------------------------------------
Ebml_DocType()346 void File_Ibi::Ebml_DocType()
347 {
348     Element_Name("DocType");
349 
350     //Parsing
351     Ztring Data;
352     Get_UTF8(Element_Size, Data,                                "Data"); Element_Info1(Data);
353 
354     //Filling
355     FILLING_BEGIN();
356 
357         if (Data==__T("MediaInfo Index"))
358             Accept("Ibi");
359         else
360         {
361             Reject("Ibi");
362             return;
363         }
364     FILLING_END();
365 }
366 
367 //---------------------------------------------------------------------------
Ebml_DocTypeVersion()368 void File_Ibi::Ebml_DocTypeVersion()
369 {
370     Element_Name("DocTypeVersion");
371 
372     //Parsing
373     UInteger_Info();
374 }
375 
376 //---------------------------------------------------------------------------
Ebml_DocTypeReadVersion()377 void File_Ibi::Ebml_DocTypeReadVersion()
378 {
379     Element_Name("DocTypeReadVersion");
380 
381     //Parsing
382     UInteger_Info();
383 }
384 
385 //---------------------------------------------------------------------------
Stream()386 void File_Ibi::Stream()
387 {
388     Element_Name("Stream");
389 
390     ID_Current=(int64u)-1;
391 }
392 
Stream_Header()393 void File_Ibi::Stream_Header()
394 {
395     Element_Name("Stream Header");
396     Get_EB (ID_Current,                                         "ID");
397 
398     FILLING_BEGIN();
399         #if MEDIAINFO_IBIUSAGE
400         if (Ibi)
401         {
402             //Filling information for ID after data
403             ibi::streams::iterator IbiStream_Temp=Ibi->Streams.find((int64u)-1);
404             if (IbiStream_Temp!=Ibi->Streams.end())
405             {
406                 Ibi->Streams[ID_Current]=IbiStream_Temp->second;
407                 Ibi->Streams.erase(IbiStream_Temp);
408             }
409         }
410         #else //MEDIAINFO_IBIUSAGE
411             Stream_Prepare(Stream_Video);
412             Fill(Stream_Video, StreamPos_Last, General_ID, ID_Current);
413         #endif //MEDIAINFO_IBIUSAGE
414     FILLING_END();
415 }
416 
Stream_ByteOffset()417 void File_Ibi::Stream_ByteOffset()
418 {
419     Element_Name("Byte Offset");
420 
421     //Parsing
422     #if MEDIAINFO_IBIUSAGE
423     size_t Pos=0;
424     #endif //MEDIAINFO_IBIUSAGE
425     int64u Offset=0;
426     while (Element_Offset<Element_Size)
427     {
428         int64u Item;
429         Get_EB (Item,                                           "Item");
430         Offset+=Item;
431         #if MEDIAINFO_IBIUSAGE
432         Param_Info1(Pos);
433         #endif //MEDIAINFO_IBIUSAGE
434         Param_Info1(Get_Hex_ID(Offset));
435 
436         #if MEDIAINFO_IBIUSAGE
437         FILLING_BEGIN();
438             if (Ibi)
439             {
440                 //Filling information for ID after data
441                 if (Ibi->Streams[ID_Current]==NULL)
442                     Ibi->Streams[ID_Current]=new ibi::stream();
443                 if (Pos>=Ibi->Streams[ID_Current]->Infos.size())
444                 {
445                     Ibi->Streams[ID_Current]->Infos.push_back(ibi::stream::info());
446                     Ibi->Streams[ID_Current]->Infos[Pos].IsContinuous=true; //default
447                 }
448                 Ibi->Streams[ID_Current]->Infos[Pos].StreamOffset=Offset;
449                 Pos++;
450             }
451         FILLING_END();
452         #endif //MEDIAINFO_IBIUSAGE
453     }
454 }
455 
Stream_FrameNumber()456 void File_Ibi::Stream_FrameNumber()
457 {
458     Element_Name("Frame Number");
459 
460     //Parsing
461     #if MEDIAINFO_IBIUSAGE
462     size_t Pos=0;
463     #endif //MEDIAINFO_IBIUSAGE
464     int64u Offset=0;
465     while (Element_Offset<Element_Size)
466     {
467         int64u Item;
468         Get_EB (Item,                                           "Item");
469         Offset+=Item;
470         #if MEDIAINFO_IBIUSAGE
471         Param_Info1(Pos);
472         #endif //MEDIAINFO_IBIUSAGE
473         Param_Info1(Get_Hex_ID(Offset));
474 
475         #if MEDIAINFO_IBIUSAGE
476         FILLING_BEGIN();
477             if (Ibi)
478             {
479                 //Filling information for ID after data
480                 if (Ibi->Streams[ID_Current]==NULL)
481                     Ibi->Streams[ID_Current]=new ibi::stream();
482                 if (Pos>=Ibi->Streams[ID_Current]->Infos.size())
483                 {
484                     Ibi->Streams[ID_Current]->Infos.push_back(ibi::stream::info());
485                     Ibi->Streams[ID_Current]->Infos[Pos].IsContinuous=true; //default
486                 }
487                 Ibi->Streams[ID_Current]->Infos[Pos].FrameNumber=Offset;
488                 Pos++;
489             }
490         FILLING_END();
491         #endif //MEDIAINFO_IBIUSAGE
492     }
493 }
494 
Stream_Dts()495 void File_Ibi::Stream_Dts()
496 {
497     Element_Name("DTS");
498 
499     //Parsing
500     int64u Item;
501     Get_EB (Item,                                               "DtsFrequencyNumerator");
502     #if MEDIAINFO_IBIUSAGE
503     FILLING_BEGIN();
504         if (Ibi)
505             Ibi->Streams[ID_Current]->DtsFrequencyNumerator=Item;
506     FILLING_END();
507     #endif //MEDIAINFO_IBIUSAGE
508     Get_EB (Item,                                               "DtsFrequencyDenominator");
509     #if MEDIAINFO_IBIUSAGE
510     FILLING_BEGIN();
511         if (Ibi)
512         {
513             Ibi->Streams[ID_Current]->DtsFrequencyDenominator=Item;
514 
515             //Handling of previous inverted Numerator/Denominator
516             if (Ibi->Streams[ID_Current]->DtsFrequencyNumerator<Ibi->Streams[ID_Current]->DtsFrequencyDenominator)
517                 std::swap(Ibi->Streams[ID_Current]->DtsFrequencyNumerator, Ibi->Streams[ID_Current]->DtsFrequencyDenominator);
518         }
519     FILLING_END();
520     #endif //MEDIAINFO_IBIUSAGE
521 
522     #if MEDIAINFO_IBIUSAGE
523     size_t Pos=0;
524     #endif //MEDIAINFO_IBIUSAGE
525     int64u Offset=0;
526     while (Element_Offset<Element_Size)
527     {
528         int64u Item;
529         Get_EB (Item,                                           "Item");
530         Offset+=Item;
531         #if MEDIAINFO_IBIUSAGE
532         Param_Info1(Pos);
533         #endif //MEDIAINFO_IBIUSAGE
534         Param_Info1(Get_Hex_ID(Offset));
535 
536         #if MEDIAINFO_IBIUSAGE
537         FILLING_BEGIN();
538             if (Ibi)
539             {
540                 //Filling information for ID after data
541                 if (Ibi->Streams[ID_Current]==NULL)
542                     Ibi->Streams[ID_Current]=new ibi::stream();
543                 if (Pos>=Ibi->Streams[ID_Current]->Infos.size())
544                 {
545                     Ibi->Streams[ID_Current]->Infos.push_back(ibi::stream::info());
546                     Ibi->Streams[ID_Current]->Infos[Pos].IsContinuous=true; //default
547                 }
548                 Ibi->Streams[ID_Current]->Infos[Pos].Dts=Offset;
549                 Pos++;
550             }
551         FILLING_END();
552         #endif //MEDIAINFO_IBIUSAGE
553     }
554 }
555 
CompressedIndex()556 void File_Ibi::CompressedIndex()
557 {
558     if (!Status[IsAccepted])
559     {
560         Reject("Ibi");
561         return;
562     }
563 
564     Element_Name("Compressed Index");
565     int64u UncompressedSize;
566     Get_EB (UncompressedSize,                                   "Uncompressed size");
567 
568     //Sizes
569     unsigned long Source_Size=(unsigned long)(Element_Size-Element_Offset);
570     unsigned long Dest_Size=(unsigned long)UncompressedSize;
571     if (Dest_Size>=64*1024*1024)
572     {
573         Reject("Ibi");
574         return;
575     }
576 
577     //Uncompressing
578     int8u* Dest;
579     {
580         Dest=new int8u[Dest_Size];
581     }
582     if (uncompress((Bytef*)Dest, &Dest_Size, (const Bytef*)Buffer+Buffer_Offset+(size_t)Element_Offset, Source_Size)<0)
583     {
584         Skip_XX(Element_Size-Element_Offset,                    "Problem during the decompression");
585         delete[] Dest; //Dest=NULL;
586         return;
587     }
588 
589     //Exiting this element
590     Skip_XX(Element_Size-Element_Offset,                        "Will be parsed");
591 
592     //Configuring buffer
593     const int8u* Buffer_Sav=Buffer;
594     size_t Buffer_Size_Sav=Buffer_Size;
595     int8u* Buffer_Temp_Sav=Buffer_Temp;
596     size_t Buffer_Temp_Size_Sav=Buffer_Temp_Size;
597     size_t Buffer_Offset_Sav=Buffer_Offset;
598     size_t Buffer_Offset_Temp_Sav=Buffer_Offset_Temp;
599     Buffer=NULL;
600     Buffer_Size=0;
601     Buffer_Temp=NULL;
602     Buffer_Temp_Size=0;
603     Buffer_Offset=0;
604     Buffer_Offset_Temp=0;
605 
606     //Configuring level
607     std::vector<int64u> Element_Sizes_Sav;
608     size_t Element_Level_Sav=Element_Level;
609     while(Element_Level)
610     {
611         Element_Sizes_Sav.push_back(Element_TotalSize_Get());
612         Element_End0();
613     }
614 
615     //Configuring file size
616     int64u File_Size_Sav=File_Size;
617     if (File_Size<File_Offset+Buffer_Offset+Element_Offset+Dest_Size)
618         File_Size=File_Offset+Buffer_Offset+Element_Offset+Dest_Size;
619     Element_Level++;
620     Header_Fill_Size(File_Size);
621     Element_Level--;
622 
623     //Parsing
624     Buffer=Dest;
625     Buffer_Size=Dest_Size;
626     while (Open_Buffer_Continue_Loop());
627     delete[] Dest; //Dest=NULL;
628 
629     //Resetting file size
630     File_Size=File_Size_Sav;
631     while(Element_Level)
632         Element_End0();
633     Element_Level++;
634     Header_Fill_Size(File_Size);
635     Element_Level--;
636 
637     //Configuring level
638     while(Element_Level<Element_Level_Sav)
639     {
640         Element_Begin0();
641         Element_Begin0();
642         Header_Fill_Size(Element_Sizes_Sav[0]);
643         Element_End0();
644     }
645 
646     //Resetting buffer
647     Buffer=Buffer_Sav;
648     Buffer_Size=Buffer_Size_Sav;
649     Buffer_Temp=Buffer_Temp_Sav;
650     Buffer_Temp_Size=Buffer_Temp_Size_Sav;
651     Buffer_Offset=Buffer_Offset_Sav;
652     Buffer_Offset_Temp=Buffer_Offset_Temp_Sav;
653 }
654 
655 //---------------------------------------------------------------------------
WritingApplication()656 void File_Ibi::WritingApplication()
657 {
658     Element_Name("WritingApplication");
659 }
660 
661 //---------------------------------------------------------------------------
WritingApplication_Name()662 void File_Ibi::WritingApplication_Name()
663 {
664     Element_Name("Name");
665 
666     //Parsing
667     Skip_UTF8(Element_Size,                                     "Data");
668 }
669 
670 //---------------------------------------------------------------------------
WritingApplication_Version()671 void File_Ibi::WritingApplication_Version()
672 {
673     Element_Name("Version");
674 
675     //Parsing
676     Skip_UTF8(Element_Size,                                     "Data");
677 }
678 
679 //---------------------------------------------------------------------------
SourceInfo()680 void File_Ibi::SourceInfo()
681 {
682     Element_Name("Source Information");
683 }
684 
685 //---------------------------------------------------------------------------
SourceInfo_IndexCreationDate()686 void File_Ibi::SourceInfo_IndexCreationDate()
687 {
688     Element_Name("Index Creation Date");
689 
690     //Parsing
691     Skip_B8(                                                    "Data");
692 }
693 
694 //---------------------------------------------------------------------------
SourceInfo_SourceModificationDate()695 void File_Ibi::SourceInfo_SourceModificationDate()
696 {
697     Element_Name("Source Modification Date");
698 
699     //Parsing
700     Skip_B8(                                                    "Data");
701 }
702 
703 //---------------------------------------------------------------------------
SourceInfo_SourceSize()704 void File_Ibi::SourceInfo_SourceSize()
705 {
706     Element_Name("Source Size");
707 
708     //Parsing
709     Skip_B8(                                                    "Data");
710 }
711 
712 //---------------------------------------------------------------------------
InformData()713 void File_Ibi::InformData()
714 {
715     Element_Name("InformData");
716 
717     //Parsing
718     Ztring InformData_FromFile;
719     Get_UTF8 (Element_Size, InformData_FromFile,                "Data");
720 
721     //Filling
722     #if MEDIAINFO_IBIUSAGE
723     if (Config->Ibi_UseIbiInfoIfAvailable_Get())
724     {
725         ZtringListList Fields(InformData_FromFile);
726         for (size_t Pos=0; Pos<Fields.size(); Pos++)
727         {
728             if (Pos==0 || Fields[Pos].size()<2)
729             {
730                 if (Pos)
731                     Pos++;
732                 if (Pos>Fields.size() || Fields[Pos].size()<1)
733                     break; //End or problem
734 
735                 if (Fields[Pos][0]==__T("General"))
736                     ; //Nothing to do
737                 else if (Fields[Pos][0]==__T("Video"))
738                     Stream_Prepare(Stream_Video);
739                 else if (Fields[Pos][0]==__T("Audio"))
740                     Stream_Prepare(Stream_Audio);
741                 else if (Fields[Pos][0]==__T("Text"))
742                     Stream_Prepare(Stream_Text);
743                 else if (Fields[Pos][0]==__T("Other"))
744                     Stream_Prepare(Stream_Other);
745                 else if (Fields[Pos][0]==__T("Image"))
746                     Stream_Prepare(Stream_Image);
747                 else if (Fields[Pos][0]==__T("Menu"))
748                     Stream_Prepare(Stream_Menu);
749                 else
750                     break; //Problem
751                 Pos++;
752             }
753 
754             Fill(StreamKind_Last, StreamPos_Last, Fields[Pos][0].To_UTF8().c_str(), Fields[Pos][1], true);
755             Fill_SetOptions(StreamKind_Last, StreamPos_Last, Fields[Pos][0].To_UTF8().c_str(), Fields[Pos][Info_Options].To_UTF8().c_str());
756         }
757     }
758     #endif //MEDIAINFO_IBIUSAGE
759 }
760 
761 //***************************************************************************
762 // Data
763 //***************************************************************************
764 
765 //---------------------------------------------------------------------------
UInteger_Info()766 void File_Ibi::UInteger_Info()
767 {
768     switch (Element_Size)
769     {
770         case 1 :
771                 {
772                     Info_B1(Data,                               "Data"); Element_Info1(Data);
773                     return;
774                 }
775         case 2 :
776                 {
777                     Info_B2(Data,                               "Data"); Element_Info1(Data);
778                     return;
779                 }
780         case 3 :
781                 {
782                     Info_B3(Data,                               "Data"); Element_Info1(Data);
783                     return;
784                 }
785         case 4 :
786                 {
787                     Info_B4(Data,                               "Data"); Element_Info1(Data);
788                     return;
789                 }
790         case 5 :
791                 {
792                     Info_B5(Data,                               "Data"); Element_Info1(Data);
793                     return;
794                 }
795         case 6 :
796                 {
797                     Info_B6(Data,                               "Data"); Element_Info1(Data);
798                     return;
799                 }
800         case 7 :
801                 {
802                     Info_B7(Data,                               "Data"); Element_Info1(Data);
803                     return;
804                 }
805         case 8 :
806                 {
807                     Info_B8(Data,                               "Data"); Element_Info1(Data);
808                     return;
809                 }
810         case 16:
811                 {
812                     Info_B16(Data,                              "Data"); Element_Info1(Data);
813                     return;
814                 }
815         default : Skip_XX(Element_Size,                         "Data");
816     }
817 }
818 
819 //---------------------------------------------------------------------------
UInteger_Get()820 int64u File_Ibi::UInteger_Get()
821 {
822     switch (Element_Size)
823     {
824         case 1 :
825                 {
826                     int8u Data;
827                     Get_B1 (Data,                               "Data"); Element_Info1(Data);
828                     return Data;
829                 }
830         case 2 :
831                 {
832                     int16u Data;
833                     Get_B2 (Data,                               "Data"); Element_Info1(Data);
834                     return Data;
835                 }
836         case 3 :
837                 {
838                     int32u Data;
839                     Get_B3 (Data,                               "Data"); Element_Info1(Data);
840                     return Data;
841                 }
842         case 4 :
843                 {
844                     int32u Data;
845                     Get_B4 (Data,                               "Data"); Element_Info1(Data);
846                     return Data;
847                 }
848         case 5 :
849                 {
850                     int64u Data;
851                     Get_B5 (Data,                               "Data"); Element_Info1(Data);
852                     return Data;
853                 }
854         case 6 :
855                 {
856                     int64u Data;
857                     Get_B6 (Data,                               "Data"); Element_Info1(Data);
858                     return Data;
859                 }
860         case 7 :
861                 {
862                     int64u Data;
863                     Get_B7 (Data,                               "Data"); Element_Info1(Data);
864                     return Data;
865                 }
866         case 8 :
867                 {
868                     int64u Data;
869                     Get_B8 (Data,                               "Data"); Element_Info1(Data);
870                     return Data;
871                 }
872         default :   Skip_XX(Element_Size,                       "Data");
873                     return 0;
874     }
875 }
876 
877 //---------------------------------------------------------------------------
UInteger16_Get()878 int128u File_Ibi::UInteger16_Get()
879 {
880     switch (Element_Size)
881     {
882         case 1 :
883                 {
884                     int8u Data;
885                     Get_B1 (Data,                               "Data"); Element_Info1(Data);
886                     return Data;
887                 }
888         case 2 :
889                 {
890                     int16u Data;
891                     Get_B2 (Data,                               "Data"); Element_Info1(Data);
892                     return Data;
893                 }
894         case 3 :
895                 {
896                     int32u Data;
897                     Get_B3 (Data,                               "Data"); Element_Info1(Data);
898                     return Data;
899                 }
900         case 4 :
901                 {
902                     int32u Data;
903                     Get_B4 (Data,                               "Data"); Element_Info1(Data);
904                     return Data;
905                 }
906         case 5 :
907                 {
908                     int64u Data;
909                     Get_B5 (Data,                               "Data"); Element_Info1(Data);
910                     return Data;
911                 }
912         case 6 :
913                 {
914                     int64u Data;
915                     Get_B6 (Data,                               "Data"); Element_Info1(Data);
916                     return Data;
917                 }
918         case 7 :
919                 {
920                     int64u Data;
921                     Get_B7 (Data,                               "Data"); Element_Info1(Data);
922                     return Data;
923                 }
924         case 8 :
925                 {
926                     int64u Data;
927                     Get_B8 (Data,                               "Data"); Element_Info1(Data);
928                     return Data;
929                 }
930         case 16:
931                 {
932                     int128u Data;
933                     Get_B16(Data,                               "Data"); Element_Info1(Data);
934                     return Data;
935                 }
936         default :   Skip_XX(Element_Size,                       "Data");
937                     return 0;
938     }
939 }
940 
941 } //NameSpace
942 
943 #endif //MEDIAINFO_IBI
944