[FFmpeg-devel] [PATCH] avformat/matroskaenc: Sort cues entries by pts
Andreas Rheinhardt
andreas.rheinhardt at outlook.com
Tue Nov 30 12:52:07 EET 2021
Andreas Rheinhardt:
> Currently they are ordered as-written (i.e. by increasing position);
> in case av_interleaved_write_frame() is used, this is (mostly)
> the same as ordered by increasing dts.
> Yet the Matroska specification strongly recommends (SHOULD) that
> the CuePoints be sorted by CueTime. mkvalidator warns when they are
> not. Therefore this commit sorts them accordingly.
>
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
> ---
> libavformat/matroskaenc.c | 19 ++++++++++++++-----
> 1 file changed, 14 insertions(+), 5 deletions(-)
>
> diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
> index f08ead0a96..8c4cf4024a 100644
> --- a/libavformat/matroskaenc.c
> +++ b/libavformat/matroskaenc.c
> @@ -533,6 +533,7 @@ static int mkv_add_cuepoint(MatroskaMuxContext *mkv, int stream, int64_t ts,
> {
> mkv_cues *cues = &mkv->cues;
> mkv_cuepoint *entries = cues->entries;
> + unsigned idx = cues->num_entries;
>
> if (ts < 0)
> return 0;
> @@ -542,11 +543,19 @@ static int mkv_add_cuepoint(MatroskaMuxContext *mkv, int stream, int64_t ts,
> return AVERROR(ENOMEM);
> cues->entries = entries;
>
> - cues->entries[cues->num_entries].pts = ts;
> - cues->entries[cues->num_entries].stream_idx = stream;
> - cues->entries[cues->num_entries].cluster_pos = cluster_pos - mkv->segment_offset;
> - cues->entries[cues->num_entries].relative_pos = relative_pos;
> - cues->entries[cues->num_entries++].duration = duration;
> + /* Make sure the cues entries are sorted by pts. */
> + while (idx > 0 && entries[idx - 1].pts > ts)
> + idx--;
> + memmove(&entries[idx + 1], &entries[idx],
> + (cues->num_entries - idx) * sizeof(entries[0]));
> +
> + entries[idx].pts = ts;
> + entries[idx].stream_idx = stream;
> + entries[idx].cluster_pos = cluster_pos - mkv->segment_offset;
> + entries[idx].relative_pos = relative_pos;
> + entries[idx].duration = duration;
> +
> + cues->num_entries++;
>
> return 0;
> }
>
Will apply tonight unless there are objections.
- Andreas
More information about the ffmpeg-devel
mailing list