diff --git a/ChangeLog b/ChangeLog index 0a0d2d808..ffb558321 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2004-07-03 Moritz Bunkus + * mkvmerge: bug fix: The default track feature did not work + correctly with the new --track-order. + * mkvmerge: new feature: Added support for TTA lossless audio files. diff --git a/src/mkvmerge.cpp b/src/mkvmerge.cpp index a3ac6acce..47de992dd 100644 --- a/src/mkvmerge.cpp +++ b/src/mkvmerge.cpp @@ -1233,6 +1233,9 @@ render_headers(mm_io_c *rout) { for (i = 0; i < files.size(); i++) if (files[i]->first) files[i]->reader->set_headers(); + for (i = 0; i < packetizers.size(); i++) + if (packetizers[i]->packetizer != NULL) + packetizers[i]->packetizer->fix_headers(); kax_tracks->Render(*rout, !hack_engaged(ENGAGE_NO_DEFAULT_HEADER_VALUES)); kax_sh_main->IndexThis(*kax_tracks, *kax_segment); diff --git a/src/pr_generic.cpp b/src/pr_generic.cpp index 8cb2f3cf9..9df9b49bb 100644 --- a/src/pr_generic.cpp +++ b/src/pr_generic.cpp @@ -62,6 +62,7 @@ generic_packetizer_c::generic_packetizer_c(generic_reader_c *nreader, safety_last_timecode = 0; last_cue_timecode = -1; timecode_offset = 0; + default_track_warning_printed = false; // Let's see if the user specified audio sync for this track. found = false; @@ -296,10 +297,6 @@ generic_packetizer_c::set_track_type(int type) { if ((type == track_audio) && (ti->cues == CUES_UNSPECIFIED)) ti->cues = CUES_SPARSE; - if (ti->default_track) - set_as_default_track(type, DEFAULT_TRACK_PRIORITY_CMDLINE); - else - set_as_default_track(type, DEFAULT_TRACK_PRIORITY_FROM_TYPE); } void @@ -459,27 +456,18 @@ generic_packetizer_c::set_video_display_height(int height) { void generic_packetizer_c::set_as_default_track(int type, int priority) { - int idx; - - idx = 0; - if (type == track_audio) - idx = 0; - else if (type == track_video) - idx = 1; - else if (type == track_subtitle) - idx = 2; - else - die("pr_generic.cpp/generic_packetizer_c::set_as_default_track(): Unknown " - "track type %d.", type); - - if (default_tracks_priority[idx] < priority) { - default_tracks_priority[idx] = priority; - default_tracks[idx] = hserialno; - } else if (priority == DEFAULT_TRACK_PRIORITY_CMDLINE) + if (default_tracks_priority[type] < priority) { + default_tracks_priority[type] = priority; + default_tracks[type] = hserialno; + } else if ((priority == DEFAULT_TRACK_PRIORITY_CMDLINE) && + (default_tracks[type] != hserialno) && + !default_track_warning_printed) { mxwarn("Another default track for %s tracks has already " "been set. Not setting the 'default' flag for track %lld of " - "'%s'.\n", idx == 0 ? "audio" : idx == 'v' ? "video" : "subtitle", + "'%s'.\n", type == 0 ? "audio" : type == 'v' ? "video" : "subtitle", ti->id, ti->fname); + default_track_warning_printed = true; + } } void @@ -548,12 +536,10 @@ generic_packetizer_c::set_headers() { else idx = 2; - if (default_tracks[idx] == hserialno) - *(static_cast - (&GetChild(*track_entry))) = 1; + if (ti->default_track) + set_as_default_track(idx, DEFAULT_TRACK_PRIORITY_CMDLINE); else - *(static_cast - (&GetChild(*track_entry))) = 0; + set_as_default_track(idx, DEFAULT_TRACK_PRIORITY_FROM_TYPE); if (ti->language != NULL) *(static_cast @@ -682,6 +668,25 @@ generic_packetizer_c::set_headers() { } } +void +generic_packetizer_c::fix_headers() { + int idx; + + if (htrack_type == track_audio) + idx = 0; + else if (htrack_type == track_video) + idx = 1; + else + idx = 2; + + if (default_tracks[idx] == hserialno) + *(static_cast + (&GetChild(*track_entry))) = 1; + else + *(static_cast + (&GetChild(*track_entry))) = 0; +} + void generic_packetizer_c::add_packet(memory_c &mem, int64_t timecode, diff --git a/src/pr_generic.h b/src/pr_generic.h index 9e98c0924..017164f04 100644 --- a/src/pr_generic.h +++ b/src/pr_generic.h @@ -296,6 +296,7 @@ protected: // by set_headers(). int hserialno, htrack_type, htrack_min_cache, htrack_max_cache; int64_t htrack_default_duration; + bool default_track_warning_printed; uint32_t huid; char *hcodec_id; @@ -364,6 +365,7 @@ public: return free_refs; } virtual void set_headers(); + virtual void fix_headers(); virtual int process(memory_c &mem, int64_t timecode = -1, int64_t length = -1, int64_t bref = -1, int64_t fref = -1) = 0;