diff --git a/kodi-gbm/.footprint b/kodi-gbm/.footprint index 3a83fa23a..a10709a5a 100644 --- a/kodi-gbm/.footprint +++ b/kodi-gbm/.footprint @@ -248,7 +248,7 @@ drwxr-xr-x root/root usr/share/icons/hicolor/64x64/apps/ -rw-r--r-- root/root usr/share/icons/hicolor/64x64/apps/kodi.png drwxr-xr-x root/root usr/share/icons/hicolor/scalable/ drwxr-xr-x root/root usr/share/icons/hicolor/scalable/apps/ --rw-r--r-- root/root usr/share/icons/hicolor/scalable/apps/kodi.png +-rw-r--r-- root/root usr/share/icons/hicolor/scalable/apps/kodi.svg drwxr-xr-x root/root usr/share/kodi/ drwxr-xr-x root/root usr/share/kodi/addons/ drwxr-xr-x root/root usr/share/kodi/addons/audioencoder.kodi.builtin.aac/ @@ -2245,6 +2245,7 @@ drwxr-xr-x root/root usr/share/kodi/addons/resource.language.en_gb/ drwxr-xr-x root/root usr/share/kodi/addons/resource.language.en_gb/resources/ -rw-r--r-- root/root usr/share/kodi/addons/resource.language.en_gb/resources/langinfo.xml -rw-r--r-- root/root usr/share/kodi/addons/resource.language.en_gb/resources/strings.po +-rw-r--r-- root/root usr/share/kodi/addons/resource.language.en_gb/resources/strings.po.orig drwxr-xr-x root/root usr/share/kodi/addons/resource.uisounds.kodi/ -rw-r--r-- root/root usr/share/kodi/addons/resource.uisounds.kodi/addon.xml -rw-r--r-- root/root usr/share/kodi/addons/resource.uisounds.kodi/icon.png @@ -2955,20 +2956,84 @@ drwxr-xr-x root/root usr/share/kodi/addons/webinterface.default/js/ -rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/js/kodi-webinterface.js drwxr-xr-x root/root usr/share/kodi/addons/webinterface.default/lang/ drwxr-xr-x root/root usr/share/kodi/addons/webinterface.default/lang/_strings/ +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/af.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/am.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/ar.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/ast.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/az.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/be.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/bg.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/bs.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/ca.json -rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/cs.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/cy.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/da.json -rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/de.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/el.json -rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/en.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/en_au.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/en_nz.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/en_us.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/eo.json -rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/es.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/es_ar.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/es_mx.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/et.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/eu.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/fa.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/fa_ir.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/fi.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/fo.json -rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/fr.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/fr_ca.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/gl.json -rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/gr.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/hi.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/hr.json -rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/hu.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/hy.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/id.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/is.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/it.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/iw.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/ja.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/kn.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/ko.json -rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/lt.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/lv.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/mi.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/mk.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/ml.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/mn.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/ms.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/mt.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/my.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/nb.json -rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/nl.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/oc_fr.json -rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/pl.json -rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/pt.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/pt_br.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/ro.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/ru.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/si.json -rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/sk.json --rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/zh_hans.json --rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/zh_hant.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/sl.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/sq.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/sr.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/sr_rs@latin.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/sv.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/szl.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/ta.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/te.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/tg.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/th.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/tr.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/uk.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/uz.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/vi.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/zh_cn.json +-rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/_strings/zh_tw.json drwxr-xr-x root/root usr/share/kodi/addons/webinterface.default/lang/de/ -rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/de/app-readme.html -rw-r--r-- root/root usr/share/kodi/addons/webinterface.default/lang/de/keybind-readme.html diff --git a/kodi-gbm/.signature b/kodi-gbm/.signature index 351c2aa61..8298fb9ef 100644 --- a/kodi-gbm/.signature +++ b/kodi-gbm/.signature @@ -1,5 +1,6 @@ untrusted comment: verify with /etc/ports/contrib.pub -RWSagIOpLGJF30Ds2jd5A6MTsh3dnSL6pJgrf/yVEsyAZych9l6OToex5L8euyAE4FMNxdr8NqH+hOTuZXTS+KzTMaO6OKn20Q0= -SHA256 (Pkgfile) = e64b59b82a04829a806db57ed4cc65d4a8afaf6e3cbf7cebeeab3591260ccfc5 -SHA256 (.footprint) = 3ece3335239560401ccd3bf79b7fe7803de11cba2ba56dd93882d86b8613e2a5 -SHA256 (xbmc-21.0-Omega.tar.gz) = 7f54c1fd8456ac46221fbc85e447362bdc209163c6cb19fca98d106560071b7c +RWSagIOpLGJF37BGpyM1Oks3VOMRsiBcAGfbk02oae0dsucXRY85Igeqmwjfn5p9C70iBdwyWKTvpa31zIE4K5nvIunFWxJAVQE= +SHA256 (Pkgfile) = ba221d3f75956abe802c68dec2ae7c1de734e838d4856e0b1b7faaae9aaf2784 +SHA256 (.footprint) = a2decb0c79f7604765d2152a6d5715f1afa0d136071235b260f022d563966c72 +SHA256 (xbmc-21.1-Omega.tar.gz) = ad6e40b0912c8318635f0501dc1f7f27ce3a29e671f2ddb608cad34babae80ef +SHA256 (24972.patch) = abcad95b0b5decba67ea4612b315a690e257cb9485ea2d5e774c012789ddf0a1 diff --git a/kodi-gbm/24972.patch b/kodi-gbm/24972.patch new file mode 100644 index 000000000..85be37f79 --- /dev/null +++ b/kodi-gbm/24972.patch @@ -0,0 +1,745 @@ +From c5a02e272ab466c91c244cec881e1c0b09d34d88 Mon Sep 17 00:00:00 2001 +From: Stephan Sundermann +Date: Thu, 11 Apr 2024 17:11:32 +0200 +Subject: [PATCH 1/7] [ffmpeg] Update to 7.0 + +--- + cmake/modules/FindFFMPEG.cmake | 16 +-- + tools/buildsteps/windows/ffmpeg_options.txt | 1 - + tools/depends/target/ffmpeg/CMakeLists.txt | 6 +- + tools/depends/target/ffmpeg/FFMPEG-VERSION | 4 +- + xbmc/cdrip/EncoderFFmpeg.cpp | 2 +- + xbmc/cdrip/EncoderFFmpeg.h | 2 +- + .../ActiveAE/ActiveAEResampleFFMPEG.cpp | 110 +++++++++--------- + .../DVDDemuxers/DVDDemuxFFmpeg.cpp | 71 +---------- + 8 files changed, 69 insertions(+), 143 deletions(-) + +diff --git a/cmake/modules/FindFFMPEG.cmake b/cmake/modules/FindFFMPEG.cmake +index 26dd6e8301da1..49f18ca9c2ad3 100644 +--- a/cmake/modules/FindFFMPEG.cmake ++++ b/cmake/modules/FindFFMPEG.cmake +@@ -168,14 +168,14 @@ if(WITH_FFMPEG) + set(REQUIRED_FFMPEG_VERSION undef) + else() + # required ffmpeg library versions +- set(REQUIRED_FFMPEG_VERSION 6.0.0) +- set(_avcodec_ver ">=60.2.100") +- set(_avfilter_ver ">=9.3.100") +- set(_avformat_ver ">=60.3.100") +- set(_avutil_ver ">=58.2.100") +- set(_postproc_ver ">=57.1.100") +- set(_swresample_ver ">=4.10.100") +- set(_swscale_ver ">=7.1.100") ++ set(REQUIRED_FFMPEG_VERSION 7.0.0) ++ set(_avcodec_ver ">=61.3.100") ++ set(_avfilter_ver ">=10.1.100") ++ set(_avformat_ver ">=61.1.100") ++ set(_avutil_ver ">=59.8.100") ++ set(_postproc_ver ">=58.1.100") ++ set(_swresample_ver ">=5.1.100") ++ set(_swscale_ver ">=8.1.100") + endif() + + # Allows building with external ffmpeg not found in system paths, +diff --git a/tools/buildsteps/windows/ffmpeg_options.txt b/tools/buildsteps/windows/ffmpeg_options.txt +index 5034ff26c4073..776c0b4b35ac0 100644 +--- a/tools/buildsteps/windows/ffmpeg_options.txt ++++ b/tools/buildsteps/windows/ffmpeg_options.txt +@@ -1,5 +1,4 @@ + --disable-avdevice +---disable-crystalhd + --disable-cuda + --disable-cuvid + --disable-devices +diff --git a/tools/depends/target/ffmpeg/CMakeLists.txt b/tools/depends/target/ffmpeg/CMakeLists.txt +index 5cadafe29485b..8924dc8c7305b 100644 +--- a/tools/depends/target/ffmpeg/CMakeLists.txt ++++ b/tools/depends/target/ffmpeg/CMakeLists.txt +@@ -92,14 +92,12 @@ elseif(CORE_SYSTEM_NAME STREQUAL android) + list(APPEND ffmpeg_conf --extra-cflags=-mno-stackrealign) + endif() + elseif(CORE_SYSTEM_NAME STREQUAL darwin_embedded) +- list(APPEND ffmpeg_conf --disable-crystalhd +- --enable-videotoolbox ++ list(APPEND ffmpeg_conf --enable-videotoolbox + --disable-filter=yadif_videotoolbox + --target-os=darwin + ) + elseif(CORE_SYSTEM_NAME STREQUAL osx) +- list(APPEND ffmpeg_conf --disable-crystalhd +- --enable-videotoolbox ++ list(APPEND ffmpeg_conf --enable-videotoolbox + --target-os=darwin + --disable-securetransport + ) +diff --git a/tools/depends/target/ffmpeg/FFMPEG-VERSION b/tools/depends/target/ffmpeg/FFMPEG-VERSION +index f2ba09402e25a..60b8887de3d17 100644 +--- a/tools/depends/target/ffmpeg/FFMPEG-VERSION ++++ b/tools/depends/target/ffmpeg/FFMPEG-VERSION +@@ -1,5 +1,5 @@ + LIBNAME=ffmpeg +-VERSION=6.0.1 ++VERSION=7.0.1 + ARCHIVE=$(LIBNAME)-$(VERSION).tar.gz +-SHA512=945e34840092dc0fd3824eb1af2be79868af2afb4fe13159b19a9bcfc464cc4d53243c13ff065199290e9393ddbf4b1c5c8abccf83a31a31d6c7490e499fd1fc ++SHA512=43b639b0bc0597e95dea2dce3e925f4b71ca8c4d9eadaef614941053e287f2d5c2e78d95413f0f7142da0f6ea1dbf443457e4fa1c2296cd8cf4081c185ed9c04 + +diff --git a/xbmc/cdrip/EncoderFFmpeg.cpp b/xbmc/cdrip/EncoderFFmpeg.cpp +index 85f5fa412e961..907d2591ddba7 100644 +--- a/xbmc/cdrip/EncoderFFmpeg.cpp ++++ b/xbmc/cdrip/EncoderFFmpeg.cpp +@@ -235,7 +235,7 @@ void CEncoderFFmpeg::SetTag(const std::string& tag, const std::string& value) + av_dict_set(&m_formatCtx->metadata, tag.c_str(), value.c_str(), 0); + } + +-int CEncoderFFmpeg::avio_write_callback(void* opaque, uint8_t* buf, int buf_size) ++int CEncoderFFmpeg::avio_write_callback(void* opaque, const uint8_t* buf, int buf_size) + { + CEncoderFFmpeg* enc = static_cast(opaque); + if (enc->Write(buf, buf_size) != buf_size) +diff --git a/xbmc/cdrip/EncoderFFmpeg.h b/xbmc/cdrip/EncoderFFmpeg.h +index 48471a4b10f70..4e9f0f5bbbad4 100644 +--- a/xbmc/cdrip/EncoderFFmpeg.h ++++ b/xbmc/cdrip/EncoderFFmpeg.h +@@ -33,7 +33,7 @@ class CEncoderFFmpeg : public CEncoder + bool Close() override; + + private: +- static int avio_write_callback(void* opaque, uint8_t* buf, int buf_size); ++ static int avio_write_callback(void* opaque, const uint8_t* buf, int buf_size); + static int64_t avio_seek_callback(void* opaque, int64_t offset, int whence); + + void SetTag(const std::string& tag, const std::string& value); +diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResampleFFMPEG.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResampleFFMPEG.cpp +index e897cbd3ea801..6fce0af9812f0 100644 +--- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResampleFFMPEG.cpp ++++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResampleFFMPEG.cpp +@@ -66,51 +66,7 @@ bool CActiveAEResampleFFMPEG::Init(SampleConfig dstConfig, SampleConfig srcConfi + AVChannelLayout dstChLayout = {}; + AVChannelLayout srcChLayout = {}; + +- av_channel_layout_from_mask(&dstChLayout, m_dst_chan_layout); +- av_channel_layout_from_mask(&srcChLayout, m_src_chan_layout); +- +- int ret = swr_alloc_set_opts2(&m_pContext, &dstChLayout, m_dst_fmt, m_dst_rate, &srcChLayout, +- m_src_fmt, m_src_rate, 0, NULL); +- +- if (ret) +- { +- CLog::Log(LOGERROR, "CActiveAEResampleFFMPEG::Init - create context failed"); +- return false; +- } +- +- if(quality == AE_QUALITY_HIGH) +- { +- av_opt_set_double(m_pContext, "cutoff", 1.0, 0); +- av_opt_set_int(m_pContext,"filter_size", 256, 0); +- } +- else if(quality == AE_QUALITY_MID) +- { +- // 0.97 is default cutoff so use (1.0 - 0.97) / 2.0 + 0.97 +- av_opt_set_double(m_pContext, "cutoff", 0.985, 0); +- av_opt_set_int(m_pContext,"filter_size", 64, 0); +- } +- else if(quality == AE_QUALITY_LOW) +- { +- av_opt_set_double(m_pContext, "cutoff", 0.97, 0); +- av_opt_set_int(m_pContext,"filter_size", 32, 0); +- } +- +- if (m_dst_fmt == AV_SAMPLE_FMT_S32 || m_dst_fmt == AV_SAMPLE_FMT_S32P) +- { +- av_opt_set_int(m_pContext, "output_sample_bits", m_dst_bits, 0); +- } +- +- // tell resampler to clamp float values +- // not required for sink stage (remapLayout == true) +- if ((m_dst_fmt == AV_SAMPLE_FMT_FLT || m_dst_fmt == AV_SAMPLE_FMT_FLTP) && +- (m_src_fmt == AV_SAMPLE_FMT_FLT || m_src_fmt == AV_SAMPLE_FMT_FLTP) && +- !remapLayout && normalize) +- { +- av_opt_set_double(m_pContext, "rematrix_maxval", 1.0, 0); +- } +- +- av_opt_set_double(m_pContext, "center_mix_level", centerMix, 0); +- ++ bool hasMatrix = false; + if (remapLayout) + { + // one-to-one mapping of channels +@@ -120,28 +76,19 @@ bool CActiveAEResampleFFMPEG::Init(SampleConfig dstConfig, SampleConfig srcConfi + m_dst_chan_layout = 0; + for (unsigned int out=0; outCount(); out++) + { +- m_dst_chan_layout += ((uint64_t)1) << out; ++ m_dst_chan_layout += static_cast(1) << out; + int idx = CAEUtil::GetAVChannelIndex((*remapLayout)[out], m_src_chan_layout); + if (idx >= 0) + { + m_rematrix[out][idx] = 1.0; + } + } +- +- av_opt_set_int(m_pContext, "out_channel_count", m_dst_channels, 0); +- av_opt_set_int(m_pContext, "out_channel_layout", m_dst_chan_layout, 0); +- +- if (swr_set_matrix(m_pContext, (const double*)m_rematrix, AE_CH_MAX) < 0) +- { +- CLog::Log(LOGERROR, "CActiveAEResampleFFMPEG::Init - setting channel matrix failed"); +- return false; +- } ++ hasMatrix = true; + } + // stereo upmix + else if (upmix && m_src_channels == 2 && m_dst_channels > 2) + { + memset(m_rematrix, 0, sizeof(m_rematrix)); +- av_channel_layout_uninit(&dstChLayout); + av_channel_layout_from_mask(&dstChLayout, m_dst_chan_layout); + for (int out=0; out(m_rematrix), AE_CH_MAX) < 0) + { + CLog::Log(LOGERROR, "CActiveAEResampleFFMPEG::Init - setting channel matrix failed"); + return false; + } + } + ++ if (quality == AE_QUALITY_HIGH) ++ { ++ av_opt_set_double(m_pContext, "cutoff", 1.0, 0); ++ av_opt_set_int(m_pContext, "filter_size", 256, 0); ++ } ++ else if (quality == AE_QUALITY_MID) ++ { ++ // 0.97 is default cutoff so use (1.0 - 0.97) / 2.0 + 0.97 ++ av_opt_set_double(m_pContext, "cutoff", 0.985, 0); ++ av_opt_set_int(m_pContext, "filter_size", 64, 0); ++ } ++ else if (quality == AE_QUALITY_LOW) ++ { ++ av_opt_set_double(m_pContext, "cutoff", 0.97, 0); ++ av_opt_set_int(m_pContext, "filter_size", 32, 0); ++ } ++ ++ if (m_dst_fmt == AV_SAMPLE_FMT_S32 || m_dst_fmt == AV_SAMPLE_FMT_S32P) ++ { ++ av_opt_set_int(m_pContext, "output_sample_bits", m_dst_bits, 0); ++ } ++ ++ // tell resampler to clamp float values ++ // not required for sink stage (remapLayout == true) ++ if ((m_dst_fmt == AV_SAMPLE_FMT_FLT || m_dst_fmt == AV_SAMPLE_FMT_FLTP) && ++ (m_src_fmt == AV_SAMPLE_FMT_FLT || m_src_fmt == AV_SAMPLE_FMT_FLTP) && !remapLayout && ++ normalize) ++ { ++ av_opt_set_double(m_pContext, "rematrix_maxval", 1.0, 0); ++ } ++ ++ av_opt_set_double(m_pContext, "center_mix_level", centerMix, 0); ++ + if(swr_init(m_pContext) < 0) + { + CLog::Log(LOGERROR, "CActiveAEResampleFFMPEG::Init - init resampler failed"); +diff --git a/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp b/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp +index 458b54114df84..3c6fccceb069f 100644 +--- a/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp ++++ b/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp +@@ -376,74 +376,7 @@ bool CDVDDemuxFFmpeg::Open(const std::shared_ptr& pInput, bool + if (iformat == nullptr) + { + // let ffmpeg decide which demuxer we have to open +- bool trySPDIFonly = (m_pInput->GetContent() == "audio/x-spdif-compressed"); +- +- if (!trySPDIFonly) +- av_probe_input_buffer(m_ioContext, &iformat, strFile.c_str(), NULL, 0, 0); +- +- // Use the more low-level code in case we have been built against an old +- // FFmpeg without the above av_probe_input_buffer(), or in case we only +- // want to probe for spdif (DTS or IEC 61937) compressed audio +- // specifically, or in case the file is a wav which may contain DTS or +- // IEC 61937 (e.g. ac3-in-wav) and we want to check for those formats. +- if (trySPDIFonly || (iformat && strcmp(iformat->name, "wav") == 0)) +- { +- AVProbeData pd; +- int probeBufferSize = 32768; +- std::unique_ptr probe_buffer (new uint8_t[probeBufferSize + AVPROBE_PADDING_SIZE]); +- +- // init probe data +- pd.buf = probe_buffer.get(); +- pd.filename = strFile.c_str(); +- +- // read data using avformat's buffers +- pd.buf_size = avio_read(m_ioContext, pd.buf, probeBufferSize); +- if (pd.buf_size <= 0) +- { +- CLog::Log(LOGERROR, "{} - error reading from input stream, {}", __FUNCTION__, +- CURL::GetRedacted(strFile)); +- return false; +- } +- memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE); +- +- // restore position again +- avio_seek(m_ioContext , 0, SEEK_SET); +- +- // the advancedsetting is for allowing the user to force outputting the +- // 44.1 kHz DTS wav file as PCM, so that an A/V receiver can decode +- // it (this is temporary until we handle 44.1 kHz passthrough properly) +- if (trySPDIFonly || (iformat && strcmp(iformat->name, "wav") == 0 && !CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_VideoPlayerIgnoreDTSinWAV)) +- { +- // check for spdif and dts +- // This is used with wav files and audio CDs that may contain +- // a DTS or AC3 track padded for S/PDIF playback. If neither of those +- // is present, we assume it is PCM audio. +- // AC3 is always wrapped in iec61937 (ffmpeg "spdif"), while DTS +- // may be just padded. +- const AVInputFormat* iformat2 = av_find_input_format("spdif"); +- if (iformat2 && iformat2->read_probe(&pd) > AVPROBE_SCORE_MAX / 4) +- { +- iformat = iformat2; +- } +- else +- { +- // not spdif or no spdif demuxer, try dts +- iformat2 = av_find_input_format("dts"); +- +- if (iformat2 && iformat2->read_probe(&pd) > AVPROBE_SCORE_MAX / 4) +- { +- iformat = iformat2; +- } +- else if (trySPDIFonly) +- { +- // not dts either, return false in case we were explicitly +- // requested to only check for S/PDIF padded compressed audio +- CLog::Log(LOGDEBUG, "{} - not spdif or dts file, falling back", __FUNCTION__); +- return false; +- } +- } +- } +- } ++ av_probe_input_buffer(m_ioContext, &iformat, strFile.c_str(), NULL, 0, 0); + + if (!iformat) + { +@@ -1353,7 +1286,7 @@ bool CDVDDemuxFFmpeg::SeekTime(double time, bool backwards, double* startpts) + + if (ret >= 0) + { +- if (m_pFormatContext->iformat->read_seek) ++ if (!(m_pFormatContext->iformat->flags & AVFMT_NOTIMESTAMPS)) + m_seekToKeyFrame = true; + m_currentPts = DVD_NOPTS_VALUE; + } + +From e8af4c24588e5e51ce7a2620610dd8ac1a3837c8 Mon Sep 17 00:00:00 2001 +From: Stephan Sundermann +Date: Thu, 11 Apr 2024 17:13:36 +0200 +Subject: [PATCH 2/7] [ffmpeg] Remove deprecated use of FF_API_INTERLACED_FRAME + +--- + .../DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp | 5 +++-- + .../VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp | 9 +++++---- + xbmc/cores/VideoPlayer/DVDCodecs/Video/VAAPI.cpp | 6 ++++-- + xbmc/cores/VideoPlayer/DVDCodecs/Video/VTB.cpp | 2 +- + 4 files changed, 13 insertions(+), 9 deletions(-) + +diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp +index eb2943bb8ccb9..4da0722d5c118 100644 +--- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp ++++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp +@@ -582,8 +582,9 @@ void CDVDVideoCodecDRMPRIME::SetPictureParams(VideoPicture* pVideoPicture) + + pVideoPicture->iRepeatPicture = 0; + pVideoPicture->iFlags = 0; +- pVideoPicture->iFlags |= m_pFrame->interlaced_frame ? DVP_FLAG_INTERLACED : 0; +- pVideoPicture->iFlags |= m_pFrame->top_field_first ? DVP_FLAG_TOP_FIELD_FIRST : 0; ++ pVideoPicture->iFlags |= m_pFrame->flags & AV_FRAME_FLAG_INTERLACED ? DVP_FLAG_INTERLACED : 0; ++ pVideoPicture->iFlags |= ++ m_pFrame->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST ? DVP_FLAG_TOP_FIELD_FIRST : 0; + pVideoPicture->iFlags |= m_pFrame->data[0] ? 0 : DVP_FLAG_DROPPED; + + if (m_codecControlFlags & DVD_CODEC_CTRL_DROP) +diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp +index d66378fa07886..9586d211e9156 100644 +--- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp ++++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp +@@ -792,12 +792,12 @@ CDVDVideoCodec::VCReturn CDVDVideoCodecFFmpeg::GetPicture(VideoPicture* pVideoPi + } + m_dropCtrl.Process(framePTS, m_pCodecContext->skip_frame > AVDISCARD_DEFAULT); + +- if (m_pDecodedFrame->key_frame) ++ if (m_pDecodedFrame->flags & AV_FRAME_FLAG_KEY) + { + m_started = true; + m_iLastKeyframe = m_pCodecContext->has_b_frames + 2; + } +- if (m_pDecodedFrame->interlaced_frame) ++ if (m_pDecodedFrame->flags & AV_FRAME_FLAG_INTERLACED) + m_interlaced = true; + else + m_interlaced = false; +@@ -1013,8 +1013,9 @@ bool CDVDVideoCodecFFmpeg::GetPictureCommon(VideoPicture* pVideoPicture) + + pVideoPicture->iRepeatPicture = 0.5 * m_pFrame->repeat_pict; + pVideoPicture->iFlags = 0; +- pVideoPicture->iFlags |= m_pFrame->interlaced_frame ? DVP_FLAG_INTERLACED : 0; +- pVideoPicture->iFlags |= m_pFrame->top_field_first ? DVP_FLAG_TOP_FIELD_FIRST: 0; ++ pVideoPicture->iFlags |= m_pFrame->flags & AV_FRAME_FLAG_INTERLACED ? DVP_FLAG_INTERLACED : 0; ++ pVideoPicture->iFlags |= ++ m_pFrame->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST ? DVP_FLAG_TOP_FIELD_FIRST : 0; + + if (m_codecControlFlags & DVD_CODEC_CTRL_DROP) + { +diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/VAAPI.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/VAAPI.cpp +index 6ace85dc9244d..cc3629d33d620 100644 +--- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/VAAPI.cpp ++++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/VAAPI.cpp +@@ -3070,8 +3070,10 @@ bool CFFmpegPostproc::AddPicture(CVaapiDecodedPicture &inPic) + m_pFilterFrameIn->height = m_config.vidHeight; + m_pFilterFrameIn->linesize[0] = image.pitches[0]; + m_pFilterFrameIn->linesize[1] = image.pitches[1]; +- m_pFilterFrameIn->interlaced_frame = (inPic.DVDPic.iFlags & DVP_FLAG_INTERLACED) ? 1 : 0; +- m_pFilterFrameIn->top_field_first = (inPic.DVDPic.iFlags & DVP_FLAG_TOP_FIELD_FIRST) ? 1 : 0; ++ if (inPic.DVDPic.iFlags & DVP_FLAG_INTERLACED) ++ m_pFilterFrameIn->flags |= AV_FRAME_FLAG_INTERLACED; ++ if (inPic.DVDPic.iFlags & DVP_FLAG_TOP_FIELD_FIRST) ++ m_pFilterFrameIn->flags |= AV_FRAME_FLAG_TOP_FIELD_FIRST; + + if (inPic.DVDPic.pts == DVD_NOPTS_VALUE) + m_pFilterFrameIn->pts = AV_NOPTS_VALUE; +diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/VTB.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/VTB.cpp +index 1f71f643d229a..567d63559d456 100644 +--- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/VTB.cpp ++++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/VTB.cpp +@@ -196,7 +196,7 @@ CDVDVideoCodec::VCReturn CDecoder::Decode(AVCodecContext* avctx, AVFrame* frame) + + if(frame) + { +- if (frame->interlaced_frame) ++ if (frame->flags & AV_FRAME_FLAG_INTERLACED) + return CDVDVideoCodec::VC_FATAL; + + if (m_renderBuffer) + +From fac94de3b9bb54b5caa116595e7e59205f504eac Mon Sep 17 00:00:00 2001 +From: Stephan Sundermann +Date: Thu, 11 Apr 2024 17:14:48 +0200 +Subject: [PATCH 3/7] [ffmpeg] Remove deprecated use of avcodec_close + +--- + xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxClient.cpp | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxClient.cpp b/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxClient.cpp +index 0cdf8c3864ac3..477a2e82ece51 100644 +--- a/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxClient.cpp ++++ b/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxClient.cpp +@@ -188,7 +188,6 @@ bool CDVDDemuxClient::ParsePacket(DemuxPacket* pkt) + if (!avcodec_open2(stream->m_context, stream->m_context->codec, nullptr)) + { + avcodec_send_packet(stream->m_context, avpkt); +- avcodec_close(stream->m_context); + } + } + av_packet_free(&avpkt); + +From a8831a58e1a05096ea8cb3f96047210e03f1e0b2 Mon Sep 17 00:00:00 2001 +From: Stephan Sundermann +Date: Thu, 11 Apr 2024 17:15:16 +0200 +Subject: [PATCH 4/7] [ffmpeg] Remove deprecated use av_stream_get_side_data + +--- + .../DVDDemuxers/DVDDemuxFFmpeg.cpp | 53 +++++++++++-------- + 1 file changed, 32 insertions(+), 21 deletions(-) + +diff --git a/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp b/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp +index 3c6fccceb069f..b63453dc707e6 100644 +--- a/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp ++++ b/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp +@@ -1650,42 +1650,49 @@ CDemuxStream* CDVDDemuxFFmpeg::AddStream(int streamIdx) + st->colorRange = pStream->codecpar->color_range; + st->hdr_type = DetermineHdrType(pStream); + +- // https://github.com/FFmpeg/FFmpeg/blob/release/5.0/doc/APIchanges +- size_t size = 0; +- uint8_t* side_data = nullptr; ++ // https://github.com/FFmpeg/FFmpeg/blob/release/7.0/doc/APIchanges ++ const AVPacketSideData* sideData = nullptr; + + if (st->hdr_type == StreamHdrType::HDR_TYPE_DOLBYVISION) + { +- side_data = av_stream_get_side_data(pStream, AV_PKT_DATA_DOVI_CONF, &size); +- if (side_data && size) ++ ++ sideData = ++ av_packet_side_data_get(pStream->codecpar->coded_side_data, ++ pStream->codecpar->nb_coded_side_data, AV_PKT_DATA_DOVI_CONF); ++ if (sideData && sideData->size) + { +- st->dovi = *reinterpret_cast(side_data); ++ st->dovi = *reinterpret_cast(sideData->data); + } + } + +- side_data = av_stream_get_side_data(pStream, AV_PKT_DATA_MASTERING_DISPLAY_METADATA, &size); +- if (side_data && size) ++ sideData = av_packet_side_data_get(pStream->codecpar->coded_side_data, ++ pStream->codecpar->nb_coded_side_data, ++ AV_PKT_DATA_MASTERING_DISPLAY_METADATA); ++ if (sideData && sideData->size) + { + st->masteringMetaData = std::make_shared( +- *reinterpret_cast(side_data)); ++ *reinterpret_cast(sideData->data)); + } + +- side_data = av_stream_get_side_data(pStream, AV_PKT_DATA_CONTENT_LIGHT_LEVEL, &size); +- if (side_data && size) ++ sideData = av_packet_side_data_get(pStream->codecpar->coded_side_data, ++ pStream->codecpar->nb_coded_side_data, ++ AV_PKT_DATA_CONTENT_LIGHT_LEVEL); ++ if (sideData && sideData->size) + { + st->contentLightMetaData = std::make_shared( +- *reinterpret_cast(side_data)); ++ *reinterpret_cast(sideData->data)); + } + +- uint8_t* displayMatrixSideData = +- av_stream_get_side_data(pStream, AV_PKT_DATA_DISPLAYMATRIX, nullptr); +- if (displayMatrixSideData) ++ sideData = av_packet_side_data_get(pStream->codecpar->coded_side_data, ++ pStream->codecpar->nb_coded_side_data, ++ AV_PKT_DATA_DISPLAYMATRIX); ++ if (sideData) + { +- const double tetha = +- av_display_rotation_get(reinterpret_cast(displayMatrixSideData)); +- if (!std::isnan(tetha)) ++ const double theta = ++ av_display_rotation_get(reinterpret_cast(sideData->data)); ++ if (!std::isnan(theta)) + { +- st->iOrientation = ((static_cast(-tetha) % 360) + 360) % 360; ++ st->iOrientation = ((static_cast(-theta) % 360) + 360) % 360; + } + } + +@@ -2508,7 +2515,9 @@ StreamHdrType CDVDDemuxFFmpeg::DetermineHdrType(AVStream* pStream) + { + StreamHdrType hdrType = StreamHdrType::HDR_TYPE_NONE; + +- if (av_stream_get_side_data(pStream, AV_PKT_DATA_DOVI_CONF, nullptr)) // DoVi ++ if (av_packet_side_data_get(pStream->codecpar->coded_side_data, ++ pStream->codecpar->nb_coded_side_data, ++ AV_PKT_DATA_DOVI_CONF)) // DoVi + hdrType = StreamHdrType::HDR_TYPE_DOLBYVISION; + else if (pStream->codecpar->color_trc == AVCOL_TRC_SMPTE2084) // HDR10 + hdrType = StreamHdrType::HDR_TYPE_HDR10; +@@ -2516,7 +2525,9 @@ StreamHdrType CDVDDemuxFFmpeg::DetermineHdrType(AVStream* pStream) + hdrType = StreamHdrType::HDR_TYPE_HLG; + // file could be SMPTE2086 which FFmpeg currently returns as unknown + // so use the presence of static metadata to detect it +- else if (av_stream_get_side_data(pStream, AV_PKT_DATA_MASTERING_DISPLAY_METADATA, nullptr)) ++ else if (av_packet_side_data_get(pStream->codecpar->coded_side_data, ++ pStream->codecpar->nb_coded_side_data, ++ AV_PKT_DATA_MASTERING_DISPLAY_METADATA)) + hdrType = StreamHdrType::HDR_TYPE_HDR10; + + return hdrType; + +From dd2f0bb85c87612fb148fde30156534826bb07eb Mon Sep 17 00:00:00 2001 +From: Stephan Sundermann +Date: Thu, 11 Apr 2024 17:15:43 +0200 +Subject: [PATCH 5/7] [ffmpeg] Remove CrystalHD hw acceleration strings + +--- + addons/resource.language.en_gb/resources/strings.po | 11 ++--------- + 1 file changed, 2 insertions(+), 9 deletions(-) + +diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po +index 53523fc9e6359..3565d2961fdaa 100644 +--- a/addons/resource.language.en_gb/resources/strings.po ++++ b/addons/resource.language.en_gb/resources/strings.po +@@ -7394,10 +7394,7 @@ msgctxt "#13427" + msgid "Allow hardware acceleration - DXVA2" + msgstr "" + +-#: system/settings/settings.xml +-msgctxt "#13428" +-msgid "Allow hardware acceleration - CrystalHD" +-msgstr "" ++#empty string with id 13428 + + #: system/settings/settings.xml + msgctxt "#13429" +@@ -19680,11 +19677,7 @@ msgctxt "#36158" + msgid "Enable DXVA2 hardware decoding of video files." + msgstr "" + +-#. Description of setting with label #13428 "Allow hardware acceleration (CrystalHD)" +-#: system/settings/settings.xml +-msgctxt "#36159" +-msgid "Enable CrystalHD decoding of video files." +-msgstr "" ++#empty string with id 36159 + + #. Description of setting with label #13429 "Allow hardware acceleration (VDADecoder)" + #: system/settings/settings.xml + +From 8be5519701fedc6ce861339942040ae06cbc0020 Mon Sep 17 00:00:00 2001 +From: Stephan Sundermann +Date: Sat, 13 Apr 2024 10:31:36 +0200 +Subject: [PATCH 6/7] [settings] Remove VideoPlayerignoredtsinwav advanced + setting + +--- + xbmc/settings/AdvancedSettings.cpp | 2 -- + xbmc/settings/AdvancedSettings.h | 1 - + 2 files changed, 3 deletions(-) + +diff --git a/xbmc/settings/AdvancedSettings.cpp b/xbmc/settings/AdvancedSettings.cpp +index c4e8d9fc58b8f..1bfccc0d49df1 100644 +--- a/xbmc/settings/AdvancedSettings.cpp ++++ b/xbmc/settings/AdvancedSettings.cpp +@@ -129,7 +129,6 @@ void CAdvancedSettings::Initialize() + return; + + m_audioApplyDrc = -1.0f; +- m_VideoPlayerIgnoreDTSinWAV = false; + + //default hold time of 25 ms, this allows a 20 hertz sine to pass undistorted + m_limiterHold = 0.025f; +@@ -580,7 +579,6 @@ void CAdvancedSettings::ParseSettingsFile(const std::string &file) + GetCustomRegexps(pAudioExcludes, m_audioExcludeFromScanRegExps); + + XMLUtils::GetFloat(pElement, "applydrc", m_audioApplyDrc); +- XMLUtils::GetBoolean(pElement, "VideoPlayerignoredtsinwav", m_VideoPlayerIgnoreDTSinWAV); + + XMLUtils::GetFloat(pElement, "limiterhold", m_limiterHold, 0.0f, 100.0f); + XMLUtils::GetFloat(pElement, "limiterrelease", m_limiterRelease, 0.001f, 100.0f); +diff --git a/xbmc/settings/AdvancedSettings.h b/xbmc/settings/AdvancedSettings.h +index 0f4c5a7871be4..9a57a7d6c919d 100644 +--- a/xbmc/settings/AdvancedSettings.h ++++ b/xbmc/settings/AdvancedSettings.h +@@ -121,7 +121,6 @@ class CAdvancedSettings : public ISettingCallback, public ISettingsHandler + + std::string m_audioDefaultPlayer; + float m_audioPlayCountMinimumPercent; +- bool m_VideoPlayerIgnoreDTSinWAV; + float m_limiterHold; + float m_limiterRelease; + + +From c5e2c85fbd8d7ceb299365c3a9a696a1fce8669a Mon Sep 17 00:00:00 2001 +From: Stephan Sundermann +Date: Sat, 13 Apr 2024 13:07:58 +0200 +Subject: [PATCH 7/7] [ffmpeg] Use new audio DTS and ATMOS profiles + +--- + .../VideoPlayer/DVDDemuxers/DVDDemux.cpp | 20 +++++++++++++------ + .../DVDInputStreams/InputStreamAddon.cpp | 9 +++------ + 2 files changed, 17 insertions(+), 12 deletions(-) + +diff --git a/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemux.cpp b/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemux.cpp +index 63fb9264a8348..e9aa468dd0bd7 100644 +--- a/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemux.cpp ++++ b/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemux.cpp +@@ -15,15 +15,15 @@ std::string CDemuxStreamAudio::GetStreamType() + std::string strInfo; + switch (codec) + { +- //! @todo: With ffmpeg >= 6.1 add new AC4 codec + case AV_CODEC_ID_AC3: + strInfo = "AC3 "; + break; ++ case AV_CODEC_ID_AC4: ++ strInfo = "AC4 "; ++ break; + case AV_CODEC_ID_EAC3: + { +- //! @todo: With ffmpeg >= 6.1 add new atmos profile case +- // "JOC" its EAC3 Atmos underlying profile, there is no standard codec name string +- if (StringUtils::Contains(codecName, "JOC")) ++ if (profile == FF_PROFILE_EAC3_DDP_ATMOS) + strInfo = "DD+ ATMOS "; + else + strInfo = "DD+ "; +@@ -31,7 +31,6 @@ std::string CDemuxStreamAudio::GetStreamType() + } + case AV_CODEC_ID_DTS: + { +- //! @todo: With ffmpeg >= 6.1 add new DTSX profile cases + switch (profile) + { + case FF_PROFILE_DTS_96_24: +@@ -49,6 +48,12 @@ std::string CDemuxStreamAudio::GetStreamType() + case FF_PROFILE_DTS_HD_HRA: + strInfo = "DTS-HD HRA "; + break; ++ case FF_PROFILE_DTS_HD_MA_X: ++ strInfo = "DTS-HD MA X "; ++ break; ++ case FF_PROFILE_DTS_HD_MA_X_IMAX: ++ strInfo = "DTS-HD MA X (IMAX) "; ++ break; + default: + strInfo = "DTS "; + break; +@@ -62,7 +67,10 @@ std::string CDemuxStreamAudio::GetStreamType() + strInfo = "MP3 "; + break; + case AV_CODEC_ID_TRUEHD: +- strInfo = "TrueHD "; ++ if (profile == FF_PROFILE_TRUEHD_ATMOS) ++ strInfo = "TrueHD ATMOS "; ++ else ++ strInfo = "TrueHD "; + break; + case AV_CODEC_ID_AAC: + { +diff --git a/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamAddon.cpp b/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamAddon.cpp +index daf66ce0cd98b..902f38ade2708 100644 +--- a/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamAddon.cpp ++++ b/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamAddon.cpp +@@ -762,14 +762,11 @@ int CInputStreamAddon::ConvertAudioCodecProfile(STREAMCODEC_PROFILE profile) + case DTSCodecProfileHDExpress: + return FF_PROFILE_DTS_EXPRESS; + case DTSCodecProfileHDMAX: +- //! @todo: with ffmpeg >= 6.1 set the appropriate profile +- return FF_PROFILE_UNKNOWN; // FF_PROFILE_DTS_HD_MA_X ++ return FF_PROFILE_DTS_HD_MA_X; + case DTSCodecProfileHDMAIMAX: +- //! @todo: with ffmpeg >= 6.1 set the appropriate profile +- return FF_PROFILE_UNKNOWN; // FF_PROFILE_DTS_HD_MA_X_IMAX ++ return FF_PROFILE_DTS_HD_MA_X_IMAX; + case DDPlusCodecProfileAtmos: +- //! @todo: with ffmpeg >= 6.1 set the appropriate profile +- return FF_PROFILE_UNKNOWN; // FF_PROFILE_EAC3_DDP_ATMOS ++ return FF_PROFILE_EAC3_DDP_ATMOS; + default: + return FF_PROFILE_UNKNOWN; + } diff --git a/kodi-gbm/Pkgfile b/kodi-gbm/Pkgfile index 81f098b82..a14115fa1 100644 --- a/kodi-gbm/Pkgfile +++ b/kodi-gbm/Pkgfile @@ -1,15 +1,16 @@ # Description: Open source home theater software, running in a gbm buffer # URL: https://kodi.tv/ # Maintainer: Tim Biermann, tbier at posteo dot de -# Depends on: crossguid dbus flatbuffers fstrcmp libass libcdio libdisplay-info libdvdread libinput libmicrohttpd libxkbcommon mesa openjdk20-jdk rapidjson spdlog swig taglib tinyxml tinyxml2 xkeyboard-config +# Depends on: crossguid dbus ffmpeg flatbuffers fstrcmp libass libcdio libdisplay-info libdvdread libinput libmicrohttpd libxkbcommon mesa openjdk20-jdk rapidjson spdlog swig taglib tinyxml tinyxml2 xkeyboard-config # Optional: alsa-lib avahi bluez dav1d libmicrohttpd libnfs libnghttp2 libva libva-vdpau-driver libxslt mariadb mysql pipewire pulseaudio name=kodi-gbm -version=21.0 +version=21.1 release=1 _codename=Omega -source=(https://github.com/xbmc/xbmc/archive/$version-$_codename/xbmc-$version-$_codename.tar.gz) +source=(https://github.com/xbmc/xbmc/archive/$version-$_codename/xbmc-$version-$_codename.tar.gz + 24972.patch) build() { # clang? {{{ @@ -49,6 +50,7 @@ build() { xbmc-$version-$_codename/tools/depends/native/TexturePacker/src/autogen.sh \ xbmc-$version-$_codename/tools/depends/native/JsonSchemaBuilder/src/autogen.sh + patch -Np1 -d xbmc-$version-$_codename -i $SRC/24972.patch cmake -S xbmc-$version-$_codename -B build -G Ninja $KODI_EXTRA \ -D CMAKE_INSTALL_PREFIX=/usr \