aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/mpegvideodsp.h
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2019-11-26 18:03:11 +0100
committerAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2020-04-13 07:59:23 +0200
commit3c3ad1deb0826e14697858e91985ff113d6ace23 (patch)
treefc83137465c2ac0b2beeab3458f34b12373b9352 /libavcodec/mpegvideodsp.h
parent2e2fa2d6e64e0f87277c507ec9c0fee8eab98533 (diff)
downloadffmpeg-3c3ad1deb0826e14697858e91985ff113d6ace23.tar.gz
avformat/matroskaenc: Ensure that ChapterUID are != 0
AVChapters have an int as id field and therefore this value can appear <= 0. When remuxing from Matroska, this value actually contains the lower 32 bits of the original ChapterUID (which can be 64 bits). In order to ensure that the ChapterUID is always > 0, they were offset as follows (since 07704c61): First max(0, 1LL - chapter[i].id) was computed and stored in an uint32_t. And then the IDs were offset using this value. This has two downsides: 1. It does not ensure that the UID is actually != 0: Namely if there is a chapter with id == INT_MIN, then the offset will be 2^31 + 1 and a chapter with id == INT_MAX will become 2^31 - 1 + 2^31 + 1 = 2^32 = 0, because the actual calculation was performed in 32 bits. 2. As soon as a chapter id appears to be negative, a nontrivial offset is used, so that not even a ChapterUID that only uses 32 bits is preserved. So change this by treating the id as an unsigned value internally and only offset (by 1) if an id vanishes. The actual offsetting then has to be performed in 64 bits in order to make sure that no UINT32_MAX wraps around. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
Diffstat (limited to 'libavcodec/mpegvideodsp.h')
0 files changed, 0 insertions, 0 deletions