#pragma once
#include "BuildSettings.h"
#include "../common/Endianness.h"
#include "../common/mptIO.h"
#include "../common/FileReaderFwd.h"
OPENMPT_NAMESPACE_BEGIN
namespace Ogg
{
struct PageHeader
{
char capture_pattern[4]; uint8le version;
uint8le header_type;
uint64le granule_position;
uint32le bitstream_serial_number;
uint32le page_seqauence_number;
uint32le CRC_checksum;
uint8le page_segments;
};
} MPT_BINARY_STRUCT(Ogg::PageHeader, 27)
namespace Ogg {
struct PageInfo
{
PageHeader header;
uint8 segment_table[255];
PageInfo()
{
MemsetZero(header);
MemsetZero(segment_table);
}
uint16 GetPagePhysicalSize() const;
uint16 GetPageDataSize() const;
};
bool AdvanceToPageMagic(FileReader &file);
bool ReadPage(FileReader &file, PageInfo &pageInfo, std::vector<uint8> &pageData);
bool ReadPageAndSkipJunk(FileReader &file, PageInfo &pageInfo, std::vector<uint8> &pageData);
bool UpdatePageCRC(PageInfo &pageInfo, const std::vector<uint8> &pageData);
template <typename Tfile>
bool WritePage(Tfile & f, const PageInfo &pageInfo, const std::vector<uint8> &pageData)
{
if(!mpt::IO::Write(f, pageInfo.header))
{
return false;
}
if(!mpt::IO::WriteRaw(f, pageInfo.segment_table, pageInfo.header.page_segments))
{
return false;
}
if(!mpt::IO::WriteRaw(f, pageData.data(), pageData.size()))
{
return false;
}
return true;
}
}
OPENMPT_NAMESPACE_END