[matroska] r1232 - in trunk: libebml/ebml libebml/src libmatroska/src

[email protected] Sat, 15 Oct 2005 19:56:57 +0400 (MSD)
Newsgroups gmane.comp.multimedia.matroska.cvs
Message-ID <[email protected]>
Author: robux4
Date: 2005-10-15 19:56:52 +0400 (Sat, 15 Oct 2005)
New Revision: 1232

Modified:
   trunk/libebml/ebml/EbmlElement.h
   trunk/libebml/ebml/EbmlMaster.h
   trunk/libebml/src/EbmlElement.cpp
   trunk/libebml/src/EbmlVoid.cpp
   trunk/libmatroska/src/KaxBlock.cpp
Log:
libebml/libmatroska: fix a major bug when "unknown size" was used (Haali does)

Modified: trunk/libebml/ebml/EbmlElement.h
===================================================================
--- trunk/libebml/ebml/EbmlElement.h	2005-10-15 12:34:47 UTC (rev 1231)
+++ trunk/libebml/ebml/EbmlElement.h	2005-10-15 15:56:52 UTC (rev 1232)
@@ -45,7 +45,7 @@
 /*!
 	\brief The size of the EBML-coded length
 */
-int EBML_DLL_API CodedSizeLength(uint64 Length, unsigned int SizeLength);
+int EBML_DLL_API CodedSizeLength(uint64 Length, unsigned int SizeLength, bool bSizeIsFinite = true);
 
 /*!
 	\brief The coded value of the EBML-coded length
@@ -180,7 +180,9 @@
 
 		virtual bool ValidateSize() const = 0;
 
-		uint64 GetElementPosition() const {return ElementPosition;}
+		uint64 GetElementPosition() const {
+			return ElementPosition;
+		}
 
 		uint64 ElementSize(bool bKeepIntact = false) const; /// return the size of the header+data, before writing
 		
@@ -210,7 +212,9 @@
 		virtual bool IsDummy() const {return false;}
 		virtual bool IsMaster() const {return false;}
 
-		uint8 HeadSize() const {return EbmlId(*this).Length + CodedSizeLength(Size, SizeLength);} /// return the size of the head, on reading/writing
+		uint8 HeadSize() const {
+			return EbmlId(*this).Length + CodedSizeLength(Size, SizeLength, bSizeIsFinite);
+		} /// return the size of the head, on reading/writing
 		
 		/*!
 			\brief Force the size of an element
@@ -237,7 +241,7 @@
 		bool ValueIsSet() const {return bValueIsSet;}
 
 		inline uint64 GetEndPosition() const {
-			return SizePosition + CodedSizeLength(Size, SizeLength) + Size;
+			return SizePosition + CodedSizeLength(Size, SizeLength, bSizeIsFinite) + Size;
 		}
 		
 	protected:

Modified: trunk/libebml/ebml/EbmlMaster.h
===================================================================
--- trunk/libebml/ebml/EbmlMaster.h	2005-10-15 12:34:47 UTC (rev 1231)
+++ trunk/libebml/ebml/EbmlMaster.h	2005-10-15 15:56:52 UTC (rev 1232)
@@ -79,7 +79,7 @@
 		}
 		
 		uint64 GetDataStart() const {
-			return ElementPosition + EbmlId(*this).Length + CodedSizeLength(Size, SizeLength);
+			return ElementPosition + EbmlId(*this).Length + CodedSizeLength(Size, SizeLength, bSizeIsFinite);
 		}
 
 		/*!

Modified: trunk/libebml/src/EbmlElement.cpp
===================================================================
--- trunk/libebml/src/EbmlElement.cpp	2005-10-15 12:34:47 UTC (rev 1231)
+++ trunk/libebml/src/EbmlElement.cpp	2005-10-15 15:56:52 UTC (rev 1232)
@@ -46,20 +46,32 @@
 /*!
 	\todo handle more than CodedSize of 5
 */
-int CodedSizeLength(uint64 Length, unsigned int SizeLength)
+int CodedSizeLength(uint64 Length, unsigned int SizeLength, bool bSizeFinite)
 {
-	unsigned int CodedSize;
-	// prepare the head of the size (000...01xxxxxx)
-	// optimal size
-	if (Length < 127) // 2^7 - 1
-		CodedSize = 1;
-	else if (Length < 16383) // 2^14 - 1
-		CodedSize = 2;
-	else if (Length < 2097151L) // 2^21 - 1
-		CodedSize = 3;
-	else if (Length < 268435455L) // 2^28 - 1
-		CodedSize = 4;
-	else CodedSize = 5;
+	int CodedSize;
+	if (bSizeFinite) {
+		// prepare the head of the size (000...01xxxxxx)
+		// optimal size
+		if (Length < 127) // 2^7 - 1
+			CodedSize = 1;
+		else if (Length < 16383) // 2^14 - 1
+			CodedSize = 2;
+		else if (Length < 2097151L) // 2^21 - 1
+			CodedSize = 3;
+		else if (Length < 268435455L) // 2^28 - 1
+			CodedSize = 4;
+		else CodedSize = 5;
+	} else {
+		if (Length <= 127) // 2^7 - 1
+			CodedSize = 1;
+		else if (Length <= 16383) // 2^14 - 1
+			CodedSize = 2;
+		else if (Length <= 2097151L) // 2^21 - 1
+			CodedSize = 3;
+		else if (Length <= 268435455L) // 2^28 - 1
+			CodedSize = 4;
+		else CodedSize = 5;
+	}
 
 	if (SizeLength > 0 && CodedSize < SizeLength) {
 		// defined size
@@ -432,7 +444,7 @@
 	if (bSizeIsFinite) {
 		assert(TestReadElt == NULL);
 		assert(ElementPosition < SizePosition);
-		DataStream.I_O().setFilePointer(SizePosition + CodedSizeLength(Size, SizeLength) + Size, seek_beginning);
+		DataStream.I_O().setFilePointer(SizePosition + CodedSizeLength(Size, SizeLength, bSizeIsFinite) + Size, seek_beginning);
 //		DataStream.I_O().setFilePointer(Size, seek_current);
 	} else {
 		/////////////////////////////////////////////////
@@ -583,7 +595,7 @@
 	FinalHeadSize = EbmlId(*this).Length;
 	EbmlId(*this).Fill(FinalHead);
 
-	int CodedSize = CodedSizeLength(Size, SizeLength);
+	int CodedSize = CodedSizeLength(Size, SizeLength, bSizeIsFinite);
 	CodedValueLength(Size, CodedSize, &FinalHead[FinalHeadSize]);
 	FinalHeadSize += CodedSize;
 	
@@ -600,7 +612,7 @@
 {
 	if (!bKeepIntact && IsDefaultValue())
 		return 0; // won't be saved
-	return Size + EbmlId(*this).Length + CodedSizeLength(Size, SizeLength);
+	return Size + EbmlId(*this).Length + CodedSizeLength(Size, SizeLength, bSizeIsFinite);
 }
 
 bool EbmlElement::CompareElements(const EbmlElement *A, const EbmlElement *B)
@@ -622,12 +634,12 @@
 		return false;
 	}
 
-	int OldSizeLen = CodedSizeLength(Size, SizeLength);
+	int OldSizeLen = CodedSizeLength(Size, SizeLength, bSizeIsFinite);
 	uint64 OldSize = Size;
 
 	Size = NewSize;
 
-	if (CodedSizeLength(Size, SizeLength) == OldSizeLen) {
+	if (CodedSizeLength(Size, SizeLength, bSizeIsFinite) == OldSizeLen) {
 		bSizeIsFinite = true;
 		return true;
 	}

Modified: trunk/libebml/src/EbmlVoid.cpp
===================================================================
--- trunk/libebml/src/EbmlVoid.cpp	2005-10-15 12:34:47 UTC (rev 1231)
+++ trunk/libebml/src/EbmlVoid.cpp	2005-10-15 15:56:52 UTC (rev 1232)
@@ -83,10 +83,10 @@
 	  EbmlVoid aTmp;
 	  aTmp.SetSize(HeadSize() + Size - EltToReplaceWith.GetSize() - EltToReplaceWith.HeadSize() - 1); // 1 is the length of the Void ID
 	  int HeadBefore = aTmp.HeadSize();
-	  aTmp.SetSize(aTmp.GetSize() - CodedSizeLength(aTmp.Size, aTmp.SizeLength));
+	  aTmp.SetSize(aTmp.GetSize() - CodedSizeLength(aTmp.Size, aTmp.SizeLength, aTmp.bSizeIsFinite));
 	  int HeadAfter = aTmp.HeadSize();
 	  if (HeadBefore != HeadAfter) {
-	    aTmp.SetSizeLength(CodedSizeLength(aTmp.Size, aTmp.SizeLength) - (HeadAfter - HeadBefore));
+		  aTmp.SetSizeLength(CodedSizeLength(aTmp.Size, aTmp.SizeLength, aTmp.bSizeIsFinite) - (HeadAfter - HeadBefore));
 	  }
 	  aTmp.RenderHead(output, false, bKeepIntact); // the rest of the data is not rewritten
 	}
@@ -116,13 +116,13 @@
 
 	// compute the size of the voided data based on the original one
 	Size = EltToVoid.GetSize() + EltToVoid.HeadSize() - 1; // 1 for the ID
-	Size -= CodedSizeLength(Size, SizeLength);
+	Size -= CodedSizeLength(Size, SizeLength, bSizeIsFinite);
 	// make sure we handle even the strange cases
 	//uint32 A1 = Size + HeadSize();
 	//uint32 A2 = EltToVoid.GetSize() + EltToVoid.HeadSize();
 	if (Size + HeadSize() != EltToVoid.GetSize() + EltToVoid.HeadSize()) {
 		Size--;
-		SetSizeLength(CodedSizeLength(Size, SizeLength) + 1);
+		SetSizeLength(CodedSizeLength(Size, SizeLength, bSizeIsFinite) + 1);
 	}
 
 	if (Size != 0) {

Modified: trunk/libmatroska/src/KaxBlock.cpp
===================================================================
--- trunk/libmatroska/src/KaxBlock.cpp	2005-10-15 12:34:47 UTC (rev 1231)
+++ trunk/libmatroska/src/KaxBlock.cpp	2005-10-15 15:56:52 UTC (rev 1232)
@@ -221,7 +221,7 @@
 			SameSize = false;
 		XiphLacingSize += myBuffers[i]->Size() / 255 + 1;
 	}
-	EbmlLacingSize += CodedSizeLength(myBuffers[0]->Size(), 0);
+	EbmlLacingSize += CodedSizeLength(myBuffers[0]->Size(), 0, bSizeIsFinite);
 	for (i = 1; i < (int)myBuffers.size() - 1; i++)
 		EbmlLacingSize += CodedSizeLengthSigned(int64(myBuffers[i]->Size()) - int64(myBuffers[i - 1]->Size()), 0);
 	if (SameSize)
@@ -261,7 +261,7 @@
 				}
 				break;
 			case LACING_EBML:
-				Size += myBuffers[0]->Size() + CodedSizeLength(myBuffers[0]->Size(), 0);
+				Size += myBuffers[0]->Size() + CodedSizeLength(myBuffers[0]->Size(), 0, bSizeIsFinite);
 				for (i=1; i<myBuffers.size()-1; i++) {
 					Size += myBuffers[i]->Size() 
 						+ CodedSizeLengthSigned(int64(myBuffers[i]->Size()) - int64(myBuffers[i-1]->Size()), 0);;
@@ -429,7 +429,7 @@
 
 				_Size = myBuffers[0]->Size();
 
-				_CodedSize = CodedSizeLength(_Size, 0);
+				_CodedSize = CodedSizeLength(_Size, 0, bSizeIsFinite);
 
 				// first size in the lace is not a signed
 				CodedValueLength(_Size, _CodedSize, _FinalHead);