]> granicus.if.org Git - libmatroska/commitdiff
libmatroska: add the possibility for a DataBuffer class to use its own internal memory
authorSteve Lhomme <slhomme@matroska.org>
Mon, 5 Jul 2010 11:38:15 +0000 (11:38 +0000)
committerSteve Lhomme <slhomme@matroska.org>
Mon, 5 Jul 2010 11:38:15 +0000 (11:38 +0000)
git-svn-id: https://matroska.svn.sourceforge.net/svnroot/matroska/trunk/libmatroska@394 a6f86f6d-0131-4f8e-9e7b-e335508773d5

ChangeLog
matroska/KaxBlock.h

index f97273ad36034e7b77409f602dbdd9e11058f7a8..7e8dd90c4897d1eb9fd84b43819c52d6ed91061f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,7 @@ New 1.1.0 version:
     - give access to the SetParent to KaxSimpleBlock as well
     - change the placement of a MATROSKA_DLL_API so that it actually works
     - remove all references to the old/outdated/previous tag system
+    - add the possibility for a DataBuffer class to use its own internal memory
 
 2010-06-04 robux4/mosu
 New 1.0.0 version:
index a60a4f288412e36dcac48c7f824804144715046c..1ba47fb10bffaafacb5e7af810fe29011005a5ac 100644 (file)
@@ -58,24 +58,42 @@ class MATROSKA_DLL_API DataBuffer {
                uint32   mySize;
                bool     bValidValue;
                bool     (*myFreeBuffer)(const DataBuffer & aBuffer); // method to free the internal buffer
+               bool     bInternalBuffer;
 
        public:
-               DataBuffer(binary * aBuffer, uint32 aSize, bool (*aFreeBuffer)(const DataBuffer & aBuffer) = NULL)
-                       :myBuffer(aBuffer)
+               DataBuffer(binary * aBuffer, uint32 aSize, bool (*aFreeBuffer)(const DataBuffer & aBuffer) = NULL, bool _bInternalBuffer = false)
+                       :myBuffer(NULL)
                        ,mySize(aSize)
-                       ,bValidValue(true)      
-      ,myFreeBuffer(aFreeBuffer)
-               {}
+                       ,bValidValue(true)
+                       ,myFreeBuffer(aFreeBuffer)
+                       ,bInternalBuffer(_bInternalBuffer)
+               {
+                       if (bInternalBuffer)
+                       {
+                               myBuffer = new binary[mySize];
+                               if (myBuffer == NULL)
+                                       bValidValue = false;
+                               else
+                                       memcpy(myBuffer, aBuffer, mySize); 
+                       }
+                       else
+                               myBuffer = aBuffer;
+               }
+
                virtual ~DataBuffer() {}
-               virtual binary * Buffer() {return myBuffer;}
+               virtual binary * Buffer() {assert(bValidValue); return myBuffer;}
                virtual uint32   & Size() {return mySize;};
-               virtual const binary * Buffer() const {return myBuffer;}
+               virtual const binary * Buffer() const {assert(bValidValue); return myBuffer;}
                virtual const uint32   Size()   const {return mySize;};
                bool    FreeBuffer(const DataBuffer & aBuffer) {
                        bool bResult = true;
-                       if (myBuffer != NULL && myFreeBuffer != NULL && bValidValue) {
-                               bResult = myFreeBuffer(aBuffer);
+                       if (myBuffer != NULL && bValidValue) {
+                               if (myFreeBuffer != NULL)
+                                       bResult = myFreeBuffer(aBuffer);
+                               if (bInternalBuffer)
+                                       delete [] myBuffer;
                                myBuffer = NULL;
+                               mySize = 0;
                                bValidValue = false;
                        }
                        return bResult;