summaryrefslogtreecommitdiff
path: root/games-emulation/ppsspp/files/ppsspp-1.17.1-avcodec-18825.patch
blob: a3003660dd74e5fece8cf80f812daef8839c266a (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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
From a8ae43dfd4f06a48a275a684aafee021e591d75e Mon Sep 17 00:00:00 2001
From: Andrew Udvare <audvare@gmail.com>
Date: Sun, 4 Feb 2024 18:26:06 -0500
Subject: [PATCH] ffmpeg: Improved fix for checking if const AVCodec* is
 necessary

---
 CMakeLists.txt             | 21 +++++++++++++++++++++
 Core/AVIDump.cpp           |  4 +---
 Core/FFMPEGCompat.h        |  8 ++++++++
 Core/HLE/sceAtrac.cpp      |  5 +----
 Core/HLE/sceMpeg.cpp       |  4 +---
 Core/HW/MediaEngine.cpp    |  4 +---
 Core/HW/SimpleAudioDec.cpp |  1 +
 Core/HW/SimpleAudioDec.h   |  7 +++----
 8 files changed, 37 insertions(+), 17 deletions(-)
 create mode 100644 Core/FFMPEGCompat.h

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 33570d09c024..f7e5ce1d337c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -953,6 +953,23 @@ if(USE_FFMPEG)
 	endif()
 
 	find_package(FFmpeg REQUIRED avcodec avformat avutil swresample swscale)
+	# Check if we need to use avcodec_(alloc|free)_frame instead of av_frame_(alloc|free)
+	# Check if we need to use const AVCodec
+	set(CMAKE_REQUIRED_LIBRARIES avcodec;avformat)
+	set(CMAKE_REQUIRED_FLAGS "-pedantic -Wall -Werror -Wno-unused-variable")
+	check_cxx_source_compiles("extern \"C\" {
+		#include <libavcodec/avcodec.h>
+		#include <libavformat/avformat.h>
+		}
+		static AVCodecContext *s_codec_context = NULL;
+		int main() {
+			const AVCodec *codec = avcodec_find_encoder(s_codec_context->codec_id);
+			return 0;
+		}
+		" HAVE_LIBAVCODEC_CONST_AVCODEC FAIL_REGEX "invalid conversion")
+
+	# Check if we need to use avcodec_alloc_context3 instead of stream->codec
+	# Check if we need to use av_frame_get_buffer instead of avcodec_default_get_buffer
 endif(USE_FFMPEG)
 
 find_package(ZLIB)
@@ -2024,6 +2041,7 @@ add_library(${CoreLibName} ${CoreLinkType}
 	Core/ELF/PrxDecrypter.h
 	Core/ELF/ParamSFO.cpp
 	Core/ELF/ParamSFO.h
+	Core/FFMPEGCompat.h
 	Core/FileSystems/tlzrc.cpp
 	Core/FileSystems/BlobFileSystem.cpp
 	Core/FileSystems/BlobFileSystem.h
@@ -2358,6 +2376,9 @@ target_compile_features(${CoreLibName} PUBLIC cxx_std_17)
 
 if(FFmpeg_FOUND)
 	target_compile_definitions(${CoreLibName} PRIVATE USE_FFMPEG=1)
+	if (HAVE_LIBAVCODEC_CONST_AVCODEC)
+		target_compile_definitions(${CoreLibName} PRIVATE HAVE_LIBAVCODEC_CONST_AVCODEC=1)
+	endif()
 	set_target_properties(${CoreLibName} PROPERTIES NO_SYSTEM_FROM_IMPORTED true)
 	target_include_directories(${CoreLibName} BEFORE PUBLIC ${FFmpeg_INCLUDE_avcodec})
 	target_link_libraries(${CoreLibName}
diff --git a/Core/AVIDump.cpp b/Core/AVIDump.cpp
index 7c9576d2922b..aa811650314d 100644
--- a/Core/AVIDump.cpp
+++ b/Core/AVIDump.cpp
@@ -45,9 +45,7 @@ extern "C" {
 #define av_frame_free avcodec_free_frame
 #endif
 
-#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(59, 16, 100)
-#define AVCodec const AVCodec
-#endif
+#include "FFMPEGCompat.h"
 
 static AVFormatContext *s_format_context = nullptr;
 static AVCodecContext *s_codec_context = nullptr;
diff --git a/Core/FFMPEGCompat.h b/Core/FFMPEGCompat.h
new file mode 100644
index 000000000000..fed3b1c85392
--- /dev/null
+++ b/Core/FFMPEGCompat.h
@@ -0,0 +1,8 @@
+#ifndef FFMPEG_COMPAT_H
+#define FFMPEG_COMPAT_H
+
+#ifdef HAVE_LIBAVCODEC_CONST_AVCODEC
+#define AVCodec const AVCodec
+#endif
+
+#endif // FFMPEG_COMPAT_H
diff --git a/Core/HLE/sceAtrac.cpp b/Core/HLE/sceAtrac.cpp
index fe0e8a54de6b..f83d9ffdf166 100644
--- a/Core/HLE/sceAtrac.cpp
+++ b/Core/HLE/sceAtrac.cpp
@@ -129,10 +129,7 @@ extern "C" {
 #include "libavcodec/avcodec.h"
 #include "libavutil/version.h"
 }
-
-#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(59, 16, 100)
-#define AVCodec const AVCodec
-#endif
+#include "Core/FFMPEGCompat.h"
 
 #endif // USE_FFMPEG
 
diff --git a/Core/HLE/sceMpeg.cpp b/Core/HLE/sceMpeg.cpp
index d050d62f3d73..8be78c73e0f8 100644
--- a/Core/HLE/sceMpeg.cpp
+++ b/Core/HLE/sceMpeg.cpp
@@ -113,9 +113,7 @@ extern "C" {
 #include "libswscale/swscale.h"
 #include "libavcodec/avcodec.h"
 }
-#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(59, 16, 100)
-#define AVCodec const AVCodec
-#endif
+#include "Core/FFMPEGCompat.h"
 static AVPixelFormat pmp_want_pix_fmt;
 
 #endif
diff --git a/Core/HW/MediaEngine.cpp b/Core/HW/MediaEngine.cpp
index 0ed957edfd26..7e8b37d4dc9b 100644
--- a/Core/HW/MediaEngine.cpp
+++ b/Core/HW/MediaEngine.cpp
@@ -56,9 +56,7 @@ extern "C" {
 
 #ifdef USE_FFMPEG
 
-#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(59, 16, 100)
-#define AVCodec const AVCodec
-#endif
+#include "Core/FFMPEGCompat.h"
 
 static AVPixelFormat getSwsFormat(int pspFormat)
 {
diff --git a/Core/HW/SimpleAudioDec.cpp b/Core/HW/SimpleAudioDec.cpp
index 7994a7f4027a..80397bf6da0a 100644
--- a/Core/HW/SimpleAudioDec.cpp
+++ b/Core/HW/SimpleAudioDec.cpp
@@ -33,6 +33,7 @@ extern "C" {
 #include "libavutil/samplefmt.h"
 #include "libavcodec/avcodec.h"
 }
+#include "Core/FFMPEGCompat.h"
 
 #endif  // USE_FFMPEG
 
diff --git a/Core/HW/SimpleAudioDec.h b/Core/HW/SimpleAudioDec.h
index 52a78bf3b411..9bf2427a4a15 100644
--- a/Core/HW/SimpleAudioDec.h
+++ b/Core/HW/SimpleAudioDec.h
@@ -33,10 +33,6 @@ extern "C" {
 #include "libavutil/version.h"
 };
 
-#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(59, 16, 100)
-#define AVCodec const AVCodec
-#endif
-
 #endif
 
 // Wraps FFMPEG for audio decoding in a nice interface.
@@ -90,6 +86,9 @@ class SimpleAudio {
 	int wanted_resample_freq; // wanted resampling rate/frequency
 
 	AVFrame *frame_;
+#if HAVE_LIBAVCODEC_CONST_AVCODEC // USE_FFMPEG is implied
+	const
+#endif
 	AVCodec *codec_;
 	AVCodecContext  *codecCtx_;
 	SwrContext      *swrCtx_;