From a8dce14514b10eaaa398f11a85dc82cc1ed7505e Mon Sep 17 00:00:00 2001 From: Martchus Date: Wed, 16 Nov 2016 19:31:09 +0100 Subject: [PATCH] Allow checking index position Only implemented for MP4 so far --- abstractcontainer.cpp | 10 ++++++++++ abstractcontainer.h | 1 + matroska/matroskacontainer.cpp | 5 +++++ matroska/matroskacontainer.h | 1 + mp4/mp4container.cpp | 16 ++++++++++++++-- mp4/mp4container.h | 1 + 6 files changed, 32 insertions(+), 2 deletions(-) diff --git a/abstractcontainer.cpp b/abstractcontainer.cpp index 6a19856..97e0429 100644 --- a/abstractcontainer.cpp +++ b/abstractcontainer.cpp @@ -171,6 +171,16 @@ bool AbstractContainer::supportsTrackModifications() const return false; } +/*! + * \brief Determines the position of the index. + * \returns Returns ElementPosition::BeforeData or ElementPosition::AfterData if the position could + * be determined; otherwise returns ElementPosition::Keep. + */ +ElementPosition AbstractContainer::determineIndexPosition() const +{ + return ElementPosition::Keep; +} + /*! * \brief Internally called to parse the header. * diff --git a/abstractcontainer.h b/abstractcontainer.h index 2f1be11..fa26751 100644 --- a/abstractcontainer.h +++ b/abstractcontainer.h @@ -67,6 +67,7 @@ public: virtual bool removeTrack(AbstractTrack *track); virtual void removeAllTracks(); virtual bool supportsTrackModifications() const; + virtual ElementPosition determineIndexPosition() const; virtual AbstractChapter *chapter(std::size_t index); virtual std::size_t chapterCount() const; diff --git a/matroska/matroskacontainer.cpp b/matroska/matroskacontainer.cpp index f646e1d..458a99b 100644 --- a/matroska/matroskacontainer.cpp +++ b/matroska/matroskacontainer.cpp @@ -337,6 +337,11 @@ ElementPosition MatroskaContainer::determineTagPosition() const return ElementPosition::Keep; // TODO } +ElementPosition MatroskaContainer::determineIndexPosition() const +{ + return ElementPosition::Keep; // TODO +} + void MatroskaContainer::internalParseHeader() { static const string context("parsing header of Matroska container"); diff --git a/matroska/matroskacontainer.h b/matroska/matroskacontainer.h index 11e1985..0766f52 100644 --- a/matroska/matroskacontainer.h +++ b/matroska/matroskacontainer.h @@ -42,6 +42,7 @@ public: MatroskaAttachment *attachment(std::size_t index); std::size_t attachmentCount() const; ElementPosition determineTagPosition() const; + ElementPosition determineIndexPosition() const; virtual bool supportsTitle() const; virtual std::size_t segmentCount() const; diff --git a/mp4/mp4container.cpp b/mp4/mp4container.cpp index 80317ed..32e7cd8 100644 --- a/mp4/mp4container.cpp +++ b/mp4/mp4container.cpp @@ -48,8 +48,8 @@ void Mp4Container::reset() ElementPosition Mp4Container::determineTagPosition() const { if(m_firstElement) { - Mp4Atom *mediaDataAtom = m_firstElement->siblingById(Mp4AtomIds::MediaData); - Mp4Atom *userDataAtom = m_firstElement->subelementByPath({Mp4AtomIds::Movie, Mp4AtomIds::UserData}); + const Mp4Atom *mediaDataAtom = m_firstElement->siblingById(Mp4AtomIds::MediaData); + const Mp4Atom *userDataAtom = m_firstElement->subelementByPath({Mp4AtomIds::Movie, Mp4AtomIds::UserData}); if(mediaDataAtom && userDataAtom) { return userDataAtom->startOffset() < mediaDataAtom->startOffset() ? ElementPosition::BeforeData : ElementPosition::AfterData; } @@ -57,6 +57,18 @@ ElementPosition Mp4Container::determineTagPosition() const return ElementPosition::Keep; } +ElementPosition Mp4Container::determineIndexPosition() const +{ + if(m_firstElement) { + const Mp4Atom *mediaDataAtom = m_firstElement->siblingById(Mp4AtomIds::MediaData); + const Mp4Atom *movieAtom = m_firstElement->siblingById(Mp4AtomIds::Movie); + if(mediaDataAtom && movieAtom) { + return movieAtom->startOffset() < mediaDataAtom->startOffset() ? ElementPosition::BeforeData : ElementPosition::AfterData; + } + } + return ElementPosition::Keep; +} + void Mp4Container::internalParseHeader() { //const string context("parsing header of MP4 container"); will be used when generating notifications diff --git a/mp4/mp4container.h b/mp4/mp4container.h index 9240faf..fa0f8f4 100644 --- a/mp4/mp4container.h +++ b/mp4/mp4container.h @@ -26,6 +26,7 @@ public: bool isFragmented() const; void reset(); ElementPosition determineTagPosition() const; + ElementPosition determineIndexPosition() const; protected: void internalParseHeader();