Skip to content

Commit

Permalink
ffmpeg: Improved fix for checking if const AVCodec* is necessary
Browse files Browse the repository at this point in the history
  • Loading branch information
Tatsh committed Feb 5, 2024
1 parent f65c84f commit 930b7f6
Show file tree
Hide file tree
Showing 8 changed files with 38 additions and 17 deletions.
22 changes: 22 additions & 0 deletions CMakeLists.txt
Expand Up @@ -116,6 +116,7 @@ if(NOT IOS)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/sdl)
endif()

include(CheckCXXSourceCompiles)
include(GNUInstallDirs)

add_definitions(-DASSETS_DIR="${CMAKE_INSTALL_FULL_DATADIR}/ppsspp/assets/")
Expand Down Expand Up @@ -953,6 +954,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)
Expand Down Expand Up @@ -2024,6 +2042,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
Expand Down Expand Up @@ -2358,6 +2377,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}
Expand Down
4 changes: 1 addition & 3 deletions Core/AVIDump.cpp
Expand Up @@ -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;
Expand Down
8 changes: 8 additions & 0 deletions 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
5 changes: 1 addition & 4 deletions Core/HLE/sceAtrac.cpp
Expand Up @@ -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

Expand Down
4 changes: 1 addition & 3 deletions Core/HLE/sceMpeg.cpp
Expand Up @@ -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
Expand Down
4 changes: 1 addition & 3 deletions Core/HW/MediaEngine.cpp
Expand Up @@ -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)
{
Expand Down
1 change: 1 addition & 0 deletions Core/HW/SimpleAudioDec.cpp
Expand Up @@ -33,6 +33,7 @@ extern "C" {
#include "libavutil/samplefmt.h"
#include "libavcodec/avcodec.h"
}
#include "Core/FFMPEGCompat.h"

#endif // USE_FFMPEG

Expand Down
7 changes: 3 additions & 4 deletions Core/HW/SimpleAudioDec.h
Expand Up @@ -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.
Expand Down Expand Up @@ -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_;
Expand Down

0 comments on commit 930b7f6

Please sign in to comment.