From 3358673ba423b539611be2fbf9ff23de680afeaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert-Andr=C3=A9=20Mauchin?= Date: Fri, 10 May 2024 18:05:08 +0200 Subject: [PATCH] Add compatibility with FFMPEG 7.0 avio: Constify data pointees of write callbacks avutil: remove deprecated FF_API_PKT_DURATION Ref: https://github.com/FFmpeg/FFmpeg/commit/2a68d945cd74265bb71c3d38b7a2e7f7d7e87be5 https://github.com/FFmpeg/FFmpeg/commit/02aea61d69d8f81bc285e2131bf25f96a3e27feb https://github.com/FFmpeg/FFmpeg/commit/b8fef7e9c520b3923b32813b6a82c154c74402dc --- .../ffmpeg/ffmpeg_frame_generator.cpp | 4 ++++ Telegram/SourceFiles/ffmpeg/ffmpeg_utility.cpp | 8 ++++++++ Telegram/SourceFiles/ffmpeg/ffmpeg_utility.h | 18 ++++++++++++++++-- .../media/audio/media_audio_capture.cpp | 4 ++++ .../media/clip/media_clip_ffmpeg.cpp | 4 ++++ 5 files changed, 36 insertions(+), 2 deletions(-) diff --git a/Telegram/SourceFiles/ffmpeg/ffmpeg_frame_generator.cpp b/Telegram/SourceFiles/ffmpeg/ffmpeg_frame_generator.cpp index 116d998a2..de478b784 100644 --- a/Telegram/SourceFiles/ffmpeg/ffmpeg_frame_generator.cpp +++ b/Telegram/SourceFiles/ffmpeg/ffmpeg_frame_generator.cpp @@ -291,7 +291,11 @@ void FrameGenerator::Impl::jumpToStart() { void FrameGenerator::Impl::resolveNextFrameTiming() { const auto base = _format->streams[_streamId]->time_base; +#if DA_FFMPEG_HAVE_DURATION + const auto duration = _next.frame->duration; +#else const auto duration = _next.frame->pkt_duration; +#endif const auto framePts = _next.frame->pts; auto framePosition = (framePts * 1000LL * base.num) / base.den; _currentFrameDelay = _nextFrameDelay; diff --git a/Telegram/SourceFiles/ffmpeg/ffmpeg_utility.cpp b/Telegram/SourceFiles/ffmpeg/ffmpeg_utility.cpp index 2a42d0034..0f7083df3 100644 --- a/Telegram/SourceFiles/ffmpeg/ffmpeg_utility.cpp +++ b/Telegram/SourceFiles/ffmpeg/ffmpeg_utility.cpp @@ -230,7 +230,11 @@ enum AVPixelFormat GetFormatImplementation( IOPointer MakeIOPointer( void *opaque, int(*read)(void *opaque, uint8_t *buffer, int bufferSize), +#if DA_FFMPEG_CONST_WRITE_CALLBACK + int(*write)(void *opaque, const uint8_t *buffer, int bufferSize), +#else int(*write)(void *opaque, uint8_t *buffer, int bufferSize), +#endif int64_t(*seek)(void *opaque, int64_t offset, int whence)) { auto buffer = reinterpret_cast(av_malloc(kAvioBlockSize)); if (!buffer) { @@ -263,7 +267,11 @@ void IODeleter::operator()(AVIOContext *value) { FormatPointer MakeFormatPointer( void *opaque, int(*read)(void *opaque, uint8_t *buffer, int bufferSize), +#if DA_FFMPEG_CONST_WRITE_CALLBACK + int(*write)(void *opaque, const uint8_t *buffer, int bufferSize), +#else int(*write)(void *opaque, uint8_t *buffer, int bufferSize), +#endif int64_t(*seek)(void *opaque, int64_t offset, int whence)) { auto io = MakeIOPointer(opaque, read, write, seek); if (!io) { diff --git a/Telegram/SourceFiles/ffmpeg/ffmpeg_utility.h b/Telegram/SourceFiles/ffmpeg/ffmpeg_utility.h index bc9c8764b..d96daa9c7 100644 --- a/Telegram/SourceFiles/ffmpeg/ffmpeg_utility.h +++ b/Telegram/SourceFiles/ffmpeg/ffmpeg_utility.h @@ -22,8 +22,14 @@ extern "C" { #include } // extern "C" -#define DA_FFMPEG_NEW_CHANNEL_LAYOUT (LIBAVUTIL_VERSION_MAJOR > 57 \ - || (LIBAVUTIL_VERSION_MAJOR == 57 && LIBAVUTIL_VERSION_MINOR >= 28)) +#define DA_FFMPEG_NEW_CHANNEL_LAYOUT (LIBAVUTIL_VERSION_INT >= \ + AV_VERSION_INT(57, 28, 100)) + +#define DA_FFMPEG_CONST_WRITE_CALLBACK (LIBAVFORMAT_VERSION_INT >= \ + AV_VERSION_INT(61, 01, 100)) + +#define DA_FFMPEG_HAVE_DURATION (LIBAVUTIL_VERSION_INT >= \ + AV_VERSION_INT(58, 02, 100)) class QImage; @@ -112,7 +118,11 @@ using IOPointer = std::unique_ptr; [[nodiscard]] IOPointer MakeIOPointer( void *opaque, int(*read)(void *opaque, uint8_t *buffer, int bufferSize), +#if DA_FFMPEG_CONST_WRITE_CALLBACK + int(*write)(void *opaque, const uint8_t *buffer, int bufferSize), +#else int(*write)(void *opaque, uint8_t *buffer, int bufferSize), +#endif int64_t(*seek)(void *opaque, int64_t offset, int whence)); struct FormatDeleter { @@ -122,7 +132,11 @@ using FormatPointer = std::unique_ptr; [[nodiscard]] FormatPointer MakeFormatPointer( void *opaque, int(*read)(void *opaque, uint8_t *buffer, int bufferSize), +#if DA_FFMPEG_CONST_WRITE_CALLBACK + int(*write)(void *opaque, const uint8_t *buffer, int bufferSize), +#else int(*write)(void *opaque, uint8_t *buffer, int bufferSize), +#endif int64_t(*seek)(void *opaque, int64_t offset, int whence)); struct CodecDeleter { diff --git a/Telegram/SourceFiles/media/audio/media_audio_capture.cpp b/Telegram/SourceFiles/media/audio/media_audio_capture.cpp index b9151db2a..1bbf9b10c 100644 --- a/Telegram/SourceFiles/media/audio/media_audio_capture.cpp +++ b/Telegram/SourceFiles/media/audio/media_audio_capture.cpp @@ -249,7 +249,11 @@ struct Instance::Inner::Private { return nbytes; } +#if DA_FFMPEG_CONST_WRITE_CALLBACK + static int WriteData(void *opaque, const uint8_t *buf, int buf_size) { +#else static int WriteData(void *opaque, uint8_t *buf, int buf_size) { +#endif auto l = reinterpret_cast(opaque); if (buf_size <= 0) return 0; diff --git a/Telegram/SourceFiles/media/clip/media_clip_ffmpeg.cpp b/Telegram/SourceFiles/media/clip/media_clip_ffmpeg.cpp index 9f1c7b234..1188f0232 100644 --- a/Telegram/SourceFiles/media/clip/media_clip_ffmpeg.cpp +++ b/Telegram/SourceFiles/media/clip/media_clip_ffmpeg.cpp @@ -144,7 +144,11 @@ ReaderImplementation::ReadResult FFMpegReaderImplementation::readNextFrame() { } void FFMpegReaderImplementation::processReadFrame() { +#if DA_FFMPEG_HAVE_DURATION + int64 duration = _frame->duration; +#else int64 duration = _frame->pkt_duration; +#endif int64 framePts = _frame->pts; crl::time frameMs = (framePts * 1000LL * _fmtContext->streams[_streamId]->time_base.num) / _fmtContext->streams[_streamId]->time_base.den; _currentFrameDelay = _nextFrameDelay;