diff --git a/libmatroska.proj b/libmatroska.proj index 520872e..43ada03 100644 --- a/libmatroska.proj +++ b/libmatroska.proj @@ -18,7 +18,7 @@ LIB matroska FAVOR_MAX_SPEED . REDUCE_SIZE . FASTER_FLOAT . - + SOURCE src/FileKax.cpp SOURCE src/KaxAttached.cpp SOURCE src/KaxAttachments.cpp diff --git a/make/Doxyfile b/make/Doxyfile index be25f52..b9cb0f3 100644 --- a/make/Doxyfile +++ b/make/Doxyfile @@ -21,7 +21,7 @@ REPEAT_BRIEF = YES ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = YES FULL_PATH_NAMES = NO -STRIP_FROM_PATH = +STRIP_FROM_PATH = INTERNAL_DOCS = NO CASE_SENSE_NAMES = YES SHORT_NAMES = NO @@ -40,8 +40,8 @@ GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES -ALIASES = -ENABLED_SECTIONS = +ALIASES = +ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO @@ -54,7 +54,7 @@ WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_FORMAT = "$file:$line: $text" -WARN_LOGFILE = +WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- @@ -68,14 +68,14 @@ INPUT = ../../libebml/src \ FILE_PATTERNS = *.cpp \ *.h RECURSIVE = NO -EXCLUDE = +EXCLUDE = EXCLUDE_SYMLINKS = NO -EXCLUDE_PATTERNS = -EXAMPLE_PATH = -EXAMPLE_PATTERNS = +EXCLUDE_PATTERNS = +EXAMPLE_PATH = +EXAMPLE_PATTERNS = EXAMPLE_RECURSIVE = NO -IMAGE_PATH = -INPUT_FILTER = +IMAGE_PATH = +INPUT_FILTER = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing @@ -90,20 +90,20 @@ REFERENCES_RELATION = YES #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = NO COLS_IN_ALPHA_INDEX = 5 -IGNORE_PREFIX = +IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html -HTML_HEADER = -HTML_FOOTER = +HTML_HEADER = +HTML_FOOTER = HTML_STYLESHEET = libmatroska.css HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO -CHM_FILE = -HHC_LOCATION = +CHM_FILE = +HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO @@ -120,8 +120,8 @@ LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = YES PAPER_TYPE = a4wide -EXTRA_PACKAGES = -LATEX_HEADER = +EXTRA_PACKAGES = +LATEX_HEADER = PDF_HYPERLINKS = YES USE_PDFLATEX = YES LATEX_BATCHMODE = NO @@ -133,8 +133,8 @@ GENERATE_RTF = YES RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = YES -RTF_STYLESHEET_FILE = -RTF_EXTENSIONS_FILE = +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- @@ -146,8 +146,8 @@ MAN_LINKS = YES # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO -XML_SCHEMA = -XML_DTD = +XML_SCHEMA = +XML_DTD = #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- @@ -158,29 +158,29 @@ GENERATE_AUTOGEN_DEF = NO GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES -PERLMOD_MAKEVAR_PREFIX = +PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- -# Configuration options related to the preprocessor +# Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES -INCLUDE_PATH = -INCLUDE_FILE_PATTERNS = -PREDEFINED = -EXPAND_AS_DEFINED = +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = +EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- -# Configuration::addtions related to external references +# Configuration::addtions related to external references #--------------------------------------------------------------------------- -TAGFILES = -GENERATE_TAGFILE = +TAGFILES = +GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- -# Configuration options related to the dot tool +# Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = YES HIDE_UNDOC_RELATIONS = YES @@ -192,20 +192,20 @@ INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES GRAPHICAL_HIERARCHY = YES DOT_IMAGE_FORMAT = png -DOT_PATH = -DOTFILE_DIRS = +DOT_PATH = +DOTFILE_DIRS = MAX_DOT_GRAPH_WIDTH = 1024 MAX_DOT_GRAPH_HEIGHT = 1024 MAX_DOT_GRAPH_DEPTH = 0 GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- -# Configuration::addtions related to the search engine +# Configuration::addtions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO CGI_NAME = search.cgi -CGI_URL = -DOC_URL = -DOC_ABSPATH = +CGI_URL = +DOC_URL = +DOC_ABSPATH = BIN_ABSPATH = /usr/local/bin/ -EXT_DOC_PATHS = +EXT_DOC_PATHS = diff --git a/make/linux/Makefile b/make/linux/Makefile index 3ca7b0f..cf12904 100644 --- a/make/linux/Makefile +++ b/make/linux/Makefile @@ -151,7 +151,7 @@ test9: test9.o $(LIBRARY) $(LIBRARY_SO) test9.o: $(TAG_SRC_DIR)test9.cpp $(CXX) -c $(COMPILEFLAGS) -o $@ $< -install: $(targets_$(link):%=install_%) install_headers +install: $(targets_$(link):%=install_%) install_headers install_headers: $(INSTALL) $(INSTALL_DIR_OPTS) -d $(DESTDIR)$(includedir) diff --git a/make/linux/Makefile.rule b/make/linux/Makefile.rule index 21c2b5a..80229fc 100644 --- a/make/linux/Makefile.rule +++ b/make/linux/Makefile.rule @@ -21,7 +21,7 @@ DEPEND = makedepend INDENT =indent --gnu-style -ut -ts6 -br -npsl -npcs DELETE =rm -f -GLOBAL_CFLAGS = -Wall -Wno-unknown-pragmas -Wno-format +GLOBAL_CFLAGS = -Wall -Wno-unknown-pragmas -Wno-format DEBUG_CFLAGS = -g -O0 -DDEBUG ${GLOBAL_CFLAGS} RELEASE_CFLAGS = -O2 ${GLOBAL_CFLAGS} diff --git a/make/vc7/Makefile b/make/vc7/Makefile index 546694d..47e33bc 100644 --- a/make/vc7/Makefile +++ b/make/vc7/Makefile @@ -17,7 +17,7 @@ OBJ = $(patsubst %.cpp,%.obj,$(SRC)) INCS = /I../.. /I$(EBML_DIR) LDFLAGS = /NOLOGO /DLL /MAP:libmatroska.map /LIBPATH:$(EBML_DIR)/make/vc7 /VERSION:0.7 OPTMIZ = /G6 /O2 /Oi /GL /Wp64 -CXXFLAGS = $(INCS) /DWIN32 /nologo /DEBML_DLL +CXXFLAGS = $(INCS) /DWIN32 /nologo /DEBML_DLL ifeq (yes,$(DEBUG)) diff --git a/matroska/FileKax.h b/matroska/FileKax.h index 3cabd72..bcad6de 100644 --- a/matroska/FileKax.h +++ b/matroska/FileKax.h @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -28,9 +28,9 @@ **********************************************************************/ /*! - \file - \version \$Id: FileKax.h,v 1.5 2004/04/14 23:26:17 robux4 Exp $ - \author Steve Lhomme + \file + \version \$Id: FileKax.h,v 1.5 2004/04/14 23:26:17 robux4 Exp $ + \author Steve Lhomme */ #ifndef LIBMATROSKA_FILE_H #define LIBMATROSKA_FILE_H @@ -60,90 +60,90 @@ START_LIBMATROSKA_NAMESPACE */ class MATROSKA_DLL_API FileMatroska { public: - FileMatroska(IOCallback & output); - ~FileMatroska(); + FileMatroska(IOCallback & output); + ~FileMatroska(); #ifdef OLD - filepos_t RenderHead(const std::string & aEncoderApp); - uint32 ReadHead(); - uint32 ReadTracks(); - uint32 ReadCodec(); - void Close(const uint32 aTimeLength); + filepos_t RenderHead(const std::string & aEncoderApp); + uint32 ReadHead(); + uint32 ReadTracks(); + uint32 ReadCodec(); + void Close(const uint32 aTimeLength); - inline void type_SetInfo(const std::string & aStr) {myMainHeader.type_SetInfo(aStr);} - inline void type_SetAds(const std::string & aStr) {myMainHeader.type_SetAds(aStr);} - inline void type_SetSize(const std::string & aStr) {myMainHeader.type_SetSize(aStr);} - inline void type_SetSize(uint64 aSize) {myMainHeader.type_SetSize(aSize);} + inline void type_SetInfo(const std::string & aStr) {myMainHeader.type_SetInfo(aStr);} + inline void type_SetAds(const std::string & aStr) {myMainHeader.type_SetAds(aStr);} + inline void type_SetSize(const std::string & aStr) {myMainHeader.type_SetSize(aStr);} + inline void type_SetSize(uint64 aSize) {myMainHeader.type_SetSize(aSize);} - inline uint8 GetTrackNumber() const { return myTracks.size(); } + inline uint8 GetTrackNumber() const { return myTracks.size(); } - void track_SetName(Track * aTrack, const std::string & aName); - void track_SetLaced(Track * aTrack, bool bLaced = true); + void track_SetName(Track * aTrack, const std::string & aName); + void track_SetLaced(Track * aTrack, bool bLaced = true); - Track * CreateTrack(const track_type aType); - inline Track * GetTrack(const uint8 aTrackNb) const - { - if (aTrackNb > myTracks.size()) - return NULL; - else - return myTracks[aTrackNb-1]; - } + Track * CreateTrack(const track_type aType); + inline Track * GetTrack(const uint8 aTrackNb) const + { + if (aTrackNb > myTracks.size()) + return NULL; + else + return myTracks[aTrackNb-1]; + } - void Track_GetInfo(const Track * aTrack, TrackInfo & aTrackInfo) const; - - void Track_SetInfo_Audio(Track * aTrack, const TrackInfoAudio & aTrackInfo); - void Track_GetInfo_Audio(const Track * aTrack, TrackInfoAudio & aTrackInfo) const; + void Track_GetInfo(const Track * aTrack, TrackInfo & aTrackInfo) const; - void Track_SetInfo_Video(Track * aTrack, const TrackInfoVideo & aTrackInfo); - void Track_GetInfo_Video(const Track * aTrack, TrackInfoVideo & aTrackInfo) const; + void Track_SetInfo_Audio(Track * aTrack, const TrackInfoAudio & aTrackInfo); + void Track_GetInfo_Audio(const Track * aTrack, TrackInfoAudio & aTrackInfo) const; - void SelectReadingTrack(Track * aTrack, bool select = true); + void Track_SetInfo_Video(Track * aTrack, const TrackInfoVideo & aTrackInfo); + void Track_GetInfo_Video(const Track * aTrack, TrackInfoVideo & aTrackInfo) const; - /*! - \return wether the frame has been added or not - */ - bool AddFrame(Track * aTrack, const uint32 aTimecode, const binary *aFrame, const uint32 aFrameSize, - bool aKeyFrame = true, bool aBFrame = false); + void SelectReadingTrack(Track * aTrack, bool select = true); - /*! - \return wether the frame has been read or not - */ - bool ReadFrame(Track * & aTrack, uint32 & aTimecode, const binary * & aFrame, uint32 & aFrameSize, - bool & aKeyFrame, bool & aBFrame); + /*! + \return wether the frame has been added or not + */ + bool AddFrame(Track * aTrack, const uint32 aTimecode, const binary *aFrame, const uint32 aFrameSize, + bool aKeyFrame = true, bool aBFrame = false); - /* - Render the pending cluster to file - */ - void Flush(); + /*! + \return wether the frame has been read or not + */ + bool ReadFrame(Track * & aTrack, uint32 & aTimecode, const binary * & aFrame, uint32 & aFrameSize, + bool & aKeyFrame, bool & aBFrame); - void SetMaxClusterSize(const uint32 value); - void SetMinClusterSize(const uint32 value) {myMinClusterSize = value;} + /* + Render the pending cluster to file + */ + void Flush(); + + void SetMaxClusterSize(const uint32 value); + void SetMinClusterSize(const uint32 value) {myMinClusterSize = value;} protected: - MainHeader myMainHeader; + MainHeader myMainHeader; - std::vector myTracks; - std::vector mySelectedTracks; + std::vector myTracks; + std::vector mySelectedTracks; -// Track *findTrack(Track * aTrack) const; +// Track *findTrack(Track * aTrack) const; - Cluster myCurrWriteCluster; /// \todo merge with the write one ? - uint32 myReadBlockNumber; - Cluster myCurrReadCluster; - binary * myCurrReadBlock; ///< The buffer containing the current read block - uint32 myCurrReadBlockSize; ///< The size of the buffer containing the current read block - uint8 myCurrReadBlockTrack; ///< The track number of the current track to read + Cluster myCurrWriteCluster; /// \todo merge with the write one ? + uint32 myReadBlockNumber; + Cluster myCurrReadCluster; + binary * myCurrReadBlock; ///< The buffer containing the current read block + uint32 myCurrReadBlockSize; ///< The size of the buffer containing the current read block + uint8 myCurrReadBlockTrack; ///< The track number of the current track to read - uint32 myMaxClusterSize; - uint32 myMinClusterSize; + uint32 myMaxClusterSize; + uint32 myMinClusterSize; - StreamInfo myStreamInfo; + StreamInfo myStreamInfo; - CodecHeader myCodecHeader; + CodecHeader myCodecHeader; - inline bool IsMyTrack(const Track * aTrack) const; - inline bool IsReadingTrack(const uint8 aTrackNum) const; + inline bool IsMyTrack(const Track * aTrack) const; + inline bool IsReadingTrack(const uint8 aTrackNum) const; #endif // OLD - IOCallback & myFile; + IOCallback & myFile; }; diff --git a/matroska/KaxAttached.h b/matroska/KaxAttached.h index 0cf1a94..43a569a 100644 --- a/matroska/KaxAttached.h +++ b/matroska/KaxAttached.h @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -28,9 +28,9 @@ **********************************************************************/ /*! - \file - \version \$Id: KaxAttached.h,v 1.8 2004/04/14 23:26:17 robux4 Exp $ - \author Steve Lhomme + \file + \version \$Id: KaxAttached.h,v 1.8 2004/04/14 23:26:17 robux4 Exp $ + \author Steve Lhomme */ #ifndef LIBMATROSKA_ATTACHED_H #define LIBMATROSKA_ATTACHED_H diff --git a/matroska/KaxAttachments.h b/matroska/KaxAttachments.h index 91a543a..b0337bc 100644 --- a/matroska/KaxAttachments.h +++ b/matroska/KaxAttachments.h @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -28,9 +28,9 @@ **********************************************************************/ /*! - \file - \version \$Id: KaxAttachments.h,v 1.8 2004/04/14 23:26:17 robux4 Exp $ - \author Steve Lhomme + \file + \version \$Id: KaxAttachments.h,v 1.8 2004/04/14 23:26:17 robux4 Exp $ + \author Steve Lhomme */ #ifndef LIBMATROSKA_ATTACHEMENTS_H #define LIBMATROSKA_ATTACHEMENTS_H diff --git a/matroska/KaxBlock.h b/matroska/KaxBlock.h index 3ee8397..669fa09 100644 --- a/matroska/KaxBlock.h +++ b/matroska/KaxBlock.h @@ -9,12 +9,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -26,11 +26,11 @@ **********************************************************************/ /*! - \file - \todo add a PureBlock class to group functionalities between Block and BlockVirtual - \version \$Id: KaxBlock.h,v 1.24 2004/04/14 23:26:17 robux4 Exp $ - \author Steve Lhomme - \author Julien Coloos + \file + \todo add a PureBlock class to group functionalities between Block and BlockVirtual + \version \$Id: KaxBlock.h,v 1.24 2004/04/14 23:26:17 robux4 Exp $ + \author Steve Lhomme + \author Julien Coloos */ #ifndef LIBMATROSKA_BLOCK_H #define LIBMATROSKA_BLOCK_H @@ -53,259 +53,259 @@ class KaxInternalBlock; class KaxBlockBlob; class MATROSKA_DLL_API DataBuffer { - protected: - binary * myBuffer; - uint32 mySize; - bool bValidValue; - bool (*myFreeBuffer)(const DataBuffer & aBuffer); // method to free the internal buffer - bool bInternalBuffer; + protected: + binary * myBuffer; + uint32 mySize; + bool bValidValue; + bool (*myFreeBuffer)(const DataBuffer & aBuffer); // method to free the internal buffer + bool bInternalBuffer; - public: - DataBuffer(binary * aBuffer, uint32 aSize, bool (*aFreeBuffer)(const DataBuffer & aBuffer) = NULL, bool _bInternalBuffer = false) - :myBuffer(NULL) - ,mySize(aSize) - ,bValidValue(true) - ,myFreeBuffer(aFreeBuffer) - ,bInternalBuffer(_bInternalBuffer) - { - if (bInternalBuffer) - { - myBuffer = new (std::nothrow) binary[mySize]; - if (myBuffer == NULL) - bValidValue = false; - else - memcpy(myBuffer, aBuffer, mySize); - } - else - myBuffer = aBuffer; - } + public: + DataBuffer(binary * aBuffer, uint32 aSize, bool (*aFreeBuffer)(const DataBuffer & aBuffer) = NULL, bool _bInternalBuffer = false) + :myBuffer(NULL) + ,mySize(aSize) + ,bValidValue(true) + ,myFreeBuffer(aFreeBuffer) + ,bInternalBuffer(_bInternalBuffer) + { + if (bInternalBuffer) + { + myBuffer = new (std::nothrow) binary[mySize]; + if (myBuffer == NULL) + bValidValue = false; + else + memcpy(myBuffer, aBuffer, mySize); + } + else + myBuffer = aBuffer; + } - virtual ~DataBuffer() {} - virtual binary * Buffer() {assert(bValidValue); return myBuffer;} - virtual uint32 & Size() {return mySize;}; - virtual const binary * Buffer() const {assert(bValidValue); return myBuffer;} - virtual uint32 Size() const {return mySize;}; - bool FreeBuffer(const DataBuffer & aBuffer) { - bool bResult = true; - if (myBuffer != NULL && bValidValue) { - if (myFreeBuffer != NULL) - bResult = myFreeBuffer(aBuffer); - if (bInternalBuffer) - delete [] myBuffer; - myBuffer = NULL; - mySize = 0; - bValidValue = false; - } - return bResult; - } + virtual ~DataBuffer() {} + virtual binary * Buffer() {assert(bValidValue); return myBuffer;} + virtual uint32 & Size() {return mySize;}; + virtual const binary * Buffer() const {assert(bValidValue); return myBuffer;} + virtual uint32 Size() const {return mySize;}; + bool FreeBuffer(const DataBuffer & aBuffer) { + bool bResult = true; + if (myBuffer != NULL && bValidValue) { + if (myFreeBuffer != NULL) + bResult = myFreeBuffer(aBuffer); + if (bInternalBuffer) + delete [] myBuffer; + myBuffer = NULL; + mySize = 0; + bValidValue = false; + } + return bResult; + } - virtual DataBuffer * Clone(); + virtual DataBuffer * Clone(); }; class MATROSKA_DLL_API SimpleDataBuffer : public DataBuffer { - public: - SimpleDataBuffer(binary * aBuffer, uint32 aSize, uint32 aOffset, bool (*aFreeBuffer)(const DataBuffer & aBuffer) = myFreeBuffer) - :DataBuffer(aBuffer + aOffset, aSize, aFreeBuffer) - ,Offset(aOffset) - ,BaseBuffer(aBuffer) - {} - virtual ~SimpleDataBuffer() {} + public: + SimpleDataBuffer(binary * aBuffer, uint32 aSize, uint32 aOffset, bool (*aFreeBuffer)(const DataBuffer & aBuffer) = myFreeBuffer) + :DataBuffer(aBuffer + aOffset, aSize, aFreeBuffer) + ,Offset(aOffset) + ,BaseBuffer(aBuffer) + {} + virtual ~SimpleDataBuffer() {} - DataBuffer * Clone() {return new SimpleDataBuffer(*this);} + DataBuffer * Clone() {return new SimpleDataBuffer(*this);} - protected: - uint32 Offset; - binary * BaseBuffer; + protected: + uint32 Offset; + binary * BaseBuffer; - static bool myFreeBuffer(const DataBuffer & aBuffer) - { - binary *_Buffer = static_cast(&aBuffer)->BaseBuffer; - if (_Buffer != NULL) - free(_Buffer); - return true; - } + static bool myFreeBuffer(const DataBuffer & aBuffer) + { + binary *_Buffer = static_cast(&aBuffer)->BaseBuffer; + if (_Buffer != NULL) + free(_Buffer); + return true; + } - SimpleDataBuffer(const SimpleDataBuffer & ToClone); + SimpleDataBuffer(const SimpleDataBuffer & ToClone); }; /*! - \note the data is copied locally, it can be freed right away + \note the data is copied locally, it can be freed right away * / class MATROSKA_DLL_API NotSoSimpleDataBuffer : public SimpleDataBuffer { - public: - NotSoSimpleDataBuffer(binary * aBuffer, uint32 aSize, uint32 aOffset) - :SimpleDataBuffer(new binary[aSize - aOffset], aSize, 0) - { - memcpy(BaseBuffer, aBuffer + aOffset, aSize - aOffset); - } + public: + NotSoSimpleDataBuffer(binary * aBuffer, uint32 aSize, uint32 aOffset) + :SimpleDataBuffer(new binary[aSize - aOffset], aSize, 0) + { + memcpy(BaseBuffer, aBuffer + aOffset, aSize - aOffset); + } }; */ DECLARE_MKX_MASTER(KaxBlockGroup) - public: - ~KaxBlockGroup(); + public: + ~KaxBlockGroup(); - /*! - \brief Addition of a frame without references - */ - bool AddFrame(const KaxTrackEntry & track, uint64 timecode, DataBuffer & buffer, LacingType lacing = LACING_AUTO); - /*! - \brief Addition of a frame with a backward reference (P frame) - */ - bool AddFrame(const KaxTrackEntry & track, uint64 timecode, DataBuffer & buffer, const KaxBlockGroup & PastBlock, LacingType lacing = LACING_AUTO); + /*! + \brief Addition of a frame without references + */ + bool AddFrame(const KaxTrackEntry & track, uint64 timecode, DataBuffer & buffer, LacingType lacing = LACING_AUTO); + /*! + \brief Addition of a frame with a backward reference (P frame) + */ + bool AddFrame(const KaxTrackEntry & track, uint64 timecode, DataBuffer & buffer, const KaxBlockGroup & PastBlock, LacingType lacing = LACING_AUTO); - /*! - \brief Addition of a frame with a backward+forward reference (B frame) - */ - bool AddFrame(const KaxTrackEntry & track, uint64 timecode, DataBuffer & buffer, const KaxBlockGroup & PastBlock, const KaxBlockGroup & ForwBlock, LacingType lacing = LACING_AUTO); - bool AddFrame(const KaxTrackEntry & track, uint64 timecode, DataBuffer & buffer, const KaxBlockBlob * PastBlock, const KaxBlockBlob * ForwBlock, LacingType lacing = LACING_AUTO); + /*! + \brief Addition of a frame with a backward+forward reference (B frame) + */ + bool AddFrame(const KaxTrackEntry & track, uint64 timecode, DataBuffer & buffer, const KaxBlockGroup & PastBlock, const KaxBlockGroup & ForwBlock, LacingType lacing = LACING_AUTO); + bool AddFrame(const KaxTrackEntry & track, uint64 timecode, DataBuffer & buffer, const KaxBlockBlob * PastBlock, const KaxBlockBlob * ForwBlock, LacingType lacing = LACING_AUTO); - void SetParent(KaxCluster & aParentCluster); + void SetParent(KaxCluster & aParentCluster); - void SetParentTrack(const KaxTrackEntry & aParentTrack) { - ParentTrack = &aParentTrack; - } + void SetParentTrack(const KaxTrackEntry & aParentTrack) { + ParentTrack = &aParentTrack; + } - /*! - \brief Set the duration of the contained frame(s) (for the total number of frames) - */ - void SetBlockDuration(uint64 TimeLength); - bool GetBlockDuration(uint64 &TheTimecode) const; + /*! + \brief Set the duration of the contained frame(s) (for the total number of frames) + */ + void SetBlockDuration(uint64 TimeLength); + bool GetBlockDuration(uint64 &TheTimecode) const; - /*! - \return the global timecode of this Block (not just the delta to the Cluster) - */ - uint64 GlobalTimecode() const; - uint64 GlobalTimecodeScale() const { - assert(ParentTrack != NULL); - return ParentTrack->GlobalTimecodeScale(); - } + /*! + \return the global timecode of this Block (not just the delta to the Cluster) + */ + uint64 GlobalTimecode() const; + uint64 GlobalTimecodeScale() const { + assert(ParentTrack != NULL); + return ParentTrack->GlobalTimecodeScale(); + } - uint16 TrackNumber() const; + uint16 TrackNumber() const; - uint64 ClusterPosition() const; - - /*! - \return the number of references to other frames - */ - unsigned int ReferenceCount() const; - const KaxReferenceBlock & Reference(unsigned int Index) const; + uint64 ClusterPosition() const; - /*! - \brief release all the frames of all Blocks - */ - void ReleaseFrames(); + /*! + \return the number of references to other frames + */ + unsigned int ReferenceCount() const; + const KaxReferenceBlock & Reference(unsigned int Index) const; - operator KaxInternalBlock &(); + /*! + \brief release all the frames of all Blocks + */ + void ReleaseFrames(); - const KaxCluster *GetParentCluster() const { return ParentCluster; } + operator KaxInternalBlock &(); - protected: - KaxCluster * ParentCluster; - const KaxTrackEntry * ParentTrack; + const KaxCluster *GetParentCluster() const { return ParentCluster; } + + protected: + KaxCluster * ParentCluster; + const KaxTrackEntry * ParentTrack; }; class KaxInternalBlock : public EbmlBinary { - public: - KaxInternalBlock(EBML_DEF_CONS EBML_DEF_SEP bool bSimple EBML_DEF_SEP EBML_EXTRA_PARAM) :EBML_DEF_BINARY_INIT EBML_DEF_SEP bLocalTimecodeUsed(false), mLacing(LACING_AUTO), mInvisible(false) - ,ParentCluster(NULL), bIsSimple(bSimple), bIsKeyframe(true), bIsDiscardable(false) - {} - KaxInternalBlock(const KaxInternalBlock & ElementToClone); - ~KaxInternalBlock(); - virtual bool ValidateSize() const; + public: + KaxInternalBlock(EBML_DEF_CONS EBML_DEF_SEP bool bSimple EBML_DEF_SEP EBML_EXTRA_PARAM) :EBML_DEF_BINARY_INIT EBML_DEF_SEP bLocalTimecodeUsed(false), mLacing(LACING_AUTO), mInvisible(false) + ,ParentCluster(NULL), bIsSimple(bSimple), bIsKeyframe(true), bIsDiscardable(false) + {} + KaxInternalBlock(const KaxInternalBlock & ElementToClone); + ~KaxInternalBlock(); + virtual bool ValidateSize() const; - uint16 TrackNum() const {return TrackNumber;} - /*! - \todo !!!! This method needs to be changes ! - */ - uint64 GlobalTimecode() const {return Timecode;} + uint16 TrackNum() const {return TrackNumber;} + /*! + \todo !!!! This method needs to be changes ! + */ + uint64 GlobalTimecode() const {return Timecode;} - /*! - \note override this function to generate the Data/Size on the fly, unlike the usual binary elements - */ - filepos_t UpdateSize(bool bSaveDefault = false, bool bForceRender = false); - filepos_t ReadData(IOCallback & input, ScopeMode ReadFully = SCOPE_ALL_DATA); - - /*! - \brief Only read the head of the Block (not internal data) - \note convenient when you are parsing the file quickly - */ - uint64 ReadInternalHead(IOCallback & input); - - unsigned int NumberFrames() const { return SizeList.size();} - DataBuffer & GetBuffer(unsigned int iIndex) {return *myBuffers[iIndex];} + /*! + \note override this function to generate the Data/Size on the fly, unlike the usual binary elements + */ + filepos_t UpdateSize(bool bSaveDefault = false, bool bForceRender = false); + filepos_t ReadData(IOCallback & input, ScopeMode ReadFully = SCOPE_ALL_DATA); - bool AddFrame(const KaxTrackEntry & track, uint64 timecode, DataBuffer & buffer, LacingType lacing = LACING_AUTO, bool invisible = false); + /*! + \brief Only read the head of the Block (not internal data) + \note convenient when you are parsing the file quickly + */ + uint64 ReadInternalHead(IOCallback & input); - /*! - \brief release all the frames of all Blocks - */ - void ReleaseFrames(); + unsigned int NumberFrames() const { return SizeList.size();} + DataBuffer & GetBuffer(unsigned int iIndex) {return *myBuffers[iIndex];} - void SetParent(KaxCluster & aParentCluster); + bool AddFrame(const KaxTrackEntry & track, uint64 timecode, DataBuffer & buffer, LacingType lacing = LACING_AUTO, bool invisible = false); - /*! - \return Returns the lacing type that produces the smallest footprint. - */ - LacingType GetBestLacingType() const; + /*! + \brief release all the frames of all Blocks + */ + void ReleaseFrames(); - /*! - \param FrameNumber 0 for the first frame - \return the position in the stream for a given frame - \note return -1 if the position doesn't exist - */ - int64 GetDataPosition(size_t FrameNumber = 0); + void SetParent(KaxCluster & aParentCluster); - /*! - \param FrameNumber 0 for the first frame - \return the size of a given frame - \note return -1 if the position doesn't exist - */ - int64 GetFrameSize(size_t FrameNumber = 0); - - bool IsInvisible() const { return mInvisible; } + /*! + \return Returns the lacing type that produces the smallest footprint. + */ + LacingType GetBestLacingType() const; - uint64 ClusterPosition() const; + /*! + \param FrameNumber 0 for the first frame + \return the position in the stream for a given frame + \note return -1 if the position doesn't exist + */ + int64 GetDataPosition(size_t FrameNumber = 0); - protected: - std::vector myBuffers; - std::vector SizeList; - uint64 Timecode; // temporary timecode of the first frame, non scaled - int16 LocalTimecode; - bool bLocalTimecodeUsed; - uint16 TrackNumber; - LacingType mLacing; - bool mInvisible; - uint64 FirstFrameLocation; + /*! + \param FrameNumber 0 for the first frame + \return the size of a given frame + \note return -1 if the position doesn't exist + */ + int64 GetFrameSize(size_t FrameNumber = 0); - filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault = false); + bool IsInvisible() const { return mInvisible; } - KaxCluster * ParentCluster; - bool bIsSimple; - bool bIsKeyframe; - bool bIsDiscardable; + uint64 ClusterPosition() const; + + protected: + std::vector myBuffers; + std::vector SizeList; + uint64 Timecode; // temporary timecode of the first frame, non scaled + int16 LocalTimecode; + bool bLocalTimecodeUsed; + uint16 TrackNumber; + LacingType mLacing; + bool mInvisible; + uint64 FirstFrameLocation; + + filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault = false); + + KaxCluster * ParentCluster; + bool bIsSimple; + bool bIsKeyframe; + bool bIsDiscardable; }; DECLARE_MKX_CONTEXT(KaxBlock); class MATROSKA_DLL_API KaxBlock : public KaxInternalBlock { - public: - KaxBlock(EBML_EXTRA_PARAM) :KaxInternalBlock(EBML_DEF_BINARY_CTX(KaxBlock)EBML_DEF_SEP false EBML_DEF_SEP EBML_EXTRA_CALL) {} + public: + KaxBlock(EBML_EXTRA_PARAM) :KaxInternalBlock(EBML_DEF_BINARY_CTX(KaxBlock)EBML_DEF_SEP false EBML_DEF_SEP EBML_EXTRA_CALL) {} EBML_CONCRETE_CLASS(KaxBlock) }; #if MATROSKA_VERSION >= 2 DECLARE_MKX_CONTEXT(KaxSimpleBlock); class MATROSKA_DLL_API KaxSimpleBlock : public KaxInternalBlock { - public: - KaxSimpleBlock(EBML_EXTRA_PARAM) :KaxInternalBlock(EBML_DEF_BINARY_CTX(KaxSimpleBlock)EBML_DEF_SEP true EBML_DEF_SEP EBML_EXTRA_CALL) {} + public: + KaxSimpleBlock(EBML_EXTRA_PARAM) :KaxInternalBlock(EBML_DEF_BINARY_CTX(KaxSimpleBlock)EBML_DEF_SEP true EBML_DEF_SEP EBML_EXTRA_CALL) {} - void SetKeyframe(bool b_keyframe) { bIsKeyframe = b_keyframe; } - void SetDiscardable(bool b_discard) { bIsDiscardable = b_discard; } + void SetKeyframe(bool b_keyframe) { bIsKeyframe = b_keyframe; } + void SetDiscardable(bool b_discard) { bIsDiscardable = b_discard; } - bool IsKeyframe() const { return bIsKeyframe; } - bool IsDiscardable() const { return bIsDiscardable; } + bool IsKeyframe() const { return bIsKeyframe; } + bool IsDiscardable() const { return bIsDiscardable; } - void SetParent(KaxCluster & aParentCluster); + void SetParent(KaxCluster & aParentCluster); EBML_CONCRETE_CLASS(KaxSimpleBlock) }; @@ -314,72 +314,72 @@ class MATROSKA_DLL_API KaxSimpleBlock : public KaxInternalBlock { /// Placeholder class for either a BlockGroup or a SimpleBlock class MATROSKA_DLL_API KaxBlockBlob { public: - KaxBlockBlob(BlockBlobType sblock_mode) :ParentCluster(NULL), SimpleBlockMode(sblock_mode) { - bUseSimpleBlock = (sblock_mode != BLOCK_BLOB_NO_SIMPLE); - Block.group = NULL; - } + KaxBlockBlob(BlockBlobType sblock_mode) :ParentCluster(NULL), SimpleBlockMode(sblock_mode) { + bUseSimpleBlock = (sblock_mode != BLOCK_BLOB_NO_SIMPLE); + Block.group = NULL; + } - ~KaxBlockBlob() { + ~KaxBlockBlob() { #if MATROSKA_VERSION >= 2 - if (bUseSimpleBlock) - delete Block.simpleblock; - else + if (bUseSimpleBlock) + delete Block.simpleblock; + else #endif // MATROSKA_VERSION - delete Block.group; - } + delete Block.group; + } - operator KaxBlockGroup &(); - operator const KaxBlockGroup &() const; + operator KaxBlockGroup &(); + operator const KaxBlockGroup &() const; #if MATROSKA_VERSION >= 2 - operator KaxSimpleBlock &(); + operator KaxSimpleBlock &(); #endif - operator KaxInternalBlock &(); - operator const KaxInternalBlock &() const; + operator KaxInternalBlock &(); + operator const KaxInternalBlock &() const; - void SetBlockGroup( KaxBlockGroup &BlockRef ); + void SetBlockGroup( KaxBlockGroup &BlockRef ); - void SetBlockDuration(uint64 TimeLength); + void SetBlockDuration(uint64 TimeLength); - void SetParent(KaxCluster & aParentCluster); - bool AddFrameAuto(const KaxTrackEntry & track, uint64 timecode, DataBuffer & buffer, LacingType lacing = LACING_AUTO, const KaxBlockBlob * PastBlock = NULL, const KaxBlockBlob * ForwBlock = NULL); + void SetParent(KaxCluster & aParentCluster); + bool AddFrameAuto(const KaxTrackEntry & track, uint64 timecode, DataBuffer & buffer, LacingType lacing = LACING_AUTO, const KaxBlockBlob * PastBlock = NULL, const KaxBlockBlob * ForwBlock = NULL); - bool IsSimpleBlock() const {return bUseSimpleBlock;} + bool IsSimpleBlock() const {return bUseSimpleBlock;} - bool ReplaceSimpleByGroup(); + bool ReplaceSimpleByGroup(); protected: - KaxCluster * ParentCluster; - union { - KaxBlockGroup *group; + KaxCluster * ParentCluster; + union { + KaxBlockGroup *group; #if MATROSKA_VERSION >= 2 - KaxSimpleBlock *simpleblock; + KaxSimpleBlock *simpleblock; #endif // MATROSKA_VERSION - } Block; - bool bUseSimpleBlock; - BlockBlobType SimpleBlockMode; + } Block; + bool bUseSimpleBlock; + BlockBlobType SimpleBlockMode; }; #if MATROSKA_VERSION >= 2 DECLARE_MKX_BINARY_CONS(KaxBlockVirtual) - public: - ~KaxBlockVirtual(); + public: + ~KaxBlockVirtual(); - /*! - \note override this function to generate the Data/Size on the fly, unlike the usual binary elements - */ - filepos_t UpdateSize(bool bSaveDefault = false, bool bForceRender = false); + /*! + \note override this function to generate the Data/Size on the fly, unlike the usual binary elements + */ + filepos_t UpdateSize(bool bSaveDefault = false, bool bForceRender = false); - void SetParent(const KaxCluster & aParentCluster) {ParentCluster = &aParentCluster;} + void SetParent(const KaxCluster & aParentCluster) {ParentCluster = &aParentCluster;} filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); - + filepos_t ReadData(IOCallback & input, ScopeMode ReadFully = SCOPE_ALL_DATA); - protected: - uint64 Timecode; // temporary timecode of the first frame if there are more than one - uint16 TrackNumber; - binary DataBlock[5]; + protected: + uint64 Timecode; // temporary timecode of the first frame if there are more than one + uint16 TrackNumber; + binary DataBlock[5]; - const KaxCluster * ParentCluster; + const KaxCluster * ParentCluster; }; #endif // MATROSKA_VERSION diff --git a/matroska/KaxBlockData.h b/matroska/KaxBlockData.h index b65137f..151ff45 100644 --- a/matroska/KaxBlockData.h +++ b/matroska/KaxBlockData.h @@ -9,12 +9,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -26,9 +26,9 @@ **********************************************************************/ /*! - \file - \version \$Id: KaxBlockData.h,v 1.10 2004/04/14 23:26:17 robux4 Exp $ - \author Steve Lhomme + \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 @@ -45,26 +45,26 @@ using namespace LIBEBML_NAMESPACE; START_LIBMATROSKA_NAMESPACE /*! - \brief element used for B frame-likes + \brief element used for B frame-likes */ DECLARE_MKX_SINTEGER_CONS(KaxReferenceBlock) - public: + public: ~KaxReferenceBlock(); - /*! - \brief override this method to compute the timecode value - */ - virtual filepos_t UpdateSize(bool bSaveDefault = false, bool bForceRender = false); + /*! + \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; + 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(); }; diff --git a/matroska/KaxChapters.h b/matroska/KaxChapters.h index 9cbd278..20dc118 100644 --- a/matroska/KaxChapters.h +++ b/matroska/KaxChapters.h @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -28,9 +28,9 @@ **********************************************************************/ /*! - \file - \version \$Id$ - \author Steve Lhomme + \file + \version \$Id$ + \author Steve Lhomme */ #ifndef LIBMATROSKA_CHAPTERS_H #define LIBMATROSKA_CHAPTERS_H diff --git a/matroska/KaxCluster.h b/matroska/KaxCluster.h index 17f7e68..70957d3 100644 --- a/matroska/KaxCluster.h +++ b/matroska/KaxCluster.h @@ -9,12 +9,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -26,10 +26,10 @@ **********************************************************************/ /*! - \file - \version \$Id: KaxCluster.h,v 1.10 2004/04/14 23:26:17 robux4 Exp $ - \author Steve Lhomme - \author Julien Coloos + \file + \version \$Id: KaxCluster.h,v 1.10 2004/04/14 23:26:17 robux4 Exp $ + \author Steve Lhomme + \author Julien Coloos */ #ifndef LIBMATROSKA_CLUSTER_H @@ -49,109 +49,109 @@ START_LIBMATROSKA_NAMESPACE class KaxSegment; DECLARE_MKX_MASTER_CONS(KaxCluster) - public: - /*! - \brief Addition of a frame without references + public: + /*! + \brief Addition of a frame without references - \param the timecode is expressed in nanoseconds, relative to the beggining of the Segment - */ - bool AddFrame(const KaxTrackEntry & track, uint64 timecode, DataBuffer & buffer, KaxBlockGroup * & MyNewBlock, LacingType lacing = LACING_AUTO); - /*! - \brief Addition of a frame with a backward reference (P frame) - \param the timecode is expressed in nanoseconds, relative to the beggining of the Segment + \param the timecode is expressed in nanoseconds, relative to the beggining of the Segment + */ + bool AddFrame(const KaxTrackEntry & track, uint64 timecode, DataBuffer & buffer, KaxBlockGroup * & MyNewBlock, LacingType lacing = LACING_AUTO); + /*! + \brief Addition of a frame with a backward reference (P frame) + \param the timecode is expressed in nanoseconds, relative to the beggining of the Segment - */ - bool AddFrame(const KaxTrackEntry & track, uint64 timecode, DataBuffer & buffer, KaxBlockGroup * & MyNewBlock, const KaxBlockGroup & PastBlock, LacingType lacing = LACING_AUTO); + */ + bool AddFrame(const KaxTrackEntry & track, uint64 timecode, DataBuffer & buffer, KaxBlockGroup * & MyNewBlock, const KaxBlockGroup & PastBlock, LacingType lacing = LACING_AUTO); - /*! - \brief Addition of a frame with a backward+forward reference (B frame) - \param the timecode is expressed in nanoseconds, relative to the beggining of the Segment + /*! + \brief Addition of a frame with a backward+forward reference (B frame) + \param the timecode is expressed in nanoseconds, relative to the beggining of the Segment - */ - bool AddFrame(const KaxTrackEntry & track, uint64 timecode, DataBuffer & buffer, KaxBlockGroup * & MyNewBlock, const KaxBlockGroup & PastBlock, const KaxBlockGroup & ForwBlock, LacingType lacing = LACING_AUTO); + */ + bool AddFrame(const KaxTrackEntry & track, uint64 timecode, DataBuffer & buffer, KaxBlockGroup * & MyNewBlock, const KaxBlockGroup & PastBlock, const KaxBlockGroup & ForwBlock, LacingType lacing = LACING_AUTO); - /*! - \brief Render the data to the stream and retrieve the position of BlockGroups for later cue entries - */ - filepos_t Render(IOCallback & output, KaxCues & CueToUpdate, bool bSaveDefault = false); + /*! + \brief Render the data to the stream and retrieve the position of BlockGroups for later cue entries + */ + filepos_t Render(IOCallback & output, KaxCues & CueToUpdate, bool bSaveDefault = false); - /*! - \return the global timecode of this Cluster - */ - uint64 GlobalTimecode() const; + /*! + \return the global timecode of this Cluster + */ + uint64 GlobalTimecode() const; - KaxBlockGroup & GetNewBlock(); - - /*! - \brief release all the frames of all Blocks - \note this is a convenience to be able to keep Clusters+Blocks in memory (for future reference) withouht being a memory hog - */ - void ReleaseFrames(); + KaxBlockGroup & GetNewBlock(); - /*! - \brief return the position offset compared to the beggining of the Segment - */ - uint64 GetPosition() const; + /*! + \brief release all the frames of all Blocks + \note this is a convenience to be able to keep Clusters+Blocks in memory (for future reference) withouht being a memory hog + */ + void ReleaseFrames(); - void SetParent(const KaxSegment & aParentSegment) {ParentSegment = &aParentSegment;} + /*! + \brief return the position offset compared to the beggining of the Segment + */ + uint64 GetPosition() const; - void SetPreviousTimecode(uint64 aPreviousTimecode, int64 aTimecodeScale) { - bPreviousTimecodeIsSet = true; - PreviousTimecode = aPreviousTimecode; - SetGlobalTimecodeScale(aTimecodeScale); - } + void SetParent(const KaxSegment & aParentSegment) {ParentSegment = &aParentSegment;} - /*! - \note dirty hack to get the mandatory data back after reading - \todo there should be a better way to get mandatory data - */ - void InitTimecode(uint64 aTimecode, int64 aTimecodeScale) { - SetGlobalTimecodeScale(aTimecodeScale); - MinTimecode = MaxTimecode = PreviousTimecode = aTimecode * TimecodeScale; - bFirstFrameInside = bPreviousTimecodeIsSet = true; - } + void SetPreviousTimecode(uint64 aPreviousTimecode, int64 aTimecodeScale) { + bPreviousTimecodeIsSet = true; + PreviousTimecode = aPreviousTimecode; + SetGlobalTimecodeScale(aTimecodeScale); + } - int16 GetBlockLocalTimecode(uint64 GlobalTimecode) const; + /*! + \note dirty hack to get the mandatory data back after reading + \todo there should be a better way to get mandatory data + */ + void InitTimecode(uint64 aTimecode, int64 aTimecodeScale) { + SetGlobalTimecodeScale(aTimecodeScale); + MinTimecode = MaxTimecode = PreviousTimecode = aTimecode * TimecodeScale; + bFirstFrameInside = bPreviousTimecodeIsSet = true; + } - uint64 GetBlockGlobalTimecode(int16 LocalTimecode); + int16 GetBlockLocalTimecode(uint64 GlobalTimecode) const; - void SetGlobalTimecodeScale(uint64 aGlobalTimecodeScale) { - TimecodeScale = aGlobalTimecodeScale; - bTimecodeScaleIsSet = true; - } - uint64 GlobalTimecodeScale() const { - assert(bTimecodeScaleIsSet); - return TimecodeScale; - } + uint64 GetBlockGlobalTimecode(int16 LocalTimecode); - bool SetSilentTrackUsed() - { - bSilentTracksUsed = true; - return FindFirstElt(EBML_INFO(KaxClusterSilentTracks), true) != NULL; - } + void SetGlobalTimecodeScale(uint64 aGlobalTimecodeScale) { + TimecodeScale = aGlobalTimecodeScale; + bTimecodeScaleIsSet = true; + } + uint64 GlobalTimecodeScale() const { + assert(bTimecodeScaleIsSet); + return TimecodeScale; + } - bool AddBlockBlob(KaxBlockBlob * NewBlob); + bool SetSilentTrackUsed() + { + bSilentTracksUsed = true; + return FindFirstElt(EBML_INFO(KaxClusterSilentTracks), true) != NULL; + } - const KaxSegment *GetParentSegment() const { return ParentSegment; } + bool AddBlockBlob(KaxBlockBlob * NewBlob); - protected: - KaxBlockBlob * currentNewBlob; - std::vector Blobs; - KaxBlockGroup * currentNewBlock; - const KaxSegment * ParentSegment; + const KaxSegment *GetParentSegment() const { return ParentSegment; } - uint64 MinTimecode, MaxTimecode, PreviousTimecode; - int64 TimecodeScale; + protected: + KaxBlockBlob * currentNewBlob; + std::vector Blobs; + KaxBlockGroup * currentNewBlock; + const KaxSegment * ParentSegment; - bool bFirstFrameInside; // used to speed research - bool bPreviousTimecodeIsSet; - bool bTimecodeScaleIsSet; - bool bSilentTracksUsed; + uint64 MinTimecode, MaxTimecode, PreviousTimecode; + int64 TimecodeScale; - /*! - \note method used internally - */ - bool AddFrameInternal(const KaxTrackEntry & track, uint64 timecode, DataBuffer & buffer, KaxBlockGroup * & MyNewBlock, const KaxBlockGroup * PastBlock, const KaxBlockGroup * ForwBlock, LacingType lacing); + bool bFirstFrameInside; // used to speed research + bool bPreviousTimecodeIsSet; + bool bTimecodeScaleIsSet; + bool bSilentTracksUsed; + + /*! + \note method used internally + */ + bool AddFrameInternal(const KaxTrackEntry & track, uint64 timecode, DataBuffer & buffer, KaxBlockGroup * & MyNewBlock, const KaxBlockGroup * PastBlock, const KaxBlockGroup * ForwBlock, LacingType lacing); }; END_LIBMATROSKA_NAMESPACE diff --git a/matroska/KaxClusterData.h b/matroska/KaxClusterData.h index 1dc18b9..7223222 100644 --- a/matroska/KaxClusterData.h +++ b/matroska/KaxClusterData.h @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -28,9 +28,9 @@ **********************************************************************/ /*! - \file - \version \$Id: KaxClusterData.h,v 1.9 2004/04/21 19:50:10 mosu Exp $ - \author Steve Lhomme + \file + \version \$Id: KaxClusterData.h,v 1.9 2004/04/21 19:50:10 mosu Exp $ + \author Steve Lhomme */ #ifndef LIBMATROSKA_CLUSTER_DATA_H #define LIBMATROSKA_CLUSTER_DATA_H diff --git a/matroska/KaxConfig.h b/matroska/KaxConfig.h index cad0fee..d8ae024 100644 --- a/matroska/KaxConfig.h +++ b/matroska/KaxConfig.h @@ -9,12 +9,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -26,10 +26,10 @@ **********************************************************************/ /*! - \file - \version \$Id: KaxConfig.h,v 1.7 2004/04/14 23:26:17 robux4 Exp $ - \author Steve Lhomme - \author Moritz Bunkus + \file + \version \$Id: KaxConfig.h,v 1.7 2004/04/14 23:26:17 robux4 Exp $ + \author Steve Lhomme + \author Moritz Bunkus */ #ifndef LIBMATROSKA_CONFIG_H #define LIBMATROSKA_CONFIG_H diff --git a/matroska/KaxContentEncoding.h b/matroska/KaxContentEncoding.h index 6228005..cd8b7ad 100644 --- a/matroska/KaxContentEncoding.h +++ b/matroska/KaxContentEncoding.h @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -28,9 +28,9 @@ **********************************************************************/ /*! - \file - \version \$Id: KaxContentEncoding.h,v 1.7 2004/04/14 23:26:17 robux4 Exp $ - \author Steve Lhomme + \file + \version \$Id: KaxContentEncoding.h,v 1.7 2004/04/14 23:26:17 robux4 Exp $ + \author Steve Lhomme */ #ifndef LIBMATROSKA_CONTENT_ENCODING_H #define LIBMATROSKA_CONTENT_ENCODING_H diff --git a/matroska/KaxContexts.h b/matroska/KaxContexts.h index fc1457f..d5feb1e 100644 --- a/matroska/KaxContexts.h +++ b/matroska/KaxContexts.h @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -28,9 +28,9 @@ **********************************************************************/ /*! - \file - \version \$Id$ - \author Steve Lhomme + \file + \version \$Id$ + \author Steve Lhomme */ #ifndef LIBMATROSKA_CONTEXTS_H #define LIBMATROSKA_CONTEXTS_H diff --git a/matroska/KaxCues.h b/matroska/KaxCues.h index 4f852ac..c3f214b 100644 --- a/matroska/KaxCues.h +++ b/matroska/KaxCues.h @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -28,9 +28,9 @@ **********************************************************************/ /*! - \file - \version \$Id: KaxCues.h,v 1.7 2004/04/14 23:26:17 robux4 Exp $ - \author Steve Lhomme + \file + \version \$Id: KaxCues.h,v 1.7 2004/04/14 23:26:17 robux4 Exp $ + \author Steve Lhomme */ #ifndef LIBMATROSKA_CUES_H #define LIBMATROSKA_CUES_H @@ -48,42 +48,42 @@ START_LIBMATROSKA_NAMESPACE class KaxCuePoint; DECLARE_MKX_MASTER(KaxCues) - public: - ~KaxCues(); + public: + ~KaxCues(); - //bool AddBlockGroup(const KaxBlockGroup & BlockReference); // deprecated - bool AddBlockBlob(const KaxBlockBlob & BlockReference); + //bool AddBlockGroup(const KaxBlockGroup & BlockReference); // deprecated + bool AddBlockBlob(const KaxBlockBlob & BlockReference); - /*! - \brief Indicate that the position for this Block is set - */ - void PositionSet(const KaxBlockGroup & BlockReference); - void PositionSet(const KaxBlockBlob & BlockReference); + /*! + \brief Indicate that the position for this Block is set + */ + void PositionSet(const KaxBlockGroup & BlockReference); + void PositionSet(const KaxBlockBlob & BlockReference); - /*! - \brief override to sort by timecode/track - */ - filepos_t Render(IOCallback & output, bool bSaveDefault = false) { - Sort(); - return EbmlMaster::Render(output, bSaveDefault); - } + /*! + \brief override to sort by timecode/track + */ + filepos_t Render(IOCallback & output, bool bSaveDefault = false) { + Sort(); + return EbmlMaster::Render(output, bSaveDefault); + } - uint64 GetTimecodePosition(uint64 aTimecode) const; - const KaxCuePoint * GetTimecodePoint(uint64 aTimecode) const; + uint64 GetTimecodePosition(uint64 aTimecode) const; + const KaxCuePoint * GetTimecodePoint(uint64 aTimecode) const; - void SetGlobalTimecodeScale(uint64 aGlobalTimecodeScale) { - mGlobalTimecodeScale = aGlobalTimecodeScale; - bGlobalTimecodeScaleIsSet = true; - } - uint64 GlobalTimecodeScale() const { - assert(bGlobalTimecodeScaleIsSet); - return mGlobalTimecodeScale; - } + void SetGlobalTimecodeScale(uint64 aGlobalTimecodeScale) { + mGlobalTimecodeScale = aGlobalTimecodeScale; + bGlobalTimecodeScaleIsSet = true; + } + uint64 GlobalTimecodeScale() const { + assert(bGlobalTimecodeScaleIsSet); + return mGlobalTimecodeScale; + } - protected: - std::vector myTempReferences; - bool bGlobalTimecodeScaleIsSet; - uint64 mGlobalTimecodeScale; + protected: + std::vector myTempReferences; + bool bGlobalTimecodeScaleIsSet; + uint64 mGlobalTimecodeScale; }; END_LIBMATROSKA_NAMESPACE diff --git a/matroska/KaxCuesData.h b/matroska/KaxCuesData.h index a15306b..4d16b67 100644 --- a/matroska/KaxCuesData.h +++ b/matroska/KaxCuesData.h @@ -9,12 +9,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -26,9 +26,9 @@ **********************************************************************/ /*! - \file - \version \$Id: KaxCuesData.h,v 1.8 2004/04/14 23:26:17 robux4 Exp $ - \author Steve Lhomme + \file + \version \$Id: KaxCuesData.h,v 1.8 2004/04/14 23:26:17 robux4 Exp $ + \author Steve Lhomme */ #ifndef LIBMATROSKA_CUES_DATA_H #define LIBMATROSKA_CUES_DATA_H @@ -48,27 +48,27 @@ class KaxCueTrackPositions; class KaxInternalBlock; DECLARE_MKX_MASTER(KaxCuePoint) - public: - void PositionSet(const KaxBlockGroup & BlockReference, uint64 GlobalTimecodeScale); - void PositionSet(const KaxBlockBlob & BlobReference, uint64 GlobalTimecodeScale); + public: + void PositionSet(const KaxBlockGroup & BlockReference, uint64 GlobalTimecodeScale); + void PositionSet(const KaxBlockBlob & BlobReference, uint64 GlobalTimecodeScale); - virtual bool IsSmallerThan(const EbmlElement *Cmp) const; + virtual bool IsSmallerThan(const EbmlElement *Cmp) const; - const KaxCueTrackPositions * GetSeekPosition() const; - bool Timecode(uint64 & aTimecode, uint64 GlobalTimecodeScale) const; + const KaxCueTrackPositions * GetSeekPosition() const; + bool Timecode(uint64 & aTimecode, uint64 GlobalTimecodeScale) const; }; DECLARE_MKX_MASTER(KaxCueTrackPositions) - public: - uint64 ClusterPosition() const; - uint16 TrackNumber() const; + public: + uint64 ClusterPosition() const; + uint16 TrackNumber() const; }; #if MATROSKA_VERSION >= 2 DECLARE_MKX_MASTER(KaxCueReference) - public: - void AddReference(const KaxBlockGroup & BlockReferenced, uint64 GlobalTimecodeScale); - void AddReference(const KaxBlockBlob & BlockReferenced, uint64 GlobalTimecodeScale); + public: + void AddReference(const KaxBlockGroup & BlockReferenced, uint64 GlobalTimecodeScale); + void AddReference(const KaxBlockBlob & BlockReferenced, uint64 GlobalTimecodeScale); }; #endif // MATROSKA_VERSION diff --git a/matroska/KaxDefines.h b/matroska/KaxDefines.h index fbe69cb..d566c6a 100644 --- a/matroska/KaxDefines.h +++ b/matroska/KaxDefines.h @@ -9,12 +9,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -26,9 +26,9 @@ **********************************************************************/ /*! - \file - \version \$Id$ - \author Steve Lhomme + \file + \version \$Id$ + \author Steve Lhomme */ #ifndef LIBMATROSKA_DEFINES_H #define LIBMATROSKA_DEFINES_H diff --git a/matroska/KaxInfo.h b/matroska/KaxInfo.h index 896c721..72cba34 100644 --- a/matroska/KaxInfo.h +++ b/matroska/KaxInfo.h @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -28,9 +28,9 @@ **********************************************************************/ /*! - \file - \version \$Id: KaxInfo.h,v 1.7 2004/04/14 23:26:17 robux4 Exp $ - \author Steve Lhomme + \file + \version \$Id: KaxInfo.h,v 1.7 2004/04/14 23:26:17 robux4 Exp $ + \author Steve Lhomme */ #ifndef LIBMATROSKA_INFO_H #define LIBMATROSKA_INFO_H diff --git a/matroska/KaxInfoData.h b/matroska/KaxInfoData.h index 3831858..8c6d6e4 100644 --- a/matroska/KaxInfoData.h +++ b/matroska/KaxInfoData.h @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -28,11 +28,11 @@ **********************************************************************/ /*! - \file - \version \$Id$ - \author Steve Lhomme - \author John Cannon - \author Moritz Bunkus + \file + \version \$Id$ + \author Steve Lhomme + \author John Cannon + \author Moritz Bunkus */ #ifndef LIBMATROSKA_INFO_DATA_H #define LIBMATROSKA_INFO_DATA_H @@ -53,20 +53,20 @@ START_LIBMATROSKA_NAMESPACE DECLARE_MKX_CONTEXT(KaxPrevUID); class MATROSKA_DLL_API KaxPrevUID : public KaxSegmentUID { - public: - KaxPrevUID(EBML_EXTRA_PARAM); - KaxPrevUID(const KaxPrevUID & ElementToClone) :KaxSegmentUID(ElementToClone){} - virtual bool ValidateSize() const { return IsFiniteSize() && (GetSize() == 16);} + public: + KaxPrevUID(EBML_EXTRA_PARAM); + KaxPrevUID(const KaxPrevUID & ElementToClone) :KaxSegmentUID(ElementToClone){} + virtual bool ValidateSize() const { return IsFiniteSize() && (GetSize() == 16);} EBML_CONCRETE_CLASS(KaxPrevUID) }; DECLARE_MKX_CONTEXT(KaxNextUID); class MATROSKA_DLL_API KaxNextUID : public KaxSegmentUID { - public: - KaxNextUID(EBML_EXTRA_PARAM); - KaxNextUID(const KaxNextUID & ElementToClone) :KaxSegmentUID(ElementToClone){} - virtual bool ValidateSize() const { return IsFiniteSize() && (GetSize() == 16);} + public: + KaxNextUID(EBML_EXTRA_PARAM); + KaxNextUID(const KaxNextUID & ElementToClone) :KaxSegmentUID(ElementToClone){} + virtual bool ValidateSize() const { return IsFiniteSize() && (GetSize() == 16);} EBML_CONCRETE_CLASS(KaxNextUID) }; diff --git a/matroska/KaxSeekHead.h b/matroska/KaxSeekHead.h index 392c081..bae3a3a 100644 --- a/matroska/KaxSeekHead.h +++ b/matroska/KaxSeekHead.h @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -28,9 +28,9 @@ **********************************************************************/ /*! - \file - \version \$Id$ - \author Steve Lhomme + \file + \version \$Id$ + \author Steve Lhomme */ #ifndef LIBMATROSKA_SEEK_HEAD_H #define LIBMATROSKA_SEEK_HEAD_H @@ -48,22 +48,22 @@ START_LIBMATROSKA_NAMESPACE class KaxSegment; DECLARE_MKX_MASTER(KaxSeek) - public: - int64 Location() const; - bool IsEbmlId(const EbmlId & aId) const; - bool IsEbmlId(const KaxSeek & aPoint) const; + public: + int64 Location() const; + bool IsEbmlId(const EbmlId & aId) const; + bool IsEbmlId(const KaxSeek & aPoint) const; }; DECLARE_MKX_MASTER(KaxSeekHead) - public: - /*! - \brief add an element to index in the Meta Seek data - \note the element should already be written in the file - */ - void IndexThis(const EbmlElement & aElt, const KaxSegment & ParentSegment); + public: + /*! + \brief add an element to index in the Meta Seek data + \note the element should already be written in the file + */ + void IndexThis(const EbmlElement & aElt, const KaxSegment & ParentSegment); - KaxSeek * FindFirstOf(const EbmlCallbacks & Callbacks) const; - KaxSeek * FindNextOf(const KaxSeek &aPrev) const; + KaxSeek * FindFirstOf(const EbmlCallbacks & Callbacks) const; + KaxSeek * FindNextOf(const KaxSeek &aPrev) const; }; END_LIBMATROSKA_NAMESPACE diff --git a/matroska/KaxSegment.h b/matroska/KaxSegment.h index 2ab6e98..471f3fd 100644 --- a/matroska/KaxSegment.h +++ b/matroska/KaxSegment.h @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -28,9 +28,9 @@ **********************************************************************/ /*! - \file - \version \$Id: KaxSegment.h,v 1.8 2004/04/14 23:26:17 robux4 Exp $ - \author Steve Lhomme + \file + \version \$Id: KaxSegment.h,v 1.8 2004/04/14 23:26:17 robux4 Exp $ + \author Steve Lhomme */ #ifndef LIBMATROSKA_SEGMENT_H #define LIBMATROSKA_SEGMENT_H @@ -44,17 +44,17 @@ using namespace LIBEBML_NAMESPACE; START_LIBMATROSKA_NAMESPACE DECLARE_MKX_MASTER_CONS(KaxSegment) - public: - /*! - \brief give the position of the element in the segment - */ - uint64 GetRelativePosition(const EbmlElement & Elt) const; - uint64 GetRelativePosition(uint64 aGlobalPosition) const; + public: + /*! + \brief give the position of the element in the segment + */ + uint64 GetRelativePosition(const EbmlElement & Elt) const; + uint64 GetRelativePosition(uint64 aGlobalPosition) const; - /*! - \brief give the position of the element in the file - */ - uint64 GetGlobalPosition(uint64 aRelativePosition) const; + /*! + \brief give the position of the element in the file + */ + uint64 GetGlobalPosition(uint64 aRelativePosition) const; }; END_LIBMATROSKA_NAMESPACE diff --git a/matroska/KaxSemantic.h b/matroska/KaxSemantic.h index 9f6dc7f..c98ea05 100644 --- a/matroska/KaxSemantic.h +++ b/matroska/KaxSemantic.h @@ -1,23 +1,23 @@ /********************************************************************** ** DO NOT EDIT, GENERATED WITH DATA2LIB -** +** ** libmatroska : parse Matroska files, see http://www.matroska.org/ -** +** ** Copyright (c) 2002-2010, Matroska (non-profit organisation) ** All rights reserved. -** +** ** This file is part of libmatroska. ** ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -49,7 +49,7 @@ START_LIBMATROSKA_NAMESPACE DECLARE_MKX_BINARY (KaxSeekID) public: - virtual bool ValidateSize() const {return IsFiniteSize() && GetSize() <= 4;} + virtual bool ValidateSize() const {return IsFiniteSize() && GetSize() <= 4;} }; DECLARE_MKX_UINTEGER(KaxSeekPosition) @@ -62,10 +62,10 @@ DECLARE_MKX_MASTER(KaxInfo) DECLARE_MKX_BINARY (KaxSegmentUID) #if defined(HAVE_EBML2) || defined(HAS_EBML2) public: - KaxSegmentUID(EBML_DEF_CONS EBML_DEF_SEP EBML_EXTRA_PARAM); + KaxSegmentUID(EBML_DEF_CONS EBML_DEF_SEP EBML_EXTRA_PARAM); #endif public: - virtual bool ValidateSize() const {return IsFiniteSize() && GetSize() == 16;} + virtual bool ValidateSize() const {return IsFiniteSize() && GetSize() == 16;} }; DECLARE_MKX_UNISTRING(KaxSegmentFilename) @@ -79,7 +79,7 @@ DECLARE_MKX_UNISTRING(KaxNextFilename) DECLARE_MKX_BINARY (KaxSegmentFamily) public: - virtual bool ValidateSize() const {return IsFiniteSize() && GetSize() == 16;} + virtual bool ValidateSize() const {return IsFiniteSize() && GetSize() == 16;} }; DECLARE_MKX_MASTER(KaxChapterTranslate) @@ -152,7 +152,7 @@ DECLARE_MKX_UINTEGER(KaxReferencePriority) #if MATROSKA_VERSION >= 2 DECLARE_MKX_SINTEGER(KaxReferenceVirtual) public: - filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); + filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); }; DECLARE_MKX_BINARY (KaxCodecState) @@ -176,22 +176,22 @@ DECLARE_MKX_UINTEGER(KaxSliceLaceNumber) #if MATROSKA_VERSION >= 2 DECLARE_MKX_UINTEGER(KaxSliceFrameNumber) public: - filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); + filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); }; DECLARE_MKX_UINTEGER(KaxSliceBlockAddID) public: - filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); + filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); }; DECLARE_MKX_UINTEGER(KaxSliceDelay) public: - filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); + filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); }; DECLARE_MKX_UINTEGER(KaxSliceDuration) public: - filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); + filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); }; DECLARE_MKX_MASTER(KaxReferenceFrame) @@ -206,7 +206,7 @@ DECLARE_MKX_UINTEGER(KaxReferenceTimeCode) DECLARE_MKX_BINARY (KaxEncryptedBlock) public: - filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); + filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); }; #endif @@ -253,13 +253,13 @@ DECLARE_MKX_UINTEGER(KaxTrackDefaultDecodedFieldDuration) DECLARE_MKX_FLOAT(KaxTrackTimecodeScale) public: - filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); + filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); }; #if MATROSKA_VERSION >= 2 DECLARE_MKX_SINTEGER(KaxTrackOffset) public: - filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); + filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); }; #endif @@ -287,17 +287,17 @@ DECLARE_MKX_UINTEGER(KaxTrackAttachmentLink) #if MATROSKA_VERSION >= 2 DECLARE_MKX_UNISTRING(KaxCodecSettings) public: - filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); + filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); }; DECLARE_MKX_STRING(KaxCodecInfoURL) public: - filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); + filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); }; DECLARE_MKX_STRING(KaxCodecDownloadURL) public: - filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); + filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); }; DECLARE_MKX_UINTEGER(KaxCodecDecodeAll) @@ -344,7 +344,7 @@ DECLARE_MKX_UINTEGER(KaxVideoAlphaMode) DECLARE_MKX_UINTEGER(KaxOldStereoMode) public: - filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); + filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); }; #endif @@ -380,18 +380,18 @@ DECLARE_MKX_UINTEGER(KaxVideoAspectRatio) DECLARE_MKX_BINARY (KaxVideoColourSpace) public: - virtual bool ValidateSize() const {return IsFiniteSize() && GetSize() == 4;} + virtual bool ValidateSize() const {return IsFiniteSize() && GetSize() == 4;} }; #if MATROSKA_VERSION >= 2 DECLARE_MKX_FLOAT(KaxVideoGamma) public: - filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); + filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); }; DECLARE_MKX_FLOAT(KaxVideoFrameRate) public: - filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); + filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); }; #endif @@ -411,7 +411,7 @@ DECLARE_MKX_UINTEGER(KaxAudioChannels) #if MATROSKA_VERSION >= 2 DECLARE_MKX_BINARY (KaxAudioPosition) public: - filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); + filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); }; #endif @@ -449,7 +449,7 @@ DECLARE_MKX_UINTEGER(KaxTrickTrackUID) DECLARE_MKX_BINARY (KaxTrickTrackSegmentUID) public: - virtual bool ValidateSize() const {return IsFiniteSize() && GetSize() == 16;} + virtual bool ValidateSize() const {return IsFiniteSize() && GetSize() == 16;} }; DECLARE_MKX_UINTEGER(KaxTrickTrackFlag) @@ -460,7 +460,7 @@ DECLARE_MKX_UINTEGER(KaxTrickMasterTrackUID) DECLARE_MKX_BINARY (KaxTrickMasterTrackSegmentUID) public: - virtual bool ValidateSize() const {return IsFiniteSize() && GetSize() == 16;} + virtual bool ValidateSize() const {return IsFiniteSize() && GetSize() == 16;} }; #endif @@ -542,17 +542,17 @@ DECLARE_MKX_UINTEGER(KaxCueRefTime) DECLARE_MKX_UINTEGER(KaxCueRefCluster) public: - filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); + filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); }; DECLARE_MKX_UINTEGER(KaxCueRefNumber) public: - filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); + filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); }; DECLARE_MKX_UINTEGER(KaxCueRefCodecState) public: - filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); + filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); }; #endif @@ -582,7 +582,7 @@ DECLARE_MKX_UINTEGER(KaxFileUID) #if MATROSKA_VERSION >= 2 DECLARE_MKX_BINARY (KaxFileReferral) public: - filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); + filepos_t RenderData(IOCallback & output, bool bForceRender, bool bSaveDefault); }; DECLARE_MKX_UINTEGER(KaxFileUsedStartTime) @@ -638,7 +638,7 @@ DECLARE_MKX_UINTEGER(KaxChapterFlagEnabled) DECLARE_MKX_BINARY (KaxChapterSegmentUID) public: - virtual bool ValidateSize() const {return IsFiniteSize() && GetSize() == 16;} + virtual bool ValidateSize() const {return IsFiniteSize() && GetSize() == 16;} }; DECLARE_MKX_UINTEGER(KaxChapterSegmentEditionUID) diff --git a/matroska/KaxTag.h b/matroska/KaxTag.h index 8940f6f..32da8bc 100644 --- a/matroska/KaxTag.h +++ b/matroska/KaxTag.h @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -28,9 +28,9 @@ **********************************************************************/ /*! - \file - \version \$Id$ - \author Steve Lhomme + \file + \version \$Id$ + \author Steve Lhomme */ #ifndef LIBMATROSKA_TAG_H #define LIBMATROSKA_TAG_H diff --git a/matroska/KaxTags.h b/matroska/KaxTags.h index af9ff6f..30ed65e 100644 --- a/matroska/KaxTags.h +++ b/matroska/KaxTags.h @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -28,9 +28,9 @@ **********************************************************************/ /*! - \file - \version \$Id: KaxTags.h,v 1.7 2004/04/14 23:26:17 robux4 Exp $ - \author Steve Lhomme + \file + \version \$Id: KaxTags.h,v 1.7 2004/04/14 23:26:17 robux4 Exp $ + \author Steve Lhomme */ #ifndef LIBMATROSKA_TAGS_H #define LIBMATROSKA_TAGS_H diff --git a/matroska/KaxTrackAudio.h b/matroska/KaxTrackAudio.h index fa3cc98..b46381f 100644 --- a/matroska/KaxTrackAudio.h +++ b/matroska/KaxTrackAudio.h @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -28,9 +28,9 @@ **********************************************************************/ /*! - \file - \version \$Id: KaxTrackAudio.h,v 1.11 2004/04/14 23:26:17 robux4 Exp $ - \author Steve Lhomme + \file + \version \$Id: KaxTrackAudio.h,v 1.11 2004/04/14 23:26:17 robux4 Exp $ + \author Steve Lhomme */ #ifndef LIBMATROSKA_TRACK_AUDIO_H #define LIBMATROSKA_TRACK_AUDIO_H diff --git a/matroska/KaxTrackEntryData.h b/matroska/KaxTrackEntryData.h index 438f5a6..d5e55f0 100644 --- a/matroska/KaxTrackEntryData.h +++ b/matroska/KaxTrackEntryData.h @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -28,9 +28,9 @@ **********************************************************************/ /*! - \file - \version \$Id: KaxTrackEntryData.h,v 1.9 2004/04/14 23:26:17 robux4 Exp $ - \author Steve Lhomme + \file + \version \$Id: KaxTrackEntryData.h,v 1.9 2004/04/14 23:26:17 robux4 Exp $ + \author Steve Lhomme */ #ifndef LIBMATROSKA_TRACK_ENTRY_DATA_H #define LIBMATROSKA_TRACK_ENTRY_DATA_H diff --git a/matroska/KaxTrackVideo.h b/matroska/KaxTrackVideo.h index 4f8407e..2444eec 100644 --- a/matroska/KaxTrackVideo.h +++ b/matroska/KaxTrackVideo.h @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -28,9 +28,9 @@ **********************************************************************/ /*! - \file - \version \$Id$ - \author Steve Lhomme + \file + \version \$Id$ + \author Steve Lhomme */ #ifndef LIBMATROSKA_TRACK_VIDEO_H #define LIBMATROSKA_TRACK_VIDEO_H diff --git a/matroska/KaxTracks.h b/matroska/KaxTracks.h index 0b1a0c1..2bcab64 100644 --- a/matroska/KaxTracks.h +++ b/matroska/KaxTracks.h @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -28,9 +28,9 @@ **********************************************************************/ /*! - \file - \version \$Id: KaxTracks.h,v 1.7 2004/04/14 23:26:17 robux4 Exp $ - \author Steve Lhomme + \file + \version \$Id: KaxTracks.h,v 1.7 2004/04/14 23:26:17 robux4 Exp $ + \author Steve Lhomme */ #ifndef LIBMATROSKA_TRACKS_H #define LIBMATROSKA_TRACKS_H @@ -46,31 +46,31 @@ using namespace LIBEBML_NAMESPACE; START_LIBMATROSKA_NAMESPACE DECLARE_MKX_MASTER(KaxTrackEntry) - public: - EbmlUInteger & TrackNumber() const { return *(static_cast(FindElt(EBML_INFO(KaxTrackNumber)))); } + public: + EbmlUInteger & TrackNumber() const { return *(static_cast(FindElt(EBML_INFO(KaxTrackNumber)))); } - void EnableLacing(bool bEnable = true); + void EnableLacing(bool bEnable = true); - /*! - \note lacing set by default - */ - inline bool LacingEnabled() const { - KaxTrackFlagLacing * myLacing = static_cast(FindFirstElt(EBML_INFO(KaxTrackFlagLacing))); - return((myLacing == NULL) || (uint8(*myLacing) != 0)); - } + /*! + \note lacing set by default + */ + inline bool LacingEnabled() const { + KaxTrackFlagLacing * myLacing = static_cast(FindFirstElt(EBML_INFO(KaxTrackFlagLacing))); + return((myLacing == NULL) || (uint8(*myLacing) != 0)); + } - void SetGlobalTimecodeScale(uint64 aGlobalTimecodeScale) { - mGlobalTimecodeScale = aGlobalTimecodeScale; - bGlobalTimecodeScaleIsSet = true; - } - uint64 GlobalTimecodeScale() const { - assert(bGlobalTimecodeScaleIsSet); - return mGlobalTimecodeScale; - } + void SetGlobalTimecodeScale(uint64 aGlobalTimecodeScale) { + mGlobalTimecodeScale = aGlobalTimecodeScale; + bGlobalTimecodeScaleIsSet = true; + } + uint64 GlobalTimecodeScale() const { + assert(bGlobalTimecodeScaleIsSet); + return mGlobalTimecodeScale; + } - protected: - bool bGlobalTimecodeScaleIsSet; - uint64 mGlobalTimecodeScale; + protected: + bool bGlobalTimecodeScaleIsSet; + uint64 mGlobalTimecodeScale; }; END_LIBMATROSKA_NAMESPACE diff --git a/matroska/KaxTypes.h b/matroska/KaxTypes.h index 11f34ec..5556357 100644 --- a/matroska/KaxTypes.h +++ b/matroska/KaxTypes.h @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -28,8 +28,8 @@ **********************************************************************/ /*! - \file - \version \$Id: KaxTypes.h,v 1.4 2004/04/14 23:26:17 robux4 Exp $ + \file + \version \$Id: KaxTypes.h,v 1.4 2004/04/14 23:26:17 robux4 Exp $ */ #ifndef LIBMATROSKA_TYPES_H #define LIBMATROSKA_TYPES_H @@ -41,17 +41,17 @@ START_LIBMATROSKA_NAMESPACE enum LacingType { - LACING_NONE = 0, - LACING_XIPH, - LACING_FIXED, - LACING_EBML, - LACING_AUTO + LACING_NONE = 0, + LACING_XIPH, + LACING_FIXED, + LACING_EBML, + LACING_AUTO }; enum BlockBlobType { - BLOCK_BLOB_NO_SIMPLE = 0, - BLOCK_BLOB_SIMPLE_AUTO, - BLOCK_BLOB_ALWAYS_SIMPLE, + BLOCK_BLOB_NO_SIMPLE = 0, + BLOCK_BLOB_SIMPLE_AUTO, + BLOCK_BLOB_ALWAYS_SIMPLE, }; END_LIBMATROSKA_NAMESPACE diff --git a/matroska/KaxVersion.h b/matroska/KaxVersion.h index f6d8bd9..2d0fb4c 100644 --- a/matroska/KaxVersion.h +++ b/matroska/KaxVersion.h @@ -26,9 +26,9 @@ **********************************************************************/ /*! - \file - \version \$Id: KaxVersion.h,v 1.13 2004/04/23 16:46:07 mosu Exp $ - \author Steve Lhomme + \file + \version \$Id: KaxVersion.h,v 1.13 2004/04/23 16:46:07 mosu Exp $ + \author Steve Lhomme */ #ifndef LIBMATROSKA_VERSION_H #define LIBMATROSKA_VERSION_H @@ -46,7 +46,7 @@ extern const std::string KaxCodeVersion; extern const std::string KaxCodeDate; /*! - \todo Improve the CRC/ECC system (backward and forward possible ?) to fit streaming/live writing/simple reading + \todo Improve the CRC/ECC system (backward and forward possible ?) to fit streaming/live writing/simple reading */ END_LIBMATROSKA_NAMESPACE diff --git a/matroska/c/libmatroska.h b/matroska/c/libmatroska.h index ec00fc1..53eb668 100644 --- a/matroska/c/libmatroska.h +++ b/matroska/c/libmatroska.h @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA diff --git a/matroska/c/libmatroska_t.h b/matroska/c/libmatroska_t.h index 689b7df..1772933 100644 --- a/matroska/c/libmatroska_t.h +++ b/matroska/c/libmatroska_t.h @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -69,7 +69,7 @@ typedef enum track_type { \note this should be used by the libmatroska internals */ typedef enum { - error_null_pointer ///< NULL pointer where something else is expected + error_null_pointer ///< NULL pointer where something else is expected } matroska_error_t; typedef void *matroska_stream; diff --git a/src/FileKax.cpp b/src/FileKax.cpp index 5a5bb90..91cae1e 100644 --- a/src/FileKax.cpp +++ b/src/FileKax.cpp @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -60,9 +60,9 @@ FileMatroska::FileMatroska(IOCallback & output) { #ifdef OLD myStreamInfo.MainHeaderSize = TypeHeader::default_size() + - ActualHeader::default_size() + - ExtendedInfo::default_size() + - ContentInfo::default_size(); + ActualHeader::default_size() + + ExtendedInfo::default_size() + + ContentInfo::default_size(); myStreamInfo.TrackEntrySize = Track::default_size(); myStreamInfo.BlockHeadSize = BLOCK_HEADER_SIZE; myStreamInfo.ClusterHeadSize = CLUSTER_HEADER_SIZE; @@ -73,9 +73,9 @@ FileMatroska::FileMatroska(IOCallback & output) FileMatroska::~FileMatroska() { // if (myCurrCluster != NULL) -// throw 0; // there are some data left to write +// throw 0; // there are some data left to write // if (myCurrReadCluster != NULL || myCurrReadBlock != NULL) -// throw 0; // there are some data left to write +// throw 0; // there are some data left to write } #ifdef OLD @@ -100,7 +100,7 @@ void FileMatroska::Close(const uint32 aTimeLength) uint32 track_entries_size = 0; for (size_t i=0; idefault_size(); + track_entries_size += myTracks[i]->default_size(); } myStreamInfo.TrackEntriesSize = track_entries_size; @@ -109,7 +109,7 @@ void FileMatroska::Close(const uint32 aTimeLength) for (i=0; idefault_size(); - } + uint32 track_entries_size = 0; + for (size_t i=0; idefault_size(); + } - std::string aStr = LIB_NAME; - aStr += " "; - aStr += VERSION; - myStreamInfo.EncoderLib = aStr; + std::string aStr = LIB_NAME; + aStr += " "; + aStr += VERSION; + myStreamInfo.EncoderLib = aStr; - myStreamInfo.EncoderApp = aEncoderApp; + myStreamInfo.EncoderApp = aEncoderApp; - myStreamInfo.TrackEntryPosition = 0 + myStreamInfo.MainHeaderSize; - myStreamInfo.TrackEntriesSize = myTracks.size() * myStreamInfo.TrackEntrySize; + myStreamInfo.TrackEntryPosition = 0 + myStreamInfo.MainHeaderSize; + myStreamInfo.TrackEntriesSize = myTracks.size() * myStreamInfo.TrackEntrySize; - myStreamInfo.CodecEntryPosition = myStreamInfo.MainHeaderSize + myStreamInfo.TrackEntriesSize; - myStreamInfo.CodecEntrySize = 4; - for (i=0; iCodecSize(); - } + myStreamInfo.CodecEntryPosition = myStreamInfo.MainHeaderSize + myStreamInfo.TrackEntriesSize; + myStreamInfo.CodecEntrySize = 4; + for (i=0; iCodecSize(); + } - // Main Header - filepos_t result = myMainHeader.Render(myFile, myStreamInfo); + // Main Header + filepos_t result = myMainHeader.Render(myFile, myStreamInfo); - // Track Entries - for (i=0; iRenderEntry(myFile, i+1); - } - myStreamInfo.ClusterPosition = myStreamInfo.CodecEntryPosition + myStreamInfo.CodecEntrySize; + // Track Entries + for (i=0; iRenderEntry(myFile, i+1); + } + myStreamInfo.ClusterPosition = myStreamInfo.CodecEntryPosition + myStreamInfo.CodecEntrySize; - // Codec Header - result = CodecHeader::Render(myFile, myTracks); + // Codec Header + result = CodecHeader::Render(myFile, myTracks); - return result; + return result; } catch (exception & Ex) { - throw Ex; + throw Ex; } } @@ -176,8 +176,8 @@ Track * FileMatroska::CreateTrack(const track_type aType) { for (size_t i=0; iAddFrame(aTimecode, aFrame, aFrameSize, aKeyFrame, aBFrame)) - { - while (!aTrack->SerialiseBlock(myCurrWriteCluster)) - { - /// \todo handle errors - uint32 aNbBlock; - myStreamInfo.ClusterSize += myCurrWriteCluster.Render(myFile, aNbBlock); - myStreamInfo.NumberBlock += aNbBlock; - myCurrWriteCluster.Flush(); - } - } - return true; - } - return false; + // make sure we know that track + if (IsMyTrack(aTrack)) + { + // pass the cluster to the track + // handle the creation of a new cluster if needed + if (aTrack->AddFrame(aTimecode, aFrame, aFrameSize, aKeyFrame, aBFrame)) + { + while (!aTrack->SerialiseBlock(myCurrWriteCluster)) + { + /// \todo handle errors + uint32 aNbBlock; + myStreamInfo.ClusterSize += myCurrWriteCluster.Render(myFile, aNbBlock); + myStreamInfo.NumberBlock += aNbBlock; + myCurrWriteCluster.Flush(); + } + } + return true; + } + return false; } catch (exception & Ex) { - throw Ex; + throw Ex; } } @@ -239,95 +239,95 @@ void FileMatroska::Flush() uint32 FileMatroska::ReadHead() { try { - uint32 result = myMainHeader.Read(myFile, myStreamInfo); + uint32 result = myMainHeader.Read(myFile, myStreamInfo); - return result; + return result; } catch (exception & Ex) { - throw Ex; + throw Ex; } } uint32 FileMatroska::ReadTracks() { try { - uint32 result = 0; + uint32 result = 0; - // seek to the start of the Track Entries - myFile.setFilePointer(myStreamInfo.TrackEntryPosition); - // get the number of Track Entries - uint8 TrackNumber = myStreamInfo.TrackEntriesSize / myStreamInfo.TrackEntrySize; - // read all the Track Entries - myTracks.clear(); - for (uint8 TrackIdx = 0; TrackIdx::const_iterator i = myTracks.begin(); i != myTracks.end(); i ++) { - if (*i == aTrack) - break; + if (*i == aTrack) + break; } if (i != myTracks.end()) - return true; + return true; else - return false; + return false; } void FileMatroska::SelectReadingTrack(Track * aTrack, bool select) { if (IsMyTrack(aTrack)) { - // here we have the right track - // check if it's not already selected - for (std::vector::iterator j = mySelectedTracks.begin(); - j != mySelectedTracks.end(); j ++) - { - if (*j == aTrack->TrackNumber()) - break; - } + // here we have the right track + // check if it's not already selected + for (std::vector::iterator j = mySelectedTracks.begin(); + j != mySelectedTracks.end(); j ++) + { + if (*j == aTrack->TrackNumber()) + break; + } - if (select && j == mySelectedTracks.end()) - mySelectedTracks.push_back(aTrack->TrackNumber()); - else if (!select && j != mySelectedTracks.end()) - mySelectedTracks.erase(j); + if (select && j == mySelectedTracks.end()) + mySelectedTracks.push_back(aTrack->TrackNumber()); + else if (!select && j != mySelectedTracks.end()) + mySelectedTracks.erase(j); - std::sort(mySelectedTracks.begin(), mySelectedTracks.end()); + std::sort(mySelectedTracks.begin(), mySelectedTracks.end()); } } @@ -335,13 +335,13 @@ inline bool FileMatroska::IsReadingTrack(const uint8 aTrackNumber) const { for (std::vector::const_iterator trackIdx = mySelectedTracks.begin(); trackIdx != mySelectedTracks.end() && *trackIdx < aTrackNumber; - trackIdx++) + trackIdx++) {} if (trackIdx == mySelectedTracks.end()) - return false; + return false; else - return true; + return true; } // @@ -350,7 +350,7 @@ void FileMatroska::Track_GetInfo(const Track * aTrack, TrackInfo & aTrackInfo) c { if (IsMyTrack(aTrack)) { - aTrack->GetInfo(aTrackInfo); + aTrack->GetInfo(aTrackInfo); } } @@ -360,7 +360,7 @@ void FileMatroska::Track_GetInfo_Audio(const Track * aTrack, TrackInfoAudio & aT { if (IsMyTrack(aTrack)) { - aTrack->GetInfoAudio(aTrackInfo); + aTrack->GetInfoAudio(aTrackInfo); } } @@ -368,7 +368,7 @@ void FileMatroska::Track_SetInfo_Audio(Track * aTrack, const TrackInfoAudio & aT { if (IsMyTrack(aTrack)) { - aTrack->SetInfoAudio(aTrackInfo); + aTrack->SetInfoAudio(aTrackInfo); } } @@ -378,7 +378,7 @@ void FileMatroska::Track_GetInfo_Video(const Track * aTrack, TrackInfoVideo & aT { if (IsMyTrack(aTrack)) { - aTrack->GetInfoVideo(aTrackInfo); + aTrack->GetInfoVideo(aTrackInfo); } } @@ -386,7 +386,7 @@ void FileMatroska::Track_SetInfo_Video(Track * aTrack, const TrackInfoVideo & aT { if (IsMyTrack(aTrack)) { - aTrack->SetInfoVideo(aTrackInfo); + aTrack->SetInfoVideo(aTrackInfo); } } @@ -394,45 +394,45 @@ void FileMatroska::Track_SetInfo_Video(Track * aTrack, const TrackInfoVideo & aT \todo exit when there is no Block left */ bool FileMatroska::ReadFrame(Track * & aTrack, uint32 & aTimecode, const binary * & aFrame, uint32 & aFrameSize, - bool & aKeyFrame, bool & aBFrame) + bool & aKeyFrame, bool & aBFrame) { if (myCurrReadBlockTrack == 0) { - do { - if (myReadBlockNumber >= myStreamInfo.NumberBlock) - { -// myReadBlockNumber = myStreamInfo.NumberBlock; - return false; - } + do { + if (myReadBlockNumber >= myStreamInfo.NumberBlock) + { +// myReadBlockNumber = myStreamInfo.NumberBlock; + return false; + } - // get the next frame in the file - if (!myCurrReadCluster.BlockLeft()) - { - myCurrReadCluster.Flush(); - try { - myCurrReadCluster.FindHead(myFile); - } - catch (exception & Ex) - { - return false; - } - } + // get the next frame in the file + if (!myCurrReadCluster.BlockLeft()) + { + myCurrReadCluster.Flush(); + try { + myCurrReadCluster.FindHead(myFile); + } + catch (exception & Ex) + { + return false; + } + } - myCurrReadCluster.GetBlock( myCurrReadBlock, myCurrReadBlockSize, myCurrReadBlockTrack ); - myReadBlockNumber++; - } while (!IsReadingTrack(myCurrReadBlockTrack)); + myCurrReadCluster.GetBlock( myCurrReadBlock, myCurrReadBlockSize, myCurrReadBlockTrack ); + myReadBlockNumber++; + } while (!IsReadingTrack(myCurrReadBlockTrack)); - // get the track associated (normally from myTracks) - aTrack = myTracks[myCurrReadBlockTrack-1]; - // get the next frame from the current block - aTrack->HandleBlock(myCurrReadBlock, myCurrReadBlockSize); + // get the track associated (normally from myTracks) + aTrack = myTracks[myCurrReadBlockTrack-1]; + // get the next frame from the current block + aTrack->HandleBlock(myCurrReadBlock, myCurrReadBlockSize); } else { - // get the track associated (normally from myTracks) - aTrack = myTracks[myCurrReadBlockTrack-1]; + // get the track associated (normally from myTracks) + aTrack = myTracks[myCurrReadBlockTrack-1]; } - + Frame * myReadFrame; aTrack->GetNextFrame(aTimecode, myReadFrame, aKeyFrame, aBFrame); aFrame = myReadFrame->buf(); @@ -440,8 +440,8 @@ bool FileMatroska::ReadFrame(Track * & aTrack, uint32 & aTimecode, const binary if (aTrack->NoFrameLeft()) { - aTrack->FlushBlock(); - myCurrReadBlockTrack = 0; + aTrack->FlushBlock(); + myCurrReadBlockTrack = 0; } return true; diff --git a/src/KaxAttached.cpp b/src/KaxAttached.cpp index b3fcdc0..cef09a1 100644 --- a/src/KaxAttached.cpp +++ b/src/KaxAttached.cpp @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -28,9 +28,9 @@ **********************************************************************/ /*! - \file - \version \$Id: KaxAttached.cpp 1202 2005-08-30 14:39:01Z robux4 $ - \author Steve Lhomme + \file + \version \$Id: KaxAttached.cpp 1202 2005-08-30 14:39:01Z robux4 $ + \author Steve Lhomme */ #include "matroska/KaxContexts.h" #include "matroska/KaxDefines.h" @@ -45,7 +45,7 @@ START_LIBMATROSKA_NAMESPACE KaxAttached::KaxAttached(EBML_EXTRA_DEF) :EbmlMaster(EBML_CLASS_SEMCONTEXT(KaxAttached) EBML_DEF_SEP EBML_EXTRA_CALL) { - SetSizeLength(2); // mandatory min size support (for easier updating) (2^(7*2)-2 = 16Ko) + SetSizeLength(2); // mandatory min size support (for easier updating) (2^(7*2)-2 = 16Ko) } END_LIBMATROSKA_NAMESPACE diff --git a/src/KaxAttachments.cpp b/src/KaxAttachments.cpp index 8739850..4f34565 100644 --- a/src/KaxAttachments.cpp +++ b/src/KaxAttachments.cpp @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -28,9 +28,9 @@ **********************************************************************/ /*! - \file - \version \$Id: KaxAttachments.cpp 640 2004-07-09 21:05:36Z mosu $ - \author Steve Lhomme + \file + \version \$Id: KaxAttachments.cpp 640 2004-07-09 21:05:36Z mosu $ + \author Steve Lhomme */ #include "matroska/KaxContexts.h" #include "matroska/KaxDefines.h" @@ -44,7 +44,7 @@ START_LIBMATROSKA_NAMESPACE KaxAttachments::KaxAttachments(EBML_EXTRA_DEF) :EbmlMaster(EBML_CLASS_SEMCONTEXT(KaxAttachments) EBML_DEF_SEP EBML_EXTRA_CALL) { - SetSizeLength(2); // mandatory min size support (for easier updating) (2^(7*2)-2 = 16Ko) + SetSizeLength(2); // mandatory min size support (for easier updating) (2^(7*2)-2 = 16Ko) } END_LIBMATROSKA_NAMESPACE diff --git a/src/KaxBlock.cpp b/src/KaxBlock.cpp index b98983b..bdc926d 100644 --- a/src/KaxBlock.cpp +++ b/src/KaxBlock.cpp @@ -9,12 +9,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -26,10 +26,10 @@ **********************************************************************/ /*! - \file - \version \$Id: KaxBlock.cpp 1265 2007-01-14 17:20:35Z mosu $ - \author Steve Lhomme - \author Julien Coloos + \file + \version \$Id: KaxBlock.cpp 1265 2007-01-14 17:20:35Z mosu $ + \author Steve Lhomme + \author Julien Coloos */ #include @@ -45,31 +45,31 @@ START_LIBMATROSKA_NAMESPACE DataBuffer * DataBuffer::Clone() { - binary *ClonedData = (binary *)malloc(mySize * sizeof(binary)); - assert(ClonedData != NULL); - memcpy(ClonedData, myBuffer ,mySize ); + binary *ClonedData = (binary *)malloc(mySize * sizeof(binary)); + assert(ClonedData != NULL); + memcpy(ClonedData, myBuffer ,mySize ); - SimpleDataBuffer * result = new SimpleDataBuffer(ClonedData, mySize, 0); - result->bValidValue = bValidValue; - return result; + SimpleDataBuffer * result = new SimpleDataBuffer(ClonedData, mySize, 0); + result->bValidValue = bValidValue; + return result; } SimpleDataBuffer::SimpleDataBuffer(const SimpleDataBuffer & ToClone) :DataBuffer((binary *)malloc(ToClone.mySize * sizeof(binary)), ToClone.mySize, myFreeBuffer) { - assert(myBuffer != NULL); - memcpy(myBuffer, ToClone.myBuffer ,mySize ); - bValidValue = ToClone.bValidValue; + assert(myBuffer != NULL); + memcpy(myBuffer, ToClone.myBuffer ,mySize ); + bValidValue = ToClone.bValidValue; } bool KaxInternalBlock::ValidateSize() const { - return (GetSize() >= 4); /// for the moment + return (GetSize() >= 4); /// for the moment } KaxInternalBlock::~KaxInternalBlock() { - ReleaseFrames(); + ReleaseFrames(); } KaxInternalBlock::KaxInternalBlock(const KaxInternalBlock & ElementToClone) @@ -81,14 +81,14 @@ KaxInternalBlock::KaxInternalBlock(const KaxInternalBlock & ElementToClone) ,TrackNumber(ElementToClone.TrackNumber) ,ParentCluster(ElementToClone.ParentCluster) ///< \todo not exactly { - // add a clone of the list - std::vector::const_iterator Itr = ElementToClone.myBuffers.begin(); - std::vector::iterator myItr = myBuffers.begin(); - while (Itr != ElementToClone.myBuffers.end()) - { - *myItr = (*Itr)->Clone(); - Itr++; myItr++; - } + // add a clone of the list + std::vector::const_iterator Itr = ElementToClone.myBuffers.begin(); + std::vector::iterator myItr = myBuffers.begin(); + while (Itr != ElementToClone.myBuffers.end()) + { + *myItr = (*Itr)->Clone(); + Itr++; myItr++; + } } @@ -104,115 +104,115 @@ KaxBlockGroup::KaxBlockGroup(EBML_EXTRA_DEF) {} /*! - \todo handle flags - \todo hardcoded limit of the number of frames in a lace should be a parameter - \return true if more frames can be added to this Block + \todo handle flags + \todo hardcoded limit of the number of frames in a lace should be a parameter + \return true if more frames can be added to this Block */ bool KaxInternalBlock::AddFrame(const KaxTrackEntry & track, uint64 timecode, DataBuffer & buffer, LacingType lacing, bool invisible) { - SetValueIsSet(); - if (myBuffers.size() == 0) { - // first frame - Timecode = timecode; - TrackNumber = track.TrackNumber(); - mInvisible = invisible; - mLacing = lacing; - } - myBuffers.push_back(&buffer); + SetValueIsSet(); + if (myBuffers.size() == 0) { + // first frame + Timecode = timecode; + TrackNumber = track.TrackNumber(); + mInvisible = invisible; + mLacing = lacing; + } + myBuffers.push_back(&buffer); - // we don't allow more than 8 frames in a Block because the overhead improvement is minimal - if (myBuffers.size() >= 8 || lacing == LACING_NONE) - return false; + // we don't allow more than 8 frames in a Block because the overhead improvement is minimal + if (myBuffers.size() >= 8 || lacing == LACING_NONE) + return false; - if (lacing == LACING_XIPH) - // decide wether a new frame can be added or not - // a frame in a lace is not efficient when the place necessary to code it in a lace is bigger - // than the size of a simple Block. That means more than 6 bytes (4 in struct + 2 for EBML) to code the size - return (buffer.Size() < 6*0xFF); - else - return true; + if (lacing == LACING_XIPH) + // decide wether a new frame can be added or not + // a frame in a lace is not efficient when the place necessary to code it in a lace is bigger + // than the size of a simple Block. That means more than 6 bytes (4 in struct + 2 for EBML) to code the size + return (buffer.Size() < 6*0xFF); + else + return true; } /*! \return Returns the lacing type that produces the smallest footprint. */ LacingType KaxInternalBlock::GetBestLacingType() const { - int XiphLacingSize, EbmlLacingSize, i; - bool SameSize = true; + int XiphLacingSize, EbmlLacingSize, i; + bool SameSize = true; - if (myBuffers.size() <= 1) - return LACING_NONE; + if (myBuffers.size() <= 1) + return LACING_NONE; - XiphLacingSize = 1; // Number of laces is stored in 1 byte. - EbmlLacingSize = 1; - for (i = 0; i < (int)myBuffers.size() - 1; i++) { - if (myBuffers[i]->Size() != myBuffers[i + 1]->Size()) - SameSize = false; - XiphLacingSize += myBuffers[i]->Size() / 255 + 1; - } - EbmlLacingSize += CodedSizeLength(myBuffers[0]->Size(), 0, IsFiniteSize()); - for (i = 1; i < (int)myBuffers.size() - 1; i++) - EbmlLacingSize += CodedSizeLengthSigned(int64(myBuffers[i]->Size()) - int64(myBuffers[i - 1]->Size()), 0); - if (SameSize) - return LACING_FIXED; - else if (XiphLacingSize < EbmlLacingSize) - return LACING_XIPH; - else - return LACING_EBML; + XiphLacingSize = 1; // Number of laces is stored in 1 byte. + EbmlLacingSize = 1; + for (i = 0; i < (int)myBuffers.size() - 1; i++) { + if (myBuffers[i]->Size() != myBuffers[i + 1]->Size()) + SameSize = false; + XiphLacingSize += myBuffers[i]->Size() / 255 + 1; + } + EbmlLacingSize += CodedSizeLength(myBuffers[0]->Size(), 0, IsFiniteSize()); + for (i = 1; i < (int)myBuffers.size() - 1; i++) + EbmlLacingSize += CodedSizeLengthSigned(int64(myBuffers[i]->Size()) - int64(myBuffers[i - 1]->Size()), 0); + if (SameSize) + return LACING_FIXED; + else if (XiphLacingSize < EbmlLacingSize) + return LACING_XIPH; + else + return LACING_EBML; } filepos_t KaxInternalBlock::UpdateSize(bool /* bSaveDefault */, bool /* bForceRender */) { - LacingType LacingHere; + LacingType LacingHere; assert(EbmlBinary::GetBuffer() == NULL); // Data is not used for KaxInternalBlock - assert(TrackNumber < 0x4000); // no more allowed for the moment - unsigned int i; + assert(TrackNumber < 0x4000); // no more allowed for the moment + unsigned int i; - // compute the final size of the data - switch (myBuffers.size()) { - case 0: - SetSize_(0); - break; - case 1: - SetSize_(4 + myBuffers[0]->Size()); - break; - default: - SetSize_(4 + 1); // 1 for the lacing head - if (mLacing == LACING_AUTO) - LacingHere = GetBestLacingType(); - else - LacingHere = mLacing; - switch (LacingHere) - { - case LACING_XIPH: - for (i=0; iSize() + (myBuffers[i]->Size() / 0xFF + 1)); - } - break; - case LACING_EBML: - SetSize_(GetSize() + myBuffers[0]->Size() + CodedSizeLength(myBuffers[0]->Size(), 0, IsFiniteSize())); - for (i=1; iSize() + CodedSizeLengthSigned(int64(myBuffers[i]->Size()) - int64(myBuffers[i-1]->Size()), 0)); - } - break; - case LACING_FIXED: - for (i=0; iSize()); - } - break; - default: - i = 0; - assert(0); - } - // Size of the last frame (not in lace) - SetSize_(GetSize() + myBuffers[i]->Size()); - break; - } + // compute the final size of the data + switch (myBuffers.size()) { + case 0: + SetSize_(0); + break; + case 1: + SetSize_(4 + myBuffers[0]->Size()); + break; + default: + SetSize_(4 + 1); // 1 for the lacing head + if (mLacing == LACING_AUTO) + LacingHere = GetBestLacingType(); + else + LacingHere = mLacing; + switch (LacingHere) + { + case LACING_XIPH: + for (i=0; iSize() + (myBuffers[i]->Size() / 0xFF + 1)); + } + break; + case LACING_EBML: + SetSize_(GetSize() + myBuffers[0]->Size() + CodedSizeLength(myBuffers[0]->Size(), 0, IsFiniteSize())); + for (i=1; iSize() + CodedSizeLengthSigned(int64(myBuffers[i]->Size()) - int64(myBuffers[i-1]->Size()), 0)); + } + break; + case LACING_FIXED: + for (i=0; iSize()); + } + break; + default: + i = 0; + assert(0); + } + // Size of the last frame (not in lace) + SetSize_(GetSize() + myBuffers[i]->Size()); + break; + } - if (TrackNumber >= 0x80) - SetSize_(GetSize() + 1); // the size will be coded with one more octet + if (TrackNumber >= 0x80) + SetSize_(GetSize() + 1); // the size will be coded with one more octet - return GetSize(); + return GetSize(); } #if MATROSKA_VERSION >= 2 @@ -236,803 +236,803 @@ KaxBlockVirtual::KaxBlockVirtual(EBML_EXTRA_DEF) KaxBlockVirtual::~KaxBlockVirtual() { if(GetBuffer() == DataBlock) - SetBuffer( NULL, 0 ); + SetBuffer( NULL, 0 ); } filepos_t KaxBlockVirtual::UpdateSize(bool /* bSaveDefault */, bool /* bForceRender */) { - assert(TrackNumber < 0x4000); - binary *cursor = EbmlBinary::GetBuffer(); - // fill data - if (TrackNumber < 0x80) { + assert(TrackNumber < 0x4000); + binary *cursor = EbmlBinary::GetBuffer(); + // fill data + if (TrackNumber < 0x80) { assert(GetSize() >= 4); - *cursor++ = TrackNumber | 0x80; // set the first bit to 1 - } else { + *cursor++ = TrackNumber | 0x80; // set the first bit to 1 + } else { assert(GetSize() >= 5); - *cursor++ = (TrackNumber >> 8) | 0x40; // set the second bit to 1 - *cursor++ = TrackNumber & 0xFF; - } + *cursor++ = (TrackNumber >> 8) | 0x40; // set the second bit to 1 + *cursor++ = TrackNumber & 0xFF; + } - assert(ParentCluster != NULL); - int16 ActualTimecode = ParentCluster->GetBlockLocalTimecode(Timecode); - big_int16 b16(ActualTimecode); - b16.Fill(cursor); - cursor += 2; + assert(ParentCluster != NULL); + int16 ActualTimecode = ParentCluster->GetBlockLocalTimecode(Timecode); + big_int16 b16(ActualTimecode); + b16.Fill(cursor); + cursor += 2; - *cursor++ = 0; // flags + *cursor++ = 0; // flags - return GetSize(); + return GetSize(); } #endif // MATROSKA_VERSION /*! - \todo more optimisation is possible (render the Block head and don't copy the buffer in memory, care should be taken with the allocation of Data) - \todo the actual timecode to write should be retrieved from the Cluster from here + \todo more optimisation is possible (render the Block head and don't copy the buffer in memory, care should be taken with the allocation of Data) + \todo the actual timecode to write should be retrieved from the Cluster from here */ filepos_t KaxInternalBlock::RenderData(IOCallback & output, bool /* bForceRender */, bool /* bSaveDefault */) { - if (myBuffers.size() == 0) { - return 0; - } else { - assert(TrackNumber < 0x4000); - binary BlockHead[5], *cursor = BlockHead; - unsigned int i; + if (myBuffers.size() == 0) { + return 0; + } else { + assert(TrackNumber < 0x4000); + binary BlockHead[5], *cursor = BlockHead; + unsigned int i; - if (myBuffers.size() == 1) { - SetSize_(4); - mLacing = LACING_NONE; - } else { - if (mLacing == LACING_NONE) - mLacing = LACING_EBML; // supposedly the best of all - SetSize_(4 + 1); // 1 for the lacing head (number of laced elements) - } - if (TrackNumber > 0x80) - SetSize_(GetSize() + 1); + if (myBuffers.size() == 1) { + SetSize_(4); + mLacing = LACING_NONE; + } else { + if (mLacing == LACING_NONE) + mLacing = LACING_EBML; // supposedly the best of all + SetSize_(4 + 1); // 1 for the lacing head (number of laced elements) + } + if (TrackNumber > 0x80) + SetSize_(GetSize() + 1); - // write Block Head - if (TrackNumber < 0x80) { - *cursor++ = TrackNumber | 0x80; // set the first bit to 1 - } else { - *cursor++ = (TrackNumber >> 8) | 0x40; // set the second bit to 1 - *cursor++ = TrackNumber & 0xFF; - } + // write Block Head + if (TrackNumber < 0x80) { + *cursor++ = TrackNumber | 0x80; // set the first bit to 1 + } else { + *cursor++ = (TrackNumber >> 8) | 0x40; // set the second bit to 1 + *cursor++ = TrackNumber & 0xFF; + } - assert(ParentCluster != NULL); - int16 ActualTimecode = ParentCluster->GetBlockLocalTimecode(Timecode); - big_int16 b16(ActualTimecode); - b16.Fill(cursor); - cursor += 2; + assert(ParentCluster != NULL); + int16 ActualTimecode = ParentCluster->GetBlockLocalTimecode(Timecode); + big_int16 b16(ActualTimecode); + b16.Fill(cursor); + cursor += 2; - *cursor = 0; // flags + *cursor = 0; // flags - if (mLacing == LACING_AUTO) { - mLacing = GetBestLacingType(); - } + if (mLacing == LACING_AUTO) { + mLacing = GetBestLacingType(); + } - // invisible flag - if (mInvisible) - *cursor = 0x08; + // invisible flag + if (mInvisible) + *cursor = 0x08; - if (bIsSimple) { - if (bIsKeyframe) - *cursor |= 0x80; - if (bIsDiscardable) - *cursor |= 0x01; - } - - // lacing flag - switch (mLacing) - { - case LACING_XIPH: - *cursor++ |= 0x02; - break; - case LACING_EBML: - *cursor++ |= 0x06; - break; - case LACING_FIXED: - *cursor++ |= 0x04; - break; - case LACING_NONE: - break; - default: - assert(0); - } + if (bIsSimple) { + if (bIsKeyframe) + *cursor |= 0x80; + if (bIsDiscardable) + *cursor |= 0x01; + } - output.writeFully(BlockHead, 4 + ((TrackNumber > 0x80) ? 1 : 0)); + // lacing flag + switch (mLacing) + { + case LACING_XIPH: + *cursor++ |= 0x02; + break; + case LACING_EBML: + *cursor++ |= 0x06; + break; + case LACING_FIXED: + *cursor++ |= 0x04; + break; + case LACING_NONE: + break; + default: + assert(0); + } - binary tmpValue; - switch (mLacing) - { - case LACING_XIPH: - // number of laces - tmpValue = myBuffers.size()-1; - output.writeFully(&tmpValue, 1); + output.writeFully(BlockHead, 4 + ((TrackNumber > 0x80) ? 1 : 0)); - // set the size of each member in the lace - for (i=0; iSize(); - while (tmpSize >= 0xFF) { - output.writeFully(&tmpValue, 1); - SetSize_(GetSize() + 1); - tmpSize -= 0xFF; - } - tmpValue = binary(tmpSize); - output.writeFully(&tmpValue, 1); - SetSize_(GetSize() + 1); - } - break; - case LACING_EBML: - // number of laces - tmpValue = myBuffers.size()-1; - output.writeFully(&tmpValue, 1); + binary tmpValue; + switch (mLacing) + { + case LACING_XIPH: + // number of laces + tmpValue = myBuffers.size()-1; + output.writeFully(&tmpValue, 1); - { - int64 _Size; - int _CodedSize; - binary _FinalHead[8]; // 64 bits max coded size + // set the size of each member in the lace + for (i=0; iSize(); + while (tmpSize >= 0xFF) { + output.writeFully(&tmpValue, 1); + SetSize_(GetSize() + 1); + tmpSize -= 0xFF; + } + tmpValue = binary(tmpSize); + output.writeFully(&tmpValue, 1); + SetSize_(GetSize() + 1); + } + break; + case LACING_EBML: + // number of laces + tmpValue = myBuffers.size()-1; + output.writeFully(&tmpValue, 1); - _Size = myBuffers[0]->Size(); + { + int64 _Size; + int _CodedSize; + binary _FinalHead[8]; // 64 bits max coded size - _CodedSize = CodedSizeLength(_Size, 0, IsFiniteSize()); + _Size = myBuffers[0]->Size(); - // first size in the lace is not a signed - CodedValueLength(_Size, _CodedSize, _FinalHead); - output.writeFully(_FinalHead, _CodedSize); - SetSize_(GetSize() + _CodedSize); + _CodedSize = CodedSizeLength(_Size, 0, IsFiniteSize()); - // set the size of each member in the lace - for (i=1; iSize()) - int64(myBuffers[i-1]->Size()); - _CodedSize = CodedSizeLengthSigned(_Size, 0); - CodedValueLengthSigned(_Size, _CodedSize, _FinalHead); - output.writeFully(_FinalHead, _CodedSize); - SetSize_(GetSize() + _CodedSize); - } - } - break; - case LACING_FIXED: - // number of laces - tmpValue = myBuffers.size()-1; - output.writeFully(&tmpValue, 1); - break; - case LACING_NONE: - break; - default: - assert(0); - } + // first size in the lace is not a signed + CodedValueLength(_Size, _CodedSize, _FinalHead); + output.writeFully(_FinalHead, _CodedSize); + SetSize_(GetSize() + _CodedSize); - // put the data of each frame - for (i=0; iBuffer(), myBuffers[i]->Size()); - SetSize_(GetSize() + myBuffers[i]->Size()); - } - } + // set the size of each member in the lace + for (i=1; iSize()) - int64(myBuffers[i-1]->Size()); + _CodedSize = CodedSizeLengthSigned(_Size, 0); + CodedValueLengthSigned(_Size, _CodedSize, _FinalHead); + output.writeFully(_FinalHead, _CodedSize); + SetSize_(GetSize() + _CodedSize); + } + } + break; + case LACING_FIXED: + // number of laces + tmpValue = myBuffers.size()-1; + output.writeFully(&tmpValue, 1); + break; + case LACING_NONE: + break; + default: + assert(0); + } - return GetSize(); + // put the data of each frame + for (i=0; iBuffer(), myBuffers[i]->Size()); + SetSize_(GetSize() + myBuffers[i]->Size()); + } + } + + return GetSize(); } uint64 KaxInternalBlock::ReadInternalHead(IOCallback & input) { - binary Buffer[5], *cursor = Buffer; - uint64 Result = input.read(cursor, 4); - if (Result != 4) - return Result; - - // update internal values - TrackNumber = *cursor++; - if ((TrackNumber & 0x80) == 0) { - // there is extra data - if ((TrackNumber & 0x40) == 0) { - // We don't support track numbers that large ! - return Result; - } - Result += input.read(&Buffer[4], 1); - TrackNumber = (TrackNumber & 0x3F) << 8; - TrackNumber += *cursor++; - } else { - TrackNumber &= 0x7F; - } + binary Buffer[5], *cursor = Buffer; + uint64 Result = input.read(cursor, 4); + if (Result != 4) + return Result; - - big_int16 b16; - b16.Eval(cursor); - assert(ParentCluster != NULL); - Timecode = ParentCluster->GetBlockGlobalTimecode(int16(b16)); - bLocalTimecodeUsed = false; - cursor += 2; + // update internal values + TrackNumber = *cursor++; + if ((TrackNumber & 0x80) == 0) { + // there is extra data + if ((TrackNumber & 0x40) == 0) { + // We don't support track numbers that large ! + return Result; + } + Result += input.read(&Buffer[4], 1); + TrackNumber = (TrackNumber & 0x3F) << 8; + TrackNumber += *cursor++; + } else { + TrackNumber &= 0x7F; + } - return Result; + + big_int16 b16; + b16.Eval(cursor); + assert(ParentCluster != NULL); + Timecode = ParentCluster->GetBlockGlobalTimecode(int16(b16)); + bLocalTimecodeUsed = false; + cursor += 2; + + return Result; } /*! - \todo better zero copy handling + \todo better zero copy handling */ filepos_t KaxInternalBlock::ReadData(IOCallback & input, ScopeMode ReadFully) { - filepos_t Result; + filepos_t Result; - FirstFrameLocation = input.getFilePointer(); // will be updated accordingly below + FirstFrameLocation = input.getFilePointer(); // will be updated accordingly below - if (ReadFully == SCOPE_ALL_DATA) - { - Result = EbmlBinary::ReadData(input, ReadFully); + if (ReadFully == SCOPE_ALL_DATA) + { + Result = EbmlBinary::ReadData(input, ReadFully); binary *cursor = EbmlBinary::GetBuffer(); - uint8 BlockHeadSize = 4; + uint8 BlockHeadSize = 4; - // update internal values - TrackNumber = *cursor++; - if ((TrackNumber & 0x80) == 0) { - // there is extra data - if ((TrackNumber & 0x40) == 0) { - // We don't support track numbers that large ! - return Result; - } - TrackNumber = (TrackNumber & 0x3F) << 8; - TrackNumber += *cursor++; - BlockHeadSize++; - } else { - TrackNumber &= 0x7F; - } + // update internal values + TrackNumber = *cursor++; + if ((TrackNumber & 0x80) == 0) { + // there is extra data + if ((TrackNumber & 0x40) == 0) { + // We don't support track numbers that large ! + return Result; + } + TrackNumber = (TrackNumber & 0x3F) << 8; + TrackNumber += *cursor++; + BlockHeadSize++; + } else { + TrackNumber &= 0x7F; + } - big_int16 b16; - b16.Eval(cursor); - LocalTimecode = int16(b16); - bLocalTimecodeUsed = true; - cursor += 2; + big_int16 b16; + b16.Eval(cursor); + LocalTimecode = int16(b16); + bLocalTimecodeUsed = true; + cursor += 2; - if (EbmlId(*this) == EBML_ID(KaxSimpleBlock)) { - bIsKeyframe = (*cursor & 0x80) != 0; - bIsDiscardable = (*cursor & 0x01) != 0; - } - mInvisible = (*cursor & 0x08) >> 3; - mLacing = LacingType((*cursor++ & 0x06) >> 1); + if (EbmlId(*this) == EBML_ID(KaxSimpleBlock)) { + bIsKeyframe = (*cursor & 0x80) != 0; + bIsDiscardable = (*cursor & 0x01) != 0; + } + mInvisible = (*cursor & 0x08) >> 3; + mLacing = LacingType((*cursor++ & 0x06) >> 1); - // put all Frames in the list - if (mLacing == LACING_NONE) { - FirstFrameLocation += cursor - EbmlBinary::GetBuffer(); - DataBuffer * soloFrame = new DataBuffer(cursor, GetSize() - BlockHeadSize); - myBuffers.push_back(soloFrame); - SizeList.resize(1); - SizeList[0] = GetSize() - BlockHeadSize; - } else { - // read the number of frames in the lace - uint32 LastBufferSize = GetSize() - BlockHeadSize - 1; // 1 for number of frame - uint8 FrameNum = *cursor++; // number of frames in the lace - 1 - // read the list of frame sizes - uint8 Index; - int32 FrameSize; - uint32 SizeRead; - uint64 SizeUnknown; + // put all Frames in the list + if (mLacing == LACING_NONE) { + FirstFrameLocation += cursor - EbmlBinary::GetBuffer(); + DataBuffer * soloFrame = new DataBuffer(cursor, GetSize() - BlockHeadSize); + myBuffers.push_back(soloFrame); + SizeList.resize(1); + SizeList[0] = GetSize() - BlockHeadSize; + } else { + // read the number of frames in the lace + uint32 LastBufferSize = GetSize() - BlockHeadSize - 1; // 1 for number of frame + uint8 FrameNum = *cursor++; // number of frames in the lace - 1 + // read the list of frame sizes + uint8 Index; + int32 FrameSize; + uint32 SizeRead; + uint64 SizeUnknown; - SizeList.resize(FrameNum + 1); + SizeList.resize(FrameNum + 1); - switch (mLacing) - { - case LACING_XIPH: - for (Index=0; Index> 3; - mLacing = LacingType((*cursor++ & 0x06) >> 1); - if (cursor == &_TempHead[4]) - { - _TempHead[0] = _TempHead[4]; - } else { - Result += input.read(_TempHead, 1); - } + if (EbmlId(*this) == EBML_ID(KaxSimpleBlock)) { + bIsKeyframe = (*cursor & 0x80) != 0; + bIsDiscardable = (*cursor & 0x01) != 0; + } + mInvisible = (*cursor & 0x08) >> 3; + mLacing = LacingType((*cursor++ & 0x06) >> 1); + if (cursor == &_TempHead[4]) + { + _TempHead[0] = _TempHead[4]; + } else { + Result += input.read(_TempHead, 1); + } - FirstFrameLocation += cursor - _TempHead; + FirstFrameLocation += cursor - _TempHead; - // put all Frames in the list - if (mLacing != LACING_NONE) { - // read the number of frames in the lace - uint32 LastBufferSize = GetSize() - BlockHeadSize - 1; // 1 for number of frame - uint8 FrameNum = _TempHead[0]; // number of frames in the lace - 1 - // read the list of frame sizes - uint8 Index; - int32 FrameSize; - uint32 SizeRead; - uint64 SizeUnknown; + // put all Frames in the list + if (mLacing != LACING_NONE) { + // read the number of frames in the lace + uint32 LastBufferSize = GetSize() - BlockHeadSize - 1; // 1 for number of frame + uint8 FrameNum = _TempHead[0]; // number of frames in the lace - 1 + // read the list of frame sizes + uint8 Index; + int32 FrameSize; + uint32 SizeRead; + uint64 SizeUnknown; - SizeList.resize(FrameNum + 1); + SizeList.resize(FrameNum + 1); - switch (mLacing) - { - case LACING_XIPH: - for (Index=0; Index(*this); - assert(ParentCluster != NULL); - theBlock.SetParent(*ParentCluster); - ParentTrack = &track; - return theBlock.AddFrame(track, timecode, buffer, lacing); + KaxBlock & theBlock = GetChild(*this); + assert(ParentCluster != NULL); + theBlock.SetParent(*ParentCluster); + ParentTrack = &track; + return theBlock.AddFrame(track, timecode, buffer, lacing); } bool KaxBlockGroup::AddFrame(const KaxTrackEntry & track, uint64 timecode, DataBuffer & buffer, const KaxBlockGroup & PastBlock, LacingType lacing) { -// assert(past_timecode < 0); +// assert(past_timecode < 0); - KaxBlock & theBlock = GetChild(*this); - assert(ParentCluster != NULL); - theBlock.SetParent(*ParentCluster); - ParentTrack = &track; - bool bRes = theBlock.AddFrame(track, timecode, buffer, lacing); + KaxBlock & theBlock = GetChild(*this); + assert(ParentCluster != NULL); + theBlock.SetParent(*ParentCluster); + ParentTrack = &track; + bool bRes = theBlock.AddFrame(track, timecode, buffer, lacing); - KaxReferenceBlock & thePastRef = GetChild(*this); - thePastRef.SetReferencedBlock(PastBlock); - thePastRef.SetParentBlock(*this); + KaxReferenceBlock & thePastRef = GetChild(*this); + thePastRef.SetReferencedBlock(PastBlock); + thePastRef.SetParentBlock(*this); - return bRes; + return bRes; } bool KaxBlockGroup::AddFrame(const KaxTrackEntry & track, uint64 timecode, DataBuffer & buffer, const KaxBlockGroup & PastBlock, const KaxBlockGroup & ForwBlock, LacingType lacing) { -// assert(past_timecode < 0); +// assert(past_timecode < 0); -// assert(forw_timecode > 0); - - KaxBlock & theBlock = GetChild(*this); - assert(ParentCluster != NULL); - theBlock.SetParent(*ParentCluster); - ParentTrack = &track; - bool bRes = theBlock.AddFrame(track, timecode, buffer, lacing); +// assert(forw_timecode > 0); - KaxReferenceBlock & thePastRef = GetChild(*this); - thePastRef.SetReferencedBlock(PastBlock); - thePastRef.SetParentBlock(*this); + KaxBlock & theBlock = GetChild(*this); + assert(ParentCluster != NULL); + theBlock.SetParent(*ParentCluster); + ParentTrack = &track; + bool bRes = theBlock.AddFrame(track, timecode, buffer, lacing); - KaxReferenceBlock & theFutureRef = AddNewChild(*this); - theFutureRef.SetReferencedBlock(ForwBlock); - theFutureRef.SetParentBlock(*this); + KaxReferenceBlock & thePastRef = GetChild(*this); + thePastRef.SetReferencedBlock(PastBlock); + thePastRef.SetParentBlock(*this); - return bRes; + KaxReferenceBlock & theFutureRef = AddNewChild(*this); + theFutureRef.SetReferencedBlock(ForwBlock); + theFutureRef.SetParentBlock(*this); + + return bRes; } bool KaxBlockGroup::AddFrame(const KaxTrackEntry & track, uint64 timecode, DataBuffer & buffer, const KaxBlockBlob * PastBlock, const KaxBlockBlob * ForwBlock, LacingType lacing) { - KaxBlock & theBlock = GetChild(*this); - assert(ParentCluster != NULL); - theBlock.SetParent(*ParentCluster); - ParentTrack = &track; - bool bRes = theBlock.AddFrame(track, timecode, buffer, lacing); + KaxBlock & theBlock = GetChild(*this); + assert(ParentCluster != NULL); + theBlock.SetParent(*ParentCluster); + ParentTrack = &track; + bool bRes = theBlock.AddFrame(track, timecode, buffer, lacing); - if (PastBlock != NULL) - { - KaxReferenceBlock & thePastRef = GetChild(*this); - thePastRef.SetReferencedBlock(PastBlock); - thePastRef.SetParentBlock(*this); - } + if (PastBlock != NULL) + { + KaxReferenceBlock & thePastRef = GetChild(*this); + thePastRef.SetReferencedBlock(PastBlock); + thePastRef.SetParentBlock(*this); + } - if (ForwBlock != NULL) - { - KaxReferenceBlock & theFutureRef = AddNewChild(*this); - theFutureRef.SetReferencedBlock(ForwBlock); - theFutureRef.SetParentBlock(*this); - } + if (ForwBlock != NULL) + { + KaxReferenceBlock & theFutureRef = AddNewChild(*this); + theFutureRef.SetReferencedBlock(ForwBlock); + theFutureRef.SetParentBlock(*this); + } - return bRes; + return bRes; } /*! - \todo we may cache the reference to the timecode block + \todo we may cache the reference to the timecode block */ uint64 KaxBlockGroup::GlobalTimecode() const { - assert(ParentCluster != NULL); // impossible otherwise - KaxInternalBlock & MyBlock = *static_cast(this->FindElt(EBML_INFO(KaxBlock))); - return MyBlock.GlobalTimecode(); + assert(ParentCluster != NULL); // impossible otherwise + KaxInternalBlock & MyBlock = *static_cast(this->FindElt(EBML_INFO(KaxBlock))); + return MyBlock.GlobalTimecode(); } uint16 KaxBlockGroup::TrackNumber() const { - KaxInternalBlock & MyBlock = *static_cast(this->FindElt(EBML_INFO(KaxBlock))); - return MyBlock.TrackNum(); + KaxInternalBlock & MyBlock = *static_cast(this->FindElt(EBML_INFO(KaxBlock))); + return MyBlock.TrackNum(); } uint64 KaxBlockGroup::ClusterPosition() const { - assert(ParentCluster != NULL); // impossible otherwise - return ParentCluster->GetPosition(); + assert(ParentCluster != NULL); // impossible otherwise + return ParentCluster->GetPosition(); } uint64 KaxInternalBlock::ClusterPosition() const { - assert(ParentCluster != NULL); // impossible otherwise - return ParentCluster->GetPosition(); + assert(ParentCluster != NULL); // impossible otherwise + return ParentCluster->GetPosition(); } unsigned int KaxBlockGroup::ReferenceCount() const { - unsigned int Result = 0; - KaxReferenceBlock * MyBlockAdds = static_cast(FindFirstElt(EBML_INFO(KaxReferenceBlock))); - if (MyBlockAdds != NULL) { - Result++; - while ((MyBlockAdds = static_cast(FindNextElt(*MyBlockAdds))) != NULL) - { - Result++; - } - } - return Result; + unsigned int Result = 0; + KaxReferenceBlock * MyBlockAdds = static_cast(FindFirstElt(EBML_INFO(KaxReferenceBlock))); + if (MyBlockAdds != NULL) { + Result++; + while ((MyBlockAdds = static_cast(FindNextElt(*MyBlockAdds))) != NULL) + { + Result++; + } + } + return Result; } const KaxReferenceBlock & KaxBlockGroup::Reference(unsigned int Index) const { - KaxReferenceBlock * MyBlockAdds = static_cast(FindFirstElt(EBML_INFO(KaxReferenceBlock))); - assert(MyBlockAdds != NULL); // call of a non existing reference - - while (Index != 0) { - MyBlockAdds = static_cast(FindNextElt(*MyBlockAdds)); - assert(MyBlockAdds != NULL); - Index--; - } - return *MyBlockAdds; + KaxReferenceBlock * MyBlockAdds = static_cast(FindFirstElt(EBML_INFO(KaxReferenceBlock))); + assert(MyBlockAdds != NULL); // call of a non existing reference + + while (Index != 0) { + MyBlockAdds = static_cast(FindNextElt(*MyBlockAdds)); + assert(MyBlockAdds != NULL); + Index--; + } + return *MyBlockAdds; } void KaxBlockGroup::ReleaseFrames() { - KaxInternalBlock & MyBlock = *static_cast(this->FindElt(EBML_INFO(KaxBlock))); - MyBlock.ReleaseFrames(); + KaxInternalBlock & MyBlock = *static_cast(this->FindElt(EBML_INFO(KaxBlock))); + MyBlock.ReleaseFrames(); } void KaxInternalBlock::ReleaseFrames() { - // free the allocated Frames - int i; - for (i=myBuffers.size()-1; i>=0; i--) { - if (myBuffers[i] != NULL) { - myBuffers[i]->FreeBuffer(*myBuffers[i]); - delete myBuffers[i]; - myBuffers[i] = NULL; - } - } + // free the allocated Frames + int i; + for (i=myBuffers.size()-1; i>=0; i--) { + if (myBuffers[i] != NULL) { + myBuffers[i]->FreeBuffer(*myBuffers[i]); + delete myBuffers[i]; + myBuffers[i] = NULL; + } + } } void KaxBlockGroup::SetBlockDuration(uint64 TimeLength) { - assert(ParentTrack != NULL); - int64 scale = ParentTrack->GlobalTimecodeScale(); - KaxBlockDuration & myDuration = *static_cast(FindFirstElt(EBML_INFO(KaxBlockDuration), true)); - *(static_cast(&myDuration)) = TimeLength / uint64(scale); + assert(ParentTrack != NULL); + int64 scale = ParentTrack->GlobalTimecodeScale(); + KaxBlockDuration & myDuration = *static_cast(FindFirstElt(EBML_INFO(KaxBlockDuration), true)); + *(static_cast(&myDuration)) = TimeLength / uint64(scale); } bool KaxBlockGroup::GetBlockDuration(uint64 &TheTimecode) const { - KaxBlockDuration * myDuration = static_cast(FindElt(EBML_INFO(KaxBlockDuration))); - if (myDuration == NULL) { - return false; - } + KaxBlockDuration * myDuration = static_cast(FindElt(EBML_INFO(KaxBlockDuration))); + if (myDuration == NULL) { + return false; + } - assert(ParentTrack != NULL); - TheTimecode = uint64(*myDuration) * ParentTrack->GlobalTimecodeScale(); - return true; + assert(ParentTrack != NULL); + TheTimecode = uint64(*myDuration) * ParentTrack->GlobalTimecodeScale(); + return true; } KaxBlockGroup::operator KaxInternalBlock &() { - KaxBlock & theBlock = GetChild(*this); - return theBlock; + KaxBlock & theBlock = GetChild(*this); + return theBlock; } void KaxBlockGroup::SetParent(KaxCluster & aParentCluster) { - ParentCluster = &aParentCluster; - KaxBlock & theBlock = GetChild(*this); - theBlock.SetParent( aParentCluster ); + ParentCluster = &aParentCluster; + KaxBlock & theBlock = GetChild(*this); + theBlock.SetParent( aParentCluster ); } void KaxSimpleBlock::SetParent(KaxCluster & aParentCluster) { - KaxInternalBlock::SetParent( aParentCluster ); + KaxInternalBlock::SetParent( aParentCluster ); } void KaxInternalBlock::SetParent(KaxCluster & aParentCluster) { - ParentCluster = &aParentCluster; - if (bLocalTimecodeUsed) { - Timecode = aParentCluster.GetBlockGlobalTimecode(LocalTimecode); - bLocalTimecodeUsed = false; - } + ParentCluster = &aParentCluster; + if (bLocalTimecodeUsed) { + Timecode = aParentCluster.GetBlockGlobalTimecode(LocalTimecode); + bLocalTimecodeUsed = false; + } } int64 KaxInternalBlock::GetDataPosition(size_t FrameNumber) { - int64 _Result = -1; + int64 _Result = -1; - if (ValueIsSet() && FrameNumber < SizeList.size()) - { - _Result = FirstFrameLocation; - - size_t _Idx = 0; - while(FrameNumber--) - { - _Result += SizeList[_Idx++]; - } - } + if (ValueIsSet() && FrameNumber < SizeList.size()) + { + _Result = FirstFrameLocation; - return _Result; + size_t _Idx = 0; + while(FrameNumber--) + { + _Result += SizeList[_Idx++]; + } + } + + return _Result; } int64 KaxInternalBlock::GetFrameSize(size_t FrameNumber) { - int64 _Result = -1; + int64 _Result = -1; - if (/*bValueIsSet &&*/ FrameNumber < SizeList.size()) - { - _Result = SizeList[FrameNumber]; - } + if (/*bValueIsSet &&*/ FrameNumber < SizeList.size()) + { + _Result = SizeList[FrameNumber]; + } - return _Result; + return _Result; } KaxBlockBlob::operator KaxBlockGroup &() { - assert(!bUseSimpleBlock); - assert(Block.group); - return *Block.group; + assert(!bUseSimpleBlock); + assert(Block.group); + return *Block.group; } KaxBlockBlob::operator const KaxBlockGroup &() const { - assert(!bUseSimpleBlock); - assert(Block.group); - return *Block.group; + assert(!bUseSimpleBlock); + assert(Block.group); + return *Block.group; } KaxBlockBlob::operator KaxInternalBlock &() { - assert(Block.group); + assert(Block.group); #if MATROSKA_VERSION >= 2 - if (bUseSimpleBlock) - return *Block.simpleblock; - else + if (bUseSimpleBlock) + return *Block.simpleblock; + else #endif - return *Block.group; + return *Block.group; } KaxBlockBlob::operator const KaxInternalBlock &() const { - assert(Block.group); + assert(Block.group); #if MATROSKA_VERSION >= 2 - if (bUseSimpleBlock) - return *Block.simpleblock; - else + if (bUseSimpleBlock) + return *Block.simpleblock; + else #endif - return *Block.group; + return *Block.group; } #if MATROSKA_VERSION >= 2 KaxBlockBlob::operator KaxSimpleBlock &() { - assert(bUseSimpleBlock); - assert(Block.simpleblock); - return *Block.simpleblock; + assert(bUseSimpleBlock); + assert(Block.simpleblock); + return *Block.simpleblock; } #endif bool KaxBlockBlob::AddFrameAuto(const KaxTrackEntry & track, uint64 timecode, DataBuffer & buffer, LacingType lacing, const KaxBlockBlob * PastBlock, const KaxBlockBlob * ForwBlock) { - bool bResult = false; + bool bResult = false; #if MATROSKA_VERSION >= 2 - if ((SimpleBlockMode == BLOCK_BLOB_ALWAYS_SIMPLE) || (SimpleBlockMode == BLOCK_BLOB_SIMPLE_AUTO && PastBlock == NULL && ForwBlock == NULL)) { - assert(bUseSimpleBlock == true); - if (Block.simpleblock == NULL) { - Block.simpleblock = new KaxSimpleBlock(); - Block.simpleblock->SetParent(*ParentCluster); - } + if ((SimpleBlockMode == BLOCK_BLOB_ALWAYS_SIMPLE) || (SimpleBlockMode == BLOCK_BLOB_SIMPLE_AUTO && PastBlock == NULL && ForwBlock == NULL)) { + assert(bUseSimpleBlock == true); + if (Block.simpleblock == NULL) { + Block.simpleblock = new KaxSimpleBlock(); + Block.simpleblock->SetParent(*ParentCluster); + } - bResult = Block.simpleblock->AddFrame(track, timecode, buffer, lacing); - if (PastBlock == NULL && ForwBlock == NULL) { - Block.simpleblock->SetKeyframe(true); - Block.simpleblock->SetDiscardable(false); - } else { - Block.simpleblock->SetKeyframe(false); - if ((ForwBlock == NULL || ((const KaxInternalBlock &)*ForwBlock).GlobalTimecode() <= timecode) && - (PastBlock == NULL || ((const KaxInternalBlock &)*PastBlock).GlobalTimecode() <= timecode)) - Block.simpleblock->SetDiscardable(false); - else - Block.simpleblock->SetDiscardable(true); - } - } - else + bResult = Block.simpleblock->AddFrame(track, timecode, buffer, lacing); + if (PastBlock == NULL && ForwBlock == NULL) { + Block.simpleblock->SetKeyframe(true); + Block.simpleblock->SetDiscardable(false); + } else { + Block.simpleblock->SetKeyframe(false); + if ((ForwBlock == NULL || ((const KaxInternalBlock &)*ForwBlock).GlobalTimecode() <= timecode) && + (PastBlock == NULL || ((const KaxInternalBlock &)*PastBlock).GlobalTimecode() <= timecode)) + Block.simpleblock->SetDiscardable(false); + else + Block.simpleblock->SetDiscardable(true); + } + } + else #endif - { - if (ReplaceSimpleByGroup()) { - bResult = Block.group->AddFrame(track, timecode, buffer, PastBlock, ForwBlock, lacing); - } - } + { + if (ReplaceSimpleByGroup()) { + bResult = Block.group->AddFrame(track, timecode, buffer, PastBlock, ForwBlock, lacing); + } + } - return bResult; + return bResult; } void KaxBlockBlob::SetParent(KaxCluster & parent_clust) { - ParentCluster = &parent_clust; + ParentCluster = &parent_clust; } void KaxBlockBlob::SetBlockDuration(uint64 TimeLength) { - if (ReplaceSimpleByGroup()) - Block.group->SetBlockDuration(TimeLength); + if (ReplaceSimpleByGroup()) + Block.group->SetBlockDuration(TimeLength); } bool KaxBlockBlob::ReplaceSimpleByGroup() { - if (SimpleBlockMode== BLOCK_BLOB_ALWAYS_SIMPLE) - return false; + if (SimpleBlockMode== BLOCK_BLOB_ALWAYS_SIMPLE) + return false; - if (!bUseSimpleBlock) { - if (Block.group == NULL) { - Block.group = new KaxBlockGroup(); - } - } + if (!bUseSimpleBlock) { + if (Block.group == NULL) { + Block.group = new KaxBlockGroup(); + } + } #if MATROSKA_VERSION >= 2 - else - { + else + { - if (Block.simpleblock != NULL) { - KaxSimpleBlock *old_simpleblock = Block.simpleblock; - Block.group = new KaxBlockGroup(); - // _TODO_ : move all the data to the blockgroup - assert(false); - // -> while(frame) AddFrame(myBuffer) - delete old_simpleblock; - } else { - Block.group = new KaxBlockGroup(); - } - } + if (Block.simpleblock != NULL) { + KaxSimpleBlock *old_simpleblock = Block.simpleblock; + Block.group = new KaxBlockGroup(); + // _TODO_ : move all the data to the blockgroup + assert(false); + // -> while(frame) AddFrame(myBuffer) + delete old_simpleblock; + } else { + Block.group = new KaxBlockGroup(); + } + } #endif - if (ParentCluster != NULL) - Block.group->SetParent(*ParentCluster); + if (ParentCluster != NULL) + Block.group->SetParent(*ParentCluster); - bUseSimpleBlock = false; - return true; + bUseSimpleBlock = false; + return true; } void KaxBlockBlob::SetBlockGroup( KaxBlockGroup &BlockRef ) { - assert(!bUseSimpleBlock); - Block.group = &BlockRef; + assert(!bUseSimpleBlock); + Block.group = &BlockRef; } filepos_t KaxBlockVirtual::ReadData(IOCallback & input, ScopeMode /* ReadFully */) diff --git a/src/KaxBlockData.cpp b/src/KaxBlockData.cpp index c9b6e3c..1cb308a 100644 --- a/src/KaxBlockData.cpp +++ b/src/KaxBlockData.cpp @@ -9,12 +9,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -26,9 +26,9 @@ **********************************************************************/ /*! - \file - \version \$Id: KaxBlockData.cpp 1226 2005-10-13 21:16:43Z robux4 $ - \author Steve Lhomme + \file + \version \$Id: KaxBlockData.cpp 1226 2005-10-13 21:16:43Z robux4 $ + \author Steve Lhomme */ #include @@ -44,8 +44,8 @@ START_LIBMATROSKA_NAMESPACE const KaxBlockBlob & KaxReferenceBlock::RefBlock() const { - assert(RefdBlock != NULL); - return *RefdBlock; + assert(RefdBlock != NULL); + return *RefdBlock; } KaxReferenceBlock::KaxReferenceBlock(EBML_EXTRA_DEF) @@ -81,34 +81,34 @@ void KaxReferenceBlock::FreeBlob() filepos_t KaxReferenceBlock::UpdateSize(bool bSaveDefault, bool bForceRender) { - if (!bTimecodeSet) { - assert(RefdBlock != NULL); - assert(ParentBlock != NULL); + 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); + 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); + assert(RefdBlock == NULL); + assert(aRefdBlock != NULL); FreeBlob(); - RefdBlock = aRefdBlock; + RefdBlock = aRefdBlock; bOurBlob = true; - SetValueIsSet(); + 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; + KaxBlockBlob *block_blob = new KaxBlockBlob(BLOCK_BLOB_NO_SIMPLE); + block_blob->SetBlockGroup(*const_cast(&aRefdBlock)); + RefdBlock = block_blob; bOurBlob = true; - SetValueIsSet(); + SetValueIsSet(); } END_LIBMATROSKA_NAMESPACE diff --git a/src/KaxCluster.cpp b/src/KaxCluster.cpp index 068f7e0..a1d6514 100644 --- a/src/KaxCluster.cpp +++ b/src/KaxCluster.cpp @@ -9,12 +9,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -26,9 +26,9 @@ **********************************************************************/ /*! - \file - \version \$Id: KaxCluster.cpp 1228 2005-10-14 19:36:51Z robux4 $ - \author Steve Lhomme + \file + \version \$Id: KaxCluster.cpp 1228 2005-10-14 19:36:51Z robux4 $ + \author Steve Lhomme */ #include "matroska/KaxCluster.h" #include "matroska/KaxBlock.h" @@ -40,263 +40,263 @@ START_LIBMATROSKA_NAMESPACE KaxCluster::KaxCluster(EBML_EXTRA_DEF) - :EbmlMaster(EBML_CLASS_SEMCONTEXT(KaxCluster) EBML_DEF_SEP EBML_EXTRA_CALL) - ,currentNewBlock(NULL) - ,ParentSegment(NULL) - ,bFirstFrameInside(false) - ,bPreviousTimecodeIsSet(false) - ,bTimecodeScaleIsSet(false) - ,bSilentTracksUsed(false) + :EbmlMaster(EBML_CLASS_SEMCONTEXT(KaxCluster) EBML_DEF_SEP EBML_EXTRA_CALL) + ,currentNewBlock(NULL) + ,ParentSegment(NULL) + ,bFirstFrameInside(false) + ,bPreviousTimecodeIsSet(false) + ,bTimecodeScaleIsSet(false) + ,bSilentTracksUsed(false) {} -KaxCluster::KaxCluster(const KaxCluster & ElementToClone) +KaxCluster::KaxCluster(const KaxCluster & ElementToClone) :EbmlMaster(ElementToClone) ,bSilentTracksUsed(ElementToClone.bSilentTracksUsed) { - // update the parent of each children - EBML_MASTER_ITERATOR Itr = begin(); - while (Itr != end()) - { - if (EbmlId(**Itr) == EBML_ID(KaxBlockGroup)) { - static_cast(*Itr)->SetParent(*this); - } else if (EbmlId(**Itr) == EBML_ID(KaxBlock)) { - static_cast(*Itr)->SetParent(*this); + // update the parent of each children + EBML_MASTER_ITERATOR Itr = begin(); + while (Itr != end()) + { + if (EbmlId(**Itr) == EBML_ID(KaxBlockGroup)) { + static_cast(*Itr)->SetParent(*this); + } else if (EbmlId(**Itr) == EBML_ID(KaxBlock)) { + static_cast(*Itr)->SetParent(*this); #if MATROSKA_VERSION >= 2 - } else if (EbmlId(**Itr) == EBML_ID(KaxBlockVirtual)) { - static_cast(*Itr)->SetParent(*this); + } else if (EbmlId(**Itr) == EBML_ID(KaxBlockVirtual)) { + static_cast(*Itr)->SetParent(*this); #endif // MATROSKA_VERSION - } + } ++Itr; - } + } } bool KaxCluster::AddBlockBlob(KaxBlockBlob * NewBlob) { - Blobs.push_back(NewBlob); - return true; + Blobs.push_back(NewBlob); + return true; } bool KaxCluster::AddFrameInternal(const KaxTrackEntry & track, uint64 timecode, DataBuffer & buffer, KaxBlockGroup * & MyNewBlock, const KaxBlockGroup * PastBlock, const KaxBlockGroup * ForwBlock, LacingType lacing) { - if (!bFirstFrameInside) { - bFirstFrameInside = true; - MinTimecode = MaxTimecode = timecode; - } else { - if (timecode < MinTimecode) - MinTimecode = timecode; - if (timecode > MaxTimecode) - MaxTimecode = timecode; - } + if (!bFirstFrameInside) { + bFirstFrameInside = true; + MinTimecode = MaxTimecode = timecode; + } else { + if (timecode < MinTimecode) + MinTimecode = timecode; + if (timecode > MaxTimecode) + MaxTimecode = timecode; + } - MyNewBlock = NULL; + MyNewBlock = NULL; - if (lacing == LACING_NONE || !track.LacingEnabled()) { - currentNewBlock = NULL; - } + if (lacing == LACING_NONE || !track.LacingEnabled()) { + currentNewBlock = NULL; + } - // force creation of a new block - if (currentNewBlock == NULL || uint32(track.TrackNumber()) != uint32(currentNewBlock->TrackNumber()) || PastBlock != NULL || ForwBlock != NULL) { - KaxBlockGroup & aNewBlock = GetNewBlock(); - MyNewBlock = currentNewBlock = &aNewBlock; - } + // force creation of a new block + if (currentNewBlock == NULL || uint32(track.TrackNumber()) != uint32(currentNewBlock->TrackNumber()) || PastBlock != NULL || ForwBlock != NULL) { + KaxBlockGroup & aNewBlock = GetNewBlock(); + MyNewBlock = currentNewBlock = &aNewBlock; + } - if (PastBlock != NULL) { - if (ForwBlock != NULL) { - if (currentNewBlock->AddFrame(track, timecode, buffer, *PastBlock, *ForwBlock, lacing)) { - // more data are allowed in this Block - return true; - } else { - currentNewBlock = NULL; - return false; - } - } else { - if (currentNewBlock->AddFrame(track, timecode, buffer, *PastBlock, lacing)) { - // more data are allowed in this Block - return true; - } else { - currentNewBlock = NULL; - return false; - } - } - } else { - if (currentNewBlock->AddFrame(track, timecode, buffer, lacing)) { - // more data are allowed in this Block - return true; - } else { - currentNewBlock = NULL; - return false; - } - } + if (PastBlock != NULL) { + if (ForwBlock != NULL) { + if (currentNewBlock->AddFrame(track, timecode, buffer, *PastBlock, *ForwBlock, lacing)) { + // more data are allowed in this Block + return true; + } else { + currentNewBlock = NULL; + return false; + } + } else { + if (currentNewBlock->AddFrame(track, timecode, buffer, *PastBlock, lacing)) { + // more data are allowed in this Block + return true; + } else { + currentNewBlock = NULL; + return false; + } + } + } else { + if (currentNewBlock->AddFrame(track, timecode, buffer, lacing)) { + // more data are allowed in this Block + return true; + } else { + currentNewBlock = NULL; + return false; + } + } } bool KaxCluster::AddFrame(const KaxTrackEntry & track, uint64 timecode, DataBuffer & buffer, KaxBlockGroup * & MyNewBlock, LacingType lacing) { - assert(Blobs.size() == 0); // mutually exclusive for the moment - return AddFrameInternal(track, timecode, buffer, MyNewBlock, NULL, NULL, lacing); + assert(Blobs.size() == 0); // mutually exclusive for the moment + return AddFrameInternal(track, timecode, buffer, MyNewBlock, NULL, NULL, lacing); } bool KaxCluster::AddFrame(const KaxTrackEntry & track, uint64 timecode, DataBuffer & buffer, KaxBlockGroup * & MyNewBlock, const KaxBlockGroup & PastBlock, LacingType lacing) { - assert(Blobs.size() == 0); // mutually exclusive for the moment - return AddFrameInternal(track, timecode, buffer, MyNewBlock, &PastBlock, NULL, lacing); + assert(Blobs.size() == 0); // mutually exclusive for the moment + return AddFrameInternal(track, timecode, buffer, MyNewBlock, &PastBlock, NULL, lacing); } bool KaxCluster::AddFrame(const KaxTrackEntry & track, uint64 timecode, DataBuffer & buffer, KaxBlockGroup * & MyNewBlock, const KaxBlockGroup & PastBlock, const KaxBlockGroup & ForwBlock, LacingType lacing) { - assert(Blobs.size() == 0); // mutually exclusive for the moment - return AddFrameInternal(track, timecode, buffer, MyNewBlock, &PastBlock, &ForwBlock, lacing); + assert(Blobs.size() == 0); // mutually exclusive for the moment + return AddFrameInternal(track, timecode, buffer, MyNewBlock, &PastBlock, &ForwBlock, lacing); } /*! - \todo only put the Blocks written in the cue entries + \todo only put the Blocks written in the cue entries */ filepos_t KaxCluster::Render(IOCallback & output, KaxCues & CueToUpdate, bool bSaveDefault) { - filepos_t Result = 0; + filepos_t Result = 0; size_t Index; EBML_MASTER_ITERATOR TrkItr, Itr; - // update the Timecode of the Cluster before writing - KaxClusterTimecode * Timecode = static_cast(this->FindElt(EBML_INFO(KaxClusterTimecode))); - *static_cast(Timecode) = GlobalTimecode() / GlobalTimecodeScale(); + // update the Timecode of the Cluster before writing + KaxClusterTimecode * Timecode = static_cast(this->FindElt(EBML_INFO(KaxClusterTimecode))); + *static_cast(Timecode) = GlobalTimecode() / GlobalTimecodeScale(); - if (Blobs.size() == 0) { - // old-school direct KaxBlockGroup + if (Blobs.size() == 0) { + // old-school direct KaxBlockGroup - // SilentTracks handling - // check the parent cluster for existing tracks and see if they are contained in this cluster or not - if (bSilentTracksUsed) - { - KaxTracks & MyTracks = *static_cast(ParentSegment->FindElt(EBML_INFO(KaxTracks))); - for (TrkItr = MyTracks.begin(); TrkItr != MyTracks.end(); ++TrkItr) + // SilentTracks handling + // check the parent cluster for existing tracks and see if they are contained in this cluster or not + if (bSilentTracksUsed) + { + KaxTracks & MyTracks = *static_cast(ParentSegment->FindElt(EBML_INFO(KaxTracks))); + for (TrkItr = MyTracks.begin(); TrkItr != MyTracks.end(); ++TrkItr) { - if (EbmlId(*(*TrkItr)) == EBML_ID(KaxTrackEntry)) - { - KaxTrackEntry & entry = *static_cast(*TrkItr); - uint32 tracknum = entry.TrackNumber(); - for (Itr = begin(); Itr != end(); ++Itr) + if (EbmlId(*(*TrkItr)) == EBML_ID(KaxTrackEntry)) + { + KaxTrackEntry & entry = *static_cast(*TrkItr); + uint32 tracknum = entry.TrackNumber(); + for (Itr = begin(); Itr != end(); ++Itr) { - if (EbmlId(*(*Itr)) == EBML_ID(KaxBlockGroup)) { - KaxBlockGroup & group = *static_cast(*Itr); - if (group.TrackNumber() == tracknum) - break; // this track is used - } - } - // the track wasn't found in this cluster - if (Itr == end()) - { - KaxClusterSilentTracks * SilentTracks = static_cast(this->FindFirstElt(EBML_INFO(KaxClusterSilentTracks))); - assert(SilentTracks != NULL); // the flag bSilentTracksUsed should be set when creating the Cluster - KaxClusterSilentTrackNumber * trackelt = static_cast(SilentTracks->AddNewElt(EBML_INFO(KaxClusterSilentTrackNumber))); - *static_cast(trackelt) = tracknum; - } - } - } - } + if (EbmlId(*(*Itr)) == EBML_ID(KaxBlockGroup)) { + KaxBlockGroup & group = *static_cast(*Itr); + if (group.TrackNumber() == tracknum) + break; // this track is used + } + } + // the track wasn't found in this cluster + if (Itr == end()) + { + KaxClusterSilentTracks * SilentTracks = static_cast(this->FindFirstElt(EBML_INFO(KaxClusterSilentTracks))); + assert(SilentTracks != NULL); // the flag bSilentTracksUsed should be set when creating the Cluster + KaxClusterSilentTrackNumber * trackelt = static_cast(SilentTracks->AddNewElt(EBML_INFO(KaxClusterSilentTrackNumber))); + *static_cast(trackelt) = tracknum; + } + } + } + } + + Result = EbmlMaster::Render(output, bSaveDefault); + // For all Blocks add their position on the CueEntry - Result = EbmlMaster::Render(output, bSaveDefault); - // For all Blocks add their position on the CueEntry - for (Itr = begin(); Itr != end(); ++Itr) { - if (EbmlId(*(*Itr)) == EBML_ID(KaxBlockGroup)) { - CueToUpdate.PositionSet(*static_cast(*Itr)); - } - } - } else { - // new school, using KaxBlockBlob - for (Index = 0; Index(*Itr)); + } + } + } else { + // new school, using KaxBlockBlob + for (Index = 0; Index= 2 - if (Blobs[Index]->IsSimpleBlock()) - PushElement( (KaxSimpleBlock&) *Blobs[Index] ); - else + if (Blobs[Index]->IsSimpleBlock()) + PushElement( (KaxSimpleBlock&) *Blobs[Index] ); + else #endif - PushElement( (KaxBlockGroup&) *Blobs[Index] ); - } + PushElement( (KaxBlockGroup&) *Blobs[Index] ); + } - // SilentTracks handling - // check the parent cluster for existing tracks and see if they are contained in this cluster or not - if (bSilentTracksUsed) - { - KaxTracks & MyTracks = *static_cast(ParentSegment->FindElt(EBML_INFO(KaxTracks))); - for (TrkItr = MyTracks.begin(); TrkItr != MyTracks.end(); ++TrkItr) + // SilentTracks handling + // check the parent cluster for existing tracks and see if they are contained in this cluster or not + if (bSilentTracksUsed) + { + KaxTracks & MyTracks = *static_cast(ParentSegment->FindElt(EBML_INFO(KaxTracks))); + for (TrkItr = MyTracks.begin(); TrkItr != MyTracks.end(); ++TrkItr) { - if (EbmlId(*(*TrkItr)) == EBML_ID(KaxTrackEntry)) - { - KaxTrackEntry & entry = *static_cast(*TrkItr); - uint32 tracknum = entry.TrackNumber(); - for (Index = 0; Index(this->FindFirstElt(EBML_INFO(KaxClusterSilentTracks))); - assert(SilentTracks != NULL); // the flag bSilentTracksUsed should be set when creating the Cluster - KaxClusterSilentTrackNumber * trackelt = static_cast(SilentTracks->AddNewElt(EBML_INFO(KaxClusterSilentTrackNumber))); - *static_cast(trackelt) = tracknum; - } - } - } - } + if (EbmlId(*(*TrkItr)) == EBML_ID(KaxTrackEntry)) + { + KaxTrackEntry & entry = *static_cast(*TrkItr); + uint32 tracknum = entry.TrackNumber(); + for (Index = 0; Index(this->FindFirstElt(EBML_INFO(KaxClusterSilentTracks))); + assert(SilentTracks != NULL); // the flag bSilentTracksUsed should be set when creating the Cluster + KaxClusterSilentTrackNumber * trackelt = static_cast(SilentTracks->AddNewElt(EBML_INFO(KaxClusterSilentTrackNumber))); + *static_cast(trackelt) = tracknum; + } + } + } + } - Result = EbmlMaster::Render(output, bSaveDefault); + Result = EbmlMaster::Render(output, bSaveDefault); - // For all Blocks add their position on the CueEntry - for (Index = 0; Index= int16(0x8000) && TimecodeDelay <= int16(0x7FFF)); - return int16(TimecodeDelay); + int64 TimecodeDelay = (int64(aGlobalTimecode) - int64(GlobalTimecode())) / int64(GlobalTimecodeScale()); + assert(TimecodeDelay >= int16(0x8000) && TimecodeDelay <= int16(0x7FFF)); + return int16(TimecodeDelay); } uint64 KaxCluster::GetBlockGlobalTimecode(int16 GlobalSavedTimecode) { - if (!bFirstFrameInside) { - KaxClusterTimecode * Timecode = static_cast(this->FindElt(EBML_INFO(KaxClusterTimecode))); - assert (bFirstFrameInside); // use the InitTimecode() hack for now - MinTimecode = MaxTimecode = PreviousTimecode = *static_cast(Timecode); - bFirstFrameInside = true; - bPreviousTimecodeIsSet = true; - } - return int64(GlobalSavedTimecode * GlobalTimecodeScale()) + GlobalTimecode(); + if (!bFirstFrameInside) { + KaxClusterTimecode * Timecode = static_cast(this->FindElt(EBML_INFO(KaxClusterTimecode))); + assert (bFirstFrameInside); // use the InitTimecode() hack for now + MinTimecode = MaxTimecode = PreviousTimecode = *static_cast(Timecode); + bFirstFrameInside = true; + bPreviousTimecodeIsSet = true; + } + return int64(GlobalSavedTimecode * GlobalTimecodeScale()) + GlobalTimecode(); } KaxBlockGroup & KaxCluster::GetNewBlock() { - KaxBlockGroup & MyBlock = AddNewChild(*this); - MyBlock.SetParent(*this); - return MyBlock; + KaxBlockGroup & MyBlock = AddNewChild(*this); + MyBlock.SetParent(*this); + return MyBlock; } void KaxCluster::ReleaseFrames() @@ -304,16 +304,16 @@ void KaxCluster::ReleaseFrames() EBML_MASTER_ITERATOR Itr; for (Itr = begin(); Itr != end(); ++Itr) { - if (EbmlId(*(*Itr)) == EBML_ID(KaxBlockGroup)) { - static_cast(*Itr)->ReleaseFrames(); - } - } + if (EbmlId(*(*Itr)) == EBML_ID(KaxBlockGroup)) { + static_cast(*Itr)->ReleaseFrames(); + } + } } uint64 KaxCluster::GetPosition() const { - assert(ParentSegment != NULL); - return ParentSegment->GetRelativePosition(*this); + assert(ParentSegment != NULL); + return ParentSegment->GetRelativePosition(*this); } END_LIBMATROSKA_NAMESPACE diff --git a/src/KaxContexts.cpp b/src/KaxContexts.cpp index 12a1278..6975c48 100644 --- a/src/KaxContexts.cpp +++ b/src/KaxContexts.cpp @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -28,9 +28,9 @@ **********************************************************************/ /*! - \file - \version \$Id: KaxContexts.cpp 640 2004-07-09 21:05:36Z mosu $ - \author Steve Lhomme + \file + \version \$Id: KaxContexts.cpp 640 2004-07-09 21:05:36Z mosu $ + \author Steve Lhomme */ #include "ebml/EbmlContexts.h" #include "ebml/EbmlHead.h" @@ -61,7 +61,7 @@ DEFINE_SEMANTIC_CONTEXT(KaxTrackEntry) // for the moment const EbmlSemanticContext & GetKaxGlobal_Context() { - return GetEbmlGlobal_Context(); + return GetEbmlGlobal_Context(); } END_LIBMATROSKA_NAMESPACE diff --git a/src/KaxCues.cpp b/src/KaxCues.cpp index 0dff50a..9569244 100644 --- a/src/KaxCues.cpp +++ b/src/KaxCues.cpp @@ -9,12 +9,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -26,9 +26,9 @@ **********************************************************************/ /*! - \file - \version \$Id: KaxCues.cpp 1265 2007-01-14 17:20:35Z mosu $ - \author Steve Lhomme + \file + \version \$Id: KaxCues.cpp 1265 2007-01-14 17:20:35Z mosu $ + \author Steve Lhomme */ #include @@ -44,119 +44,119 @@ START_LIBMATROSKA_NAMESPACE KaxCues::~KaxCues() { - assert(myTempReferences.size() == 0); // otherwise that means you have added references and forgot to set the position + assert(myTempReferences.size() == 0); // otherwise that means you have added references and forgot to set the position } /* deprecated and wrong bool KaxCues::AddBlockGroup(const KaxBlockGroup & BlockRef) { - // Do not add the element if it's already present. - std::vector::iterator ListIdx; - KaxBlockBlob *BlockReference = new KaxBlockBlob(BLOCK_BLOB_NO_SIMPLE); - BlockReference->SetBlockGroup(*const_cast(&BlockRef)); + // Do not add the element if it's already present. + std::vector::iterator ListIdx; + KaxBlockBlob *BlockReference = new KaxBlockBlob(BLOCK_BLOB_NO_SIMPLE); + BlockReference->SetBlockGroup(*const_cast(&BlockRef)); - for (ListIdx = myTempReferences.begin(); ListIdx != myTempReferences.end(); ListIdx++) - if (&(KaxBlockGroup&)*ListIdx == &BlockRef) + for (ListIdx = myTempReferences.begin(); ListIdx != myTempReferences.end(); ListIdx++) + if (&(KaxBlockGroup&)*ListIdx == &BlockRef) { delete BlockReference; - return true; + return true; } - myTempReferences.push_back(BlockReference); - return true; + myTempReferences.push_back(BlockReference); + return true; } */ bool KaxCues::AddBlockBlob(const KaxBlockBlob & BlockReference) { - // Do not add the element if it's already present. - std::vector::iterator ListIdx; + // Do not add the element if it's already present. + std::vector::iterator ListIdx; - for (ListIdx = myTempReferences.begin(); ListIdx != myTempReferences.end(); ++ListIdx) - if (*ListIdx == &BlockReference) - return true; + for (ListIdx = myTempReferences.begin(); ListIdx != myTempReferences.end(); ++ListIdx) + if (*ListIdx == &BlockReference) + return true; - myTempReferences.push_back(&BlockReference); - return true; + myTempReferences.push_back(&BlockReference); + return true; } void KaxCues::PositionSet(const KaxBlockBlob & BlockReference) { - // look for the element in the temporary references - std::vector::iterator ListIdx; + // look for the element in the temporary references + std::vector::iterator ListIdx; - for (ListIdx = myTempReferences.begin(); ListIdx != myTempReferences.end(); ++ListIdx) { - if (*ListIdx == &BlockReference) { - // found, now add the element to the entry list - KaxCuePoint & NewPoint = AddNewChild(*this); - NewPoint.PositionSet(BlockReference, GlobalTimecodeScale()); - myTempReferences.erase(ListIdx); - break; - } - } + for (ListIdx = myTempReferences.begin(); ListIdx != myTempReferences.end(); ++ListIdx) { + if (*ListIdx == &BlockReference) { + // found, now add the element to the entry list + KaxCuePoint & NewPoint = AddNewChild(*this); + NewPoint.PositionSet(BlockReference, GlobalTimecodeScale()); + myTempReferences.erase(ListIdx); + break; + } + } } void KaxCues::PositionSet(const KaxBlockGroup & BlockRef) { - // look for the element in the temporary references - std::vector::iterator ListIdx; + // look for the element in the temporary references + std::vector::iterator ListIdx; - for (ListIdx = myTempReferences.begin(); ListIdx != myTempReferences.end(); ++ListIdx) { - const KaxInternalBlock &refTmp = **ListIdx; - if (refTmp.GlobalTimecode() == BlockRef.GlobalTimecode() && - refTmp.TrackNum() == BlockRef.TrackNumber()) { - // found, now add the element to the entry list - KaxCuePoint & NewPoint = AddNewChild(*this); - NewPoint.PositionSet(**ListIdx, GlobalTimecodeScale()); - myTempReferences.erase(ListIdx); - break; - } - } + for (ListIdx = myTempReferences.begin(); ListIdx != myTempReferences.end(); ++ListIdx) { + const KaxInternalBlock &refTmp = **ListIdx; + if (refTmp.GlobalTimecode() == BlockRef.GlobalTimecode() && + refTmp.TrackNum() == BlockRef.TrackNumber()) { + // found, now add the element to the entry list + KaxCuePoint & NewPoint = AddNewChild(*this); + NewPoint.PositionSet(**ListIdx, GlobalTimecodeScale()); + myTempReferences.erase(ListIdx); + break; + } + } } /*! - \warning Assume that the list has been sorted (Sort()) + \warning Assume that the list has been sorted (Sort()) */ const KaxCuePoint * KaxCues::GetTimecodePoint(uint64 aTimecode) const { - uint64 TimecodeToLocate = aTimecode / GlobalTimecodeScale(); - const KaxCuePoint * aPointPrev = NULL; - uint64 aPrevTime = 0; - uint64 aNextTime = EBML_PRETTYLONGINT(0xFFFFFFFFFFFF); + uint64 TimecodeToLocate = aTimecode / GlobalTimecodeScale(); + const KaxCuePoint * aPointPrev = NULL; + uint64 aPrevTime = 0; + uint64 aNextTime = EBML_PRETTYLONGINT(0xFFFFFFFFFFFF); EBML_MASTER_CONST_ITERATOR Itr; - for (Itr = begin(); Itr != end(); ++Itr) + for (Itr = begin(); Itr != end(); ++Itr) { - if (EbmlId(*(*Itr)) == EBML_ID(KaxCuePoint)) { - const KaxCuePoint *tmp = static_cast(*Itr); - // check the tile - const KaxCueTime *aTime = static_cast(tmp->FindFirstElt(EBML_INFO(KaxCueTime))); - if (aTime != NULL) - { - uint64 _Time = uint64(*aTime); - if (_Time > aPrevTime && _Time < TimecodeToLocate) { - aPrevTime = _Time; - aPointPrev = tmp; - } - if (_Time < aNextTime && _Time > TimecodeToLocate) { - aNextTime= _Time; - } - } - } - } + if (EbmlId(*(*Itr)) == EBML_ID(KaxCuePoint)) { + const KaxCuePoint *tmp = static_cast(*Itr); + // check the tile + const KaxCueTime *aTime = static_cast(tmp->FindFirstElt(EBML_INFO(KaxCueTime))); + if (aTime != NULL) + { + uint64 _Time = uint64(*aTime); + if (_Time > aPrevTime && _Time < TimecodeToLocate) { + aPrevTime = _Time; + aPointPrev = tmp; + } + if (_Time < aNextTime && _Time > TimecodeToLocate) { + aNextTime= _Time; + } + } + } + } - return aPointPrev; + return aPointPrev; } uint64 KaxCues::GetTimecodePosition(uint64 aTimecode) const { - const KaxCuePoint * aPoint = GetTimecodePoint(aTimecode); - if (aPoint == NULL) - return 0; + const KaxCuePoint * aPoint = GetTimecodePoint(aTimecode); + if (aPoint == NULL) + return 0; - const KaxCueTrackPositions * aTrack = aPoint->GetSeekPosition(); - if (aTrack == NULL) - return 0; + const KaxCueTrackPositions * aTrack = aPoint->GetSeekPosition(); + if (aTrack == NULL) + return 0; - return aTrack->ClusterPosition(); + return aTrack->ClusterPosition(); } END_LIBMATROSKA_NAMESPACE diff --git a/src/KaxCuesData.cpp b/src/KaxCuesData.cpp index 3596ad4..e0b5bbf 100644 --- a/src/KaxCuesData.cpp +++ b/src/KaxCuesData.cpp @@ -9,12 +9,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -26,9 +26,9 @@ **********************************************************************/ /*! - \file - \version \$Id: KaxCuesData.cpp 1265 2007-01-14 17:20:35Z mosu $ - \author Steve Lhomme + \file + \version \$Id: KaxCuesData.cpp 1265 2007-01-14 17:20:35Z mosu $ + \author Steve Lhomme */ #include @@ -44,197 +44,197 @@ START_LIBMATROSKA_NAMESPACE /*! - \todo handle codec state checking - \todo remove duplicate references (reference to 2 frames that each reference the same frame) + \todo handle codec state checking + \todo remove duplicate references (reference to 2 frames that each reference the same frame) */ void KaxCuePoint::PositionSet(const KaxBlockGroup & BlockReference, uint64 GlobalTimecodeScale) { - // fill me - KaxCueTime & NewTime = GetChild(*this); - *static_cast(&NewTime) = BlockReference.GlobalTimecode() / GlobalTimecodeScale; + // fill me + KaxCueTime & NewTime = GetChild(*this); + *static_cast(&NewTime) = BlockReference.GlobalTimecode() / GlobalTimecodeScale; - KaxCueTrackPositions & NewPositions = AddNewChild(*this); - KaxCueTrack & TheTrack = GetChild(NewPositions); - *static_cast(&TheTrack) = BlockReference.TrackNumber(); - - KaxCueClusterPosition & TheClustPos = GetChild(NewPositions); - *static_cast(&TheClustPos) = BlockReference.ClusterPosition(); + KaxCueTrackPositions & NewPositions = AddNewChild(*this); + KaxCueTrack & TheTrack = GetChild(NewPositions); + *static_cast(&TheTrack) = BlockReference.TrackNumber(); + + KaxCueClusterPosition & TheClustPos = GetChild(NewPositions); + *static_cast(&TheClustPos) = BlockReference.ClusterPosition(); #if MATROSKA_VERSION >= 2 - // handle reference use - if (BlockReference.ReferenceCount() != 0) - { - unsigned int i; - for (i=0; i(NewPositions); - NewRefs.AddReference(BlockReference.Reference(i).RefBlock(), GlobalTimecodeScale); - } - } + // handle reference use + if (BlockReference.ReferenceCount() != 0) + { + unsigned int i; + for (i=0; i(NewPositions); + NewRefs.AddReference(BlockReference.Reference(i).RefBlock(), GlobalTimecodeScale); + } + } - KaxCodecState *CodecState = static_cast(BlockReference.FindFirstElt(EBML_INFO(KaxCodecState))); - if (CodecState != NULL) { - KaxCueCodecState &CueCodecState = AddNewChild(NewPositions); - *static_cast(&CueCodecState) = BlockReference.GetParentCluster()->GetParentSegment()->GetRelativePosition(CodecState->GetElementPosition()); - } + KaxCodecState *CodecState = static_cast(BlockReference.FindFirstElt(EBML_INFO(KaxCodecState))); + if (CodecState != NULL) { + KaxCueCodecState &CueCodecState = AddNewChild(NewPositions); + *static_cast(&CueCodecState) = BlockReference.GetParentCluster()->GetParentSegment()->GetRelativePosition(CodecState->GetElementPosition()); + } #endif // MATROSKA_VERSION - SetValueIsSet(); + SetValueIsSet(); } void KaxCuePoint::PositionSet(const KaxBlockBlob & BlobReference, uint64 GlobalTimecodeScale) { - const KaxInternalBlock &BlockReference = BlobReference; + const KaxInternalBlock &BlockReference = BlobReference; - // fill me - KaxCueTime & NewTime = GetChild(*this); - *static_cast(&NewTime) = BlockReference.GlobalTimecode() / GlobalTimecodeScale; + // fill me + KaxCueTime & NewTime = GetChild(*this); + *static_cast(&NewTime) = BlockReference.GlobalTimecode() / GlobalTimecodeScale; - KaxCueTrackPositions & NewPositions = AddNewChild(*this); - KaxCueTrack & TheTrack = GetChild(NewPositions); - *static_cast(&TheTrack) = BlockReference.TrackNum(); - - KaxCueClusterPosition & TheClustPos = GetChild(NewPositions); - *static_cast(&TheClustPos) = BlockReference.ClusterPosition(); + KaxCueTrackPositions & NewPositions = AddNewChild(*this); + KaxCueTrack & TheTrack = GetChild(NewPositions); + *static_cast(&TheTrack) = BlockReference.TrackNum(); + + KaxCueClusterPosition & TheClustPos = GetChild(NewPositions); + *static_cast(&TheClustPos) = BlockReference.ClusterPosition(); #if 0 // MATROSKA_VERSION >= 2 - // handle reference use - if (BlockReference.ReferenceCount() != 0) - { - unsigned int i; - for (i=0; i(NewPositions); - NewRefs.AddReference(BlockReference.Reference(i).RefBlock(), GlobalTimecodeScale); - } - } + // handle reference use + if (BlockReference.ReferenceCount() != 0) + { + unsigned int i; + for (i=0; i(NewPositions); + NewRefs.AddReference(BlockReference.Reference(i).RefBlock(), GlobalTimecodeScale); + } + } #endif // MATROSKA_VERSION #if MATROSKA_VERSION >= 2 - if (!BlobReference.IsSimpleBlock()) { - const KaxBlockGroup &BlockGroup = BlobReference; - const KaxCodecState *CodecState = static_cast(BlockGroup.FindFirstElt(EBML_INFO(KaxCodecState))); - if (CodecState != NULL) { - KaxCueCodecState &CueCodecState = AddNewChild(NewPositions); - *static_cast(&CueCodecState) = BlockGroup.GetParentCluster()->GetParentSegment()->GetRelativePosition(CodecState->GetElementPosition()); - } - } + if (!BlobReference.IsSimpleBlock()) { + const KaxBlockGroup &BlockGroup = BlobReference; + const KaxCodecState *CodecState = static_cast(BlockGroup.FindFirstElt(EBML_INFO(KaxCodecState))); + if (CodecState != NULL) { + KaxCueCodecState &CueCodecState = AddNewChild(NewPositions); + *static_cast(&CueCodecState) = BlockGroup.GetParentCluster()->GetParentSegment()->GetRelativePosition(CodecState->GetElementPosition()); + } + } #endif // MATROSKA_VERSION - SetValueIsSet(); + SetValueIsSet(); } #if MATROSKA_VERSION >= 2 /*! - \todo handle codec state checking + \todo handle codec state checking */ void KaxCueReference::AddReference(const KaxBlockBlob & BlockReference, uint64 GlobalTimecodeScale) { - const KaxInternalBlock & theBlock = BlockReference; - KaxCueRefTime & NewTime = GetChild(*this); - *static_cast(&NewTime) = theBlock.GlobalTimecode() / GlobalTimecodeScale; + const KaxInternalBlock & theBlock = BlockReference; + KaxCueRefTime & NewTime = GetChild(*this); + *static_cast(&NewTime) = theBlock.GlobalTimecode() / GlobalTimecodeScale; - KaxCueRefCluster & TheClustPos = GetChild(*this); - *static_cast(&TheClustPos) = theBlock.ClusterPosition(); + KaxCueRefCluster & TheClustPos = GetChild(*this); + *static_cast(&TheClustPos) = theBlock.ClusterPosition(); #ifdef OLD - // handle recursive reference use - if (BlockReference.ReferenceCount() != 0) - { - unsigned int i; - for (i=0; i(EltB); + const KaxCuePoint & theEltB = *static_cast(EltB); - // compare timecode - const KaxCueTime * TimeCodeA = static_cast(FindElt(EBML_INFO(KaxCueTime))); - if (TimeCodeA == NULL) - return false; + // compare timecode + const KaxCueTime * TimeCodeA = static_cast(FindElt(EBML_INFO(KaxCueTime))); + if (TimeCodeA == NULL) + return false; - const KaxCueTime * TimeCodeB = static_cast(theEltB.FindElt(EBML_INFO(KaxCueTime))); - if (TimeCodeB == NULL) - return false; + const KaxCueTime * TimeCodeB = static_cast(theEltB.FindElt(EBML_INFO(KaxCueTime))); + if (TimeCodeB == NULL) + return false; - if (TimeCodeA->IsSmallerThan(TimeCodeB)) - return true; + if (TimeCodeA->IsSmallerThan(TimeCodeB)) + return true; - if (TimeCodeB->IsSmallerThan(TimeCodeA)) - return false; + if (TimeCodeB->IsSmallerThan(TimeCodeA)) + return false; - // compare tracks (timecodes are equal) - const KaxCueTrack * TrackA = static_cast(FindElt(EBML_INFO(KaxCueTrack))); - if (TrackA == NULL) - return false; + // compare tracks (timecodes are equal) + const KaxCueTrack * TrackA = static_cast(FindElt(EBML_INFO(KaxCueTrack))); + if (TrackA == NULL) + return false; - const KaxCueTrack * TrackB = static_cast(theEltB.FindElt(EBML_INFO(KaxCueTrack))); - if (TrackB == NULL) - return false; + const KaxCueTrack * TrackB = static_cast(theEltB.FindElt(EBML_INFO(KaxCueTrack))); + if (TrackB == NULL) + return false; - if (TrackA->IsSmallerThan(TrackB)) - return true; + if (TrackA->IsSmallerThan(TrackB)) + return true; - if (TrackB->IsSmallerThan(TrackA)) - return false; + if (TrackB->IsSmallerThan(TrackA)) + return false; - return false; + return false; } bool KaxCuePoint::Timecode(uint64 & aTimecode, uint64 GlobalTimecodeScale) const { - const KaxCueTime *aTime = static_cast(FindFirstElt(EBML_INFO(KaxCueTime))); - if (aTime == NULL) - return false; - aTimecode = uint64(*aTime) * GlobalTimecodeScale; - return true; + const KaxCueTime *aTime = static_cast(FindFirstElt(EBML_INFO(KaxCueTime))); + if (aTime == NULL) + return false; + aTimecode = uint64(*aTime) * GlobalTimecodeScale; + return true; } /*! - \brief return the position of the Cluster to load + \brief return the position of the Cluster to load */ const KaxCueTrackPositions * KaxCuePoint::GetSeekPosition() const { - const KaxCueTrackPositions * result = NULL; - uint64 aPosition = EBML_PRETTYLONGINT(0xFFFFFFFFFFFFFFF); - // find the position of the "earlier" Cluster - const KaxCueTrackPositions *aPoss = static_cast(FindFirstElt(EBML_INFO(KaxCueTrackPositions))); - while (aPoss != NULL) - { - const KaxCueClusterPosition *aPos = static_cast(aPoss->FindFirstElt(EBML_INFO(KaxCueClusterPosition))); - if (aPos != NULL && uint64(*aPos) < aPosition) { - aPosition = uint64(*aPos); - result = aPoss; - } - - aPoss = static_cast(FindNextElt(*aPoss)); - } - return result; + const KaxCueTrackPositions * result = NULL; + uint64 aPosition = EBML_PRETTYLONGINT(0xFFFFFFFFFFFFFFF); + // find the position of the "earlier" Cluster + const KaxCueTrackPositions *aPoss = static_cast(FindFirstElt(EBML_INFO(KaxCueTrackPositions))); + while (aPoss != NULL) + { + const KaxCueClusterPosition *aPos = static_cast(aPoss->FindFirstElt(EBML_INFO(KaxCueClusterPosition))); + if (aPos != NULL && uint64(*aPos) < aPosition) { + aPosition = uint64(*aPos); + result = aPoss; + } + + aPoss = static_cast(FindNextElt(*aPoss)); + } + return result; } uint64 KaxCueTrackPositions::ClusterPosition() const { - const KaxCueClusterPosition *aPos = static_cast(FindFirstElt(EBML_INFO(KaxCueClusterPosition))); - if (aPos == NULL) - return 0; + const KaxCueClusterPosition *aPos = static_cast(FindFirstElt(EBML_INFO(KaxCueClusterPosition))); + if (aPos == NULL) + return 0; - return uint64(*aPos); + return uint64(*aPos); } uint16 KaxCueTrackPositions::TrackNumber() const { - const KaxCueTrack *aTrack = static_cast(FindFirstElt(EBML_INFO(KaxCueTrack))); - if (aTrack == NULL) - return 0; + const KaxCueTrack *aTrack = static_cast(FindFirstElt(EBML_INFO(KaxCueTrack))); + if (aTrack == NULL) + return 0; - return uint16(*aTrack); + return uint16(*aTrack); } diff --git a/src/KaxInfoData.cpp b/src/KaxInfoData.cpp index f871b1f..fffc9f1 100644 --- a/src/KaxInfoData.cpp +++ b/src/KaxInfoData.cpp @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -28,10 +28,10 @@ **********************************************************************/ /*! - \file - \version \$Id$ - \author Steve Lhomme - \author John Cannon + \file + \version \$Id$ + \author Steve Lhomme + \author John Cannon */ #include "matroska/KaxInfoData.h" #include "matroska/KaxContexts.h" diff --git a/src/KaxSeekHead.cpp b/src/KaxSeekHead.cpp index 4bddc95..6f6201a 100644 --- a/src/KaxSeekHead.cpp +++ b/src/KaxSeekHead.cpp @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -28,9 +28,9 @@ **********************************************************************/ /*! - \file - \version \$Id: KaxSeekHead.cpp 640 2004-07-09 21:05:36Z mosu $ - \author Steve Lhomme + \file + \version \$Id: KaxSeekHead.cpp 640 2004-07-09 21:05:36Z mosu $ + \author Steve Lhomme */ #include "matroska/KaxSeekHead.h" #include "matroska/KaxContexts.h" @@ -44,106 +44,106 @@ using namespace LIBEBML_NAMESPACE; START_LIBMATROSKA_NAMESPACE /*! - \todo verify that the element is not already in the list + \todo verify that the element is not already in the list */ void KaxSeekHead::IndexThis(const EbmlElement & aElt, const KaxSegment & ParentSegment) { - // create a new point - KaxSeek & aNewPoint = AddNewChild(*this); + // create a new point + KaxSeek & aNewPoint = AddNewChild(*this); - // add the informations to this element - KaxSeekPosition & aNewPos = GetChild(aNewPoint); - *static_cast(&aNewPos) = ParentSegment.GetRelativePosition(aElt); + // add the informations to this element + KaxSeekPosition & aNewPos = GetChild(aNewPoint); + *static_cast(&aNewPos) = ParentSegment.GetRelativePosition(aElt); - KaxSeekID & aNewID = GetChild(aNewPoint); - binary ID[4]; + KaxSeekID & aNewID = GetChild(aNewPoint); + binary ID[4]; ((const EbmlId&)aElt).Fill(ID); - aNewID.CopyBuffer(ID, EBML_ID_LENGTH((const EbmlId&)aElt)); + aNewID.CopyBuffer(ID, EBML_ID_LENGTH((const EbmlId&)aElt)); } KaxSeek * KaxSeekHead::FindFirstOf(const EbmlCallbacks & Callbacks) const { - // parse all the Entries and find the first to match the type - KaxSeek * aElt = static_cast(FindFirstElt(EBML_INFO(KaxSeek))); - while (aElt != NULL) - { - KaxSeekID * aId = NULL; + // parse all the Entries and find the first to match the type + KaxSeek * aElt = static_cast(FindFirstElt(EBML_INFO(KaxSeek))); + while (aElt != NULL) + { + KaxSeekID * aId = NULL; EBML_MASTER_ITERATOR Itr; - for (Itr = aElt->begin(); Itr != aElt->end(); ++Itr) + for (Itr = aElt->begin(); Itr != aElt->end(); ++Itr) { - if (EbmlId(*(*Itr)) == EBML_ID(KaxSeekID)) { - aId = static_cast(*Itr); - EbmlId aEbmlId(aId->GetBuffer(), aId->GetSize()); - if (aEbmlId == EBML_INFO_ID(Callbacks)) - { - return aElt; - } - break; - } - } - aElt = static_cast(FindNextElt(*aElt)); - } + if (EbmlId(*(*Itr)) == EBML_ID(KaxSeekID)) { + aId = static_cast(*Itr); + EbmlId aEbmlId(aId->GetBuffer(), aId->GetSize()); + if (aEbmlId == EBML_INFO_ID(Callbacks)) + { + return aElt; + } + break; + } + } + aElt = static_cast(FindNextElt(*aElt)); + } - return NULL; + return NULL; } KaxSeek * KaxSeekHead::FindNextOf(const KaxSeek &aPrev) const { EBML_MASTER_CONST_ITERATOR Itr; - KaxSeek *tmp; - - // look for the previous in the list - for (Itr = begin(); Itr != end(); ++Itr) - { - if (*Itr == static_cast(&aPrev)) - break; - } + KaxSeek *tmp; - if (Itr != end()) + // look for the previous in the list + for (Itr = begin(); Itr != end(); ++Itr) { - ++Itr; - for (; Itr != end(); ++Itr) + if (*Itr == static_cast(&aPrev)) + break; + } + + if (Itr != end()) + { + ++Itr; + for (; Itr != end(); ++Itr) { - if (EbmlId(*(*Itr)) == EBML_ID(KaxSeek)) - { - tmp = (KaxSeek *)(*Itr); - if (tmp->IsEbmlId(aPrev)) - return tmp; - } - } - } + if (EbmlId(*(*Itr)) == EBML_ID(KaxSeek)) + { + tmp = (KaxSeek *)(*Itr); + if (tmp->IsEbmlId(aPrev)) + return tmp; + } + } + } - return NULL; + return NULL; } int64 KaxSeek::Location() const { - KaxSeekPosition *aPos = static_cast(FindFirstElt(EBML_INFO(KaxSeekPosition))); - if (aPos == NULL) - return 0; - return uint64(*aPos); + KaxSeekPosition *aPos = static_cast(FindFirstElt(EBML_INFO(KaxSeekPosition))); + if (aPos == NULL) + return 0; + return uint64(*aPos); } bool KaxSeek::IsEbmlId(const EbmlId & aId) const { - KaxSeekID *_Id = static_cast(FindFirstElt(EBML_INFO(KaxSeekID))); - if (_Id == NULL) - return false; - EbmlId aEbmlId(_Id->GetBuffer(), _Id->GetSize()); - return (aId == aEbmlId); + KaxSeekID *_Id = static_cast(FindFirstElt(EBML_INFO(KaxSeekID))); + if (_Id == NULL) + return false; + EbmlId aEbmlId(_Id->GetBuffer(), _Id->GetSize()); + return (aId == aEbmlId); } bool KaxSeek::IsEbmlId(const KaxSeek & aPoint) const { - KaxSeekID *_IdA = static_cast(FindFirstElt(EBML_INFO(KaxSeekID))); - if (_IdA == NULL) - return false; - KaxSeekID *_IdB = static_cast(aPoint.FindFirstElt(EBML_INFO(KaxSeekID))); - if (_IdB == NULL) - return false; - EbmlId aEbmlIdA(_IdA->GetBuffer(), _IdA->GetSize()); - EbmlId aEbmlIdB(_IdB->GetBuffer(), _IdB->GetSize()); - return (aEbmlIdA == aEbmlIdB); + KaxSeekID *_IdA = static_cast(FindFirstElt(EBML_INFO(KaxSeekID))); + if (_IdA == NULL) + return false; + KaxSeekID *_IdB = static_cast(aPoint.FindFirstElt(EBML_INFO(KaxSeekID))); + if (_IdB == NULL) + return false; + EbmlId aEbmlIdA(_IdA->GetBuffer(), _IdA->GetSize()); + EbmlId aEbmlIdB(_IdB->GetBuffer(), _IdB->GetSize()); + return (aEbmlIdA == aEbmlIdB); } END_LIBMATROSKA_NAMESPACE diff --git a/src/KaxSegment.cpp b/src/KaxSegment.cpp index 4c5ee4a..bd586cf 100644 --- a/src/KaxSegment.cpp +++ b/src/KaxSegment.cpp @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -28,9 +28,9 @@ **********************************************************************/ /*! - \file - \version \$Id: KaxSegment.cpp 1096 2005-03-17 09:14:52Z robux4 $ - \author Steve Lhomme + \file + \version \$Id: KaxSegment.cpp 1096 2005-03-17 09:14:52Z robux4 $ + \author Steve Lhomme */ #include "matroska/KaxSegment.h" #include "ebml/EbmlHead.h" @@ -46,40 +46,40 @@ START_LIBMATROSKA_NAMESPACE KaxSegment::KaxSegment(EBML_EXTRA_DEF) - :EbmlMaster(EBML_CLASS_SEMCONTEXT(KaxSegment) EBML_DEF_SEP EBML_EXTRA_CALL) + :EbmlMaster(EBML_CLASS_SEMCONTEXT(KaxSegment) EBML_DEF_SEP EBML_EXTRA_CALL) { - SetSizeLength(5); // mandatory min size support (for easier updating) (2^(7*5)-2 = 32Go) - SetSizeInfinite(); // by default a segment is big and the size is unknown in advance + SetSizeLength(5); // mandatory min size support (for easier updating) (2^(7*5)-2 = 32Go) + SetSizeInfinite(); // by default a segment is big and the size is unknown in advance } KaxSegment::KaxSegment(const KaxSegment & ElementToClone) :EbmlMaster(ElementToClone) { - // update the parent of each children - EBML_MASTER_ITERATOR Itr = begin(); - while (Itr != end()) - { - if (EbmlId(**Itr) == EBML_ID(KaxCluster)) { - static_cast(*Itr)->SetParent(*this); - } + // update the parent of each children + EBML_MASTER_ITERATOR Itr = begin(); + while (Itr != end()) + { + if (EbmlId(**Itr) == EBML_ID(KaxCluster)) { + static_cast(*Itr)->SetParent(*this); + } ++Itr; - } + } } uint64 KaxSegment::GetRelativePosition(uint64 aGlobalPosition) const { - return aGlobalPosition - GetElementPosition() - HeadSize(); + return aGlobalPosition - GetElementPosition() - HeadSize(); } uint64 KaxSegment::GetRelativePosition(const EbmlElement & Elt) const { - return GetRelativePosition(Elt.GetElementPosition()); + return GetRelativePosition(Elt.GetElementPosition()); } uint64 KaxSegment::GetGlobalPosition(uint64 aRelativePosition) const { - return aRelativePosition + GetElementPosition() + HeadSize(); + return aRelativePosition + GetElementPosition() + HeadSize(); } END_LIBMATROSKA_NAMESPACE diff --git a/src/KaxSemantic.cpp b/src/KaxSemantic.cpp index c5d0043..4aad41b 100644 --- a/src/KaxSemantic.cpp +++ b/src/KaxSemantic.cpp @@ -1,23 +1,23 @@ /********************************************************************** ** DO NOT EDIT, GENERATED WITH DATA2LIB -** +** ** libmatroska : parse Matroska files, see http://www.matroska.org/ -** +** ** Copyright (c) 2002-2010, Matroska (non-profit organisation) ** All rights reserved. -** +** ** This file is part of libmatroska. ** ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -699,103 +699,103 @@ DEFINE_MKX_UNISTRING(KaxTagString, 0x4487, 2, KaxTagSimple, "TagString"); DEFINE_MKX_BINARY (KaxTagBinary, 0x4485, 2, KaxTagSimple, "TagBinary"); filepos_t KaxBlockVirtual::RenderData(IOCallback & /* output */, bool /* bForceRender */, bool /* bSaveDefault */) { - assert(false); // no you are not allowed to use this element ! - return 0; + assert(false); // no you are not allowed to use this element ! + return 0; } filepos_t KaxReferenceVirtual::RenderData(IOCallback & /* output */, bool /* bForceRender */, bool /* bSaveDefault */) { - assert(false); // no you are not allowed to use this element ! - return 0; + assert(false); // no you are not allowed to use this element ! + return 0; } filepos_t KaxSliceFrameNumber::RenderData(IOCallback & /* output */, bool /* bForceRender */, bool /* bSaveDefault */) { - assert(false); // no you are not allowed to use this element ! - return 0; + assert(false); // no you are not allowed to use this element ! + return 0; } filepos_t KaxSliceBlockAddID::RenderData(IOCallback & /* output */, bool /* bForceRender */, bool /* bSaveDefault */) { - assert(false); // no you are not allowed to use this element ! - return 0; + assert(false); // no you are not allowed to use this element ! + return 0; } filepos_t KaxSliceDelay::RenderData(IOCallback & /* output */, bool /* bForceRender */, bool /* bSaveDefault */) { - assert(false); // no you are not allowed to use this element ! - return 0; + assert(false); // no you are not allowed to use this element ! + return 0; } filepos_t KaxSliceDuration::RenderData(IOCallback & /* output */, bool /* bForceRender */, bool /* bSaveDefault */) { - assert(false); // no you are not allowed to use this element ! - return 0; + assert(false); // no you are not allowed to use this element ! + return 0; } filepos_t KaxEncryptedBlock::RenderData(IOCallback & /* output */, bool /* bForceRender */, bool /* bSaveDefault */) { - assert(false); // no you are not allowed to use this element ! - return 0; + assert(false); // no you are not allowed to use this element ! + return 0; } filepos_t KaxTrackTimecodeScale::RenderData(IOCallback & /* output */, bool /* bForceRender */, bool /* bSaveDefault */) { - assert(false); // no you are not allowed to use this element ! - return 0; + assert(false); // no you are not allowed to use this element ! + return 0; } filepos_t KaxTrackOffset::RenderData(IOCallback & /* output */, bool /* bForceRender */, bool /* bSaveDefault */) { - assert(false); // no you are not allowed to use this element ! - return 0; + assert(false); // no you are not allowed to use this element ! + return 0; } filepos_t KaxCodecSettings::RenderData(IOCallback & /* output */, bool /* bForceRender */, bool /* bSaveDefault */) { - assert(false); // no you are not allowed to use this element ! - return 0; + assert(false); // no you are not allowed to use this element ! + return 0; } filepos_t KaxCodecInfoURL::RenderData(IOCallback & /* output */, bool /* bForceRender */, bool /* bSaveDefault */) { - assert(false); // no you are not allowed to use this element ! - return 0; + assert(false); // no you are not allowed to use this element ! + return 0; } filepos_t KaxCodecDownloadURL::RenderData(IOCallback & /* output */, bool /* bForceRender */, bool /* bSaveDefault */) { - assert(false); // no you are not allowed to use this element ! - return 0; + assert(false); // no you are not allowed to use this element ! + return 0; } filepos_t KaxOldStereoMode::RenderData(IOCallback & /* output */, bool /* bForceRender */, bool /* bSaveDefault */) { - assert(false); // no you are not allowed to use this element ! - return 0; + assert(false); // no you are not allowed to use this element ! + return 0; } filepos_t KaxVideoGamma::RenderData(IOCallback & /* output */, bool /* bForceRender */, bool /* bSaveDefault */) { - assert(false); // no you are not allowed to use this element ! - return 0; + assert(false); // no you are not allowed to use this element ! + return 0; } filepos_t KaxVideoFrameRate::RenderData(IOCallback & /* output */, bool /* bForceRender */, bool /* bSaveDefault */) { - assert(false); // no you are not allowed to use this element ! - return 0; + assert(false); // no you are not allowed to use this element ! + return 0; } filepos_t KaxAudioPosition::RenderData(IOCallback & /* output */, bool /* bForceRender */, bool /* bSaveDefault */) { - assert(false); // no you are not allowed to use this element ! - return 0; + assert(false); // no you are not allowed to use this element ! + return 0; } filepos_t KaxCueRefCluster::RenderData(IOCallback & /* output */, bool /* bForceRender */, bool /* bSaveDefault */) { - assert(false); // no you are not allowed to use this element ! - return 0; + assert(false); // no you are not allowed to use this element ! + return 0; } filepos_t KaxCueRefNumber::RenderData(IOCallback & /* output */, bool /* bForceRender */, bool /* bSaveDefault */) { - assert(false); // no you are not allowed to use this element ! - return 0; + assert(false); // no you are not allowed to use this element ! + return 0; } filepos_t KaxCueRefCodecState::RenderData(IOCallback & /* output */, bool /* bForceRender */, bool /* bSaveDefault */) { - assert(false); // no you are not allowed to use this element ! - return 0; + assert(false); // no you are not allowed to use this element ! + return 0; } filepos_t KaxFileReferral::RenderData(IOCallback & /* output */, bool /* bForceRender */, bool /* bSaveDefault */) { - assert(false); // no you are not allowed to use this element ! - return 0; + assert(false); // no you are not allowed to use this element ! + return 0; } END_LIBMATROSKA_NAMESPACE diff --git a/src/KaxTracks.cpp b/src/KaxTracks.cpp index e4b216e..d56a824 100644 --- a/src/KaxTracks.cpp +++ b/src/KaxTracks.cpp @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -28,9 +28,9 @@ **********************************************************************/ /*! - \file - \version \$Id: KaxTracks.cpp 1202 2005-08-30 14:39:01Z robux4 $ - \author Steve Lhomme + \file + \version \$Id: KaxTracks.cpp 1202 2005-08-30 14:39:01Z robux4 $ + \author Steve Lhomme */ #include "matroska/KaxTracks.h" @@ -41,14 +41,14 @@ START_LIBMATROSKA_NAMESPACE KaxTrackEntry::KaxTrackEntry(EBML_EXTRA_DEF) - :EbmlMaster(EBML_CLASS_SEMCONTEXT(KaxTrackEntry) EBML_DEF_SEP EBML_EXTRA_CALL) - ,bGlobalTimecodeScaleIsSet(false) + :EbmlMaster(EBML_CLASS_SEMCONTEXT(KaxTrackEntry) EBML_DEF_SEP EBML_EXTRA_CALL) + ,bGlobalTimecodeScaleIsSet(false) {} void KaxTrackEntry::EnableLacing(bool bEnable) { - KaxTrackFlagLacing & myLacing = GetChild(*this); - *(static_cast(&myLacing)) = bEnable ? 1 : 0; + KaxTrackFlagLacing & myLacing = GetChild(*this); + *(static_cast(&myLacing)) = bEnable ? 1 : 0; } END_LIBMATROSKA_NAMESPACE diff --git a/src/KaxVersion.cpp b/src/KaxVersion.cpp index 86d7fab..3570104 100644 --- a/src/KaxVersion.cpp +++ b/src/KaxVersion.cpp @@ -28,9 +28,9 @@ **********************************************************************/ /*! - \file - \version \$Id: KaxVersion.cpp 640 2004-07-09 21:05:36Z mosu $ - \author Steve Lhomme + \file + \version \$Id: KaxVersion.cpp 640 2004-07-09 21:05:36Z mosu $ + \author Steve Lhomme */ #include "matroska/KaxVersion.h" diff --git a/test/ebml/test0.cpp b/test/ebml/test0.cpp index dab8b44..fb8e191 100644 --- a/test/ebml/test0.cpp +++ b/test/ebml/test0.cpp @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -31,9 +31,9 @@ \file \version \$Id$ \author Steve Lhomme - Test the EBML write possibilities - \see http://www.cl.cam.ac.uk/~mgk25/unicode.html - \see http://www-106.ibm.com/developerworks/unicode/library/u-encode.html + Test the EBML write possibilities + \see http://www.cl.cam.ac.uk/~mgk25/unicode.html + \see http://www-106.ibm.com/developerworks/unicode/library/u-encode.html */ #include @@ -55,31 +55,31 @@ using namespace LIBEBML_NAMESPACE; const char RW_FILENAME[] = "test.kax"; enum SemanticType { - EBML_U_INTEGER, - EBML_S_INTEGER, - EBML_BINARY, - EBML_STRING, - EBML_STRING_UNICODE, - EBML_FLOAT, - EBML_MASTER, + EBML_U_INTEGER, + EBML_S_INTEGER, + EBML_BINARY, + EBML_STRING, + EBML_STRING_UNICODE, + EBML_FLOAT, + EBML_MASTER, }; typedef binary EBMLID[4]; struct Semantic { - EBMLID Id; - int IdLength; - SemanticType Type; + EBMLID Id; + int IdLength; + SemanticType Type; }; -struct Semantic SemanticList[] = +struct Semantic SemanticList[] = { - {{0x42, 0x45}, 2, EBML_U_INTEGER}, - {{0x1A, 0x45, 0x33, 0x80}, 4, EBML_S_INTEGER}, - {{0x87}, 1, EBML_BINARY}, - {{0x22, 0x33, 0x44}, 3, EBML_STRING}, - {{0x44, 0x33}, 2, EBML_STRING_UNICODE}, - {{0x50, 0x50}, 2, EBML_FLOAT}, - {{0x36, 0x47, 0x58}, 3, EBML_MASTER}, + {{0x42, 0x45}, 2, EBML_U_INTEGER}, + {{0x1A, 0x45, 0x33, 0x80}, 4, EBML_S_INTEGER}, + {{0x87}, 1, EBML_BINARY}, + {{0x22, 0x33, 0x44}, 3, EBML_STRING}, + {{0x44, 0x33}, 2, EBML_STRING_UNICODE}, + {{0x50, 0x50}, 2, EBML_FLOAT}, + {{0x36, 0x47, 0x58}, 3, EBML_MASTER}, }; /*! @@ -88,214 +88,214 @@ struct Semantic SemanticList[] = */ int main(void) { - StdIOCallback Ebml_file(RW_FILENAME, ::MODE_CREATE); - - ///// Writing test + StdIOCallback Ebml_file(RW_FILENAME, ::MODE_CREATE); - /////////////////////////////// - // Unsigned integer - /////////////////////////////// - - EbmlUInteger testUInt(4); // supposed to hold a 4*8 bits value - - testUInt.SetID(SemanticList[0].Id, SemanticList[0].IdLength); - testUInt = 52; - testUInt.SetSizeLength(3); // size should be coded on at least 3 octets - testUInt.Render(Ebml_file); + ///// Writing test - /////////////////////////////// - // Signed integer - /////////////////////////////// - - EbmlSInteger testSInt(4); // supposed to hold a 4*8 bits value + /////////////////////////////// + // Unsigned integer + /////////////////////////////// - testSInt.SetID(SemanticList[1].Id, SemanticList[1].IdLength); - testSInt = -20; - testSInt.Render(Ebml_file); + EbmlUInteger testUInt(4); // supposed to hold a 4*8 bits value - /////////////////////////////// - // Binary data - /////////////////////////////// - const int BINARY_SIZE=3000; - - binary *bin = new binary[BINARY_SIZE]; - memset(bin, 0x61, BINARY_SIZE); - EbmlBinary testBin; + testUInt.SetID(SemanticList[0].Id, SemanticList[0].IdLength); + testUInt = 52; + testUInt.SetSizeLength(3); // size should be coded on at least 3 octets + testUInt.Render(Ebml_file); - testBin.SetID(SemanticList[2].Id, SemanticList[2].IdLength); - testBin.SetBuffer(bin, BINARY_SIZE); - testBin.Render(Ebml_file); + /////////////////////////////// + // Signed integer + /////////////////////////////// - /////////////////////////////// - // String data - /////////////////////////////// - std::string aString = "Hello World !"; - EbmlString testStr(200); + EbmlSInteger testSInt(4); // supposed to hold a 4*8 bits value - testStr.SetID(SemanticList[3].Id, SemanticList[3].IdLength); - testStr = aString; - testStr.Render(Ebml_file); + testSInt.SetID(SemanticList[1].Id, SemanticList[1].IdLength); + testSInt = -20; + testSInt.Render(Ebml_file); - /////////////////////////////// - // Master element - /////////////////////////////// - EbmlMaster testMaster; + /////////////////////////////// + // Binary data + /////////////////////////////// + const int BINARY_SIZE=3000; - testMaster.SetID(SemanticList[6].Id, SemanticList[6].IdLength); - testMaster.PushElement(testStr); - testMaster.PushElement(testUInt); - testMaster.Render(Ebml_file); + binary *bin = new binary[BINARY_SIZE]; + memset(bin, 0x61, BINARY_SIZE); + EbmlBinary testBin; - /////////////////////////////// - // Unicode String data - /////////////////////////////// - UTFstring bString = L"Stטve Lhomm€"; - EbmlUnicodeString testUStr(200); + testBin.SetID(SemanticList[2].Id, SemanticList[2].IdLength); + testBin.SetBuffer(bin, BINARY_SIZE); + testBin.Render(Ebml_file); - testUStr.SetID(SemanticList[4].Id, SemanticList[4].IdLength); - testUStr = bString; - testUStr.Render(Ebml_file); + /////////////////////////////// + // String data + /////////////////////////////// + std::string aString = "Hello World !"; + EbmlString testStr(200); - /////////////////////////////// - // Float data - /////////////////////////////// - EbmlFloat testFloat(EbmlFloat::FLOAT_32); + testStr.SetID(SemanticList[3].Id, SemanticList[3].IdLength); + testStr = aString; + testStr.Render(Ebml_file); - testFloat.SetID(SemanticList[5].Id, SemanticList[5].IdLength); - testFloat.SetPrecision(EbmlFloat::FLOAT_32); - testFloat = 1.01234567890123456; - testFloat.Render(Ebml_file); - - testFloat.SetPrecision(EbmlFloat::FLOAT_64); - testFloat = -1.01234567890123456L; - testFloat.Render(Ebml_file); - - Ebml_file.close(); + /////////////////////////////// + // Master element + /////////////////////////////// + EbmlMaster testMaster; - ///// Reading test - StdIOCallback Ebml_Wfile(RW_FILENAME, ::MODE_READ); - - // example 1 skip all the elements found - EbmlStream aStream(Ebml_Wfile); - EbmlElement * ElementLevel0; - - // read the data until a possible element is found (valid ID + size combination) - ElementLevel0 = aStream.FindNextID(0xFFFFFFFFL, false); - printf("Read EBML elements & skip data\n"); - while (ElementLevel0 != NULL) - { - printf("ID : "); - for (int i=0; iGetIDLength(); i++) - { - printf("[%02X]", ElementLevel0->GetID()[i]); - } - printf("\n"); + testMaster.SetID(SemanticList[6].Id, SemanticList[6].IdLength); + testMaster.PushElement(testStr); + testMaster.PushElement(testUInt); + testMaster.Render(Ebml_file); - ElementLevel0->SkipData(Ebml_Wfile); - if (ElementLevel0 != NULL) - delete ElementLevel0; - - ElementLevel0 = aStream.FindNextID(0xFFFFFFFFL, false); - } - - // example 2 evaluation of all elements found - EbmlStream bStream(Ebml_Wfile); - EbmlElement * EvaledElementLevel0; -// EbmlElement * EvaledElementLevel1; - - // reset the stream to the beggining - Ebml_Wfile.setFilePointer(0); - - // list of all IDs and their semantic type -// std::list SemanticList; -// SemanticList.push_back(); - - ElementLevel0 = aStream.FindNextID(0xFFFFFFFFL, false); - printf("Read EBML elements & evaluate data\n"); - while (ElementLevel0 != NULL) - { - int i; - printf("ID : "); - for (i=0; iGetIDLength(); i++) - { - printf("[%02X]", ElementLevel0->GetID()[i]); - } + /////////////////////////////// + // Unicode String data + /////////////////////////////// + UTFstring bString = L"Stטve Lhomm€"; + EbmlUnicodeString testUStr(200); - // check if the element is known - for (i=0; iGetIDLength() != SemanticList[i].IdLength) - continue; - if (memcmp(SemanticList[i].Id, ElementLevel0->GetID(), SemanticList[i].IdLength) == 0) - break; - } - /// \todo check if it is known in the context - // handle the data inside the element - if (i < countof(SemanticList)) { - switch (SemanticList[i].Type) - { - case EBML_U_INTEGER: - EvaledElementLevel0 = new EbmlUInteger(*ElementLevel0); - break; - case EBML_S_INTEGER: - EvaledElementLevel0 = new EbmlSInteger(*ElementLevel0); - break; - case EBML_BINARY: - EvaledElementLevel0 = new EbmlBinary(*ElementLevel0); - break; - case EBML_STRING: - EvaledElementLevel0 = new EbmlString(*ElementLevel0); - break; - case EBML_STRING_UNICODE: - EvaledElementLevel0 = new EbmlUnicodeString(*ElementLevel0); - break; - case EBML_FLOAT: - EvaledElementLevel0 = new EbmlFloat(*ElementLevel0); - break; - case EBML_MASTER: - EvaledElementLevel0 = new EbmlMaster(*ElementLevel0); - break; - } + testUStr.SetID(SemanticList[4].Id, SemanticList[4].IdLength); + testUStr = bString; + testUStr.Render(Ebml_file); - EvaledElementLevel0->ReadData(Ebml_Wfile); + /////////////////////////////// + // Float data + /////////////////////////////// + EbmlFloat testFloat(EbmlFloat::FLOAT_32); - switch (SemanticList[i].Type) - { - case EBML_U_INTEGER: - printf(" : %d", uint32(*(EbmlUInteger*)EvaledElementLevel0)); - break; - case EBML_S_INTEGER: - printf(" : %d", int32(*(EbmlSInteger*)EvaledElementLevel0)); - break; - case EBML_BINARY: - printf(" : binary data, size = %ld", (*(EbmlBinary*)EvaledElementLevel0).GetSize()); - printf(" [%02X]", binary(*(EbmlBinary*)EvaledElementLevel0)); - break; - case EBML_STRING: - printf(" : %s", std::string(*(EbmlString*)EvaledElementLevel0).data()); - break; - case EBML_STRING_UNICODE: - printf(" : (wide chars) %ls", UTFstring(*(EbmlUnicodeString*)EvaledElementLevel0).data()); - break; - case EBML_FLOAT: - printf(" : %f / %.15lf", float(*(EbmlFloat*)EvaledElementLevel0), double(*(EbmlFloat*)EvaledElementLevel0)); - break; - case EBML_MASTER: - printf(" : unsupported format 'Master'"); - break; - } - delete EvaledElementLevel0; - } else { - ElementLevel0->SkipData(Ebml_Wfile); - } - if (ElementLevel0 != NULL) - delete ElementLevel0; + testFloat.SetID(SemanticList[5].Id, SemanticList[5].IdLength); + testFloat.SetPrecision(EbmlFloat::FLOAT_32); + testFloat = 1.01234567890123456; + testFloat.Render(Ebml_file); - printf("\n"); - - ElementLevel0 = aStream.FindNextID(0xFFFFFFFFL, false); - } - - Ebml_Wfile.close(); + testFloat.SetPrecision(EbmlFloat::FLOAT_64); + testFloat = -1.01234567890123456L; + testFloat.Render(Ebml_file); - return 0; + Ebml_file.close(); + + ///// Reading test + StdIOCallback Ebml_Wfile(RW_FILENAME, ::MODE_READ); + + // example 1 skip all the elements found + EbmlStream aStream(Ebml_Wfile); + EbmlElement * ElementLevel0; + + // read the data until a possible element is found (valid ID + size combination) + ElementLevel0 = aStream.FindNextID(0xFFFFFFFFL, false); + printf("Read EBML elements & skip data\n"); + while (ElementLevel0 != NULL) + { + printf("ID : "); + for (int i=0; iGetIDLength(); i++) + { + printf("[%02X]", ElementLevel0->GetID()[i]); + } + printf("\n"); + + ElementLevel0->SkipData(Ebml_Wfile); + if (ElementLevel0 != NULL) + delete ElementLevel0; + + ElementLevel0 = aStream.FindNextID(0xFFFFFFFFL, false); + } + + // example 2 evaluation of all elements found + EbmlStream bStream(Ebml_Wfile); + EbmlElement * EvaledElementLevel0; +// EbmlElement * EvaledElementLevel1; + + // reset the stream to the beggining + Ebml_Wfile.setFilePointer(0); + + // list of all IDs and their semantic type +// std::list SemanticList; +// SemanticList.push_back(); + + ElementLevel0 = aStream.FindNextID(0xFFFFFFFFL, false); + printf("Read EBML elements & evaluate data\n"); + while (ElementLevel0 != NULL) + { + int i; + printf("ID : "); + for (i=0; iGetIDLength(); i++) + { + printf("[%02X]", ElementLevel0->GetID()[i]); + } + + // check if the element is known + for (i=0; iGetIDLength() != SemanticList[i].IdLength) + continue; + if (memcmp(SemanticList[i].Id, ElementLevel0->GetID(), SemanticList[i].IdLength) == 0) + break; + } + /// \todo check if it is known in the context + // handle the data inside the element + if (i < countof(SemanticList)) { + switch (SemanticList[i].Type) + { + case EBML_U_INTEGER: + EvaledElementLevel0 = new EbmlUInteger(*ElementLevel0); + break; + case EBML_S_INTEGER: + EvaledElementLevel0 = new EbmlSInteger(*ElementLevel0); + break; + case EBML_BINARY: + EvaledElementLevel0 = new EbmlBinary(*ElementLevel0); + break; + case EBML_STRING: + EvaledElementLevel0 = new EbmlString(*ElementLevel0); + break; + case EBML_STRING_UNICODE: + EvaledElementLevel0 = new EbmlUnicodeString(*ElementLevel0); + break; + case EBML_FLOAT: + EvaledElementLevel0 = new EbmlFloat(*ElementLevel0); + break; + case EBML_MASTER: + EvaledElementLevel0 = new EbmlMaster(*ElementLevel0); + break; + } + + EvaledElementLevel0->ReadData(Ebml_Wfile); + + switch (SemanticList[i].Type) + { + case EBML_U_INTEGER: + printf(" : %d", uint32(*(EbmlUInteger*)EvaledElementLevel0)); + break; + case EBML_S_INTEGER: + printf(" : %d", int32(*(EbmlSInteger*)EvaledElementLevel0)); + break; + case EBML_BINARY: + printf(" : binary data, size = %ld", (*(EbmlBinary*)EvaledElementLevel0).GetSize()); + printf(" [%02X]", binary(*(EbmlBinary*)EvaledElementLevel0)); + break; + case EBML_STRING: + printf(" : %s", std::string(*(EbmlString*)EvaledElementLevel0).data()); + break; + case EBML_STRING_UNICODE: + printf(" : (wide chars) %ls", UTFstring(*(EbmlUnicodeString*)EvaledElementLevel0).data()); + break; + case EBML_FLOAT: + printf(" : %f / %.15lf", float(*(EbmlFloat*)EvaledElementLevel0), double(*(EbmlFloat*)EvaledElementLevel0)); + break; + case EBML_MASTER: + printf(" : unsupported format 'Master'"); + break; + } + delete EvaledElementLevel0; + } else { + ElementLevel0->SkipData(Ebml_Wfile); + } + if (ElementLevel0 != NULL) + delete ElementLevel0; + + printf("\n"); + + ElementLevel0 = aStream.FindNextID(0xFFFFFFFFL, false); + } + + Ebml_Wfile.close(); + + return 0; } diff --git a/test/ebml/test00.cpp b/test/ebml/test00.cpp index 41a1c67..a0b5a86 100644 --- a/test/ebml/test00.cpp +++ b/test/ebml/test00.cpp @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -31,7 +31,7 @@ \file \version \$Id$ \author Steve Lhomme - Test the writing a basic EBML file + Test the writing a basic EBML file */ #include @@ -59,188 +59,188 @@ const char RW_FILENAME[] = "test.kax"; /*! \test Some test on the Cluster use - \todo each Master element should have a context ! - \todo move the base EBML classes to a template of each type ? (defining the default value and the ID) - \todo find another way than using all those static_cast (using a template ?) + \todo each Master element should have a context ! + \todo move the base EBML classes to a template of each type ? (defining the default value and the ID) + \todo find another way than using all those static_cast (using a template ?) */ int main(void) { - printf("Test00 :\nEBML %s %s / Matroska %s %s\n", EbmlCodeVersion.c_str(), EbmlCodeDate.c_str(), KaxCodeVersion.c_str(), KaxCodeDate.c_str()); - StdIOCallback Ebml_file(RW_FILENAME, ::MODE_CREATE); - - ///// Writing test - EbmlHead TestHead; + printf("Test00 :\nEBML %s %s / Matroska %s %s\n", EbmlCodeVersion.c_str(), EbmlCodeDate.c_str(), KaxCodeVersion.c_str(), KaxCodeDate.c_str()); + StdIOCallback Ebml_file(RW_FILENAME, ::MODE_CREATE); - printf("Write EBML + Matroska elements\n"); - EDocType & MyDocType = GetChild(TestHead); - *static_cast(&MyDocType) = "matroska"; + ///// Writing test + EbmlHead TestHead; - EDocTypeVersion & MyDocTypeVer = GetChild(TestHead); - *(static_cast(&MyDocTypeVer)) = 1; + printf("Write EBML + Matroska elements\n"); + EDocType & MyDocType = GetChild(TestHead); + *static_cast(&MyDocType) = "matroska"; - EDocTypeReadVersion & MyDocTypeReadVer = GetChild(TestHead); - *(static_cast(&MyDocTypeReadVer)) = 1; + EDocTypeVersion & MyDocTypeVer = GetChild(TestHead); + *(static_cast(&MyDocTypeVer)) = 1; - TestHead.Render(Ebml_file); + EDocTypeReadVersion & MyDocTypeReadVer = GetChild(TestHead); + *(static_cast(&MyDocTypeReadVer)) = 1; - KaxSegment FirstSegment; - // size is unknown and will always be, we can render it right away - FirstSegment.Render(Ebml_file); + TestHead.Render(Ebml_file); - KaxAttachments * pAllAttachments = static_cast(FirstSegment.FindFirstElt(KaxAttachments::ClassInfos, true)); - if (pAllAttachments == NULL) - return -1; - pAllAttachments->SetSizeInfinite(); - // size is unknown and will always be, we can render it right away - pAllAttachments->Render(Ebml_file); - - KaxAttached * pAttachment1 = static_cast(pAllAttachments->FindFirstElt(KaxAttached::ClassInfos, true)); - if (pAttachment1 == NULL) - return -1; - KaxFileName * pFileName1 = static_cast(pAttachment1->FindFirstElt(KaxFileName::ClassInfos, true)); - if (pFileName1 == NULL) - return -1; - *static_cast(pFileName1) = "file1.txt"; - KaxFileData * pFileData1 = static_cast(pAttachment1->FindFirstElt(KaxFileData::ClassInfos, true)); - if (pFileData1 == NULL) - return -1; - char Buffer1[] = "Ah ah ah !"; - static_cast(pFileData1)->SetBuffer((const binary*) Buffer1, countof(Buffer1)); - // should produce an error if the size is not infinite and the data has been rendered - pAttachment1->Render(Ebml_file); - - KaxAttached * pAttachment2 = static_cast(pAllAttachments->AddNewElt(KaxAttached::ClassInfos)); - if (pAttachment2 == NULL) - return -1; - KaxFileName * pFileName2 = static_cast(pAttachment2->FindFirstElt(KaxFileName::ClassInfos, true)); - if (pFileName2 == NULL) - return -1; - *static_cast(pFileName2) = "file2.txt"; - // Add a void element (data is discarded) - EbmlVoid * pVoid = static_cast(pAttachment2->FindFirstElt(EbmlVoid::ClassInfos, true)); - if (pVoid == NULL) - return -1; - static_cast(pVoid)->SetBuffer((const binary*) Buffer1, countof(Buffer1)); - pAttachment2->Render(Ebml_file); + KaxSegment FirstSegment; + // size is unknown and will always be, we can render it right away + FirstSegment.Render(Ebml_file); + + KaxAttachments * pAllAttachments = static_cast(FirstSegment.FindFirstElt(KaxAttachments::ClassInfos, true)); + if (pAllAttachments == NULL) + return -1; + pAllAttachments->SetSizeInfinite(); + // size is unknown and will always be, we can render it right away + pAllAttachments->Render(Ebml_file); + + KaxAttached * pAttachment1 = static_cast(pAllAttachments->FindFirstElt(KaxAttached::ClassInfos, true)); + if (pAttachment1 == NULL) + return -1; + KaxFileName * pFileName1 = static_cast(pAttachment1->FindFirstElt(KaxFileName::ClassInfos, true)); + if (pFileName1 == NULL) + return -1; + *static_cast(pFileName1) = "file1.txt"; + KaxFileData * pFileData1 = static_cast(pAttachment1->FindFirstElt(KaxFileData::ClassInfos, true)); + if (pFileData1 == NULL) + return -1; + char Buffer1[] = "Ah ah ah !"; + static_cast(pFileData1)->SetBuffer((const binary*) Buffer1, countof(Buffer1)); + // should produce an error if the size is not infinite and the data has been rendered + pAttachment1->Render(Ebml_file); + + KaxAttached * pAttachment2 = static_cast(pAllAttachments->AddNewElt(KaxAttached::ClassInfos)); + if (pAttachment2 == NULL) + return -1; + KaxFileName * pFileName2 = static_cast(pAttachment2->FindFirstElt(KaxFileName::ClassInfos, true)); + if (pFileName2 == NULL) + return -1; + *static_cast(pFileName2) = "file2.txt"; + // Add a void element (data is discarded) + EbmlVoid * pVoid = static_cast(pAttachment2->FindFirstElt(EbmlVoid::ClassInfos, true)); + if (pVoid == NULL) + return -1; + static_cast(pVoid)->SetBuffer((const binary*) Buffer1, countof(Buffer1)); + pAttachment2->Render(Ebml_file); #ifdef SKIP_ATTACHED - KaxSegment SecondSegment; - // size is unknown and will always be, we can render it right away - SecondSegment.Render(Ebml_file); + KaxSegment SecondSegment; + // size is unknown and will always be, we can render it right away + SecondSegment.Render(Ebml_file); #endif // SKIP_ATTACHED - Ebml_file.close(); + Ebml_file.close(); - ///// Reading test - StdIOCallback Ebml_Wfile(RW_FILENAME, ::MODE_READ); - - // example 1 skip all the elements found - EbmlStream aStream(Ebml_Wfile); - EbmlElement * ElementLevel0; - EbmlElement * ElementLevel1; - EbmlElement * ElementLevel2; - EbmlElement * ElementLevel3; - - // read the data until a possible element is found (valid ID + size combination) - printf("Read EBML elements & skip data\n"); - // find the EBML head in the file - ElementLevel0 = aStream.FindNextID(EbmlHead::ClassInfos, 0xFFFFFFFFL, false); - if (ElementLevel0 != NULL) - { - printf("ID : "); - for (unsigned int i=0; iSkipData(aStream, EbmlHead_Context); - if (ElementLevel0 != NULL) - delete ElementLevel0; - } + // example 1 skip all the elements found + EbmlStream aStream(Ebml_Wfile); + EbmlElement * ElementLevel0; + EbmlElement * ElementLevel1; + EbmlElement * ElementLevel2; + EbmlElement * ElementLevel3; - // example to read attachements in the file - ElementLevel0 = aStream.FindNextID(KaxSegment::ClassInfos, 0xFFFFFFFFL, false); - while (ElementLevel0 != NULL) - { - printf("ID : "); - for (unsigned int i=0; iSkipData(aStream, EbmlHead_Context); + if (ElementLevel0 != NULL) + delete ElementLevel0; + } - ElementLevel1 = aStream.FindNextID(KaxSegment_Context, bUpperElement, 0xFFFFFFFFL, true); + // example to read attachements in the file + ElementLevel0 = aStream.FindNextID(KaxSegment::ClassInfos, 0xFFFFFFFFL, false); + while (ElementLevel0 != NULL) + { + printf("ID : "); + for (unsigned int i=0; iSkipData(aStream, KaxAttached_Context); - if (ElementLevel2 == NULL) { - ElementLevel2 = aStream.FindNextID(KaxAttachments_Context, bUpperElement, 0xFFFFFFFFL, true); + ElementLevel2 = ElementLevel2->SkipData(aStream, KaxAttached_Context); + if (ElementLevel2 == NULL) { + ElementLevel2 = aStream.FindNextID(KaxAttachments_Context, bUpperElement, 0xFFFFFFFFL, true); - if (bUpperElement) { - printf("Upper level1 element found\n"); - delete ElementLevel1; - ElementLevel1 = ElementLevel2; - ElementLevel2 = NULL; - } - } + if (bUpperElement) { + printf("Upper level1 element found\n"); + delete ElementLevel1; + ElementLevel1 = ElementLevel2; + ElementLevel2 = NULL; + } + } #else // SKIP_ATTACHED - // Display the filename (if it exists) - ElementLevel3 = aStream.FindNextID(KaxAttached_Context, bUpperElement, 0xFFFFFFFFL, false); - while (ElementLevel3 != NULL) { - /// \todo switch the type of the element to check if it's one we want to handle, like attachements - if (EbmlId(*ElementLevel3) == KaxFileName::ClassInfos.GlobalId) { - KaxFileName & tmp = *static_cast(ElementLevel3); - tmp.ReadData(aStream.I_O()); - printf("File Name = %ls\n", UTFstring(tmp).c_str()); - } else { - ElementLevel3->SkipData(aStream, KaxAttached_Context); - } - delete ElementLevel3; - ElementLevel3 = aStream.FindNextID(KaxAttached_Context, bUpperElement, 0xFFFFFFFFL, false); - if (bUpperElement) - break; - } + // Display the filename (if it exists) + ElementLevel3 = aStream.FindNextID(KaxAttached_Context, bUpperElement, 0xFFFFFFFFL, false); + while (ElementLevel3 != NULL) { + /// \todo switch the type of the element to check if it's one we want to handle, like attachements + if (EbmlId(*ElementLevel3) == KaxFileName::ClassInfos.GlobalId) { + KaxFileName & tmp = *static_cast(ElementLevel3); + tmp.ReadData(aStream.I_O()); + printf("File Name = %ls\n", UTFstring(tmp).c_str()); + } else { + ElementLevel3->SkipData(aStream, KaxAttached_Context); + } + delete ElementLevel3; + ElementLevel3 = aStream.FindNextID(KaxAttached_Context, bUpperElement, 0xFFFFFFFFL, false); + if (bUpperElement) + break; + } - if (bUpperElement) { - delete ElementLevel2; - ElementLevel2 = ElementLevel3; - } else { - ElementLevel2->SkipData(aStream, KaxAttached_Context); - delete ElementLevel2; + if (bUpperElement) { + delete ElementLevel2; + ElementLevel2 = ElementLevel3; + } else { + ElementLevel2->SkipData(aStream, KaxAttached_Context); + delete ElementLevel2; - ElementLevel2 = aStream.FindNextID(KaxAttachments_Context, bUpperElement, 0xFFFFFFFFL, true); - } + ElementLevel2 = aStream.FindNextID(KaxAttachments_Context, bUpperElement, 0xFFFFFFFFL, true); + } #endif // SKIP_ATTACHED - } - } - ElementLevel1->SkipData(aStream, KaxAttachments_Context); - delete ElementLevel1; - - ElementLevel1 = aStream.FindNextID(KaxSegment_Context, bUpperElement, 0xFFFFFFFFL, true); - } + } + } + ElementLevel1->SkipData(aStream, KaxAttachments_Context); + delete ElementLevel1; - ElementLevel0->SkipData(aStream, KaxSegment_Context); - if (ElementLevel0 != NULL) - delete ElementLevel0; - - ElementLevel0 = aStream.FindNextID(KaxSegment_Context, bUpperElement, 0xFFFFFFFFL, true); - } + ElementLevel1 = aStream.FindNextID(KaxSegment_Context, bUpperElement, 0xFFFFFFFFL, true); + } - Ebml_Wfile.close(); + ElementLevel0->SkipData(aStream, KaxSegment_Context); + if (ElementLevel0 != NULL) + delete ElementLevel0; - return 0; + ElementLevel0 = aStream.FindNextID(KaxSegment_Context, bUpperElement, 0xFFFFFFFFL, true); + } + + Ebml_Wfile.close(); + + return 0; } diff --git a/test/mux/test6.cpp b/test/mux/test6.cpp index 6c4e37e..743cabf 100644 --- a/test/mux/test6.cpp +++ b/test/mux/test6.cpp @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -60,7 +60,7 @@ unsigned int BIN_FILE_SIZE = 15000; unsigned int TXT_FILE_SIZE = 3000; const unsigned int BIN_FRAME_SIZE = 1500; const unsigned int TXT_FRAME_SIZE = 200; -const uint64 TIMECODE_SCALE = 1000000; +const uint64 TIMECODE_SCALE = 1000000; const bool bWriteDefaultValues = false; @@ -73,279 +73,279 @@ int main(int argc, char **argv) cout << "Creating \"muxed.mkv\"" << endl; try { - // write the head of the file (with everything already configured) - StdIOCallback out_file("muxed.mkv", MODE_CREATE); + // write the head of the file (with everything already configured) + StdIOCallback out_file("muxed.mkv", MODE_CREATE); - ///// Writing EBML test - EbmlHead FileHead; + ///// Writing EBML test + EbmlHead FileHead; - EDocType & MyDocType = GetChild(FileHead); - *static_cast(&MyDocType) = "matroska"; + EDocType & MyDocType = GetChild(FileHead); + *static_cast(&MyDocType) = "matroska"; - EDocTypeVersion & MyDocTypeVer = GetChild(FileHead); - *(static_cast(&MyDocTypeVer)) = MATROSKA_VERSION; + EDocTypeVersion & MyDocTypeVer = GetChild(FileHead); + *(static_cast(&MyDocTypeVer)) = MATROSKA_VERSION; - EDocTypeReadVersion & MyDocTypeReadVer = GetChild(FileHead); - *(static_cast(&MyDocTypeReadVer)) = 1; + EDocTypeReadVersion & MyDocTypeReadVer = GetChild(FileHead); + *(static_cast(&MyDocTypeReadVer)) = 1; - FileHead.Render(out_file, bWriteDefaultValues); + FileHead.Render(out_file, bWriteDefaultValues); - KaxSegment FileSegment; + KaxSegment FileSegment; - // size is unknown and will always be, we can render it right away - uint64 SegmentSize = FileSegment.WriteHead(out_file, 5, bWriteDefaultValues); - - KaxTracks & MyTracks = GetChild(FileSegment); + // size is unknown and will always be, we can render it right away + uint64 SegmentSize = FileSegment.WriteHead(out_file, 5, bWriteDefaultValues); - // reserve some space for the Meta Seek writen at the end - EbmlVoid Dummy; - Dummy.SetSize(300); // 300 octets - Dummy.Render(out_file, bWriteDefaultValues); + KaxTracks & MyTracks = GetChild(FileSegment); - KaxSeekHead MetaSeek; + // reserve some space for the Meta Seek writen at the end + EbmlVoid Dummy; + Dummy.SetSize(300); // 300 octets + Dummy.Render(out_file, bWriteDefaultValues); - // fill the mandatory Info section - KaxInfo & MyInfos = GetChild(FileSegment); - KaxTimecodeScale & TimeScale = GetChild(MyInfos); - *(static_cast(&TimeScale)) = TIMECODE_SCALE; + KaxSeekHead MetaSeek; - KaxDuration & SegDuration = GetChild(MyInfos); - *(static_cast(&SegDuration)) = 0.0; + // fill the mandatory Info section + KaxInfo & MyInfos = GetChild(FileSegment); + KaxTimecodeScale & TimeScale = GetChild(MyInfos); + *(static_cast(&TimeScale)) = TIMECODE_SCALE; - *((EbmlUnicodeString *)&GetChild(MyInfos)) = L"libmatroska 0.5.0"; - *((EbmlUnicodeString *)&GetChild(MyInfos)) = L"יאפן"; - GetChild(MyInfos).SetDefaultSize(25); + KaxDuration & SegDuration = GetChild(MyInfos); + *(static_cast(&SegDuration)) = 0.0; - filepos_t InfoSize = MyInfos.Render(out_file); - MetaSeek.IndexThis(MyInfos, FileSegment); + *((EbmlUnicodeString *)&GetChild(MyInfos)) = L"libmatroska 0.5.0"; + *((EbmlUnicodeString *)&GetChild(MyInfos)) = L"יאפן"; + GetChild(MyInfos).SetDefaultSize(25); - // fill track 1 params - KaxTrackEntry & MyTrack1 = GetChild(MyTracks); - MyTrack1.SetGlobalTimecodeScale(TIMECODE_SCALE); + filepos_t InfoSize = MyInfos.Render(out_file); + MetaSeek.IndexThis(MyInfos, FileSegment); - KaxTrackNumber & MyTrack1Number = GetChild(MyTrack1); - *(static_cast(&MyTrack1Number)) = 1; + // fill track 1 params + KaxTrackEntry & MyTrack1 = GetChild(MyTracks); + MyTrack1.SetGlobalTimecodeScale(TIMECODE_SCALE); - KaxTrackUID & MyTrack1UID = GetChild(MyTrack1); - *(static_cast(&MyTrack1UID)) = 7; + KaxTrackNumber & MyTrack1Number = GetChild(MyTrack1); + *(static_cast(&MyTrack1Number)) = 1; - *(static_cast(&GetChild(MyTrack1))) = track_audio; + KaxTrackUID & MyTrack1UID = GetChild(MyTrack1); + *(static_cast(&MyTrack1UID)) = 7; - KaxCodecID & MyTrack1CodecID = GetChild(MyTrack1); - *static_cast(&MyTrack1CodecID) = "Dummy Audio Codec"; + *(static_cast(&GetChild(MyTrack1))) = track_audio; - MyTrack1.EnableLacing(true); + KaxCodecID & MyTrack1CodecID = GetChild(MyTrack1); + *static_cast(&MyTrack1CodecID) = "Dummy Audio Codec"; - // Test the new ContentEncoding elements - KaxContentEncodings &cencodings = GetChild(MyTrack1); - KaxContentEncoding &cencoding = GetChild(cencodings); - *(static_cast(&GetChild(cencoding))) = 10; - *(static_cast(&GetChild(cencoding))) = 11; - *(static_cast(&GetChild(cencoding))) = 12; + MyTrack1.EnableLacing(true); - KaxContentCompression &ccompression = GetChild(cencoding); - *(static_cast(&GetChild(ccompression))) = 13; - GetChild(ccompression).CopyBuffer((const binary *)"hello1", 6); + // Test the new ContentEncoding elements + KaxContentEncodings &cencodings = GetChild(MyTrack1); + KaxContentEncoding &cencoding = GetChild(cencodings); + *(static_cast(&GetChild(cencoding))) = 10; + *(static_cast(&GetChild(cencoding))) = 11; + *(static_cast(&GetChild(cencoding))) = 12; - KaxContentEncryption &cencryption = GetChild(cencoding); - *(static_cast(&GetChild(cencryption))) = 14; - GetChild(cencryption).CopyBuffer((const binary *)"hello2", 6); - *(static_cast(&GetChild(cencryption))) = 15; - *(static_cast(&GetChild(cencryption))) = 16; - GetChild(cencryption).CopyBuffer((const binary *)"hello3", 6); - GetChild(cencryption).CopyBuffer((const binary *)"hello4", 6); + KaxContentCompression &ccompression = GetChild(cencoding); + *(static_cast(&GetChild(ccompression))) = 13; + GetChild(ccompression).CopyBuffer((const binary *)"hello1", 6); - // audio specific params - KaxTrackAudio & MyTrack1Audio = GetChild(MyTrack1); - - KaxAudioSamplingFreq & MyTrack1Freq = GetChild(MyTrack1Audio); - *(static_cast(&MyTrack1Freq)) = 44100.0; - MyTrack1Freq.ValidateSize(); + KaxContentEncryption &cencryption = GetChild(cencoding); + *(static_cast(&GetChild(cencryption))) = 14; + GetChild(cencryption).CopyBuffer((const binary *)"hello2", 6); + *(static_cast(&GetChild(cencryption))) = 15; + *(static_cast(&GetChild(cencryption))) = 16; + GetChild(cencryption).CopyBuffer((const binary *)"hello3", 6); + GetChild(cencryption).CopyBuffer((const binary *)"hello4", 6); + + // audio specific params + KaxTrackAudio & MyTrack1Audio = GetChild(MyTrack1); + + KaxAudioSamplingFreq & MyTrack1Freq = GetChild(MyTrack1Audio); + *(static_cast(&MyTrack1Freq)) = 44100.0; + MyTrack1Freq.ValidateSize(); #if MATROSKA_VERSION >= 2 - KaxAudioPosition & MyTrack1Pos = GetChild(MyTrack1Audio); - binary *_Pos = new binary[5]; - _Pos[0] = '0'; - _Pos[1] = '1'; - _Pos[2] = '2'; - _Pos[3] = '3'; - _Pos[4] = '\0'; - MyTrack1Pos.SetBuffer(_Pos, 5); + KaxAudioPosition & MyTrack1Pos = GetChild(MyTrack1Audio); + binary *_Pos = new binary[5]; + _Pos[0] = '0'; + _Pos[1] = '1'; + _Pos[2] = '2'; + _Pos[3] = '3'; + _Pos[4] = '\0'; + MyTrack1Pos.SetBuffer(_Pos, 5); #endif // MATROSKA_VERSION - KaxAudioChannels & MyTrack1Channels = GetChild(MyTrack1Audio); - *(static_cast(&MyTrack1Channels)) = 2; + KaxAudioChannels & MyTrack1Channels = GetChild(MyTrack1Audio); + *(static_cast(&MyTrack1Channels)) = 2; - // fill track 2 params - KaxTrackEntry & MyTrack2 = GetNextChild(MyTracks, MyTrack1); - MyTrack2.SetGlobalTimecodeScale(TIMECODE_SCALE); + // fill track 2 params + KaxTrackEntry & MyTrack2 = GetNextChild(MyTracks, MyTrack1); + MyTrack2.SetGlobalTimecodeScale(TIMECODE_SCALE); - KaxTrackNumber & MyTrack2Number = GetChild(MyTrack2); - *(static_cast(&MyTrack2Number)) = 200; + KaxTrackNumber & MyTrack2Number = GetChild(MyTrack2); + *(static_cast(&MyTrack2Number)) = 200; - KaxTrackUID & MyTrack2UID = GetChild(MyTrack2); - *(static_cast(&MyTrack2UID)) = 13; + KaxTrackUID & MyTrack2UID = GetChild(MyTrack2); + *(static_cast(&MyTrack2UID)) = 13; - *(static_cast(&GetChild(MyTrack2))) = track_video; + *(static_cast(&GetChild(MyTrack2))) = track_video; - KaxCodecID & MyTrack2CodecID = GetChild(MyTrack2); - *static_cast(&MyTrack2CodecID) = "Dummy Video Codec"; + KaxCodecID & MyTrack2CodecID = GetChild(MyTrack2); + *static_cast(&MyTrack2CodecID) = "Dummy Video Codec"; - MyTrack2.EnableLacing(false); + MyTrack2.EnableLacing(false); - // video specific params - KaxTrackVideo & MyTrack2Video = GetChild(MyTrack2); + // video specific params + KaxTrackVideo & MyTrack2Video = GetChild(MyTrack2); - KaxVideoPixelHeight & MyTrack2PHeight = GetChild(MyTrack2Video); - *(static_cast(&MyTrack2PHeight)) = 200; + KaxVideoPixelHeight & MyTrack2PHeight = GetChild(MyTrack2Video); + *(static_cast(&MyTrack2PHeight)) = 200; - KaxVideoPixelWidth & MyTrack2PWidth = GetChild(MyTrack2Video); - *(static_cast(&MyTrack2PWidth)) = 320; + KaxVideoPixelWidth & MyTrack2PWidth = GetChild(MyTrack2Video); + *(static_cast(&MyTrack2PWidth)) = 320; - uint64 TrackSize = MyTracks.Render(out_file, bWriteDefaultValues); + uint64 TrackSize = MyTracks.Render(out_file, bWriteDefaultValues); - KaxTracks * pMyTracks2 = static_cast(MyTracks.Clone()); -// KaxTracks * pMyTracks2 = new KaxTracks(MyTracks); + KaxTracks * pMyTracks2 = static_cast(MyTracks.Clone()); +// KaxTracks * pMyTracks2 = new KaxTracks(MyTracks); - MetaSeek.IndexThis(MyTracks, FileSegment); + MetaSeek.IndexThis(MyTracks, FileSegment); - // "manual" filling of a cluster" - /// \todo whenever a BlockGroup is created, we should memorize it's position - KaxCues AllCues; - AllCues.SetGlobalTimecodeScale(TIMECODE_SCALE); + // "manual" filling of a cluster" + /// \todo whenever a BlockGroup is created, we should memorize it's position + KaxCues AllCues; + AllCues.SetGlobalTimecodeScale(TIMECODE_SCALE); - KaxCluster Clust1; - Clust1.SetParent(FileSegment); // mandatory to store references in this Cluster - Clust1.SetPreviousTimecode(0, TIMECODE_SCALE); // the first timecode here - Clust1.EnableChecksum(); + KaxCluster Clust1; + Clust1.SetParent(FileSegment); // mandatory to store references in this Cluster + Clust1.SetPreviousTimecode(0, TIMECODE_SCALE); // the first timecode here + Clust1.EnableChecksum(); - // automatic filling of a Cluster - // simple frame - KaxBlockGroup *MyNewBlock, *MyLastBlockTrk1 = NULL, *MyLastBlockTrk2 = NULL, *MyNewBlock2; - DataBuffer *data7 = new DataBuffer((binary *)"tototototo", countof("tototototo")); - Clust1.AddFrame(MyTrack1, 250 * TIMECODE_SCALE, *data7, MyNewBlock, LACING_EBML); - if (MyNewBlock != NULL) - MyLastBlockTrk1 = MyNewBlock; - DataBuffer *data0 = new DataBuffer((binary *)"TOTOTOTO", countof("TOTOTOTO")); - Clust1.AddFrame(MyTrack1, 260 * TIMECODE_SCALE, *data0, MyNewBlock); // to test EBML lacing - if (MyNewBlock != NULL) - MyLastBlockTrk1 = MyNewBlock; - DataBuffer *data6 = new DataBuffer((binary *)"tototototo", countof("tototototo")); - Clust1.AddFrame(MyTrack1, 270 * TIMECODE_SCALE, *data6, MyNewBlock); // to test lacing - if (MyNewBlock != NULL) { - MyLastBlockTrk1 = MyNewBlock; - } else { - MyLastBlockTrk1->SetBlockDuration(50 * TIMECODE_SCALE); - } + // automatic filling of a Cluster + // simple frame + KaxBlockGroup *MyNewBlock, *MyLastBlockTrk1 = NULL, *MyLastBlockTrk2 = NULL, *MyNewBlock2; + DataBuffer *data7 = new DataBuffer((binary *)"tototototo", countof("tototototo")); + Clust1.AddFrame(MyTrack1, 250 * TIMECODE_SCALE, *data7, MyNewBlock, LACING_EBML); + if (MyNewBlock != NULL) + MyLastBlockTrk1 = MyNewBlock; + DataBuffer *data0 = new DataBuffer((binary *)"TOTOTOTO", countof("TOTOTOTO")); + Clust1.AddFrame(MyTrack1, 260 * TIMECODE_SCALE, *data0, MyNewBlock); // to test EBML lacing + if (MyNewBlock != NULL) + MyLastBlockTrk1 = MyNewBlock; + DataBuffer *data6 = new DataBuffer((binary *)"tototototo", countof("tototototo")); + Clust1.AddFrame(MyTrack1, 270 * TIMECODE_SCALE, *data6, MyNewBlock); // to test lacing + if (MyNewBlock != NULL) { + MyLastBlockTrk1 = MyNewBlock; + } else { + MyLastBlockTrk1->SetBlockDuration(50 * TIMECODE_SCALE); + } - DataBuffer *data5 = new DataBuffer((binary *)"tototototo", countof("tototototo")); - Clust1.AddFrame(MyTrack2, 23 * TIMECODE_SCALE, *data5, MyNewBlock); // to test with another track + DataBuffer *data5 = new DataBuffer((binary *)"tototototo", countof("tototototo")); + Clust1.AddFrame(MyTrack2, 23 * TIMECODE_SCALE, *data5, MyNewBlock); // to test with another track - // add the "real" block to the cue entries + // add the "real" block to the cue entries KaxBlockBlob *Blob1 = new KaxBlockBlob(BLOCK_BLOB_NO_SIMPLE); Blob1->SetBlockGroup(*MyLastBlockTrk1); - AllCues.AddBlockBlob(*Blob1); + AllCues.AddBlockBlob(*Blob1); - // frame for Track 2 - DataBuffer *data8 = new DataBuffer((binary *)"tttyyy", countof("tttyyy")); - Clust1.AddFrame(MyTrack2, 107 * TIMECODE_SCALE, *data8, MyNewBlock, *MyLastBlockTrk2); + // frame for Track 2 + DataBuffer *data8 = new DataBuffer((binary *)"tttyyy", countof("tttyyy")); + Clust1.AddFrame(MyTrack2, 107 * TIMECODE_SCALE, *data8, MyNewBlock, *MyLastBlockTrk2); KaxBlockBlob *Blob2 = new KaxBlockBlob(BLOCK_BLOB_NO_SIMPLE); Blob2->SetBlockGroup(*MyNewBlock); - AllCues.AddBlockBlob(*Blob2); + AllCues.AddBlockBlob(*Blob2); - // frame with a past reference - DataBuffer *data4 = new DataBuffer((binary *)"tttyyy", countof("tttyyy")); - Clust1.AddFrame(MyTrack1, 300 * TIMECODE_SCALE, *data4, MyNewBlock, *MyLastBlockTrk1); + // frame with a past reference + DataBuffer *data4 = new DataBuffer((binary *)"tttyyy", countof("tttyyy")); + Clust1.AddFrame(MyTrack1, 300 * TIMECODE_SCALE, *data4, MyNewBlock, *MyLastBlockTrk1); - // frame with a past & future reference - if (MyNewBlock != NULL) { - DataBuffer *data3 = new DataBuffer((binary *)"tttyyy", countof("tttyyy")); - if (Clust1.AddFrame(MyTrack1, 280 * TIMECODE_SCALE, *data3, MyNewBlock2, *MyLastBlockTrk1, *MyNewBlock)) { - MyNewBlock2->SetBlockDuration(20 * TIMECODE_SCALE); - MyLastBlockTrk1 = MyNewBlock2; - } else { - printf("Error adding a frame !!!"); - } - } + // frame with a past & future reference + if (MyNewBlock != NULL) { + DataBuffer *data3 = new DataBuffer((binary *)"tttyyy", countof("tttyyy")); + if (Clust1.AddFrame(MyTrack1, 280 * TIMECODE_SCALE, *data3, MyNewBlock2, *MyLastBlockTrk1, *MyNewBlock)) { + MyNewBlock2->SetBlockDuration(20 * TIMECODE_SCALE); + MyLastBlockTrk1 = MyNewBlock2; + } else { + printf("Error adding a frame !!!"); + } + } KaxBlockBlob *Blob3 = new KaxBlockBlob(BLOCK_BLOB_NO_SIMPLE); Blob3->SetBlockGroup(*MyLastBlockTrk1); - AllCues.AddBlockBlob(*Blob3); - //AllCues.UpdateSize(); + AllCues.AddBlockBlob(*Blob3); + //AllCues.UpdateSize(); - // simulate the writing of the stream : - // - write an empty element with enough size for the cue entry - // - write the cluster(s) - // - seek back in the file and write the cue entry over the empty element + // simulate the writing of the stream : + // - write an empty element with enough size for the cue entry + // - write the cluster(s) + // - seek back in the file and write the cue entry over the empty element - uint64 ClusterSize = Clust1.Render(out_file, AllCues, bWriteDefaultValues); - Clust1.ReleaseFrames(); - MetaSeek.IndexThis(Clust1, FileSegment); + uint64 ClusterSize = Clust1.Render(out_file, AllCues, bWriteDefaultValues); + Clust1.ReleaseFrames(); + MetaSeek.IndexThis(Clust1, FileSegment); - KaxCluster Clust2; - Clust2.SetParent(FileSegment); // mandatory to store references in this Cluster - Clust2.SetPreviousTimecode(300 * TIMECODE_SCALE, TIMECODE_SCALE); // the first timecode here - Clust2.EnableChecksum(); + KaxCluster Clust2; + Clust2.SetParent(FileSegment); // mandatory to store references in this Cluster + Clust2.SetPreviousTimecode(300 * TIMECODE_SCALE, TIMECODE_SCALE); // the first timecode here + Clust2.EnableChecksum(); + + DataBuffer *data2 = new DataBuffer((binary *)"tttyyy", countof("tttyyy")); + Clust2.AddFrame(MyTrack1, 350 * TIMECODE_SCALE, *data2, MyNewBlock, *MyLastBlockTrk1); - DataBuffer *data2 = new DataBuffer((binary *)"tttyyy", countof("tttyyy")); - Clust2.AddFrame(MyTrack1, 350 * TIMECODE_SCALE, *data2, MyNewBlock, *MyLastBlockTrk1); - KaxBlockBlob *Blob4 = new KaxBlockBlob(BLOCK_BLOB_NO_SIMPLE); Blob4->SetBlockGroup(*MyNewBlock); - AllCues.AddBlockBlob(*Blob4); + AllCues.AddBlockBlob(*Blob4); - ClusterSize += Clust2.Render(out_file, AllCues, bWriteDefaultValues); - Clust2.ReleaseFrames(); + ClusterSize += Clust2.Render(out_file, AllCues, bWriteDefaultValues); + Clust2.ReleaseFrames(); -// older version, write at the end AllCues.Render(out_file); - filepos_t CueSize = AllCues.Render(out_file, bWriteDefaultValues); - MetaSeek.IndexThis(AllCues, FileSegment); +// older version, write at the end AllCues.Render(out_file); + filepos_t CueSize = AllCues.Render(out_file, bWriteDefaultValues); + MetaSeek.IndexThis(AllCues, FileSegment); - // Chapters - KaxChapters Chapters; - Chapters.EnableChecksum(); - KaxEditionEntry & aEdition = GetChild(Chapters); - KaxChapterAtom & aAtom = GetChild(aEdition); - KaxChapterUID & aUID = GetChild(aAtom); - *static_cast(&aUID) = 0x67890; + // Chapters + KaxChapters Chapters; + Chapters.EnableChecksum(); + KaxEditionEntry & aEdition = GetChild(Chapters); + KaxChapterAtom & aAtom = GetChild(aEdition); + KaxChapterUID & aUID = GetChild(aAtom); + *static_cast(&aUID) = 0x67890; - KaxChapterTimeStart & aChapStart = GetChild(aAtom); - *static_cast(&aChapStart) = 0; + KaxChapterTimeStart & aChapStart = GetChild(aAtom); + *static_cast(&aChapStart) = 0; - KaxChapterTimeEnd & aChapEnd = GetChild(aAtom); - *static_cast(&aChapEnd) = 300 * TIMECODE_SCALE; + KaxChapterTimeEnd & aChapEnd = GetChild(aAtom); + *static_cast(&aChapEnd) = 300 * TIMECODE_SCALE; - KaxChapterDisplay & aDisplay = GetChild(aAtom); - KaxChapterString & aChapString = GetChild(aDisplay); - *static_cast(&aChapString) = L"Le film rיduit א un chapitre"; + KaxChapterDisplay & aDisplay = GetChild(aAtom); + KaxChapterString & aChapString = GetChild(aDisplay); + *static_cast(&aChapString) = L"Le film rיduit א un chapitre"; - KaxChapterLanguage & aChapLang = GetChild(aDisplay); - *static_cast(&aChapLang) = "fra"; + KaxChapterLanguage & aChapLang = GetChild(aDisplay); + *static_cast(&aChapLang) = "fra"; - KaxChapterDisplay & aDisplay2 = GetNextChild(aAtom, aDisplay); - KaxChapterString & aChapString2 = GetChild(aDisplay2); - *static_cast(&aChapString2) = L"The movie in one chapter"; + KaxChapterDisplay & aDisplay2 = GetNextChild(aAtom, aDisplay); + KaxChapterString & aChapString2 = GetChild(aDisplay2); + *static_cast(&aChapString2) = L"The movie in one chapter"; - KaxChapterLanguage & aChapLang2 = GetChild(aDisplay2); - *static_cast(&aChapLang2) = "eng"; + KaxChapterLanguage & aChapLang2 = GetChild(aDisplay2); + *static_cast(&aChapLang2) = "eng"; - filepos_t ChapterSize = Chapters.Render(out_file, bWriteDefaultValues); - MetaSeek.IndexThis(Chapters, FileSegment); + filepos_t ChapterSize = Chapters.Render(out_file, bWriteDefaultValues); + MetaSeek.IndexThis(Chapters, FileSegment); - // Write some tags - KaxTags AllTags; - AllTags.EnableChecksum(); - KaxTag & aTag = GetChild(AllTags); - KaxTagTargets & Targets = GetChild(aTag); - KaxTagSimple & TagSimple = GetChild(aTag); + // Write some tags + KaxTags AllTags; + AllTags.EnableChecksum(); + KaxTag & aTag = GetChild(AllTags); + KaxTagTargets & Targets = GetChild(aTag); + KaxTagSimple & TagSimple = GetChild(aTag); - KaxTagTrackUID & TrackUID = GetChild(Targets); - *static_cast(&TrackUID) = 0x12345; + KaxTagTrackUID & TrackUID = GetChild(Targets); + *static_cast(&TrackUID) = 0x12345; - KaxTagChapterUID & ChapterUID = GetChild(Targets); - *static_cast(&ChapterUID) = 0x67890; + KaxTagChapterUID & ChapterUID = GetChild(Targets); + *static_cast(&ChapterUID) = 0x67890; KaxTagName & aTagName = GetChild(TagSimple); *static_cast(&aTagName) = L"NAME"; @@ -353,35 +353,35 @@ int main(int argc, char **argv) KaxTagString & aTagtring = GetChild(TagSimple); *static_cast(&aTagtring) = L"Testי123"; - filepos_t TagsSize = AllTags.Render(out_file, bWriteDefaultValues); - MetaSeek.IndexThis(AllTags, FileSegment); + filepos_t TagsSize = AllTags.Render(out_file, bWriteDefaultValues); + MetaSeek.IndexThis(AllTags, FileSegment); - TrackSize += pMyTracks2->Render(out_file, bWriteDefaultValues); - MetaSeek.IndexThis(*pMyTracks2, FileSegment); + TrackSize += pMyTracks2->Render(out_file, bWriteDefaultValues); + MetaSeek.IndexThis(*pMyTracks2, FileSegment); - // \todo put it just before the Cue Entries - filepos_t MetaSeekSize = Dummy.ReplaceWith(MetaSeek, out_file, bWriteDefaultValues); + // \todo put it just before the Cue Entries + filepos_t MetaSeekSize = Dummy.ReplaceWith(MetaSeek, out_file, bWriteDefaultValues); #ifdef VOID_TEST - MyInfos.VoidMe(out_file); + MyInfos.VoidMe(out_file); #endif // VOID_TEST - // let's assume we know the size of the Segment element - // the size of the FileSegment is also computed because mandatory elements we don't write ourself exist - if (FileSegment.ForceSize(SegmentSize - FileSegment.HeadSize() + MetaSeekSize - + TrackSize + ClusterSize + CueSize + InfoSize + TagsSize + ChapterSize)) { - FileSegment.OverwriteHead(out_file); - } + // let's assume we know the size of the Segment element + // the size of the FileSegment is also computed because mandatory elements we don't write ourself exist + if (FileSegment.ForceSize(SegmentSize - FileSegment.HeadSize() + MetaSeekSize + + TrackSize + ClusterSize + CueSize + InfoSize + TagsSize + ChapterSize)) { + FileSegment.OverwriteHead(out_file); + } #if 0 - delete[] buf_bin; - delete[] buf_txt; + delete[] buf_bin; + delete[] buf_txt; #endif // 0 #ifdef OLD - MuxedFile.Close(1000); // 1000 ms + MuxedFile.Close(1000); // 1000 ms #endif // OLD - out_file.close(); + out_file.close(); delete Blob1; delete Blob2; @@ -390,7 +390,7 @@ int main(int argc, char **argv) } catch (exception & Ex) { - cout << Ex.what() << endl; + cout << Ex.what() << endl; } return 0; diff --git a/test/mux/test8.cpp b/test/mux/test8.cpp index c38f39d..59e0a25 100644 --- a/test/mux/test8.cpp +++ b/test/mux/test8.cpp @@ -9,12 +9,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -64,770 +64,770 @@ using namespace std; /*! \note you can generate the file used in this example using test6.cpp - \todo the blocks with "titi" and "tetetete" don't seem to be read ! + \todo the blocks with "titi" and "tetetete" don't seem to be read ! */ int main(int argc, char **argv) { try { - StdIOCallback Cluster_file((argc>=2 ? argv[1] : "muxed.mkv"), MODE_READ); + StdIOCallback Cluster_file((argc>=2 ? argv[1] : "muxed.mkv"), MODE_READ); - // create the Matroska file -/// FileKax MuxedFile(Cluster_file); -// bool bAllowDummy = false; // don't read elements we don't know - bool bAllowDummy = true; // even read elements we don't know (needed for CRC checking) + // create the Matroska file +/// FileKax MuxedFile(Cluster_file); +// bool bAllowDummy = false; // don't read elements we don't know + bool bAllowDummy = true; // even read elements we don't know (needed for CRC checking) - // read the EBML head - EbmlStream aStream(Cluster_file); - EbmlElement * ElementLevel0; - EbmlElement * ElementLevel1; - EbmlElement * ElementLevel2; - EbmlElement * ElementLevel3 = NULL; - EbmlElement * ElementLevel4 = NULL; + // read the EBML head + EbmlStream aStream(Cluster_file); + EbmlElement * ElementLevel0; + EbmlElement * ElementLevel1; + EbmlElement * ElementLevel2; + EbmlElement * ElementLevel3 = NULL; + EbmlElement * ElementLevel4 = NULL; -/// MuxedFile.ReadHead(); - // find the EBML head in the file - ElementLevel0 = aStream.FindNextID(EbmlHead::ClassInfos, 0xFFFFFFFFL); - if (ElementLevel0 != NULL) - { - printf("EBML : "); - for (unsigned int i=0; i> (8*(3-i))) & 0xFF); - } - printf("\n"); +/// MuxedFile.ReadHead(); + // find the EBML head in the file + ElementLevel0 = aStream.FindNextID(EbmlHead::ClassInfos, 0xFFFFFFFFL); + if (ElementLevel0 != NULL) + { + printf("EBML : "); + for (unsigned int i=0; i> (8*(3-i))) & 0xFF); + } + printf("\n"); - ElementLevel0->SkipData(aStream, EbmlHead_Context); - if (ElementLevel0 != NULL) - delete ElementLevel0; - } + ElementLevel0->SkipData(aStream, EbmlHead_Context); + if (ElementLevel0 != NULL) + delete ElementLevel0; + } - int UpperElementLevel = 0; - KaxSegment * Segment; - KaxInfo * SegmentInfo; - KaxTrackEntry * TrackAudio; - KaxTrackEntry * TrackVideo; - KaxCluster *SegmentCluster; - KaxCues *CuesEntry; - KaxSeekHead *MetaSeek; - KaxChapters *Chapters; - KaxTags *AllTags; - uint64 TimecodeScale = 1000000; + int UpperElementLevel = 0; + KaxSegment * Segment; + KaxInfo * SegmentInfo; + KaxTrackEntry * TrackAudio; + KaxTrackEntry * TrackVideo; + KaxCluster *SegmentCluster; + KaxCues *CuesEntry; + KaxSeekHead *MetaSeek; + KaxChapters *Chapters; + KaxTags *AllTags; + uint64 TimecodeScale = 1000000; - // find the segment to read - ElementLevel0 = aStream.FindNextID(KaxSegment::ClassInfos, 0xFFFFFFFFL); - if (ElementLevel0 != NULL) - { - if (EbmlId(*ElementLevel0) == KaxSegment::ClassInfos.GlobalId) { - Segment = static_cast(ElementLevel0); -// MuxedFile.ReadTracks(); -// MuxedFile.ReadCodec(); - // scan the file for a Tracks element (all previous Level1 elements are discarded) - ElementLevel1 = aStream.FindNextElement(ElementLevel0->Generic().Context, UpperElementLevel, 0, bAllowDummy); + // find the segment to read + ElementLevel0 = aStream.FindNextID(KaxSegment::ClassInfos, 0xFFFFFFFFL); + if (ElementLevel0 != NULL) + { + if (EbmlId(*ElementLevel0) == KaxSegment::ClassInfos.GlobalId) { + Segment = static_cast(ElementLevel0); +// MuxedFile.ReadTracks(); +// MuxedFile.ReadCodec(); + // scan the file for a Tracks element (all previous Level1 elements are discarded) + ElementLevel1 = aStream.FindNextElement(ElementLevel0->Generic().Context, UpperElementLevel, 0, bAllowDummy); - while (ElementLevel1 != NULL) { - if (UpperElementLevel > 0) { - break; - } - if (UpperElementLevel < 0) { - UpperElementLevel = 0; - } + while (ElementLevel1 != NULL) { + if (UpperElementLevel > 0) { + break; + } + if (UpperElementLevel < 0) { + UpperElementLevel = 0; + } - /// \todo switch the type of the element to check if it's one we want to handle, like attachements - if (EbmlId(*ElementLevel1) == EbmlVoid::ClassInfos.GlobalId) { - printf("\n- Void found\n"); - } else if (EbmlId(*ElementLevel1) == KaxTracks::ClassInfos.GlobalId) { - // found the Tracks element - printf("\n- Segment Tracks found\n"); - // handle the data in Tracks here. - // poll for new tracks and handle them - ElementLevel2 = aStream.FindNextElement(ElementLevel1->Generic().Context, UpperElementLevel, 0, bAllowDummy); + /// \todo switch the type of the element to check if it's one we want to handle, like attachements + if (EbmlId(*ElementLevel1) == EbmlVoid::ClassInfos.GlobalId) { + printf("\n- Void found\n"); + } else if (EbmlId(*ElementLevel1) == KaxTracks::ClassInfos.GlobalId) { + // found the Tracks element + printf("\n- Segment Tracks found\n"); + // handle the data in Tracks here. + // poll for new tracks and handle them + ElementLevel2 = aStream.FindNextElement(ElementLevel1->Generic().Context, UpperElementLevel, 0, bAllowDummy); - while (ElementLevel2 != NULL) { - if (UpperElementLevel > 0) { - break; - } - if (UpperElementLevel < 0) { - UpperElementLevel = 0; - } - /// \todo switch the type of the element to check if it's one we want to handle, like attachements - if (EbmlId(*ElementLevel2) == KaxTrackEntry::ClassInfos.GlobalId) { - printf("* Found a track\n"); + while (ElementLevel2 != NULL) { + if (UpperElementLevel > 0) { + break; + } + if (UpperElementLevel < 0) { + UpperElementLevel = 0; + } + /// \todo switch the type of the element to check if it's one we want to handle, like attachements + if (EbmlId(*ElementLevel2) == KaxTrackEntry::ClassInfos.GlobalId) { + printf("* Found a track\n"); - ElementLevel3 = aStream.FindNextElement(ElementLevel2->Generic().Context, UpperElementLevel, 0, bAllowDummy); - while (ElementLevel3 != NULL) { - if (UpperElementLevel > 0) { - break; - } - if (UpperElementLevel < 0) { - UpperElementLevel = 0; - } - // read the data we care about in a track - // Track number - if (EbmlId(*ElementLevel3) == KaxTrackNumber::ClassInfos.GlobalId) { - KaxTrackNumber & TrackNum = *static_cast(ElementLevel3); - TrackNum.ReadData(aStream.I_O()); - printf("Track # %d\n", uint8(TrackNum)); - } + ElementLevel3 = aStream.FindNextElement(ElementLevel2->Generic().Context, UpperElementLevel, 0, bAllowDummy); + while (ElementLevel3 != NULL) { + if (UpperElementLevel > 0) { + break; + } + if (UpperElementLevel < 0) { + UpperElementLevel = 0; + } + // read the data we care about in a track + // Track number + if (EbmlId(*ElementLevel3) == KaxTrackNumber::ClassInfos.GlobalId) { + KaxTrackNumber & TrackNum = *static_cast(ElementLevel3); + TrackNum.ReadData(aStream.I_O()); + printf("Track # %d\n", uint8(TrackNum)); + } - // Track type - else if (EbmlId(*ElementLevel3) == KaxTrackType::ClassInfos.GlobalId) { - KaxTrackType & TrackType = *static_cast(ElementLevel3); - TrackType.ReadData(aStream.I_O()); - printf("Track type : "); - switch(uint8(TrackType)) - { - case track_audio: - printf("Audio"); - TrackAudio = static_cast(ElementLevel2); - TrackAudio->SetGlobalTimecodeScale(TimecodeScale); - break; - case track_video: - printf("Video"); - TrackVideo = static_cast(ElementLevel2); - TrackVideo->SetGlobalTimecodeScale(TimecodeScale); - break; - default: - printf("unknown"); - } - printf("\n"); - } + // Track type + else if (EbmlId(*ElementLevel3) == KaxTrackType::ClassInfos.GlobalId) { + KaxTrackType & TrackType = *static_cast(ElementLevel3); + TrackType.ReadData(aStream.I_O()); + printf("Track type : "); + switch(uint8(TrackType)) + { + case track_audio: + printf("Audio"); + TrackAudio = static_cast(ElementLevel2); + TrackAudio->SetGlobalTimecodeScale(TimecodeScale); + break; + case track_video: + printf("Video"); + TrackVideo = static_cast(ElementLevel2); + TrackVideo->SetGlobalTimecodeScale(TimecodeScale); + break; + default: + printf("unknown"); + } + printf("\n"); + } - else if (EbmlId(*ElementLevel3) == KaxTrackFlagLacing::ClassInfos.GlobalId) { - printf("Flag Lacing\n"); - } - else if (EbmlId(*ElementLevel3) == KaxCodecID::ClassInfos.GlobalId) { - KaxCodecID & CodecID = *static_cast(ElementLevel3); - CodecID.ReadData(aStream.I_O()); - printf("Codec ID : %s\n", string(CodecID).c_str()); - } + else if (EbmlId(*ElementLevel3) == KaxTrackFlagLacing::ClassInfos.GlobalId) { + printf("Flag Lacing\n"); + } + else if (EbmlId(*ElementLevel3) == KaxCodecID::ClassInfos.GlobalId) { + KaxCodecID & CodecID = *static_cast(ElementLevel3); + CodecID.ReadData(aStream.I_O()); + printf("Codec ID : %s\n", string(CodecID).c_str()); + } - if (UpperElementLevel > 0) { - assert(0 == 1); // impossible to be here ? - UpperElementLevel--; - delete ElementLevel2; - ElementLevel2 = ElementLevel3; - if (UpperElementLevel > 0) - break; - } else { - ElementLevel3->SkipData(aStream, ElementLevel3->Generic().Context); - delete ElementLevel3; + if (UpperElementLevel > 0) { + assert(0 == 1); // impossible to be here ? + UpperElementLevel--; + delete ElementLevel2; + ElementLevel2 = ElementLevel3; + if (UpperElementLevel > 0) + break; + } else { + ElementLevel3->SkipData(aStream, ElementLevel3->Generic().Context); + delete ElementLevel3; - ElementLevel3 = aStream.FindNextElement(ElementLevel2->Generic().Context, UpperElementLevel, 0, bAllowDummy); - } - } - } - if (UpperElementLevel > 0) { - UpperElementLevel--; - delete ElementLevel2; - ElementLevel2 = ElementLevel3; - if (UpperElementLevel > 0) - break; - } else { - ElementLevel2->SkipData(aStream, ElementLevel2->Generic().Context); - delete ElementLevel2; - - ElementLevel2 = aStream.FindNextElement(ElementLevel1->Generic().Context, UpperElementLevel, 0, bAllowDummy); - } - } - } + ElementLevel3 = aStream.FindNextElement(ElementLevel2->Generic().Context, UpperElementLevel, 0, bAllowDummy); + } + } + } + if (UpperElementLevel > 0) { + UpperElementLevel--; + delete ElementLevel2; + ElementLevel2 = ElementLevel3; + if (UpperElementLevel > 0) + break; + } else { + ElementLevel2->SkipData(aStream, ElementLevel2->Generic().Context); + delete ElementLevel2; - else if (EbmlId(*ElementLevel1) == KaxInfo::ClassInfos.GlobalId) { - printf("\n- Segment Informations found\n"); - SegmentInfo = static_cast(ElementLevel1); + ElementLevel2 = aStream.FindNextElement(ElementLevel1->Generic().Context, UpperElementLevel, 0, bAllowDummy); + } + } + } + + else if (EbmlId(*ElementLevel1) == KaxInfo::ClassInfos.GlobalId) { + printf("\n- Segment Informations found\n"); + SegmentInfo = static_cast(ElementLevel1); #ifdef JUMP_TEST - // test jumping to a random location and find the next Level 0 / Level 1 element - aStream.I_O().setFilePointer(79, seek_current); - printf("Seeked at position 0x%X in the file", aStream.I_O().getFilePointer()); - int LowLevel = 1; - ElementLevel2 = aStream.FindNextElement(KaxSegment::ClassInfos.Context, LowLevel, 0, false); // search up to one level lower - UpperElementLevel = LowLevel; + // test jumping to a random location and find the next Level 0 / Level 1 element + aStream.I_O().setFilePointer(79, seek_current); + printf("Seeked at position 0x%X in the file", aStream.I_O().getFilePointer()); + int LowLevel = 1; + ElementLevel2 = aStream.FindNextElement(KaxSegment::ClassInfos.Context, LowLevel, 0, false); // search up to one level lower + UpperElementLevel = LowLevel; #else // JUMP_TEST - // read the data we care about in matroska - /// \todo There should be a way to get the default values of the elements not defined - ElementLevel2 = aStream.FindNextElement(ElementLevel1->Generic().Context, UpperElementLevel, 0, bAllowDummy); - while (ElementLevel2 != NULL) { - if (UpperElementLevel > 0) { - break; - } - if (UpperElementLevel < 0) { - UpperElementLevel = 0; - } - if (EbmlId(*ElementLevel2) == KaxTimecodeScale::ClassInfos.GlobalId) { - KaxTimecodeScale *TimeScale = static_cast(ElementLevel2); - TimeScale->ReadData(aStream.I_O()); - printf("Timecode Scale %d\n", uint32(*TimeScale)); - TimecodeScale = uint64(*TimeScale); - } else if (EbmlId(*ElementLevel2) == KaxDuration::ClassInfos.GlobalId) { - printf("Segment duration\n"); - } else if (EbmlId(*ElementLevel2) == KaxDateUTC::ClassInfos.GlobalId) { - printf("Date UTC\n"); - } else if (EbmlId(*ElementLevel2) == KaxTitle::ClassInfos.GlobalId) { - printf("Title\n"); - } else if (EbmlId(*ElementLevel2) == KaxMuxingApp::ClassInfos.GlobalId) { - KaxMuxingApp *pApp = static_cast(ElementLevel2); - pApp->ReadData(aStream.I_O()); + // read the data we care about in matroska + /// \todo There should be a way to get the default values of the elements not defined + ElementLevel2 = aStream.FindNextElement(ElementLevel1->Generic().Context, UpperElementLevel, 0, bAllowDummy); + while (ElementLevel2 != NULL) { + if (UpperElementLevel > 0) { + break; + } + if (UpperElementLevel < 0) { + UpperElementLevel = 0; + } + if (EbmlId(*ElementLevel2) == KaxTimecodeScale::ClassInfos.GlobalId) { + KaxTimecodeScale *TimeScale = static_cast(ElementLevel2); + TimeScale->ReadData(aStream.I_O()); + printf("Timecode Scale %d\n", uint32(*TimeScale)); + TimecodeScale = uint64(*TimeScale); + } else if (EbmlId(*ElementLevel2) == KaxDuration::ClassInfos.GlobalId) { + printf("Segment duration\n"); + } else if (EbmlId(*ElementLevel2) == KaxDateUTC::ClassInfos.GlobalId) { + printf("Date UTC\n"); + } else if (EbmlId(*ElementLevel2) == KaxTitle::ClassInfos.GlobalId) { + printf("Title\n"); + } else if (EbmlId(*ElementLevel2) == KaxMuxingApp::ClassInfos.GlobalId) { + KaxMuxingApp *pApp = static_cast(ElementLevel2); + pApp->ReadData(aStream.I_O()); #if !defined(__CYGWIN__) && !defined(__APPLE__) && !defined(__BEOS__) && !defined(__NetBSD__) - wprintf(L"Muxing App : %ls\n", UTFstring(*pApp).c_str()); + wprintf(L"Muxing App : %ls\n", UTFstring(*pApp).c_str()); #else - printf("Muxing App : %s\n", UTFstring(*pApp).c_str()); + printf("Muxing App : %s\n", UTFstring(*pApp).c_str()); #endif - } else if (EbmlId(*ElementLevel2) == KaxWritingApp::ClassInfos.GlobalId) { - KaxWritingApp *pApp = static_cast(ElementLevel2); - pApp->ReadData(aStream.I_O()); + } else if (EbmlId(*ElementLevel2) == KaxWritingApp::ClassInfos.GlobalId) { + KaxWritingApp *pApp = static_cast(ElementLevel2); + pApp->ReadData(aStream.I_O()); #if !defined(__CYGWIN__) && !defined(__APPLE__) && !defined(__BEOS__) && !defined(__NetBSD__) - wprintf(L"Writing App : %ls (יאפן)\n", UTFstring(*pApp).c_str()); + wprintf(L"Writing App : %ls (יאפן)\n", UTFstring(*pApp).c_str()); #else - printf("Writing App : %s (יאפן)\n", UTFstring(*pApp).c_str()); + printf("Writing App : %s (יאפן)\n", UTFstring(*pApp).c_str()); #endif - } + } - if (UpperElementLevel > 0) { - UpperElementLevel--; - delete ElementLevel2; - ElementLevel2 = ElementLevel3; - if (UpperElementLevel > 0) - break; - } else { - ElementLevel2->SkipData(aStream, ElementLevel2->Generic().Context); - delete ElementLevel2; + if (UpperElementLevel > 0) { + UpperElementLevel--; + delete ElementLevel2; + ElementLevel2 = ElementLevel3; + if (UpperElementLevel > 0) + break; + } else { + ElementLevel2->SkipData(aStream, ElementLevel2->Generic().Context); + delete ElementLevel2; - ElementLevel2 = aStream.FindNextElement(ElementLevel1->Generic().Context, UpperElementLevel, 0, bAllowDummy); - } - } + ElementLevel2 = aStream.FindNextElement(ElementLevel1->Generic().Context, UpperElementLevel, 0, bAllowDummy); + } + } #endif // JUMP_TEST - } + } - else if (EbmlId(*ElementLevel1) == KaxCluster::ClassInfos.GlobalId) { - printf("\n- Segment Clusters found\n"); - SegmentCluster = static_cast(ElementLevel1); -// SegmentCluster->ClearElement(); - uint32 ClusterTimecode; - EbmlCrc32 *pChecksum = NULL; - uint32 SizeInCrc; - uint64 CrcPositionStart = 0; + else if (EbmlId(*ElementLevel1) == KaxCluster::ClassInfos.GlobalId) { + printf("\n- Segment Clusters found\n"); + SegmentCluster = static_cast(ElementLevel1); +// SegmentCluster->ClearElement(); + uint32 ClusterTimecode; + EbmlCrc32 *pChecksum = NULL; + uint32 SizeInCrc; + uint64 CrcPositionStart = 0; #ifdef MEMORY_READ // read the Cluster in memory and then extract elements from memory - SegmentCluster->Read(aStream, KaxCluster::ClassInfos.Context, UpperElementLevel, ElementLevel2, bAllowDummy); - if (SegmentCluster->CheckMandatory()) { - printf(" * All mandatory elements found *\n"); - } else { - printf(" * Some mandatory elements ar missing !!! *\n"); - } - - // display the elements read - unsigned int Index0; - for (Index0 = 0; Index0ListSize() ;Index0++) { - printf(" - found %s\n", (*SegmentCluster)[Index0]->Generic().DebugName); - } + SegmentCluster->Read(aStream, KaxCluster::ClassInfos.Context, UpperElementLevel, ElementLevel2, bAllowDummy); + if (SegmentCluster->CheckMandatory()) { + printf(" * All mandatory elements found *\n"); + } else { + printf(" * Some mandatory elements ar missing !!! *\n"); + } + + // display the elements read + unsigned int Index0; + for (Index0 = 0; Index0ListSize() ;Index0++) { + printf(" - found %s\n", (*SegmentCluster)[Index0]->Generic().DebugName); + } #else // not MEMORY_READ - // read blocks and discard the ones we don't care about - ElementLevel2 = aStream.FindNextElement(ElementLevel1->Generic().Context, UpperElementLevel, 0, bAllowDummy); - while (ElementLevel2 != NULL) { - if (UpperElementLevel > 0) { - break; - } - if (UpperElementLevel < 0) { - UpperElementLevel = 0; - } - if (EbmlId(*ElementLevel2) == KaxClusterTimecode::ClassInfos.GlobalId) { - printf("Cluster timecode found\n"); - KaxClusterTimecode & ClusterTime = *static_cast(ElementLevel2); - ClusterTime.ReadData(aStream.I_O()); - ClusterTimecode = uint32(ClusterTime); - SegmentCluster->InitTimecode(ClusterTimecode, TimecodeScale); - } else if (EbmlId(*ElementLevel2) == KaxBlockGroup::ClassInfos.GlobalId) { - printf("Block Group found\n"); + // read blocks and discard the ones we don't care about + ElementLevel2 = aStream.FindNextElement(ElementLevel1->Generic().Context, UpperElementLevel, 0, bAllowDummy); + while (ElementLevel2 != NULL) { + if (UpperElementLevel > 0) { + break; + } + if (UpperElementLevel < 0) { + UpperElementLevel = 0; + } + if (EbmlId(*ElementLevel2) == KaxClusterTimecode::ClassInfos.GlobalId) { + printf("Cluster timecode found\n"); + KaxClusterTimecode & ClusterTime = *static_cast(ElementLevel2); + ClusterTime.ReadData(aStream.I_O()); + ClusterTimecode = uint32(ClusterTime); + SegmentCluster->InitTimecode(ClusterTimecode, TimecodeScale); + } else if (EbmlId(*ElementLevel2) == KaxBlockGroup::ClassInfos.GlobalId) { + printf("Block Group found\n"); #ifdef TEST_BLOCKGROUP_READ - KaxBlockGroup & aBlockGroup = *static_cast(ElementLevel2); -// aBlockGroup.ClearElement(); - // Extract the valuable data from the Block + KaxBlockGroup & aBlockGroup = *static_cast(ElementLevel2); +// aBlockGroup.ClearElement(); + // Extract the valuable data from the Block - aBlockGroup.Read(aStream, KaxBlockGroup::ClassInfos.Context, UpperElementLevel, ElementLevel3, bAllowDummy); - KaxBlock * DataBlock = static_cast(aBlockGroup.FindElt(KaxBlock::ClassInfos)); - if (DataBlock != NULL) { -// DataBlock->ReadData(aStream.I_O()); - DataBlock->SetParent(*SegmentCluster); - printf(" Track # %d / %d frame%s / Timecode %I64d\n",DataBlock->TrackNum(), DataBlock->NumberFrames(), (DataBlock->NumberFrames() > 1)?"s":"", DataBlock->GlobalTimecode()); - } else { - printf(" A BlockGroup without a Block !!!"); - } - KaxBlockDuration * BlockDuration = static_cast(aBlockGroup.FindElt(KaxBlockDuration::ClassInfos)); - if (BlockDuration != NULL) { - printf(" Block Duration %d scaled ticks : %ld ns\n", uint32(*BlockDuration), uint32(*BlockDuration) * TimecodeScale); - } - KaxReferenceBlock * RefTime = static_cast(aBlockGroup.FindElt(KaxReferenceBlock::ClassInfos)); - if (RefTime != NULL) { - printf(" Reference frame at scaled (%d) timecode %ld\n", int32(*RefTime), int32(int64(*RefTime) * TimecodeScale)); - } + aBlockGroup.Read(aStream, KaxBlockGroup::ClassInfos.Context, UpperElementLevel, ElementLevel3, bAllowDummy); + KaxBlock * DataBlock = static_cast(aBlockGroup.FindElt(KaxBlock::ClassInfos)); + if (DataBlock != NULL) { +// DataBlock->ReadData(aStream.I_O()); + DataBlock->SetParent(*SegmentCluster); + printf(" Track # %d / %d frame%s / Timecode %I64d\n",DataBlock->TrackNum(), DataBlock->NumberFrames(), (DataBlock->NumberFrames() > 1)?"s":"", DataBlock->GlobalTimecode()); + } else { + printf(" A BlockGroup without a Block !!!"); + } + KaxBlockDuration * BlockDuration = static_cast(aBlockGroup.FindElt(KaxBlockDuration::ClassInfos)); + if (BlockDuration != NULL) { + printf(" Block Duration %d scaled ticks : %ld ns\n", uint32(*BlockDuration), uint32(*BlockDuration) * TimecodeScale); + } + KaxReferenceBlock * RefTime = static_cast(aBlockGroup.FindElt(KaxReferenceBlock::ClassInfos)); + if (RefTime != NULL) { + printf(" Reference frame at scaled (%d) timecode %ld\n", int32(*RefTime), int32(int64(*RefTime) * TimecodeScale)); + } #else // TEST_BLOCKGROUP_READ - // read the data we care about in matroska - /// \todo There should be a way to get the default values of the elements not defined - ElementLevel3 = aStream.FindNextElement(ElementLevel2->Generic().Context, UpperElementLevel, 0, bAllowDummy); - while (ElementLevel3 != NULL) { - if (UpperElementLevel > 0) { - break; - } - if (UpperElementLevel < 0) { - UpperElementLevel = 0; - } - if (EbmlId(*ElementLevel3) == KaxBlock::ClassInfos.GlobalId) { - printf(" Block Data\n"); - KaxBlock & DataBlock = *static_cast(ElementLevel3); + // read the data we care about in matroska + /// \todo There should be a way to get the default values of the elements not defined + ElementLevel3 = aStream.FindNextElement(ElementLevel2->Generic().Context, UpperElementLevel, 0, bAllowDummy); + while (ElementLevel3 != NULL) { + if (UpperElementLevel > 0) { + break; + } + if (UpperElementLevel < 0) { + UpperElementLevel = 0; + } + if (EbmlId(*ElementLevel3) == KaxBlock::ClassInfos.GlobalId) { + printf(" Block Data\n"); + KaxBlock & DataBlock = *static_cast(ElementLevel3); #ifdef NO_DISPLAY_DATA - DataBlock.ReadData(aStream.I_O(), SCOPE_PARTIAL_DATA); + DataBlock.ReadData(aStream.I_O(), SCOPE_PARTIAL_DATA); #else // NO_DISPLAY_DATA - DataBlock.ReadData(aStream.I_O(), SCOPE_ALL_DATA); + DataBlock.ReadData(aStream.I_O(), SCOPE_ALL_DATA); #endif // NO_DISPLAY_DATA - DataBlock.SetParent(*SegmentCluster); - printf(" Track # %d / %d frame%s / Timecode %I64d\n",DataBlock.TrackNum(), DataBlock.NumberFrames(), (DataBlock.NumberFrames() > 1)?"s":"", DataBlock.GlobalTimecode()); + DataBlock.SetParent(*SegmentCluster); + printf(" Track # %d / %d frame%s / Timecode %I64d\n",DataBlock.TrackNum(), DataBlock.NumberFrames(), (DataBlock.NumberFrames() > 1)?"s":"", DataBlock.GlobalTimecode()); #ifndef NO_DISPLAY_DATA - for (unsigned int i=0; i< DataBlock.NumberFrames(); i++) { - printf(" [%s]\n",DataBlock.GetBuffer(i).Buffer()); // STRING ONLY POSSIBLE WITH THIS PARTICULAR EXAMPLE (the binary data is a string) - } + for (unsigned int i=0; i< DataBlock.NumberFrames(); i++) { + printf(" [%s]\n",DataBlock.GetBuffer(i).Buffer()); // STRING ONLY POSSIBLE WITH THIS PARTICULAR EXAMPLE (the binary data is a string) + } #endif // NO_DISPLAY_DATA -// printf("Codec ID : %s\n", &binary(CodecID)); // strings for the moment (example) +// printf("Codec ID : %s\n", &binary(CodecID)); // strings for the moment (example) #if MATROSKA_VERSION >= 2 - } else if (EbmlId(*ElementLevel3) == KaxBlockVirtual::ClassInfos.GlobalId) { - printf(" Virtual Block\n"); - } else if (EbmlId(*ElementLevel3) == KaxReferenceVirtual::ClassInfos.GlobalId) { - printf(" virtual Reference\n"); + } else if (EbmlId(*ElementLevel3) == KaxBlockVirtual::ClassInfos.GlobalId) { + printf(" Virtual Block\n"); + } else if (EbmlId(*ElementLevel3) == KaxReferenceVirtual::ClassInfos.GlobalId) { + printf(" virtual Reference\n"); #endif // MATROSKA_VERSION - } else if (EbmlId(*ElementLevel3) == KaxReferencePriority::ClassInfos.GlobalId) { - printf(" Reference priority\n"); - } else if (EbmlId(*ElementLevel3) == KaxReferenceBlock::ClassInfos.GlobalId) { - KaxReferenceBlock & RefTime = *static_cast(ElementLevel3); - RefTime.ReadData(aStream.I_O()); - printf(" Reference frame at scaled (%d) timecode %ld\n", int32(RefTime), int32(int64(RefTime) * TimecodeScale)); - } else if (EbmlId(*ElementLevel3) == KaxBlockDuration::ClassInfos.GlobalId) { - KaxBlockDuration & BlockDuration = *static_cast(ElementLevel3); - BlockDuration.ReadData(aStream.I_O()); - printf(" Block Duration %d scaled ticks : %ld ns\n", uint32(BlockDuration), uint32(BlockDuration) * TimecodeScale); - } - if (UpperElementLevel > 0) { - UpperElementLevel--; - delete ElementLevel3; - ElementLevel3 = ElementLevel4; - if (UpperElementLevel > 0) - break; - } else { - ElementLevel3->SkipData(aStream, ElementLevel3->Generic().Context); + } else if (EbmlId(*ElementLevel3) == KaxReferencePriority::ClassInfos.GlobalId) { + printf(" Reference priority\n"); + } else if (EbmlId(*ElementLevel3) == KaxReferenceBlock::ClassInfos.GlobalId) { + KaxReferenceBlock & RefTime = *static_cast(ElementLevel3); + RefTime.ReadData(aStream.I_O()); + printf(" Reference frame at scaled (%d) timecode %ld\n", int32(RefTime), int32(int64(RefTime) * TimecodeScale)); + } else if (EbmlId(*ElementLevel3) == KaxBlockDuration::ClassInfos.GlobalId) { + KaxBlockDuration & BlockDuration = *static_cast(ElementLevel3); + BlockDuration.ReadData(aStream.I_O()); + printf(" Block Duration %d scaled ticks : %ld ns\n", uint32(BlockDuration), uint32(BlockDuration) * TimecodeScale); + } + if (UpperElementLevel > 0) { + UpperElementLevel--; + delete ElementLevel3; + ElementLevel3 = ElementLevel4; + if (UpperElementLevel > 0) + break; + } else { + ElementLevel3->SkipData(aStream, ElementLevel3->Generic().Context); - ElementLevel3 = aStream.FindNextElement(ElementLevel2->Generic().Context, UpperElementLevel, 0, bAllowDummy); - } - } + ElementLevel3 = aStream.FindNextElement(ElementLevel2->Generic().Context, UpperElementLevel, 0, bAllowDummy); + } + } #endif // TEST_BLOCKGROUP_READ - } else if (EbmlId(*ElementLevel2) == EbmlCrc32::ClassInfos.GlobalId) { - printf("Cluster CheckSum !\n"); - pChecksum = static_cast(ElementLevel2); - pChecksum->ReadData(aStream.I_O()); - SegmentCluster->ForceChecksum( pChecksum->GetCrc32() ); // not use later - SizeInCrc = 0; - CrcPositionStart = aStream.I_O().getFilePointer(); - } + } else if (EbmlId(*ElementLevel2) == EbmlCrc32::ClassInfos.GlobalId) { + printf("Cluster CheckSum !\n"); + pChecksum = static_cast(ElementLevel2); + pChecksum->ReadData(aStream.I_O()); + SegmentCluster->ForceChecksum( pChecksum->GetCrc32() ); // not use later + SizeInCrc = 0; + CrcPositionStart = aStream.I_O().getFilePointer(); + } - if (UpperElementLevel > 0) { - UpperElementLevel--; - delete ElementLevel2; - ElementLevel2 = ElementLevel3; - if (UpperElementLevel > 0) - break; - } else { - ElementLevel2->SkipData(aStream, ElementLevel2->Generic().Context); - if (ElementLevel2 != pChecksum) - delete ElementLevel2; + if (UpperElementLevel > 0) { + UpperElementLevel--; + delete ElementLevel2; + ElementLevel2 = ElementLevel3; + if (UpperElementLevel > 0) + break; + } else { + ElementLevel2->SkipData(aStream, ElementLevel2->Generic().Context); + if (ElementLevel2 != pChecksum) + delete ElementLevel2; - ElementLevel2 = aStream.FindNextElement(ElementLevel1->Generic().Context, UpperElementLevel, 0, bAllowDummy); - } - } + ElementLevel2 = aStream.FindNextElement(ElementLevel1->Generic().Context, UpperElementLevel, 0, bAllowDummy); + } + } #endif // not MEMORY_READ - if (pChecksum != NULL) { - EbmlCrc32 ComputedChecksum; - uint64 CurrPosition = aStream.I_O().getFilePointer(); - uint64 CrcPositionEnd = ElementLevel2->GetElementPosition(); - binary *SupposedBufferInCrc = new binary [CrcPositionEnd - CrcPositionStart]; - aStream.I_O().setFilePointer(CrcPositionStart); - aStream.I_O().readFully(SupposedBufferInCrc, CrcPositionEnd - CrcPositionStart); - aStream.I_O().setFilePointer(CurrPosition); - ComputedChecksum.FillCRC32(SupposedBufferInCrc, CrcPositionEnd - CrcPositionStart); - delete [] SupposedBufferInCrc; - if (pChecksum->GetCrc32() == ComputedChecksum.GetCrc32()) { - printf(" ++ CheckSum verification succeeded ++"); - } else { - printf(" ++ CheckSum verification FAILED !!! ++"); - } - delete pChecksum; - pChecksum = NULL; - } - } - else if (EbmlId(*ElementLevel1) == KaxCues::ClassInfos.GlobalId) { - printf("\n- Cue entries found\n"); - CuesEntry = static_cast(ElementLevel1); - CuesEntry->SetGlobalTimecodeScale(TimecodeScale); - // read everything in memory - CuesEntry->Read(aStream, KaxCues::ClassInfos.Context, UpperElementLevel, ElementLevel2, bAllowDummy); // build the entries in memory - if (CuesEntry->CheckMandatory()) { - printf(" * All mandatory elements found *\n"); - } else { - printf(" * Some mandatory elements ar missing !!! *\n"); - } - CuesEntry->Sort(); - // display the elements read - unsigned int Index0; - for (Index0 = 0; Index0ListSize() ;Index0++) { - if ((*CuesEntry)[Index0]->Generic().GlobalId == KaxCuePoint::ClassInfos.GlobalId) { - printf(" Cue Point\n"); + if (pChecksum != NULL) { + EbmlCrc32 ComputedChecksum; + uint64 CurrPosition = aStream.I_O().getFilePointer(); + uint64 CrcPositionEnd = ElementLevel2->GetElementPosition(); + binary *SupposedBufferInCrc = new binary [CrcPositionEnd - CrcPositionStart]; + aStream.I_O().setFilePointer(CrcPositionStart); + aStream.I_O().readFully(SupposedBufferInCrc, CrcPositionEnd - CrcPositionStart); + aStream.I_O().setFilePointer(CurrPosition); + ComputedChecksum.FillCRC32(SupposedBufferInCrc, CrcPositionEnd - CrcPositionStart); + delete [] SupposedBufferInCrc; + if (pChecksum->GetCrc32() == ComputedChecksum.GetCrc32()) { + printf(" ++ CheckSum verification succeeded ++"); + } else { + printf(" ++ CheckSum verification FAILED !!! ++"); + } + delete pChecksum; + pChecksum = NULL; + } + } + else if (EbmlId(*ElementLevel1) == KaxCues::ClassInfos.GlobalId) { + printf("\n- Cue entries found\n"); + CuesEntry = static_cast(ElementLevel1); + CuesEntry->SetGlobalTimecodeScale(TimecodeScale); + // read everything in memory + CuesEntry->Read(aStream, KaxCues::ClassInfos.Context, UpperElementLevel, ElementLevel2, bAllowDummy); // build the entries in memory + if (CuesEntry->CheckMandatory()) { + printf(" * All mandatory elements found *\n"); + } else { + printf(" * Some mandatory elements ar missing !!! *\n"); + } + CuesEntry->Sort(); + // display the elements read + unsigned int Index0; + for (Index0 = 0; Index0ListSize() ;Index0++) { + if ((*CuesEntry)[Index0]->Generic().GlobalId == KaxCuePoint::ClassInfos.GlobalId) { + printf(" Cue Point\n"); - KaxCuePoint & CuePoint = *static_cast((*CuesEntry)[Index0]); - unsigned int Index1; - for (Index1 = 0; Index1Generic().GlobalId == KaxCueTime::ClassInfos.GlobalId) { - KaxCueTime & CueTime = *static_cast(CuePoint[Index1]); - printf(" Time %ld\n", uint64(CueTime) * TimecodeScale); - } else if (CuePoint[Index1]->Generic().GlobalId == KaxCueTrackPositions::ClassInfos.GlobalId) { - KaxCueTrackPositions & CuePos = *static_cast(CuePoint[Index1]); - printf(" Positions\n"); + KaxCuePoint & CuePoint = *static_cast((*CuesEntry)[Index0]); + unsigned int Index1; + for (Index1 = 0; Index1Generic().GlobalId == KaxCueTime::ClassInfos.GlobalId) { + KaxCueTime & CueTime = *static_cast(CuePoint[Index1]); + printf(" Time %ld\n", uint64(CueTime) * TimecodeScale); + } else if (CuePoint[Index1]->Generic().GlobalId == KaxCueTrackPositions::ClassInfos.GlobalId) { + KaxCueTrackPositions & CuePos = *static_cast(CuePoint[Index1]); + printf(" Positions\n"); - unsigned int Index2; - for (Index2 = 0; Index2Generic().GlobalId == KaxCueTrack::ClassInfos.GlobalId) { - KaxCueTrack & CueTrack = *static_cast(CuePos[Index2]); - printf(" Track %d\n", uint16(CueTrack)); - } else if (CuePos[Index2]->Generic().GlobalId == KaxCueClusterPosition::ClassInfos.GlobalId) { - KaxCueClusterPosition & CuePoss = *static_cast(CuePos[Index2]); - printf(" Cluster position %d\n", uint64(CuePoss)); + unsigned int Index2; + for (Index2 = 0; Index2Generic().GlobalId == KaxCueTrack::ClassInfos.GlobalId) { + KaxCueTrack & CueTrack = *static_cast(CuePos[Index2]); + printf(" Track %d\n", uint16(CueTrack)); + } else if (CuePos[Index2]->Generic().GlobalId == KaxCueClusterPosition::ClassInfos.GlobalId) { + KaxCueClusterPosition & CuePoss = *static_cast(CuePos[Index2]); + printf(" Cluster position %d\n", uint64(CuePoss)); #if MATROSKA_VERSION >= 2 - } else if (CuePos[Index2]->Generic().GlobalId == KaxCueReference::ClassInfos.GlobalId) { - KaxCueReference & CueRefs = *static_cast(CuePos[Index2]); - printf(" Reference\n"); + } else if (CuePos[Index2]->Generic().GlobalId == KaxCueReference::ClassInfos.GlobalId) { + KaxCueReference & CueRefs = *static_cast(CuePos[Index2]); + printf(" Reference\n"); - unsigned int Index3; - for (Index3 = 0; Index3Generic().GlobalId == KaxCueRefTime::ClassInfos.GlobalId) { - KaxCueRefTime & CueTime = *static_cast(CueRefs[Index3]); - printf(" Time %d\n", uint32(CueTime)); - } else if (CueRefs[Index3]->Generic().GlobalId == KaxCueRefCluster::ClassInfos.GlobalId) { - KaxCueRefCluster & CueClust = *static_cast(CueRefs[Index3]); - printf(" Cluster position %d\n", uint64(CueClust)); - } else { - printf(" - found %s\n", CueRefs[Index3]->Generic().DebugName); - } - } + unsigned int Index3; + for (Index3 = 0; Index3Generic().GlobalId == KaxCueRefTime::ClassInfos.GlobalId) { + KaxCueRefTime & CueTime = *static_cast(CueRefs[Index3]); + printf(" Time %d\n", uint32(CueTime)); + } else if (CueRefs[Index3]->Generic().GlobalId == KaxCueRefCluster::ClassInfos.GlobalId) { + KaxCueRefCluster & CueClust = *static_cast(CueRefs[Index3]); + printf(" Cluster position %d\n", uint64(CueClust)); + } else { + printf(" - found %s\n", CueRefs[Index3]->Generic().DebugName); + } + } #endif // MATROSKA_VERSION - } else { - printf(" - found %s\n", CuePos[Index2]->Generic().DebugName); - } - } - } else { - printf(" - found %s\n", CuePoint[Index1]->Generic().DebugName); - } - } - } else { - printf(" - found %s\n", (*CuesEntry)[Index0]->Generic().DebugName); - } - } - } - else if (EbmlId(*ElementLevel1) == KaxSeekHead::ClassInfos.GlobalId) { - printf("\n- Meta Seek found\n"); - MetaSeek = static_cast(ElementLevel1); - // read it in memory - MetaSeek->Read(aStream, KaxSeekHead::ClassInfos.Context, UpperElementLevel, ElementLevel2, bAllowDummy); - if (MetaSeek->CheckMandatory()) { - printf(" * All mandatory elements found *\n"); - } else { - printf(" * Some mandatory elements ar missing !!! *\n"); - } - unsigned int Index0; - for (Index0 = 0; Index0ListSize() ;Index0++) { - if ((*MetaSeek)[Index0]->Generic().GlobalId == KaxSeek::ClassInfos.GlobalId) { - printf(" Seek Point\n"); - KaxSeek & SeekPoint = *static_cast((*MetaSeek)[Index0]); - unsigned int Index1; - for (Index1 = 0; Index1Generic().GlobalId == KaxSeekID::ClassInfos.GlobalId) { - KaxSeekID * SeekID = static_cast(SeekPoint[Index1]); - printf(" Seek ID ", SeekID->GetBuffer()); - for (unsigned int i=0; iGetSize(); i++) { - printf("%02X", SeekID->GetBuffer()[i]); - } - printf("\n"); - } else if (SeekPoint[Index1]->Generic().GlobalId == KaxSeekPosition::ClassInfos.GlobalId) { - KaxSeekPosition * SeekPos = static_cast(SeekPoint[Index1]); - printf(" Seek position %d\n", uint32(*SeekPos)); - } - } - } - } - } else if (EbmlId(*ElementLevel1) == KaxChapters::ClassInfos.GlobalId) { - printf("\n- Chapters found\n"); - Chapters = static_cast(ElementLevel1); - // read it in memory - Chapters->Read(aStream, KaxChapters::ClassInfos.Context, UpperElementLevel, ElementLevel2, bAllowDummy); - if (Chapters->CheckMandatory()) { - printf(" * All mandatory elements found *\n"); - } else { - printf(" * Some mandatory elements ar missing !!! *\n"); - } - unsigned int Index0; - for (Index0 = 0; Index0ListSize() ;Index0++) { - if ((*Chapters)[Index0]->Generic().GlobalId == KaxEditionEntry::ClassInfos.GlobalId) { - printf(" Edition\n"); - KaxEditionEntry & Edition = *static_cast((*Chapters)[Index0]); - unsigned int Index2; - for (Index2 = 0; Index2Generic().GlobalId == KaxChapterAtom::ClassInfos.GlobalId) { - printf(" Chapter Atom\n"); - KaxChapterAtom & aChapterAtom = *static_cast(Edition[Index2]); - unsigned int Index3; - for (Index3 = 0; Index3Generic().GlobalId == KaxChapterUID::ClassInfos.GlobalId) { - printf(" Chapter UID 0x%08x\n", uint32(*static_cast(aChapterAtom[Index3])) ); - } else if (aChapterAtom[Index3]->Generic().GlobalId == KaxChapterTimeStart::ClassInfos.GlobalId) { - printf(" Time Start %d\n", uint32(*static_cast(aChapterAtom[Index3])) ); - } else if (aChapterAtom[Index3]->Generic().GlobalId == KaxChapterTimeEnd::ClassInfos.GlobalId) { - printf(" Time End %d ns\n", uint32(*static_cast(aChapterAtom[Index3])) ); - } else if (aChapterAtom[Index3]->Generic().GlobalId == KaxChapterTrack::ClassInfos.GlobalId) { - printf(" Track list\n"); - } else if (aChapterAtom[Index3]->Generic().GlobalId == KaxChapterDisplay::ClassInfos.GlobalId) { - printf(" Display info\n"); - KaxChapterDisplay & aDisplay = *static_cast(aChapterAtom[Index3]); - unsigned int Index4; - for (Index4 = 0; Index4Generic().GlobalId == KaxChapterString::ClassInfos.GlobalId) { + } else { + printf(" - found %s\n", CuePos[Index2]->Generic().DebugName); + } + } + } else { + printf(" - found %s\n", CuePoint[Index1]->Generic().DebugName); + } + } + } else { + printf(" - found %s\n", (*CuesEntry)[Index0]->Generic().DebugName); + } + } + } + else if (EbmlId(*ElementLevel1) == KaxSeekHead::ClassInfos.GlobalId) { + printf("\n- Meta Seek found\n"); + MetaSeek = static_cast(ElementLevel1); + // read it in memory + MetaSeek->Read(aStream, KaxSeekHead::ClassInfos.Context, UpperElementLevel, ElementLevel2, bAllowDummy); + if (MetaSeek->CheckMandatory()) { + printf(" * All mandatory elements found *\n"); + } else { + printf(" * Some mandatory elements ar missing !!! *\n"); + } + unsigned int Index0; + for (Index0 = 0; Index0ListSize() ;Index0++) { + if ((*MetaSeek)[Index0]->Generic().GlobalId == KaxSeek::ClassInfos.GlobalId) { + printf(" Seek Point\n"); + KaxSeek & SeekPoint = *static_cast((*MetaSeek)[Index0]); + unsigned int Index1; + for (Index1 = 0; Index1Generic().GlobalId == KaxSeekID::ClassInfos.GlobalId) { + KaxSeekID * SeekID = static_cast(SeekPoint[Index1]); + printf(" Seek ID ", SeekID->GetBuffer()); + for (unsigned int i=0; iGetSize(); i++) { + printf("%02X", SeekID->GetBuffer()[i]); + } + printf("\n"); + } else if (SeekPoint[Index1]->Generic().GlobalId == KaxSeekPosition::ClassInfos.GlobalId) { + KaxSeekPosition * SeekPos = static_cast(SeekPoint[Index1]); + printf(" Seek position %d\n", uint32(*SeekPos)); + } + } + } + } + } else if (EbmlId(*ElementLevel1) == KaxChapters::ClassInfos.GlobalId) { + printf("\n- Chapters found\n"); + Chapters = static_cast(ElementLevel1); + // read it in memory + Chapters->Read(aStream, KaxChapters::ClassInfos.Context, UpperElementLevel, ElementLevel2, bAllowDummy); + if (Chapters->CheckMandatory()) { + printf(" * All mandatory elements found *\n"); + } else { + printf(" * Some mandatory elements ar missing !!! *\n"); + } + unsigned int Index0; + for (Index0 = 0; Index0ListSize() ;Index0++) { + if ((*Chapters)[Index0]->Generic().GlobalId == KaxEditionEntry::ClassInfos.GlobalId) { + printf(" Edition\n"); + KaxEditionEntry & Edition = *static_cast((*Chapters)[Index0]); + unsigned int Index2; + for (Index2 = 0; Index2Generic().GlobalId == KaxChapterAtom::ClassInfos.GlobalId) { + printf(" Chapter Atom\n"); + KaxChapterAtom & aChapterAtom = *static_cast(Edition[Index2]); + unsigned int Index3; + for (Index3 = 0; Index3Generic().GlobalId == KaxChapterUID::ClassInfos.GlobalId) { + printf(" Chapter UID 0x%08x\n", uint32(*static_cast(aChapterAtom[Index3])) ); + } else if (aChapterAtom[Index3]->Generic().GlobalId == KaxChapterTimeStart::ClassInfos.GlobalId) { + printf(" Time Start %d\n", uint32(*static_cast(aChapterAtom[Index3])) ); + } else if (aChapterAtom[Index3]->Generic().GlobalId == KaxChapterTimeEnd::ClassInfos.GlobalId) { + printf(" Time End %d ns\n", uint32(*static_cast(aChapterAtom[Index3])) ); + } else if (aChapterAtom[Index3]->Generic().GlobalId == KaxChapterTrack::ClassInfos.GlobalId) { + printf(" Track list\n"); + } else if (aChapterAtom[Index3]->Generic().GlobalId == KaxChapterDisplay::ClassInfos.GlobalId) { + printf(" Display info\n"); + KaxChapterDisplay & aDisplay = *static_cast(aChapterAtom[Index3]); + unsigned int Index4; + for (Index4 = 0; Index4Generic().GlobalId == KaxChapterString::ClassInfos.GlobalId) { #if !defined(__CYGWIN__) && !defined(__APPLE__) && !defined(__BEOS__) && !defined(__NetBSD__) - wprintf(L" Display \"%s\"\n", UTFstring(*static_cast(aDisplay[Index4])).c_str() ); + wprintf(L" Display \"%s\"\n", UTFstring(*static_cast(aDisplay[Index4])).c_str() ); #else - printf(" Display \"%s\"\n", UTFstring(*static_cast(aDisplay[Index4])).c_str() ); + printf(" Display \"%s\"\n", UTFstring(*static_cast(aDisplay[Index4])).c_str() ); #endif - } else if (aDisplay[Index4]->Generic().GlobalId == KaxChapterLanguage::ClassInfos.GlobalId) { - printf(" For language \"%s\"\n", std::string(*static_cast(aDisplay[Index4])).c_str() ); - } else if (aDisplay[Index4]->Generic().GlobalId == KaxChapterCountry::ClassInfos.GlobalId) { - printf(" For country \"%s\"\n", std::string(*static_cast(aDisplay[Index4])).c_str() ); - } else if (aDisplay[Index4]->IsDummy()) { - printf(" Dummy !!!\n"); - } - } - } - } - } - } - } - } - } else if (EbmlId(*ElementLevel1) == KaxTags::ClassInfos.GlobalId) { - printf("\n- Tags found\n"); - AllTags = static_cast(ElementLevel1); - // read it in memory - AllTags->Read(aStream, KaxTags::ClassInfos.Context, UpperElementLevel, ElementLevel2, bAllowDummy); - if (AllTags->CheckMandatory()) { - printf(" * All mandatory elements found *\n"); - } else { - printf(" * Some mandatory elements ar missing !!! *\n"); - } - unsigned int Index0; - for (Index0 = 0; Index0ListSize() ;Index0++) { - if ((*AllTags)[Index0]->Generic().GlobalId == KaxTag::ClassInfos.GlobalId) { - printf(" Tag\n"); - KaxTag & TagElt = *static_cast((*AllTags)[Index0]); - unsigned int Index1; - for (Index1 = 0; Index1Generic().GlobalId == KaxTagTargets::ClassInfos.GlobalId) { - printf(" Targets\n"); - KaxTagTargets & Targets = *static_cast(TagElt[Index1]); - unsigned int Index2; - for (Index2 = 0; Index2Generic().GlobalId == KaxTagTrackUID::ClassInfos.GlobalId) { + } else if (aDisplay[Index4]->Generic().GlobalId == KaxChapterLanguage::ClassInfos.GlobalId) { + printf(" For language \"%s\"\n", std::string(*static_cast(aDisplay[Index4])).c_str() ); + } else if (aDisplay[Index4]->Generic().GlobalId == KaxChapterCountry::ClassInfos.GlobalId) { + printf(" For country \"%s\"\n", std::string(*static_cast(aDisplay[Index4])).c_str() ); + } else if (aDisplay[Index4]->IsDummy()) { + printf(" Dummy !!!\n"); + } + } + } + } + } + } + } + } + } else if (EbmlId(*ElementLevel1) == KaxTags::ClassInfos.GlobalId) { + printf("\n- Tags found\n"); + AllTags = static_cast(ElementLevel1); + // read it in memory + AllTags->Read(aStream, KaxTags::ClassInfos.Context, UpperElementLevel, ElementLevel2, bAllowDummy); + if (AllTags->CheckMandatory()) { + printf(" * All mandatory elements found *\n"); + } else { + printf(" * Some mandatory elements ar missing !!! *\n"); + } + unsigned int Index0; + for (Index0 = 0; Index0ListSize() ;Index0++) { + if ((*AllTags)[Index0]->Generic().GlobalId == KaxTag::ClassInfos.GlobalId) { + printf(" Tag\n"); + KaxTag & TagElt = *static_cast((*AllTags)[Index0]); + unsigned int Index1; + for (Index1 = 0; Index1Generic().GlobalId == KaxTagTargets::ClassInfos.GlobalId) { + printf(" Targets\n"); + KaxTagTargets & Targets = *static_cast(TagElt[Index1]); + unsigned int Index2; + for (Index2 = 0; Index2Generic().GlobalId == KaxTagTrackUID::ClassInfos.GlobalId) { #ifndef TEST_REMOVE - printf(" Track UID\n"); + printf(" Track UID\n"); #else // TEST_REMOVE - printf(" Track UID (will be removed)\n"); - /*************** Test to remove an element ***************/ - Targets.Remove(Index2); - bRemoved = true; - bRemovedDone = false; - Index2--; - Index1--; + printf(" Track UID (will be removed)\n"); + /*************** Test to remove an element ***************/ + Targets.Remove(Index2); + bRemoved = true; + bRemovedDone = false; + Index2--; + Index1--; #endif // TEST_REMOVE - } else if (Targets[Index2]->Generic().GlobalId == KaxTagChapterUID::ClassInfos.GlobalId) { - printf(" Chapter UID\n"); + } else if (Targets[Index2]->Generic().GlobalId == KaxTagChapterUID::ClassInfos.GlobalId) { + printf(" Chapter UID\n"); #if 0 - } else if (Targets[Index2]->Generic().GlobalId == KaxTagMultiComment::ClassInfos.GlobalId) { - printf(" Comment\n"); - KaxTagMultiComment & Comment = *static_cast(Targets[Index2]); - unsigned int Index3; - for (Index3 = 0; Index3Generic().GlobalId == KaxTagMultiCommentName::ClassInfos.GlobalId) { - KaxTagMultiCommentName & CommentName = *static_cast(Comment[Index3]); - printf(" Comment Name \"%s\"\n", std::string(CommentName).c_str()); - } - } -// } else if (Targets[Index2]->Generic().GlobalId == DummyRawElement::ClassInfos.GlobalId) { + } else if (Targets[Index2]->Generic().GlobalId == KaxTagMultiComment::ClassInfos.GlobalId) { + printf(" Comment\n"); + KaxTagMultiComment & Comment = *static_cast(Targets[Index2]); + unsigned int Index3; + for (Index3 = 0; Index3Generic().GlobalId == KaxTagMultiCommentName::ClassInfos.GlobalId) { + KaxTagMultiCommentName & CommentName = *static_cast(Comment[Index3]); + printf(" Comment Name \"%s\"\n", std::string(CommentName).c_str()); + } + } +// } else if (Targets[Index2]->Generic().GlobalId == DummyRawElement::ClassInfos.GlobalId) { #endif - } - } + } + } #ifdef TEST_REMOVE - if (bRemoved) { - printf(" -- Again After Deletion --\n"); - bRemoved = false; - } else if (bRemovedDone) { - printf(" -- Done --\n"); - } + if (bRemoved) { + printf(" -- Again After Deletion --\n"); + bRemoved = false; + } else if (bRemovedDone) { + printf(" -- Done --\n"); + } #endif // TEST_REMOVE #if 0 - } else if (TagElt[Index1]->Generic().GlobalId == KaxTagGeneral::ClassInfos.GlobalId) { - printf(" General\n"); - KaxTagGeneral & General = *static_cast(TagElt[Index1]); - unsigned int Index2; - for (Index2 = 0; Index2Generic().GlobalId == KaxTagSubject::ClassInfos.GlobalId) { - printf(" Subject\n"); - } else if (General[Index2]->Generic().GlobalId == KaxTagBibliography::ClassInfos.GlobalId) { - printf(" Bibliography\n"); - } else if (General[Index2]->Generic().GlobalId == KaxTagLanguage::ClassInfos.GlobalId) { - printf(" Language\n"); - } - } - } else if (TagElt[Index1]->Generic().GlobalId == KaxTagMultiCommercial::ClassInfos.GlobalId) { - printf(" MultiCommercial\n"); - KaxTagMultiCommercial & Commercials = *static_cast(TagElt[Index1]); - unsigned int Index2; - for (Index2 = 0; Index2Generic().GlobalId == KaxTagCommercial::ClassInfos.GlobalId) { - printf(" Commercial\n"); - KaxTagCommercial & Commercial = *static_cast(Commercials[Index2]); - unsigned int Index3; - for (Index3 = 0; Index3Generic().GlobalId == KaxTagMultiCommercialType::ClassInfos.GlobalId) { - printf(" Type\n"); - } else if (Commercial[Index3]->Generic().GlobalId == KaxTagMultiPrice::ClassInfos.GlobalId) { - printf(" Prices\n"); - KaxTagMultiPrice & Prices = *static_cast(Commercial[Index3]); - unsigned int Index4; - for (Index4 = 0; Index4Generic().GlobalId == KaxTagMultiPriceCurrency::ClassInfos.GlobalId) { - printf(" Currency\n"); - } else if (Prices[Index4]->Generic().GlobalId == KaxTagMultiPriceAmount::ClassInfos.GlobalId) { - printf(" Amount\n"); - } - } - } - } - } - } - } else if (TagElt[Index1]->Generic().GlobalId == KaxTagMultiDate::ClassInfos.GlobalId) { - printf(" MultiDate\n"); - } else if (TagElt[Index1]->Generic().GlobalId == KaxTagMultiComment::ClassInfos.GlobalId) { - printf(" Comment\n"); - KaxTagMultiComment & Comment = *static_cast(TagElt[Index1]); - unsigned int Index2; - for (Index2 = 0; Index2Generic().GlobalId == KaxTagMultiCommentName::ClassInfos.GlobalId) { - KaxTagMultiCommentName & CommentName = *static_cast(Comment[Index2]); - printf(" Comment Name \"%s\"\n", std::string(CommentName).c_str()); - } - } + } else if (TagElt[Index1]->Generic().GlobalId == KaxTagGeneral::ClassInfos.GlobalId) { + printf(" General\n"); + KaxTagGeneral & General = *static_cast(TagElt[Index1]); + unsigned int Index2; + for (Index2 = 0; Index2Generic().GlobalId == KaxTagSubject::ClassInfos.GlobalId) { + printf(" Subject\n"); + } else if (General[Index2]->Generic().GlobalId == KaxTagBibliography::ClassInfos.GlobalId) { + printf(" Bibliography\n"); + } else if (General[Index2]->Generic().GlobalId == KaxTagLanguage::ClassInfos.GlobalId) { + printf(" Language\n"); + } + } + } else if (TagElt[Index1]->Generic().GlobalId == KaxTagMultiCommercial::ClassInfos.GlobalId) { + printf(" MultiCommercial\n"); + KaxTagMultiCommercial & Commercials = *static_cast(TagElt[Index1]); + unsigned int Index2; + for (Index2 = 0; Index2Generic().GlobalId == KaxTagCommercial::ClassInfos.GlobalId) { + printf(" Commercial\n"); + KaxTagCommercial & Commercial = *static_cast(Commercials[Index2]); + unsigned int Index3; + for (Index3 = 0; Index3Generic().GlobalId == KaxTagMultiCommercialType::ClassInfos.GlobalId) { + printf(" Type\n"); + } else if (Commercial[Index3]->Generic().GlobalId == KaxTagMultiPrice::ClassInfos.GlobalId) { + printf(" Prices\n"); + KaxTagMultiPrice & Prices = *static_cast(Commercial[Index3]); + unsigned int Index4; + for (Index4 = 0; Index4Generic().GlobalId == KaxTagMultiPriceCurrency::ClassInfos.GlobalId) { + printf(" Currency\n"); + } else if (Prices[Index4]->Generic().GlobalId == KaxTagMultiPriceAmount::ClassInfos.GlobalId) { + printf(" Amount\n"); + } + } + } + } + } + } + } else if (TagElt[Index1]->Generic().GlobalId == KaxTagMultiDate::ClassInfos.GlobalId) { + printf(" MultiDate\n"); + } else if (TagElt[Index1]->Generic().GlobalId == KaxTagMultiComment::ClassInfos.GlobalId) { + printf(" Comment\n"); + KaxTagMultiComment & Comment = *static_cast(TagElt[Index1]); + unsigned int Index2; + for (Index2 = 0; Index2Generic().GlobalId == KaxTagMultiCommentName::ClassInfos.GlobalId) { + KaxTagMultiCommentName & CommentName = *static_cast(Comment[Index2]); + printf(" Comment Name \"%s\"\n", std::string(CommentName).c_str()); + } + } #endif - } - } - } - } - if (AllTags->HasChecksum()) { - if (AllTags->VerifyChecksum()) { - printf(" ++ CheckSum verification succeeded ++\n"); - } else { - printf(" ++ CheckSum verification FAILED !!! ++\n"); - } - } - } + } + } + } + } + if (AllTags->HasChecksum()) { + if (AllTags->VerifyChecksum()) { + printf(" ++ CheckSum verification succeeded ++\n"); + } else { + printf(" ++ CheckSum verification FAILED !!! ++\n"); + } + } + } - if (UpperElementLevel > 0) { - UpperElementLevel--; - delete ElementLevel1; - ElementLevel1 = ElementLevel2; - if (UpperElementLevel > 0) - break; - } else { - ElementLevel1->SkipData(aStream, ElementLevel1->Generic().Context); - delete ElementLevel1; - - ElementLevel1 = aStream.FindNextElement(ElementLevel0->Generic().Context, UpperElementLevel, 0, bAllowDummy); - } - } - } - } + if (UpperElementLevel > 0) { + UpperElementLevel--; + delete ElementLevel1; + ElementLevel1 = ElementLevel2; + if (UpperElementLevel > 0) + break; + } else { + ElementLevel1->SkipData(aStream, ElementLevel1->Generic().Context); + delete ElementLevel1; + + ElementLevel1 = aStream.FindNextElement(ElementLevel0->Generic().Context, UpperElementLevel, 0, bAllowDummy); + } + } + } + } #ifdef OLD - uint8 TrackNumber = MuxedFile.GetTrackNumber(); + uint8 TrackNumber = MuxedFile.GetTrackNumber(); - TrackInfo *Tracks = new TrackInfo[TrackNumber]; - TrackInfoAudio aAudioTrack; - TrackInfoVideo aVideoTrack; + TrackInfo *Tracks = new TrackInfo[TrackNumber]; + TrackInfoAudio aAudioTrack; + TrackInfoVideo aVideoTrack; - Track * track1 = MuxedFile.GetTrack(1); - Track * track2 = MuxedFile.GetTrack(2); - Track * track3 = MuxedFile.GetTrack(3); // should be 0 - // get information about the 1st track + Track * track1 = MuxedFile.GetTrack(1); + Track * track2 = MuxedFile.GetTrack(2); + Track * track3 = MuxedFile.GetTrack(3); // should be 0 + // get information about the 1st track - MuxedFile.Track_GetInfo(track1, Tracks[0]); - displayTrackInfo(Tracks[0]); + MuxedFile.Track_GetInfo(track1, Tracks[0]); + displayTrackInfo(Tracks[0]); - if (Tracks[0].TrackType == track_audio) { - MuxedFile.Track_GetInfo_Audio(track1, aAudioTrack); - displayAudioInfo(aAudioTrack); - } - else - cout << "the expected audio track is not an audio one :(" << endl; + if (Tracks[0].TrackType == track_audio) { + MuxedFile.Track_GetInfo_Audio(track1, aAudioTrack); + displayAudioInfo(aAudioTrack); + } + else + cout << "the expected audio track is not an audio one :(" << endl; - MuxedFile.Track_GetInfo(track3, Tracks[2]); - displayTrackInfo(Tracks[2]); + MuxedFile.Track_GetInfo(track3, Tracks[2]); + displayTrackInfo(Tracks[2]); - if (Tracks[2].TrackType == track_video) { - MuxedFile.Track_GetInfo_Video(track3, aVideoTrack); - displayVideoInfo(aVideoTrack); - } - else - cout << "the expected video track is not an video one :(" << endl; + if (Tracks[2].TrackType == track_video) { + MuxedFile.Track_GetInfo_Video(track3, aVideoTrack); + displayVideoInfo(aVideoTrack); + } + else + cout << "the expected video track is not an video one :(" << endl; - // let's read only track1 (audio) - MuxedFile.SelectReadingTrack(track1); - MuxedFile.SelectReadingTrack(track2); - MuxedFile.SelectReadingTrack(track1,false); - MuxedFile.SelectReadingTrack(track1); - MuxedFile.SelectReadingTrack(track2,false); - MuxedFile.SelectReadingTrack(track2); - MuxedFile.SelectReadingTrack(track3); + // let's read only track1 (audio) + MuxedFile.SelectReadingTrack(track1); + MuxedFile.SelectReadingTrack(track2); + MuxedFile.SelectReadingTrack(track1,false); + MuxedFile.SelectReadingTrack(track1); + MuxedFile.SelectReadingTrack(track2,false); + MuxedFile.SelectReadingTrack(track2); + MuxedFile.SelectReadingTrack(track3); - // read the frames from the selected tracks and put them in an output file - StdIOCallback Output_file1("out-binr.bin", MODE_CREATE); - StdIOCallback Output_file2("out-text.bin", MODE_CREATE); - StdIOCallback Output_file3("out-vide.bin", MODE_CREATE); + // read the frames from the selected tracks and put them in an output file + StdIOCallback Output_file1("out-binr.bin", MODE_CREATE); + StdIOCallback Output_file2("out-text.bin", MODE_CREATE); + StdIOCallback Output_file3("out-vide.bin", MODE_CREATE); - Track * TrackRead; - uint32 timecode; // not used yet - binary *aFrame; - uint32 aFrameSize; - while (MuxedFile.ReadFrame(TrackRead, timecode, aFrame, aFrameSize)) - { - if (TrackRead == track1) - { - Output_file1.write(aFrame, aFrameSize); - } - else if (TrackRead == track2) - { - Output_file2.write(aFrame, aFrameSize); - } - else if (TrackRead == track3) - { - Output_file3.write(aFrame, aFrameSize); - } - else cout << "received a frame from an unwanted track" << endl; - } + Track * TrackRead; + uint32 timecode; // not used yet + binary *aFrame; + uint32 aFrameSize; + while (MuxedFile.ReadFrame(TrackRead, timecode, aFrame, aFrameSize)) + { + if (TrackRead == track1) + { + Output_file1.write(aFrame, aFrameSize); + } + else if (TrackRead == track2) + { + Output_file2.write(aFrame, aFrameSize); + } + else if (TrackRead == track3) + { + Output_file3.write(aFrame, aFrameSize); + } + else cout << "received a frame from an unwanted track" << endl; + } #endif // OLD } catch (exception & Ex) { - cout << Ex.what() << endl; - return -1; + cout << Ex.what() << endl; + return -1; } return 0; diff --git a/test/tags/test9.cpp b/test/tags/test9.cpp index 1c67aa9..4c228b9 100644 --- a/test/tags/test9.cpp +++ b/test/tags/test9.cpp @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -71,7 +71,7 @@ int main() { EbmlHead head; KaxSegment segment; StdIOCallback out("test.mkv", MODE_CREATE); - + EDocType &doc_type = GetChild(head); *static_cast(&doc_type) = "matroska"; EDocTypeVersion &doc_type_ver = GetChild(head); @@ -98,7 +98,7 @@ int main() { 1234; #if 0 - // comment of the Targets + // comment of the Targets KaxTagMultiComment &mcomB = GetChild(targets); *(static_cast (&GetChild(mcomB))) = @@ -134,7 +134,7 @@ int main() { (&GetChild(general))) = L"ArchivalLocation"; KaxTagKeywords &keywords1 = GetChild(general); - *(static_cast(&keywords1)) = + *(static_cast(&keywords1)) = L"Keywords, 1"; *(static_cast (&GetNextChild(general, keywords1))) = @@ -144,7 +144,7 @@ int main() { L"Mood"; KaxTagRecordLocation &recordLocation1 = GetChild(general); - *(static_cast(&recordLocation1)) = + *(static_cast(&recordLocation1)) = "RecordLocation, 1"; *(static_cast (&GetNextChild(general, recordLocation1))) = @@ -248,7 +248,7 @@ int main() { *(static_cast (&GetChild(mprice))) = 42.0; - KaxTagMultiPricePriceDate &pdate = + KaxTagMultiPricePriceDate &pdate = GetChild(mprice); pdate.SetEpochDate(time(NULL)); @@ -257,10 +257,10 @@ int main() { *(static_cast (&GetChild(date))) = 4; - KaxTagMultiDateDateBegin &dbeg = + KaxTagMultiDateDateBegin &dbeg = GetChild(date); dbeg.SetEpochDate(time(NULL)); - KaxTagMultiDateDateEnd &dend = + KaxTagMultiDateDateEnd &dend = GetChild(date); dend.SetEpochDate(time(NULL)); @@ -355,7 +355,7 @@ int main() { L"SIMPLE_TAG_NAME_LEVEL3"; *(static_cast(&GetChild(stag_l3))) = L"SIMPLE_TAG_STRING_LEVEL3"; - + tags.Render(out); } catch (...) { diff --git a/test/utf8/test5.cpp b/test/utf8/test5.cpp index 127282e..bab137b 100644 --- a/test/utf8/test5.cpp +++ b/test/utf8/test5.cpp @@ -11,12 +11,12 @@ ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -45,10 +45,10 @@ using namespace LIBMATROSKA_NAMESPACE; using namespace std; /*! - \see http://www.unicode.org/charts/ - \see http://www-106.ibm.com/developerworks/linux/library/l-linuni.html - \see http://www.cl.cam.ac.uk/~mgk25/unicode.html#libs - \see ftp://ftp.ilog.fr/pub/Users/haible/utf8/Unicode-HOWTO-6.html#ss6.1 + \see http://www.unicode.org/charts/ + \see http://www-106.ibm.com/developerworks/linux/library/l-linuni.html + \see http://www.cl.cam.ac.uk/~mgk25/unicode.html#libs + \see ftp://ftp.ilog.fr/pub/Users/haible/utf8/Unicode-HOWTO-6.html#ss6.1 */ int main(void) { @@ -69,7 +69,7 @@ int main(void) testUTF8_1 = test1.c_str(); TruncString8 testUTF8_2(10); - testUTF8_2 = test2.c_str(); + testUTF8_2 = test2.c_str(); // in UTF8 0xE8=1110-1000 should become 110.00110-10.001000=0xC6 0x88 FileName test01(64);