Support for placing Cues before Clusters

Adding support for placing Cues element before the Cluster element. We
recompute the new offsets using a recursive algorithm and update the Cues and
Seek Heads with the updates offsets.

Change-Id: I038f1a403b1defa853b9026bd3e48f4ad1006866
This commit is contained in:
Vignesh Venkatasubramanian
2013-05-24 15:50:13 -07:00
parent 3f7681d11e
commit 9b42d039ad
5 changed files with 219 additions and 9 deletions

View File

@@ -18,6 +18,7 @@
// libwebm muxer includes
#include "mkvmuxer.hpp"
#include "mkvreadablewriter.hpp"
#include "mkvwriter.hpp"
#include "mkvmuxerutil.hpp"
@@ -53,6 +54,7 @@ void Usage() {
printf("\n");
printf("Cues options:\n");
printf(" -output_cues_block_number <int> >0 outputs cue block number\n");
printf(" -cues_before_clusters <int> >0 puts Cues before Clusters\n");
printf("\n");
printf("Metadata options:\n");
printf(" -webvtt-subtitles <vttfile> "
@@ -145,6 +147,7 @@ int main(int argc, char* argv[]) {
bool output_audio = true;
bool live_mode = false;
bool output_cues = true;
bool cues_before_clusters = false;
bool cues_on_video_track = true;
bool cues_on_audio_track = false;
uint64 max_cluster_duration = 0;
@@ -182,6 +185,8 @@ int main(int argc, char* argv[]) {
live_mode = strtol(argv[++i], &end, 10) == 0 ? false : true;
} else if (!strcmp("-output_cues", argv[i]) && i < argc_check) {
output_cues = strtol(argv[++i], &end, 10) == 0 ? false : true;
} else if (!strcmp("-cues_before_clusters", argv[i]) && i < argc_check) {
cues_before_clusters = strtol(argv[++i], &end, 10) == 0 ? false : true;
} else if (!strcmp("-cues_on_video_track", argv[i]) && i < argc_check) {
cues_on_video_track = strtol(argv[++i], &end, 10) == 0 ? false : true;
if (cues_on_video_track)
@@ -267,6 +272,14 @@ int main(int argc, char* argv[]) {
// Set Segment element attributes
mkvmuxer::Segment muxer_segment;
mkvmuxer::MkvReadableWriter 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)) {
printf("\n Could not initialize muxer segment!\n");
return EXIT_FAILURE;
@@ -511,6 +524,8 @@ int main(int argc, char* argv[]) {
delete parser_segment;
writer.Close();
if (cues_before_clusters)
writer_temp.Close();
reader.Close();
return EXIT_SUCCESS;