[Matroska-cvs] [matroska] r1265 - in trunk/libmatroska: matroska src

mosu at matroska.org mosu at matroska.org
Sun Jan 14 18:20:37 CET 2007


Author: mosu
Date: 2007-01-14 20:20:35 +0300 (Sun, 14 Jan 2007)
New Revision: 1265

Modified:
   trunk/libmatroska/matroska/KaxBlock.h
   trunk/libmatroska/matroska/KaxCluster.h
   trunk/libmatroska/matroska/KaxCuesData.h
   trunk/libmatroska/src/KaxBlock.cpp
   trunk/libmatroska/src/KaxCues.cpp
   trunk/libmatroska/src/KaxCuesData.cpp
Log:
Added support for KaxCodecState and for indexing them in the cues.

Modified: trunk/libmatroska/matroska/KaxBlock.h
===================================================================
--- trunk/libmatroska/matroska/KaxBlock.h	2006-10-12 20:52:34 UTC (rev 1264)
+++ trunk/libmatroska/matroska/KaxBlock.h	2007-01-14 17:20:35 UTC (rev 1265)
@@ -187,6 +187,8 @@
 
 		operator KaxInternalBlock &();
 
+		const KaxCluster *GetParentCluster() const { return ParentCluster; }
+
 	protected:
 		KaxCluster * ParentCluster;
 		const KaxTrackEntry * ParentTrack;
@@ -320,6 +322,7 @@
 	}
 
 	operator KaxBlockGroup &();
+	operator const KaxBlockGroup &() const;
 #if MATROSKA_VERSION >= 2
 	operator KaxSimpleBlock &();
 #endif
@@ -434,6 +437,19 @@
 		EbmlElement * Clone() const {return new KaxBlockAddID(*this);}
 };
 
+class MATROSKA_DLL_API KaxCodecState : public EbmlBinary {
+	public:
+		KaxCodecState() {}
+		KaxCodecState(const KaxCodecState & ElementToClone) :EbmlBinary(ElementToClone){}
+		static EbmlElement & Create() {return *(new KaxCodecState);}
+		const EbmlCallbacks & Generic() const {return ClassInfos;}
+		static const EbmlCallbacks ClassInfos;
+		operator const EbmlId &() const {return ClassInfos.GlobalId;}
+		bool ValidateSize() const {return true;}
+
+		EbmlElement * Clone() const {return new KaxCodecState(*this);}
+};
+
 END_LIBMATROSKA_NAMESPACE
 
 #endif // LIBMATROSKA_BLOCK_H

Modified: trunk/libmatroska/matroska/KaxCluster.h
===================================================================
--- trunk/libmatroska/matroska/KaxCluster.h	2006-10-12 20:52:34 UTC (rev 1264)
+++ trunk/libmatroska/matroska/KaxCluster.h	2007-01-14 17:20:35 UTC (rev 1265)
@@ -140,6 +140,8 @@
 
 		bool AddBlockBlob(KaxBlockBlob * NewBlob);
 
+		const KaxSegment *GetParentSegment() const { return ParentSegment; }
+
 	protected:
 		KaxBlockBlob     * currentNewBlob;
 		std::vector<KaxBlockBlob*> Blobs;

Modified: trunk/libmatroska/matroska/KaxCuesData.h
===================================================================
--- trunk/libmatroska/matroska/KaxCuesData.h	2006-10-12 20:52:34 UTC (rev 1264)
+++ trunk/libmatroska/matroska/KaxCuesData.h	2007-01-14 17:20:35 UTC (rev 1265)
@@ -56,7 +56,7 @@
 		operator const EbmlId &() const {return ClassInfos.GlobalId;}
 		EbmlElement * Clone() const {return new KaxCuePoint(*this);}
 		void PositionSet(const KaxBlockGroup & BlockReference, uint64 GlobalTimecodeScale);
-		void PositionSet(const KaxInternalBlock & BlockReference, uint64 GlobalTimecodeScale);
+		void PositionSet(const KaxBlockBlob & BlobReference, uint64 GlobalTimecodeScale);
 
 		bool operator<(const EbmlElement & EltB) const;
 

Modified: trunk/libmatroska/src/KaxBlock.cpp
===================================================================
--- trunk/libmatroska/src/KaxBlock.cpp	2006-10-12 20:52:34 UTC (rev 1264)
+++ trunk/libmatroska/src/KaxBlock.cpp	2007-01-14 17:20:35 UTC (rev 1265)
@@ -45,7 +45,7 @@
 #if MATROSKA_VERSION == 1
 const EbmlSemantic KaxBlockGroup_ContextList[6] =
 #else // MATROSKA_VERSION
-const EbmlSemantic KaxBlockGroup_ContextList[8] =
+const EbmlSemantic KaxBlockGroup_ContextList[9] =
 #endif // MATROSKA_VERSION
 {
 	EbmlSemantic(true,  true,  KaxBlock::ClassInfos),
@@ -58,6 +58,7 @@
 	EbmlSemantic(false, false, KaxReferenceBlock::ClassInfos),
 #if MATROSKA_VERSION >= 2
 	EbmlSemantic(false, true,  KaxReferenceVirtual::ClassInfos),
+	EbmlSemantic(false, true,  KaxCodecState::ClassInfos),
 #endif // MATROSKA_VERSION
 	EbmlSemantic(false, true,  KaxBlockAdditions::ClassInfos),
 };
@@ -79,6 +80,7 @@
 EbmlId KaxBlockDuration_TheId  (0x9B, 1);
 #if MATROSKA_VERSION >= 2
 EbmlId KaxBlockVirtual_TheId   (0xA2, 1);
+EbmlId KaxCodecState_TheId     (0xA4, 1);
 #endif // MATROSKA_VERSION
 EbmlId KaxBlockAdditions_TheId (0x75A1, 2);
 EbmlId KaxBlockMore_TheId      (0xA6, 1);
@@ -91,6 +93,7 @@
 #if MATROSKA_VERSION >= 2
 const EbmlSemanticContext KaxSimpleBlock_Context = EbmlSemanticContext(0, NULL, &KaxCluster_Context, *GetKaxGlobal_Context, &KaxSimpleBlock::ClassInfos);
 const EbmlSemanticContext KaxBlockVirtual_Context = EbmlSemanticContext(0, NULL, &KaxBlockGroup_Context, *GetKaxGlobal_Context, &KaxBlockVirtual::ClassInfos);
+const EbmlSemanticContext KaxCodecState_Context = EbmlSemanticContext(0, NULL, &KaxBlockGroup_Context, *GetKaxGlobal_Context, &KaxCodecState::ClassInfos);
 #endif // MATROSKA_VERSION
 const EbmlSemanticContext KaxBlockAdditions_Context = EbmlSemanticContext(countof(KaxBlockAdditions_ContextList), KaxBlockAdditions_ContextList, &KaxBlockGroup_Context, *GetKaxGlobal_Context, &KaxBlockAdditions::ClassInfos);
 const EbmlSemanticContext KaxBlockMore_Context = EbmlSemanticContext(countof(KaxBlockMore_ContextList), KaxBlockMore_ContextList, &KaxBlockAdditions_Context, *GetKaxGlobal_Context, &KaxBlockMore::ClassInfos);
@@ -103,6 +106,7 @@
 #if MATROSKA_VERSION >= 2
 const EbmlCallbacks KaxSimpleBlock::ClassInfos(KaxSimpleBlock::Create, KaxSimpleBlock_TheId, "SimpleBlock", KaxSimpleBlock_Context);
 const EbmlCallbacks KaxBlockVirtual::ClassInfos(KaxBlockVirtual::Create, KaxBlockVirtual_TheId, "BlockVirtual", KaxBlockVirtual_Context);
+const EbmlCallbacks KaxCodecState::ClassInfos(KaxCodecState::Create, KaxCodecState_TheId, "CodecState", KaxCodecState_Context);
 #endif // MATROSKA_VERSION
 const EbmlCallbacks KaxBlockAdditions::ClassInfos(KaxBlockAdditions::Create, KaxBlockAdditions_TheId, "BlockAdditions", KaxBlockAdditions_Context);
 const EbmlCallbacks KaxBlockMore::ClassInfos(KaxBlockMore::Create, KaxBlockMore_TheId, "BlockMore", KaxBlockMore_Context);
@@ -966,6 +970,13 @@
 	return *Block.group;
 }
 
+KaxBlockBlob::operator const KaxBlockGroup &() const
+{
+	assert(!bUseSimpleBlock);
+	assert(Block.group);
+	return *Block.group;
+}
+
 KaxBlockBlob::operator KaxInternalBlock &()
 {
 	assert(Block.group);

Modified: trunk/libmatroska/src/KaxCues.cpp
===================================================================
--- trunk/libmatroska/src/KaxCues.cpp	2006-10-12 20:52:34 UTC (rev 1264)
+++ trunk/libmatroska/src/KaxCues.cpp	2007-01-14 17:20:35 UTC (rev 1265)
@@ -96,8 +96,7 @@
 		if (*ListIdx == &BlockReference) {
 			// found, now add the element to the entry list
 			KaxCuePoint & NewPoint = AddNewChild<KaxCuePoint>(*this);
-			const KaxInternalBlock &intblock = BlockReference;
-			NewPoint.PositionSet(intblock, GlobalTimecodeScale());
+			NewPoint.PositionSet(BlockReference, GlobalTimecodeScale());
 			myTempReferences.erase(ListIdx);
 			break;
 		}
@@ -115,7 +114,7 @@
 			refTmp.TrackNum() == BlockRef.TrackNumber()) {
 			// found, now add the element to the entry list
 			KaxCuePoint & NewPoint = AddNewChild<KaxCuePoint>(*this);
-			NewPoint.PositionSet(refTmp, GlobalTimecodeScale());
+			NewPoint.PositionSet(**ListIdx, GlobalTimecodeScale());
 			myTempReferences.erase(ListIdx);
 			break;
 		}

Modified: trunk/libmatroska/src/KaxCuesData.cpp
===================================================================
--- trunk/libmatroska/src/KaxCuesData.cpp	2006-10-12 20:52:34 UTC (rev 1264)
+++ trunk/libmatroska/src/KaxCuesData.cpp	2007-01-14 17:20:35 UTC (rev 1265)
@@ -36,6 +36,8 @@
 #include "matroska/KaxContexts.h"
 #include "matroska/KaxBlock.h"
 #include "matroska/KaxBlockData.h"
+#include "matroska/KaxCluster.h"
+#include "matroska/KaxSegment.h"
 
 START_LIBMATROSKA_NAMESPACE
 
@@ -156,13 +158,21 @@
 			NewRefs.AddReference(BlockReference.Reference(i).RefBlock(), GlobalTimecodeScale);
 		}
 	}
+
+	KaxCodecState *CodecState = static_cast<KaxCodecState *>(BlockReference.FindFirstElt(KaxCodecState::ClassInfos));
+	if (CodecState != NULL) {
+		KaxCueCodecState &CueCodecState = AddNewChild<KaxCueCodecState>(NewPositions);
+		*static_cast<EbmlUInteger*>(&CueCodecState) = BlockReference.GetParentCluster()->GetParentSegment()->GetRelativePosition(CodecState->GetElementPosition());
+	}
 #endif // MATROSKA_VERSION
 
 	bValueIsSet = true;
 }
 
-void KaxCuePoint::PositionSet(const KaxInternalBlock & BlockReference, uint64 GlobalTimecodeScale)
+void KaxCuePoint::PositionSet(const KaxBlockBlob & BlobReference, uint64 GlobalTimecodeScale)
 {
+	const KaxInternalBlock &BlockReference = BlobReference;
+
 	// fill me
 	KaxCueTime & NewTime = GetChild<KaxCueTime>(*this);
 	*static_cast<EbmlUInteger*>(&NewTime) = BlockReference.GlobalTimecode() / GlobalTimecodeScale;
@@ -186,6 +196,17 @@
 	}
 #endif // MATROSKA_VERSION
 
+#if MATROSKA_VERSION >= 2
+	if (!BlobReference.IsSimpleBlock()) {
+		const KaxBlockGroup &BlockGroup = BlobReference;
+		const KaxCodecState *CodecState = static_cast<KaxCodecState *>(BlockGroup.FindFirstElt(KaxCodecState::ClassInfos));
+		if (CodecState != NULL) {
+			KaxCueCodecState &CueCodecState = AddNewChild<KaxCueCodecState>(NewPositions);
+			*static_cast<EbmlUInteger*>(&CueCodecState) = BlockGroup.GetParentCluster()->GetParentSegment()->GetRelativePosition(CodecState->GetElementPosition());
+		}
+	}
+#endif // MATROSKA_VERSION
+
 	bValueIsSet = true;
 }
 



More information about the Matroska-cvs mailing list