2015-04-22 19:22:01 +02:00
|
|
|
#ifndef MEDIA_OGGCONTAINER_H
|
|
|
|
#define MEDIA_OGGCONTAINER_H
|
|
|
|
|
2015-09-06 19:57:33 +02:00
|
|
|
#include "./oggpage.h"
|
|
|
|
#include "./oggstream.h"
|
|
|
|
#include "./oggiterator.h"
|
2015-04-22 19:22:01 +02:00
|
|
|
|
2015-09-06 19:57:33 +02:00
|
|
|
#include "../vorbis/vorbiscomment.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
|
|
|
|
|
|
|
#include <unordered_map>
|
|
|
|
#include <tuple>
|
|
|
|
|
|
|
|
namespace Media {
|
|
|
|
|
|
|
|
class MediaFileInfo;
|
|
|
|
|
2015-08-16 23:39:42 +02:00
|
|
|
struct LIB_EXPORT VorbisCommentInfo
|
|
|
|
{
|
2016-01-17 19:32:58 +01:00
|
|
|
VorbisCommentInfo(std::vector<OggPage>::size_type firstPageIndex, std::vector<OggPage>::size_type firstSegmentIndex, std::vector<OggPage>::size_type tagIndex, GeneralMediaFormat streamFormat = GeneralMediaFormat::Vorbis);
|
2015-08-16 23:39:42 +02:00
|
|
|
|
|
|
|
std::vector<OggPage>::size_type firstPageIndex;
|
|
|
|
std::vector<OggPage>::size_type firstSegmentIndex;
|
|
|
|
std::vector<OggPage>::size_type lastPageIndex;
|
|
|
|
std::vector<OggPage>::size_type lastSegmentIndex;
|
|
|
|
std::vector<std::unique_ptr<VorbisComment> >::size_type tagIndex;
|
2016-01-17 19:32:58 +01:00
|
|
|
GeneralMediaFormat streamFormat;
|
2015-08-16 23:39:42 +02:00
|
|
|
};
|
|
|
|
|
2016-01-17 19:32:58 +01:00
|
|
|
inline VorbisCommentInfo::VorbisCommentInfo(std::vector<OggPage>::size_type firstPageIndex, std::vector<OggPage>::size_type firstSegmentIndex, std::vector<OggPage>::size_type tagIndex, GeneralMediaFormat mediaFormat) :
|
2015-08-16 23:39:42 +02:00
|
|
|
firstPageIndex(firstPageIndex),
|
|
|
|
firstSegmentIndex(firstSegmentIndex),
|
|
|
|
lastPageIndex(0),
|
|
|
|
lastSegmentIndex(0),
|
2016-01-17 19:32:58 +01:00
|
|
|
tagIndex(tagIndex),
|
|
|
|
streamFormat(mediaFormat)
|
2015-08-16 23:39:42 +02:00
|
|
|
{}
|
|
|
|
|
2015-04-22 19:22:01 +02:00
|
|
|
class LIB_EXPORT OggContainer : public GenericContainer<MediaFileInfo, VorbisComment, OggStream, OggPage>
|
|
|
|
{
|
|
|
|
friend class OggStream;
|
|
|
|
|
|
|
|
public:
|
|
|
|
OggContainer(MediaFileInfo &fileInfo, uint64 startOffset);
|
|
|
|
~OggContainer();
|
|
|
|
|
|
|
|
bool isChecksumValidationEnabled() const;
|
|
|
|
void setChecksumValidationEnabled(bool enabled);
|
2015-10-06 22:39:18 +02:00
|
|
|
void reset();
|
2015-04-22 19:22:01 +02:00
|
|
|
|
|
|
|
protected:
|
|
|
|
void internalParseHeader();
|
|
|
|
void internalParseTags();
|
|
|
|
void internalParseTracks();
|
|
|
|
void internalMakeFile();
|
|
|
|
|
|
|
|
private:
|
2016-01-17 19:32:58 +01:00
|
|
|
void ariseComment(std::vector<OggPage>::size_type pageIndex, std::vector<uint32>::size_type segmentIndex, GeneralMediaFormat mediaFormat = GeneralMediaFormat::Vorbis);
|
2015-04-22 19:22:01 +02:00
|
|
|
|
|
|
|
std::unordered_map<uint32, std::vector<std::unique_ptr<OggStream> >::size_type> m_streamsBySerialNo;
|
2015-08-16 23:39:42 +02:00
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Consists of first page index, first segment index, last page index, last segment index and tag index (in this order).
|
|
|
|
*/
|
|
|
|
std::list<VorbisCommentInfo> m_commentTable;
|
|
|
|
|
2015-04-22 19:22:01 +02:00
|
|
|
OggIterator m_iterator;
|
|
|
|
bool m_validateChecksums;
|
|
|
|
};
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Returns whether checksum validation is enabled.
|
|
|
|
*
|
|
|
|
* If checksum validation is enabled, the parser will validate the OGG pages by
|
|
|
|
* checking the CRC32 checksum.
|
|
|
|
*
|
|
|
|
* \sa setChecksumValidationEnabled()
|
|
|
|
*/
|
|
|
|
inline bool OggContainer::isChecksumValidationEnabled() const
|
|
|
|
{
|
|
|
|
return m_validateChecksums;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Sets whether checksum validation is enabled.
|
|
|
|
* \sa isChecksumValidationEnabled()
|
|
|
|
*/
|
|
|
|
inline void OggContainer::setChecksumValidationEnabled(bool enabled)
|
|
|
|
{
|
|
|
|
m_validateChecksums = enabled;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif // MEDIA_OGGCONTAINER_H
|