[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