avformat/av1: Avoid allocation + copying when filtering OBUs
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>
Fri, 24 Jan 2020 22:48:33 +0000 (23:48 +0100)
committerJames Almer <jamrial@gmail.com>
Sun, 26 Jan 2020 15:41:32 +0000 (12:41 -0300)
commita3e43e0cf3d368663acbfc56c294216651f7fbab
tree1cab12cc83626143fc41e611f122c34916cd991c
parent2eee34372ff2ae4a4efc348362b904632b1e7cee
avformat/av1: Avoid allocation + copying when filtering OBUs

Certain types of OBUs are stripped away before muxing into Matroska and
ISOBMFF; there are two functions to do this: One that outputs by
directly writing in an AVIOContext and one that returns a freshly
allocated buffer with the units not stripped away copied into it.

The latter option is bad for performance, especially when the input
does already not contain any of the units intended to be stripped away
(this covers typical remuxing scenarios). Therefore this commit changes
this by avoiding allocating and copying when possible; it is possible if
the OBUs to be retained are consecutively in the input buffer (without
an OBU to be discarded between them). In this case, the caller receives
the offset as well as the length of the part of the buffer that contains
the units to be kept. This also avoids copying when e.g. the only unit
to be discarded is a temporal delimiter at the front.

For a 22.7mb/s file with average framesize 113 kB this improved the time
for the calls to ff_av1_filter_obus_buf() when writing Matroska from
313319 decicycles to 2368 decicycles; for another file with 1.5mb/s
(average framesize 7.3 kB) it improved from 34539 decicycles to 1922
decicyles. For these files the only units that needed to be stripped
away were temporal unit delimiters at the front.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
Signed-off-by: James Almer <jamrial@gmail.com>
libavformat/av1.c
libavformat/av1.h
libavformat/matroskaenc.c
libavformat/movenc.c