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