From: Steve Lhomme Date: Fri, 10 Sep 2010 08:39:15 +0000 (+0000) Subject: fix a memory leak in KaxReferenceBlock when an internal KaxBlockBlob was created X-Git-Tag: release-1.1.0~6 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=697ce733589c44ac10dd46d46bfd28a075dea5cc;p=libmatroska fix a memory leak in KaxReferenceBlock when an internal KaxBlockBlob was created git-svn-id: https://matroska.svn.sourceforge.net/svnroot/matroska/trunk/libmatroska@546 a6f86f6d-0131-4f8e-9e7b-e335508773d5 --- diff --git a/ChangeLog b/ChangeLog index f7e1e5c..25cb46d 100644 --- 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: diff --git a/matroska/KaxBlockData.h b/matroska/KaxBlockData.h index f201e6f..1980479 100644 --- a/matroska/KaxBlockData.h +++ b/matroska/KaxBlockData.h @@ -1,103 +1,106 @@ -/**************************************************************************** -** libmatroska : parse Matroska files, see http://www.matroska.org/ -** -** -** -** 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 -*/ -#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: - /*! - \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(this) = refTimecode; bTimecodeSet = true;}; - bool bTimecodeSet; -}; - -#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 +/**************************************************************************** +** libmatroska : parse Matroska files, see http://www.matroska.org/ +** +** +** +** 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 +*/ +#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(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 diff --git a/src/KaxBlockData.cpp b/src/KaxBlockData.cpp index e690ebf..88cf9dc 100644 --- a/src/KaxBlockData.cpp +++ b/src/KaxBlockData.cpp @@ -1,118 +1,135 @@ -/**************************************************************************** -** libmatroska : parse Matroska files, see http://www.matroska.org/ -** -** -** -** 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 -*/ -#include - -#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) -{ -} - -filepos_t KaxReferenceBlock::UpdateSize(bool bSaveDefault, bool bForceRender) -{ - if (!bTimecodeSet) { - assert(RefdBlock != NULL); - assert(ParentBlock != NULL); - - const KaxInternalBlock &block = *RefdBlock; - *static_cast(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); - RefdBlock = aRefdBlock; - SetValueIsSet(); -} - -void KaxReferenceBlock::SetReferencedBlock(const KaxBlockGroup & aRefdBlock) -{ - KaxBlockBlob *block_blob = new KaxBlockBlob(BLOCK_BLOB_NO_SIMPLE); - block_blob->SetBlockGroup(*const_cast(&aRefdBlock)); - RefdBlock = block_blob; - SetValueIsSet(); -} - -END_LIBMATROSKA_NAMESPACE +/**************************************************************************** +** libmatroska : parse Matroska files, see http://www.matroska.org/ +** +** +** +** 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 +*/ +#include + +#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(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(&aRefdBlock)); + RefdBlock = block_blob; + bOurBlob = true; + SetValueIsSet(); +} + +END_LIBMATROSKA_NAMESPACE