From db20aaa2b18465333cf7e516cbc3c2d564634058 Mon Sep 17 00:00:00 2001 From: Matthew Heaney Date: Thu, 13 Sep 2012 12:45:23 -0700 Subject: [PATCH] mkvmuxer: refactored code that creates a new cluster Change-Id: I5db03b0e1ea23f45820dd47b7be9e4b0422f3e6a --- mkvmuxer.cpp | 62 +++++++++++++++++++++++++++++----------------------- mkvmuxer.hpp | 5 +++++ 2 files changed, 40 insertions(+), 27 deletions(-) diff --git a/mkvmuxer.cpp b/mkvmuxer.cpp index 29d6ba8..6be83a2 100644 --- a/mkvmuxer.cpp +++ b/mkvmuxer.cpp @@ -1638,33 +1638,8 @@ bool Segment::AddFrame(const uint8* frame, return true; } - // Check to see if the muxer needs to start a new cluster. - if (is_key && tracks_.TrackIsVideo(track_number)) { - new_cluster_ = true; - } else if (cluster_list_size_ > 0) { - const Cluster* const cluster = cluster_list_[cluster_list_size_-1]; - - if (!cluster) - return false; - - const uint64 cluster_ts = - cluster->timecode() * segment_info_.timecode_scale(); - - if (max_cluster_duration_ > 0 && - (timestamp - cluster_ts) >= max_cluster_duration_) { - new_cluster_ = true; - } else if (max_cluster_size_ > 0 && cluster_list_size_ > 0) { - if (cluster->payload_size() >= max_cluster_size_) { - new_cluster_ = true; - } - } - } - - if (new_cluster_) { - if (!MakeNewCluster(timestamp)) - return false; - new_cluster_ = false; - } + if (!DoNewClusterProcessing(track_number, timestamp, is_key)) + return false; // Write any audio frames left. if (WriteFramesAll() < 0) @@ -1922,6 +1897,39 @@ bool Segment::MakeNewCluster(uint64 frame_timestamp_ns) { return true; } +bool Segment::DoNewClusterProcessing(uint64 track_number, + uint64 frame_timestamp_ns, + bool is_key) { + // Check to see if the muxer needs to start a new cluster. + if (is_key && tracks_.TrackIsVideo(track_number)) { + new_cluster_ = true; + } else if (cluster_list_size_ > 0) { + const Cluster* const cluster = cluster_list_[cluster_list_size_ - 1]; + if (!cluster) + return false; + + const uint64 timecode_scale = segment_info_.timecode_scale(); + const uint64 cluster_timestamp_ns = cluster->timecode() * timecode_scale; + + if (max_cluster_duration_ > 0 && + (frame_timestamp_ns - cluster_timestamp_ns) >= max_cluster_duration_) { + new_cluster_ = true; + } else if (max_cluster_size_ > 0 && cluster_list_size_ > 0) { + if (cluster->payload_size() >= max_cluster_size_) { + new_cluster_ = true; + } + } + } + + if (new_cluster_) { + if (!MakeNewCluster(frame_timestamp_ns)) + return false; + new_cluster_ = false; + } + + return true; +} + bool Segment::CheckHeaderInfo() { if (!header_written_) { if (!WriteSegmentHeader()) diff --git a/mkvmuxer.hpp b/mkvmuxer.hpp index a69baf4..358e8d2 100644 --- a/mkvmuxer.hpp +++ b/mkvmuxer.hpp @@ -790,6 +790,11 @@ class Segment { // frame, or the indicated time. Returns true on success. bool MakeNewCluster(uint64 timestamp_ns); + // Checks whether a new cluster needs to be created, and if so + // creates a new cluster. Returns false if creation of a new cluster + // was necessary but creation was not successful. + bool DoNewClusterProcessing(uint64 track_num, uint64 timestamp_ns, bool key); + // WebM elements Cues cues_; SeekHead seek_head_;