#include "config.h"
#include "ISOBox.h"
#include <runtime/DataView.h>
using JSC::DataView;
namespace WebCore {
ISOBox::PeekResult ISOBox::peekBox(DataView& view, unsigned offset)
{
uint64_t size = 0;
if (!checkedRead<uint32_t>(size, view, offset, BigEndian))
return std::nullopt;
FourCC type = { uint32_t { 0 } };
if (!checkedRead<uint32_t>(type, view, offset, BigEndian))
return std::nullopt;
if (size == 1 && !checkedRead<uint64_t>(size, view, offset, BigEndian))
return std::nullopt;
return std::make_pair(type, size);
}
bool ISOBox::read(DataView& view)
{
unsigned localOffset { 0 };
return parse(view, localOffset);
}
bool ISOBox::read(DataView& view, unsigned& offset)
{
unsigned localOffset = offset;
if (!parse(view, localOffset))
return false;
offset += m_size;
return true;
}
bool ISOBox::parse(DataView& view, unsigned& offset)
{
if (!checkedRead<uint32_t>(m_size, view, offset, BigEndian))
return false;
if (!checkedRead<uint32_t>(m_boxType, view, offset, BigEndian))
return false;
if (m_size == 1 && !checkedRead<uint64_t>(m_size, view, offset, BigEndian))
return false;
if (m_boxType == "uuid") {
struct ExtendedType {
uint8_t value[16];
} extendedTypeStruct;
if (!checkedRead<ExtendedType>(extendedTypeStruct, view, offset, BigEndian))
return false;
Vector<uint8_t> extendedType;
extendedType.reserveInitialCapacity(16);
for (auto& character : extendedTypeStruct.value)
extendedType.uncheckedAppend(character);
m_extendedType = WTFMove(extendedType);
}
return true;
}
bool ISOFullBox::parse(DataView& view, unsigned& offset)
{
if (!ISOBox::parse(view, offset))
return false;
uint32_t versionAndFlags = 0;
if (!checkedRead<uint32_t>(versionAndFlags, view, offset, BigEndian))
return false;
m_version = versionAndFlags >> 24;
m_flags = versionAndFlags & 0xFFFFFF;
return true;
}
}