[FFmpeg-devel] [PATCH 2/2] avformat: Make AVChapter.id an int64_t on next major bump
Andreas Rheinhardt
andreas.rheinhardt at gmail.com
Wed Mar 17 21:29:25 EET 2021
Andreas Rheinhardt:
> 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.
>
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
> ---
> Apologies for being so late.
>
> 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 c0d955b1fa..8b93adebe1 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -15,6 +15,10 @@ libavutil: 2017-10-21
>
> API changes, most recent first:
>
> +2021-03-16 - 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-12 - xxxxxxxxxx - lavc 58.131.100 - avcodec.h codec.h
> Add a get_encode_buffer callback to AVCodecContext, similar to
> get_buffer2 but for encoders.
> diff --git a/libavformat/aadec.c b/libavformat/aadec.c
> index e88cdb89df..80ca2c12d7 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 e3bd01ec7f..765bc3b6f5 100644
> --- a/libavformat/avformat.h
> +++ b/libavformat/avformat.h
> @@ -1184,7 +1184,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 0ffdc87b6a..df4918e318 100644
> --- a/libavformat/internal.h
> +++ b/libavformat/internal.h
> @@ -554,7 +554,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 8f29d64e72..02e171593e 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 ebb062377d..d1f3496990 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 8573117694..8fb5dbbf9d 100644
> --- a/libavformat/utils.c
> +++ b/libavformat/utils.c
> @@ -4611,7 +4611,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 e43754b069..ca1cd1a920 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
>
I'll apply this tomorrow unless there are objections.
- Andreas
More information about the ffmpeg-devel
mailing list