]> granicus.if.org Git - libmatroska/commitdiff
fix a memory leak in KaxReferenceBlock when an internal KaxBlockBlob was created
authorSteve Lhomme <slhomme@matroska.org>
Fri, 10 Sep 2010 08:39:15 +0000 (08:39 +0000)
committerSteve Lhomme <slhomme@matroska.org>
Fri, 10 Sep 2010 08:39:15 +0000 (08:39 +0000)
git-svn-id: https://matroska.svn.sourceforge.net/svnroot/matroska/trunk/libmatroska@546 a6f86f6d-0131-4f8e-9e7b-e335508773d5

ChangeLog
matroska/KaxBlockData.h
src/KaxBlockData.cpp

index f7e1e5c02775fddb4d5df8cf454140e30459905e..25cb46d08caaf93a21e07ca989a65ca4a299ef0f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -6,6 +6,7 @@ New 1.1.0 version:
     - add the possibility for a DataBuffer class to use its own internal memory
     - KaxCues::AddBlockGroup() was removed as it's broken beyond repair
     - add KaxTrackOperation and related elements for combined stereo/3D tracks or joined virtual tracks
+    - fix a memory leak in KaxReferenceBlock when an internal KaxBlockBlob was created
 
 2010-06-04 robux4/mosu
 New 1.0.0 version:
index f201e6f6b31c6d17f02378e10598f19c2555e22a..1980479aaee289b1f4e19ebda0ff6ffa594103e7 100644 (file)
-/****************************************************************************\r
-** libmatroska : parse Matroska files, see http://www.matroska.org/\r
-**\r
-** <file/class description>\r
-**\r
-** Copyright (C) 2002-2010 Steve Lhomme.  All rights reserved.\r
-**\r
-** This library is free software; you can redistribute it and/or\r
-** modify it under the terms of the GNU Lesser General Public\r
-** License as published by the Free Software Foundation; either\r
-** version 2.1 of the License, or (at your option) any later version.\r
-** \r
-** This library is distributed in the hope that it will be useful,\r
-** but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
-** Lesser General Public License for more details.\r
-** \r
-** You should have received a copy of the GNU Lesser General Public\r
-** License along with this library; if not, write to the Free Software\r
-** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
-**\r
-** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.**\r
-** Contact license@matroska.org if any conditions of this licensing are\r
-** not clear to you.\r
-**\r
-**********************************************************************/\r
-\r
-/*!\r
-       \file\r
-       \version \$Id: KaxBlockData.h,v 1.10 2004/04/14 23:26:17 robux4 Exp $\r
-       \author Steve Lhomme     <robux4 @ users.sf.net>\r
-*/\r
-#ifndef LIBMATROSKA_BLOCK_ADDITIONAL_H\r
-#define LIBMATROSKA_BLOCK_ADDITIONAL_H\r
-\r
-#include "matroska/KaxTypes.h"\r
-#include "ebml/EbmlMaster.h"\r
-#include "ebml/EbmlUInteger.h"\r
-#include "ebml/EbmlSInteger.h"\r
-#include "matroska/KaxDefines.h"\r
-\r
-using namespace LIBEBML_NAMESPACE;\r
-\r
-START_LIBMATROSKA_NAMESPACE\r
-\r
-class KaxReferenceBlock;\r
-class KaxBlockGroup;\r
-class KaxBlockBlob;\r
-\r
-DECLARE_MKX_UINTEGER(KaxReferencePriority)\r
-};\r
-\r
-/*!\r
-       \brief element used for B frame-likes\r
-*/\r
-DECLARE_MKX_SINTEGER_CONS(KaxReferenceBlock)\r
-       public:\r
-               /*!\r
-                       \brief override this method to compute the timecode value\r
-               */\r
-               virtual filepos_t UpdateSize(bool bSaveDefault = false, bool bForceRender = false);\r
-\r
-               const KaxBlockBlob & RefBlock() const;\r
-               void SetReferencedBlock(const KaxBlockBlob * aRefdBlock);\r
-               void SetReferencedBlock(const KaxBlockGroup & aRefdBlock);\r
-               void SetParentBlock(const KaxBlockGroup & aParentBlock) {ParentBlock = &aParentBlock;}\r
-               \r
-       protected:\r
-               const KaxBlockBlob * RefdBlock;\r
-               const KaxBlockGroup * ParentBlock;\r
-               void SetReferencedTimecode(int64 refTimecode) {*static_cast<EbmlSInteger*>(this) = refTimecode; bTimecodeSet = true;};\r
-               bool bTimecodeSet;\r
-};\r
-\r
-#if MATROSKA_VERSION >= 2\r
-DECLARE_MKX_SINTEGER(KaxReferenceVirtual)\r
-};\r
-#endif // MATROSKA_VERSION\r
-\r
-DECLARE_MKX_MASTER(KaxTimeSlice)\r
-};\r
-\r
-DECLARE_MKX_MASTER(KaxSlices)\r
-};\r
-\r
-DECLARE_MKX_UINTEGER(KaxSliceLaceNumber)\r
-};\r
-\r
-DECLARE_MKX_UINTEGER(KaxSliceFrameNumber)\r
-};\r
-\r
-DECLARE_MKX_UINTEGER(KaxSliceBlockAddID)\r
-};\r
-\r
-DECLARE_MKX_UINTEGER(KaxSliceDelay)\r
-};\r
-\r
-DECLARE_MKX_UINTEGER(KaxSliceDuration)\r
-};\r
-\r
-END_LIBMATROSKA_NAMESPACE\r
-\r
-#endif // LIBMATROSKA_BLOCK_ADDITIONAL_H\r
+/****************************************************************************
+** libmatroska : parse Matroska files, see http://www.matroska.org/
+**
+** <file/class description>
+**
+** Copyright (C) 2002-2010 Steve Lhomme.  All rights reserved.
+**
+** This library is free software; you can redistribute it and/or
+** modify it under the terms of the GNU Lesser General Public
+** License as published by the Free Software Foundation; either
+** version 2.1 of the License, or (at your option) any later version.
+** 
+** This library is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public
+** License along with this library; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+**
+** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.**
+** Contact license@matroska.org if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+/*!
+       \file
+       \version \$Id: KaxBlockData.h,v 1.10 2004/04/14 23:26:17 robux4 Exp $
+       \author Steve Lhomme     <robux4 @ users.sf.net>
+*/
+#ifndef LIBMATROSKA_BLOCK_ADDITIONAL_H
+#define LIBMATROSKA_BLOCK_ADDITIONAL_H
+
+#include "matroska/KaxTypes.h"
+#include "ebml/EbmlMaster.h"
+#include "ebml/EbmlUInteger.h"
+#include "ebml/EbmlSInteger.h"
+#include "matroska/KaxDefines.h"
+
+using namespace LIBEBML_NAMESPACE;
+
+START_LIBMATROSKA_NAMESPACE
+
+class KaxReferenceBlock;
+class KaxBlockGroup;
+class KaxBlockBlob;
+
+DECLARE_MKX_UINTEGER(KaxReferencePriority)
+};
+
+/*!
+       \brief element used for B frame-likes
+*/
+DECLARE_MKX_SINTEGER_CONS(KaxReferenceBlock)
+       public:
+        ~KaxReferenceBlock();
+               /*!
+                       \brief override this method to compute the timecode value
+               */
+               virtual filepos_t UpdateSize(bool bSaveDefault = false, bool bForceRender = false);
+
+               const KaxBlockBlob & RefBlock() const;
+               void SetReferencedBlock(const KaxBlockBlob * aRefdBlock);
+               void SetReferencedBlock(const KaxBlockGroup & aRefdBlock);
+               void SetParentBlock(const KaxBlockGroup & aParentBlock) {ParentBlock = &aParentBlock;}
+               
+       protected:
+               const KaxBlockBlob * RefdBlock;
+               const KaxBlockGroup * ParentBlock;
+               void SetReferencedTimecode(int64 refTimecode) {*static_cast<EbmlSInteger*>(this) = refTimecode; bTimecodeSet = true;};
+               bool bTimecodeSet;
+        bool bOurBlob;
+        void FreeBlob();
+};
+
+#if MATROSKA_VERSION >= 2
+DECLARE_MKX_SINTEGER(KaxReferenceVirtual)
+};
+#endif // MATROSKA_VERSION
+
+DECLARE_MKX_MASTER(KaxTimeSlice)
+};
+
+DECLARE_MKX_MASTER(KaxSlices)
+};
+
+DECLARE_MKX_UINTEGER(KaxSliceLaceNumber)
+};
+
+DECLARE_MKX_UINTEGER(KaxSliceFrameNumber)
+};
+
+DECLARE_MKX_UINTEGER(KaxSliceBlockAddID)
+};
+
+DECLARE_MKX_UINTEGER(KaxSliceDelay)
+};
+
+DECLARE_MKX_UINTEGER(KaxSliceDuration)
+};
+
+END_LIBMATROSKA_NAMESPACE
+
+#endif // LIBMATROSKA_BLOCK_ADDITIONAL_H
index e690ebffbf388aa55e997dda0fde936fc8d6c59a..88cf9dcd99d9d385eb3273ec6b1c6c599e7b958d 100644 (file)
-/****************************************************************************\r
-** libmatroska : parse Matroska files, see http://www.matroska.org/\r
-**\r
-** <file/class description>\r
-**\r
-** Copyright (C) 2002-2010 Steve Lhomme.  All rights reserved.\r
-**\r
-** This library is free software; you can redistribute it and/or\r
-** modify it under the terms of the GNU Lesser General Public\r
-** License as published by the Free Software Foundation; either\r
-** version 2.1 of the License, or (at your option) any later version.\r
-** \r
-** This library is distributed in the hope that it will be useful,\r
-** but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
-** Lesser General Public License for more details.\r
-** \r
-** You should have received a copy of the GNU Lesser General Public\r
-** License along with this library; if not, write to the Free Software\r
-** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
-**\r
-** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.**\r
-** Contact license@matroska.org if any conditions of this licensing are\r
-** not clear to you.\r
-**\r
-**********************************************************************/\r
-\r
-/*!\r
-       \file\r
-       \version \$Id: KaxBlockData.cpp 1226 2005-10-13 21:16:43Z robux4 $\r
-       \author Steve Lhomme     <robux4 @ users.sf.net>\r
-*/\r
-#include <cassert>\r
-\r
-#include "matroska/KaxBlockData.h"\r
-#include "matroska/KaxContexts.h"\r
-#include "matroska/KaxBlock.h"\r
-#include "matroska/KaxDefines.h"\r
-\r
-using namespace LIBEBML_NAMESPACE;\r
-\r
-START_LIBMATROSKA_NAMESPACE\r
-\r
-DEFINE_START_SEMANTIC(KaxSlices)\r
-DEFINE_SEMANTIC_ITEM(false, false, KaxTimeSlice)\r
-DEFINE_END_SEMANTIC(KaxSlices)\r
-\r
-DEFINE_START_SEMANTIC(KaxTimeSlice)\r
-DEFINE_SEMANTIC_ITEM(false, true, KaxSliceLaceNumber)\r
-DEFINE_SEMANTIC_ITEM(false, true, KaxSliceFrameNumber)\r
-DEFINE_SEMANTIC_ITEM(false, true, KaxSliceBlockAddID)\r
-DEFINE_SEMANTIC_ITEM(false, true, KaxSliceDelay)\r
-DEFINE_SEMANTIC_ITEM(false, true, KaxSliceDuration)\r
-DEFINE_END_SEMANTIC(KaxTimeSlice)\r
-\r
-DEFINE_MKX_UINTEGER_DEF (KaxReferencePriority, 0xFA, 1, KaxBlockGroup, "FlagReferenced", 0);\r
-DEFINE_MKX_SINTEGER_CONS(KaxReferenceBlock,    0xFB, 1, KaxBlockGroup, "ReferenceBlock");\r
-DEFINE_MKX_MASTER       (KaxSlices,            0x8E, 1, KaxBlockGroup, "Slices");\r
-DEFINE_MKX_MASTER       (KaxTimeSlice,         0xE8, 1, KaxSlices, "TimeSlice");\r
-DEFINE_MKX_UINTEGER_DEF (KaxSliceLaceNumber,   0xCC, 1, KaxTimeSlice, "SliceLaceNumber", 0);\r
-DEFINE_MKX_UINTEGER_DEF (KaxSliceFrameNumber,  0xCD, 1, KaxTimeSlice, "SliceFrameNumber", 0);\r
-DEFINE_MKX_UINTEGER_DEF (KaxSliceBlockAddID,   0xCB, 1, KaxTimeSlice, "SliceBlockAddID", 0);\r
-DEFINE_MKX_UINTEGER     (KaxSliceDelay,        0xCE, 1, KaxTimeSlice, "SliceDelay");\r
-DEFINE_MKX_UINTEGER_DEF (KaxSliceDuration,     0xCF, 1, KaxTimeSlice, "SliceDuration", 0);\r
-#if MATROSKA_VERSION >= 2\r
-DEFINE_MKX_SINTEGER     (KaxReferenceVirtual,  0xFD, 1, KaxBlockGroup, "ReferenceVirtual");\r
-#endif\r
-\r
-\r
-const KaxBlockBlob & KaxReferenceBlock::RefBlock() const\r
-{\r
-       assert(RefdBlock != NULL);\r
-       return *RefdBlock;\r
-}\r
-\r
-KaxReferenceBlock::KaxReferenceBlock(EBML_EXTRA_DEF)\r
-:EBML_DEF_SINTEGER(KaxReferenceBlock)EBML_DEF_SEP\r
-RefdBlock(NULL)\r
-,ParentBlock(NULL)\r
-{\r
-    bTimecodeSet = false;\r
-}\r
-\r
-KaxReferenceBlock::KaxReferenceBlock(const KaxReferenceBlock & ElementToClone)\r
-:EbmlSInteger(ElementToClone)\r
-,bTimecodeSet(ElementToClone.bTimecodeSet)\r
-{\r
-}\r
-\r
-filepos_t KaxReferenceBlock::UpdateSize(bool bSaveDefault, bool bForceRender)\r
-{\r
-       if (!bTimecodeSet) {\r
-               assert(RefdBlock != NULL);\r
-               assert(ParentBlock != NULL);\r
-\r
-               const KaxInternalBlock &block = *RefdBlock;\r
-               *static_cast<EbmlSInteger*>(this) = (int64(block.GlobalTimecode()) - int64(ParentBlock->GlobalTimecode())) / int64(ParentBlock->GlobalTimecodeScale());\r
-       }\r
-       return EbmlSInteger::UpdateSize(bSaveDefault, bForceRender);\r
-}\r
-\r
-void KaxReferenceBlock::SetReferencedBlock(const KaxBlockBlob * aRefdBlock)\r
-{\r
-       assert(RefdBlock == NULL);\r
-       assert(aRefdBlock != NULL);\r
-       RefdBlock = aRefdBlock; \r
-       SetValueIsSet();\r
-}\r
-\r
-void KaxReferenceBlock::SetReferencedBlock(const KaxBlockGroup & aRefdBlock)\r
-{\r
-       KaxBlockBlob *block_blob = new KaxBlockBlob(BLOCK_BLOB_NO_SIMPLE);\r
-       block_blob->SetBlockGroup(*const_cast<KaxBlockGroup*>(&aRefdBlock));\r
-       RefdBlock = block_blob; \r
-       SetValueIsSet();\r
-}\r
-\r
-END_LIBMATROSKA_NAMESPACE\r
+/****************************************************************************
+** libmatroska : parse Matroska files, see http://www.matroska.org/
+**
+** <file/class description>
+**
+** Copyright (C) 2002-2010 Steve Lhomme.  All rights reserved.
+**
+** This library is free software; you can redistribute it and/or
+** modify it under the terms of the GNU Lesser General Public
+** License as published by the Free Software Foundation; either
+** version 2.1 of the License, or (at your option) any later version.
+** 
+** This library is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+** Lesser General Public License for more details.
+** 
+** You should have received a copy of the GNU Lesser General Public
+** License along with this library; if not, write to the Free Software
+** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+**
+** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.**
+** Contact license@matroska.org if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+/*!
+       \file
+       \version \$Id: KaxBlockData.cpp 1226 2005-10-13 21:16:43Z robux4 $
+       \author Steve Lhomme     <robux4 @ users.sf.net>
+*/
+#include <cassert>
+
+#include "matroska/KaxBlockData.h"
+#include "matroska/KaxContexts.h"
+#include "matroska/KaxBlock.h"
+#include "matroska/KaxDefines.h"
+
+using namespace LIBEBML_NAMESPACE;
+
+START_LIBMATROSKA_NAMESPACE
+
+DEFINE_START_SEMANTIC(KaxSlices)
+DEFINE_SEMANTIC_ITEM(false, false, KaxTimeSlice)
+DEFINE_END_SEMANTIC(KaxSlices)
+
+DEFINE_START_SEMANTIC(KaxTimeSlice)
+DEFINE_SEMANTIC_ITEM(false, true, KaxSliceLaceNumber)
+DEFINE_SEMANTIC_ITEM(false, true, KaxSliceFrameNumber)
+DEFINE_SEMANTIC_ITEM(false, true, KaxSliceBlockAddID)
+DEFINE_SEMANTIC_ITEM(false, true, KaxSliceDelay)
+DEFINE_SEMANTIC_ITEM(false, true, KaxSliceDuration)
+DEFINE_END_SEMANTIC(KaxTimeSlice)
+
+DEFINE_MKX_UINTEGER_DEF (KaxReferencePriority, 0xFA, 1, KaxBlockGroup, "FlagReferenced", 0);
+DEFINE_MKX_SINTEGER_CONS(KaxReferenceBlock,    0xFB, 1, KaxBlockGroup, "ReferenceBlock");
+DEFINE_MKX_MASTER       (KaxSlices,            0x8E, 1, KaxBlockGroup, "Slices");
+DEFINE_MKX_MASTER       (KaxTimeSlice,         0xE8, 1, KaxSlices, "TimeSlice");
+DEFINE_MKX_UINTEGER_DEF (KaxSliceLaceNumber,   0xCC, 1, KaxTimeSlice, "SliceLaceNumber", 0);
+DEFINE_MKX_UINTEGER_DEF (KaxSliceFrameNumber,  0xCD, 1, KaxTimeSlice, "SliceFrameNumber", 0);
+DEFINE_MKX_UINTEGER_DEF (KaxSliceBlockAddID,   0xCB, 1, KaxTimeSlice, "SliceBlockAddID", 0);
+DEFINE_MKX_UINTEGER     (KaxSliceDelay,        0xCE, 1, KaxTimeSlice, "SliceDelay");
+DEFINE_MKX_UINTEGER_DEF (KaxSliceDuration,     0xCF, 1, KaxTimeSlice, "SliceDuration", 0);
+#if MATROSKA_VERSION >= 2
+DEFINE_MKX_SINTEGER     (KaxReferenceVirtual,  0xFD, 1, KaxBlockGroup, "ReferenceVirtual");
+#endif
+
+
+const KaxBlockBlob & KaxReferenceBlock::RefBlock() const
+{
+       assert(RefdBlock != NULL);
+       return *RefdBlock;
+}
+
+KaxReferenceBlock::KaxReferenceBlock(EBML_EXTRA_DEF)
+:EBML_DEF_SINTEGER(KaxReferenceBlock)EBML_DEF_SEP
+RefdBlock(NULL)
+,ParentBlock(NULL)
+{
+    bTimecodeSet = false;
+}
+
+KaxReferenceBlock::KaxReferenceBlock(const KaxReferenceBlock & ElementToClone)
+:EbmlSInteger(ElementToClone)
+,bTimecodeSet(ElementToClone.bTimecodeSet)
+,bOurBlob(false)
+{
+}
+
+KaxReferenceBlock::~KaxReferenceBlock()
+{
+    FreeBlob();
+}
+
+void KaxReferenceBlock::FreeBlob()
+{
+    if (bOurBlob && RefdBlock!=NULL)
+        delete RefdBlock;
+    RefdBlock = NULL;
+}
+
+filepos_t KaxReferenceBlock::UpdateSize(bool bSaveDefault, bool bForceRender)
+{
+       if (!bTimecodeSet) {
+               assert(RefdBlock != NULL);
+               assert(ParentBlock != NULL);
+
+               const KaxInternalBlock &block = *RefdBlock;
+               *static_cast<EbmlSInteger*>(this) = (int64(block.GlobalTimecode()) - int64(ParentBlock->GlobalTimecode())) / int64(ParentBlock->GlobalTimecodeScale());
+       }
+       return EbmlSInteger::UpdateSize(bSaveDefault, bForceRender);
+}
+
+void KaxReferenceBlock::SetReferencedBlock(const KaxBlockBlob * aRefdBlock)
+{
+       assert(RefdBlock == NULL);
+       assert(aRefdBlock != NULL);
+    FreeBlob();
+       RefdBlock = aRefdBlock; 
+    bOurBlob = true;
+       SetValueIsSet();
+}
+
+void KaxReferenceBlock::SetReferencedBlock(const KaxBlockGroup & aRefdBlock)
+{
+    FreeBlob();
+       KaxBlockBlob *block_blob = new KaxBlockBlob(BLOCK_BLOB_NO_SIMPLE);
+       block_blob->SetBlockGroup(*const_cast<KaxBlockGroup*>(&aRefdBlock));
+       RefdBlock = block_blob;
+    bOurBlob = true;
+       SetValueIsSet();
+}
+
+END_LIBMATROSKA_NAMESPACE