summaryrefslogtreecommitdiff
path: root/sci-libs/vtk/files/vtk-9.0.3-IO-FFMPEG-support-FFmpeg-5.0-API-changes.patch
blob: 276831d8491e20b29db6fadd17b64f63b7902f31 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
From https://gitlab.kitware.com/ben.boeckel/vtk/-/commit/bad8f3e9d0aad03e8f2aff9524cb3c5f2d10ccaf
From: Ben Boeckel <ben.boeckel@kitware.com>
Date: Fri, 28 Jan 2022 10:44:28 -0500
Subject: [PATCH] IO/FFMPEG: support FFmpeg 5.0 API changes

Fixes: #18445
--- /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.
--- 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})
--- 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");
--- a/IO/FFMPEG/vtkFFMPEGWriter.cxx
+++ b/IO/FFMPEG/vtkFFMPEGWriter.cxx
@@ -21,10 +21,17 @@
 
 extern "C"
 {
+#include <libavcodec/avcodec.h>
 #include <libavformat/avformat.h>
 #include <libswscale/swscale.h>
 }
 
+#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<AVCodecID>(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];
-- 
2.35.1