/*
|
* $Id$
|
* Copyright (c) 2008-2011, Matroska (non-profit organisation)
|
* All rights reserved.
|
*
|
* Redistribution and use in source and binary forms, with or without
|
* modification, are permitted provided that the following conditions are met:
|
* * Redistributions of source code must retain the above copyright
|
* notice, this list of conditions and the following disclaimer.
|
* * Redistributions in binary form must reproduce the above copyright
|
* notice, this list of conditions and the following disclaimer in the
|
* documentation and/or other materials provided with the distribution.
|
* * Neither the name of the Matroska assocation nor the
|
* names of its contributors may be used to endorse or promote products
|
* derived from this software without specific prior written permission.
|
*
|
* THIS SOFTWARE IS PROVIDED BY the Matroska association ``AS IS'' AND ANY
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
* DISCLAIMED. IN NO EVENT SHALL The Matroska Foundation BE LIABLE FOR ANY
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
*/
|
#ifndef MATROSKA_MATROSKA_H
|
#define MATROSKA_MATROSKA_H
|
|
#include "ebml/ebml.h"
|
|
#if defined(MATROSKA2_EXPORTS)
|
#define MATROSKA_DLL DLLEXPORT
|
#elif defined(MATROSKA2_IMPORTS)
|
#define MATROSKA_DLL DLLIMPORT
|
#else
|
#define MATROSKA_DLL
|
#endif
|
|
#define CONTEXT_LIBMATROSKA_VERSION 0x00402
|
|
// if a profile is set in ebml_semantic.DisabledProfile that means the element is not available for that profile
|
#define PROFILE_MATROSKA_V1 1
|
#define PROFILE_MATROSKA_V2 2
|
#define PROFILE_MATROSKA_V3 4
|
#define PROFILE_MATROSKA_V4 32
|
#define PROFILE_WEBM 8
|
#define PROFILE_DIVX 16
|
|
#define MATROSKA_VERSION 2
|
|
#define MATROSKA_BLOCK_COMPR_NONE -1
|
#define MATROSKA_BLOCK_COMPR_ZLIB 0
|
#define MATROSKA_BLOCK_COMPR_BZLIB 1
|
#define MATROSKA_BLOCK_COMPR_LZO1X 2
|
#define MATROSKA_BLOCK_COMPR_HEADER 3
|
|
#define MATROSKA_COMPR_SCOPE_BLOCK 1
|
#define MATROSKA_COMPR_SCOPE_PRIVATE 2
|
#define MATROSKA_COMPR_SCOPE_NEXT 4
|
|
#define MATROSKA_DISPLAY_UNIT_PIXEL 0
|
#define MATROSKA_DISPLAY_UNIT_CM 1
|
#define MATROSKA_DISPLAY_UNIT_INCHES 2
|
#define MATROSKA_DISPLAY_UNIT_DAR 3
|
|
|
EBML_DLL err_t MATROSKA_Init(nodecontext *p);
|
EBML_DLL err_t MATROSKA_Done(nodecontext *p);
|
|
#define INVALID_TIMECODE_T MAX_INT64
|
typedef int64_t timecode_t; // in nanoseconds
|
|
#define TRACK_TYPE_VIDEO 1
|
#define TRACK_TYPE_AUDIO 2
|
#define TRACK_TYPE_COMPLEX 3
|
#define TRACK_TYPE_SUBTITLE 17
|
#define TRACK_TYPE_LOGO 16
|
#define TRACK_TYPE_BUTTONS 18
|
#define TRACK_TYPE_CONTROL 32
|
|
#define TRACK_STEREO_MODE_MONO 0
|
#define TRACK_STEREO_MODE_SIDEBYSIDE_L 1
|
#define TRACK_STEREO_MODE_TOPBOTTOM_R 2
|
#define TRACK_STEREO_MODE_TOPBOTTOM_L 3
|
#define TRACK_STEREO_MODE_CHECKBOARD_R 4
|
#define TRACK_STEREO_MODE_CHECKBOARD_L 5
|
#define TRACK_STEREO_MODE_INTERLEAVED_R 6
|
#define TRACK_STEREO_MODE_INTERLEAVED_L 7
|
#define TRACK_STEREO_MODE_COL_INTERLEAVED_L 8
|
#define TRACK_STEREO_MODE_COL_INTERLEAVED_R 9
|
#define TRACK_STEREO_MODE_ANAGLYPH_CYAN_RED 10
|
#define TRACK_STEREO_MODE_SIDEBYSIDE_R 11
|
#define TRACK_STEREO_MODE_ANAGLYPH_GREEN_MAG 12
|
#define TRACK_STEREO_MODE_ALTERNATE_PACKED_L 13
|
#define TRACK_STEREO_MODE_ALTERNATE_PACKED_R 14
|
|
#define TRACK_PLANE_LEFT 0
|
#define TRACK_PLANE_RIGHT 1
|
#define TRACK_PLANE_BACKGROUND 2
|
|
#define TRACK_OLD_STEREOMODE_MONO 0
|
#define TRACK_OLD_STEREOMODE_RIGHT 1
|
#define TRACK_OLD_STEREOMODE_LEFT 2
|
#define TRACK_OLD_STEREOMODE_BOTH 3
|
|
typedef struct matroska_block matroska_block;
|
typedef struct matroska_cuepoint matroska_cuepoint;
|
typedef struct matroska_cluster matroska_cluster;
|
typedef struct matroska_seekpoint matroska_seekpoint;
|
typedef struct matroska_trackentry matroska_trackentry;
|
|
typedef struct matroska_frame
|
{
|
uint8_t *Data;
|
uint32_t Size;
|
timecode_t Timecode;
|
timecode_t Duration;
|
|
} matroska_frame;
|
|
EBML_DLL err_t MATROSKA_LinkMetaSeekElement(matroska_seekpoint *MetaSeek, ebml_element *Link);
|
EBML_DLL err_t MATROSKA_MetaSeekUpdate(matroska_seekpoint *MetaSeek);
|
EBML_DLL err_t MATROSKA_LinkClusterReadSegmentInfo(matroska_cluster *Cluster, ebml_master *SegmentInfo, bool_t UseForWriteToo);
|
EBML_DLL err_t MATROSKA_LinkBlockWithReadTracks(matroska_block *Block, ebml_master *Tracks, bool_t UseForWriteToo);
|
EBML_DLL err_t MATROSKA_LinkBlockReadTrack(matroska_block *Block, ebml_master *Track, bool_t UseForWriteToo);
|
EBML_DLL err_t MATROSKA_LinkBlockReadSegmentInfo(matroska_block *Block, ebml_master *SegmentInfo, bool_t UseForWriteToo);
|
#if defined(CONFIG_EBML_WRITING)
|
EBML_DLL err_t MATROSKA_LinkClusterWriteSegmentInfo(matroska_cluster *Cluster, ebml_master *SegmentInfo);
|
EBML_DLL err_t MATROSKA_LinkBlockWithWriteTracks(matroska_block *Block, ebml_master *Tracks);
|
EBML_DLL err_t MATROSKA_LinkBlockWriteTrack(matroska_block *Block, ebml_master *Track);
|
EBML_DLL err_t MATROSKA_LinkBlockWriteSegmentInfo(matroska_block *Block, ebml_master *SegmentInfo);
|
#endif
|
//EBML_DLL err_t MATROSKA_LinkCueTrack(const ebml_element *Cue, ebml_element *Tracks);
|
EBML_DLL err_t MATROSKA_LinkCueSegmentInfo(matroska_cuepoint *Cue, ebml_master *SegmentInfo);
|
EBML_DLL err_t MATROSKA_LinkCuePointBlock(matroska_cuepoint *Cue, matroska_block *Block);
|
EBML_DLL err_t MATROSKA_CuePointUpdate(matroska_cuepoint *Cue, ebml_element *Segment);
|
EBML_DLL double MATROSKA_TrackTimecodeScale(const ebml_master *Track);
|
EBML_DLL timecode_t MATROSKA_SegmentInfoTimecodeScale(const ebml_master *SegmentInfo);
|
EBML_DLL void MATROSKA_ClusterSetTimecode(matroska_cluster *Cluster, timecode_t Timecode);
|
EBML_DLL err_t MATROSKA_BlockSetTimecode(matroska_block *Block, timecode_t Timecode, timecode_t ClusterTimecode);
|
EBML_DLL timecode_t MATROSKA_ClusterTimecode(matroska_cluster *Cluster);
|
EBML_DLL timecode_t MATROSKA_ClusterTimecodeScale(matroska_cluster *Cluster, bool_t Read);
|
EBML_DLL timecode_t MATROSKA_BlockTimecode(matroska_block *Block);
|
EBML_DLL timecode_t MATROSKA_CueTimecode(const matroska_cuepoint *Cue);
|
EBML_DLL filepos_t MATROSKA_CuePosInSegment(const matroska_cuepoint *Cue);
|
EBML_DLL int16_t MATROSKA_BlockTrackNum(const matroska_block *Block);
|
EBML_DLL bool_t MATROSKA_BlockKeyframe(const matroska_block *Block);
|
EBML_DLL bool_t MATROSKA_BlockDiscardable(const matroska_block *Block);
|
EBML_DLL bool_t MATROSKA_BlockLaced(const matroska_block *Block);
|
EBML_DLL err_t MATROSKA_BlockReadData(matroska_block *Block, stream *Input);
|
EBML_DLL err_t MATROSKA_BlockReleaseData(matroska_block *Block, bool_t IncludingNotRead);
|
EBML_DLL int16_t MATROSKA_CueTrackNum(const matroska_cuepoint *Cue);
|
EBML_DLL void MATROSKA_CuesSort(ebml_master *Cues);
|
EBML_DLL void MATROSKA_AttachmentSort(ebml_master *Attachments);
|
EBML_DLL fourcc_t MATROSKA_MetaSeekID(const matroska_seekpoint *MetaSeek);
|
EBML_DLL bool_t MATROSKA_MetaSeekIsClass(const matroska_seekpoint *MetaSeek, const ebml_context *Class);
|
EBML_DLL filepos_t MATROSKA_MetaSeekPosInSegment(const matroska_seekpoint *MetaSeek);
|
EBML_DLL filepos_t MATROSKA_MetaSeekAbsolutePos(const matroska_seekpoint *MetaSeek);
|
|
EBML_DLL matroska_cuepoint *MATROSKA_CuesGetTimecodeStart(const ebml_element *Cues, timecode_t Timecode);
|
|
#if defined(CONFIG_EBML_WRITING)
|
EBML_DLL int MATROSKA_TrackGetBlockCompression(const matroska_trackentry *TrackEntry);
|
EBML_DLL bool_t MATROSKA_TrackSetCompressionZlib(matroska_trackentry *TrackEntry, int Scope);
|
EBML_DLL bool_t MATROSKA_TrackSetCompressionHeader(matroska_trackentry *TrackEntry, const uint8_t *Header, size_t HeaderSize);
|
EBML_DLL bool_t MATROSKA_TrackSetCompressionNone(matroska_trackentry *TrackEntry);
|
EBML_DLL err_t CompressFrameZLib(const uint8_t *Cursor, size_t CursorSize, uint8_t **OutBuf, size_t *OutSize);
|
#endif
|
|
EBML_DLL void MATROSKA_ClusterSort(matroska_cluster *Cluster); // not good with P frames!!!
|
|
EBML_DLL ebml_element *MATROSKA_BlockReadTrack(const matroska_block *Block);
|
EBML_DLL ebml_element *MATROSKA_BlockReadSegmentInfo(const matroska_block *Block);
|
#if defined(CONFIG_EBML_WRITING)
|
EBML_DLL ebml_element *MATROSKA_BlockWriteTrack(const matroska_block *Block);
|
EBML_DLL ebml_element *MATROSKA_BlockWriteSegmentInfo(const matroska_block *Block);
|
#endif
|
|
EBML_DLL err_t MATROSKA_BlockSkipToFrame(const matroska_block *Block, stream *Input, size_t FrameNum);
|
EBML_DLL void MATROSKA_BlockSetKeyframe(matroska_block *Block, bool_t Set);
|
EBML_DLL void MATROSKA_BlockSetDiscardable(matroska_block *Block, bool_t Set);
|
EBML_DLL err_t MATROSKA_BlockProcessFrameDurations(matroska_block *Block, stream *Input);
|
EBML_DLL size_t MATROSKA_BlockGetFrameCount(const matroska_block *Block);
|
EBML_DLL timecode_t MATROSKA_BlockGetFrameDuration(const matroska_block *Block, size_t FrameNum);
|
EBML_DLL timecode_t MATROSKA_BlockGetFrameStart(const matroska_block *Block, size_t FrameNum);
|
EBML_DLL timecode_t MATROSKA_BlockGetFrameEnd(const matroska_block *Block, size_t FrameNum);
|
EBML_DLL size_t MATROSKA_BlockGetLength(const matroska_block *Block, size_t FrameNum);
|
|
EBML_DLL err_t MATROSKA_BlockGetFrame(const matroska_block *Block, size_t FrameNum, matroska_frame *Frame, bool_t WithData);
|
EBML_DLL err_t MATROSKA_BlockAppendFrame(matroska_block *Block, const matroska_frame *Frame, timecode_t ClusterTimecode);
|
|
|
EBML_DLL matroska_block *MATROSKA_GetBlockForTimecode(matroska_cluster *Cluster, timecode_t Timecode, int16_t Track);
|
EBML_DLL void MATROSKA_LinkClusterBlocks(matroska_cluster *Cluster, ebml_master *RSegmentInfo, ebml_master *Tracks, bool_t KeepUnmatched);
|
|
extern const ebml_context MATROSKA_ContextStream;
|
|
#endif // MATROSKA_MATROSKA_H
|