From: Moritz Bunkus Date: Sat, 27 Mar 2010 23:15:21 +0000 (+0000) Subject: Properly compare elements X-Git-Tag: release-0.9.0~35 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e9c742ec1c14f95111d9489d944d76648b896b69;p=libmatroska Properly compare elements If you have "virtual operator <" in a base class and a derived class and each takes a reference of its own class as an arugment then the function in the derived class hides the one in the base class and does not override is as the signatures do not match: class base { public: bool virtual operator <(const base &cmp); }; class derived: public base { public: bool virtual operator <(const derived &cmp); }; If two instances of base are compared then base::operator< is called: base *p1, *p2; if (*p1 < *p2) // calls base::operator< git-svn-id: https://matroska.svn.sourceforge.net/svnroot/matroska/trunk/libmatroska@62 a6f86f6d-0131-4f8e-9e7b-e335508773d5 --- diff --git a/matroska/KaxCuesData.h b/matroska/KaxCuesData.h index 51d3594..8eaa478 100644 --- a/matroska/KaxCuesData.h +++ b/matroska/KaxCuesData.h @@ -1,162 +1,162 @@ -/**************************************************************************** -** 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: KaxCuesData.h,v 1.8 2004/04/14 23:26:17 robux4 Exp $ - \author Steve Lhomme -*/ -#ifndef LIBMATROSKA_CUES_DATA_H -#define LIBMATROSKA_CUES_DATA_H - -#include "matroska/KaxTypes.h" -#include "ebml/EbmlUInteger.h" -#include "ebml/EbmlMaster.h" - -using namespace LIBEBML_NAMESPACE; - -START_LIBMATROSKA_NAMESPACE - -class KaxBlockGroup; -class KaxBlockBlob; -class KaxCueTrackPositions; -class KaxInternalBlock; - -class MATROSKA_DLL_API KaxCuePoint : public EbmlMaster { - public: - KaxCuePoint(); - KaxCuePoint(const KaxCuePoint & ElementToClone) :EbmlMaster(ElementToClone) {} - void PositionSet(const KaxBlockGroup & BlockReference, uint64 GlobalTimecodeScale); - void PositionSet(const KaxBlockBlob & BlobReference, uint64 GlobalTimecodeScale); - - bool operator<(const EbmlElement & EltB) const; - - const KaxCueTrackPositions * GetSeekPosition() const; - bool Timecode(uint64 & aTimecode, uint64 GlobalTimecodeScale) const; - - EBML_CONCRETE_CLASS(KaxCuePoint) -}; - -class MATROSKA_DLL_API KaxCueTime : public EbmlUInteger { - public: - KaxCueTime() {} - KaxCueTime(const KaxCueTime & ElementToClone) :EbmlUInteger(ElementToClone) {} - - EBML_CONCRETE_CLASS(KaxCueTime) -}; - -class MATROSKA_DLL_API KaxCueTrackPositions : public EbmlMaster { - public: - KaxCueTrackPositions(); - KaxCueTrackPositions(const KaxCueTrackPositions & ElementToClone) :EbmlMaster(ElementToClone) {} - - uint64 ClusterPosition() const; - uint16 TrackNumber() const; - - EBML_CONCRETE_CLASS(KaxCueTrackPositions) -}; - -class MATROSKA_DLL_API KaxCueTrack : public EbmlUInteger { - public: - KaxCueTrack() {} - KaxCueTrack(const KaxCueTrack & ElementToClone) :EbmlUInteger(ElementToClone) {} - - EBML_CONCRETE_CLASS(KaxCueTrack) -}; - -class MATROSKA_DLL_API KaxCueClusterPosition : public EbmlUInteger { - public: - KaxCueClusterPosition() {} - KaxCueClusterPosition(const KaxCueClusterPosition & ElementToClone) :EbmlUInteger(ElementToClone) {} - - EBML_CONCRETE_CLASS(KaxCueClusterPosition) -}; - -class MATROSKA_DLL_API KaxCueBlockNumber : public EbmlUInteger { - public: - KaxCueBlockNumber() :EbmlUInteger(1) {} - KaxCueBlockNumber(const KaxCueBlockNumber & ElementToClone) :EbmlUInteger(ElementToClone) {} - - EBML_CONCRETE_CLASS(KaxCueBlockNumber) -}; - -#if MATROSKA_VERSION >= 2 -class MATROSKA_DLL_API KaxCueCodecState : public EbmlUInteger { - public: - KaxCueCodecState() :EbmlUInteger(0) {} - KaxCueCodecState(const KaxCueCodecState & ElementToClone) :EbmlUInteger(ElementToClone) {} - - EBML_CONCRETE_CLASS(KaxCueCodecState) -}; - -class MATROSKA_DLL_API KaxCueReference : public EbmlMaster { - public: - KaxCueReference(); - KaxCueReference(const KaxCueReference & ElementToClone) :EbmlMaster(ElementToClone) {} - - void AddReference(const KaxBlockGroup & BlockReferenced, uint64 GlobalTimecodeScale); - void AddReference(const KaxBlockBlob & BlockReferenced, uint64 GlobalTimecodeScale); - - EBML_CONCRETE_CLASS(KaxCueReference) -}; - -class MATROSKA_DLL_API KaxCueRefTime : public EbmlUInteger { - public: - KaxCueRefTime() {} - KaxCueRefTime(const KaxCueRefTime & ElementToClone) :EbmlUInteger(ElementToClone) {} - - EBML_CONCRETE_CLASS(KaxCueRefTime) -}; - -class MATROSKA_DLL_API KaxCueRefCluster : public EbmlUInteger { - public: - KaxCueRefCluster() {} - KaxCueRefCluster(const KaxCueRefCluster & ElementToClone) :EbmlUInteger(ElementToClone) {} - - EBML_CONCRETE_CLASS(KaxCueRefCluster) -}; - -class MATROSKA_DLL_API KaxCueRefNumber : public EbmlUInteger { - public: - KaxCueRefNumber() :EbmlUInteger(1) {} - KaxCueRefNumber(const KaxCueRefNumber & ElementToClone) :EbmlUInteger(ElementToClone) {} - - EBML_CONCRETE_CLASS(KaxCueRefNumber) -}; - -class MATROSKA_DLL_API KaxCueRefCodecState : public EbmlUInteger { - public: - KaxCueRefCodecState() :EbmlUInteger(0) {} - KaxCueRefCodecState(const KaxCueRefCodecState & ElementToClone) :EbmlUInteger(ElementToClone) {} - - EBML_CONCRETE_CLASS(KaxCueRefCodecState) -}; -#endif // MATROSKA_VERSION - -END_LIBMATROSKA_NAMESPACE - -#endif // LIBMATROSKA_CUES_DATA_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: KaxCuesData.h,v 1.8 2004/04/14 23:26:17 robux4 Exp $ + \author Steve Lhomme +*/ +#ifndef LIBMATROSKA_CUES_DATA_H +#define LIBMATROSKA_CUES_DATA_H + +#include "matroska/KaxTypes.h" +#include "ebml/EbmlUInteger.h" +#include "ebml/EbmlMaster.h" + +using namespace LIBEBML_NAMESPACE; + +START_LIBMATROSKA_NAMESPACE + +class KaxBlockGroup; +class KaxBlockBlob; +class KaxCueTrackPositions; +class KaxInternalBlock; + +class MATROSKA_DLL_API KaxCuePoint : public EbmlMaster { + public: + KaxCuePoint(); + KaxCuePoint(const KaxCuePoint & ElementToClone) :EbmlMaster(ElementToClone) {} + void PositionSet(const KaxBlockGroup & BlockReference, uint64 GlobalTimecodeScale); + void PositionSet(const KaxBlockBlob & BlobReference, uint64 GlobalTimecodeScale); + + virtual bool IsSmallerThan(const EbmlElement *Cmp) const; + + const KaxCueTrackPositions * GetSeekPosition() const; + bool Timecode(uint64 & aTimecode, uint64 GlobalTimecodeScale) const; + + EBML_CONCRETE_CLASS(KaxCuePoint) +}; + +class MATROSKA_DLL_API KaxCueTime : public EbmlUInteger { + public: + KaxCueTime() {} + KaxCueTime(const KaxCueTime & ElementToClone) :EbmlUInteger(ElementToClone) {} + + EBML_CONCRETE_CLASS(KaxCueTime) +}; + +class MATROSKA_DLL_API KaxCueTrackPositions : public EbmlMaster { + public: + KaxCueTrackPositions(); + KaxCueTrackPositions(const KaxCueTrackPositions & ElementToClone) :EbmlMaster(ElementToClone) {} + + uint64 ClusterPosition() const; + uint16 TrackNumber() const; + + EBML_CONCRETE_CLASS(KaxCueTrackPositions) +}; + +class MATROSKA_DLL_API KaxCueTrack : public EbmlUInteger { + public: + KaxCueTrack() {} + KaxCueTrack(const KaxCueTrack & ElementToClone) :EbmlUInteger(ElementToClone) {} + + EBML_CONCRETE_CLASS(KaxCueTrack) +}; + +class MATROSKA_DLL_API KaxCueClusterPosition : public EbmlUInteger { + public: + KaxCueClusterPosition() {} + KaxCueClusterPosition(const KaxCueClusterPosition & ElementToClone) :EbmlUInteger(ElementToClone) {} + + EBML_CONCRETE_CLASS(KaxCueClusterPosition) +}; + +class MATROSKA_DLL_API KaxCueBlockNumber : public EbmlUInteger { + public: + KaxCueBlockNumber() :EbmlUInteger(1) {} + KaxCueBlockNumber(const KaxCueBlockNumber & ElementToClone) :EbmlUInteger(ElementToClone) {} + + EBML_CONCRETE_CLASS(KaxCueBlockNumber) +}; + +#if MATROSKA_VERSION >= 2 +class MATROSKA_DLL_API KaxCueCodecState : public EbmlUInteger { + public: + KaxCueCodecState() :EbmlUInteger(0) {} + KaxCueCodecState(const KaxCueCodecState & ElementToClone) :EbmlUInteger(ElementToClone) {} + + EBML_CONCRETE_CLASS(KaxCueCodecState) +}; + +class MATROSKA_DLL_API KaxCueReference : public EbmlMaster { + public: + KaxCueReference(); + KaxCueReference(const KaxCueReference & ElementToClone) :EbmlMaster(ElementToClone) {} + + void AddReference(const KaxBlockGroup & BlockReferenced, uint64 GlobalTimecodeScale); + void AddReference(const KaxBlockBlob & BlockReferenced, uint64 GlobalTimecodeScale); + + EBML_CONCRETE_CLASS(KaxCueReference) +}; + +class MATROSKA_DLL_API KaxCueRefTime : public EbmlUInteger { + public: + KaxCueRefTime() {} + KaxCueRefTime(const KaxCueRefTime & ElementToClone) :EbmlUInteger(ElementToClone) {} + + EBML_CONCRETE_CLASS(KaxCueRefTime) +}; + +class MATROSKA_DLL_API KaxCueRefCluster : public EbmlUInteger { + public: + KaxCueRefCluster() {} + KaxCueRefCluster(const KaxCueRefCluster & ElementToClone) :EbmlUInteger(ElementToClone) {} + + EBML_CONCRETE_CLASS(KaxCueRefCluster) +}; + +class MATROSKA_DLL_API KaxCueRefNumber : public EbmlUInteger { + public: + KaxCueRefNumber() :EbmlUInteger(1) {} + KaxCueRefNumber(const KaxCueRefNumber & ElementToClone) :EbmlUInteger(ElementToClone) {} + + EBML_CONCRETE_CLASS(KaxCueRefNumber) +}; + +class MATROSKA_DLL_API KaxCueRefCodecState : public EbmlUInteger { + public: + KaxCueRefCodecState() :EbmlUInteger(0) {} + KaxCueRefCodecState(const KaxCueRefCodecState & ElementToClone) :EbmlUInteger(ElementToClone) {} + + EBML_CONCRETE_CLASS(KaxCueRefCodecState) +}; +#endif // MATROSKA_VERSION + +END_LIBMATROSKA_NAMESPACE + +#endif // LIBMATROSKA_CUES_DATA_H diff --git a/src/KaxCuesData.cpp b/src/KaxCuesData.cpp index a6148f1..ca74e67 100644 --- a/src/KaxCuesData.cpp +++ b/src/KaxCuesData.cpp @@ -1,329 +1,329 @@ -/**************************************************************************** -** 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: KaxCuesData.cpp 1265 2007-01-14 17:20:35Z mosu $ - \author Steve Lhomme -*/ -#include - -#include "matroska/KaxCuesData.h" -#include "matroska/KaxContexts.h" -#include "matroska/KaxBlock.h" -#include "matroska/KaxBlockData.h" -#include "matroska/KaxCluster.h" -#include "matroska/KaxSegment.h" - -START_LIBMATROSKA_NAMESPACE - -EbmlSemantic KaxCuePoint_ContextList[2] = -{ - EbmlSemantic(true, true, EBML_INFO(KaxCueTime)), - EbmlSemantic(true, false, EBML_INFO(KaxCueTrackPositions)), -}; - -#if MATROSKA_VERSION == 1 -EbmlSemantic KaxCueTrackPositions_ContextList[3] = -#else // MATROSKA_VERSION -EbmlSemantic KaxCueTrackPositions_ContextList[5] = -#endif // MATROSKA_VERSION -{ - EbmlSemantic(true, true, EBML_INFO(KaxCueTrack)), - EbmlSemantic(true, true, EBML_INFO(KaxCueClusterPosition)), - EbmlSemantic(false, true, EBML_INFO(KaxCueBlockNumber)), -#if MATROSKA_VERSION >= 2 - EbmlSemantic(false, true, EBML_INFO(KaxCueCodecState)), - EbmlSemantic(false, false, EBML_INFO(KaxCueReference)), -#endif // MATROSKA_VERSION -}; - -#if MATROSKA_VERSION >= 2 -EbmlSemantic KaxCueReference_ContextList[4] = -{ - EbmlSemantic(true, true, EBML_INFO(KaxCueRefTime)), - EbmlSemantic(true, true, EBML_INFO(KaxCueRefCluster)), - EbmlSemantic(false, true, EBML_INFO(KaxCueRefNumber)), - EbmlSemantic(false, true, EBML_INFO(KaxCueRefCodecState)), -}; -#endif // MATROSKA_VERSION - -EbmlId KaxCuePoint_TheId (0xBB, 1); -EbmlId KaxCueTime_TheId (0xB3, 1); -EbmlId KaxCueTrackPositions_TheId (0xB7, 1); -EbmlId KaxCueTrack_TheId (0xF7, 1); -EbmlId KaxCueClusterPosition_TheId(0xF1, 1); -EbmlId KaxCueBlockNumber_TheId (0x5378, 2); -#if MATROSKA_VERSION >= 2 -EbmlId KaxCueCodecState_TheId (0xEA, 1); -EbmlId KaxCueReference_TheId (0xDB, 1); -EbmlId KaxCueRefTime_TheId (0x96, 1); -EbmlId KaxCueRefCluster_TheId (0x97, 1); -EbmlId KaxCueRefNumber_TheId (0x535F, 2); -EbmlId KaxCueRefCodecState_TheId (0xEB, 1); -#endif // MATROSKA_VERSION - -const EbmlSemanticContext KaxCuePoint_Context = EbmlSemanticContext(countof(KaxCuePoint_ContextList), KaxCuePoint_ContextList, &KaxCues_Context, *GetKaxGlobal_Context, &EBML_INFO(KaxCuePoint)); -const EbmlSemanticContext KaxCueTime_Context = EbmlSemanticContext(0, NULL, &KaxCuePoint_Context, *GetKaxGlobal_Context, &EBML_INFO(KaxCueTime)); -const EbmlSemanticContext KaxCueTrackPositions_Context = EbmlSemanticContext(countof(KaxCueTrackPositions_ContextList), KaxCueTrackPositions_ContextList, &KaxCuePoint_Context, *GetKaxGlobal_Context, &EBML_INFO(KaxCueTrackPositions)); -const EbmlSemanticContext KaxCueTrack_Context = EbmlSemanticContext(0, NULL, &KaxCueTrackPositions_Context, *GetKaxGlobal_Context, &EBML_INFO(KaxCueTrack)); -const EbmlSemanticContext KaxCueClusterPosition_Context = EbmlSemanticContext(0, NULL, &KaxCueTrackPositions_Context, *GetKaxGlobal_Context, &EBML_INFO(KaxCueClusterPosition)); -const EbmlSemanticContext KaxCueBlockNumber_Context = EbmlSemanticContext(0, NULL, &KaxCueTrackPositions_Context, *GetKaxGlobal_Context, &EBML_INFO(KaxCueBlockNumber)); -#if MATROSKA_VERSION >= 2 -const EbmlSemanticContext KaxCueCodecState_Context = EbmlSemanticContext(0, NULL, &KaxCueTrackPositions_Context, *GetKaxGlobal_Context, &EBML_INFO(KaxCueCodecState)); -const EbmlSemanticContext KaxCueReference_Context = EbmlSemanticContext(countof(KaxCueReference_ContextList), KaxCueReference_ContextList, &KaxCueTrackPositions_Context, *GetKaxGlobal_Context, &EBML_INFO(KaxCueReference)); -const EbmlSemanticContext KaxCueRefTime_Context = EbmlSemanticContext(0, NULL, &KaxCueReference_Context, *GetKaxGlobal_Context, &EBML_INFO(KaxCueRefTime)); -const EbmlSemanticContext KaxCueRefCluster_Context = EbmlSemanticContext(0, NULL, &KaxCueRefTime_Context, *GetKaxGlobal_Context, &EBML_INFO(KaxCueRefCluster)); -const EbmlSemanticContext KaxCueRefNumber_Context = EbmlSemanticContext(0, NULL, &KaxCueRefTime_Context, *GetKaxGlobal_Context, &EBML_INFO(KaxCueRefNumber)); -const EbmlSemanticContext KaxCueRefCodecState_Context = EbmlSemanticContext(0, NULL, &KaxCueRefTime_Context, *GetKaxGlobal_Context, &EBML_INFO(KaxCueRefCodecState)); -#endif // MATROSKA_VERSION - -const EbmlCallbacks KaxCuePoint::ClassInfos(KaxCuePoint::Create, KaxCuePoint_TheId, "CuePoint", KaxCuePoint_Context); -const EbmlCallbacks KaxCueTime::ClassInfos(KaxCueTime::Create, KaxCueTime_TheId, "CueTime", KaxCueTime_Context); -const EbmlCallbacks KaxCueTrackPositions::ClassInfos(KaxCueTrackPositions::Create, KaxCueTrackPositions_TheId, "CueTrackPositions", KaxCueTrackPositions_Context); -const EbmlCallbacks KaxCueTrack::ClassInfos(KaxCueTrack::Create, KaxCueTrack_TheId, "CueTrack", KaxCueTrack_Context); -const EbmlCallbacks KaxCueClusterPosition::ClassInfos(KaxCueClusterPosition::Create, KaxCueClusterPosition_TheId, "CueClusterPosition", KaxCueClusterPosition_Context); -const EbmlCallbacks KaxCueBlockNumber::ClassInfos(KaxCueBlockNumber::Create, KaxCueBlockNumber_TheId, "CueBlockNumber", KaxCueBlockNumber_Context); -#if MATROSKA_VERSION >= 2 -const EbmlCallbacks KaxCueCodecState::ClassInfos(KaxCueCodecState::Create, KaxCueCodecState_TheId, "CueCodecState", KaxCueCodecState_Context); -const EbmlCallbacks KaxCueReference::ClassInfos(KaxCueReference::Create, KaxCueReference_TheId, "CueReference", KaxCueReference_Context); -const EbmlCallbacks KaxCueRefTime::ClassInfos(KaxCueRefTime::Create, KaxCueRefTime_TheId, "CueRefTime", KaxCueRefTime_Context); -const EbmlCallbacks KaxCueRefCluster::ClassInfos(KaxCueRefCluster::Create, KaxCueRefCluster_TheId, "CueRefCluster", KaxCueRefCluster_Context); -const EbmlCallbacks KaxCueRefNumber::ClassInfos(KaxCueRefNumber::Create, KaxCueRefNumber_TheId, "CueRefNumber", KaxCueRefNumber_Context); -const EbmlCallbacks KaxCueRefCodecState::ClassInfos(KaxCueRefCodecState::Create, KaxCueRefCodecState_TheId, "CueRefCodecState", KaxCueRefCodecState_Context); -#endif // MATROSKA_VERSION - -KaxCuePoint::KaxCuePoint() - :EbmlMaster(KaxCuePoint_Context) -{} - -KaxCueTrackPositions::KaxCueTrackPositions() - :EbmlMaster(KaxCueTrackPositions_Context) -{} - -#if MATROSKA_VERSION >= 2 -KaxCueReference::KaxCueReference() - :EbmlMaster(KaxCueReference_Context) -{} -#endif // MATROSKA_VERSION - -/*! - \todo handle codec state checking - \todo remove duplicate references (reference to 2 frames that each reference the same frame) -*/ -void KaxCuePoint::PositionSet(const KaxBlockGroup & BlockReference, uint64 GlobalTimecodeScale) -{ - // fill me - KaxCueTime & NewTime = GetChild(*this); - *static_cast(&NewTime) = BlockReference.GlobalTimecode() / GlobalTimecodeScale; - - KaxCueTrackPositions & NewPositions = AddNewChild(*this); - KaxCueTrack & TheTrack = GetChild(NewPositions); - *static_cast(&TheTrack) = BlockReference.TrackNumber(); - - KaxCueClusterPosition & TheClustPos = GetChild(NewPositions); - *static_cast(&TheClustPos) = BlockReference.ClusterPosition(); - -#if MATROSKA_VERSION >= 2 - // handle reference use - if (BlockReference.ReferenceCount() != 0) - { - unsigned int i; - for (i=0; i(NewPositions); - NewRefs.AddReference(BlockReference.Reference(i).RefBlock(), GlobalTimecodeScale); - } - } - - KaxCodecState *CodecState = static_cast(BlockReference.FindFirstElt(EBML_INFO(KaxCodecState))); - if (CodecState != NULL) { - KaxCueCodecState &CueCodecState = AddNewChild(NewPositions); - *static_cast(&CueCodecState) = BlockReference.GetParentCluster()->GetParentSegment()->GetRelativePosition(CodecState->GetElementPosition()); - } -#endif // MATROSKA_VERSION - - SetValueIsSet(); -} - -void KaxCuePoint::PositionSet(const KaxBlockBlob & BlobReference, uint64 GlobalTimecodeScale) -{ - const KaxInternalBlock &BlockReference = BlobReference; - - // fill me - KaxCueTime & NewTime = GetChild(*this); - *static_cast(&NewTime) = BlockReference.GlobalTimecode() / GlobalTimecodeScale; - - KaxCueTrackPositions & NewPositions = AddNewChild(*this); - KaxCueTrack & TheTrack = GetChild(NewPositions); - *static_cast(&TheTrack) = BlockReference.TrackNum(); - - KaxCueClusterPosition & TheClustPos = GetChild(NewPositions); - *static_cast(&TheClustPos) = BlockReference.ClusterPosition(); - -#if 0 // MATROSKA_VERSION >= 2 - // handle reference use - if (BlockReference.ReferenceCount() != 0) - { - unsigned int i; - for (i=0; i(NewPositions); - NewRefs.AddReference(BlockReference.Reference(i).RefBlock(), GlobalTimecodeScale); - } - } -#endif // MATROSKA_VERSION - -#if MATROSKA_VERSION >= 2 - if (!BlobReference.IsSimpleBlock()) { - const KaxBlockGroup &BlockGroup = BlobReference; - const KaxCodecState *CodecState = static_cast(BlockGroup.FindFirstElt(EBML_INFO(KaxCodecState))); - if (CodecState != NULL) { - KaxCueCodecState &CueCodecState = AddNewChild(NewPositions); - *static_cast(&CueCodecState) = BlockGroup.GetParentCluster()->GetParentSegment()->GetRelativePosition(CodecState->GetElementPosition()); - } - } -#endif // MATROSKA_VERSION - - SetValueIsSet(); -} - -#if MATROSKA_VERSION >= 2 -/*! - \todo handle codec state checking -*/ -void KaxCueReference::AddReference(const KaxBlockBlob & BlockReference, uint64 GlobalTimecodeScale) -{ - const KaxInternalBlock & theBlock = BlockReference; - KaxCueRefTime & NewTime = GetChild(*this); - *static_cast(&NewTime) = theBlock.GlobalTimecode() / GlobalTimecodeScale; - - KaxCueRefCluster & TheClustPos = GetChild(*this); - *static_cast(&TheClustPos) = theBlock.ClusterPosition(); - -#ifdef OLD - // handle recursive reference use - if (BlockReference.ReferenceCount() != 0) - { - unsigned int i; - for (i=0; i(&EltB); - - // compare timecode - const KaxCueTime * TimeCodeA = static_cast(FindElt(EBML_INFO(KaxCueTime))); - if (TimeCodeA == NULL) - return false; - - const KaxCueTime * TimeCodeB = static_cast(theEltB.FindElt(EBML_INFO(KaxCueTime))); - if (TimeCodeB == NULL) - return false; - - if (*TimeCodeA < *TimeCodeB) - return true; - - if (*TimeCodeB < *TimeCodeA) - return false; - - // compare tracks (timecodes are equal) - const KaxCueTrack * TrackA = static_cast(FindElt(EBML_INFO(KaxCueTrack))); - if (TrackA == NULL) - return false; - - const KaxCueTrack * TrackB = static_cast(theEltB.FindElt(EBML_INFO(KaxCueTrack))); - if (TrackB == NULL) - return false; - - if (*TrackA < *TrackB) - return true; - - if (*TrackB < *TrackA) - return false; - - return false; -} - -bool KaxCuePoint::Timecode(uint64 & aTimecode, uint64 GlobalTimecodeScale) const -{ - const KaxCueTime *aTime = static_cast(FindFirstElt(EBML_INFO(KaxCueTime))); - if (aTime == NULL) - return false; - aTimecode = uint64(*aTime) * GlobalTimecodeScale; - return true; -} - -/*! - \brief return the position of the Cluster to load -*/ -const KaxCueTrackPositions * KaxCuePoint::GetSeekPosition() const -{ - const KaxCueTrackPositions * result = NULL; - uint64 aPosition = EBML_PRETTYLONGINT(0xFFFFFFFFFFFFFFF); - // find the position of the "earlier" Cluster - const KaxCueTrackPositions *aPoss = static_cast(FindFirstElt(EBML_INFO(KaxCueTrackPositions))); - while (aPoss != NULL) - { - const KaxCueClusterPosition *aPos = static_cast(aPoss->FindFirstElt(EBML_INFO(KaxCueClusterPosition))); - if (aPos != NULL && uint64(*aPos) < aPosition) { - aPosition = uint64(*aPos); - result = aPoss; - } - - aPoss = static_cast(FindNextElt(*aPoss)); - } - return result; -} - -uint64 KaxCueTrackPositions::ClusterPosition() const -{ - const KaxCueClusterPosition *aPos = static_cast(FindFirstElt(EBML_INFO(KaxCueClusterPosition))); - if (aPos == NULL) - return 0; - - return uint64(*aPos); -} - -uint16 KaxCueTrackPositions::TrackNumber() const -{ - const KaxCueTrack *aTrack = static_cast(FindFirstElt(EBML_INFO(KaxCueTrack))); - if (aTrack == NULL) - return 0; - - return uint16(*aTrack); -} - - -END_LIBMATROSKA_NAMESPACE +/**************************************************************************** +** 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: KaxCuesData.cpp 1265 2007-01-14 17:20:35Z mosu $ + \author Steve Lhomme +*/ +#include + +#include "matroska/KaxCuesData.h" +#include "matroska/KaxContexts.h" +#include "matroska/KaxBlock.h" +#include "matroska/KaxBlockData.h" +#include "matroska/KaxCluster.h" +#include "matroska/KaxSegment.h" + +START_LIBMATROSKA_NAMESPACE + +EbmlSemantic KaxCuePoint_ContextList[2] = +{ + EbmlSemantic(true, true, EBML_INFO(KaxCueTime)), + EbmlSemantic(true, false, EBML_INFO(KaxCueTrackPositions)), +}; + +#if MATROSKA_VERSION == 1 +EbmlSemantic KaxCueTrackPositions_ContextList[3] = +#else // MATROSKA_VERSION +EbmlSemantic KaxCueTrackPositions_ContextList[5] = +#endif // MATROSKA_VERSION +{ + EbmlSemantic(true, true, EBML_INFO(KaxCueTrack)), + EbmlSemantic(true, true, EBML_INFO(KaxCueClusterPosition)), + EbmlSemantic(false, true, EBML_INFO(KaxCueBlockNumber)), +#if MATROSKA_VERSION >= 2 + EbmlSemantic(false, true, EBML_INFO(KaxCueCodecState)), + EbmlSemantic(false, false, EBML_INFO(KaxCueReference)), +#endif // MATROSKA_VERSION +}; + +#if MATROSKA_VERSION >= 2 +EbmlSemantic KaxCueReference_ContextList[4] = +{ + EbmlSemantic(true, true, EBML_INFO(KaxCueRefTime)), + EbmlSemantic(true, true, EBML_INFO(KaxCueRefCluster)), + EbmlSemantic(false, true, EBML_INFO(KaxCueRefNumber)), + EbmlSemantic(false, true, EBML_INFO(KaxCueRefCodecState)), +}; +#endif // MATROSKA_VERSION + +EbmlId KaxCuePoint_TheId (0xBB, 1); +EbmlId KaxCueTime_TheId (0xB3, 1); +EbmlId KaxCueTrackPositions_TheId (0xB7, 1); +EbmlId KaxCueTrack_TheId (0xF7, 1); +EbmlId KaxCueClusterPosition_TheId(0xF1, 1); +EbmlId KaxCueBlockNumber_TheId (0x5378, 2); +#if MATROSKA_VERSION >= 2 +EbmlId KaxCueCodecState_TheId (0xEA, 1); +EbmlId KaxCueReference_TheId (0xDB, 1); +EbmlId KaxCueRefTime_TheId (0x96, 1); +EbmlId KaxCueRefCluster_TheId (0x97, 1); +EbmlId KaxCueRefNumber_TheId (0x535F, 2); +EbmlId KaxCueRefCodecState_TheId (0xEB, 1); +#endif // MATROSKA_VERSION + +const EbmlSemanticContext KaxCuePoint_Context = EbmlSemanticContext(countof(KaxCuePoint_ContextList), KaxCuePoint_ContextList, &KaxCues_Context, *GetKaxGlobal_Context, &EBML_INFO(KaxCuePoint)); +const EbmlSemanticContext KaxCueTime_Context = EbmlSemanticContext(0, NULL, &KaxCuePoint_Context, *GetKaxGlobal_Context, &EBML_INFO(KaxCueTime)); +const EbmlSemanticContext KaxCueTrackPositions_Context = EbmlSemanticContext(countof(KaxCueTrackPositions_ContextList), KaxCueTrackPositions_ContextList, &KaxCuePoint_Context, *GetKaxGlobal_Context, &EBML_INFO(KaxCueTrackPositions)); +const EbmlSemanticContext KaxCueTrack_Context = EbmlSemanticContext(0, NULL, &KaxCueTrackPositions_Context, *GetKaxGlobal_Context, &EBML_INFO(KaxCueTrack)); +const EbmlSemanticContext KaxCueClusterPosition_Context = EbmlSemanticContext(0, NULL, &KaxCueTrackPositions_Context, *GetKaxGlobal_Context, &EBML_INFO(KaxCueClusterPosition)); +const EbmlSemanticContext KaxCueBlockNumber_Context = EbmlSemanticContext(0, NULL, &KaxCueTrackPositions_Context, *GetKaxGlobal_Context, &EBML_INFO(KaxCueBlockNumber)); +#if MATROSKA_VERSION >= 2 +const EbmlSemanticContext KaxCueCodecState_Context = EbmlSemanticContext(0, NULL, &KaxCueTrackPositions_Context, *GetKaxGlobal_Context, &EBML_INFO(KaxCueCodecState)); +const EbmlSemanticContext KaxCueReference_Context = EbmlSemanticContext(countof(KaxCueReference_ContextList), KaxCueReference_ContextList, &KaxCueTrackPositions_Context, *GetKaxGlobal_Context, &EBML_INFO(KaxCueReference)); +const EbmlSemanticContext KaxCueRefTime_Context = EbmlSemanticContext(0, NULL, &KaxCueReference_Context, *GetKaxGlobal_Context, &EBML_INFO(KaxCueRefTime)); +const EbmlSemanticContext KaxCueRefCluster_Context = EbmlSemanticContext(0, NULL, &KaxCueRefTime_Context, *GetKaxGlobal_Context, &EBML_INFO(KaxCueRefCluster)); +const EbmlSemanticContext KaxCueRefNumber_Context = EbmlSemanticContext(0, NULL, &KaxCueRefTime_Context, *GetKaxGlobal_Context, &EBML_INFO(KaxCueRefNumber)); +const EbmlSemanticContext KaxCueRefCodecState_Context = EbmlSemanticContext(0, NULL, &KaxCueRefTime_Context, *GetKaxGlobal_Context, &EBML_INFO(KaxCueRefCodecState)); +#endif // MATROSKA_VERSION + +const EbmlCallbacks KaxCuePoint::ClassInfos(KaxCuePoint::Create, KaxCuePoint_TheId, "CuePoint", KaxCuePoint_Context); +const EbmlCallbacks KaxCueTime::ClassInfos(KaxCueTime::Create, KaxCueTime_TheId, "CueTime", KaxCueTime_Context); +const EbmlCallbacks KaxCueTrackPositions::ClassInfos(KaxCueTrackPositions::Create, KaxCueTrackPositions_TheId, "CueTrackPositions", KaxCueTrackPositions_Context); +const EbmlCallbacks KaxCueTrack::ClassInfos(KaxCueTrack::Create, KaxCueTrack_TheId, "CueTrack", KaxCueTrack_Context); +const EbmlCallbacks KaxCueClusterPosition::ClassInfos(KaxCueClusterPosition::Create, KaxCueClusterPosition_TheId, "CueClusterPosition", KaxCueClusterPosition_Context); +const EbmlCallbacks KaxCueBlockNumber::ClassInfos(KaxCueBlockNumber::Create, KaxCueBlockNumber_TheId, "CueBlockNumber", KaxCueBlockNumber_Context); +#if MATROSKA_VERSION >= 2 +const EbmlCallbacks KaxCueCodecState::ClassInfos(KaxCueCodecState::Create, KaxCueCodecState_TheId, "CueCodecState", KaxCueCodecState_Context); +const EbmlCallbacks KaxCueReference::ClassInfos(KaxCueReference::Create, KaxCueReference_TheId, "CueReference", KaxCueReference_Context); +const EbmlCallbacks KaxCueRefTime::ClassInfos(KaxCueRefTime::Create, KaxCueRefTime_TheId, "CueRefTime", KaxCueRefTime_Context); +const EbmlCallbacks KaxCueRefCluster::ClassInfos(KaxCueRefCluster::Create, KaxCueRefCluster_TheId, "CueRefCluster", KaxCueRefCluster_Context); +const EbmlCallbacks KaxCueRefNumber::ClassInfos(KaxCueRefNumber::Create, KaxCueRefNumber_TheId, "CueRefNumber", KaxCueRefNumber_Context); +const EbmlCallbacks KaxCueRefCodecState::ClassInfos(KaxCueRefCodecState::Create, KaxCueRefCodecState_TheId, "CueRefCodecState", KaxCueRefCodecState_Context); +#endif // MATROSKA_VERSION + +KaxCuePoint::KaxCuePoint() + :EbmlMaster(KaxCuePoint_Context) +{} + +KaxCueTrackPositions::KaxCueTrackPositions() + :EbmlMaster(KaxCueTrackPositions_Context) +{} + +#if MATROSKA_VERSION >= 2 +KaxCueReference::KaxCueReference() + :EbmlMaster(KaxCueReference_Context) +{} +#endif // MATROSKA_VERSION + +/*! + \todo handle codec state checking + \todo remove duplicate references (reference to 2 frames that each reference the same frame) +*/ +void KaxCuePoint::PositionSet(const KaxBlockGroup & BlockReference, uint64 GlobalTimecodeScale) +{ + // fill me + KaxCueTime & NewTime = GetChild(*this); + *static_cast(&NewTime) = BlockReference.GlobalTimecode() / GlobalTimecodeScale; + + KaxCueTrackPositions & NewPositions = AddNewChild(*this); + KaxCueTrack & TheTrack = GetChild(NewPositions); + *static_cast(&TheTrack) = BlockReference.TrackNumber(); + + KaxCueClusterPosition & TheClustPos = GetChild(NewPositions); + *static_cast(&TheClustPos) = BlockReference.ClusterPosition(); + +#if MATROSKA_VERSION >= 2 + // handle reference use + if (BlockReference.ReferenceCount() != 0) + { + unsigned int i; + for (i=0; i(NewPositions); + NewRefs.AddReference(BlockReference.Reference(i).RefBlock(), GlobalTimecodeScale); + } + } + + KaxCodecState *CodecState = static_cast(BlockReference.FindFirstElt(EBML_INFO(KaxCodecState))); + if (CodecState != NULL) { + KaxCueCodecState &CueCodecState = AddNewChild(NewPositions); + *static_cast(&CueCodecState) = BlockReference.GetParentCluster()->GetParentSegment()->GetRelativePosition(CodecState->GetElementPosition()); + } +#endif // MATROSKA_VERSION + + SetValueIsSet(); +} + +void KaxCuePoint::PositionSet(const KaxBlockBlob & BlobReference, uint64 GlobalTimecodeScale) +{ + const KaxInternalBlock &BlockReference = BlobReference; + + // fill me + KaxCueTime & NewTime = GetChild(*this); + *static_cast(&NewTime) = BlockReference.GlobalTimecode() / GlobalTimecodeScale; + + KaxCueTrackPositions & NewPositions = AddNewChild(*this); + KaxCueTrack & TheTrack = GetChild(NewPositions); + *static_cast(&TheTrack) = BlockReference.TrackNum(); + + KaxCueClusterPosition & TheClustPos = GetChild(NewPositions); + *static_cast(&TheClustPos) = BlockReference.ClusterPosition(); + +#if 0 // MATROSKA_VERSION >= 2 + // handle reference use + if (BlockReference.ReferenceCount() != 0) + { + unsigned int i; + for (i=0; i(NewPositions); + NewRefs.AddReference(BlockReference.Reference(i).RefBlock(), GlobalTimecodeScale); + } + } +#endif // MATROSKA_VERSION + +#if MATROSKA_VERSION >= 2 + if (!BlobReference.IsSimpleBlock()) { + const KaxBlockGroup &BlockGroup = BlobReference; + const KaxCodecState *CodecState = static_cast(BlockGroup.FindFirstElt(EBML_INFO(KaxCodecState))); + if (CodecState != NULL) { + KaxCueCodecState &CueCodecState = AddNewChild(NewPositions); + *static_cast(&CueCodecState) = BlockGroup.GetParentCluster()->GetParentSegment()->GetRelativePosition(CodecState->GetElementPosition()); + } + } +#endif // MATROSKA_VERSION + + SetValueIsSet(); +} + +#if MATROSKA_VERSION >= 2 +/*! + \todo handle codec state checking +*/ +void KaxCueReference::AddReference(const KaxBlockBlob & BlockReference, uint64 GlobalTimecodeScale) +{ + const KaxInternalBlock & theBlock = BlockReference; + KaxCueRefTime & NewTime = GetChild(*this); + *static_cast(&NewTime) = theBlock.GlobalTimecode() / GlobalTimecodeScale; + + KaxCueRefCluster & TheClustPos = GetChild(*this); + *static_cast(&TheClustPos) = theBlock.ClusterPosition(); + +#ifdef OLD + // handle recursive reference use + if (BlockReference.ReferenceCount() != 0) + { + unsigned int i; + for (i=0; i(EltB); + + // compare timecode + const KaxCueTime * TimeCodeA = static_cast(FindElt(EBML_INFO(KaxCueTime))); + if (TimeCodeA == NULL) + return false; + + const KaxCueTime * TimeCodeB = static_cast(theEltB.FindElt(EBML_INFO(KaxCueTime))); + if (TimeCodeB == NULL) + return false; + + if (TimeCodeA->IsSmallerThan(TimeCodeB)) + return true; + + if (TimeCodeB->IsSmallerThan(TimeCodeA)) + return false; + + // compare tracks (timecodes are equal) + const KaxCueTrack * TrackA = static_cast(FindElt(EBML_INFO(KaxCueTrack))); + if (TrackA == NULL) + return false; + + const KaxCueTrack * TrackB = static_cast(theEltB.FindElt(EBML_INFO(KaxCueTrack))); + if (TrackB == NULL) + return false; + + if (TrackA->IsSmallerThan(TrackB)) + return true; + + if (TrackB->IsSmallerThan(TrackA)) + return false; + + return false; +} + +bool KaxCuePoint::Timecode(uint64 & aTimecode, uint64 GlobalTimecodeScale) const +{ + const KaxCueTime *aTime = static_cast(FindFirstElt(EBML_INFO(KaxCueTime))); + if (aTime == NULL) + return false; + aTimecode = uint64(*aTime) * GlobalTimecodeScale; + return true; +} + +/*! + \brief return the position of the Cluster to load +*/ +const KaxCueTrackPositions * KaxCuePoint::GetSeekPosition() const +{ + const KaxCueTrackPositions * result = NULL; + uint64 aPosition = EBML_PRETTYLONGINT(0xFFFFFFFFFFFFFFF); + // find the position of the "earlier" Cluster + const KaxCueTrackPositions *aPoss = static_cast(FindFirstElt(EBML_INFO(KaxCueTrackPositions))); + while (aPoss != NULL) + { + const KaxCueClusterPosition *aPos = static_cast(aPoss->FindFirstElt(EBML_INFO(KaxCueClusterPosition))); + if (aPos != NULL && uint64(*aPos) < aPosition) { + aPosition = uint64(*aPos); + result = aPoss; + } + + aPoss = static_cast(FindNextElt(*aPoss)); + } + return result; +} + +uint64 KaxCueTrackPositions::ClusterPosition() const +{ + const KaxCueClusterPosition *aPos = static_cast(FindFirstElt(EBML_INFO(KaxCueClusterPosition))); + if (aPos == NULL) + return 0; + + return uint64(*aPos); +} + +uint16 KaxCueTrackPositions::TrackNumber() const +{ + const KaxCueTrack *aTrack = static_cast(FindFirstElt(EBML_INFO(KaxCueTrack))); + if (aTrack == NULL) + return 0; + + return uint16(*aTrack); +} + + +END_LIBMATROSKA_NAMESPACE