-/****************************************************************************\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
-/****************************************************************************\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