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

[email protected] Sun, 14 Jan 2007 20:20:37 +0300 (MSK)
Newsgroups gmane.comp.multimedia.matroska.cvs
Message-ID <[email protected]>
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
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/libmatroska/matroska/KaxBlock.h	2006-10-12 20:52:34 UTC (rev 12=
64)
+++ trunk/libmatroska/matroska/KaxBlock.h	2007-01-14 17:20:35 UTC (rev 12=
65)
@@ -187,6 +187,8 @@
=20
 		operator KaxInternalBlock &();
=20
+		const KaxCluster *GetParentCluster() const { return ParentCluster; }
+
 	protected:
 		KaxCluster * ParentCluster;
 		const KaxTrackEntry * ParentTrack;
@@ -320,6 +322,7 @@
 	}
=20
 	operator KaxBlockGroup &();
+	operator const KaxBlockGroup &() const;
 #if MATROSKA_VERSION >=3D 2
 	operator KaxSimpleBlock &();
 #endif
@@ -434,6 +437,19 @@
 		EbmlElement * Clone() const {return new KaxBlockAddID(*this);}
 };
=20
+class MATROSKA_DLL_API KaxCodecState : public EbmlBinary {
+	public:
+		KaxCodecState() {}
+		KaxCodecState(const KaxCodecState & ElementToClone) :EbmlBinary(Elemen=
tToClone){}
+		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
=20
 #endif // LIBMATROSKA_BLOCK_H

Modified: trunk/libmatroska/matroska/KaxCluster.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- 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 @@
=20
 		bool AddBlockBlob(KaxBlockBlob * NewBlob);
=20
+		const KaxSegment *GetParentSegment() const { return ParentSegment; }
+
 	protected:
 		KaxBlockBlob     * currentNewBlob;
 		std::vector<KaxBlockBlob*> Blobs;

Modified: trunk/libmatroska/matroska/KaxCuesData.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- 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 GlobalTi=
mecodeScale);
-		void PositionSet(const KaxInternalBlock & BlockReference, uint64 Globa=
lTimecodeScale);
+		void PositionSet(const KaxBlockBlob & BlobReference, uint64 GlobalTime=
codeScale);
=20
 		bool operator<(const EbmlElement & EltB) const;
=20

Modified: trunk/libmatroska/src/KaxBlock.cpp
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- 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 =3D=3D 1
 const EbmlSemantic KaxBlockGroup_ContextList[6] =3D
 #else // MATROSKA_VERSION
-const EbmlSemantic KaxBlockGroup_ContextList[8] =3D
+const EbmlSemantic KaxBlockGroup_ContextList[9] =3D
 #endif // MATROSKA_VERSION
 {
 	EbmlSemantic(true,  true,  KaxBlock::ClassInfos),
@@ -58,6 +58,7 @@
 	EbmlSemantic(false, false, KaxReferenceBlock::ClassInfos),
 #if MATROSKA_VERSION >=3D 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 >=3D 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 >=3D 2
 const EbmlSemanticContext KaxSimpleBlock_Context =3D EbmlSemanticContext=
(0, NULL, &KaxCluster_Context, *GetKaxGlobal_Context, &KaxSimpleBlock::Cl=
assInfos);
 const EbmlSemanticContext KaxBlockVirtual_Context =3D EbmlSemanticContex=
t(0, NULL, &KaxBlockGroup_Context, *GetKaxGlobal_Context, &KaxBlockVirtua=
l::ClassInfos);
+const EbmlSemanticContext KaxCodecState_Context =3D EbmlSemanticContext(=
0, NULL, &KaxBlockGroup_Context, *GetKaxGlobal_Context, &KaxCodecState::C=
lassInfos);
 #endif // MATROSKA_VERSION
 const EbmlSemanticContext KaxBlockAdditions_Context =3D EbmlSemanticCont=
ext(countof(KaxBlockAdditions_ContextList), KaxBlockAdditions_ContextList=
, &KaxBlockGroup_Context, *GetKaxGlobal_Context, &KaxBlockAdditions::Clas=
sInfos);
 const EbmlSemanticContext KaxBlockMore_Context =3D EbmlSemanticContext(c=
ountof(KaxBlockMore_ContextList), KaxBlockMore_ContextList, &KaxBlockAddi=
tions_Context, *GetKaxGlobal_Context, &KaxBlockMore::ClassInfos);
@@ -103,6 +106,7 @@
 #if MATROSKA_VERSION >=3D 2
 const EbmlCallbacks KaxSimpleBlock::ClassInfos(KaxSimpleBlock::Create, K=
axSimpleBlock_TheId, "SimpleBlock", KaxSimpleBlock_Context);
 const EbmlCallbacks KaxBlockVirtual::ClassInfos(KaxBlockVirtual::Create,=
 KaxBlockVirtual_TheId, "BlockVirtual", KaxBlockVirtual_Context);
+const EbmlCallbacks KaxCodecState::ClassInfos(KaxCodecState::Create, Kax=
CodecState_TheId, "CodecState", KaxCodecState_Context);
 #endif // MATROSKA_VERSION
 const EbmlCallbacks KaxBlockAdditions::ClassInfos(KaxBlockAdditions::Cre=
ate, KaxBlockAdditions_TheId, "BlockAdditions", KaxBlockAdditions_Context=
);
 const EbmlCallbacks KaxBlockMore::ClassInfos(KaxBlockMore::Create, KaxBl=
ockMore_TheId, "BlockMore", KaxBlockMore_Context);
@@ -966,6 +970,13 @@
 	return *Block.group;
 }
=20
+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
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- 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 =3D=3D &BlockReference) {
 			// found, now add the element to the entry list
 			KaxCuePoint & NewPoint =3D AddNewChild<KaxCuePoint>(*this);
-			const KaxInternalBlock &intblock =3D BlockReference;
-			NewPoint.PositionSet(intblock, GlobalTimecodeScale());
+			NewPoint.PositionSet(BlockReference, GlobalTimecodeScale());
 			myTempReferences.erase(ListIdx);
 			break;
 		}
@@ -115,7 +114,7 @@
 			refTmp.TrackNum() =3D=3D BlockRef.TrackNumber()) {
 			// found, now add the element to the entry list
 			KaxCuePoint & NewPoint =3D AddNewChild<KaxCuePoint>(*this);
-			NewPoint.PositionSet(refTmp, GlobalTimecodeScale());
+			NewPoint.PositionSet(**ListIdx, GlobalTimecodeScale());
 			myTempReferences.erase(ListIdx);
 			break;
 		}

Modified: trunk/libmatroska/src/KaxCuesData.cpp
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/libmatroska/src/KaxCuesData.cpp	2006-10-12 20:52:34 UTC (rev 12=
64)
+++ trunk/libmatroska/src/KaxCuesData.cpp	2007-01-14 17:20:35 UTC (rev 12=
65)
@@ -36,6 +36,8 @@
 #include "matroska/KaxContexts.h"
 #include "matroska/KaxBlock.h"
 #include "matroska/KaxBlockData.h"
+#include "matroska/KaxCluster.h"
+#include "matroska/KaxSegment.h"
=20
 START_LIBMATROSKA_NAMESPACE
=20
@@ -156,13 +158,21 @@
 			NewRefs.AddReference(BlockReference.Reference(i).RefBlock(), GlobalTi=
mecodeScale);
 		}
 	}
+
+	KaxCodecState *CodecState =3D static_cast<KaxCodecState *>(BlockReferen=
ce.FindFirstElt(KaxCodecState::ClassInfos));
+	if (CodecState !=3D NULL) {
+		KaxCueCodecState &CueCodecState =3D AddNewChild<KaxCueCodecState>(NewP=
ositions);
+		*static_cast<EbmlUInteger*>(&CueCodecState) =3D BlockReference.GetPare=
ntCluster()->GetParentSegment()->GetRelativePosition(CodecState->GetEleme=
ntPosition());
+	}
 #endif // MATROSKA_VERSION
=20
 	bValueIsSet =3D true;
 }
=20
-void KaxCuePoint::PositionSet(const KaxInternalBlock & BlockReference, u=
int64 GlobalTimecodeScale)
+void KaxCuePoint::PositionSet(const KaxBlockBlob & BlobReference, uint64=
 GlobalTimecodeScale)
 {
+	const KaxInternalBlock &BlockReference =3D BlobReference;
+
 	// fill me
 	KaxCueTime & NewTime =3D GetChild<KaxCueTime>(*this);
 	*static_cast<EbmlUInteger*>(&NewTime) =3D BlockReference.GlobalTimecode=
() / GlobalTimecodeScale;
@@ -186,6 +196,17 @@
 	}
 #endif // MATROSKA_VERSION
=20
+#if MATROSKA_VERSION >=3D 2
+	if (!BlobReference.IsSimpleBlock()) {
+		const KaxBlockGroup &BlockGroup =3D BlobReference;
+		const KaxCodecState *CodecState =3D static_cast<KaxCodecState *>(Block=
Group.FindFirstElt(KaxCodecState::ClassInfos));
+		if (CodecState !=3D NULL) {
+			KaxCueCodecState &CueCodecState =3D AddNewChild<KaxCueCodecState>(New=
Positions);
+			*static_cast<EbmlUInteger*>(&CueCodecState) =3D BlockGroup.GetParentC=
luster()->GetParentSegment()->GetRelativePosition(CodecState->GetElementP=
osition());
+		}
+	}
+#endif // MATROSKA_VERSION
+
 	bValueIsSet =3D true;
 }
=20