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
This commit is contained in:
Steve Lhomme 2010-09-10 08:39:15 +00:00
parent f1349f9639
commit 697ce73358
3 changed files with 242 additions and 221 deletions

View File

@ -6,6 +6,7 @@ New 1.1.0 version:
- add the possibility for a DataBuffer class to use its own internal memory - add the possibility for a DataBuffer class to use its own internal memory
- KaxCues::AddBlockGroup() was removed as it's broken beyond repair - KaxCues::AddBlockGroup() was removed as it's broken beyond repair
- add KaxTrackOperation and related elements for combined stereo/3D tracks or joined virtual tracks - 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 2010-06-04 robux4/mosu
New 1.0.0 version: New 1.0.0 version:

View File

@ -1,103 +1,106 @@
/**************************************************************************** /****************************************************************************
** libmatroska : parse Matroska files, see http://www.matroska.org/ ** libmatroska : parse Matroska files, see http://www.matroska.org/
** **
** <file/class description> ** <file/class description>
** **
** Copyright (C) 2002-2010 Steve Lhomme. All rights reserved. ** Copyright (C) 2002-2010 Steve Lhomme. All rights reserved.
** **
** This library is free software; you can redistribute it and/or ** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public ** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either ** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version. ** 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, ** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of ** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details. ** Lesser General Public License for more details.
** **
** You should have received a copy of the GNU Lesser General Public ** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software ** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
** **
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.** ** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.**
** Contact license@matroska.org if any conditions of this licensing are ** Contact license@matroska.org if any conditions of this licensing are
** not clear to you. ** not clear to you.
** **
**********************************************************************/ **********************************************************************/
/*! /*!
\file \file
\version \$Id: KaxBlockData.h,v 1.10 2004/04/14 23:26:17 robux4 Exp $ \version \$Id: KaxBlockData.h,v 1.10 2004/04/14 23:26:17 robux4 Exp $
\author Steve Lhomme <robux4 @ users.sf.net> \author Steve Lhomme <robux4 @ users.sf.net>
*/ */
#ifndef LIBMATROSKA_BLOCK_ADDITIONAL_H #ifndef LIBMATROSKA_BLOCK_ADDITIONAL_H
#define LIBMATROSKA_BLOCK_ADDITIONAL_H #define LIBMATROSKA_BLOCK_ADDITIONAL_H
#include "matroska/KaxTypes.h" #include "matroska/KaxTypes.h"
#include "ebml/EbmlMaster.h" #include "ebml/EbmlMaster.h"
#include "ebml/EbmlUInteger.h" #include "ebml/EbmlUInteger.h"
#include "ebml/EbmlSInteger.h" #include "ebml/EbmlSInteger.h"
#include "matroska/KaxDefines.h" #include "matroska/KaxDefines.h"
using namespace LIBEBML_NAMESPACE; using namespace LIBEBML_NAMESPACE;
START_LIBMATROSKA_NAMESPACE START_LIBMATROSKA_NAMESPACE
class KaxReferenceBlock; class KaxReferenceBlock;
class KaxBlockGroup; class KaxBlockGroup;
class KaxBlockBlob; class KaxBlockBlob;
DECLARE_MKX_UINTEGER(KaxReferencePriority) DECLARE_MKX_UINTEGER(KaxReferencePriority)
}; };
/*! /*!
\brief element used for B frame-likes \brief element used for B frame-likes
*/ */
DECLARE_MKX_SINTEGER_CONS(KaxReferenceBlock) DECLARE_MKX_SINTEGER_CONS(KaxReferenceBlock)
public: public:
/*! ~KaxReferenceBlock();
\brief override this method to compute the timecode value /*!
*/ \brief override this method to compute the timecode value
virtual filepos_t UpdateSize(bool bSaveDefault = false, bool bForceRender = false); */
virtual filepos_t UpdateSize(bool bSaveDefault = false, bool bForceRender = false);
const KaxBlockBlob & RefBlock() const;
void SetReferencedBlock(const KaxBlockBlob * aRefdBlock); const KaxBlockBlob & RefBlock() const;
void SetReferencedBlock(const KaxBlockGroup & aRefdBlock); void SetReferencedBlock(const KaxBlockBlob * aRefdBlock);
void SetParentBlock(const KaxBlockGroup & aParentBlock) {ParentBlock = &aParentBlock;} void SetReferencedBlock(const KaxBlockGroup & aRefdBlock);
void SetParentBlock(const KaxBlockGroup & aParentBlock) {ParentBlock = &aParentBlock;}
protected:
const KaxBlockBlob * RefdBlock; protected:
const KaxBlockGroup * ParentBlock; const KaxBlockBlob * RefdBlock;
void SetReferencedTimecode(int64 refTimecode) {*static_cast<EbmlSInteger*>(this) = refTimecode; bTimecodeSet = true;}; const KaxBlockGroup * ParentBlock;
bool bTimecodeSet; void SetReferencedTimecode(int64 refTimecode) {*static_cast<EbmlSInteger*>(this) = refTimecode; bTimecodeSet = true;};
}; bool bTimecodeSet;
bool bOurBlob;
#if MATROSKA_VERSION >= 2 void FreeBlob();
DECLARE_MKX_SINTEGER(KaxReferenceVirtual) };
};
#endif // MATROSKA_VERSION #if MATROSKA_VERSION >= 2
DECLARE_MKX_SINTEGER(KaxReferenceVirtual)
DECLARE_MKX_MASTER(KaxTimeSlice) };
}; #endif // MATROSKA_VERSION
DECLARE_MKX_MASTER(KaxSlices) DECLARE_MKX_MASTER(KaxTimeSlice)
}; };
DECLARE_MKX_UINTEGER(KaxSliceLaceNumber) DECLARE_MKX_MASTER(KaxSlices)
}; };
DECLARE_MKX_UINTEGER(KaxSliceFrameNumber) DECLARE_MKX_UINTEGER(KaxSliceLaceNumber)
}; };
DECLARE_MKX_UINTEGER(KaxSliceBlockAddID) DECLARE_MKX_UINTEGER(KaxSliceFrameNumber)
}; };
DECLARE_MKX_UINTEGER(KaxSliceDelay) DECLARE_MKX_UINTEGER(KaxSliceBlockAddID)
}; };
DECLARE_MKX_UINTEGER(KaxSliceDuration) DECLARE_MKX_UINTEGER(KaxSliceDelay)
}; };
END_LIBMATROSKA_NAMESPACE DECLARE_MKX_UINTEGER(KaxSliceDuration)
};
#endif // LIBMATROSKA_BLOCK_ADDITIONAL_H
END_LIBMATROSKA_NAMESPACE
#endif // LIBMATROSKA_BLOCK_ADDITIONAL_H

View File

@ -1,118 +1,135 @@
/**************************************************************************** /****************************************************************************
** libmatroska : parse Matroska files, see http://www.matroska.org/ ** libmatroska : parse Matroska files, see http://www.matroska.org/
** **
** <file/class description> ** <file/class description>
** **
** Copyright (C) 2002-2010 Steve Lhomme. All rights reserved. ** Copyright (C) 2002-2010 Steve Lhomme. All rights reserved.
** **
** This library is free software; you can redistribute it and/or ** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public ** modify it under the terms of the GNU Lesser General Public
** License as published by the Free Software Foundation; either ** License as published by the Free Software Foundation; either
** version 2.1 of the License, or (at your option) any later version. ** 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, ** This library is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of ** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Lesser General Public License for more details. ** Lesser General Public License for more details.
** **
** You should have received a copy of the GNU Lesser General Public ** You should have received a copy of the GNU Lesser General Public
** License along with this library; if not, write to the Free Software ** License along with this library; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
** **
** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.** ** See http://www.matroska.org/license/lgpl/ for LGPL licensing information.**
** Contact license@matroska.org if any conditions of this licensing are ** Contact license@matroska.org if any conditions of this licensing are
** not clear to you. ** not clear to you.
** **
**********************************************************************/ **********************************************************************/
/*! /*!
\file \file
\version \$Id: KaxBlockData.cpp 1226 2005-10-13 21:16:43Z robux4 $ \version \$Id: KaxBlockData.cpp 1226 2005-10-13 21:16:43Z robux4 $
\author Steve Lhomme <robux4 @ users.sf.net> \author Steve Lhomme <robux4 @ users.sf.net>
*/ */
#include <cassert> #include <cassert>
#include "matroska/KaxBlockData.h" #include "matroska/KaxBlockData.h"
#include "matroska/KaxContexts.h" #include "matroska/KaxContexts.h"
#include "matroska/KaxBlock.h" #include "matroska/KaxBlock.h"
#include "matroska/KaxDefines.h" #include "matroska/KaxDefines.h"
using namespace LIBEBML_NAMESPACE; using namespace LIBEBML_NAMESPACE;
START_LIBMATROSKA_NAMESPACE START_LIBMATROSKA_NAMESPACE
DEFINE_START_SEMANTIC(KaxSlices) DEFINE_START_SEMANTIC(KaxSlices)
DEFINE_SEMANTIC_ITEM(false, false, KaxTimeSlice) DEFINE_SEMANTIC_ITEM(false, false, KaxTimeSlice)
DEFINE_END_SEMANTIC(KaxSlices) DEFINE_END_SEMANTIC(KaxSlices)
DEFINE_START_SEMANTIC(KaxTimeSlice) DEFINE_START_SEMANTIC(KaxTimeSlice)
DEFINE_SEMANTIC_ITEM(false, true, KaxSliceLaceNumber) DEFINE_SEMANTIC_ITEM(false, true, KaxSliceLaceNumber)
DEFINE_SEMANTIC_ITEM(false, true, KaxSliceFrameNumber) DEFINE_SEMANTIC_ITEM(false, true, KaxSliceFrameNumber)
DEFINE_SEMANTIC_ITEM(false, true, KaxSliceBlockAddID) DEFINE_SEMANTIC_ITEM(false, true, KaxSliceBlockAddID)
DEFINE_SEMANTIC_ITEM(false, true, KaxSliceDelay) DEFINE_SEMANTIC_ITEM(false, true, KaxSliceDelay)
DEFINE_SEMANTIC_ITEM(false, true, KaxSliceDuration) DEFINE_SEMANTIC_ITEM(false, true, KaxSliceDuration)
DEFINE_END_SEMANTIC(KaxTimeSlice) DEFINE_END_SEMANTIC(KaxTimeSlice)
DEFINE_MKX_UINTEGER_DEF (KaxReferencePriority, 0xFA, 1, KaxBlockGroup, "FlagReferenced", 0); DEFINE_MKX_UINTEGER_DEF (KaxReferencePriority, 0xFA, 1, KaxBlockGroup, "FlagReferenced", 0);
DEFINE_MKX_SINTEGER_CONS(KaxReferenceBlock, 0xFB, 1, KaxBlockGroup, "ReferenceBlock"); DEFINE_MKX_SINTEGER_CONS(KaxReferenceBlock, 0xFB, 1, KaxBlockGroup, "ReferenceBlock");
DEFINE_MKX_MASTER (KaxSlices, 0x8E, 1, KaxBlockGroup, "Slices"); DEFINE_MKX_MASTER (KaxSlices, 0x8E, 1, KaxBlockGroup, "Slices");
DEFINE_MKX_MASTER (KaxTimeSlice, 0xE8, 1, KaxSlices, "TimeSlice"); DEFINE_MKX_MASTER (KaxTimeSlice, 0xE8, 1, KaxSlices, "TimeSlice");
DEFINE_MKX_UINTEGER_DEF (KaxSliceLaceNumber, 0xCC, 1, KaxTimeSlice, "SliceLaceNumber", 0); DEFINE_MKX_UINTEGER_DEF (KaxSliceLaceNumber, 0xCC, 1, KaxTimeSlice, "SliceLaceNumber", 0);
DEFINE_MKX_UINTEGER_DEF (KaxSliceFrameNumber, 0xCD, 1, KaxTimeSlice, "SliceFrameNumber", 0); DEFINE_MKX_UINTEGER_DEF (KaxSliceFrameNumber, 0xCD, 1, KaxTimeSlice, "SliceFrameNumber", 0);
DEFINE_MKX_UINTEGER_DEF (KaxSliceBlockAddID, 0xCB, 1, KaxTimeSlice, "SliceBlockAddID", 0); DEFINE_MKX_UINTEGER_DEF (KaxSliceBlockAddID, 0xCB, 1, KaxTimeSlice, "SliceBlockAddID", 0);
DEFINE_MKX_UINTEGER (KaxSliceDelay, 0xCE, 1, KaxTimeSlice, "SliceDelay"); DEFINE_MKX_UINTEGER (KaxSliceDelay, 0xCE, 1, KaxTimeSlice, "SliceDelay");
DEFINE_MKX_UINTEGER_DEF (KaxSliceDuration, 0xCF, 1, KaxTimeSlice, "SliceDuration", 0); DEFINE_MKX_UINTEGER_DEF (KaxSliceDuration, 0xCF, 1, KaxTimeSlice, "SliceDuration", 0);
#if MATROSKA_VERSION >= 2 #if MATROSKA_VERSION >= 2
DEFINE_MKX_SINTEGER (KaxReferenceVirtual, 0xFD, 1, KaxBlockGroup, "ReferenceVirtual"); DEFINE_MKX_SINTEGER (KaxReferenceVirtual, 0xFD, 1, KaxBlockGroup, "ReferenceVirtual");
#endif #endif
const KaxBlockBlob & KaxReferenceBlock::RefBlock() const const KaxBlockBlob & KaxReferenceBlock::RefBlock() const
{ {
assert(RefdBlock != NULL); assert(RefdBlock != NULL);
return *RefdBlock; return *RefdBlock;
} }
KaxReferenceBlock::KaxReferenceBlock(EBML_EXTRA_DEF) KaxReferenceBlock::KaxReferenceBlock(EBML_EXTRA_DEF)
:EBML_DEF_SINTEGER(KaxReferenceBlock)EBML_DEF_SEP :EBML_DEF_SINTEGER(KaxReferenceBlock)EBML_DEF_SEP
RefdBlock(NULL) RefdBlock(NULL)
,ParentBlock(NULL) ,ParentBlock(NULL)
{ {
bTimecodeSet = false; bTimecodeSet = false;
} }
KaxReferenceBlock::KaxReferenceBlock(const KaxReferenceBlock & ElementToClone) KaxReferenceBlock::KaxReferenceBlock(const KaxReferenceBlock & ElementToClone)
:EbmlSInteger(ElementToClone) :EbmlSInteger(ElementToClone)
,bTimecodeSet(ElementToClone.bTimecodeSet) ,bTimecodeSet(ElementToClone.bTimecodeSet)
{ ,bOurBlob(false)
} {
}
filepos_t KaxReferenceBlock::UpdateSize(bool bSaveDefault, bool bForceRender)
{ KaxReferenceBlock::~KaxReferenceBlock()
if (!bTimecodeSet) { {
assert(RefdBlock != NULL); FreeBlob();
assert(ParentBlock != NULL); }
const KaxInternalBlock &block = *RefdBlock; void KaxReferenceBlock::FreeBlob()
*static_cast<EbmlSInteger*>(this) = (int64(block.GlobalTimecode()) - int64(ParentBlock->GlobalTimecode())) / int64(ParentBlock->GlobalTimecodeScale()); {
} if (bOurBlob && RefdBlock!=NULL)
return EbmlSInteger::UpdateSize(bSaveDefault, bForceRender); delete RefdBlock;
} RefdBlock = NULL;
}
void KaxReferenceBlock::SetReferencedBlock(const KaxBlockBlob * aRefdBlock)
{ filepos_t KaxReferenceBlock::UpdateSize(bool bSaveDefault, bool bForceRender)
assert(RefdBlock == NULL); {
assert(aRefdBlock != NULL); if (!bTimecodeSet) {
RefdBlock = aRefdBlock; assert(RefdBlock != NULL);
SetValueIsSet(); assert(ParentBlock != NULL);
}
const KaxInternalBlock &block = *RefdBlock;
void KaxReferenceBlock::SetReferencedBlock(const KaxBlockGroup & aRefdBlock) *static_cast<EbmlSInteger*>(this) = (int64(block.GlobalTimecode()) - int64(ParentBlock->GlobalTimecode())) / int64(ParentBlock->GlobalTimecodeScale());
{ }
KaxBlockBlob *block_blob = new KaxBlockBlob(BLOCK_BLOB_NO_SIMPLE); return EbmlSInteger::UpdateSize(bSaveDefault, bForceRender);
block_blob->SetBlockGroup(*const_cast<KaxBlockGroup*>(&aRefdBlock)); }
RefdBlock = block_blob;
SetValueIsSet(); void KaxReferenceBlock::SetReferencedBlock(const KaxBlockBlob * aRefdBlock)
} {
assert(RefdBlock == NULL);
END_LIBMATROSKA_NAMESPACE 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