• 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
Name
Last commit
Last update
compat Loading commit data...
doc Loading commit data...
ffbuild Loading commit data...
fftools Loading commit data...
libavcodec Loading commit data...
libavdevice Loading commit data...
libavfilter Loading commit data...
libavformat Loading commit data...
libavresample Loading commit data...
libavutil Loading commit data...
libpostproc Loading commit data...
libswresample Loading commit data...
libswscale Loading commit data...
presets Loading commit data...
tests Loading commit data...
tools Loading commit data...
.gitattributes Loading commit data...
.gitignore Loading commit data...
.mailmap Loading commit data...
.travis.yml Loading commit data...
CONTRIBUTING.md Loading commit data...
COPYING.GPLv2 Loading commit data...
COPYING.GPLv3 Loading commit data...
COPYING.LGPLv2.1 Loading commit data...
COPYING.LGPLv3 Loading commit data...
CREDITS Loading commit data...
Changelog Loading commit data...
INSTALL.md Loading commit data...
LICENSE.md Loading commit data...
MAINTAINERS Loading commit data...
Makefile Loading commit data...
README.md Loading commit data...
RELEASE Loading commit data...
configure Loading commit data...