EbmlWriter.h revision 3851c4a4d158e0776c6774fc21ed986667f34be3
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/string.h>
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync#include <vpx/vpx_encoder.h>
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync#include <stack>
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync#include <list>
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
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Initialize EBML object */
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync inline void init(const RTFILE &a_File) { m_File = a_File; }
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Starts an EBML sub-element */
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync inline Ebml &subStart(EbmlClassId classId)
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync writeClassId(classId);
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* store the current file offset */
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync m_Elements.push(EbmlSubElement(RTFileTell(m_File), classId));
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Indicates that size of the element
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync * is unkown (as according to EBML specs)
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync */
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync writeUnsignedInteger(UINT64_C(0x01FFFFFFFFFFFFFF));
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync return *this;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync }
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Ends an EBML sub-element */
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync inline Ebml &subEnd(EbmlClassId classId)
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Class ID on the top of the stack should match the class ID passed
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync * to the function. Otherwise it may mean that we have a bug in the code
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync */
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
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* make sure that size will be serialized as uint64 */
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync writeUnsignedInteger(uSize | UINT64_C(0x0100000000000000));
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync RTFileSeek(m_File, uPos, RTFILE_SEEK_BEGIN, NULL);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync m_Elements.pop();
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync return *this;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync }
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Serializes a null-terminated string */
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync inline Ebml &serializeString(EbmlClassId classId, const char *str)
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync writeClassId(classId);
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync uint64_t size = strlen(str);
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync writeSize(size);
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync write(str, size);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync return *this;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync }
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Serializes an UNSIGNED integer
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync * If size is zero then it will be detected automatically */
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync inline Ebml &serializeUnsignedInteger(EbmlClassId classId, uint64_t parm, size_t size = 0)
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync writeClassId(classId);
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync if (!size) size = getSizeOfUInt(parm);
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync writeSize(size);
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync writeUnsignedInteger(parm, size);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync return *this;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync }
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Serializes a floating point value
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync * Only 8-bytes double precision values are supported
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync * by this function
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync */
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync inline Ebml &serializeFloat(EbmlClassId classId, double value)
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync writeClassId(classId);
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync writeSize(sizeof(double));
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync writeUnsignedInteger(*reinterpret_cast<uint64_t*>(&value));
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync return *this;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync }
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Writes raw data to file */
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync inline void write(const void *data, size_t size)
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync int rc = RTFileWrite(m_File, data, size, NULL);
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync if (!RT_SUCCESS(rc)) throw rc;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync }
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Writes an unsigned integer of variable of fixed size */
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync inline void writeUnsignedInteger(uint64_t value, size_t size = sizeof(uint64_t))
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Convert to big-endian */
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync value = RT_H2BE_U64(value);
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync write(reinterpret_cast<uint8_t*>(&value) + sizeof(value) - size, size);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync }
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Writes EBML class ID to file
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync * EBML ID already has a UTF8-like represenation
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync * so getSizeOfUInt is used to determine
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync * the number of its bytes
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync */
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync inline void writeClassId(EbmlClassId parm)
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync writeUnsignedInteger(parm, getSizeOfUInt(parm));
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync }
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Writes data size value */
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync inline void writeSize(uint64_t parm)
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync {
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* The following expression defines the size of the value that will be serialized
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync * as an EBML UTF-8 like integer (with trailing bits represeting its size)
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync 1xxx xxxx - value 0 to 2^7-2
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync 01xx xxxx xxxx xxxx - value 0 to 2^14-2
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync 001x xxxx xxxx xxxx xxxx xxxx - value 0 to 2^21-2
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync 0001 xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^28-2
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync 0000 1xxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^35-2
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync 0000 01xx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^42-2
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync 0000 001x xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^49-2
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync 0000 0001 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^56-2
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync */
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync 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));
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* One is subtracted in order to avoid loosing significant bit when size = 8 */
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync uint64_t mask = RT_BIT_64(size * 8 - 1);
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync writeUnsignedInteger((parm & (((mask << 1) - 1) >> size)) | (mask >> (size - 1)), size);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync }
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Size calculation for variable size UNSIGNED integer.
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync * The function defines the size of the number by trimming
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync * consequent trailing zero bytes starting from the most significant.
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync * The following statement is always true:
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync * 1 <= getSizeOfUInt(arg) <= 8
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync *
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync * Every !(arg & (UINT64_MAX << X)) expression gives one
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync * if an only if all the bits from X to 63 are set to zero.
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync */
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
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsyncprivate:
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync void operator=(const Ebml &);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync};
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsyncclass WebMWriter
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync{
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Matroska EBML Class IDs supported by WebM */
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 Ebml m_Ebml;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync RTFILE m_File;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsyncpublic:
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync WebMWriter();
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Creates output file */
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync int create(const char *a_pszFilename);
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* closes the file */
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync void close();
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Writes WebM header to file
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync * Should be called before any writeBlock call
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync */
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync int writeHeader(const vpx_codec_enc_cfg_t *a_pCfg, const vpx_rational *a_pFps);
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Writes a block of compressed data */
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync int writeBlock(const vpx_codec_enc_cfg_t *a_pCfg, const vpx_codec_cx_pkt_t *a_pPkt);
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Writes WebM footer
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync * No other write functions should be called after this one
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync */
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync int writeFooter(uint32_t a_u64Hash);
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Returns current output file size */
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync uint64_t getFileSize();
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Returns current free storage space
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync * available for the file
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync */
c278e7d7a71519a4ce9d9ca7f3c2d28989effd1cvboxsync uint64_t getAvailableSpace();
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsyncprivate:
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync void writeSeekInfo();
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync void operator=(const WebMWriter &);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync WebMWriter(const WebMWriter &);
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync};
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync#endif