Repositing Cues before Clusters
A whole new approach to repositioning Cues before Clusters. This patchset adds a new function CopyAndMoveCuesBeforeClusters to the Segment class. This function should be called after Segment::Finalize() to obtain a copy of the same output file with Cues positioned before the Clusters. Removing everything else that was added to accomplish the same in the previous few commits. Also, adding std:: qualifier to one of the variables in sample_muxer_metadata which was missed accidentally in the previous commit. Change-Id: I2810d06a6251325add2f5e54d32d1da6e2fe143f
This commit is contained in:
		
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| @@ -2,7 +2,7 @@ CXX       := g++ | |||||||
| CXXFLAGS  := -W -Wall -g | CXXFLAGS  := -W -Wall -g | ||||||
| LIBWEBMA  := libwebm.a | LIBWEBMA  := libwebm.a | ||||||
| LIBWEBMSO := libwebm.so | LIBWEBMSO := libwebm.so | ||||||
| WEBMOBJS  := mkvparser.o mkvreader.o mkvmuxer.o mkvmuxerutil.o mkvwriter.o mkvwriteeofreader.o | WEBMOBJS  := mkvparser.o mkvreader.o mkvmuxer.o mkvmuxerutil.o mkvwriter.o | ||||||
| OBJSA     := $(WEBMOBJS:.o=_a.o) | OBJSA     := $(WEBMOBJS:.o=_a.o) | ||||||
| OBJSSO    := $(WEBMOBJS:.o=_so.o) | OBJSSO    := $(WEBMOBJS:.o=_so.o) | ||||||
| OBJECTS1  := sample.o | OBJECTS1  := sample.o | ||||||
|   | |||||||
							
								
								
									
										61
									
								
								mkvmuxer.cpp
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								mkvmuxer.cpp
									
									
									
									
									
								
							| @@ -7,7 +7,6 @@ | |||||||
| // be found in the AUTHORS file in the root of the source tree. | // be found in the AUTHORS file in the root of the source tree. | ||||||
|  |  | ||||||
| #include "mkvmuxer.hpp" | #include "mkvmuxer.hpp" | ||||||
| #include "mkvwriteeofreader.hpp" |  | ||||||
|  |  | ||||||
| #include <cstdio> | #include <cstdio> | ||||||
| #include <cstdlib> | #include <cstdlib> | ||||||
| @@ -16,6 +15,7 @@ | |||||||
| #include <new> | #include <new> | ||||||
|  |  | ||||||
| #include "mkvmuxerutil.hpp" | #include "mkvmuxerutil.hpp" | ||||||
|  | #include "mkvparser.hpp" | ||||||
| #include "mkvwriter.hpp" | #include "mkvwriter.hpp" | ||||||
| #include "webmids.hpp" | #include "webmids.hpp" | ||||||
|  |  | ||||||
| @@ -91,7 +91,7 @@ bool WriteEbmlHeader(IMkvWriter* writer) { | |||||||
|   return true; |   return true; | ||||||
| } | } | ||||||
|  |  | ||||||
| bool ChunkedCopy(mkvmuxer::IMkvWriteEOFReader* source, | bool ChunkedCopy(mkvparser::IMkvReader* source, | ||||||
|                  mkvmuxer::IMkvWriter* dst, |                  mkvmuxer::IMkvWriter* dst, | ||||||
|                  mkvmuxer::int64 start, int64 size) { |                  mkvmuxer::int64 start, int64 size) { | ||||||
|   // TODO(vigneshv): Check if this is a reasonable value. |   // TODO(vigneshv): Check if this is a reasonable value. | ||||||
| @@ -2078,25 +2078,36 @@ bool Segment::Init(IMkvWriter* ptr_writer) { | |||||||
|   if (!ptr_writer) { |   if (!ptr_writer) { | ||||||
|     return false; |     return false; | ||||||
|   } |   } | ||||||
|   writer_ = ptr_writer; |   writer_cluster_ = ptr_writer; | ||||||
|   if (cues_position_ == kAfterClusters) { |   writer_cues_ = ptr_writer; | ||||||
|     writer_cluster_ = writer_; |   writer_header_ = ptr_writer; | ||||||
|     writer_cues_ = writer_; |  | ||||||
|     writer_header_ = writer_; |  | ||||||
|   } else { |  | ||||||
|     writer_cluster_ = writer_temp_; |  | ||||||
|     writer_cues_ = writer_temp_; |  | ||||||
|     writer_header_ = writer_temp_; |  | ||||||
|   } |  | ||||||
|   return segment_info_.Init(); |   return segment_info_.Init(); | ||||||
| } | } | ||||||
|  |  | ||||||
| bool Segment::WriteCuesBeforeClusters(IMkvWriteEOFReader* ptr_writer) { | bool Segment::CopyAndMoveCuesBeforeClusters(mkvparser::IMkvReader* reader, | ||||||
|   if (!ptr_writer || writer_cluster_ || writer_cues_ || writer_header_) { |                                             IMkvWriter* writer) { | ||||||
|  |   const int64 cluster_offset = cluster_list_[0]->size_position() - | ||||||
|  |                                GetUIntSize(kMkvCluster); | ||||||
|  |  | ||||||
|  |   // Copy the headers. | ||||||
|  |   if (!ChunkedCopy(reader, writer, 0, cluster_offset)) | ||||||
|  |     return false; | ||||||
|  |  | ||||||
|  |   // Recompute cue positions and seek entries. | ||||||
|  |   MoveCuesBeforeClusters(); | ||||||
|  |  | ||||||
|  |   // Write cues and seek entries. | ||||||
|  |   // TODO(vigneshv): As of now, it's safe to call seek_head_.Finalize() for the | ||||||
|  |   // second time with a different writer object. But the name Finalize() doesn't | ||||||
|  |   // indicate something we want to call more than once. So consider renaming it | ||||||
|  |   // to write() or some such. | ||||||
|  |   if (!cues_.Write(writer) || !seek_head_.Finalize(writer)) | ||||||
|  |     return false; | ||||||
|  |  | ||||||
|  |   // Copy the Clusters. | ||||||
|  |   if (!ChunkedCopy(reader, writer, cluster_offset, | ||||||
|  |                    cluster_end_offset_ - cluster_offset)) | ||||||
|     return false; |     return false; | ||||||
|   } |  | ||||||
|   writer_temp_ = ptr_writer; |  | ||||||
|   cues_position_ = kBeforeClusters; |  | ||||||
|   return true; |   return true; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -2142,16 +2153,7 @@ bool Segment::Finalize() { | |||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     const int64 current_offset = writer_cluster_->Position(); |     cluster_end_offset_ = writer_cluster_->Position(); | ||||||
|     const int64 cluster_offset = cluster_list_[0]->size_position() - |  | ||||||
|                                  GetUIntSize(kMkvCluster); |  | ||||||
|     if (cues_position_ == kBeforeClusters) { |  | ||||||
|       writer_cluster_ = writer_; |  | ||||||
|       writer_cues_ = writer_; |  | ||||||
|       writer_header_ = writer_; |  | ||||||
|       ChunkedCopy(writer_temp_, writer_cluster_, 0, cluster_offset); |  | ||||||
|       MoveCuesBeforeClusters(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // Write the seek headers and cues |     // Write the seek headers and cues | ||||||
|     if (output_cues_) |     if (output_cues_) | ||||||
| @@ -2161,11 +2163,6 @@ bool Segment::Finalize() { | |||||||
|     if (!seek_head_.Finalize(writer_header_)) |     if (!seek_head_.Finalize(writer_header_)) | ||||||
|       return false; |       return false; | ||||||
|  |  | ||||||
|     if (cues_position_ == kBeforeClusters) { |  | ||||||
|       ChunkedCopy(writer_temp_, writer_cluster_, |  | ||||||
|                   cluster_offset, current_offset - cluster_offset); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if (writer_header_->Seekable()) { |     if (writer_header_->Seekable()) { | ||||||
|       if (size_position_ == -1) |       if (size_position_ == -1) | ||||||
|         return false; |         return false; | ||||||
|   | |||||||
							
								
								
									
										43
									
								
								mkvmuxer.hpp
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								mkvmuxer.hpp
									
									
									
									
									
								
							| @@ -14,6 +14,10 @@ | |||||||
| // For a description of the WebM elements see | // For a description of the WebM elements see | ||||||
| // http://www.webmproject.org/code/specs/container/. | // http://www.webmproject.org/code/specs/container/. | ||||||
|  |  | ||||||
|  | namespace mkvparser { | ||||||
|  |   class IMkvReader; | ||||||
|  | }  // end namespace | ||||||
|  |  | ||||||
| namespace mkvmuxer { | namespace mkvmuxer { | ||||||
|  |  | ||||||
| class MkvWriter; | class MkvWriter; | ||||||
| @@ -51,23 +55,12 @@ class IMkvWriter { | |||||||
|   LIBWEBM_DISALLOW_COPY_AND_ASSIGN(IMkvWriter); |   LIBWEBM_DISALLOW_COPY_AND_ASSIGN(IMkvWriter); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| // Classes implementing this interface should adhere to the following rule: |  | ||||||
| // - There can be any number of calls to Write(). |  | ||||||
| // - Once the first call to Read() occurs, no more Write()'s are allowed. |  | ||||||
| // - Write() should return error if there has been a call to Read() before. |  | ||||||
| class IMkvWriteEOFReader : public IMkvWriter { |  | ||||||
|  public: |  | ||||||
|   // Reads data of size |length| starting from the offset of |position| into |  | ||||||
|   // |buffer|. |  | ||||||
|   virtual int Read(int64 position, int32 length, uint8* buffer) = 0; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| // Writes out the EBML header for a WebM file. This function must be called | // Writes out the EBML header for a WebM file. This function must be called | ||||||
| // before any other libwebm writing functions are called. | // before any other libwebm writing functions are called. | ||||||
| bool WriteEbmlHeader(IMkvWriter* writer); | bool WriteEbmlHeader(IMkvWriter* writer); | ||||||
|  |  | ||||||
| // Copies in Chunk from source to destination between the given byte positions | // Copies in Chunk from source to destination between the given byte positions | ||||||
| bool ChunkedCopy(IMkvWriteEOFReader* source, IMkvWriter* dst, | bool ChunkedCopy(mkvparser::IMkvReader* source, IMkvWriter* dst, | ||||||
|                  int64 start, int64 size); |                  int64 start, int64 size); | ||||||
|  |  | ||||||
| /////////////////////////////////////////////////////////////// | /////////////////////////////////////////////////////////////// | ||||||
| @@ -946,12 +939,6 @@ class Segment { | |||||||
|   // |ptr_writer| is NULL. |   // |ptr_writer| is NULL. | ||||||
|   bool Init(IMkvWriter* ptr_writer); |   bool Init(IMkvWriter* ptr_writer); | ||||||
|  |  | ||||||
|   // This function must be called before Init() if Cues are to be written before |  | ||||||
|   // the Clusters. Input parameter is a IMkvWriteEOFReader object, which is to |  | ||||||
|   // be used as the temporary storage, while moving the Cues before the |  | ||||||
|   // Clusters. |  | ||||||
|   bool WriteCuesBeforeClusters(IMkvWriteEOFReader* ptr_writer); |  | ||||||
|  |  | ||||||
|   // Adds a generic track to the segment.  Returns the newly-allocated |   // Adds a generic track to the segment.  Returns the newly-allocated | ||||||
|   // track object (which is owned by the segment) on success, NULL on |   // track object (which is owned by the segment) on success, NULL on | ||||||
|   // error. |number| is the number to use for the track.  |number| |   // error. |number| is the number to use for the track.  |number| | ||||||
| @@ -1025,6 +1012,19 @@ class Segment { | |||||||
|   // the track number. |   // the track number. | ||||||
|   uint64 AddVideoTrack(int32 width, int32 height, int32 number); |   uint64 AddVideoTrack(int32 width, int32 height, int32 number); | ||||||
|  |  | ||||||
|  |   // This function must be called after Finalize() if you need a copy of the | ||||||
|  |   // output with Cues written before the Clusters. | ||||||
|  |   // Input parameters: | ||||||
|  |   // reader - an IMkvReader object created with the same underlying file of the | ||||||
|  |   //          current writer object. Make sure to close the existing writer | ||||||
|  |   //          object before creating this so that all the data is properly | ||||||
|  |   //          flushed and available for reading. | ||||||
|  |   // writer - an IMkvWriter object pointing to a *different* file than the one | ||||||
|  |   //          pointed by the current writer object. This file will contain the | ||||||
|  |   //          Cues element before the Clusters. | ||||||
|  |   bool CopyAndMoveCuesBeforeClusters(mkvparser::IMkvReader* reader, | ||||||
|  |                                      IMkvWriter* writer); | ||||||
|  |  | ||||||
|   // Sets which track to use for the Cues element. Must have added the track |   // Sets which track to use for the Cues element. Must have added the track | ||||||
|   // before calling this function. Returns true on success. |track_number| is |   // before calling this function. Returns true on success. |track_number| is | ||||||
|   // returned by the Add track functions. |   // returned by the Add track functions. | ||||||
| @@ -1181,6 +1181,9 @@ class Segment { | |||||||
|   // Base filename for the chunked files. |   // Base filename for the chunked files. | ||||||
|   char* chunking_base_name_; |   char* chunking_base_name_; | ||||||
|  |  | ||||||
|  |   // File position offset where the Clusters end. | ||||||
|  |   int64 cluster_end_offset_; | ||||||
|  |  | ||||||
|   // List of clusters. |   // List of clusters. | ||||||
|   Cluster** cluster_list_; |   Cluster** cluster_list_; | ||||||
|  |  | ||||||
| @@ -1252,10 +1255,6 @@ class Segment { | |||||||
|   IMkvWriter* writer_cues_; |   IMkvWriter* writer_cues_; | ||||||
|   IMkvWriter* writer_header_; |   IMkvWriter* writer_header_; | ||||||
|  |  | ||||||
|   // Pointer to actual writer object and temp writer object |  | ||||||
|   IMkvWriter* writer_; |  | ||||||
|   IMkvWriteEOFReader* writer_temp_; |  | ||||||
|  |  | ||||||
|   LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Segment); |   LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Segment); | ||||||
| }; | }; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,146 +0,0 @@ | |||||||
| // Copyright (c) 2013 The WebM project authors. All Rights Reserved. |  | ||||||
| // |  | ||||||
| // Use of this source code is governed by a BSD-style license |  | ||||||
| // that can be found in the LICENSE file in the root of the source |  | ||||||
| // tree. An additional intellectual property rights grant can be found |  | ||||||
| // in the file PATENTS.  All contributing project authors may |  | ||||||
| // be found in the AUTHORS file in the root of the source tree. |  | ||||||
|  |  | ||||||
| #include "mkvwriteeofreader.hpp" |  | ||||||
|  |  | ||||||
| #ifdef _MSC_VER |  | ||||||
| #include <share.h>  // for _SH_DENYWR |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #include <cstdio> |  | ||||||
| #include <new> |  | ||||||
|  |  | ||||||
| namespace mkvmuxer { |  | ||||||
|  |  | ||||||
| MkvWriteEOFReader::MkvWriteEOFReader() : file_(NULL), |  | ||||||
|                                          writes_allowed_(true) { |  | ||||||
| } |  | ||||||
|  |  | ||||||
| MkvWriteEOFReader::~MkvWriteEOFReader() { |  | ||||||
|   Close(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| int32 MkvWriteEOFReader::Write(const void* buffer, uint32 length) { |  | ||||||
|   if (file_ == NULL || !writes_allowed_) |  | ||||||
|     return -1; |  | ||||||
|  |  | ||||||
|   if (length == 0) |  | ||||||
|     return 0; |  | ||||||
|  |  | ||||||
|   if (buffer == NULL) |  | ||||||
|     return -1; |  | ||||||
|  |  | ||||||
|   const size_t bytes_written = fwrite(buffer, 1, length, file_); |  | ||||||
|  |  | ||||||
|   return (bytes_written == length) ? 0 : -1; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool MkvWriteEOFReader::Open(const char* filename, bool create_temp_file) { |  | ||||||
|   if (filename == NULL && !create_temp_file) |  | ||||||
|     return false; |  | ||||||
|  |  | ||||||
|   if (file_ != NULL) |  | ||||||
|     return false; |  | ||||||
|  |  | ||||||
| #ifdef _MSC_VER |  | ||||||
|   file_ = create_temp_file ? tmpfile() : _fsopen(filename, "wb+", _SH_DENYWR); |  | ||||||
| #else |  | ||||||
|   file_ = create_temp_file ? tmpfile() : fopen(filename, "wb+"); |  | ||||||
| #endif |  | ||||||
|   if (file_ == NULL) |  | ||||||
|     return false; |  | ||||||
|   return true; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void MkvWriteEOFReader::Close() { |  | ||||||
|   if (file_ != NULL) { |  | ||||||
|     fclose(file_); |  | ||||||
|     file_ = NULL; |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| int64 MkvWriteEOFReader::Position() const { |  | ||||||
|   if (file_ == NULL) |  | ||||||
|     return 0; |  | ||||||
|  |  | ||||||
| #ifdef _MSC_VER |  | ||||||
|     return _ftelli64(file_); |  | ||||||
| #else |  | ||||||
|     return ftell(file_); |  | ||||||
| #endif |  | ||||||
| } |  | ||||||
|  |  | ||||||
| int32 MkvWriteEOFReader::Position(int64 position) { |  | ||||||
|   if (file_ == NULL) |  | ||||||
|     return -1; |  | ||||||
|  |  | ||||||
| #ifdef _MSC_VER |  | ||||||
|     return _fseeki64(file_, position, SEEK_SET); |  | ||||||
| #else |  | ||||||
|     return fseek(file_, position, SEEK_SET); |  | ||||||
| #endif |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool MkvWriteEOFReader::Seekable() const { |  | ||||||
|   return true; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void MkvWriteEOFReader::ElementStartNotify(uint64, int64) { |  | ||||||
| } |  | ||||||
|  |  | ||||||
| int MkvWriteEOFReader::Read(int64 offset, int32 len, uint8* buffer) { |  | ||||||
|   if (file_ == NULL) |  | ||||||
|     return -1; |  | ||||||
|  |  | ||||||
|   if (offset < 0) |  | ||||||
|     return -1; |  | ||||||
|  |  | ||||||
|   if (len < 0) |  | ||||||
|     return -1; |  | ||||||
|  |  | ||||||
|   if (writes_allowed_) |  | ||||||
|     writes_allowed_ = false; |  | ||||||
|  |  | ||||||
|   if (len == 0) |  | ||||||
|     return 0; |  | ||||||
|  |  | ||||||
|   fflush(file_); |  | ||||||
|  |  | ||||||
| #ifdef _MSC_VER |  | ||||||
|   int64 pos = _ftelli64(file_); |  | ||||||
| #else |  | ||||||
|   int64 pos = ftell(file_); |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifdef WIN32 |  | ||||||
|   int status = _fseeki64(file_, offset, SEEK_SET); |  | ||||||
|  |  | ||||||
|   if (status) |  | ||||||
|     return -1;  //error |  | ||||||
| #else |  | ||||||
|   fseek(file_, offset, SEEK_SET); |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|   const size_t size = fread(buffer, 1, len, file_); |  | ||||||
|  |  | ||||||
| #ifdef WIN32 |  | ||||||
|   status = _fseeki64(file_, pos, SEEK_SET); |  | ||||||
|  |  | ||||||
|   if (status) |  | ||||||
|     return -1;  //error |  | ||||||
| #else |  | ||||||
|   fseek(file_, pos, SEEK_SET); |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|   if (size < static_cast<size_t>(len)) |  | ||||||
|     return -1;  //error |  | ||||||
|  |  | ||||||
|   return 0;  //success |  | ||||||
| } |  | ||||||
|  |  | ||||||
| }  // namespace mkvmuxer |  | ||||||
| @@ -1,56 +0,0 @@ | |||||||
| // Copyright (c) 2013 The WebM project authors. All Rights Reserved. |  | ||||||
| // |  | ||||||
| // Use of this source code is governed by a BSD-style license |  | ||||||
| // that can be found in the LICENSE file in the root of the source |  | ||||||
| // tree. An additional intellectual property rights grant can be found |  | ||||||
| // in the file PATENTS.  All contributing project authors may |  | ||||||
| // be found in the AUTHORS file in the root of the source tree. |  | ||||||
|  |  | ||||||
| #ifndef MKVWRITEEOFREADER_HPP |  | ||||||
| #define MKVWRITEEOFREADER_HPP |  | ||||||
|  |  | ||||||
| #include <stdio.h> |  | ||||||
|  |  | ||||||
| #include "mkvmuxer.hpp" |  | ||||||
| #include "mkvmuxertypes.hpp" |  | ||||||
|  |  | ||||||
| namespace mkvmuxer { |  | ||||||
|  |  | ||||||
| // Default implementation of the IMkvWriteEOFReader interface. |  | ||||||
| class MkvWriteEOFReader : public IMkvWriteEOFReader { |  | ||||||
|  public: |  | ||||||
|   MkvWriteEOFReader(); |  | ||||||
|   virtual ~MkvWriteEOFReader(); |  | ||||||
|  |  | ||||||
|   // IMkvWriteEOFReader interface |  | ||||||
|   virtual int64 Position() const; |  | ||||||
|   virtual int32 Position(int64 position); |  | ||||||
|   virtual bool Seekable() const; |  | ||||||
|   virtual int32 Write(const void* buffer, uint32 length); |  | ||||||
|   virtual void ElementStartNotify(uint64 element_id, int64 position); |  | ||||||
|   virtual int Read(int64 position, int32 length, uint8* buffer); |  | ||||||
|  |  | ||||||
|   // Creates and opens a file for reading and writing. |filename| is the name of |  | ||||||
|   // the file to open. This function will overwrite the contents of |filename|. |  | ||||||
|   // If |create_temp_file| is set, the |filename| parameter is ignored and a |  | ||||||
|   // temporary file is created, which is automatically deleted upon close. |  | ||||||
|   // Returns true on success. |  | ||||||
|   bool Open(const char* filename, bool create_temp_file); |  | ||||||
|  |  | ||||||
|   // Closes an opened file. |  | ||||||
|   void Close(); |  | ||||||
|  |  | ||||||
|  private: |  | ||||||
|   // File handle to output file. |  | ||||||
|   FILE* file_; |  | ||||||
|  |  | ||||||
|   // Flag indicating if writes are allowed. Will be set to false on first call |  | ||||||
|   // to Read(). |  | ||||||
|   bool writes_allowed_; |  | ||||||
|  |  | ||||||
|   LIBWEBM_DISALLOW_COPY_AND_ASSIGN(MkvWriteEOFReader); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| }  // end namespace mkvmuxer |  | ||||||
|  |  | ||||||
| #endif  // MKVWRITEEOFREADER_HPP |  | ||||||
| @@ -18,7 +18,6 @@ | |||||||
|  |  | ||||||
| // libwebm muxer includes | // libwebm muxer includes | ||||||
| #include "mkvmuxer.hpp" | #include "mkvmuxer.hpp" | ||||||
| #include "mkvwriteeofreader.hpp" |  | ||||||
| #include "mkvwriter.hpp" | #include "mkvwriter.hpp" | ||||||
| #include "mkvmuxerutil.hpp" | #include "mkvmuxerutil.hpp" | ||||||
|  |  | ||||||
| @@ -264,7 +263,8 @@ int main(int argc, char* argv[]) { | |||||||
|   // Set muxer header info |   // Set muxer header info | ||||||
|   mkvmuxer::MkvWriter writer; |   mkvmuxer::MkvWriter writer; | ||||||
|  |  | ||||||
|   if (!writer.Open(output)) { |   char* temp_file = tmpnam(NULL); | ||||||
|  |   if (!writer.Open(cues_before_clusters ? temp_file : output)) { | ||||||
|     printf("\n Filename is invalid or error while opening.\n"); |     printf("\n Filename is invalid or error while opening.\n"); | ||||||
|     return EXIT_FAILURE; |     return EXIT_FAILURE; | ||||||
|   } |   } | ||||||
| @@ -272,14 +272,6 @@ int main(int argc, char* argv[]) { | |||||||
|   // Set Segment element attributes |   // Set Segment element attributes | ||||||
|   mkvmuxer::Segment muxer_segment; |   mkvmuxer::Segment muxer_segment; | ||||||
|  |  | ||||||
|   mkvmuxer::MkvWriteEOFReader writer_temp; |  | ||||||
|   if (cues_before_clusters) { |  | ||||||
|     if (!writer_temp.Open(NULL, true)) { |  | ||||||
|       printf("\n Filename is invalid or error while opening.\n"); |  | ||||||
|       return EXIT_FAILURE; |  | ||||||
|     } |  | ||||||
|     muxer_segment.WriteCuesBeforeClusters(&writer_temp); |  | ||||||
|   } |  | ||||||
|   if (!muxer_segment.Init(&writer)) { |   if (!muxer_segment.Init(&writer)) { | ||||||
|     printf("\n Could not initialize muxer segment!\n"); |     printf("\n Could not initialize muxer segment!\n"); | ||||||
|     return EXIT_FAILURE; |     return EXIT_FAILURE; | ||||||
| @@ -520,13 +512,29 @@ int main(int argc, char* argv[]) { | |||||||
|     return EXIT_FAILURE; |     return EXIT_FAILURE; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   reader.Close(); | ||||||
|  |   writer.Close(); | ||||||
|  |  | ||||||
|  |   if (cues_before_clusters) { | ||||||
|  |     if (reader.Open(temp_file)) { | ||||||
|  |       printf("\n Filename is invalid or error while opening.\n"); | ||||||
|  |       return EXIT_FAILURE; | ||||||
|  |     } | ||||||
|  |     if (!writer.Open(output)) { | ||||||
|  |       printf("\n Filename is invalid or error while opening.\n"); | ||||||
|  |       return EXIT_FAILURE; | ||||||
|  |     } | ||||||
|  |     if (!muxer_segment.CopyAndMoveCuesBeforeClusters(&reader, &writer)) { | ||||||
|  |       printf("\n Unable to copy and move cues before clusters.\n"); | ||||||
|  |       return EXIT_FAILURE; | ||||||
|  |     } | ||||||
|  |     reader.Close(); | ||||||
|  |     writer.Close(); | ||||||
|  |     remove(temp_file); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   delete [] data; |   delete [] data; | ||||||
|   delete parser_segment; |   delete parser_segment; | ||||||
|  |  | ||||||
|   writer.Close(); |  | ||||||
|   if (cues_before_clusters) |  | ||||||
|     writer_temp.Close(); |  | ||||||
|   reader.Close(); |  | ||||||
|  |  | ||||||
|   return EXIT_SUCCESS; |   return EXIT_SUCCESS; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -168,7 +168,7 @@ bool SampleMuxerMetadata::AddChapter(const cue_t& cue) { | |||||||
|   iter_t i = cue.payload.begin(); |   iter_t i = cue.payload.begin(); | ||||||
|   const iter_t j = cue.payload.end(); |   const iter_t j = cue.payload.end(); | ||||||
|  |  | ||||||
|   string title; |   std::string title; | ||||||
|  |  | ||||||
|   for (;;) { |   for (;;) { | ||||||
|     title += *i++; |     title += *i++; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Vignesh Venkatasubramanian
					Vignesh Venkatasubramanian