EbmlWriter.h revision c278e7d7a71519a4ce9d9ca7f3c2d28989effd1c
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync/* $Id$ */
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync/** @file
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync * EbmlWriter.h - EBML writer + WebM container.
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync */
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync/*
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync * Copyright (C) 2013 Oracle Corporation
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync *
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync * available from http://www.virtualbox.org. This file is free software;
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync * you can redistribute it and/or modify it under the terms of the GNU
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync * General Public License (GPL) as published by the Free Software
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync */
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync/*
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync * This code is based on:
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync *
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync *
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync * Use of this source code is governed by a BSD-style license
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync * that can be found in the LICENSE file in the root of the source
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync * tree. An additional intellectual property rights grant can be found
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync * in the file PATENTS. All contributing project authors may
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync * be found in the AUTHORS file in the root of the source tree.
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync */
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync#ifndef ____EBMLWRITER
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync#define ____EBMLWRITER
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync#include <iprt/file.h>
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync#include <iprt/cdefs.h>
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync#include <iprt/asm.h>
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync#include <iprt/mem.h>
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync#include <iprt/string.h>
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync#include <VBox/log.h>
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync#include <vpx/vpx_encoder.h>
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync#include <stack>
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync#include <list>
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync#include <limits>
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsyncclass Ebml
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync{
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsyncpublic:
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync typedef uint32_t EbmlClassId;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsyncprivate:
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync struct EbmlSubElement
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync uint64_t offset;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync EbmlClassId classId;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync EbmlSubElement(uint64_t offs, EbmlClassId cid) : offset(offs), classId(cid) {}
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync };
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync std::stack<EbmlSubElement> m_Elements;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync RTFILE m_File;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsyncpublic:
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync template<EbmlClassId, typename T>
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync struct Var
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync T value;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync explicit Var(const T &v) : value(v) {}
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync };
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync template<EbmlClassId classId> struct SignedInteger : Var<classId, int64_t> { SignedInteger(int64_t v) : Var<classId, int64_t>(v) {} };
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync template<EbmlClassId classId> struct UnsignedInteger : Var<classId, uint64_t> { UnsignedInteger(int64_t v) : Var<classId, uint64_t>(v) {} };
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync template<EbmlClassId classId> struct Float : Var<classId, double> { Float(double v) : Var<classId, double>(v) {}};
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync template<EbmlClassId classId> struct String : Var<classId, const char *> { String(const char *v) : Var<classId, const char *>(v) {}};
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync /* Master-element block */
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync template<EbmlClassId classId> struct SubStart {};
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync /* End of master-element block, a pseudo type */
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync template<EbmlClassId classId> struct SubEnd {};
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync /* Not an EBML type, used for optimization purposes */
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync template<EbmlClassId classId, EbmlClassId id> struct Const {};
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync Ebml();
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync void init(const RTFILE &a_File);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync template<EbmlClassId classId>
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync inline Ebml &operator<<(const SubStart<classId> &dummy)
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync serializeConst<classId>();
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync m_Elements.push(EbmlSubElement(RTFileTell(m_File), classId));
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync write<uint64_t>(UINT64_C(0x01FFFFFFFFFFFFFF));
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync return *this;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync }
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync template<EbmlClassId classId>
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync inline Ebml &operator<<(const SubEnd<classId> &dummy)
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync if(m_Elements.empty() || m_Elements.top().classId != classId) throw VERR_INTERNAL_ERROR;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync uint64_t uPos = RTFileTell(m_File);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync uint64_t uSize = uPos - m_Elements.top().offset - 8;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync RTFileSeek(m_File, m_Elements.top().offset, RTFILE_SEEK_BEGIN, NULL);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // make sure that size will be serialized as uint64
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync write<uint64_t>(uSize | UINT64_C(0x0100000000000000));
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync RTFileSeek(m_File, uPos, RTFILE_SEEK_BEGIN, NULL);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync m_Elements.pop();
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync return *this;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync }
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync template<EbmlClassId classId, typename T>
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync inline Ebml &operator<<(const Var<classId, T> &value)
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync serializeConst<classId>();
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync serializeConstEbml<sizeof(T)>();
9eef83afd866975dc281176ba0bf2d891d9ab33avboxsync write<T>(value.value);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync return *this;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync }
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync template<EbmlClassId classId>
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync inline Ebml &operator<<(const String<classId> &str)
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync serializeConst<classId>();
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync uint64_t size = strlen(str.value);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync serializeInteger(size);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync write(str.value, size);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync return *this;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync }
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync template<EbmlClassId classId>
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync inline Ebml &operator<<(const SignedInteger<classId> &parm)
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync serializeConst<classId>();
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync size_t size = getSizeOfInt(parm.value);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync serializeInteger(size);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync int64_t value = RT_H2BE_U64(parm.value);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync write(reinterpret_cast<uint8_t*>(&value) + 8 - size, size);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync return *this;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync }
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync template<EbmlClassId classId>
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync inline Ebml &operator<<(const UnsignedInteger<classId> &parm)
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync serializeConst<classId>();
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync size_t size = getSizeOfUInt(parm.value);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync serializeInteger(size);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync uint64_t value = RT_H2BE_U64(parm.value);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync write(reinterpret_cast<uint8_t*>(&value) + 8 - size, size);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync return *this;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync }
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync template<EbmlClassId classId>
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync inline Ebml &operator<<(const Float<classId> &parm)
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync return operator<<(Var<classId, uint64_t>(*reinterpret_cast<const uint64_t *>(&parm.value)));
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync }
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync template<EbmlClassId classId, EbmlClassId id>
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync inline Ebml &operator<<(const Const<classId, id> &)
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync serializeConst<classId>();
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync serializeConstEbml<SizeOfConst<id>::value>();
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync serializeInteger(id);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync serializeConst<id>();
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync return *this;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync }
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync void write(const void *data, size_t size);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync template <typename T>
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync void write(const T &data)
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync if (std::numeric_limits<T>::is_integer)
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync T tmp;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync switch(sizeof(T))
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync case 2:
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync tmp = RT_H2BE_U16(data);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync break;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync case 4:
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync tmp = RT_H2BE_U32(data);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync break;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync case 8:
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync tmp = RT_H2BE_U64(data);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync break;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync default:
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync tmp = data;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync }
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync write(&tmp, sizeof(T));
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync }
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync else write(&data, sizeof(T));
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync }
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync template<uint64_t parm>
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync inline void serializeConst()
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync static const uint64_t mask = RT_BIT_64(SizeOfConst<parm>::value * 8 - 1);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync uint64_t value = RT_H2BE_U64((parm &
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync (((mask << 1) - 1) >> SizeOfConst<parm>::value)) |
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync (mask >> (SizeOfConst<parm>::value - 1)));
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync write(reinterpret_cast<uint8_t *>(&value) + (8 - SizeOfConst<parm>::value),
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync SizeOfConst<parm>::value);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync }
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync template<uint64_t parm>
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync inline void serializeConstEbml()
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync static const uint64_t mask = RT_BIT_64(SizeOfConst<parm>::ebmlValue * 8 - 1);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync uint64_t value = RT_H2BE_U64((parm &
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync (((mask << 1) - 1) >> SizeOfConst<parm>::ebmlValue)) |
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync (mask >> (SizeOfConst<parm>::ebmlValue - 1)));
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync write(reinterpret_cast<uint8_t *>(&value) + (8 - SizeOfConst<parm>::ebmlValue),
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync SizeOfConst<parm>::ebmlValue);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync }
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync inline void serializeInteger(uint64_t parm)
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync const size_t size = 8 - ! (parm & (UINT64_MAX << 49)) - ! (parm & (UINT64_MAX << 42)) -
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync ! (parm & (UINT64_MAX << 35)) - ! (parm & (UINT64_MAX << 28)) -
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync ! (parm & (UINT64_MAX << 21)) - ! (parm & (UINT64_MAX << 14)) -
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync ! (parm & (UINT64_MAX << 7));
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync uint64_t mask = RT_BIT_64(size * 8 - 1);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync uint64_t value = RT_H2BE_U64((parm &
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync (((mask << 1) - 1) >> size)) |
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync (mask >> (size - 1)));
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync write(reinterpret_cast<uint8_t *>(&value) + (8 - size),
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync size);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync }
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync /* runtime calculation */
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync static inline size_t getSizeOfUInt(uint64_t arg)
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync return 8 - ! (arg & (UINT64_MAX << 56)) - ! (arg & (UINT64_MAX << 48)) -
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync ! (arg & (UINT64_MAX << 40)) - ! (arg & (UINT64_MAX << 32)) -
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync ! (arg & (UINT64_MAX << 24)) - ! (arg & (UINT64_MAX << 16)) -
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync ! (arg & (UINT64_MAX << 8));
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync }
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync static inline size_t getSizeOfInt(int64_t arg)
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync return 8 - ! (arg & (INT64_C(-1) << 56)) - ! (~arg & (INT64_C(-1) << 56)) -
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync ! (arg & (INT64_C(-1) << 48)) - ! (~arg & (INT64_C(-1) << 48)) -
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync ! (arg & (INT64_C(-1) << 40)) - ! (~arg & (INT64_C(-1) << 40)) -
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync ! (arg & (INT64_C(-1) << 32)) - ! (~arg & (INT64_C(-1) << 32)) -
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync ! (arg & (INT64_C(-1) << 24)) - ! (~arg & (INT64_C(-1) << 24)) -
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync ! (arg & (INT64_C(-1) << 16)) - ! (~arg & (INT64_C(-1) << 16)) -
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync ! (arg & (INT64_C(-1) << 8)) - ! (~arg & (INT64_C(-1) << 8));
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync }
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync /* Compile-time calculation for constants */
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync template<uint64_t arg>
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync struct SizeOfConst
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync static const size_t value = 8 -
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync ! (arg & (UINT64_MAX << 56)) - ! (arg & (UINT64_MAX << 48)) -
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync ! (arg & (UINT64_MAX << 40)) - ! (arg & (UINT64_MAX << 32)) -
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync ! (arg & (UINT64_MAX << 24)) - ! (arg & (UINT64_MAX << 16)) -
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync ! (arg & (UINT64_MAX << 8));
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync static const size_t ebmlValue = 8 -
c278e7d7a71519a4ce9d9ca7f3c2d28989effd1cvboxsync ! (arg & (UINT64_MAX << 49)) - ! (arg & (UINT64_MAX << 42)) -
c278e7d7a71519a4ce9d9ca7f3c2d28989effd1cvboxsync ! (arg & (UINT64_MAX << 35)) - ! (arg & (UINT64_MAX << 28)) -
c278e7d7a71519a4ce9d9ca7f3c2d28989effd1cvboxsync ! (arg & (UINT64_MAX << 21)) - ! (arg & (UINT64_MAX << 14)) -
c278e7d7a71519a4ce9d9ca7f3c2d28989effd1cvboxsync ! (arg & (UINT64_MAX << 7));
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync };
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsyncprivate:
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync Ebml(const Ebml &);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync void operator=(const Ebml &);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync};
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsyncclass WebMWriter
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync{
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync enum Mkv
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync EBML = 0x1A45DFA3,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync EBMLVersion = 0x4286,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync EBMLReadVersion = 0x42F7,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync EBMLMaxIDLength = 0x42F2,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync EBMLMaxSizeLength = 0x42F3,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync DocType = 0x4282,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync DocTypeVersion = 0x4287,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync DocTypeReadVersion = 0x4285,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // CRC_32 = 0xBF,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync Void = 0xEC,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync SignatureSlot = 0x1B538667,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync SignatureAlgo = 0x7E8A,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync SignatureHash = 0x7E9A,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync SignaturePublicKey = 0x7EA5,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync Signature = 0x7EB5,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync SignatureElements = 0x7E5B,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync SignatureElementList = 0x7E7B,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync SignedElement = 0x6532,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync //segment
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync Segment = 0x18538067,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync //Meta Seek Information
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync SeekHead = 0x114D9B74,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync Seek = 0x4DBB,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync SeekID = 0x53AB,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync SeekPosition = 0x53AC,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync //Segment Information
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync Info = 0x1549A966,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // SegmentUID = 0x73A4,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // SegmentFilename = 0x7384,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // PrevUID = 0x3CB923,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // PrevFilename = 0x3C83AB,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // NextUID = 0x3EB923,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // NextFilename = 0x3E83BB,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // SegmentFamily = 0x4444,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ChapterTranslate = 0x6924,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ChapterTranslateEditionUID = 0x69FC,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ChapterTranslateCodec = 0x69BF,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ChapterTranslateID = 0x69A5,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync TimecodeScale = 0x2AD7B1,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync Segment_Duration = 0x4489,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync DateUTC = 0x4461,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // Title = 0x7BA9,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync MuxingApp = 0x4D80,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync WritingApp = 0x5741,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync //Cluster
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync Cluster = 0x1F43B675,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync Timecode = 0xE7,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // SilentTracks = 0x5854,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // SilentTrackNumber = 0x58D7,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // Position = 0xA7,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync PrevSize = 0xAB,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync BlockGroup = 0xA0,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync Block = 0xA1,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // BlockVirtual = 0xA2,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // BlockAdditions = 0x75A1,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // BlockMore = 0xA6,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // BlockAddID = 0xEE,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // BlockAdditional = 0xA5,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync BlockDuration = 0x9B,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ReferencePriority = 0xFA,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync ReferenceBlock = 0xFB,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ReferenceVirtual = 0xFD,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // CodecState = 0xA4,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // Slices = 0x8E,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // TimeSlice = 0xE8,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync LaceNumber = 0xCC,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // FrameNumber = 0xCD,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // BlockAdditionID = 0xCB,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // MkvDelay = 0xCE,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // Cluster_Duration = 0xCF,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync SimpleBlock = 0xA3,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // EncryptedBlock = 0xAF,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync //Track
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync Tracks = 0x1654AE6B,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync TrackEntry = 0xAE,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync TrackNumber = 0xD7,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync TrackUID = 0x73C5,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync TrackType = 0x83,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync FlagEnabled = 0xB9,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync FlagDefault = 0x88,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync FlagForced = 0x55AA,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync FlagLacing = 0x9C,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // MinCache = 0x6DE7,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // MaxCache = 0x6DF8,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync DefaultDuration = 0x23E383,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // TrackTimecodeScale = 0x23314F,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // TrackOffset = 0x537F,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // MaxBlockAdditionID = 0x55EE,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync Name = 0x536E,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync Language = 0x22B59C,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync CodecID = 0x86,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync CodecPrivate = 0x63A2,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync CodecName = 0x258688,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // AttachmentLink = 0x7446,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // CodecSettings = 0x3A9697,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // CodecInfoURL = 0x3B4040,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // CodecDownloadURL = 0x26B240,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // CodecDecodeAll = 0xAA,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // TrackOverlay = 0x6FAB,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // TrackTranslate = 0x6624,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // TrackTranslateEditionUID = 0x66FC,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // TrackTranslateCodec = 0x66BF,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // TrackTranslateTrackID = 0x66A5,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync //video
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync Video = 0xE0,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync FlagInterlaced = 0x9A,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // StereoMode = 0x53B8,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync PixelWidth = 0xB0,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync PixelHeight = 0xBA,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync PixelCropBottom = 0x54AA,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync PixelCropTop = 0x54BB,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync PixelCropLeft = 0x54CC,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync PixelCropRight = 0x54DD,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync DisplayWidth = 0x54B0,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync DisplayHeight = 0x54BA,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync DisplayUnit = 0x54B2,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync AspectRatioType = 0x54B3,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ColourSpace = 0x2EB524,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // GammaValue = 0x2FB523,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync FrameRate = 0x2383E3,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync //end video
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync //audio
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync Audio = 0xE1,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync SamplingFrequency = 0xB5,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync OutputSamplingFrequency = 0x78B5,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync Channels = 0x9F,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ChannelPositions = 0x7D7B,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync BitDepth = 0x6264,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync //end audio
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync //content encoding
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ContentEncodings = 0x6d80,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ContentEncoding = 0x6240,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ContentEncodingOrder = 0x5031,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ContentEncodingScope = 0x5032,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ContentEncodingType = 0x5033,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ContentCompression = 0x5034,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ContentCompAlgo = 0x4254,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ContentCompSettings = 0x4255,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ContentEncryption = 0x5035,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ContentEncAlgo = 0x47e1,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ContentEncKeyID = 0x47e2,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ContentSignature = 0x47e3,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ContentSigKeyID = 0x47e4,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ContentSigAlgo = 0x47e5,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ContentSigHashAlgo = 0x47e6,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync //end content encoding
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync //Cueing Data
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync Cues = 0x1C53BB6B,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync CuePoint = 0xBB,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync CueTime = 0xB3,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync CueTrackPositions = 0xB7,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync CueTrack = 0xF7,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync CueClusterPosition = 0xF1,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync CueBlockNumber = 0x5378
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // CueCodecState = 0xEA,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // CueReference = 0xDB,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // CueRefTime = 0x96,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // CueRefCluster = 0x97,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // CueRefNumber = 0x535F,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // CueRefCodecState = 0xEB,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync //Attachment
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // Attachments = 0x1941A469,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // AttachedFile = 0x61A7,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // FileDescription = 0x467E,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // FileName = 0x466E,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // FileMimeType = 0x4660,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // FileData = 0x465C,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // FileUID = 0x46AE,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // FileReferral = 0x4675,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync //Chapters
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // Chapters = 0x1043A770,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // EditionEntry = 0x45B9,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // EditionUID = 0x45BC,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // EditionFlagHidden = 0x45BD,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // EditionFlagDefault = 0x45DB,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // EditionFlagOrdered = 0x45DD,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ChapterAtom = 0xB6,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ChapterUID = 0x73C4,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ChapterTimeStart = 0x91,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ChapterTimeEnd = 0x92,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ChapterFlagHidden = 0x98,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ChapterFlagEnabled = 0x4598,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ChapterSegmentUID = 0x6E67,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ChapterSegmentEditionUID = 0x6EBC,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ChapterPhysicalEquiv = 0x63C3,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ChapterTrack = 0x8F,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ChapterTrackNumber = 0x89,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ChapterDisplay = 0x80,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ChapString = 0x85,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ChapLanguage = 0x437C,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ChapCountry = 0x437E,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ChapProcess = 0x6944,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ChapProcessCodecID = 0x6955,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ChapProcessPrivate = 0x450D,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ChapProcessCommand = 0x6911,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ChapProcessTime = 0x6922,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ChapProcessData = 0x6933,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync //Tagging
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // Tags = 0x1254C367,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // Tag = 0x7373,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // Targets = 0x63C0,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // TargetTypeValue = 0x68CA,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // TargetType = 0x63CA,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // Tagging_TrackUID = 0x63C5,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // Tagging_EditionUID = 0x63C9,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // Tagging_ChapterUID = 0x63C4,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // AttachmentUID = 0x63C6,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // SimpleTag = 0x67C8,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // TagName = 0x45A3,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // TagLanguage = 0x447A,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // TagDefault = 0x4484,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // TagString = 0x4487,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // TagBinary = 0x4485,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync };
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync struct CueEntry
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync uint32_t time;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync uint64_t loc;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync CueEntry(uint32_t t, uint64_t l) : time(t), loc(l) {}
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync };
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync bool m_bDebug;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync int64_t m_iLastPtsMs;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync vpx_rational_t m_Framerate;
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync uint64_t m_uPositionReference;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync uint64_t m_uSeekInfoPos;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync uint64_t m_uSegmentInfoPos;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync uint64_t m_uTrackPos;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync uint64_t m_uCuePos;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync uint64_t m_uClusterPos;
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync uint64_t m_uTrackIdPos;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync uint64_t m_uStartSegment;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync uint32_t m_uClusterTimecode;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync bool m_bClusterOpen;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync std::list<CueEntry> m_CueList;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync void writeSeekInfo();
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync Ebml m_Ebml;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync RTFILE m_File;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsyncpublic:
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync WebMWriter();
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync int create(const char *a_pszFilename);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync void close();
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync int writeHeader(const vpx_codec_enc_cfg_t *a_pCfg, const vpx_rational *a_pFps);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync int writeBlock(const vpx_codec_enc_cfg_t *a_pCfg, const vpx_codec_cx_pkt_t *a_pPkt);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync int writeFooter(uint32_t a_u64Hash);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync uint64_t getFileSize();
c278e7d7a71519a4ce9d9ca7f3c2d28989effd1cvboxsync uint64_t getAvailableSpace();
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync struct SimpleBlockData
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync uint32_t trackNumber;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync int16_t timeCode;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync uint8_t flags;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync const void *data;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync size_t dataSize;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync SimpleBlockData(uint32_t tn, int16_t tc, uint8_t f, const void *d, size_t ds) :
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync trackNumber(tn),
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync timeCode(tc),
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync flags(f),
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync data(d),
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync dataSize(ds) {}
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync };
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsyncprivate:
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync void operator=(const WebMWriter &);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync WebMWriter(const WebMWriter &);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync friend Ebml &operator<<(Ebml &a_Ebml, const SimpleBlockData &a_Data);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync};
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync#endif