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:
parent
f1349f9639
commit
697ce73358
@ -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:
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user