2020
2121#include " ebmlelement.h"
2222#include " ebmlmasterelement.h"
23+ #include " ebmlbinaryelement.h"
2324#include " ebmlmksegment.h"
2425#include " ebmlmktags.h"
26+ #include " ebmlmkattachments.h"
2527#include " ebmlstringelement.h"
2628#include " ebmluintelement.h"
2729#include " ebmlutils.h"
@@ -36,15 +38,16 @@ using namespace TagLib;
3638EBML::Element* EBML::Element::factory (File &file)
3739{
3840 // Get the element ID
41+ offset_t offset = file.tell ();
3942 Id id = readId (file);
40- if (!id) {
43+ if (!id) {
4144 debug (" Failed to parse EMBL ElementID" );
4245 return nullptr ;
4346 }
4447
4548 // Get the size length and data length
4649 const auto & [sizeLength, dataSize] = readVINT<offset_t >(file);
47- if (!sizeLength)
50+ if (!sizeLength)
4851 return nullptr ;
4952
5053 // Return the subclass
@@ -53,26 +56,37 @@ EBML::Element* EBML::Element::factory(File &file)
5356 return new Element (id, sizeLength, dataSize);
5457
5558 case ElementIDs::MkSegment:
56- return new MkSegment (sizeLength, dataSize);
59+ return new MkSegment (sizeLength, dataSize, offset );
5760
5861 case ElementIDs::MkTags:
59- return new MkTags (sizeLength, dataSize);
62+ return new MkTags (sizeLength, dataSize, offset);
63+
64+ case ElementIDs::MkAttachments:
65+ return new MkAttachments (sizeLength, dataSize, offset);
6066
6167 case ElementIDs::MkTag:
6268 case ElementIDs::MkTagTargets:
6369 case ElementIDs::MkSimpleTag:
64- return new MasterElement (id, sizeLength, dataSize);
70+ case ElementIDs::MkAttachedFile:
71+ return new MasterElement (id, sizeLength, dataSize, offset);
6572
6673 case ElementIDs::MkTagName:
6774 case ElementIDs::MkTagString:
75+ case ElementIDs::MkAttachedFileName:
76+ case ElementIDs::MkAttachedFileDescription:
6877 return new UTF8StringElement (id, sizeLength, dataSize);
6978
7079 case ElementIDs::MkTagLanguage:
80+ case ElementIDs::MkAttachedFileMediaType:
7181 return new Latin1StringElement (id, sizeLength, dataSize);
7282
7383 case ElementIDs::MkTagTargetTypeValue:
84+ case ElementIDs::MkAttachedFileUID:
7485 return new UIntElement (id, sizeLength, dataSize);
7586
87+ case ElementIDs::MkAttachedFileData:
88+ return new BinaryElement (id, sizeLength, dataSize);
89+
7690 default :
7791 return new Element (id, sizeLength, dataSize);
7892 }
@@ -83,16 +97,16 @@ EBML::Element* EBML::Element::factory(File &file)
8397EBML::Element::Id EBML::Element::readId (File &file)
8498{
8599 auto buffer = file.readBlock (1 );
86- if (buffer.size () != 1 ) {
100+ if (buffer.size () != 1 ) {
87101 debug (" Failed to read VINT size" );
88102 return 0 ;
89103 }
90104 unsigned int nb_bytes = VINTSizeLength<4 >(*buffer.begin ());
91- if (!nb_bytes)
105+ if (!nb_bytes)
92106 return 0 ;
93- if (nb_bytes > 1 )
107+ if (nb_bytes > 1 )
94108 buffer.append (file.readBlock (nb_bytes - 1 ));
95- if (buffer.size () != nb_bytes) {
109+ if (buffer.size () != nb_bytes) {
96110 debug (" Failed to read VINT data" );
97111 return 0 ;
98112 }
0 commit comments