diff --git a/Telegram/SourceFiles/ffmpeg/ffmpeg_frame_generator.cpp b/Telegram/SourceFiles/ffmpeg/ffmpeg_frame_generator.cpp index 116d998a2a..de478b784b 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 2a42d0034c..0f7083df36 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 bc9c8764b9..d96daa9c79 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 b9151db2a0..1bbf9b10c2 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 9f1c7b2349..1188f02324 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;