From bad8f3e9d0aad03e8f2aff9524cb3c5f2d10ccaf Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Fri, 28 Jan 2022 10:44:28 -0500 Subject: [PATCH] IO/FFMPEG: support FFmpeg 5.0 API changes Fixes: #18445 --- Documentation/release/dev/ffmpeg-5.0.md | 3 +++ IO/FFMPEG/CMakeLists.txt | 18 +++++++++++++++-- IO/FFMPEG/vtkFFMPEGVideoSource.cxx | 4 ++-- IO/FFMPEG/vtkFFMPEGWriter.cxx | 27 +++++++++++++------------ 4 files changed, 35 insertions(+), 17 deletions(-) create mode 100644 Documentation/release/dev/ffmpeg-5.0.md diff --git a/Documentation/release/dev/ffmpeg-5.0.md b/Documentation/release/dev/ffmpeg-5.0.md new file mode 100644 index 00000000000..02ebd3ff840 --- /dev/null +++ b/Documentation/release/dev/ffmpeg-5.0.md @@ -0,0 +1,3 @@ +## FFmpeg 5.0 support + +FFmpeg 5.0 API changes are now supported. diff --git a/IO/FFMPEG/CMakeLists.txt b/IO/FFMPEG/CMakeLists.txt index f6900843ac0..ed43978cfc6 100644 --- a/IO/FFMPEG/CMakeLists.txt +++ b/IO/FFMPEG/CMakeLists.txt @@ -6,7 +6,9 @@ vtk_module_find_package( avformat avcodec avutil - swscale) + swscale + OPTIONAL_COMPONENTS + swresample) set(classes vtkFFMPEGWriter) @@ -21,6 +23,17 @@ if (NOT FFMPEG_VERSION VERSION_LESS "3.1") vtkFFMPEGVideoSource) endif () +set(ffmpeg_libraries) +if (NOT FFMPEG_VERSION VERSION_LESS "5.0") + if (NOT FFMPEG_swresample_FOUND) + message(FATAL_ERROR + "FFMPEG 5.0 requires the `swresample` library.") + endif () + + list(APPEND ffmpeg_libraries + FFMPEG::swresample) +endif () + vtk_module_add_module(VTK::IOFFMPEG CLASSES ${classes}) vtk_module_link(VTK::IOFFMPEG @@ -28,4 +41,5 @@ vtk_module_link(VTK::IOFFMPEG FFMPEG::avformat FFMPEG::avcodec FFMPEG::avutil - FFMPEG::swscale) + FFMPEG::swscale + ${ffmpeg_libraries}) diff --git a/IO/FFMPEG/vtkFFMPEGVideoSource.cxx b/IO/FFMPEG/vtkFFMPEGVideoSource.cxx index 45900ee02bc..f3169d3545d 100644 --- a/IO/FFMPEG/vtkFFMPEGVideoSource.cxx +++ b/IO/FFMPEG/vtkFFMPEGVideoSource.cxx @@ -205,7 +205,7 @@ void vtkFFMPEGVideoSource::Initialize() this->Internal->VideoStream = fcontext->streams[this->Internal->VideoStreamIndex]; - AVCodec* dec = avcodec_find_decoder(this->Internal->VideoStream->codecpar->codec_id); + const AVCodec* dec = avcodec_find_decoder(this->Internal->VideoStream->codecpar->codec_id); if (!dec) { vtkErrorMacro("Failed to find codec for video"); @@ -271,7 +271,7 @@ void vtkFFMPEGVideoSource::Initialize() { this->Internal->AudioStream = fcontext->streams[this->Internal->AudioStreamIndex]; - AVCodec* adec = avcodec_find_decoder(this->Internal->AudioStream->codecpar->codec_id); + const AVCodec* adec = avcodec_find_decoder(this->Internal->AudioStream->codecpar->codec_id); if (!adec) { vtkErrorMacro("Failed to find codec for audio"); diff --git a/IO/FFMPEG/vtkFFMPEGWriter.cxx b/IO/FFMPEG/vtkFFMPEGWriter.cxx index 5011b40f579..5d284b088ed 100644 --- a/IO/FFMPEG/vtkFFMPEGWriter.cxx +++ b/IO/FFMPEG/vtkFFMPEGWriter.cxx @@ -21,10 +21,17 @@ extern "C" { +#include #include #include } +#if LIBAVFORMAT_VERSION_MAJOR < 59 +#define vtk_ff_const59 +#else +#define vtk_ff_const59 const +#endif + #if defined(LIBAVFORMAT_VERSION_MAJOR) && LIBAVFORMAT_VERSION_MAJOR >= 57 extern "C" { @@ -51,7 +58,7 @@ private: AVFormatContext* avFormatContext; - AVOutputFormat* avOutputFormat; + vtk_ff_const59 AVOutputFormat* avOutputFormat; AVStream* avStream; @@ -115,15 +122,9 @@ int vtkFFMPEGWriterInternal::Start() return 0; } - if (this->Writer->GetCompression()) - { - // choose a codec that is easily playable on windows - this->avOutputFormat->video_codec = AV_CODEC_ID_MJPEG; - } - else - { - this->avOutputFormat->video_codec = AV_CODEC_ID_RAWVIDEO; - } + enum AVCodecID video_codec = this->Writer->GetCompression() + ? AV_CODEC_ID_MJPEG // choose a codec that is easily playable on windows + : AV_CODEC_ID_RAWVIDEO; // create the format context that wraps all of the media output structures if (avformat_alloc_output_context2( @@ -133,8 +134,8 @@ int vtkFFMPEGWriterInternal::Start() return 0; } - AVCodec* codec; - if (!(codec = avcodec_find_encoder(this->avOutputFormat->video_codec))) + vtk_ff_const59 AVCodec* codec; + if (!(codec = avcodec_find_encoder(video_codec))) { vtkGenericWarningMacro(<< "Failed to get video codec."); return 0; @@ -155,7 +156,7 @@ int vtkFFMPEGWriterInternal::Start() return 0; } - this->avStream->codecpar->codec_id = static_cast(this->avOutputFormat->video_codec); + this->avStream->codecpar->codec_id = video_codec; this->avStream->codecpar->codec_type = AVMEDIA_TYPE_VIDEO; this->avStream->codecpar->width = this->Dim[0]; this->avStream->codecpar->height = this->Dim[1]; -- GitLab