[Matroska-devel] Hi, question about the MKV tags

Moritz Bunkus moritz at bunkus.org
Mon Feb 14 19:00:33 CET 2011


 On Mon, 14 Feb 2011 17:03:41 +0100, Steve Lhomme wrote:

> So are we back to using double Seek Heads ? I thought this was
> deprecated. It adds extra complexity for a fundamental part that is
> supposed to make the file handling easier.

 It's almost trivial to support linked seekheads -- simply make seekhead 
 parsing recursive.

 Also it's not the standard behaviour of mkvmerge. But mmg's chapter 
 editor/track header editor and mkvpropedit will fall back to creating 
 such structures if there's not enough room before the first cluster for 
 storing the whole seekhead. There are only three options in such cases:

 1. refuse to modify the file,
 2. remux the whole file into a temporary one & overwrite the original 
 one afterwards and
 3. create two linked seekheads, a small one before the first cluster 
 and a larger one at the back of the file.

 Like I said, this is the exception, not the rule.

> It is valid indeed but kinda defeat the point of the Seek Head if you
> find Level 1 elements before.

 The simplest algorithm that works both with seekable and with 
 non-seekable files is:

 while (!cluster_found) {
   if (is_cluster)
   else if (is_seekhead && stream_is_seekable)
   else if (is_track_headers)
   else if (is_segmentinfo)

 if (!segmentinfo_found || !track_headers_found)

 Also it doesn't defeat any point. The seekhead can still (and most 
 likely will) point to stuff at the end of the file, e.g. at least the 

> Luckily with such a design it matters less is
> the Seek Head is at the front or not (ie more mkvmerge friendly),

 mkvmerge doesn't care. If it finds a seekhead before the first cluster 
 then that seekhead and all the ones referenced from it are used. If it 
 doesn't then mkvmerge requires the track headers and segment info to be 
 located before the first cluster as well. If it also finds 
 tags/attachments/chapters before the first cluster then those are used 
 as well. Pretty much like the dummy algorithm above: "it will be used if 
 it is found by reading up to the first cluster and following all 
 seekheads founduntil then".


More information about the Matroska-devel mailing list