diff --git a/taglib/CMakeLists.txt b/taglib/CMakeLists.txt index 24fb4a7d..ce6197aa 100644 --- a/taglib/CMakeLists.txt +++ b/taglib/CMakeLists.txt @@ -72,6 +72,7 @@ if(WITH_MATROSKA) endif() include_directories(${tag_HDR_DIRS}) +set(tag_PRIVATE_HDRS) set(tag_HDRS tag.h fileref.h @@ -233,14 +234,13 @@ if(WITH_MATROSKA) matroska/matroskachapter.h matroska/matroskachapteredition.h matroska/matroskachapters.h - matroska/matroskacues.h matroska/matroskaelement.h matroska/matroskafile.h matroska/matroskaproperties.h - matroska/matroskaseekhead.h - matroska/matroskasegment.h matroska/matroskasimpletag.h matroska/matroskatag.h + ) + set(tag_PRIVATE_HDRS ${tag_PRIVATE_HDRS} matroska/ebml/ebmlbinaryelement.h matroska/ebml/ebmlelement.h matroska/ebml/ebmlmasterelement.h @@ -257,6 +257,9 @@ if(WITH_MATROSKA) matroska/ebml/ebmlfloatelement.h matroska/ebml/ebmlutils.h matroska/ebml/ebmlvoidelement.h + matroska/matroskacues.h + matroska/matroskaseekhead.h + matroska/matroskasegment.h ) endif() @@ -517,7 +520,7 @@ set(tag_LIB_SRCS tagutils.cpp ) -add_library(tag ${tag_LIB_SRCS} ${tag_HDRS}) +add_library(tag ${tag_LIB_SRCS} ${tag_HDRS} ${tag_PRIVATE_HDRS}) target_include_directories(tag INTERFACE $ diff --git a/taglib/matroska/ebml/ebmlbinaryelement.cpp b/taglib/matroska/ebml/ebmlbinaryelement.cpp index c8377c70..98100502 100644 --- a/taglib/matroska/ebml/ebmlbinaryelement.cpp +++ b/taglib/matroska/ebml/ebmlbinaryelement.cpp @@ -21,9 +21,35 @@ #include "ebmlbinaryelement.h" #include "ebmlutils.h" #include "tfile.h" +#include "tdebug.h" using namespace TagLib; +EBML::BinaryElement::BinaryElement(Id id, int sizeLength, offset_t dataSize): + Element(id, sizeLength, dataSize) +{ +} + +EBML::BinaryElement::BinaryElement(Id id, int sizeLength, offset_t dataSize, offset_t): + Element(id, sizeLength, dataSize) +{ +} + +EBML::BinaryElement::BinaryElement(Id id): + Element(id, 0, 0) +{ +} + +const ByteVector& EBML::BinaryElement::getValue() const +{ + return value; +} + +void EBML::BinaryElement::setValue(const ByteVector& val) +{ + value = val; +} + bool EBML::BinaryElement::read(File &file) { value = file.readBlock(dataSize); diff --git a/taglib/matroska/ebml/ebmlbinaryelement.h b/taglib/matroska/ebml/ebmlbinaryelement.h index f14b2b5b..f6a662fc 100644 --- a/taglib/matroska/ebml/ebmlbinaryelement.h +++ b/taglib/matroska/ebml/ebmlbinaryelement.h @@ -27,19 +27,17 @@ namespace TagLib { class File; + namespace EBML { class BinaryElement : public Element { public: - BinaryElement(Id id, int sizeLength, offset_t dataSize) : - Element(id, sizeLength, dataSize) {} - BinaryElement(Id id, int sizeLength, offset_t dataSize, offset_t) : - Element(id, sizeLength, dataSize) {} - explicit BinaryElement(Id id) : - Element(id, 0, 0) {} + BinaryElement(Id id, int sizeLength, offset_t dataSize); + BinaryElement(Id id, int sizeLength, offset_t dataSize, offset_t); + explicit BinaryElement(Id id); - const ByteVector &getValue() const { return value; } - void setValue(const ByteVector &val) { value = val; } + const ByteVector &getValue() const; + void setValue(const ByteVector &val); bool read(File &file) override; ByteVector render() override; diff --git a/taglib/matroska/ebml/ebmlelement.cpp b/taglib/matroska/ebml/ebmlelement.cpp index 46c3dd11..691b6479 100644 --- a/taglib/matroska/ebml/ebmlelement.cpp +++ b/taglib/matroska/ebml/ebmlelement.cpp @@ -148,16 +148,54 @@ unsigned int EBML::Element::readId(File &file) return buffer.toUInt(true); } +EBML::Element::Element(Id id, int sizeLength, offset_t dataSize): + id(id), sizeLength(sizeLength), dataSize(dataSize) +{ +} + +EBML::Element::Element(Id id, int sizeLength, offset_t dataSize, offset_t): + id(id), sizeLength(sizeLength), dataSize(dataSize) +{ +} + +EBML::Element::~Element() = default; + +bool EBML::Element::read(File& file) +{ + skipData(file); + return true; +} + void EBML::Element::skipData(File &file) { file.seek(dataSize, File::Position::Current); } +EBML::Element::Id EBML::Element::getId() const +{ + return id; +} + offset_t EBML::Element::headSize() const { return idSize(id) + sizeLength; } +offset_t EBML::Element::getSize() const +{ + return headSize() + dataSize; +} + +int EBML::Element::getSizeLength() const +{ + return sizeLength; +} + +int64_t EBML::Element::getDataSize() const +{ + return dataSize; +} + ByteVector EBML::Element::render() { ByteVector buffer = renderId(); diff --git a/taglib/matroska/ebml/ebmlelement.h b/taglib/matroska/ebml/ebmlelement.h index 9c8144b8..8bccf469 100644 --- a/taglib/matroska/ebml/ebmlelement.h +++ b/taglib/matroska/ebml/ebmlelement.h @@ -106,22 +106,17 @@ namespace TagLib MkChapLanguage = 0x437C, }; - Element(Id id, int sizeLength, offset_t dataSize) : - id(id), sizeLength(sizeLength), dataSize(dataSize) {} - Element(Id id, int sizeLength, offset_t dataSize, offset_t) : - id(id), sizeLength(sizeLength), dataSize(dataSize) {} - virtual ~Element() = default; - virtual bool read(File &file) - { - skipData(file); - return true; - } + Element(Id id, int sizeLength, offset_t dataSize); + Element(Id id, int sizeLength, offset_t dataSize, offset_t); + virtual ~Element(); + + virtual bool read(File &file); void skipData(File &file); - Id getId() const { return id; } + Id getId() const; offset_t headSize() const; - offset_t getSize() const { return headSize() + dataSize; } - int getSizeLength() const { return sizeLength; } - int64_t getDataSize() const { return dataSize; } + offset_t getSize() const; + int getSizeLength() const; + int64_t getDataSize() const; ByteVector renderId() const; virtual ByteVector render(); static std::unique_ptr factory(File &file); diff --git a/taglib/matroska/ebml/ebmlfloatelement.cpp b/taglib/matroska/ebml/ebmlfloatelement.cpp index 781aca16..1460de8e 100644 --- a/taglib/matroska/ebml/ebmlfloatelement.cpp +++ b/taglib/matroska/ebml/ebmlfloatelement.cpp @@ -31,6 +31,24 @@ using namespace TagLib; +EBML::FloatElement::FloatElement(Id id, int sizeLength, offset_t dataSize): + Element(id, sizeLength, dataSize) +{ +} + +EBML::FloatElement::FloatElement(Id id, int sizeLength, offset_t dataSize, offset_t): + Element(id, sizeLength, dataSize) +{ +} + +EBML::FloatElement::FloatElement(Id id): + FloatElement(id, 0, 0) +{ +} + +EBML::FloatElement::FloatVariantType EBML::FloatElement::getValue() const +{ return value; } + double EBML::FloatElement::getValueAsDouble(double defaultValue) const { if(std::holds_alternative(value)) { @@ -42,6 +60,11 @@ double EBML::FloatElement::getValueAsDouble(double defaultValue) const return defaultValue; } +void EBML::FloatElement::setValue(FloatVariantType val) +{ + value = val; +} + bool EBML::FloatElement::read(File &file) { const ByteVector buffer = file.readBlock(dataSize); diff --git a/taglib/matroska/ebml/ebmlfloatelement.h b/taglib/matroska/ebml/ebmlfloatelement.h index 34a2cab8..92307919 100644 --- a/taglib/matroska/ebml/ebmlfloatelement.h +++ b/taglib/matroska/ebml/ebmlfloatelement.h @@ -39,16 +39,13 @@ namespace TagLib { public: using FloatVariantType = std::variant; - FloatElement(Id id, int sizeLength, offset_t dataSize) : - Element(id, sizeLength, dataSize) {} - FloatElement(Id id, int sizeLength, offset_t dataSize, offset_t) : - Element(id, sizeLength, dataSize) {} - explicit FloatElement(Id id) : - FloatElement(id, 0, 0) {} + FloatElement(Id id, int sizeLength, offset_t dataSize); + FloatElement(Id id, int sizeLength, offset_t dataSize, offset_t); + explicit FloatElement(Id id); - FloatVariantType getValue() const { return value; } + FloatVariantType getValue() const; double getValueAsDouble(double defaultValue = 0.0) const; - void setValue(FloatVariantType val) { value = val; } + void setValue(FloatVariantType val); bool read(File &file) override; ByteVector render() override; diff --git a/taglib/matroska/ebml/ebmlmasterelement.cpp b/taglib/matroska/ebml/ebmlmasterelement.cpp index 85d041e1..22e5d9b7 100644 --- a/taglib/matroska/ebml/ebmlmasterelement.cpp +++ b/taglib/matroska/ebml/ebmlmasterelement.cpp @@ -25,13 +25,78 @@ using namespace TagLib; +EBML::MasterElement::MasterElement(Id id, int sizeLength, offset_t dataSize, offset_t offset): + Element(id, sizeLength, dataSize), offset(offset) +{ +} + +EBML::MasterElement::MasterElement(Id id): + Element(id, 0, 0), offset(0) +{ +} + EBML::MasterElement::~MasterElement() = default; +offset_t EBML::MasterElement::getOffset() const +{ + return offset; +} + void EBML::MasterElement::appendElement(std::unique_ptr &&element) { elements.push_back(std::move(element)); } +std::list>::iterator EBML::MasterElement::begin() +{ + return elements.begin(); +} + +std::list>::iterator EBML::MasterElement::end() +{ + return elements.end(); +} + +std::list>::const_iterator EBML::MasterElement::begin() const +{ + return elements.begin(); +} + +std::list>::const_iterator EBML::MasterElement::end() const +{ + return elements.end(); +} + +std::list>::const_iterator EBML::MasterElement::cbegin() const +{ + return elements.cbegin(); +} + +std::list>::const_iterator EBML::MasterElement::cend() const +{ + return elements.cend(); +} + +offset_t EBML::MasterElement::getPadding() const +{ + return padding; +} + +void EBML::MasterElement::setPadding(offset_t numBytes) +{ + padding = numBytes; +} + +offset_t EBML::MasterElement::getMinRenderSize() const +{ + return minRenderSize; +} + +void EBML::MasterElement::setMinRenderSize(offset_t minimumSize) +{ + minRenderSize = minimumSize; +} + bool EBML::MasterElement::read(File &file) { const offset_t maxOffset = file.tell() + dataSize; diff --git a/taglib/matroska/ebml/ebmlmasterelement.h b/taglib/matroska/ebml/ebmlmasterelement.h index 158bcf84..52cfe526 100644 --- a/taglib/matroska/ebml/ebmlmasterelement.h +++ b/taglib/matroska/ebml/ebmlmasterelement.h @@ -22,9 +22,10 @@ #define TAGLIB_EBMLMASTERELEMENT_H #ifndef DO_NOT_DOCUMENT +#include + #include "ebmlelement.h" #include "taglib.h" -#include "tlist.h" namespace TagLib { @@ -34,26 +35,24 @@ namespace TagLib class MasterElement : public Element { public: - MasterElement(Id id, int sizeLength, offset_t dataSize, offset_t offset) : - Element(id, sizeLength, dataSize), offset(offset) {} - explicit MasterElement(Id id) : - Element(id, 0, 0), offset(0) {} + MasterElement(Id id, int sizeLength, offset_t dataSize, offset_t offset); + explicit MasterElement(Id id); ~MasterElement() override; - offset_t getOffset() const { return offset; } + offset_t getOffset() const; bool read(File &file) override; ByteVector render() override; void appendElement(std::unique_ptr &&element); - std::list>::iterator begin() { return elements.begin(); } - std::list>::iterator end() { return elements.end(); } - std::list>::const_iterator begin() const { return elements.begin(); } - std::list>::const_iterator end() const { return elements.end(); } - std::list>::const_iterator cbegin() const { return elements.cbegin(); } - std::list>::const_iterator cend() const { return elements.cend(); } - offset_t getPadding() const { return padding; } - void setPadding(offset_t numBytes) { padding = numBytes; } - offset_t getMinRenderSize() const { return minRenderSize; } - void setMinRenderSize(offset_t minimumSize) { minRenderSize = minimumSize; } + std::list>::iterator begin(); + std::list>::iterator end(); + std::list>::const_iterator begin() const; + std::list>::const_iterator end() const; + std::list>::const_iterator cbegin() const; + std::list>::const_iterator cend() const; + offset_t getPadding() const; + void setPadding(offset_t numBytes); + offset_t getMinRenderSize() const; + void setMinRenderSize(offset_t minimumSize); protected: offset_t offset; diff --git a/taglib/matroska/ebml/ebmlmkattachments.cpp b/taglib/matroska/ebml/ebmlmkattachments.cpp index 43c2efb9..f57c9492 100644 --- a/taglib/matroska/ebml/ebmlmkattachments.cpp +++ b/taglib/matroska/ebml/ebmlmkattachments.cpp @@ -27,6 +27,21 @@ using namespace TagLib; +EBML::MkAttachments::MkAttachments(int sizeLength, offset_t dataSize, offset_t offset): + MasterElement(Id::MkAttachments, sizeLength, dataSize, offset) +{ +} + +EBML::MkAttachments::MkAttachments(Id, int sizeLength, offset_t dataSize, offset_t offset): + MasterElement(Id::MkAttachments, sizeLength, dataSize, offset) +{ +} + +EBML::MkAttachments::MkAttachments(): + MasterElement(Id::MkAttachments, 0, 0, 0) +{ +} + std::unique_ptr EBML::MkAttachments::parse() const { auto attachments = std::make_unique(); diff --git a/taglib/matroska/ebml/ebmlmkattachments.h b/taglib/matroska/ebml/ebmlmkattachments.h index cefc8e07..7c2404ea 100644 --- a/taglib/matroska/ebml/ebmlmkattachments.h +++ b/taglib/matroska/ebml/ebmlmkattachments.h @@ -29,16 +29,14 @@ namespace TagLib { namespace Matroska { class Attachments; } + namespace EBML { class MkAttachments : public MasterElement { public: - MkAttachments(int sizeLength, offset_t dataSize, offset_t offset) : - MasterElement(Id::MkAttachments, sizeLength, dataSize, offset) {} - MkAttachments(Id, int sizeLength, offset_t dataSize, offset_t offset) : - MasterElement(Id::MkAttachments, sizeLength, dataSize, offset) {} - MkAttachments() : - MasterElement(Id::MkAttachments, 0, 0, 0) {} + MkAttachments(int sizeLength, offset_t dataSize, offset_t offset); + MkAttachments(Id, int sizeLength, offset_t dataSize, offset_t offset); + MkAttachments(); std::unique_ptr parse() const; }; diff --git a/taglib/matroska/ebml/ebmlmkchapters.cpp b/taglib/matroska/ebml/ebmlmkchapters.cpp index 26d4386c..d8d3c136 100644 --- a/taglib/matroska/ebml/ebmlmkchapters.cpp +++ b/taglib/matroska/ebml/ebmlmkchapters.cpp @@ -31,6 +31,21 @@ using namespace TagLib; +EBML::MkChapters::MkChapters(int sizeLength, offset_t dataSize, offset_t offset): + MasterElement(Id::MkChapters, sizeLength, dataSize, offset) +{ +} + +EBML::MkChapters::MkChapters(Id, int sizeLength, offset_t dataSize, offset_t offset): + MasterElement(Id::MkChapters, sizeLength, dataSize, offset) +{ +} + +EBML::MkChapters::MkChapters(): + MasterElement(Id::MkChapters, 0, 0, 0) +{ +} + std::unique_ptr EBML::MkChapters::parse() const { auto chapters = std::make_unique(); diff --git a/taglib/matroska/ebml/ebmlmkchapters.h b/taglib/matroska/ebml/ebmlmkchapters.h index 462b57a8..af7e63ba 100644 --- a/taglib/matroska/ebml/ebmlmkchapters.h +++ b/taglib/matroska/ebml/ebmlmkchapters.h @@ -34,16 +34,14 @@ namespace TagLib { namespace Matroska { class Chapters; } + namespace EBML { class MkChapters : public MasterElement { public: - MkChapters(int sizeLength, offset_t dataSize, offset_t offset) : - MasterElement(Id::MkChapters, sizeLength, dataSize, offset) {} - MkChapters(Id, int sizeLength, offset_t dataSize, offset_t offset) : - MasterElement(Id::MkChapters, sizeLength, dataSize, offset) {} - MkChapters() : - MasterElement(Id::MkChapters, 0, 0, 0) {} + MkChapters(int sizeLength, offset_t dataSize, offset_t offset); + MkChapters(Id, int sizeLength, offset_t dataSize, offset_t offset); + MkChapters(); std::unique_ptr parse() const; }; diff --git a/taglib/matroska/ebml/ebmlmkcues.cpp b/taglib/matroska/ebml/ebmlmkcues.cpp index 005337a0..1d60f8c7 100644 --- a/taglib/matroska/ebml/ebmlmkcues.cpp +++ b/taglib/matroska/ebml/ebmlmkcues.cpp @@ -24,6 +24,21 @@ using namespace TagLib; +EBML::MkCues::MkCues(int sizeLength, offset_t dataSize, offset_t offset): + MasterElement(Id::MkCues, sizeLength, dataSize, offset) +{ +} + +EBML::MkCues::MkCues(Id, int sizeLength, offset_t dataSize, offset_t offset): + MasterElement(Id::MkCues, sizeLength, dataSize, offset) +{ +} + +EBML::MkCues::MkCues(): + MasterElement(Id::MkCues, 0, 0, 0) +{ +} + std::unique_ptr EBML::MkCues::parse(offset_t segmentDataOffset) const { auto cues = std::make_unique(segmentDataOffset); diff --git a/taglib/matroska/ebml/ebmlmkcues.h b/taglib/matroska/ebml/ebmlmkcues.h index 388ec354..0ce3c7ab 100644 --- a/taglib/matroska/ebml/ebmlmkcues.h +++ b/taglib/matroska/ebml/ebmlmkcues.h @@ -34,12 +34,9 @@ namespace TagLib { class MkCues : public MasterElement { public: - MkCues(int sizeLength, offset_t dataSize, offset_t offset) : - MasterElement(Id::MkCues, sizeLength, dataSize, offset) {} - MkCues(Id, int sizeLength, offset_t dataSize, offset_t offset) : - MasterElement(Id::MkCues, sizeLength, dataSize, offset) {} - MkCues() : - MasterElement(Id::MkCues, 0, 0, 0) {} + MkCues(int sizeLength, offset_t dataSize, offset_t offset); + MkCues(Id, int sizeLength, offset_t dataSize, offset_t offset); + MkCues(); std::unique_ptr parse(offset_t segmentDataOffset) const; }; diff --git a/taglib/matroska/ebml/ebmlmkinfo.cpp b/taglib/matroska/ebml/ebmlmkinfo.cpp index b0ea7e63..a2e4e910 100644 --- a/taglib/matroska/ebml/ebmlmkinfo.cpp +++ b/taglib/matroska/ebml/ebmlmkinfo.cpp @@ -31,6 +31,21 @@ using namespace TagLib; +EBML::MkInfo::MkInfo(int sizeLength, offset_t dataSize, offset_t offset): + MasterElement(Id::MkInfo, sizeLength, dataSize, offset) +{ +} + +EBML::MkInfo::MkInfo(Id, int sizeLength, offset_t dataSize, offset_t offset): + MasterElement(Id::MkInfo, sizeLength, dataSize, offset) +{ +} + +EBML::MkInfo::MkInfo(): + MasterElement(Id::MkInfo, 0, 0, 0) +{ +} + void EBML::MkInfo::parse(Matroska::Properties *properties) const { if(!properties) diff --git a/taglib/matroska/ebml/ebmlmkinfo.h b/taglib/matroska/ebml/ebmlmkinfo.h index 294342bb..c381b46a 100644 --- a/taglib/matroska/ebml/ebmlmkinfo.h +++ b/taglib/matroska/ebml/ebmlmkinfo.h @@ -34,16 +34,14 @@ namespace TagLib { namespace Matroska { class Properties; } + namespace EBML { class MkInfo : public MasterElement { public: - MkInfo(int sizeLength, offset_t dataSize, offset_t offset) : - MasterElement(Id::MkInfo, sizeLength, dataSize, offset) {} - MkInfo(Id, int sizeLength, offset_t dataSize, offset_t offset) : - MasterElement(Id::MkInfo, sizeLength, dataSize, offset) {} - MkInfo() : - MasterElement(Id::MkInfo, 0, 0, 0) {} + MkInfo(int sizeLength, offset_t dataSize, offset_t offset); + MkInfo(Id, int sizeLength, offset_t dataSize, offset_t offset); + MkInfo(); void parse(Matroska::Properties * properties) const; }; diff --git a/taglib/matroska/ebml/ebmlmkseekhead.cpp b/taglib/matroska/ebml/ebmlmkseekhead.cpp index 71250cc3..c3d6ca8f 100644 --- a/taglib/matroska/ebml/ebmlmkseekhead.cpp +++ b/taglib/matroska/ebml/ebmlmkseekhead.cpp @@ -25,6 +25,21 @@ using namespace TagLib; +EBML::MkSeekHead::MkSeekHead(int sizeLength, offset_t dataSize, offset_t offset): + MasterElement(Id::MkSeekHead, sizeLength, dataSize, offset) +{ +} + +EBML::MkSeekHead::MkSeekHead(Id, int sizeLength, offset_t dataSize, offset_t offset): + MasterElement(Id::MkSeekHead, sizeLength, dataSize, offset) +{ +} + +EBML::MkSeekHead::MkSeekHead(): + MasterElement(Id::MkSeekHead, 0, 0, 0) +{ +} + std::unique_ptr EBML::MkSeekHead::parse(offset_t segmentDataOffset) const { auto seekHead = std::make_unique(segmentDataOffset); diff --git a/taglib/matroska/ebml/ebmlmkseekhead.h b/taglib/matroska/ebml/ebmlmkseekhead.h index c7c47acf..13007841 100644 --- a/taglib/matroska/ebml/ebmlmkseekhead.h +++ b/taglib/matroska/ebml/ebmlmkseekhead.h @@ -29,16 +29,14 @@ namespace TagLib { namespace Matroska { class SeekHead; } + namespace EBML { class MkSeekHead : public MasterElement { public: - MkSeekHead(int sizeLength, offset_t dataSize, offset_t offset) : - MasterElement(Id::MkSeekHead, sizeLength, dataSize, offset) {} - MkSeekHead(Id, int sizeLength, offset_t dataSize, offset_t offset) : - MasterElement(Id::MkSeekHead, sizeLength, dataSize, offset) {} - MkSeekHead() : - MasterElement(Id::MkSeekHead, 0, 0, 0) {} + MkSeekHead(int sizeLength, offset_t dataSize, offset_t offset); + MkSeekHead(Id, int sizeLength, offset_t dataSize, offset_t offset); + MkSeekHead(); std::unique_ptr parse(offset_t segmentDataOffset) const; }; diff --git a/taglib/matroska/ebml/ebmlmksegment.cpp b/taglib/matroska/ebml/ebmlmksegment.cpp index 1222360b..4b9ba4e5 100644 --- a/taglib/matroska/ebml/ebmlmksegment.cpp +++ b/taglib/matroska/ebml/ebmlmksegment.cpp @@ -30,6 +30,16 @@ using namespace TagLib; +EBML::MkSegment::MkSegment(int sizeLength, offset_t dataSize, offset_t offset): + MasterElement(Id::MkSegment, sizeLength, dataSize, offset) +{ +} + +EBML::MkSegment::MkSegment(Id, int sizeLength, offset_t dataSize, offset_t offset): + MasterElement(Id::MkSegment, sizeLength, dataSize, offset) +{ +} + EBML::MkSegment::~MkSegment() = default; offset_t EBML::MkSegment::segmentDataOffset() const diff --git a/taglib/matroska/ebml/ebmlmksegment.h b/taglib/matroska/ebml/ebmlmksegment.h index f1164a49..13000f3e 100644 --- a/taglib/matroska/ebml/ebmlmksegment.h +++ b/taglib/matroska/ebml/ebmlmksegment.h @@ -40,16 +40,13 @@ namespace TagLib { class SeekHead; class Segment; } + namespace EBML { class MkSegment : public MasterElement { public: - MkSegment(int sizeLength, offset_t dataSize, offset_t offset) : - MasterElement(Id::MkSegment, sizeLength, dataSize, offset) - { - } - MkSegment(Id, int sizeLength, offset_t dataSize, offset_t offset) : - MasterElement(Id::MkSegment, sizeLength, dataSize, offset) {} + MkSegment(int sizeLength, offset_t dataSize, offset_t offset); + MkSegment(Id, int sizeLength, offset_t dataSize, offset_t offset); ~MkSegment() override; offset_t segmentDataOffset() const; diff --git a/taglib/matroska/ebml/ebmlmktags.cpp b/taglib/matroska/ebml/ebmlmktags.cpp index 339d80db..e732e26e 100644 --- a/taglib/matroska/ebml/ebmlmktags.cpp +++ b/taglib/matroska/ebml/ebmlmktags.cpp @@ -28,6 +28,21 @@ using namespace TagLib; +EBML::MkTags::MkTags(int sizeLength, offset_t dataSize, offset_t offset): + MasterElement(Id::MkTags, sizeLength, dataSize, offset) +{ +} + +EBML::MkTags::MkTags(Id, int sizeLength, offset_t dataSize, offset_t offset): + MasterElement(Id::MkTags, sizeLength, dataSize, offset) +{ +} + +EBML::MkTags::MkTags(): + MasterElement(Id::MkTags, 0, 0, 0) +{ +} + std::unique_ptr EBML::MkTags::parse() const { auto mTag = std::make_unique(); diff --git a/taglib/matroska/ebml/ebmlmktags.h b/taglib/matroska/ebml/ebmlmktags.h index cea61f80..82b9f33f 100644 --- a/taglib/matroska/ebml/ebmlmktags.h +++ b/taglib/matroska/ebml/ebmlmktags.h @@ -34,12 +34,9 @@ namespace TagLib { class MkTags : public MasterElement { public: - MkTags(int sizeLength, offset_t dataSize, offset_t offset) : - MasterElement(Id::MkTags, sizeLength, dataSize, offset) {} - MkTags(Id, int sizeLength, offset_t dataSize, offset_t offset) : - MasterElement(Id::MkTags, sizeLength, dataSize, offset) {} - MkTags() : - MasterElement(Id::MkTags, 0, 0, 0) {} + MkTags(int sizeLength, offset_t dataSize, offset_t offset); + MkTags(Id, int sizeLength, offset_t dataSize, offset_t offset); + MkTags(); std::unique_ptr parse() const; }; diff --git a/taglib/matroska/ebml/ebmlmktracks.cpp b/taglib/matroska/ebml/ebmlmktracks.cpp index b3491b71..14cf7a00 100644 --- a/taglib/matroska/ebml/ebmlmktracks.cpp +++ b/taglib/matroska/ebml/ebmlmktracks.cpp @@ -31,6 +31,21 @@ using namespace TagLib; +EBML::MkTracks::MkTracks(int sizeLength, offset_t dataSize, offset_t offset): + MasterElement(Id::MkTracks, sizeLength, dataSize, offset) +{ +} + +EBML::MkTracks::MkTracks(Id, int sizeLength, offset_t dataSize, offset_t offset): + MasterElement(Id::MkTracks, sizeLength, dataSize, offset) +{ +} + +EBML::MkTracks::MkTracks(): + MasterElement(Id::MkTracks, 0, 0, 0) +{ +} + void EBML::MkTracks::parse(Matroska::Properties *properties) const { if(!properties) diff --git a/taglib/matroska/ebml/ebmlmktracks.h b/taglib/matroska/ebml/ebmlmktracks.h index 2ba2a4b1..440ac21d 100644 --- a/taglib/matroska/ebml/ebmlmktracks.h +++ b/taglib/matroska/ebml/ebmlmktracks.h @@ -34,16 +34,14 @@ namespace TagLib { namespace Matroska { class Properties; } + namespace EBML { class MkTracks : public MasterElement { public: - MkTracks(int sizeLength, offset_t dataSize, offset_t offset) : - MasterElement(Id::MkTracks, sizeLength, dataSize, offset) {} - MkTracks(Id, int sizeLength, offset_t dataSize, offset_t offset) : - MasterElement(Id::MkTracks, sizeLength, dataSize, offset) {} - MkTracks() : - MasterElement(Id::MkTracks, 0, 0, 0) {} + MkTracks(int sizeLength, offset_t dataSize, offset_t offset); + MkTracks(Id, int sizeLength, offset_t dataSize, offset_t offset); + MkTracks(); void parse(Matroska::Properties *properties) const; }; diff --git a/taglib/matroska/ebml/ebmlstringelement.cpp b/taglib/matroska/ebml/ebmlstringelement.cpp index 5d8fd9cf..01699db3 100644 --- a/taglib/matroska/ebml/ebmlstringelement.cpp +++ b/taglib/matroska/ebml/ebmlstringelement.cpp @@ -27,6 +27,22 @@ using namespace TagLib; +EBML::StringElement::StringElement( + String::Type stringEncoding, Id id, int sizeLength, offset_t dataSize): + Element(id, sizeLength, dataSize), encoding(stringEncoding) +{ +} + +const String& EBML::StringElement::getValue() const +{ + return value; +} + +void EBML::StringElement::setValue(const String& val) +{ + value = val; +} + bool EBML::StringElement::read(File &file) { ByteVector buffer = file.readBlock(dataSize); @@ -52,3 +68,33 @@ ByteVector EBML::StringElement::render() buffer.append(ByteVector(string.data(), static_cast(dataSize))); return buffer; } + +EBML::UTF8StringElement::UTF8StringElement(Id id, int sizeLength, offset_t dataSize): + StringElement(String::UTF8, id, sizeLength, dataSize) +{ +} + +EBML::UTF8StringElement::UTF8StringElement(Id id, int sizeLength, offset_t dataSize, offset_t): + UTF8StringElement(id, sizeLength, dataSize) +{ +} + +EBML::UTF8StringElement::UTF8StringElement(Id id): + UTF8StringElement(id, 0, 0) +{ +} + +EBML::Latin1StringElement::Latin1StringElement(Id id, int sizeLength, offset_t dataSize): + StringElement(String::Latin1, id, sizeLength, dataSize) +{ +} + +EBML::Latin1StringElement::Latin1StringElement(Id id, int sizeLength, offset_t dataSize, offset_t): + Latin1StringElement(id, sizeLength, dataSize) +{ +} + +EBML::Latin1StringElement::Latin1StringElement(Id id): + Latin1StringElement(id, 0, 0) +{ +} diff --git a/taglib/matroska/ebml/ebmlstringelement.h b/taglib/matroska/ebml/ebmlstringelement.h index 2aca07e7..51d46950 100644 --- a/taglib/matroska/ebml/ebmlstringelement.h +++ b/taglib/matroska/ebml/ebmlstringelement.h @@ -33,11 +33,10 @@ namespace TagLib { class StringElement : public Element { public: - StringElement(String::Type stringEncoding, Id id, int sizeLength, offset_t dataSize) : - Element(id, sizeLength, dataSize), encoding(stringEncoding) {} + StringElement(String::Type stringEncoding, Id id, int sizeLength, offset_t dataSize); - const String &getValue() const { return value; } - void setValue(const String &val) { value = val; } + const String &getValue() const; + void setValue(const String &val); bool read(File &file) override; ByteVector render() override; @@ -48,22 +47,16 @@ namespace TagLib { class UTF8StringElement : public StringElement { public: - UTF8StringElement(Id id, int sizeLength, offset_t dataSize) : - StringElement(String::UTF8, id, sizeLength, dataSize) {} - UTF8StringElement(Id id, int sizeLength, offset_t dataSize, offset_t) : - UTF8StringElement(id, sizeLength, dataSize) {} - explicit UTF8StringElement(Id id) : - UTF8StringElement(id, 0, 0) {} + UTF8StringElement(Id id, int sizeLength, offset_t dataSize); + UTF8StringElement(Id id, int sizeLength, offset_t dataSize, offset_t); + explicit UTF8StringElement(Id id); }; class Latin1StringElement : public StringElement { public: - Latin1StringElement(Id id, int sizeLength, offset_t dataSize) : - StringElement(String::Latin1, id, sizeLength, dataSize) {} - Latin1StringElement(Id id, int sizeLength, offset_t dataSize, offset_t) : - Latin1StringElement(id, sizeLength, dataSize) {} - explicit Latin1StringElement(Id id) : - Latin1StringElement(id, 0, 0) {} + Latin1StringElement(Id id, int sizeLength, offset_t dataSize); + Latin1StringElement(Id id, int sizeLength, offset_t dataSize, offset_t); + explicit Latin1StringElement(Id id); }; } } diff --git a/taglib/matroska/ebml/ebmluintelement.cpp b/taglib/matroska/ebml/ebmluintelement.cpp index b78473ab..e7d790c7 100644 --- a/taglib/matroska/ebml/ebmluintelement.cpp +++ b/taglib/matroska/ebml/ebmluintelement.cpp @@ -22,10 +22,36 @@ #include "ebmlutils.h" #include "tbytevector.h" #include "tfile.h" +#include "tutils.h" #include "tdebug.h" using namespace TagLib; +EBML::UIntElement::UIntElement(Id id, int sizeLength, offset_t dataSize): + Element(id, sizeLength, dataSize) +{ +} + +EBML::UIntElement::UIntElement(Id id, int sizeLength, offset_t dataSize, offset_t): + Element(id, sizeLength, dataSize) +{ +} + +EBML::UIntElement::UIntElement(Id id): + UIntElement(id, 0, 0) +{ +} + +unsigned long long EBML::UIntElement::getValue() const +{ + return value; +} + +void EBML::UIntElement::setValue(unsigned long long val) +{ + value = val; +} + bool EBML::UIntElement::read(File &file) { const ByteVector buffer = file.readBlock(dataSize); diff --git a/taglib/matroska/ebml/ebmluintelement.h b/taglib/matroska/ebml/ebmluintelement.h index 72f2dc1c..5529c434 100644 --- a/taglib/matroska/ebml/ebmluintelement.h +++ b/taglib/matroska/ebml/ebmluintelement.h @@ -31,15 +31,12 @@ namespace TagLib { class UIntElement : public Element { public: - UIntElement(Id id, int sizeLength, offset_t dataSize) : - Element(id, sizeLength, dataSize) {} - UIntElement(Id id, int sizeLength, offset_t dataSize, offset_t) : - Element(id, sizeLength, dataSize) {} - explicit UIntElement(Id id) : - UIntElement(id, 0, 0) {} + UIntElement(Id id, int sizeLength, offset_t dataSize); + UIntElement(Id id, int sizeLength, offset_t dataSize, offset_t); + explicit UIntElement(Id id); - unsigned long long getValue() const { return value; } - void setValue(unsigned long long val) { value = val; } + unsigned long long getValue() const; + void setValue(unsigned long long val); bool read(File &file) override; ByteVector render() override; diff --git a/taglib/matroska/ebml/ebmlutils.cpp b/taglib/matroska/ebml/ebmlutils.cpp index d7b3c578..e3baf7ee 100644 --- a/taglib/matroska/ebml/ebmlutils.cpp +++ b/taglib/matroska/ebml/ebmlutils.cpp @@ -22,6 +22,8 @@ #include #include "tbytevector.h" #include "matroskafile.h" +#include "tutils.h" +#include "tdebug.h" using namespace TagLib; @@ -43,6 +45,32 @@ std::unique_ptr EBML::findNextElement(File &file, offset_t maxOff return file.tell() < maxOffset ? Element::factory(file) : nullptr; } +template +unsigned int EBML::VINTSizeLength(uint8_t firstByte) +{ + static_assert(maxSizeLength >= 1 && maxSizeLength <= 8); + if(!firstByte) { + debug("VINT with greater than 8 bytes not allowed"); + return 0; + } + uint8_t mask = 0b10000000; + unsigned int numBytes = 1; + while(!(mask & firstByte)) { + numBytes++; + mask >>= 1; + } + if(numBytes > maxSizeLength) { + debug(Utils::formatString("VINT size length exceeds %i bytes", maxSizeLength)); + return 0; + } + return numBytes; +} + +namespace TagLib::EBML { + template unsigned int VINTSizeLength<4>(uint8_t firstByte); + template unsigned int VINTSizeLength<8>(uint8_t firstByte); +} + template std::pair EBML::readVINT(File &file) { @@ -62,6 +90,7 @@ std::pair EBML::readVINT(File &file) offset_t mask = 0xFFFFFFFFFFFFFFFF >> bitsToShift; return { nb_bytes, static_cast(buffer.toLongLong(true)) & mask }; } + namespace TagLib::EBML { template std::pair readVINT(File &file); template std::pair readVINT(File &file); @@ -81,6 +110,7 @@ std::pair EBML::parseVINT(const ByteVector &buffer) offset_t mask = 0xFFFFFFFFFFFFFFFF >> bitsToShift; return { numBytes, static_cast(buffer.toLongLong(true)) & mask }; } + namespace TagLib::EBML { template std::pair parseVINT(const ByteVector &buffer); template std::pair parseVINT(const ByteVector &buffer); diff --git a/taglib/matroska/ebml/ebmlutils.h b/taglib/matroska/ebml/ebmlutils.h index 20fd6cf9..7ad23157 100644 --- a/taglib/matroska/ebml/ebmlutils.h +++ b/taglib/matroska/ebml/ebmlutils.h @@ -24,8 +24,6 @@ #include #include "taglib.h" -#include "tutils.h" -#include "tdebug.h" #include "ebmlelement.h" namespace TagLib { @@ -33,34 +31,20 @@ namespace TagLib { class ByteVector; namespace EBML { + std::unique_ptr findElement(File &file, Element::Id id, offset_t maxOffset); + std::unique_ptr findNextElement(File &file, offset_t maxOffset); + template - constexpr unsigned int VINTSizeLength(uint8_t firstByte) - { - static_assert(maxSizeLength >= 1 && maxSizeLength <= 8); - if(!firstByte) { - debug("VINT with greater than 8 bytes not allowed"); - return 0; - } - uint8_t mask = 0b10000000; - unsigned int numBytes = 1; - while(!(mask & firstByte)) { - numBytes++; - mask >>= 1; - } - if(numBytes > maxSizeLength) { - debug(Utils::formatString("VINT size length exceeds %i bytes", maxSizeLength)); - return 0; - } - return numBytes; - } + unsigned int VINTSizeLength(uint8_t firstByte); template std::pair readVINT(File &file); + template std::pair parseVINT(const ByteVector &buffer); - std::unique_ptr findElement(File &file, Element::Id id, offset_t maxOffset); - std::unique_ptr findNextElement(File &file, offset_t maxOffset); + ByteVector renderVINT(uint64_t number, int minSizeLength); + unsigned long long randomUID(); constexpr int minSize(uint64_t data) diff --git a/taglib/matroska/ebml/ebmlvoidelement.cpp b/taglib/matroska/ebml/ebmlvoidelement.cpp index d764e4a2..3a841c2e 100644 --- a/taglib/matroska/ebml/ebmlvoidelement.cpp +++ b/taglib/matroska/ebml/ebmlvoidelement.cpp @@ -25,6 +25,21 @@ using namespace TagLib; +EBML::VoidElement::VoidElement(int sizeLength, offset_t dataSize): + Element(Id::VoidElement, sizeLength, dataSize) +{ +} + +EBML::VoidElement::VoidElement(Id, int sizeLength, offset_t dataSize, offset_t): + Element(Id::VoidElement, sizeLength, dataSize) +{ +} + +EBML::VoidElement::VoidElement(): + Element(Id::VoidElement, 0, 0) +{ +} + ByteVector EBML::VoidElement::render() { offset_t bytesNeeded = targetSize; diff --git a/taglib/matroska/ebml/ebmlvoidelement.h b/taglib/matroska/ebml/ebmlvoidelement.h index d4e4e57f..24dd2a34 100644 --- a/taglib/matroska/ebml/ebmlvoidelement.h +++ b/taglib/matroska/ebml/ebmlvoidelement.h @@ -32,12 +32,9 @@ namespace TagLib { class VoidElement : public Element { public: - VoidElement(int sizeLength, offset_t dataSize) : - Element(Id::VoidElement, sizeLength, dataSize) {} - VoidElement(Id, int sizeLength, offset_t dataSize, offset_t) : - Element(Id::VoidElement, sizeLength, dataSize) {} - VoidElement() : - Element(Id::VoidElement, 0, 0) {} + VoidElement(int sizeLength, offset_t dataSize); + VoidElement(Id, int sizeLength, offset_t dataSize, offset_t); + VoidElement(); ByteVector render() override; offset_t getTargetSize() const; diff --git a/taglib/matroska/matroskaattachedfile.h b/taglib/matroska/matroskaattachedfile.h index b7afcd16..7df5f5e7 100644 --- a/taglib/matroska/matroskaattachedfile.h +++ b/taglib/matroska/matroskaattachedfile.h @@ -27,6 +27,7 @@ namespace TagLib { class String; class ByteVector; + namespace Matroska { //! Attached file embedded into a Matroska file. class TAGLIB_EXPORT AttachedFile diff --git a/taglib/matroska/matroskaattachments.h b/taglib/matroska/matroskaattachments.h index ba586684..84e6f150 100644 --- a/taglib/matroska/matroskaattachments.h +++ b/taglib/matroska/matroskaattachments.h @@ -28,9 +28,11 @@ namespace TagLib { class File; + namespace EBML { class MkAttachments; } + namespace Matroska { class AttachedFile; class File; diff --git a/taglib/matroska/matroskachapters.h b/taglib/matroska/matroskachapters.h index f033340f..895c7603 100644 --- a/taglib/matroska/matroskachapters.h +++ b/taglib/matroska/matroskachapters.h @@ -37,6 +37,7 @@ namespace TagLib { namespace EBML { class MkChapters; } + namespace Matroska { class ChapterEdition; class File; diff --git a/taglib/matroska/matroskacues.cpp b/taglib/matroska/matroskacues.cpp index 6be02904..2c4a4f63 100644 --- a/taglib/matroska/matroskacues.cpp +++ b/taglib/matroska/matroskacues.cpp @@ -36,6 +36,8 @@ Matroska::Cues::Cues(offset_t segmentDataOffset) : setNeedsRender(false); } +Matroska::Cues::~Cues() = default; + ByteVector Matroska::Cues::renderInternal() { const auto beforeSize = sizeRenderedOrWritten(); @@ -141,8 +143,15 @@ void Matroska::Cues::addCuePoint(std::unique_ptr &&cuePoint) cuePoints.push_back(std::move(cuePoint)); } +const Matroska::Cues::CuePointList &Matroska::Cues::cuePointList() +{ + return cuePoints; +} + Matroska::CuePoint::CuePoint() = default; +Matroska::CuePoint::~CuePoint() = default; + bool Matroska::CuePoint::isValid(TagLib::File &file, offset_t segmentDataOffset) const { for(const auto &track : cueTracks) { @@ -157,6 +166,21 @@ void Matroska::CuePoint::addCueTrack(std::unique_ptr &&cueTrack) cueTracks.push_back(std::move(cueTrack)); } +const Matroska::CuePoint::CueTrackList &Matroska::CuePoint::cueTrackList() const +{ + return cueTracks; +} + +void Matroska::CuePoint::setTime(Time timestamp) +{ + time = timestamp; +} + +Matroska::CuePoint::Time Matroska::CuePoint::getTime() const +{ + return time; +} + bool Matroska::CuePoint::adjustOffset(offset_t offset, offset_t delta) { bool ret = false; @@ -166,6 +190,10 @@ bool Matroska::CuePoint::adjustOffset(offset_t offset, offset_t delta) return ret; } +Matroska::CueTrack::CueTrack() = default; + +Matroska::CueTrack::~CueTrack() = default; + bool Matroska::CueTrack::isValid(TagLib::File &file, offset_t segmentDataOffset) const { if(!trackNumber) { @@ -191,6 +219,76 @@ bool Matroska::CueTrack::isValid(TagLib::File &file, offset_t segmentDataOffset) return true; } +void Matroska::CueTrack::setTrackNumber(unsigned long long trackNr) +{ + trackNumber = trackNr; +} + +unsigned long long Matroska::CueTrack::getTrackNumber() const +{ + return trackNumber; +} + +void Matroska::CueTrack::setClusterPosition(offset_t clusterPos) +{ + clusterPosition = clusterPos; +} + +offset_t Matroska::CueTrack::getClusterPosition() const +{ + return clusterPosition; +} + +void Matroska::CueTrack::setRelativePosition(std::optional relativePos) +{ + relativePosition = relativePos; +} + +std::optional Matroska::CueTrack::getRelativePosition() const +{ + return relativePosition; +} + +void Matroska::CueTrack::setCodecState(std::optional codecStatePos) +{ + codecState = codecStatePos; +} + +std::optional Matroska::CueTrack::getCodecState() const +{ + return codecState; +} + +void Matroska::CueTrack::setBlockNumber(std::optional blockNr) +{ + blockNumber = blockNr; +} + +std::optional Matroska::CueTrack::getBlockNumber() const +{ + return blockNumber; +} + +void Matroska::CueTrack::setDuration(std::optional segmentTicks) +{ + duration = segmentTicks; +} + +std::optional Matroska::CueTrack::getDuration() const +{ + return duration; +} + +void Matroska::CueTrack::addReferenceTime(unsigned long long refTime) +{ + refTimes.append(refTime); +} + +const Matroska::CueTrack::ReferenceTimeList &Matroska::CueTrack::referenceTimes() const +{ + return refTimes; +} + bool Matroska::CueTrack::adjustOffset(offset_t offset, offset_t delta) { bool ret = false; diff --git a/taglib/matroska/matroskacues.h b/taglib/matroska/matroskacues.h index 7241f8f3..e9285f69 100644 --- a/taglib/matroska/matroskacues.h +++ b/taglib/matroska/matroskacues.h @@ -43,10 +43,10 @@ namespace TagLib { public: using CuePointList = std::list>; explicit Cues(offset_t segmentDataOffset); - ~Cues() override = default; + ~Cues() override; bool isValid(TagLib::File &file) const; void addCuePoint(std::unique_ptr &&cuePoint); - const CuePointList &cuePointList() { return cuePoints; } + const CuePointList &cuePointList(); bool sizeChanged(Element &caller, offset_t delta) override; void write(TagLib::File &file) override; @@ -64,12 +64,12 @@ namespace TagLib { using CueTrackList = std::list>; using Time = unsigned long long; CuePoint(); - ~CuePoint() = default; + ~CuePoint(); bool isValid(TagLib::File &file, offset_t segmentDataOffset) const; void addCueTrack(std::unique_ptr &&cueTrack); - const CueTrackList &cueTrackList() const { return cueTracks; } - void setTime(Time timestamp) { time = timestamp; } - Time getTime() const { return time; } + const CueTrackList &cueTrackList() const; + void setTime(Time timestamp); + Time getTime() const; bool adjustOffset(offset_t offset, offset_t delta); private: @@ -81,23 +81,23 @@ namespace TagLib { { public: using ReferenceTimeList = List; - CueTrack() = default; - ~CueTrack() = default; + CueTrack(); + ~CueTrack(); bool isValid(TagLib::File &file, offset_t segmentDataOffset) const; - void setTrackNumber(unsigned long long trackNr) { trackNumber = trackNr; } - unsigned long long getTrackNumber() const { return trackNumber; } - void setClusterPosition(offset_t clusterPos) { clusterPosition = clusterPos; } - offset_t getClusterPosition() const { return clusterPosition; } - void setRelativePosition(std::optional relativePos) { relativePosition = relativePos; } - std::optional getRelativePosition() const { return relativePosition; } - void setCodecState(std::optional codecStatePos) { codecState = codecStatePos; } - std::optional getCodecState() const { return codecState; } - void setBlockNumber(std::optional blockNr) { blockNumber = blockNr; } - std::optional getBlockNumber() const { return blockNumber; } - void setDuration(std::optional segmentTicks) { duration = segmentTicks; } - std::optional getDuration() const { return duration; } - void addReferenceTime(unsigned long long refTime) { refTimes.append(refTime); } - const ReferenceTimeList &referenceTimes() const { return refTimes; } + void setTrackNumber(unsigned long long trackNr); + unsigned long long getTrackNumber() const; + void setClusterPosition(offset_t clusterPos); + offset_t getClusterPosition() const; + void setRelativePosition(std::optional relativePos); + std::optional getRelativePosition() const; + void setCodecState(std::optional codecStatePos); + std::optional getCodecState() const; + void setBlockNumber(std::optional blockNr); + std::optional getBlockNumber() const; + void setDuration(std::optional segmentTicks); + std::optional getDuration() const; + void addReferenceTime(unsigned long long refTime); + const ReferenceTimeList &referenceTimes() const; bool adjustOffset(offset_t offset, offset_t delta); private: diff --git a/taglib/matroska/matroskaproperties.h b/taglib/matroska/matroskaproperties.h index 0481ffc4..b81c7826 100644 --- a/taglib/matroska/matroskaproperties.h +++ b/taglib/matroska/matroskaproperties.h @@ -33,6 +33,7 @@ namespace TagLib::EBML { class MkTracks; class MkInfo; } + namespace TagLib::Matroska { class File; diff --git a/taglib/matroska/matroskaseekhead.cpp b/taglib/matroska/matroskaseekhead.cpp index 88ad1d7e..bc8bb0a1 100644 --- a/taglib/matroska/matroskaseekhead.cpp +++ b/taglib/matroska/matroskaseekhead.cpp @@ -36,6 +36,8 @@ Matroska::SeekHead::SeekHead(offset_t segmentDataOffset) : setNeedsRender(false); } +Matroska::SeekHead::~SeekHead() = default; + bool Matroska::SeekHead::isValid(TagLib::File &file) const { bool result = true; diff --git a/taglib/matroska/matroskaseekhead.h b/taglib/matroska/matroskaseekhead.h index 0775cf1e..56fe6f4c 100644 --- a/taglib/matroska/matroskaseekhead.h +++ b/taglib/matroska/matroskaseekhead.h @@ -34,7 +34,7 @@ namespace TagLib { { public: explicit SeekHead(offset_t segmentDataOffset); - ~SeekHead() override = default; + ~SeekHead() override; bool isValid(TagLib::File &file) const; void addEntry(const Element &element); diff --git a/taglib/matroska/matroskasegment.cpp b/taglib/matroska/matroskasegment.cpp index 1c0e91b5..d4d52c1a 100644 --- a/taglib/matroska/matroskasegment.cpp +++ b/taglib/matroska/matroskasegment.cpp @@ -20,6 +20,7 @@ #include "matroskasegment.h" #include "ebmlutils.h" +#include "tbytevector.h" using namespace TagLib; @@ -31,6 +32,8 @@ Matroska::Segment::Segment(offset_t sizeLength, offset_t dataSize, offset_t leng setSize(sizeLength); } +Matroska::Segment::~Segment() = default; + ByteVector Matroska::Segment::renderInternal() { return EBML::renderVINT(dataSize, static_cast(sizeLength)); @@ -61,3 +64,8 @@ bool Matroska::Segment::sizeChanged(Element &, offset_t delta) setNeedsRender(true); return true; } + +offset_t Matroska::Segment::dataOffset() const +{ + return offset() + sizeLength; +} diff --git a/taglib/matroska/matroskasegment.h b/taglib/matroska/matroskasegment.h index 6e6d88bf..cd6952dc 100644 --- a/taglib/matroska/matroskasegment.h +++ b/taglib/matroska/matroskasegment.h @@ -29,10 +29,10 @@ namespace TagLib::Matroska { { public: Segment(offset_t sizeLength, offset_t dataSize, offset_t lengthOffset); - ~Segment() override = default; + ~Segment() override; bool render() override; bool sizeChanged(Element &caller, offset_t delta) override; - offset_t dataOffset() const { return offset() + sizeLength; } + offset_t dataOffset() const; private: ByteVector renderInternal() override; diff --git a/tests/test_sizes.cpp b/tests/test_sizes.cpp index aaae162d..ebc36a3a 100644 --- a/tests/test_sizes.cpp +++ b/tests/test_sizes.cpp @@ -149,6 +149,10 @@ #include "trueaudioproperties.h" #endif #ifdef TAGLIB_WITH_MATROSKA +#include "matroskaattachedfile.h" +#include "matroskaattachments.h" +#include "matroskachapteredition.h" +#include "matroskachapters.h" #include "matroskafile.h" #include "matroskaproperties.h" #include "matroskatag.h" @@ -156,10 +160,6 @@ #include -#include "matroskaattachedfile.h" -#include "matroskaattachments.h" -#include "matroskachapters.h" - using namespace std; using namespace TagLib; @@ -314,6 +314,9 @@ public: CPPUNIT_ASSERT_EQUAL(classSize(0, true), sizeof(TagLib::Matroska::Element)); CPPUNIT_ASSERT_EQUAL(classSize(1, true), sizeof(TagLib::Matroska::Attachments)); CPPUNIT_ASSERT_EQUAL(classSize(1, true), sizeof(TagLib::Matroska::Chapters)); + CPPUNIT_ASSERT_EQUAL(classSize(0, false), sizeof(TagLib::Matroska::ChapterEdition)); + CPPUNIT_ASSERT_EQUAL(classSize(0, false), sizeof(TagLib::Matroska::Chapter)); + CPPUNIT_ASSERT_EQUAL(classSize(0, false), sizeof(TagLib::Matroska::Chapter::Display)); CPPUNIT_ASSERT_EQUAL(classSize(0, false), sizeof(TagLib::Matroska::SimpleTag)); CPPUNIT_ASSERT_EQUAL(classSize(0, false), sizeof(TagLib::Matroska::AttachedFile)); #endif