From: Steve Lhomme Date: Fri, 4 Jun 2010 11:03:46 +0000 (+0000) Subject: libebml/libmatrosla: update the ChangeLog for the 1.0.0 release and fix the compilation X-Git-Tag: release-1.0.0~2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8e46c5650396bbdab06bc09a6c40065704bb94ef;p=libmatroska libebml/libmatrosla: update the ChangeLog for the 1.0.0 release and fix the compilation git-svn-id: https://matroska.svn.sourceforge.net/svnroot/matroska/trunk/libmatroska@295 a6f86f6d-0131-4f8e-9e7b-e335508773d5 --- diff --git a/ChangeLog b/ChangeLog index c90b4f2..d3c3a6d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2010-06-04 robux4/mosu +New 1.0.0 version: + - rename the library .so name as it's backward incompatible + 2010-04-30 robux4/mosu New 0.9.0 version: - fix a memory freeing issue in KaxBlock diff --git a/libmatroska.proj b/libmatroska.proj index b223979..769c701 100644 --- a/libmatroska.proj +++ b/libmatroska.proj @@ -1,74 +1,76 @@ -Include "*/*.proj" - -LIB matroska -{ - INCLUDE . - EXPINCLUDE . - - IF HAVE_EBML2 - USE ebml2_legacy - ELSE - USE ebml - USEINCLUDE corec // so that stdafx implied by ebml2_legacy can build - ENDIF - -// OPTIMIZE_GLOBALLY . - FAVOR_MAX_SPEED . - REDUCE_SIZE . - FASTER_FLOAT . - - SOURCE src/FileKax.cpp - SOURCE src/KaxAttached.cpp - SOURCE src/KaxAttachments.cpp - SOURCE src/KaxBlock.cpp - SOURCE src/KaxBlockData.cpp - SOURCE src/KaxChapters.cpp - SOURCE src/KaxCluster.cpp - SOURCE src/KaxClusterData.cpp - SOURCE src/KaxContentEncoding.cpp - SOURCE src/KaxContexts.cpp - SOURCE src/KaxCues.cpp - SOURCE src/KaxCuesData.cpp - SOURCE src/KaxInfo.cpp - SOURCE src/KaxInfoData.cpp - SOURCE src/KaxSeekHead.cpp - SOURCE src/KaxSegment.cpp - SOURCE src/KaxTag.cpp - SOURCE src/KaxTagMulti.cpp - SOURCE src/KaxTags.cpp - SOURCE src/KaxTrackAudio.cpp - SOURCE src/KaxTrackEntryData.cpp - SOURCE src/KaxTrackVideo.cpp - SOURCE src/KaxTracks.cpp - SOURCE src/KaxVersion.cpp - - HEADER matroska/FileKax.h - HEADER matroska/KaxAttached.h - HEADER matroska/KaxAttachments.h - HEADER matroska/KaxBlock.h - HEADER matroska/KaxBlockData.h - HEADER matroska/KaxChapters.h - HEADER matroska/KaxCluster.h - HEADER matroska/KaxClusterData.h - HEADER matroska/KaxConfig.h - HEADER matroska/KaxContentEncoding.h - HEADER matroska/KaxContexts.h - HEADER matroska/KaxCues.h - HEADER matroska/KaxCuesData.h - HEADER matroska/KaxDefines.h - HEADER matroska/KaxInfo.h - HEADER matroska/KaxInfoData.h - HEADER matroska/KaxSeekHead.h - HEADER matroska/KaxSegment.h - HEADER matroska/KaxTag.h - HEADER matroska/KaxTagMulti.h - HEADER matroska/KaxTags.h - HEADER matroska/KaxTrackAudio.h - HEADER matroska/KaxTrackEntryData.h - HEADER matroska/KaxTrackVideo.h - HEADER matroska/KaxTracks.h - HEADER matroska/KaxTypes.h - HEADER matroska/KaxVersion.h - HEADER matroska/c/libmatroska_t.h - HEADER matroska/c/libmatroska.h -} +Include "*/*.proj" + +LIB matroska +{ + PROJECT_VERSION 1.0.0 + + INCLUDE . + EXPINCLUDE . + + IF HAVE_EBML2 + USE ebml2_legacy + ELSE + USE ebml + USEINCLUDE corec // so that stdafx implied by ebml2_legacy can build + ENDIF + +// OPTIMIZE_GLOBALLY . + FAVOR_MAX_SPEED . + REDUCE_SIZE . + FASTER_FLOAT . + + SOURCE src/FileKax.cpp + SOURCE src/KaxAttached.cpp + SOURCE src/KaxAttachments.cpp + SOURCE src/KaxBlock.cpp + SOURCE src/KaxBlockData.cpp + SOURCE src/KaxChapters.cpp + SOURCE src/KaxCluster.cpp + SOURCE src/KaxClusterData.cpp + SOURCE src/KaxContentEncoding.cpp + SOURCE src/KaxContexts.cpp + SOURCE src/KaxCues.cpp + SOURCE src/KaxCuesData.cpp + SOURCE src/KaxInfo.cpp + SOURCE src/KaxInfoData.cpp + SOURCE src/KaxSeekHead.cpp + SOURCE src/KaxSegment.cpp + SOURCE src/KaxTag.cpp + SOURCE src/KaxTagMulti.cpp + SOURCE src/KaxTags.cpp + SOURCE src/KaxTrackAudio.cpp + SOURCE src/KaxTrackEntryData.cpp + SOURCE src/KaxTrackVideo.cpp + SOURCE src/KaxTracks.cpp + SOURCE src/KaxVersion.cpp + + HEADER matroska/FileKax.h + HEADER matroska/KaxAttached.h + HEADER matroska/KaxAttachments.h + HEADER matroska/KaxBlock.h + HEADER matroska/KaxBlockData.h + HEADER matroska/KaxChapters.h + HEADER matroska/KaxCluster.h + HEADER matroska/KaxClusterData.h + HEADER matroska/KaxConfig.h + HEADER matroska/KaxContentEncoding.h + HEADER matroska/KaxContexts.h + HEADER matroska/KaxCues.h + HEADER matroska/KaxCuesData.h + HEADER matroska/KaxDefines.h + HEADER matroska/KaxInfo.h + HEADER matroska/KaxInfoData.h + HEADER matroska/KaxSeekHead.h + HEADER matroska/KaxSegment.h + HEADER matroska/KaxTag.h + HEADER matroska/KaxTagMulti.h + HEADER matroska/KaxTags.h + HEADER matroska/KaxTrackAudio.h + HEADER matroska/KaxTrackEntryData.h + HEADER matroska/KaxTrackVideo.h + HEADER matroska/KaxTracks.h + HEADER matroska/KaxTypes.h + HEADER matroska/KaxVersion.h + HEADER matroska/c/libmatroska_t.h + HEADER matroska/c/libmatroska.h +} diff --git a/matroska/KaxDefines.h b/matroska/KaxDefines.h index a38e06b..cad2d73 100644 --- a/matroska/KaxDefines.h +++ b/matroska/KaxDefines.h @@ -1,215 +1,215 @@ -/**************************************************************************** -** libmatroska : parse Matroska files, see http://www.matroska.org/ -** -** -** -** Copyright (C) 2002-2010 Steve Lhomme. All rights reserved. -** -** This library is free software; you can redistribute it and/or -** modify it under the terms of the GNU Lesser General Public -** License as published by the Free Software Foundation; either -** version 2.1 of the License, or (at your option) any later version. -** -** This library is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -** Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser General Public -** License along with this library; if not, write to the Free Software -** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -** -** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.** -** Contact license@matroska.org if any conditions of this licensing are -** not clear to you. -** -**********************************************************************/ - -/*! - \file - \version \$Id: KaxDefines.h,v 1.8 2010/04/02 23:26:17 robux4 Exp $ - \author Steve Lhomme -*/ -#ifndef LIBMATROSKA_DEFINES_H -#define LIBMATROSKA_DEFINES_H - -#include "ebml/EbmlVersion.h" -#include "ebml/EbmlElement.h" - -#if LIBEBML_VERSION >= 0x010000 -#define DEFINE_MKX_CONTEXT(a) DEFINE_xxx_CONTEXT(a,EBML_SemanticGlobal) -#define DEFINE_MKX_MASTER_CONS(a,b,c,d,e) DEFINE_xxx_MASTER_CONS(a,b,d,e,EBML_SemanticGlobal) -#define DEFINE_MKX_MASTER(a,b,c,d,e) DEFINE_xxx_MASTER(a,b,d,e,EBML_SemanticGlobal) -#define DEFINE_MKX_MASTER_ORPHAN(a,b,c,d) DEFINE_xxx_MASTER_ORPHAN(a,b,d,EBML_SemanticGlobal) -#define DEFINE_MKX_UINTEGER_DEF(a,b,c,d,e,v) DEFINE_xxx_UINTEGER_DEF(a,b,d,e,EBML_SemanticGlobal,v) -#define DEFINE_MKX_UINTEGER(a,b,c,d,e) DEFINE_xxx_UINTEGER(a,b,d,e,EBML_SemanticGlobal) -#define DEFINE_MKX_SINTEGER(a,b,c,d,e) DEFINE_xxx_SINTEGER(a,b,d,e,EBML_SemanticGlobal) -#define DEFINE_MKX_SINTEGER_CONS(a,b,c,d,e) DEFINE_xxx_SINTEGER_CONS(a,b,d,e,EBML_SemanticGlobal) -#define DEFINE_MKX_STRING_DEF(a,b,c,d,e,v) DEFINE_xxx_STRING_DEF(a,b,d,e,EBML_SemanticGlobal,v) -#define DEFINE_MKX_STRING(a,b,c,d,e) DEFINE_xxx_STRING(a,b,d,e,EBML_SemanticGlobal) -#define DEFINE_MKX_UNISTRING(a,b,c,d,e) DEFINE_xxx_UNISTRING(a,b,d,e,EBML_SemanticGlobal) -#define DEFINE_MKX_BINARY(a,b,c,d,e) DEFINE_xxx_BINARY(a,b,d,e,EBML_SemanticGlobal) -#define DEFINE_MKX_BINARY_CONS(a,b,c,d,e) DEFINE_xxx_BINARY_CONS(a,b,d,e,EBML_SemanticGlobal) -#define DEFINE_MKX_FLOAT_DEF(a,b,c,d,e,v) DEFINE_xxx_FLOAT_DEF(a,b,d,e,EBML_SemanticGlobal,v) -#define DEFINE_MKX_FLOAT(a,b,c,d,e) DEFINE_xxx_FLOAT(a,b,d,e,EBML_SemanticGlobal) -#define DEFINE_MKX_FLOAT64(a,b,c,d,e) DEFINE_xxx_FLOAT64(a,b,d,e,EBML_SemanticGlobal) -#define DEFINE_MKX_DATE(a,b,c,d,e) DEFINE_xxx_DATE(a,b,d,e,EBML_SemanticGlobal) - -#define DECLARE_MKX_CONTEXT(x) - -#define DECLARE_MKX_MASTER(x) DECLARE_MKX_CONTEXT(x) \ -class MATROSKA_DLL_API x : public EbmlMaster { \ - public: x(EBML_EXTRA_PARAM); \ - x(const x & ElementToClone) :EbmlMaster(ElementToClone) {} \ - EBML_CONCRETE_CLASS(x) - -#define DECLARE_MKX_MASTER_CONS(x) DECLARE_MKX_CONTEXT(x) \ -class MATROSKA_DLL_API x : public EbmlMaster { \ - public: x(EBML_EXTRA_PARAM); \ - x(const x & ElementToClone); \ - EBML_CONCRETE_CLASS(x) - -#define DECLARE_MKX_BINARY(x) DECLARE_MKX_CONTEXT(x) \ - class MATROSKA_DLL_API x : public EbmlBinary { \ - public: x(EBML_EXTRA_PARAM); \ - x(const x & ElementToClone) :EbmlBinary(ElementToClone) {} \ - EBML_CONCRETE_CLASS(x) - -#define DECLARE_MKX_BINARY_CONS(x) DECLARE_MKX_CONTEXT(x) \ - class MATROSKA_DLL_API x : public EbmlBinary { \ - public: x(EBML_EXTRA_PARAM); \ - x(const x & ElementToClone); \ - EBML_CONCRETE_CLASS(x) - -#define DECLARE_MKX_UNISTRING(x) DECLARE_MKX_CONTEXT(x) \ - class MATROSKA_DLL_API x : public EbmlUnicodeString { \ - public: x(EBML_EXTRA_PARAM); \ - x(const x & ElementToClone) :EbmlUnicodeString(ElementToClone) {} \ - EBML_CONCRETE_CLASS(x) - -#define DECLARE_MKX_STRING(x) DECLARE_MKX_CONTEXT(x) \ - class MATROSKA_DLL_API x : public EbmlString { \ - public: x(EBML_EXTRA_PARAM); \ - x(const x & ElementToClone) :EbmlString(ElementToClone) {} \ - EBML_CONCRETE_CLASS(x) - -#define DECLARE_MKX_UINTEGER(x) DECLARE_MKX_CONTEXT(x) \ - class MATROSKA_DLL_API x : public EbmlUInteger { \ - public: x(EBML_EXTRA_PARAM); \ - x(const x & ElementToClone) :EbmlUInteger(ElementToClone) {} \ - EBML_CONCRETE_CLASS(x) - -#define DECLARE_MKX_SINTEGER_CONS(x) DECLARE_MKX_CONTEXT(x) \ - class MATROSKA_DLL_API x : public EbmlSInteger { \ - public: x(EBML_EXTRA_PARAM); \ - x(const x & ElementToClone); \ - EBML_CONCRETE_CLASS(x) - -#define DECLARE_MKX_SINTEGER(x) DECLARE_MKX_CONTEXT(x) \ - class MATROSKA_DLL_API x : public EbmlSInteger { \ - public: x(EBML_EXTRA_PARAM); \ - x(const x & ElementToClone) :EbmlSInteger(ElementToClone) {} \ - EBML_CONCRETE_CLASS(x) - -#define DECLARE_MKX_DATE(x) DECLARE_MKX_CONTEXT(x) \ - class MATROSKA_DLL_API x : public EbmlDate { \ - public: x(EBML_EXTRA_PARAM); \ - x(const x & ElementToClone) :EbmlDate(ElementToClone) {} \ - EBML_CONCRETE_CLASS(x) - -#define DECLARE_MKX_FLOAT(x) DECLARE_MKX_CONTEXT(x) \ - class MATROSKA_DLL_API x : public EbmlFloat { \ - public: x(EBML_EXTRA_PARAM); \ - x(const x & ElementToClone) :EbmlFloat(ElementToClone) {} \ - EBML_CONCRETE_CLASS(x) - - -#else -#define DEFINE_MKX_CONTEXT(a) DEFINE_xxx_CONTEXT(a,*GetKaxGlobal_Context) -#define DEFINE_MKX_MASTER_CONS(a,b,c,d,e) DEFINE_xxx_MASTER_CONS(a,b,c,d,e,*GetKaxGlobal_Context) -#define DEFINE_MKX_MASTER(a,b,c,d,e) DEFINE_xxx_MASTER(a,b,c,d,e,*GetKaxGlobal_Context) -#define DEFINE_MKX_MASTER_ORPHAN(a,b,c,d) DEFINE_xxx_MASTER_ORPHAN(a,b,c,d,*GetKaxGlobal_Context) -#define DEFINE_MKX_UINTEGER_DEF(a,b,c,d,e,v) DEFINE_xxx_UINTEGER_DEF(a,b,c,d,e,*GetKaxGlobal_Context,v) -#define DEFINE_MKX_UINTEGER(a,b,c,d,e) DEFINE_xxx_CLASS(a,b,c,d,e,*GetKaxGlobal_Context) -#define DEFINE_MKX_SINTEGER(a,b,c,d,e) DEFINE_xxx_CLASS(a,b,c,d,e,*GetKaxGlobal_Context) -#define DEFINE_MKX_STRING_DEF(a,b,c,d,e,v) DEFINE_xxx_STRING_DEF(a,b,c,d,e,*GetKaxGlobal_Context,v) -#define DEFINE_MKX_STRING(a,b,c,d,e) DEFINE_xxx_CLASS(a,b,c,d,e,*GetKaxGlobal_Context) -#define DEFINE_MKX_UNISTRING(a,b,c,d,e) DEFINE_xxx_CLASS(a,b,c,d,e,*GetKaxGlobal_Context) -#define DEFINE_MKX_BINARY(a,b,c,d,e) DEFINE_xxx_CLASS(a,b,c,d,e,*GetKaxGlobal_Context) -#define DEFINE_MKX_FLOAT_DEF(a,b,c,d,e,v) DEFINE_xxx_FLOAT_DEF(a,b,c,d,e,*GetKaxGlobal_Context,v) -#define DEFINE_MKX_FLOAT(a,b,c,d,e) DEFINE_xxx_CLASS(a,b,c,d,e,*GetKaxGlobal_Context) -#define DEFINE_MKX_DATE(a,b,c,d,e) DEFINE_xxx_CLASS(a,b,c,d,e,*GetKaxGlobal_Context) -#define DEFINE_MKX_BINARY_CONS(a,b,c,d,e) DEFINE_xxx_CLASS_CONS(a,b,c,d,e,*GetKaxGlobal_Context) -#define DEFINE_MKX_SINTEGER_CONS(a,b,c,d,e) DEFINE_xxx_CLASS_CONS(a,b,c,d,e,*GetKaxGlobal_Context) - -#define DECLARE_MKX_CONTEXT(x) - -#define DECLARE_MKX_MASTER(x) DECLARE_MKX_CONTEXT(x) \ -class MATROSKA_DLL_API x : public EbmlMaster { \ - public: x(); \ - x(const x & ElementToClone) :EbmlMaster(ElementToClone) {} \ - EBML_CONCRETE_CLASS(x) - -#define DECLARE_MKX_MASTER_CONS(x) DECLARE_MKX_CONTEXT(x) \ -class MATROSKA_DLL_API x : public EbmlMaster { \ - public: x(); \ - x(const x & ElementToClone); \ - EBML_CONCRETE_CLASS(x) - -#define DECLARE_MKX_BINARY(x) DECLARE_MKX_CONTEXT(x) \ - class MATROSKA_DLL_API x : public EbmlBinary { \ - public: x(); \ - x(const x & ElementToClone) :EbmlBinary(ElementToClone) {} \ - EBML_CONCRETE_CLASS(x) - -#define DECLARE_MKX_BINARY_CONS(x) DECLARE_MKX_CONTEXT(x) \ - class MATROSKA_DLL_API x : public EbmlBinary { \ - public: x(); \ - x(const x & ElementToClone); \ - EBML_CONCRETE_CLASS(x) - -#define DECLARE_MKX_UNISTRING(x) DECLARE_MKX_CONTEXT(x) \ - class MATROSKA_DLL_API x : public EbmlUnicodeString { \ - public: x(); \ - x(const x & ElementToClone) :EbmlUnicodeString(ElementToClone) {} \ - EBML_CONCRETE_CLASS(x) - -#define DECLARE_MKX_STRING(x) DECLARE_MKX_CONTEXT(x) \ - class MATROSKA_DLL_API x : public EbmlString { \ - public: x(); \ - x(const x & ElementToClone) :EbmlString(ElementToClone) {} \ - EBML_CONCRETE_CLASS(x) - -#define DECLARE_MKX_UINTEGER(x) DECLARE_MKX_CONTEXT(x) \ - class MATROSKA_DLL_API x : public EbmlUInteger { \ - public: x(); \ - x(const x & ElementToClone) :EbmlUInteger(ElementToClone) {} \ - EBML_CONCRETE_CLASS(x) - -#define DECLARE_MKX_SINTEGER_CONS(x) DECLARE_MKX_CONTEXT(x) \ - class MATROSKA_DLL_API x : public EbmlSInteger { \ - public: x(); \ - x(const x & ElementToClone); \ - EBML_CONCRETE_CLASS(x) - -#define DECLARE_MKX_SINTEGER(x) DECLARE_MKX_CONTEXT(x) \ - class MATROSKA_DLL_API x : public EbmlSInteger { \ - public: x(); \ - x(const x & ElementToClone) :EbmlSInteger(ElementToClone) {} \ - EBML_CONCRETE_CLASS(x) - -#define DECLARE_MKX_DATE(x) DECLARE_MKX_CONTEXT(x) \ - class MATROSKA_DLL_API x : public EbmlDate { \ - public: x(); \ - x(const x & ElementToClone) :EbmlDate(ElementToClone) {} \ - EBML_CONCRETE_CLASS(x) - -#define DECLARE_MKX_FLOAT(x) DECLARE_MKX_CONTEXT(x) \ - class MATROSKA_DLL_API x : public EbmlFloat { \ - public: x(); \ - x(const x & ElementToClone) :EbmlFloat(ElementToClone) {} \ - EBML_CONCRETE_CLASS(x) - -#endif - -#endif // LIBMATROSKA_DEFINES_H +/**************************************************************************** +** libmatroska : parse Matroska files, see http://www.matroska.org/ +** +** +** +** Copyright (C) 2002-2010 Steve Lhomme. All rights reserved. +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License as published by the Free Software Foundation; either +** version 2.1 of the License, or (at your option) any later version. +** +** This library is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser General Public +** License along with this library; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +** +** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.** +** Contact license@matroska.org if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +/*! + \file + \version \$Id$ + \author Steve Lhomme +*/ +#ifndef LIBMATROSKA_DEFINES_H +#define LIBMATROSKA_DEFINES_H + +#include "ebml/EbmlVersion.h" +#include "ebml/EbmlElement.h" + +#if defined(HAVE_EBML2) +#define DEFINE_MKX_CONTEXT(a) DEFINE_xxx_CONTEXT(a,EBML_SemanticGlobal) +#define DEFINE_MKX_MASTER_CONS(a,b,c,d,e) DEFINE_xxx_MASTER_CONS(a,b,d,e,EBML_SemanticGlobal) +#define DEFINE_MKX_MASTER(a,b,c,d,e) DEFINE_xxx_MASTER(a,b,d,e,EBML_SemanticGlobal) +#define DEFINE_MKX_MASTER_ORPHAN(a,b,c,d) DEFINE_xxx_MASTER_ORPHAN(a,b,d,EBML_SemanticGlobal) +#define DEFINE_MKX_UINTEGER_DEF(a,b,c,d,e,v) DEFINE_xxx_UINTEGER_DEF(a,b,d,e,EBML_SemanticGlobal,v) +#define DEFINE_MKX_UINTEGER(a,b,c,d,e) DEFINE_xxx_UINTEGER(a,b,d,e,EBML_SemanticGlobal) +#define DEFINE_MKX_SINTEGER(a,b,c,d,e) DEFINE_xxx_SINTEGER(a,b,d,e,EBML_SemanticGlobal) +#define DEFINE_MKX_SINTEGER_CONS(a,b,c,d,e) DEFINE_xxx_SINTEGER_CONS(a,b,d,e,EBML_SemanticGlobal) +#define DEFINE_MKX_STRING_DEF(a,b,c,d,e,v) DEFINE_xxx_STRING_DEF(a,b,d,e,EBML_SemanticGlobal,v) +#define DEFINE_MKX_STRING(a,b,c,d,e) DEFINE_xxx_STRING(a,b,d,e,EBML_SemanticGlobal) +#define DEFINE_MKX_UNISTRING(a,b,c,d,e) DEFINE_xxx_UNISTRING(a,b,d,e,EBML_SemanticGlobal) +#define DEFINE_MKX_BINARY(a,b,c,d,e) DEFINE_xxx_BINARY(a,b,d,e,EBML_SemanticGlobal) +#define DEFINE_MKX_BINARY_CONS(a,b,c,d,e) DEFINE_xxx_BINARY_CONS(a,b,d,e,EBML_SemanticGlobal) +#define DEFINE_MKX_FLOAT_DEF(a,b,c,d,e,v) DEFINE_xxx_FLOAT_DEF(a,b,d,e,EBML_SemanticGlobal,v) +#define DEFINE_MKX_FLOAT(a,b,c,d,e) DEFINE_xxx_FLOAT(a,b,d,e,EBML_SemanticGlobal) +#define DEFINE_MKX_FLOAT64(a,b,c,d,e) DEFINE_xxx_FLOAT64(a,b,d,e,EBML_SemanticGlobal) +#define DEFINE_MKX_DATE(a,b,c,d,e) DEFINE_xxx_DATE(a,b,d,e,EBML_SemanticGlobal) + +#define DECLARE_MKX_CONTEXT(x) + +#define DECLARE_MKX_MASTER(x) DECLARE_MKX_CONTEXT(x) \ +class MATROSKA_DLL_API x : public EbmlMaster { \ + public: x(EBML_EXTRA_PARAM); \ + x(const x & ElementToClone) :EbmlMaster(ElementToClone) {} \ + EBML_CONCRETE_CLASS(x) + +#define DECLARE_MKX_MASTER_CONS(x) DECLARE_MKX_CONTEXT(x) \ +class MATROSKA_DLL_API x : public EbmlMaster { \ + public: x(EBML_EXTRA_PARAM); \ + x(const x & ElementToClone); \ + EBML_CONCRETE_CLASS(x) + +#define DECLARE_MKX_BINARY(x) DECLARE_MKX_CONTEXT(x) \ + class MATROSKA_DLL_API x : public EbmlBinary { \ + public: x(EBML_EXTRA_PARAM); \ + x(const x & ElementToClone) :EbmlBinary(ElementToClone) {} \ + EBML_CONCRETE_CLASS(x) + +#define DECLARE_MKX_BINARY_CONS(x) DECLARE_MKX_CONTEXT(x) \ + class MATROSKA_DLL_API x : public EbmlBinary { \ + public: x(EBML_EXTRA_PARAM); \ + x(const x & ElementToClone); \ + EBML_CONCRETE_CLASS(x) + +#define DECLARE_MKX_UNISTRING(x) DECLARE_MKX_CONTEXT(x) \ + class MATROSKA_DLL_API x : public EbmlUnicodeString { \ + public: x(EBML_EXTRA_PARAM); \ + x(const x & ElementToClone) :EbmlUnicodeString(ElementToClone) {} \ + EBML_CONCRETE_CLASS(x) + +#define DECLARE_MKX_STRING(x) DECLARE_MKX_CONTEXT(x) \ + class MATROSKA_DLL_API x : public EbmlString { \ + public: x(EBML_EXTRA_PARAM); \ + x(const x & ElementToClone) :EbmlString(ElementToClone) {} \ + EBML_CONCRETE_CLASS(x) + +#define DECLARE_MKX_UINTEGER(x) DECLARE_MKX_CONTEXT(x) \ + class MATROSKA_DLL_API x : public EbmlUInteger { \ + public: x(EBML_EXTRA_PARAM); \ + x(const x & ElementToClone) :EbmlUInteger(ElementToClone) {} \ + EBML_CONCRETE_CLASS(x) + +#define DECLARE_MKX_SINTEGER_CONS(x) DECLARE_MKX_CONTEXT(x) \ + class MATROSKA_DLL_API x : public EbmlSInteger { \ + public: x(EBML_EXTRA_PARAM); \ + x(const x & ElementToClone); \ + EBML_CONCRETE_CLASS(x) + +#define DECLARE_MKX_SINTEGER(x) DECLARE_MKX_CONTEXT(x) \ + class MATROSKA_DLL_API x : public EbmlSInteger { \ + public: x(EBML_EXTRA_PARAM); \ + x(const x & ElementToClone) :EbmlSInteger(ElementToClone) {} \ + EBML_CONCRETE_CLASS(x) + +#define DECLARE_MKX_DATE(x) DECLARE_MKX_CONTEXT(x) \ + class MATROSKA_DLL_API x : public EbmlDate { \ + public: x(EBML_EXTRA_PARAM); \ + x(const x & ElementToClone) :EbmlDate(ElementToClone) {} \ + EBML_CONCRETE_CLASS(x) + +#define DECLARE_MKX_FLOAT(x) DECLARE_MKX_CONTEXT(x) \ + class MATROSKA_DLL_API x : public EbmlFloat { \ + public: x(EBML_EXTRA_PARAM); \ + x(const x & ElementToClone) :EbmlFloat(ElementToClone) {} \ + EBML_CONCRETE_CLASS(x) + + +#else +#define DEFINE_MKX_CONTEXT(a) DEFINE_xxx_CONTEXT(a,*GetKaxGlobal_Context) +#define DEFINE_MKX_MASTER_CONS(a,b,c,d,e) DEFINE_xxx_MASTER_CONS(a,b,c,d,e,*GetKaxGlobal_Context) +#define DEFINE_MKX_MASTER(a,b,c,d,e) DEFINE_xxx_MASTER(a,b,c,d,e,*GetKaxGlobal_Context) +#define DEFINE_MKX_MASTER_ORPHAN(a,b,c,d) DEFINE_xxx_MASTER_ORPHAN(a,b,c,d,*GetKaxGlobal_Context) +#define DEFINE_MKX_UINTEGER_DEF(a,b,c,d,e,v) DEFINE_xxx_UINTEGER_DEF(a,b,c,d,e,*GetKaxGlobal_Context,v) +#define DEFINE_MKX_UINTEGER(a,b,c,d,e) DEFINE_xxx_CLASS(a,b,c,d,e,*GetKaxGlobal_Context) +#define DEFINE_MKX_SINTEGER(a,b,c,d,e) DEFINE_xxx_CLASS(a,b,c,d,e,*GetKaxGlobal_Context) +#define DEFINE_MKX_STRING_DEF(a,b,c,d,e,v) DEFINE_xxx_STRING_DEF(a,b,c,d,e,*GetKaxGlobal_Context,v) +#define DEFINE_MKX_STRING(a,b,c,d,e) DEFINE_xxx_CLASS(a,b,c,d,e,*GetKaxGlobal_Context) +#define DEFINE_MKX_UNISTRING(a,b,c,d,e) DEFINE_xxx_CLASS(a,b,c,d,e,*GetKaxGlobal_Context) +#define DEFINE_MKX_BINARY(a,b,c,d,e) DEFINE_xxx_CLASS(a,b,c,d,e,*GetKaxGlobal_Context) +#define DEFINE_MKX_FLOAT_DEF(a,b,c,d,e,v) DEFINE_xxx_FLOAT_DEF(a,b,c,d,e,*GetKaxGlobal_Context,v) +#define DEFINE_MKX_FLOAT(a,b,c,d,e) DEFINE_xxx_CLASS(a,b,c,d,e,*GetKaxGlobal_Context) +#define DEFINE_MKX_DATE(a,b,c,d,e) DEFINE_xxx_CLASS(a,b,c,d,e,*GetKaxGlobal_Context) +#define DEFINE_MKX_BINARY_CONS(a,b,c,d,e) DEFINE_xxx_CLASS_CONS(a,b,c,d,e,*GetKaxGlobal_Context) +#define DEFINE_MKX_SINTEGER_CONS(a,b,c,d,e) DEFINE_xxx_CLASS_CONS(a,b,c,d,e,*GetKaxGlobal_Context) + +#define DECLARE_MKX_CONTEXT(x) + +#define DECLARE_MKX_MASTER(x) DECLARE_MKX_CONTEXT(x) \ +class MATROSKA_DLL_API x : public EbmlMaster { \ + public: x(); \ + x(const x & ElementToClone) :EbmlMaster(ElementToClone) {} \ + EBML_CONCRETE_CLASS(x) + +#define DECLARE_MKX_MASTER_CONS(x) DECLARE_MKX_CONTEXT(x) \ +class MATROSKA_DLL_API x : public EbmlMaster { \ + public: x(); \ + x(const x & ElementToClone); \ + EBML_CONCRETE_CLASS(x) + +#define DECLARE_MKX_BINARY(x) DECLARE_MKX_CONTEXT(x) \ + class MATROSKA_DLL_API x : public EbmlBinary { \ + public: x(); \ + x(const x & ElementToClone) :EbmlBinary(ElementToClone) {} \ + EBML_CONCRETE_CLASS(x) + +#define DECLARE_MKX_BINARY_CONS(x) DECLARE_MKX_CONTEXT(x) \ + class MATROSKA_DLL_API x : public EbmlBinary { \ + public: x(); \ + x(const x & ElementToClone); \ + EBML_CONCRETE_CLASS(x) + +#define DECLARE_MKX_UNISTRING(x) DECLARE_MKX_CONTEXT(x) \ + class MATROSKA_DLL_API x : public EbmlUnicodeString { \ + public: x(); \ + x(const x & ElementToClone) :EbmlUnicodeString(ElementToClone) {} \ + EBML_CONCRETE_CLASS(x) + +#define DECLARE_MKX_STRING(x) DECLARE_MKX_CONTEXT(x) \ + class MATROSKA_DLL_API x : public EbmlString { \ + public: x(); \ + x(const x & ElementToClone) :EbmlString(ElementToClone) {} \ + EBML_CONCRETE_CLASS(x) + +#define DECLARE_MKX_UINTEGER(x) DECLARE_MKX_CONTEXT(x) \ + class MATROSKA_DLL_API x : public EbmlUInteger { \ + public: x(); \ + x(const x & ElementToClone) :EbmlUInteger(ElementToClone) {} \ + EBML_CONCRETE_CLASS(x) + +#define DECLARE_MKX_SINTEGER_CONS(x) DECLARE_MKX_CONTEXT(x) \ + class MATROSKA_DLL_API x : public EbmlSInteger { \ + public: x(); \ + x(const x & ElementToClone); \ + EBML_CONCRETE_CLASS(x) + +#define DECLARE_MKX_SINTEGER(x) DECLARE_MKX_CONTEXT(x) \ + class MATROSKA_DLL_API x : public EbmlSInteger { \ + public: x(); \ + x(const x & ElementToClone) :EbmlSInteger(ElementToClone) {} \ + EBML_CONCRETE_CLASS(x) + +#define DECLARE_MKX_DATE(x) DECLARE_MKX_CONTEXT(x) \ + class MATROSKA_DLL_API x : public EbmlDate { \ + public: x(); \ + x(const x & ElementToClone) :EbmlDate(ElementToClone) {} \ + EBML_CONCRETE_CLASS(x) + +#define DECLARE_MKX_FLOAT(x) DECLARE_MKX_CONTEXT(x) \ + class MATROSKA_DLL_API x : public EbmlFloat { \ + public: x(); \ + x(const x & ElementToClone) :EbmlFloat(ElementToClone) {} \ + EBML_CONCRETE_CLASS(x) + +#endif + +#endif // LIBMATROSKA_DEFINES_H diff --git a/matroska/KaxInfoData.h b/matroska/KaxInfoData.h index 71c9929..50210df 100644 --- a/matroska/KaxInfoData.h +++ b/matroska/KaxInfoData.h @@ -52,7 +52,7 @@ START_LIBMATROSKA_NAMESPACE DECLARE_MKX_BINARY(KaxSegmentUID) public: -#if LIBEBML_VERSION >= 0x010000 +#if defined(HAVE_EBML2) KaxSegmentUID(EBML_DEF_CONS EBML_DEF_SEP EBML_EXTRA_PARAM); #endif virtual bool ValidateSize() const { return IsFiniteSize() && (GetSize() == 16);} diff --git a/src/FileKax.cpp b/src/FileKax.cpp index a1b907e..b7caa6f 100644 --- a/src/FileKax.cpp +++ b/src/FileKax.cpp @@ -1,465 +1,465 @@ -/**************************************************************************** -** libmatroska : parse Matroska files, see http://www.matroska.org/ -** -** -** -** Copyright (C) 2002-2003 Steve Lhomme. All rights reserved. -** -** This file is part of libmatroska. -** -** This library is free software; you can redistribute it and/or -** modify it under the terms of the GNU Lesser General Public -** License as published by the Free Software Foundation; either -** version 2.1 of the License, or (at your option) any later version. -** -** This library is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -** Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser General Public -** License along with this library; if not, write to the Free Software -** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -** -** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.** -** Contact license@matroska.org if any conditions of this licensing are -** not clear to you. -** -**********************************************************************/ - -/*! - \file - \version \$Id: FileKax.cpp 640 2004-07-09 21:05:36Z mosu $ - \author Steve Lhomme -*/ -//#include "StdInclude.h" -#include "matroska/FileKax.h" -#include "ebml/EbmlVersion.h" -#include "ebml/EbmlContexts.h" -//#include "Cluster.h" -//#include "Track.h" -//#include "Block.h" -//#include "Frame.h" -//#include "Version.h" - -START_LIBMATROSKA_NAMESPACE - -//typedef Track *TrackID; - -FileMatroska::FileMatroska(IOCallback & output) - :myFile(output) -#ifdef OLD - ,myCurrReadBlock(NULL) - ,myMinClusterSize(5*1024) // 5KB is the min size of a cluster - ,myMaxClusterSize(2*1024*1024) // 2MB is the max size of a cluster - ,myCurrReadBlockTrack(0) - ,myCurrWriteCluster(2*1024*1024) // myMaxClusterSize - ,myCurrReadCluster(NULL) - ,myReadBlockNumber(0) -#endif // OLD -{ -#ifdef OLD - myStreamInfo.MainHeaderSize = TypeHeader::default_size() + - ActualHeader::default_size() + - ExtendedInfo::default_size() + - ContentInfo::default_size(); - myStreamInfo.TrackEntrySize = Track::default_size(); - myStreamInfo.BlockHeadSize = BLOCK_HEADER_SIZE; - myStreamInfo.ClusterHeadSize = CLUSTER_HEADER_SIZE; - myStreamInfo.ClusterFootSize = CLUSTER_TRAILER_SIZE; -#endif // OLD -} - -FileMatroska::~FileMatroska() -{ -// if (myCurrCluster != NULL) -// throw 0; // there are some data left to write -// if (myCurrReadCluster != NULL || myCurrReadBlock != NULL) -// throw 0; // there are some data left to write -} - -#ifdef OLD -void FileMatroska::SetMaxClusterSize(const uint32 value) -{ - myMaxClusterSize = value; - myCurrWriteCluster.setMaxSize(value); -} - -void FileMatroska::Close(const uint32 aTimeLength) -{ - Flush(); - - // get the file size - myFile.setFilePointer(0,seek_end); - myMainHeader.type_SetSize(myFile.getFilePointer()); - - // rewrite the header at the beginning - myFile.setFilePointer(0,seek_beginning); - - // get the Track-entry size - uint32 track_entries_size = 0; - for (size_t i=0; idefault_size(); - } - - myStreamInfo.TrackEntriesSize = track_entries_size; - myStreamInfo.TimeLength = aTimeLength; - myMainHeader.Render(myFile, myStreamInfo); - - for (i=0; idefault_size(); - } - - std::string aStr = LIB_NAME; - aStr += " "; - aStr += VERSION; - myStreamInfo.EncoderLib = aStr; - - myStreamInfo.EncoderApp = aEncoderApp; - - myStreamInfo.TrackEntryPosition = 0 + myStreamInfo.MainHeaderSize; - myStreamInfo.TrackEntriesSize = myTracks.size() * myStreamInfo.TrackEntrySize; - - myStreamInfo.CodecEntryPosition = myStreamInfo.MainHeaderSize + myStreamInfo.TrackEntriesSize; - myStreamInfo.CodecEntrySize = 4; - for (i=0; iCodecSize(); - } - - // Main Header - filepos_t result = myMainHeader.Render(myFile, myStreamInfo); - - // Track Entries - for (i=0; iRenderEntry(myFile, i+1); - } - myStreamInfo.ClusterPosition = myStreamInfo.CodecEntryPosition + myStreamInfo.CodecEntrySize; - - // Codec Header - result = CodecHeader::Render(myFile, myTracks); - - return result; - } - catch (exception & Ex) - { - throw Ex; - } -} - -/*! - \return 0 if the track was not created, or a valid track number -*/ -Track * FileMatroska::CreateTrack(const track_type aType) -{ - myTracks.push_back(new Track(aType)); - return myTracks.back(); -} - -/*Track *FileMatroska::findTrack(Track * aTrack) const -{ - for (size_t i=0; iSetName(aName); - } -} - -void FileMatroska::track_SetLaced(Track * aTrack, bool bLaced) -{ - if (IsMyTrack(aTrack)) - { - aTrack->SetLaced(bLaced); - } -} - -bool FileMatroska::AddFrame(Track * aTrack, const uint32 aTimecode, const binary *aFrame, const uint32 aFrameSize, - bool aKeyFrame, bool aBFrame) -{ - try { - // make sure we know that track - if (IsMyTrack(aTrack)) - { - // pass the cluster to the track - // handle the creation of a new cluster if needed - if (aTrack->AddFrame(aTimecode, aFrame, aFrameSize, aKeyFrame, aBFrame)) - { - while (!aTrack->SerialiseBlock(myCurrWriteCluster)) - { - /// \todo handle errors - uint32 aNbBlock; - myStreamInfo.ClusterSize += myCurrWriteCluster.Render(myFile, aNbBlock); - myStreamInfo.NumberBlock += aNbBlock; - myCurrWriteCluster.Flush(); - } - } - return true; - } - return false; - } - catch (exception & Ex) - { - throw Ex; - } -} - -void FileMatroska::Flush() -{ - uint32 aNbBlock; - myStreamInfo.ClusterSize += myCurrWriteCluster.Render(myFile,aNbBlock); - myStreamInfo.NumberBlock += aNbBlock; -} - -uint32 FileMatroska::ReadHead() -{ - try { - uint32 result = myMainHeader.Read(myFile, myStreamInfo); - - return result; - } - catch (exception & Ex) - { - throw Ex; - } -} - -uint32 FileMatroska::ReadTracks() -{ - try { - uint32 result = 0; - - // seek to the start of the Track Entries - myFile.setFilePointer(myStreamInfo.TrackEntryPosition); - // get the number of Track Entries - uint8 TrackNumber = myStreamInfo.TrackEntriesSize / myStreamInfo.TrackEntrySize; - // read all the Track Entries - myTracks.clear(); - for (uint8 TrackIdx = 0; TrackIdx::const_iterator i = myTracks.begin(); i != myTracks.end(); i ++) - { - if (*i == aTrack) - break; - } - - if (i != myTracks.end()) - return true; - else - return false; -} - -void FileMatroska::SelectReadingTrack(Track * aTrack, bool select) -{ - if (IsMyTrack(aTrack)) - { - // here we have the right track - // check if it's not already selected - for (std::vector::iterator j = mySelectedTracks.begin(); - j != mySelectedTracks.end(); j ++) - { - if (*j == aTrack->TrackNumber()) - break; - } - - if (select && j == mySelectedTracks.end()) - mySelectedTracks.push_back(aTrack->TrackNumber()); - else if (!select && j != mySelectedTracks.end()) - mySelectedTracks.erase(j); - - std::sort(mySelectedTracks.begin(), mySelectedTracks.end()); - } -} - -inline bool FileMatroska::IsReadingTrack(const uint8 aTrackNumber) const -{ - for (std::vector::const_iterator trackIdx = mySelectedTracks.begin(); - trackIdx != mySelectedTracks.end() && *trackIdx < aTrackNumber; - trackIdx++) - {} - - if (trackIdx == mySelectedTracks.end()) - return false; - else - return true; -} - -// - -void FileMatroska::Track_GetInfo(const Track * aTrack, TrackInfo & aTrackInfo) const -{ - if (IsMyTrack(aTrack)) - { - aTrack->GetInfo(aTrackInfo); - } -} - -// Audio related getters/setters - -void FileMatroska::Track_GetInfo_Audio(const Track * aTrack, TrackInfoAudio & aTrackInfo) const -{ - if (IsMyTrack(aTrack)) - { - aTrack->GetInfoAudio(aTrackInfo); - } -} - -void FileMatroska::Track_SetInfo_Audio(Track * aTrack, const TrackInfoAudio & aTrackInfo) -{ - if (IsMyTrack(aTrack)) - { - aTrack->SetInfoAudio(aTrackInfo); - } -} - -// Video related getters/setters - -void FileMatroska::Track_GetInfo_Video(const Track * aTrack, TrackInfoVideo & aTrackInfo) const -{ - if (IsMyTrack(aTrack)) - { - aTrack->GetInfoVideo(aTrackInfo); - } -} - -void FileMatroska::Track_SetInfo_Video(Track * aTrack, const TrackInfoVideo & aTrackInfo) -{ - if (IsMyTrack(aTrack)) - { - aTrack->SetInfoVideo(aTrackInfo); - } -} - -/*! - \todo exit when there is no Block left -*/ -bool FileMatroska::ReadFrame(Track * & aTrack, uint32 & aTimecode, const binary * & aFrame, uint32 & aFrameSize, - bool & aKeyFrame, bool & aBFrame) -{ - if (myCurrReadBlockTrack == 0) - { - do { - if (myReadBlockNumber >= myStreamInfo.NumberBlock) - { -// myReadBlockNumber = myStreamInfo.NumberBlock; - return false; - } - - // get the next frame in the file - if (!myCurrReadCluster.BlockLeft()) - { - myCurrReadCluster.Flush(); - try { - myCurrReadCluster.FindHead(myFile); - } - catch (exception & Ex) - { - return false; - } - } - - myCurrReadCluster.GetBlock( myCurrReadBlock, myCurrReadBlockSize, myCurrReadBlockTrack ); - myReadBlockNumber++; - } while (!IsReadingTrack(myCurrReadBlockTrack)); - - // get the track associated (normally from myTracks) - aTrack = myTracks[myCurrReadBlockTrack-1]; - // get the next frame from the current block - aTrack->HandleBlock(myCurrReadBlock, myCurrReadBlockSize); - } - else - { - // get the track associated (normally from myTracks) - aTrack = myTracks[myCurrReadBlockTrack-1]; - } - - Frame * myReadFrame; - aTrack->GetNextFrame(aTimecode, myReadFrame, aKeyFrame, aBFrame); - aFrame = myReadFrame->buf(); - aFrameSize = myReadFrame->length(); - - if (aTrack->NoFrameLeft()) - { - aTrack->FlushBlock(); - myCurrReadBlockTrack = 0; - } - - return true; -} -#endif // OLD - -END_LIBMATROSKA_NAMESPACE - -void matroska_init() -{ -#if LIBEBML_VERSION >= 0x010000 - ebml_init(); -#endif -} - -void matroska_done() -{ -#if LIBEBML_VERSION >= 0x010000 - ebml_done(); -#endif -} +/**************************************************************************** +** libmatroska : parse Matroska files, see http://www.matroska.org/ +** +** +** +** Copyright (C) 2002-2003 Steve Lhomme. All rights reserved. +** +** This file is part of libmatroska. +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License as published by the Free Software Foundation; either +** version 2.1 of the License, or (at your option) any later version. +** +** This library is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser General Public +** License along with this library; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +** +** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.** +** Contact license@matroska.org if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +/*! + \file + \version \$Id$ + \author Steve Lhomme +*/ +//#include "StdInclude.h" +#include "matroska/FileKax.h" +#include "ebml/EbmlVersion.h" +#include "ebml/EbmlContexts.h" +//#include "Cluster.h" +//#include "Track.h" +//#include "Block.h" +//#include "Frame.h" +//#include "Version.h" + +START_LIBMATROSKA_NAMESPACE + +//typedef Track *TrackID; + +FileMatroska::FileMatroska(IOCallback & output) + :myFile(output) +#ifdef OLD + ,myCurrReadBlock(NULL) + ,myMinClusterSize(5*1024) // 5KB is the min size of a cluster + ,myMaxClusterSize(2*1024*1024) // 2MB is the max size of a cluster + ,myCurrReadBlockTrack(0) + ,myCurrWriteCluster(2*1024*1024) // myMaxClusterSize + ,myCurrReadCluster(NULL) + ,myReadBlockNumber(0) +#endif // OLD +{ +#ifdef OLD + myStreamInfo.MainHeaderSize = TypeHeader::default_size() + + ActualHeader::default_size() + + ExtendedInfo::default_size() + + ContentInfo::default_size(); + myStreamInfo.TrackEntrySize = Track::default_size(); + myStreamInfo.BlockHeadSize = BLOCK_HEADER_SIZE; + myStreamInfo.ClusterHeadSize = CLUSTER_HEADER_SIZE; + myStreamInfo.ClusterFootSize = CLUSTER_TRAILER_SIZE; +#endif // OLD +} + +FileMatroska::~FileMatroska() +{ +// if (myCurrCluster != NULL) +// throw 0; // there are some data left to write +// if (myCurrReadCluster != NULL || myCurrReadBlock != NULL) +// throw 0; // there are some data left to write +} + +#ifdef OLD +void FileMatroska::SetMaxClusterSize(const uint32 value) +{ + myMaxClusterSize = value; + myCurrWriteCluster.setMaxSize(value); +} + +void FileMatroska::Close(const uint32 aTimeLength) +{ + Flush(); + + // get the file size + myFile.setFilePointer(0,seek_end); + myMainHeader.type_SetSize(myFile.getFilePointer()); + + // rewrite the header at the beginning + myFile.setFilePointer(0,seek_beginning); + + // get the Track-entry size + uint32 track_entries_size = 0; + for (size_t i=0; idefault_size(); + } + + myStreamInfo.TrackEntriesSize = track_entries_size; + myStreamInfo.TimeLength = aTimeLength; + myMainHeader.Render(myFile, myStreamInfo); + + for (i=0; idefault_size(); + } + + std::string aStr = LIB_NAME; + aStr += " "; + aStr += VERSION; + myStreamInfo.EncoderLib = aStr; + + myStreamInfo.EncoderApp = aEncoderApp; + + myStreamInfo.TrackEntryPosition = 0 + myStreamInfo.MainHeaderSize; + myStreamInfo.TrackEntriesSize = myTracks.size() * myStreamInfo.TrackEntrySize; + + myStreamInfo.CodecEntryPosition = myStreamInfo.MainHeaderSize + myStreamInfo.TrackEntriesSize; + myStreamInfo.CodecEntrySize = 4; + for (i=0; iCodecSize(); + } + + // Main Header + filepos_t result = myMainHeader.Render(myFile, myStreamInfo); + + // Track Entries + for (i=0; iRenderEntry(myFile, i+1); + } + myStreamInfo.ClusterPosition = myStreamInfo.CodecEntryPosition + myStreamInfo.CodecEntrySize; + + // Codec Header + result = CodecHeader::Render(myFile, myTracks); + + return result; + } + catch (exception & Ex) + { + throw Ex; + } +} + +/*! + \return 0 if the track was not created, or a valid track number +*/ +Track * FileMatroska::CreateTrack(const track_type aType) +{ + myTracks.push_back(new Track(aType)); + return myTracks.back(); +} + +/*Track *FileMatroska::findTrack(Track * aTrack) const +{ + for (size_t i=0; iSetName(aName); + } +} + +void FileMatroska::track_SetLaced(Track * aTrack, bool bLaced) +{ + if (IsMyTrack(aTrack)) + { + aTrack->SetLaced(bLaced); + } +} + +bool FileMatroska::AddFrame(Track * aTrack, const uint32 aTimecode, const binary *aFrame, const uint32 aFrameSize, + bool aKeyFrame, bool aBFrame) +{ + try { + // make sure we know that track + if (IsMyTrack(aTrack)) + { + // pass the cluster to the track + // handle the creation of a new cluster if needed + if (aTrack->AddFrame(aTimecode, aFrame, aFrameSize, aKeyFrame, aBFrame)) + { + while (!aTrack->SerialiseBlock(myCurrWriteCluster)) + { + /// \todo handle errors + uint32 aNbBlock; + myStreamInfo.ClusterSize += myCurrWriteCluster.Render(myFile, aNbBlock); + myStreamInfo.NumberBlock += aNbBlock; + myCurrWriteCluster.Flush(); + } + } + return true; + } + return false; + } + catch (exception & Ex) + { + throw Ex; + } +} + +void FileMatroska::Flush() +{ + uint32 aNbBlock; + myStreamInfo.ClusterSize += myCurrWriteCluster.Render(myFile,aNbBlock); + myStreamInfo.NumberBlock += aNbBlock; +} + +uint32 FileMatroska::ReadHead() +{ + try { + uint32 result = myMainHeader.Read(myFile, myStreamInfo); + + return result; + } + catch (exception & Ex) + { + throw Ex; + } +} + +uint32 FileMatroska::ReadTracks() +{ + try { + uint32 result = 0; + + // seek to the start of the Track Entries + myFile.setFilePointer(myStreamInfo.TrackEntryPosition); + // get the number of Track Entries + uint8 TrackNumber = myStreamInfo.TrackEntriesSize / myStreamInfo.TrackEntrySize; + // read all the Track Entries + myTracks.clear(); + for (uint8 TrackIdx = 0; TrackIdx::const_iterator i = myTracks.begin(); i != myTracks.end(); i ++) + { + if (*i == aTrack) + break; + } + + if (i != myTracks.end()) + return true; + else + return false; +} + +void FileMatroska::SelectReadingTrack(Track * aTrack, bool select) +{ + if (IsMyTrack(aTrack)) + { + // here we have the right track + // check if it's not already selected + for (std::vector::iterator j = mySelectedTracks.begin(); + j != mySelectedTracks.end(); j ++) + { + if (*j == aTrack->TrackNumber()) + break; + } + + if (select && j == mySelectedTracks.end()) + mySelectedTracks.push_back(aTrack->TrackNumber()); + else if (!select && j != mySelectedTracks.end()) + mySelectedTracks.erase(j); + + std::sort(mySelectedTracks.begin(), mySelectedTracks.end()); + } +} + +inline bool FileMatroska::IsReadingTrack(const uint8 aTrackNumber) const +{ + for (std::vector::const_iterator trackIdx = mySelectedTracks.begin(); + trackIdx != mySelectedTracks.end() && *trackIdx < aTrackNumber; + trackIdx++) + {} + + if (trackIdx == mySelectedTracks.end()) + return false; + else + return true; +} + +// + +void FileMatroska::Track_GetInfo(const Track * aTrack, TrackInfo & aTrackInfo) const +{ + if (IsMyTrack(aTrack)) + { + aTrack->GetInfo(aTrackInfo); + } +} + +// Audio related getters/setters + +void FileMatroska::Track_GetInfo_Audio(const Track * aTrack, TrackInfoAudio & aTrackInfo) const +{ + if (IsMyTrack(aTrack)) + { + aTrack->GetInfoAudio(aTrackInfo); + } +} + +void FileMatroska::Track_SetInfo_Audio(Track * aTrack, const TrackInfoAudio & aTrackInfo) +{ + if (IsMyTrack(aTrack)) + { + aTrack->SetInfoAudio(aTrackInfo); + } +} + +// Video related getters/setters + +void FileMatroska::Track_GetInfo_Video(const Track * aTrack, TrackInfoVideo & aTrackInfo) const +{ + if (IsMyTrack(aTrack)) + { + aTrack->GetInfoVideo(aTrackInfo); + } +} + +void FileMatroska::Track_SetInfo_Video(Track * aTrack, const TrackInfoVideo & aTrackInfo) +{ + if (IsMyTrack(aTrack)) + { + aTrack->SetInfoVideo(aTrackInfo); + } +} + +/*! + \todo exit when there is no Block left +*/ +bool FileMatroska::ReadFrame(Track * & aTrack, uint32 & aTimecode, const binary * & aFrame, uint32 & aFrameSize, + bool & aKeyFrame, bool & aBFrame) +{ + if (myCurrReadBlockTrack == 0) + { + do { + if (myReadBlockNumber >= myStreamInfo.NumberBlock) + { +// myReadBlockNumber = myStreamInfo.NumberBlock; + return false; + } + + // get the next frame in the file + if (!myCurrReadCluster.BlockLeft()) + { + myCurrReadCluster.Flush(); + try { + myCurrReadCluster.FindHead(myFile); + } + catch (exception & Ex) + { + return false; + } + } + + myCurrReadCluster.GetBlock( myCurrReadBlock, myCurrReadBlockSize, myCurrReadBlockTrack ); + myReadBlockNumber++; + } while (!IsReadingTrack(myCurrReadBlockTrack)); + + // get the track associated (normally from myTracks) + aTrack = myTracks[myCurrReadBlockTrack-1]; + // get the next frame from the current block + aTrack->HandleBlock(myCurrReadBlock, myCurrReadBlockSize); + } + else + { + // get the track associated (normally from myTracks) + aTrack = myTracks[myCurrReadBlockTrack-1]; + } + + Frame * myReadFrame; + aTrack->GetNextFrame(aTimecode, myReadFrame, aKeyFrame, aBFrame); + aFrame = myReadFrame->buf(); + aFrameSize = myReadFrame->length(); + + if (aTrack->NoFrameLeft()) + { + aTrack->FlushBlock(); + myCurrReadBlockTrack = 0; + } + + return true; +} +#endif // OLD + +END_LIBMATROSKA_NAMESPACE + +void matroska_init() +{ +#if defined(HAVE_EBML2) + ebml_init(); +#endif +} + +void matroska_done() +{ +#if defined(HAVE_EBML2) + ebml_done(); +#endif +} diff --git a/src/KaxInfoData.cpp b/src/KaxInfoData.cpp index e4083d4..5fc5bba 100644 --- a/src/KaxInfoData.cpp +++ b/src/KaxInfoData.cpp @@ -1,81 +1,81 @@ -/**************************************************************************** -** libmatroska : parse Matroska files, see http://www.matroska.org/ -** -** -** -** Copyright (C) 2002-2010 Steve Lhomme. All rights reserved. -** -** This file is part of libmatroska. -** -** This library is free software; you can redistribute it and/or -** modify it under the terms of the GNU Lesser General Public -** License as published by the Free Software Foundation; either -** version 2.1 of the License, or (at your option) any later version. -** -** This library is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -** Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser General Public -** License along with this library; if not, write to the Free Software -** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -** -** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.** -** Contact license@matroska.org if any conditions of this licensing are -** not clear to you. -** -**********************************************************************/ - -/*! - \file - \version \$Id: KaxInfoData.cpp 1078 2005-03-03 13:13:04Z robux4 $ - \author Steve Lhomme - \author John Cannon -*/ -#include "matroska/KaxInfoData.h" -#include "matroska/KaxContexts.h" -#include "matroska/KaxDefines.h" - -START_LIBMATROSKA_NAMESPACE - -DEFINE_START_SEMANTIC(KaxChapterTranslate) -DEFINE_SEMANTIC_ITEM(false, false, KaxChapterTranslateEditionUID) -DEFINE_SEMANTIC_ITEM(true, true, KaxChapterTranslateCodec) -DEFINE_SEMANTIC_ITEM(true, true, KaxChapterTranslateID) -DEFINE_END_SEMANTIC(KaxChapterTranslate) - -DEFINE_MKX_BINARY (KaxSegmentUID, 0x73A4, 2, KaxInfo, "SegmentUID"); -DEFINE_MKX_UNISTRING (KaxSegmentFilename, 0x7384, 2, KaxInfo, "SegmentFilename"); -DEFINE_MKX_BINARY_CONS (KaxPrevUID, 0x3CB923, 3, KaxInfo, "PrevUID"); -DEFINE_MKX_UNISTRING (KaxPrevFilename, 0x3C83AB, 3, KaxInfo, "PrevFilename"); -DEFINE_MKX_BINARY_CONS (KaxNextUID, 0x3EB923, 3, KaxInfo, "NextUID"); -DEFINE_MKX_UNISTRING (KaxNextFilename, 0x3E83BB, 3, KaxInfo, "NextFilename"); -DEFINE_MKX_BINARY (KaxSegmentFamily, 0x4444, 2, KaxInfo, "SegmentFamily"); -DEFINE_MKX_MASTER (KaxChapterTranslate, 0x6924, 2, KaxInfo, "ChapterTranslate"); -DEFINE_MKX_UINTEGER (KaxChapterTranslateEditionUID, 0x69FC, 2, KaxChapterTranslate, "ChapterTranslateEditionUID"); -DEFINE_MKX_UINTEGER (KaxChapterTranslateCodec, 0x69BF, 2, KaxChapterTranslate, "ChapterTranslateCodec"); -DEFINE_MKX_BINARY (KaxChapterTranslateID, 0x69A5, 2, KaxChapterTranslate, "ChapterTranslateID"); -DEFINE_MKX_UINTEGER_DEF(KaxTimecodeScale, 0x2AD7B1, 3, KaxInfo, "TimecodeScale", 1000000); -DEFINE_MKX_FLOAT (KaxDuration, 0x4489, 2, KaxInfo, "Duration"); -DEFINE_MKX_DATE (KaxDateUTC, 0x4461, 2, KaxInfo, "DateUTC"); -DEFINE_MKX_UNISTRING (KaxTitle, 0x7BA9, 2, KaxInfo, "Title"); - -KaxPrevUID::KaxPrevUID(EBML_EXTRA_DEF) -:KaxSegmentUID(EBML_DEF_BINARY_CTX(KaxPrevUID) EBML_DEF_SEP EBML_EXTRA_CALL) -{ -} - -KaxNextUID::KaxNextUID(EBML_EXTRA_DEF) -:KaxSegmentUID(EBML_DEF_BINARY_CTX(KaxNextUID) EBML_DEF_SEP EBML_EXTRA_CALL) -{ -} - -#if LIBEBML_VERSION >= 0x010000 -KaxSegmentUID::KaxSegmentUID(EBML_DEF_CONS EBML_DEF_SEP EBML_EXTRA_DEF) -:EbmlBinary(EBML_DEF_PARAM EBML_DEF_SEP EBML_EXTRA_CALL) -{ -} -#endif - -END_LIBMATROSKA_NAMESPACE +/**************************************************************************** +** libmatroska : parse Matroska files, see http://www.matroska.org/ +** +** +** +** Copyright (C) 2002-2010 Steve Lhomme. All rights reserved. +** +** This file is part of libmatroska. +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License as published by the Free Software Foundation; either +** version 2.1 of the License, or (at your option) any later version. +** +** This library is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser General Public +** License along with this library; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +** +** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.** +** Contact license@matroska.org if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +/*! + \file + \version \$Id$ + \author Steve Lhomme + \author John Cannon +*/ +#include "matroska/KaxInfoData.h" +#include "matroska/KaxContexts.h" +#include "matroska/KaxDefines.h" + +START_LIBMATROSKA_NAMESPACE + +DEFINE_START_SEMANTIC(KaxChapterTranslate) +DEFINE_SEMANTIC_ITEM(false, false, KaxChapterTranslateEditionUID) +DEFINE_SEMANTIC_ITEM(true, true, KaxChapterTranslateCodec) +DEFINE_SEMANTIC_ITEM(true, true, KaxChapterTranslateID) +DEFINE_END_SEMANTIC(KaxChapterTranslate) + +DEFINE_MKX_BINARY (KaxSegmentUID, 0x73A4, 2, KaxInfo, "SegmentUID"); +DEFINE_MKX_UNISTRING (KaxSegmentFilename, 0x7384, 2, KaxInfo, "SegmentFilename"); +DEFINE_MKX_BINARY_CONS (KaxPrevUID, 0x3CB923, 3, KaxInfo, "PrevUID"); +DEFINE_MKX_UNISTRING (KaxPrevFilename, 0x3C83AB, 3, KaxInfo, "PrevFilename"); +DEFINE_MKX_BINARY_CONS (KaxNextUID, 0x3EB923, 3, KaxInfo, "NextUID"); +DEFINE_MKX_UNISTRING (KaxNextFilename, 0x3E83BB, 3, KaxInfo, "NextFilename"); +DEFINE_MKX_BINARY (KaxSegmentFamily, 0x4444, 2, KaxInfo, "SegmentFamily"); +DEFINE_MKX_MASTER (KaxChapterTranslate, 0x6924, 2, KaxInfo, "ChapterTranslate"); +DEFINE_MKX_UINTEGER (KaxChapterTranslateEditionUID, 0x69FC, 2, KaxChapterTranslate, "ChapterTranslateEditionUID"); +DEFINE_MKX_UINTEGER (KaxChapterTranslateCodec, 0x69BF, 2, KaxChapterTranslate, "ChapterTranslateCodec"); +DEFINE_MKX_BINARY (KaxChapterTranslateID, 0x69A5, 2, KaxChapterTranslate, "ChapterTranslateID"); +DEFINE_MKX_UINTEGER_DEF(KaxTimecodeScale, 0x2AD7B1, 3, KaxInfo, "TimecodeScale", 1000000); +DEFINE_MKX_FLOAT (KaxDuration, 0x4489, 2, KaxInfo, "Duration"); +DEFINE_MKX_DATE (KaxDateUTC, 0x4461, 2, KaxInfo, "DateUTC"); +DEFINE_MKX_UNISTRING (KaxTitle, 0x7BA9, 2, KaxInfo, "Title"); + +KaxPrevUID::KaxPrevUID(EBML_EXTRA_DEF) +:KaxSegmentUID(EBML_DEF_BINARY_CTX(KaxPrevUID) EBML_DEF_SEP EBML_EXTRA_CALL) +{ +} + +KaxNextUID::KaxNextUID(EBML_EXTRA_DEF) +:KaxSegmentUID(EBML_DEF_BINARY_CTX(KaxNextUID) EBML_DEF_SEP EBML_EXTRA_CALL) +{ +} + +#if defined(HAVE_EBML2) +KaxSegmentUID::KaxSegmentUID(EBML_DEF_CONS EBML_DEF_SEP EBML_EXTRA_DEF) +:EbmlBinary(EBML_DEF_PARAM EBML_DEF_SEP EBML_EXTRA_CALL) +{ +} +#endif + +END_LIBMATROSKA_NAMESPACE diff --git a/src/KaxTagMulti.cpp b/src/KaxTagMulti.cpp index 6f609d3..00c7d93 100644 --- a/src/KaxTagMulti.cpp +++ b/src/KaxTagMulti.cpp @@ -1,212 +1,212 @@ -/**************************************************************************** -** libmatroska : parse Matroska files, see http://www.matroska.org/ -** -** -** -** Copyright (C) 2002-2010 Steve Lhomme. All rights reserved. -** -** This file is part of libmatroska. -** -** This library is free software; you can redistribute it and/or -** modify it under the terms of the GNU Lesser General Public -** License as published by the Free Software Foundation; either -** version 2.1 of the License, or (at your option) any later version. -** -** This library is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -** Lesser General Public License for more details. -** -** You should have received a copy of the GNU Lesser General Public -** License along with this library; if not, write to the Free Software -** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -** -** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.** -** Contact license@matroska.org if any conditions of this licensing are -** not clear to you. -** -**********************************************************************/ - -/*! - \file - \version \$Id: KaxTagMulti.cpp 640 2004-07-09 21:05:36Z mosu $ - \author Jory Stone - \author Steve Lhomme -*/ -#include "matroska/KaxTagMulti.h" -#include "matroska/KaxContexts.h" -#include "matroska/KaxDefines.h" - -using namespace LIBEBML_NAMESPACE; - -START_LIBMATROSKA_NAMESPACE - -DEFINE_START_SEMANTIC(KaxTagMultiGlobal) -// TODO: have the default EBML global semantic as well -DEFINE_SEMANTIC_ITEM(false, false, KaxTagMultiComment) -DEFINE_END_SEMANTIC(KaxTagMultiGlobal) - -DEFINE_START_SEMANTIC(KaxTagMultiComment) -DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiCommentName) -DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiCommentComments) -DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiCommentLanguage) -DEFINE_END_SEMANTIC(KaxTagMultiComment) - -DEFINE_START_SEMANTIC(KaxTagMultiCommercial) -DEFINE_SEMANTIC_ITEM(true, false, KaxTagCommercial) -DEFINE_END_SEMANTIC(KaxTagMultiCommercial) - -DEFINE_START_SEMANTIC(KaxTagCommercial) -DEFINE_SEMANTIC_ITEM(true, true, KaxTagMultiCommercialType) -DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiCommercialAddress) -DEFINE_SEMANTIC_ITEM(false, false, KaxTagMultiCommercialURL) -DEFINE_SEMANTIC_ITEM(false, false, KaxTagMultiCommercialEmail) -DEFINE_SEMANTIC_ITEM(false, false, KaxTagMultiPrice) -DEFINE_END_SEMANTIC(KaxTagCommercial) - -DEFINE_START_SEMANTIC(KaxTagMultiPrice) -DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiPriceCurrency) -DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiPriceAmount) -DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiPricePriceDate) -DEFINE_END_SEMANTIC(KaxTagMultiPrice) - -DEFINE_START_SEMANTIC(KaxTagMultiDate) -DEFINE_SEMANTIC_ITEM(true, false, KaxTagDate) -DEFINE_END_SEMANTIC(KaxTagMultiDate) - -DEFINE_START_SEMANTIC(KaxTagDate) -DEFINE_SEMANTIC_ITEM(true, true, KaxTagMultiDateType) -DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiDateDateBegin) -DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiDateDateEnd) -DEFINE_END_SEMANTIC(KaxTagDate) - -DEFINE_START_SEMANTIC(KaxTagMultiEntity) -DEFINE_SEMANTIC_ITEM(true, false, KaxTagEntity) -DEFINE_END_SEMANTIC(KaxTagMultiEntity) - -DEFINE_START_SEMANTIC(KaxTagEntity) -DEFINE_SEMANTIC_ITEM(true, true, KaxTagMultiEntityType) -DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiEntityName) -DEFINE_SEMANTIC_ITEM(false, false, KaxTagMultiEntityURL) -DEFINE_SEMANTIC_ITEM(false, false, KaxTagMultiEntityEmail) -DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiEntityAddress) -DEFINE_END_SEMANTIC(KaxTagEntity) - -DEFINE_START_SEMANTIC(KaxTagMultiIdentifier) -DEFINE_SEMANTIC_ITEM(true, false, KaxTagIdentifier) -DEFINE_END_SEMANTIC(KaxTagMultiIdentifier) - -DEFINE_START_SEMANTIC(KaxTagIdentifier) -DEFINE_SEMANTIC_ITEM(true, true, KaxTagMultiIdentifierType) -DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiIdentifierBinary) -DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiIdentifierString) -DEFINE_END_SEMANTIC(KaxTagIdentifier) - -DEFINE_START_SEMANTIC(KaxTagMultiLegal) -DEFINE_SEMANTIC_ITEM(true, false, KaxTagLegal) -DEFINE_END_SEMANTIC(KaxTagMultiLegal) - -DEFINE_START_SEMANTIC(KaxTagLegal) -DEFINE_SEMANTIC_ITEM(true, true, KaxTagMultiLegalType) -DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiLegalContent) -DEFINE_SEMANTIC_ITEM(false, false, KaxTagMultiLegalURL) -DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiLegalAddress) -DEFINE_END_SEMANTIC(KaxTagLegal) - -DEFINE_START_SEMANTIC(KaxTagMultiTitle) -DEFINE_SEMANTIC_ITEM(true, false, KaxTagTitle) -DEFINE_END_SEMANTIC(KaxTagMultiTitle) - -DEFINE_START_SEMANTIC(KaxTagTitle) -DEFINE_SEMANTIC_ITEM(true, true, KaxTagMultiTitleType) -DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiTitleName) -DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiTitleSubTitle) -DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiTitleEdition) -DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiTitleAddress) -DEFINE_SEMANTIC_ITEM(false, false, KaxTagMultiTitleURL) -DEFINE_SEMANTIC_ITEM(false, false, KaxTagMultiTitleEmail) -DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiTitleLanguage) -DEFINE_END_SEMANTIC(KaxTagTitle) - -DEFINE_START_SEMANTIC(KaxTagMultiAttachment) -DEFINE_SEMANTIC_ITEM(true, false, KaxTagAttachment) -DEFINE_END_SEMANTIC(KaxTagMultiAttachment) - -DEFINE_START_SEMANTIC(KaxTagAttachment) -DEFINE_SEMANTIC_ITEM(false, true, KaxTagAttachmentID) -DEFINE_END_SEMANTIC(KaxTagAttachment) - - -DEFINE_MKX_CONTEXT(KaxTagMultiGlobal); - -const EbmlSemanticContext & GetKaxTagsGlobal_Context() -{ - return EBML_CLASS_SEMCONTEXT(KaxTagMultiGlobal); -} - -#if LIBEBML_VERSION >= 0x010000 -#define DEFINE_TAG_MASTER(a,b,c,d,e) DEFINE_xxx_MASTER(a,b,d,e,EBML_SemanticKaxTagMultiGlobal) -#else -#define DEFINE_TAG_MASTER(a,b,c,d,e) DEFINE_xxx_MASTER(a,b,c,d,e,*GetKaxTagsGlobal_Context) -#endif - - -DEFINE_MKX_MASTER (KaxTagMultiComment, 0x5B7B, 2, KaxTag, "MultiComment"); -DEFINE_MKX_STRING (KaxTagMultiCommentName, 0x5F7D, 2, KaxTagMultiComment, "MultiCommentName"); -DEFINE_MKX_UNISTRING(KaxTagMultiCommentComments, 0x5F7C, 2, KaxTagMultiComment, "MultiCommentComments"); -DEFINE_MKX_STRING (KaxTagMultiCommentLanguage, 0x22B59D, 3, KaxTagMultiComment, "MultiCommentLanguage"); - -DEFINE_TAG_MASTER (KaxTagMultiCommercial, 0x4DC7, 2, KaxTag, "MultiCommercial"); -DEFINE_TAG_MASTER (KaxTagCommercial, 0x4EC7, 2, KaxTagMultiCommercial, "Commercial"); -DEFINE_MKX_UINTEGER (KaxTagMultiCommercialType, 0x5BD7, 2, KaxTagCommercial, "MultiCommercialType"); -DEFINE_MKX_UNISTRING(KaxTagMultiCommercialAddress, 0x5BBB, 2, KaxTagCommercial, "MultiCommercialAddress"); -DEFINE_MKX_STRING (KaxTagMultiCommercialURL, 0x5BDA, 2, KaxTagCommercial, "MultiCommercialURL"); -DEFINE_MKX_STRING (KaxTagMultiCommercialEmail, 0x5BC0, 2, KaxTagCommercial, "MultiCommercialEmail"); -DEFINE_TAG_MASTER (KaxTagMultiPrice, 0x5BC3, 2, KaxTagCommercial, "MultiPrice"); -DEFINE_MKX_STRING (KaxTagMultiPriceCurrency, 0x5B6C, 2, KaxTagMultiPrice, "MultiPriceCurrency"); -DEFINE_MKX_FLOAT (KaxTagMultiPriceAmount, 0x5B6E, 2, KaxTagMultiPrice, "MultiPriceAmount"); -DEFINE_MKX_DATE (KaxTagMultiPricePriceDate, 0x5B6F, 2, KaxTagMultiPrice, "MultiPricePriceDate"); - -DEFINE_TAG_MASTER (KaxTagMultiDate, 0x4DC8, 2, KaxTag, "MultiDate"); -DEFINE_TAG_MASTER (KaxTagDate, 0x4EC8, 2, KaxTagMultiDate, "Date"); -DEFINE_MKX_UINTEGER (KaxTagMultiDateType, 0x5BD8, 2, KaxTagDate, "MultiDateType"); -DEFINE_MKX_DATE (KaxTagMultiDateDateBegin, 0x4460, 2, KaxTagDate, "MultiDateDateBegin"); -DEFINE_MKX_DATE (KaxTagMultiDateDateEnd, 0x4462, 2, KaxTagDate, "MultiDateDateEnd"); - -DEFINE_TAG_MASTER (KaxTagMultiEntity, 0x4DC9, 2, KaxTag, "MultiEntity"); -DEFINE_TAG_MASTER (KaxTagEntity, 0x4EC9, 2, KaxTagMultiEntity, "Entity"); -DEFINE_MKX_UINTEGER (KaxTagMultiEntityType, 0x5BD9, 2, KaxTagEntity, "MultiEntityType"); -DEFINE_MKX_UNISTRING(KaxTagMultiEntityName, 0x5BED, 2, KaxTagEntity, "MultiEntityName"); -DEFINE_MKX_STRING (KaxTagMultiEntityURL, 0x5BDB, 2, KaxTagEntity, "MultiEntityURL"); -DEFINE_MKX_STRING (KaxTagMultiEntityEmail, 0x5BC1, 2, KaxTagEntity, "MultiEntityEmail"); -DEFINE_MKX_UNISTRING(KaxTagMultiEntityAddress, 0x5BDC, 2, KaxTagEntity, "MultiEntityAddress"); - -DEFINE_TAG_MASTER (KaxTagMultiIdentifier, 0x4DC6, 2, KaxTag, "MultiIdentifier"); -DEFINE_TAG_MASTER (KaxTagIdentifier, 0x4EC6, 2, KaxTagMultiIdentifier, "Identifier"); -DEFINE_MKX_UINTEGER (KaxTagMultiIdentifierType, 0x5BAD, 2, KaxTagIdentifier, "MultiIdentifierType"); -DEFINE_MKX_BINARY (KaxTagMultiIdentifierBinary, 0x6B67, 2, KaxTagIdentifier, "MultiIdentifierBinary"); -DEFINE_MKX_UNISTRING(KaxTagMultiIdentifierString, 0x6B68, 2, KaxTagIdentifier, "MultiIdentifierString"); - -DEFINE_TAG_MASTER (KaxTagMultiLegal, 0x4DC5, 2, KaxTag, "MultiLegal"); -DEFINE_TAG_MASTER (KaxTagLegal, 0x4EC5, 2, KaxTagMultiLegal, "Legal"); -DEFINE_MKX_UINTEGER (KaxTagMultiLegalType, 0x5BBD, 2, KaxTagLegal, "MultiLegalType"); -DEFINE_MKX_UNISTRING(KaxTagMultiLegalContent, 0x5BB2, 2, KaxTagLegal, "MultiLegalContent"); -DEFINE_MKX_STRING (KaxTagMultiLegalURL, 0x5B34, 2, KaxTagLegal, "MultiLegalURL"); -DEFINE_MKX_UNISTRING(KaxTagMultiLegalAddress, 0x5B9B, 2, KaxTagLegal, "MultiLegalAddress"); - -DEFINE_TAG_MASTER (KaxTagMultiTitle, 0x4DC4, 2, KaxTag, "MultiTitle"); -DEFINE_TAG_MASTER (KaxTagTitle, 0x4EC4, 2, KaxTagMultiTitle, "Title"); -DEFINE_MKX_UINTEGER (KaxTagMultiTitleType, 0x5B7D, 2, KaxTagTitle, "MultiTitleType"); -DEFINE_MKX_UNISTRING(KaxTagMultiTitleName, 0x5BB9, 2, KaxTagTitle, "MultiTitleName"); -DEFINE_MKX_UNISTRING(KaxTagMultiTitleSubTitle, 0x5B5B, 2, KaxTagTitle, "MultiTitleSubTitle"); -DEFINE_MKX_UNISTRING(KaxTagMultiTitleEdition, 0x5BAE, 2, KaxTagTitle, "MultiTitleEdition"); -DEFINE_MKX_UNISTRING(KaxTagMultiTitleAddress, 0x5B33, 2, KaxTagTitle, "MultiTitleAddress"); -DEFINE_MKX_STRING (KaxTagMultiTitleURL, 0x5BA9, 2, KaxTagTitle, "MultiTitleURL"); -DEFINE_MKX_STRING (KaxTagMultiTitleEmail, 0x5BC9, 2, KaxTagTitle, "MultiTitleEmail"); -DEFINE_MKX_STRING (KaxTagMultiTitleLanguage, 0x22B59E, 3, KaxTagTitle, "MultiTitleLanguage"); - -DEFINE_TAG_MASTER (KaxTagMultiAttachment, 0x4DC3, 2, KaxTag, "MultiAttachment"); -DEFINE_TAG_MASTER (KaxTagAttachment, 0x4EC3, 2, KaxTagMultiAttachment, "Attachment"); -DEFINE_MKX_UINTEGER (KaxTagAttachmentID, 0x5BA0, 2, KaxTagAttachment, "AttachmentID"); - -END_LIBMATROSKA_NAMESPACE +/**************************************************************************** +** libmatroska : parse Matroska files, see http://www.matroska.org/ +** +** +** +** Copyright (C) 2002-2010 Steve Lhomme. All rights reserved. +** +** This file is part of libmatroska. +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License as published by the Free Software Foundation; either +** version 2.1 of the License, or (at your option) any later version. +** +** This library is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** Lesser General Public License for more details. +** +** You should have received a copy of the GNU Lesser General Public +** License along with this library; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +** +** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.** +** Contact license@matroska.org if any conditions of this licensing are +** not clear to you. +** +**********************************************************************/ + +/*! + \file + \version \$Id$ + \author Jory Stone + \author Steve Lhomme +*/ +#include "matroska/KaxTagMulti.h" +#include "matroska/KaxContexts.h" +#include "matroska/KaxDefines.h" + +using namespace LIBEBML_NAMESPACE; + +START_LIBMATROSKA_NAMESPACE + +DEFINE_START_SEMANTIC(KaxTagMultiGlobal) +// TODO: have the default EBML global semantic as well +DEFINE_SEMANTIC_ITEM(false, false, KaxTagMultiComment) +DEFINE_END_SEMANTIC(KaxTagMultiGlobal) + +DEFINE_START_SEMANTIC(KaxTagMultiComment) +DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiCommentName) +DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiCommentComments) +DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiCommentLanguage) +DEFINE_END_SEMANTIC(KaxTagMultiComment) + +DEFINE_START_SEMANTIC(KaxTagMultiCommercial) +DEFINE_SEMANTIC_ITEM(true, false, KaxTagCommercial) +DEFINE_END_SEMANTIC(KaxTagMultiCommercial) + +DEFINE_START_SEMANTIC(KaxTagCommercial) +DEFINE_SEMANTIC_ITEM(true, true, KaxTagMultiCommercialType) +DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiCommercialAddress) +DEFINE_SEMANTIC_ITEM(false, false, KaxTagMultiCommercialURL) +DEFINE_SEMANTIC_ITEM(false, false, KaxTagMultiCommercialEmail) +DEFINE_SEMANTIC_ITEM(false, false, KaxTagMultiPrice) +DEFINE_END_SEMANTIC(KaxTagCommercial) + +DEFINE_START_SEMANTIC(KaxTagMultiPrice) +DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiPriceCurrency) +DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiPriceAmount) +DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiPricePriceDate) +DEFINE_END_SEMANTIC(KaxTagMultiPrice) + +DEFINE_START_SEMANTIC(KaxTagMultiDate) +DEFINE_SEMANTIC_ITEM(true, false, KaxTagDate) +DEFINE_END_SEMANTIC(KaxTagMultiDate) + +DEFINE_START_SEMANTIC(KaxTagDate) +DEFINE_SEMANTIC_ITEM(true, true, KaxTagMultiDateType) +DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiDateDateBegin) +DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiDateDateEnd) +DEFINE_END_SEMANTIC(KaxTagDate) + +DEFINE_START_SEMANTIC(KaxTagMultiEntity) +DEFINE_SEMANTIC_ITEM(true, false, KaxTagEntity) +DEFINE_END_SEMANTIC(KaxTagMultiEntity) + +DEFINE_START_SEMANTIC(KaxTagEntity) +DEFINE_SEMANTIC_ITEM(true, true, KaxTagMultiEntityType) +DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiEntityName) +DEFINE_SEMANTIC_ITEM(false, false, KaxTagMultiEntityURL) +DEFINE_SEMANTIC_ITEM(false, false, KaxTagMultiEntityEmail) +DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiEntityAddress) +DEFINE_END_SEMANTIC(KaxTagEntity) + +DEFINE_START_SEMANTIC(KaxTagMultiIdentifier) +DEFINE_SEMANTIC_ITEM(true, false, KaxTagIdentifier) +DEFINE_END_SEMANTIC(KaxTagMultiIdentifier) + +DEFINE_START_SEMANTIC(KaxTagIdentifier) +DEFINE_SEMANTIC_ITEM(true, true, KaxTagMultiIdentifierType) +DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiIdentifierBinary) +DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiIdentifierString) +DEFINE_END_SEMANTIC(KaxTagIdentifier) + +DEFINE_START_SEMANTIC(KaxTagMultiLegal) +DEFINE_SEMANTIC_ITEM(true, false, KaxTagLegal) +DEFINE_END_SEMANTIC(KaxTagMultiLegal) + +DEFINE_START_SEMANTIC(KaxTagLegal) +DEFINE_SEMANTIC_ITEM(true, true, KaxTagMultiLegalType) +DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiLegalContent) +DEFINE_SEMANTIC_ITEM(false, false, KaxTagMultiLegalURL) +DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiLegalAddress) +DEFINE_END_SEMANTIC(KaxTagLegal) + +DEFINE_START_SEMANTIC(KaxTagMultiTitle) +DEFINE_SEMANTIC_ITEM(true, false, KaxTagTitle) +DEFINE_END_SEMANTIC(KaxTagMultiTitle) + +DEFINE_START_SEMANTIC(KaxTagTitle) +DEFINE_SEMANTIC_ITEM(true, true, KaxTagMultiTitleType) +DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiTitleName) +DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiTitleSubTitle) +DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiTitleEdition) +DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiTitleAddress) +DEFINE_SEMANTIC_ITEM(false, false, KaxTagMultiTitleURL) +DEFINE_SEMANTIC_ITEM(false, false, KaxTagMultiTitleEmail) +DEFINE_SEMANTIC_ITEM(false, true, KaxTagMultiTitleLanguage) +DEFINE_END_SEMANTIC(KaxTagTitle) + +DEFINE_START_SEMANTIC(KaxTagMultiAttachment) +DEFINE_SEMANTIC_ITEM(true, false, KaxTagAttachment) +DEFINE_END_SEMANTIC(KaxTagMultiAttachment) + +DEFINE_START_SEMANTIC(KaxTagAttachment) +DEFINE_SEMANTIC_ITEM(false, true, KaxTagAttachmentID) +DEFINE_END_SEMANTIC(KaxTagAttachment) + + +DEFINE_MKX_CONTEXT(KaxTagMultiGlobal); + +const EbmlSemanticContext & GetKaxTagsGlobal_Context() +{ + return EBML_CLASS_SEMCONTEXT(KaxTagMultiGlobal); +} + +#if defined(HAVE_EBML2) +#define DEFINE_TAG_MASTER(a,b,c,d,e) DEFINE_xxx_MASTER(a,b,d,e,EBML_SemanticKaxTagMultiGlobal) +#else +#define DEFINE_TAG_MASTER(a,b,c,d,e) DEFINE_xxx_MASTER(a,b,c,d,e,*GetKaxTagsGlobal_Context) +#endif + + +DEFINE_MKX_MASTER (KaxTagMultiComment, 0x5B7B, 2, KaxTag, "MultiComment"); +DEFINE_MKX_STRING (KaxTagMultiCommentName, 0x5F7D, 2, KaxTagMultiComment, "MultiCommentName"); +DEFINE_MKX_UNISTRING(KaxTagMultiCommentComments, 0x5F7C, 2, KaxTagMultiComment, "MultiCommentComments"); +DEFINE_MKX_STRING (KaxTagMultiCommentLanguage, 0x22B59D, 3, KaxTagMultiComment, "MultiCommentLanguage"); + +DEFINE_TAG_MASTER (KaxTagMultiCommercial, 0x4DC7, 2, KaxTag, "MultiCommercial"); +DEFINE_TAG_MASTER (KaxTagCommercial, 0x4EC7, 2, KaxTagMultiCommercial, "Commercial"); +DEFINE_MKX_UINTEGER (KaxTagMultiCommercialType, 0x5BD7, 2, KaxTagCommercial, "MultiCommercialType"); +DEFINE_MKX_UNISTRING(KaxTagMultiCommercialAddress, 0x5BBB, 2, KaxTagCommercial, "MultiCommercialAddress"); +DEFINE_MKX_STRING (KaxTagMultiCommercialURL, 0x5BDA, 2, KaxTagCommercial, "MultiCommercialURL"); +DEFINE_MKX_STRING (KaxTagMultiCommercialEmail, 0x5BC0, 2, KaxTagCommercial, "MultiCommercialEmail"); +DEFINE_TAG_MASTER (KaxTagMultiPrice, 0x5BC3, 2, KaxTagCommercial, "MultiPrice"); +DEFINE_MKX_STRING (KaxTagMultiPriceCurrency, 0x5B6C, 2, KaxTagMultiPrice, "MultiPriceCurrency"); +DEFINE_MKX_FLOAT (KaxTagMultiPriceAmount, 0x5B6E, 2, KaxTagMultiPrice, "MultiPriceAmount"); +DEFINE_MKX_DATE (KaxTagMultiPricePriceDate, 0x5B6F, 2, KaxTagMultiPrice, "MultiPricePriceDate"); + +DEFINE_TAG_MASTER (KaxTagMultiDate, 0x4DC8, 2, KaxTag, "MultiDate"); +DEFINE_TAG_MASTER (KaxTagDate, 0x4EC8, 2, KaxTagMultiDate, "Date"); +DEFINE_MKX_UINTEGER (KaxTagMultiDateType, 0x5BD8, 2, KaxTagDate, "MultiDateType"); +DEFINE_MKX_DATE (KaxTagMultiDateDateBegin, 0x4460, 2, KaxTagDate, "MultiDateDateBegin"); +DEFINE_MKX_DATE (KaxTagMultiDateDateEnd, 0x4462, 2, KaxTagDate, "MultiDateDateEnd"); + +DEFINE_TAG_MASTER (KaxTagMultiEntity, 0x4DC9, 2, KaxTag, "MultiEntity"); +DEFINE_TAG_MASTER (KaxTagEntity, 0x4EC9, 2, KaxTagMultiEntity, "Entity"); +DEFINE_MKX_UINTEGER (KaxTagMultiEntityType, 0x5BD9, 2, KaxTagEntity, "MultiEntityType"); +DEFINE_MKX_UNISTRING(KaxTagMultiEntityName, 0x5BED, 2, KaxTagEntity, "MultiEntityName"); +DEFINE_MKX_STRING (KaxTagMultiEntityURL, 0x5BDB, 2, KaxTagEntity, "MultiEntityURL"); +DEFINE_MKX_STRING (KaxTagMultiEntityEmail, 0x5BC1, 2, KaxTagEntity, "MultiEntityEmail"); +DEFINE_MKX_UNISTRING(KaxTagMultiEntityAddress, 0x5BDC, 2, KaxTagEntity, "MultiEntityAddress"); + +DEFINE_TAG_MASTER (KaxTagMultiIdentifier, 0x4DC6, 2, KaxTag, "MultiIdentifier"); +DEFINE_TAG_MASTER (KaxTagIdentifier, 0x4EC6, 2, KaxTagMultiIdentifier, "Identifier"); +DEFINE_MKX_UINTEGER (KaxTagMultiIdentifierType, 0x5BAD, 2, KaxTagIdentifier, "MultiIdentifierType"); +DEFINE_MKX_BINARY (KaxTagMultiIdentifierBinary, 0x6B67, 2, KaxTagIdentifier, "MultiIdentifierBinary"); +DEFINE_MKX_UNISTRING(KaxTagMultiIdentifierString, 0x6B68, 2, KaxTagIdentifier, "MultiIdentifierString"); + +DEFINE_TAG_MASTER (KaxTagMultiLegal, 0x4DC5, 2, KaxTag, "MultiLegal"); +DEFINE_TAG_MASTER (KaxTagLegal, 0x4EC5, 2, KaxTagMultiLegal, "Legal"); +DEFINE_MKX_UINTEGER (KaxTagMultiLegalType, 0x5BBD, 2, KaxTagLegal, "MultiLegalType"); +DEFINE_MKX_UNISTRING(KaxTagMultiLegalContent, 0x5BB2, 2, KaxTagLegal, "MultiLegalContent"); +DEFINE_MKX_STRING (KaxTagMultiLegalURL, 0x5B34, 2, KaxTagLegal, "MultiLegalURL"); +DEFINE_MKX_UNISTRING(KaxTagMultiLegalAddress, 0x5B9B, 2, KaxTagLegal, "MultiLegalAddress"); + +DEFINE_TAG_MASTER (KaxTagMultiTitle, 0x4DC4, 2, KaxTag, "MultiTitle"); +DEFINE_TAG_MASTER (KaxTagTitle, 0x4EC4, 2, KaxTagMultiTitle, "Title"); +DEFINE_MKX_UINTEGER (KaxTagMultiTitleType, 0x5B7D, 2, KaxTagTitle, "MultiTitleType"); +DEFINE_MKX_UNISTRING(KaxTagMultiTitleName, 0x5BB9, 2, KaxTagTitle, "MultiTitleName"); +DEFINE_MKX_UNISTRING(KaxTagMultiTitleSubTitle, 0x5B5B, 2, KaxTagTitle, "MultiTitleSubTitle"); +DEFINE_MKX_UNISTRING(KaxTagMultiTitleEdition, 0x5BAE, 2, KaxTagTitle, "MultiTitleEdition"); +DEFINE_MKX_UNISTRING(KaxTagMultiTitleAddress, 0x5B33, 2, KaxTagTitle, "MultiTitleAddress"); +DEFINE_MKX_STRING (KaxTagMultiTitleURL, 0x5BA9, 2, KaxTagTitle, "MultiTitleURL"); +DEFINE_MKX_STRING (KaxTagMultiTitleEmail, 0x5BC9, 2, KaxTagTitle, "MultiTitleEmail"); +DEFINE_MKX_STRING (KaxTagMultiTitleLanguage, 0x22B59E, 3, KaxTagTitle, "MultiTitleLanguage"); + +DEFINE_TAG_MASTER (KaxTagMultiAttachment, 0x4DC3, 2, KaxTag, "MultiAttachment"); +DEFINE_TAG_MASTER (KaxTagAttachment, 0x4EC3, 2, KaxTagMultiAttachment, "Attachment"); +DEFINE_MKX_UINTEGER (KaxTagAttachmentID, 0x5BA0, 2, KaxTagAttachment, "AttachmentID"); + +END_LIBMATROSKA_NAMESPACE