tagparser/matroska/matroskacontainer.h

160 lines
5.1 KiB
C
Raw Normal View History

#ifndef TAG_PARSER_MATROSKACONTAINER_H
#define TAG_PARSER_MATROSKACONTAINER_H
2015-04-22 19:22:01 +02:00
2015-09-06 19:57:33 +02:00
#include "./ebmlelement.h"
2018-03-07 01:17:50 +01:00
#include "./matroskaattachment.h"
#include "./matroskachapter.h"
2015-09-06 19:57:33 +02:00
#include "./matroskatag.h"
#include "./matroskatrack.h"
2015-04-22 19:22:01 +02:00
2015-09-06 19:57:33 +02:00
#include "../genericcontainer.h"
2015-04-22 19:22:01 +02:00
2019-03-13 19:06:42 +01:00
#include <cstdint>
2015-04-22 19:22:01 +02:00
#include <memory>
#include <string>
#include <vector>
namespace TagParser {
2015-04-22 19:22:01 +02:00
class MatroskaSeekInfo;
class MatroskaEditionEntry;
class MediaFileInfo;
class TAG_PARSER_EXPORT MatroskaContainer final : public GenericContainer<MediaFileInfo, MatroskaTag, MatroskaTrack, EbmlElement> {
2015-04-22 19:22:01 +02:00
public:
2019-03-13 19:06:42 +01:00
MatroskaContainer(MediaFileInfo &stream, std::uint64_t startOffset);
~MatroskaContainer() override;
2015-04-22 19:22:01 +02:00
void validateIndex(Diagnostics &diag, AbortableProgressFeedback &progress);
2019-03-13 19:06:42 +01:00
std::uint64_t maxIdLength() const;
std::uint64_t maxSizeLength() const;
2018-03-07 01:17:50 +01:00
const std::vector<std::unique_ptr<MatroskaSeekInfo>> &seekInfos() const;
2015-04-22 19:22:01 +02:00
2019-03-13 19:06:42 +01:00
static std::uint64_t maxFullParseSize();
void setMaxFullParseSize(std::uint64_t maxFullParseSize);
2018-03-07 01:17:50 +01:00
const std::vector<std::unique_ptr<MatroskaEditionEntry>> &editionEntires() const;
MatroskaChapter *chapter(std::size_t index) override;
std::size_t chapterCount() const override;
MatroskaAttachment *createAttachment() override;
MatroskaAttachment *attachment(std::size_t index) override;
std::size_t attachmentCount() const override;
2019-03-13 19:06:42 +01:00
ElementPosition determineElementPosition(std::uint64_t elementId, Diagnostics &diag) const;
ElementPosition determineTagPosition(Diagnostics &diag) const override;
ElementPosition determineIndexPosition(Diagnostics &diag) const override;
2015-04-22 19:22:01 +02:00
virtual bool supportsTitle() const override;
virtual std::size_t segmentCount() const override;
void reset() override;
2015-10-06 22:39:18 +02:00
2015-04-22 19:22:01 +02:00
protected:
void internalParseHeader(Diagnostics &diag, AbortableProgressFeedback &progress) override;
void internalParseTags(Diagnostics &diag, AbortableProgressFeedback &progress) override;
void internalParseTracks(Diagnostics &diag, AbortableProgressFeedback &progress) override;
void internalParseChapters(Diagnostics &diag, AbortableProgressFeedback &progress) override;
void internalParseAttachments(Diagnostics &diag, AbortableProgressFeedback &progress) override;
void internalMakeFile(Diagnostics &diag, AbortableProgressFeedback &progress) override;
2015-04-22 19:22:01 +02:00
private:
void parseSegmentInfo(Diagnostics &diag);
void readTrackStatisticsFromTags(Diagnostics &diag);
2015-04-22 19:22:01 +02:00
2019-03-13 19:06:42 +01:00
std::uint64_t m_maxIdLength;
std::uint64_t m_maxSizeLength;
2015-04-22 19:22:01 +02:00
std::vector<EbmlElement *> m_tracksElements;
std::vector<EbmlElement *> m_segmentInfoElements;
std::vector<EbmlElement *> m_tagsElements;
std::vector<EbmlElement *> m_chaptersElements;
std::vector<EbmlElement *> m_attachmentsElements;
2018-03-07 01:17:50 +01:00
std::vector<std::unique_ptr<MatroskaSeekInfo>> m_seekInfos;
std::vector<std::unique_ptr<MatroskaEditionEntry>> m_editionEntries;
std::vector<std::unique_ptr<MatroskaAttachment>> m_attachments;
std::size_t m_segmentCount;
2019-03-13 19:06:42 +01:00
static std::uint64_t m_maxFullParseSize;
2015-04-22 19:22:01 +02:00
};
/*!
* \brief Returns the maximal ID length in bytes.
*/
2019-03-13 19:06:42 +01:00
inline std::uint64_t MatroskaContainer::maxIdLength() const
2015-04-22 19:22:01 +02:00
{
return m_maxIdLength;
}
/*!
* \brief Returns the maximal size length in bytes.
*/
2019-03-13 19:06:42 +01:00
inline std::uint64_t MatroskaContainer::maxSizeLength() const
2015-04-22 19:22:01 +02:00
{
return m_maxSizeLength;
}
/*!
* \brief Returns seek information read from "SeekHead"-elements when parsing segment info.
2015-04-22 19:22:01 +02:00
*/
2018-03-07 01:17:50 +01:00
inline const std::vector<std::unique_ptr<MatroskaSeekInfo>> &MatroskaContainer::seekInfos() const
2015-04-22 19:22:01 +02:00
{
return m_seekInfos;
}
/*!
* \brief Returns the maximal file size for a "full parse" in byte.
*
* The "Tags" element (which holds the tag information) is commonly at the end of a Matroska file. Hence the
* parser needs to walk through the entire file to find the tag information if no "SeekHead" element is present
* which might causes long loading times. To avoid this a maximal file size for a "full parse" can be specified.
* The disadvantage is that the parser relies on the presence of a SeekHead element on larger files to retrieve
* tag information.
*
* The default value is 50 MiB.
*
* \sa setMaxFullParseSize()
*/
2019-03-13 19:06:42 +01:00
inline std::uint64_t MatroskaContainer::maxFullParseSize()
2015-04-22 19:22:01 +02:00
{
return m_maxFullParseSize;
}
/*!
* \brief Sets the maximal file size for a "full parse" in byte.
* \sa maxFullParseSize()
*/
2019-03-13 19:06:42 +01:00
inline void MatroskaContainer::setMaxFullParseSize(std::uint64_t maxFullParseSize)
2015-04-22 19:22:01 +02:00
{
m_maxFullParseSize = maxFullParseSize;
}
/*!
* \brief Returns the edition entries.
*/
2018-03-07 01:17:50 +01:00
inline const std::vector<std::unique_ptr<MatroskaEditionEntry>> &MatroskaContainer::editionEntires() const
2015-04-22 19:22:01 +02:00
{
return m_editionEntries;
}
inline MatroskaAttachment *MatroskaContainer::attachment(std::size_t index)
{
return m_attachments.at(index).get();
}
inline std::size_t MatroskaContainer::attachmentCount() const
{
return m_attachments.size();
}
inline bool MatroskaContainer::supportsTitle() const
{
return true;
}
inline std::size_t MatroskaContainer::segmentCount() const
{
return m_segmentInfoElements.size();
}
2018-03-07 01:17:50 +01:00
} // namespace TagParser
2015-04-22 19:22:01 +02:00
#endif // MATROSKACONTAINER_H