From e318438f2f30525d8baca2b5683aa9898d0c56f7 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt Date: Tue, 16 Mar 2021 08:29:59 +0100 Subject: [PATCH] avformat: Make AVChapter.id an int64_t on next major bump 64 bits are needed in order to retain the uid values of Matroska chapters; the type is kept signed because the semantics of NUT chapters depend upon whether the id is > 0 or < 0. Reviewed-by: Anton Khirnov Signed-off-by: Andreas Rheinhardt --- doc/APIchanges | 4 ++++ libavformat/aadec.c | 2 +- libavformat/avformat.h | 4 ++++ libavformat/internal.h | 4 ++++ libavformat/matroskaenc.c | 4 ++++ libavformat/nutdec.c | 4 ++-- libavformat/utils.c | 4 ++++ libavformat/version.h | 5 ++++- 8 files changed, 27 insertions(+), 4 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index 849d95a7ed9..937ea70fbcf 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -15,6 +15,10 @@ libavutil: 2017-10-21 API changes, most recent first: +2021-03-19 - xxxxxxxxxx - lavf 58.75.100 - avformat.h + AVChapter.id will be changed from int to int64_t + on the next major version bump. + 2021-03-xx - xxxxxxxxxx - lavc 58.133.100 - codec.h Deprecated av_init_packet(). Once removed, sizeof(AVPacket) will no longer be a part of the public ABI. diff --git a/libavformat/aadec.c b/libavformat/aadec.c index e88cdb89df7..80ca2c12d79 100644 --- a/libavformat/aadec.c +++ b/libavformat/aadec.c @@ -222,7 +222,7 @@ static int aa_read_header(AVFormatContext *s) c->content_end = start + largest_size; while ((chapter_pos = avio_tell(pb)) >= 0 && chapter_pos < c->content_end) { - int chapter_idx = s->nb_chapters; + unsigned chapter_idx = s->nb_chapters; uint32_t chapter_size = avio_rb32(pb); if (chapter_size == 0 || avio_feof(pb)) break; diff --git a/libavformat/avformat.h b/libavformat/avformat.h index f781c1c118f..822aa4c6314 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -1188,7 +1188,11 @@ typedef struct AVProgram { change dynamically at runtime. */ typedef struct AVChapter { +#if FF_API_CHAPTER_ID_INT int id; ///< unique ID to identify the chapter +#else + int64_t id; ///< unique ID to identify the chapter +#endif AVRational time_base; ///< time base in which the start/end timestamps are specified int64_t start, end; ///< chapter start/end time in time_base units AVDictionary *metadata; diff --git a/libavformat/internal.h b/libavformat/internal.h index 96902b818cb..3c6b2921c1e 100644 --- a/libavformat/internal.h +++ b/libavformat/internal.h @@ -560,7 +560,11 @@ void ff_configure_buffers_for_index(AVFormatContext *s, int64_t time_tolerance); * * @return AVChapter or NULL on error */ +#if FF_API_CHAPTER_ID_INT AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base, +#else +AVChapter *avpriv_new_chapter(AVFormatContext *s, int64_t id, AVRational time_base, +#endif int64_t start, int64_t end, const char *title); /** diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 012da9e5382..bbf231f2a46 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -1669,7 +1669,11 @@ static int mkv_write_chapters(AVFormatContext *s) int64_t chapterstart = av_rescale_q(c->start, c->time_base, scale); int64_t chapterend = av_rescale_q(c->end, c->time_base, scale); const AVDictionaryEntry *t; +#if FF_API_CHAPTER_ID_INT uint64_t uid = create_new_ids ? i + 1ULL : (uint32_t)c->id; +#else + uint64_t uid = create_new_ids ? i + 1ULL : c->id; +#endif if (chapterstart < 0 || chapterstart > chapterend || chapterend < 0) { av_log(s, AV_LOG_ERROR, "Invalid chapter start (%"PRId64") or end (%"PRId64").\n", diff --git a/libavformat/nutdec.c b/libavformat/nutdec.c index ebb062377d8..d1f3496990c 100644 --- a/libavformat/nutdec.c +++ b/libavformat/nutdec.c @@ -489,8 +489,8 @@ static int decode_info_header(NUTContext *nut) AVIOContext *bc = s->pb; uint64_t tmp, chapter_start, chapter_len; unsigned int stream_id_plus1, count; - int chapter_id, i, ret = 0; - int64_t value, end; + int i, ret = 0; + int64_t chapter_id, value, end; char name[256], str_value[1024], type_str[256]; const char *type; int *event_flags = NULL; diff --git a/libavformat/utils.c b/libavformat/utils.c index a73f944e6e7..295e676c9c4 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -4626,7 +4626,11 @@ AVProgram *av_new_program(AVFormatContext *ac, int id) return program; } +#if FF_API_CHAPTER_ID_INT AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base, +#else +AVChapter *avpriv_new_chapter(AVFormatContext *s, int64_t id, AVRational time_base, +#endif int64_t start, int64_t end, const char *title) { AVChapter *chapter = NULL; diff --git a/libavformat/version.h b/libavformat/version.h index e43754b069d..ca1cd1a920e 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -32,7 +32,7 @@ // Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium) // Also please add any ticket numbers that you believe might be affected here #define LIBAVFORMAT_VERSION_MAJOR 58 -#define LIBAVFORMAT_VERSION_MINOR 74 +#define LIBAVFORMAT_VERSION_MINOR 75 #define LIBAVFORMAT_VERSION_MICRO 100 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ @@ -109,6 +109,9 @@ #ifndef FF_API_DEMUXER_OPEN #define FF_API_DEMUXER_OPEN (LIBAVFORMAT_VERSION_MAJOR < 59) #endif +#ifndef FF_API_CHAPTER_ID_INT +#define FF_API_CHAPTER_ID_INT (LIBAVFORMAT_VERSION_MAJOR < 59) +#endif #ifndef FF_API_LAVF_PRIV_OPT #define FF_API_LAVF_PRIV_OPT (LIBAVFORMAT_VERSION_MAJOR < 60) #endif -- 2.39.2