summaryrefslogtreecommitdiffstats
path: root/demux/demux.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2017-11-05 16:36:18 +0100
committerwm4 <wm4@nowhere>2017-11-05 18:13:34 +0100
commit9e1fbffc37779c8f491d3aa8e319ab233e5ab0da (patch)
tree894c25cc6443805d3453c3a4788ed4ab1ee0bedc /demux/demux.c
parent8aa1db3b175d29201f55648849b4f2ddc15f8ea1 (diff)
downloadmpv-9e1fbffc37779c8f491d3aa8e319ab233e5ab0da.tar.bz2
mpv-9e1fbffc37779c8f491d3aa8e319ab233e5ab0da.tar.xz
demux_mkv: rewrite packet reading to avoid 1 memcpy()
This directly reads individual mkv sub-packets (block laces) into a dedicated AVBufferRefs, which can be directly used for creating packets without a additional copy of the packet data. This also means we switch parsing of block header fields and lacing metadata to read directly from the stream, instead of a memory buffer. This could have been much easier if libavcodec didn't require padding the packet data with zero bytes. We could just have each packet reference a slice of the block data. But as it is, the only way to get padding without a copy is to read the laces into individually allocated (and padded) memory block, which required a larger rewrite. This probably makes recovering from broken mkv files slightly worse if the transport is unseekable. We just read, and then check if we've overread. But I think that shouldn't be a real concern. No actual measureable performance change. Potential for some regressions, as this is quite intrusive, and touches weird obscure shit like mkv lacing. Still keeping it because I like how it removes some redundant EBML parsing functions.
Diffstat (limited to 'demux/demux.c')
0 files changed, 0 insertions, 0 deletions