• Andreas Rheinhardt's avatar
    avformat/matroskaenc: Avoid unnecessary seek · efeb3a53
    Andreas Rheinhardt authored
    The Matroska muxer has a pair of functions designed to write master
    elements whose exact length is not known in advance: start_ebml_master()
    and end_ebml_master(). The first one of these would write the EBML ID of
    the master element that is about to be started, reserve some bytes for
    the length field and record the current position as well as how many
    bytes were used for the length field. When writing the master's contents
    is finished, end_ebml_master() gets the current position (at the end of
    the master element), seeks to the length field using the recorded
    position, writes the length field and seeks back to the end of the
    master element so that one can continue writing other elements.
    
    But if one wants to modify the content of the master element itself,
    then the seek back is superfluous. This is the scenario that presents
    itself when writing the trailer: One wants to update several elements
    contained in the Segment master element (this is the main/root master
    element of a Matroska file) that were already written when writing the
    header. The current approach is to seek to the beginning of the file
    to update the elements, then seek to the end, call end_ebml_master()
    which immediately seeks to the beginning to write the length and seeks
    back. The seek to the end (which has only been performed because
    end_ebml_master() uses the initial position to determine the length
    of the master element) and the seek back are of course superfluous.
    
    This commit avoids these seeks by no longer using start/end_ebml_master()
    to write the segment's length field. Instead, it is now written
    manually. The new approach is: Seek to the beginning to write the length
    field, then update the elements (in the order they appear in the file)
    and seek back to the end.
    
    This reduces the ordinary amount of seeks of the Matroska muxer to two
    (ordinary excludes scenarios where one has big Chapters or Attachments
    or where one writes the Cues at the front).
    Signed-off-by: 's avatarAndreas Rheinhardt <andreas.rheinhardt@gmail.com>
    efeb3a53
matroskaenc.c 104 KB