ffmpeg: Improved fix for checking if const AVCodec* is necessary

This commit is contained in:
Andrew Udvare 2024-02-04 18:26:06 -05:00
parent f65c84f4cb
commit 930b7f644d
8 changed files with 38 additions and 17 deletions

View File

@ -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/")
@ -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)
@ -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
@ -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}

View File

@ -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;

8
Core/FFMPEGCompat.h Normal file
View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)
{

View File

@ -33,6 +33,7 @@ extern "C" {
#include "libavutil/samplefmt.h"
#include "libavcodec/avcodec.h"
}
#include "Core/FFMPEGCompat.h"
#endif // USE_FFMPEG

View File

@ -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 @@ private:
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_;