EbmlWriter.h revision 3851c4a4d158e0776c6774fc21ed986667f34be3
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync * EbmlWriter.h - EBML writer + WebM container.
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync * Copyright (C) 2013 Oracle Corporation
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 * This code is based on:
1fdc81580c82b445d2d7ceae539b3a78ef56c22dvboxsync * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
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.
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync EbmlSubElement(uint64_t offs, EbmlClassId cid) : offset(offs), classId(cid) {}
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Initialize EBML object */
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync inline void init(const RTFILE &a_File) { m_File = a_File; }
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Starts an EBML sub-element */
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 writeUnsignedInteger(UINT64_C(0x01FFFFFFFFFFFFFF));
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Ends an EBML sub-element */
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
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync if(m_Elements.empty() || m_Elements.top().classId != classId) throw VERR_INTERNAL_ERROR;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync uint64_t uSize = uPos - m_Elements.top().offset - 8;
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync RTFileSeek(m_File, m_Elements.top().offset, RTFILE_SEEK_BEGIN, NULL);
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* make sure that size will be serialized as uint64 */
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync writeUnsignedInteger(uSize | UINT64_C(0x0100000000000000));
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Serializes a null-terminated string */
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync inline Ebml &serializeString(EbmlClassId classId, const char *str)
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)
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Serializes a floating point value
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync * Only 8-bytes double precision values are supported
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync * by this function
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync inline Ebml &serializeFloat(EbmlClassId classId, double value)
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync writeSize(sizeof(double));
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync writeUnsignedInteger(*reinterpret_cast<uint64_t*>(&value));
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Writes raw data to file */
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Writes an unsigned integer of variable of fixed size */
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync inline void writeUnsignedInteger(uint64_t value, size_t size = sizeof(uint64_t))
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Convert to big-endian */
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync write(reinterpret_cast<uint8_t*>(&value) + sizeof(value) - size, size);
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 /* Writes data size value */
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 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)) -
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* One is subtracted in order to avoid loosing significant bit when size = 8 */
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync writeUnsignedInteger((parm & (((mask << 1) - 1) >> size)) | (mask >> (size - 1)), size);
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 * Every !(arg & (UINT64_MAX << X)) expression gives one
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync * if an only if all the bits from X to 63 are set to zero.
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)) -
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Matroska EBML Class IDs supported by WebM */
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // CRC_32 = 0xBF,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync //Meta Seek Information
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync //Segment Information
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 // Title = 0x7BA9,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // SilentTracks = 0x5854,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // SilentTrackNumber = 0x58D7,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // Position = 0xA7,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // BlockVirtual = 0xA2,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // BlockAdditions = 0x75A1,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // BlockMore = 0xA6,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // BlockAddID = 0xEE,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // BlockAdditional = 0xA5,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ReferencePriority = 0xFA,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ReferenceVirtual = 0xFD,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // CodecState = 0xA4,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // Slices = 0x8E,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // TimeSlice = 0xE8,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // FrameNumber = 0xCD,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // BlockAdditionID = 0xCB,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // MkvDelay = 0xCE,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // Cluster_Duration = 0xCF,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // EncryptedBlock = 0xAF,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // MinCache = 0x6DE7,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // MaxCache = 0x6DF8,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // TrackTimecodeScale = 0x23314F,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // TrackOffset = 0x537F,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // MaxBlockAdditionID = 0x55EE,
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 // StereoMode = 0x53B8,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ColourSpace = 0x2EB524,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // GammaValue = 0x2FB523,
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync //end video
c31f30607ddcca383fd7cf1493b10196007e6e64vboxsync // ChannelPositions = 0x7D7B,
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 // 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 = 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 // 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 CueEntry(uint32_t t, uint64_t l) : time(t), loc(l) {}
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Creates output file */
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* closes the file */
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Writes WebM header to file
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync * Should be called before any writeBlock call
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 /* Returns current output file size */
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync /* Returns current free storage space
3851c4a4d158e0776c6774fc21ed986667f34be3vboxsync * available for the file