diff --git a/NEWS b/NEWS index 1c6a2ed72..6709515f9 100644 --- a/NEWS +++ b/NEWS @@ -19,8 +19,11 @@ ver 0.24 (not yet released) * remove Haiku support ver 0.23.9 (not yet released) +* decoder + - ffmpeg: support FFmpeg 5.1 * output - pipewire: set app icon +* improve iconv detection ver 0.23.8 (2022/07/09) * storage diff --git a/python/build/libs.py b/python/build/libs.py index 0fca3daca..3409c63f6 100644 --- a/python/build/libs.py +++ b/python/build/libs.py @@ -151,8 +151,8 @@ gme = CmakeProject( ) ffmpeg = FfmpegProject( - 'http://ffmpeg.org/releases/ffmpeg-5.0.1.tar.xz', - 'ef2efae259ce80a240de48ec85ecb062cecca26e4352ffb3fda562c21a93007b', + 'http://ffmpeg.org/releases/ffmpeg-5.1.tar.xz', + '55eb6aab5ee235550fa54a33eaf8bf1b4ec66c01453182b12f6a993d75698b03', 'lib/libavcodec.a', [ '--disable-shared', '--enable-static', @@ -166,7 +166,6 @@ ffmpeg = FfmpegProject( '--disable-swscale', '--disable-postproc', '--disable-avfilter', - '--disable-lzo', '--disable-faan', '--disable-pixelutils', '--disable-network', diff --git a/src/decoder/plugins/FfmpegDecoderPlugin.cxx b/src/decoder/plugins/FfmpegDecoderPlugin.cxx index 86047f4bf..1f8d1d664 100644 --- a/src/decoder/plugins/FfmpegDecoderPlugin.cxx +++ b/src/decoder/plugins/FfmpegDecoderPlugin.cxx @@ -520,9 +520,15 @@ FfmpegDecode(DecoderClient &client, InputStream *input, return; } +#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(57, 25, 100) + const unsigned channels = codec_context->ch_layout.nb_channels; +#else + const unsigned channels = codec_context->channels; +#endif + const auto audio_format = CheckAudioFormat(codec_context->sample_rate, sample_format, - codec_context->channels); + channels); const SignedSongTime total_time = av_stream.duration != (int64_t)AV_NOPTS_VALUE @@ -632,10 +638,17 @@ FfmpegScanStream(AVFormatContext &format_context, TagHandler &handler) AV_TIME_BASE_Q)); const auto &codec_params = *stream.codecpar; + +#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(57, 25, 100) + const unsigned channels = codec_params.ch_layout.nb_channels; +#else + const unsigned channels = codec_params.channels; +#endif + try { handler.OnAudioFormat(CheckAudioFormat(codec_params.sample_rate, ffmpeg_sample_format(AVSampleFormat(codec_params.format)), - codec_params.channels)); + channels)); } catch (...) { } diff --git a/src/decoder/plugins/FfmpegIo.cxx b/src/decoder/plugins/FfmpegIo.cxx index ebf544ec4..572f1a86a 100644 --- a/src/decoder/plugins/FfmpegIo.cxx +++ b/src/decoder/plugins/FfmpegIo.cxx @@ -21,10 +21,13 @@ #define __STDC_CONSTANT_MACROS #include "FfmpegIo.hxx" -#include "libavutil/mem.h" #include "../DecoderAPI.hxx" #include "input/InputStream.hxx" +extern "C" { +#include +} + AvioStream::~AvioStream() { if (io != nullptr) { diff --git a/src/lib/ffmpeg/Interleave.cxx b/src/lib/ffmpeg/Interleave.cxx index a19319dea..1afa1aa3f 100644 --- a/src/lib/ffmpeg/Interleave.cxx +++ b/src/lib/ffmpeg/Interleave.cxx @@ -37,7 +37,11 @@ InterleaveFrame(const AVFrame &frame, FfmpegBuffer &buffer) assert(frame.nb_samples > 0); const auto format = AVSampleFormat(frame.format); +#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(57, 25, 100) + const unsigned channels = frame.ch_layout.nb_channels; +#else const unsigned channels = frame.channels; +#endif const std::size_t n_frames = frame.nb_samples; int plane_size; diff --git a/src/lib/icu/meson.build b/src/lib/icu/meson.build index 6e489876b..92f9e6b1f 100644 --- a/src/lib/icu/meson.build +++ b/src/lib/icu/meson.build @@ -18,17 +18,25 @@ if icu_dep.found() 'Util.cxx', 'Init.cxx', ] -elif not get_option('iconv').disabled() - # an installed iconv library will make the builtin iconv() unavailable, - # so search for the library first and pass it as (possible) dependency - iconv_dep = compiler.find_library('libiconv', required: false) - have_iconv = compiler.has_function('iconv', - dependencies: iconv_dep, - prefix : '#include ') - if not have_iconv and get_option('iconv').enabled() - error('iconv() not available') +else + if meson.version().version_compare('>= 0.60') + iconv_dep = dependency('iconv', required: get_option('iconv')) + conf.set('HAVE_ICONV', iconv_dep.found()) + elif not get_option('iconv').disabled() + iconv_open_snippet = '''#include + int main() { + iconv_open("",""); + }''' + have_iconv = compiler.links(iconv_open_snippet, name: 'iconv_open') + if not have_iconv + iconv_dep = compiler.find_library('iconv', required: false) + have_iconv = compiler.links(iconv_open_snippet, dependencies: iconv_dep, name: 'iconv_open') + endif + if not have_iconv and get_option('iconv').enabled() + error('iconv() not available') + endif + conf.set('HAVE_ICONV', have_iconv) endif - conf.set('HAVE_ICONV', have_iconv) endif icu = static_library(