[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);