From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
To: ffmpeg-devel@ffmpeg.org
Cc: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Subject: [FFmpeg-devel] [PATCH 5/8] avformat/matroskaenc: Use av_fast_realloc_array for index entries
Date: Tue, 5 Jul 2022 22:26:47 +0200
Message-ID: <DB6PR0101MB22148E756BE238C0567532608F819@DB6PR0101MB2214.eurprd01.prod.exchangelabs.com> (raw)
In-Reply-To: <DB6PR0101MB2214034DCAA45C10037497958F819@DB6PR0101MB2214.eurprd01.prod.exchangelabs.com>
Currently, the Matroska muxer reallocates its array of index entries
each time another entry is added. This is bad performance-wise,
especially on Windows where reallocations are slow. This is solved
by switching to av_fast_realloc_array() which ensures that actual
reallocations will happen only seldomly.
For an (admittedly extreme) example which consists of looping a video
consisting of a single keyframe of size 4KB 540000 times this improved
the time for writing a frame from 23524201 decicycles (516466 runs,
7822 skips) to 225240 decicycles (522122 runs, 2166 skips) on Windows.
(Writing CRC-32 elements was disabled for these tests.)
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
libavformat/matroskaenc.c | 23 ++++++++++++++++-------
1 file changed, 16 insertions(+), 7 deletions(-)
diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index 1256bdfe36..7c7de612de 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -168,7 +168,8 @@ typedef struct mkv_cuepoint {
typedef struct mkv_cues {
mkv_cuepoint *entries;
- int num_entries;
+ size_t num_entries;
+ size_t allocated_entries;
} mkv_cues;
struct MatroskaMuxContext;
@@ -257,6 +258,10 @@ typedef struct MatroskaMuxContext {
/** 4 * (1-byte EBML ID, 1-byte EBML size, 8-byte uint max) */
#define MAX_CUETRACKPOS_SIZE 40
+/** Minimal size of CueTrack, CueClusterPosition and CueRelativePosition,
+ * and 1 + 1 bytes for the overhead of CueTrackPositions itself. */
+#define MIN_CUETRACKPOS_SIZE (1 + 1 + 3 * (1 + 1 + 1))
+
/** 2 + 1 Simpletag header, 2 + 1 + 8 Name "DURATION", 23B for TagString */
#define DURATION_SIMPLETAG_SIZE (2 + 1 + (2 + 1 + 8) + 23)
@@ -914,16 +919,20 @@ static int mkv_add_cuepoint(MatroskaMuxContext *mkv, int stream, int64_t ts,
int64_t cluster_pos, int64_t relative_pos, int64_t duration)
{
mkv_cues *cues = &mkv->cues;
- mkv_cuepoint *entries = cues->entries;
- unsigned idx = cues->num_entries;
+ mkv_cuepoint *entries;
+ size_t idx = cues->num_entries;
+ int ret;
if (ts < 0)
return 0;
- entries = av_realloc_array(entries, cues->num_entries + 1, sizeof(mkv_cuepoint));
- if (!entries)
- return AVERROR(ENOMEM);
- cues->entries = entries;
+ ret = av_fast_realloc_array(&cues->entries, &cues->allocated_entries,
+ cues->num_entries + 1,
+ MAX_SUPPORTED_EBML_LENGTH / MIN_CUETRACKPOS_SIZE,
+ sizeof(*cues->entries));
+ if (ret < 0)
+ return ret;
+ entries = cues->entries;
/* Make sure the cues entries are sorted by pts. */
while (idx > 0 && entries[idx - 1].pts > ts)
--
2.34.1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
next prev parent reply other threads:[~2022-07-05 20:28 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-05 20:09 [FFmpeg-devel] [PATCH 1/8] avutil/mem: Handle fast allocations near UINT_MAX properly Andreas Rheinhardt
2022-07-05 20:26 ` [FFmpeg-devel] [PATCH 2/8] avformat/flvenc: Add deinit function Andreas Rheinhardt
2022-07-06 2:28 ` Steven Liu
2022-07-05 20:26 ` [FFmpeg-devel] [PATCH 3/8] avutil/mem: Add av_fast_realloc_array() Andreas Rheinhardt
2022-07-06 14:40 ` Tomas Härdin
2022-07-06 14:46 ` Andreas Rheinhardt
2022-07-06 14:54 ` Tomas Härdin
2022-07-12 14:12 ` Andreas Rheinhardt
2022-07-14 8:14 ` Anton Khirnov
2022-07-14 12:51 ` Andreas Rheinhardt
2022-07-17 8:30 ` Anton Khirnov
2022-09-26 12:25 ` Andreas Rheinhardt
2022-09-26 14:21 ` Andreas Rheinhardt
2022-09-26 14:24 ` Tomas Härdin
2022-09-27 15:23 ` Tomas Härdin
2022-09-28 9:35 ` Tomas Härdin
2022-09-28 11:06 ` Andreas Rheinhardt
2022-09-28 11:41 ` Tomas Härdin
2022-07-21 21:23 ` Tomas Härdin
2022-08-17 15:29 ` Anton Khirnov
2022-07-05 20:26 ` [FFmpeg-devel] [PATCH 4/8] avformat/flvenc: Use array instead of linked list for index Andreas Rheinhardt
2022-07-06 14:58 ` Tomas Härdin
2022-07-06 15:03 ` Andreas Rheinhardt
2022-07-05 20:26 ` Andreas Rheinhardt [this message]
2022-07-06 15:03 ` [FFmpeg-devel] [PATCH 5/8] avformat/matroskaenc: Use av_fast_realloc_array for index entries Tomas Härdin
2022-07-06 15:10 ` Andreas Rheinhardt
2022-07-06 15:21 ` Tomas Härdin
2022-07-05 20:26 ` [FFmpeg-devel] [PATCH 6/8] avcodec/movtextenc: Use av_fast_realloc_array Andreas Rheinhardt
2022-07-06 15:06 ` Tomas Härdin
2022-07-05 20:26 ` [FFmpeg-devel] [PATCH 7/8] avutil/fifo: Simplify growing FIFO Andreas Rheinhardt
2022-07-05 20:26 ` [FFmpeg-devel] [PATCH 8/8] avutil/fifo: Grow FIFO faster when growing automatically Andreas Rheinhardt
2022-07-06 13:02 ` [FFmpeg-devel] [PATCH 1/8] avutil/mem: Handle fast allocations near UINT_MAX properly Anton Khirnov
2022-07-06 13:08 ` Andreas Rheinhardt
2022-07-06 13:17 ` Anton Khirnov
2022-07-06 14:24 ` Tomas Härdin
2022-07-06 14:40 ` Andreas Rheinhardt
2022-08-17 14:31 ` Tomas Härdin
2022-09-26 11:50 ` Tomas Härdin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=DB6PR0101MB22148E756BE238C0567532608F819@DB6PR0101MB2214.eurprd01.prod.exchangelabs.com \
--to=andreas.rheinhardt@outlook.com \
--cc=ffmpeg-devel@ffmpeg.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git