Procházet zdrojové kódy

kodi: convert patchset with update-patches, use iconv from C library

Waldemar Brodkorb před 4 měsíci
rodič
revize
35ab361764
22 změnil soubory, kde provedl 650 přidání a 752 odebrání
  1. 3 3
      package/kodi/Makefile
  2. 0 744
      package/kodi/patches/ffmpeg7-debian.patch
  3. 5 5
      package/kodi/patches/patch-CMakeLists_txt
  4. 27 0
      package/kodi/patches/patch-CMakeLists_txt.orig
  5. 27 0
      package/kodi/patches/patch-addons_resource_language_en_gb_resources_strings_po
  6. 25 0
      package/kodi/patches/patch-cmake_modules_FindFFMPEG_cmake
  7. 8 0
      package/kodi/patches/patch-tools_buildsteps_windows_ffmpeg_options_txt
  8. 10 0
      package/kodi/patches/patch-tools_depends_target_ffmpeg_FFMPEG-VERSION
  9. 11 0
      package/kodi/patches/patch-xbmc_cdrip_EncoderFFmpeg_cpp
  10. 11 0
      package/kodi/patches/patch-xbmc_cdrip_EncoderFFmpeg_h
  11. 152 0
      package/kodi/patches/patch-xbmc_cores_AudioEngine_Engines_ActiveAE_ActiveAEResampleFFMPEG_cpp
  12. 14 0
      package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDCodecs_Video_DVDVideoCodecDRMPRIME_cpp
  13. 29 0
      package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDCodecs_Video_DVDVideoCodecFFmpeg_cpp
  14. 15 0
      package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDCodecs_Video_VAAPI_cpp
  15. 11 0
      package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDCodecs_Video_VTB_cpp
  16. 10 0
      package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDDemuxers_DVDDemuxClient_cpp
  17. 178 0
      package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDDemuxers_DVDDemuxFFmpeg_cpp
  18. 55 0
      package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDDemuxers_DVDDemux_cpp
  19. 20 0
      package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDInputStreams_InputStreamAddon_cpp
  20. 11 0
      package/kodi/patches/patch-xbmc_filesystem_CurlFile_cpp
  21. 18 0
      package/kodi/patches/patch-xbmc_settings_AdvancedSettings_cpp
  22. 10 0
      package/kodi/patches/patch-xbmc_settings_AdvancedSettings_h

+ 3 - 3
package/kodi/Makefile

@@ -15,10 +15,10 @@ PKG_DEPENDS+=		libflac libbz2 libtiff libnettle librtmp liblzo libXext
 PKG_DEPENDS+=		yajl tinyxml libsqlite libpcrecpp libncurses libpng
 PKG_DEPENDS+=		libpcre2 libcdio libfreetype libsamplerate libuuid
 PKG_DEPENDS+=		taglib libjasper libmp3lame libgpg-error giflib nghttp2
-PKG_DEPENDS+=		glib libdcadec libffmpeg libxvidcore libiconv harfbuzz
+PKG_DEPENDS+=		glib libdcadec libffmpeg libxvidcore harfbuzz
 PKG_DEPENDS+=		flatbuffers fstrcmp spdlog mesa libinput libxkbcommon
 PKG_DEPENDS+=		xkeyboard-config tinyxml2 libdisplay-info libudfread
-PKG_BUILDDEP:=		python3 libass ffmpeg rtmpdump libiconv libudfread
+PKG_BUILDDEP:=		python3 libass ffmpeg rtmpdump libudfread
 PKG_BUILDDEP+=		libmpeg2 libmad libjpeg-turbo fmt rapidjson
 PKG_BUILDDEP+=		curl flac bzip2 libtiff yajl cmake-host libdisplay-info
 PKG_BUILDDEP+=		tinyxml tinyxml2 sqlite pcre2 libcdio freetype libpng
@@ -101,7 +101,7 @@ CMAKE_FLAGS+= 		-DENABLE_CCACHE=OFF \
 			-DNATIVEPREFIX=$(STAGING_HOST_DIR)/usr \
 			-DDEPENDS_PATH=$(STAGING_TARGET_DIR)/usr \
 			-DWITH_JSONSCHEMABUILDER=$(STAGING_HOST_DIR)/usr/bin/JsonSchemaBuilder \
-			-DCMAKE_EXE_LINKER_FLAGS="-latomic -liconv" \
+			-DCMAKE_EXE_LINKER_FLAGS="-latomic" \
 			-DLIBDVDCSS_URL=$(DL_DIR)/libdvdcss-1.4.3-Next-Nexus-Alpha2-2.tar.gz \
 			-DLIBDVDNAV_URL=$(DL_DIR)/libdvdnav-6.1.1-Next-Nexus-Alpha2-2.tar.gz \
 			-DLIBDVDREAD_URL=$(DL_DIR)/libdvdread-6.1.3-Next-Nexus-Alpha2-2.tar.gz

+ 0 - 744
package/kodi/patches/ffmpeg7-debian.patch

@@ -1,744 +0,0 @@
-From 5f731d1c62ebee57c0a545fe255c53b8018ca754 Mon Sep 17 00:00:00 2001
-From: Stephan Sundermann <stephansundermann@gmail.com>
-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 6c6bf973de..6bd05e9f3d 100644
---- a/cmake/modules/FindFFMPEG.cmake
-+++ b/cmake/modules/FindFFMPEG.cmake
-@@ -163,14 +163,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 5034ff26c4..776c0b4b35 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/FFMPEG-VERSION b/tools/depends/target/ffmpeg/FFMPEG-VERSION
-index f2ba09402e..60b8887de3 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 85f5fa412e..907d2591dd 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<CEncoderFFmpeg*>(opaque);
-   if (enc->Write(buf, buf_size) != buf_size)
-diff --git a/xbmc/cdrip/EncoderFFmpeg.h b/xbmc/cdrip/EncoderFFmpeg.h
-index 48471a4b10..4e9f0f5bbb 100644
---- a/xbmc/cdrip/EncoderFFmpeg.h
-+++ b/xbmc/cdrip/EncoderFFmpeg.h
-@@ -33,7 +33,7 @@ public:
-   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 e897cbd3ea..6fce0af981 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; out<remapLayout->Count(); out++)
-     {
--      m_dst_chan_layout += ((uint64_t)1) << out;
-+      m_dst_chan_layout += static_cast<uint64_t>(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_dst_channels; out++)
-     {
-@@ -171,15 +118,64 @@ bool CActiveAEResampleFFMPEG::Init(SampleConfig dstConfig, SampleConfig srcConfi
-       }
-     }
- 
-+    hasMatrix = true;
-     av_channel_layout_uninit(&dstChLayout);
-+  }
-+
-+  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 (swr_set_matrix(m_pContext, (const double*)m_rematrix, AE_CH_MAX) < 0)
-+  if (hasMatrix)
-+  {
-+    if (swr_set_matrix(m_pContext, reinterpret_cast<const double*>(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 1aebc3dcbc..174df53f16 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<CDVDInputStream>& 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<uint8_t[]> 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;
-     }
--- 
-2.43.0
-
-
-From 17ce23505f171235ac6bfff7fbaa3a5b4bc9a8bf Mon Sep 17 00:00:00 2001
-From: Stephan Sundermann <stephansundermann@gmail.com>
-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 eb2943bb8c..4da0722d5c 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 d66378fa07..9586d211e9 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 fb7606e0d0..a62fa6273d 100644
---- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/VAAPI.cpp
-+++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/VAAPI.cpp
-@@ -3068,8 +3068,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 1f71f643d2..567d63559d 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)
--- 
-2.43.0
-
-
-From 01aa01d5c096ff7554c79493eab65dd41b00402f Mon Sep 17 00:00:00 2001
-From: Stephan Sundermann <stephansundermann@gmail.com>
-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 0cdf8c3864..477a2e82ec 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);
--- 
-2.43.0
-
-
-From b509d439c18bebcf35cc80d18a0997caf6eda8a6 Mon Sep 17 00:00:00 2001
-From: Stephan Sundermann <stephansundermann@gmail.com>
-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 174df53f16..f917bf719f 100644
---- a/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp
-+++ b/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp
-@@ -1630,42 +1630,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<AVDOVIDecoderConfigurationRecord*>(side_data);
-+            st->dovi = *reinterpret_cast<const AVDOVIDecoderConfigurationRecord*>(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<AVMasteringDisplayMetadata>(
--              *reinterpret_cast<AVMasteringDisplayMetadata*>(side_data));
-+              *reinterpret_cast<const AVMasteringDisplayMetadata*>(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<AVContentLightMetadata>(
--              *reinterpret_cast<AVContentLightMetadata*>(side_data));
-+              *reinterpret_cast<const AVContentLightMetadata*>(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<int32_t*>(displayMatrixSideData));
--          if (!std::isnan(tetha))
-+          const double theta =
-+              av_display_rotation_get(reinterpret_cast<const int32_t*>(sideData->data));
-+          if (!std::isnan(theta))
-           {
--            st->iOrientation = ((static_cast<int>(-tetha) % 360) + 360) % 360;
-+            st->iOrientation = ((static_cast<int>(-theta) % 360) + 360) % 360;
-           }
-         }
- 
-@@ -2488,7 +2495,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;
-@@ -2496,7 +2505,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;
--- 
-2.43.0
-
-
-From 5e7609bfee5e0559d6c29b01fbc4294d27168921 Mon Sep 17 00:00:00 2001
-From: Stephan Sundermann <stephansundermann@gmail.com>
-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 056b1747a0..292aae4a1b 100644
---- a/addons/resource.language.en_gb/resources/strings.po
-+++ b/addons/resource.language.en_gb/resources/strings.po
-@@ -7342,10 +7342,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"
-@@ -19502,11 +19499,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
--- 
-2.43.0
-
-
-From 813a40bb30285b1b32a7ab6e63953eb3665f051a Mon Sep 17 00:00:00 2001
-From: Stephan Sundermann <stephansundermann@gmail.com>
-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 cc06244799..4e2d6badd6 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;
-@@ -579,7 +578,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 3351caff55..8eabfe8240 100644
---- a/xbmc/settings/AdvancedSettings.h
-+++ b/xbmc/settings/AdvancedSettings.h
-@@ -120,7 +120,6 @@ class CAdvancedSettings : public ISettingCallback, public ISettingsHandler
- 
-     std::string m_audioDefaultPlayer;
-     float m_audioPlayCountMinimumPercent;
--    bool m_VideoPlayerIgnoreDTSinWAV;
-     float m_limiterHold;
-     float m_limiterRelease;
- 
--- 
-2.43.0
-
-
-From 03449b80c2e00a56912b9612afc11f3d53dd4a05 Mon Sep 17 00:00:00 2001
-From: Stephan Sundermann <stephansundermann@gmail.com>
-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 63fb9264a8..e9aa468dd0 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 daf66ce0cd..902f38ade2 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;
-   }
-
-

+ 5 - 5
package/kodi/patches/patch-CMakeLists_txt

@@ -1,6 +1,6 @@
---- xbmc-21.0b2-Omega.orig/CMakeLists.txt	2023-12-09 22:24:46.000000000 +0100
-+++ xbmc-21.0b2-Omega/CMakeLists.txt	2024-01-31 10:45:45.831435209 +0100
-@@ -178,7 +178,6 @@ endforeach()
+--- xbmc-21.2-Omega.orig/CMakeLists.txt	2025-01-15 23:14:15.000000000 +0100
++++ xbmc-21.2-Omega/CMakeLists.txt	2025-10-06 04:40:59.015473347 +0200
+@@ -184,7 +184,6 @@ endforeach()
  # Required tools. Keep in alphabetical order please
  set(required_buildtools FlatC
                          JsonSchemaBuilder
@@ -8,7 +8,7 @@
  )
  
  # Optional build tools
-@@ -468,7 +467,6 @@ endif()
+@@ -473,7 +472,6 @@ endif()
  add_custom_command(
    OUTPUT ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/${CONFIG_VAR}/gen_skin.timestamp
    COMMAND ${CMAKE_COMMAND} -DBUNDLEDIR=${_bundle_dir}
@@ -16,7 +16,7 @@
                             -P ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/GeneratedPackSkins.cmake
    COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/${CONFIG_VAR}
    COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/${CONFIG_VAR}/gen_skin.timestamp
-@@ -481,7 +479,7 @@ add_custom_target(gen_skin_pack DEPENDS
+@@ -486,7 +484,7 @@ add_custom_target(gen_skin_pack DEPENDS
  
  # Packaging target. This generates system addon, xbt creation, copy files to build tree
  add_custom_target(generate-packaging ALL

+ 27 - 0
package/kodi/patches/patch-CMakeLists_txt.orig

@@ -0,0 +1,27 @@
+--- xbmc-21.0b2-Omega.orig/CMakeLists.txt	2023-12-09 22:24:46.000000000 +0100
++++ xbmc-21.0b2-Omega/CMakeLists.txt	2024-01-31 10:45:45.831435209 +0100
+@@ -178,7 +178,6 @@ endforeach()
+ # Required tools. Keep in alphabetical order please
+ set(required_buildtools FlatC
+                         JsonSchemaBuilder
+-                        TexturePacker
+ )
+ 
+ # Optional build tools
+@@ -468,7 +467,6 @@ endif()
+ add_custom_command(
+   OUTPUT ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/${CONFIG_VAR}/gen_skin.timestamp
+   COMMAND ${CMAKE_COMMAND} -DBUNDLEDIR=${_bundle_dir}
+-                           -DTEXTUREPACKER_EXECUTABLE=$<TARGET_FILE:TexturePacker::TexturePacker::Executable>
+                            -P ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/GeneratedPackSkins.cmake
+   COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/${CONFIG_VAR}
+   COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/${CONFIG_VAR}/gen_skin.timestamp
+@@ -481,7 +479,7 @@ add_custom_target(gen_skin_pack DEPENDS
+ 
+ # Packaging target. This generates system addon, xbt creation, copy files to build tree
+ add_custom_target(generate-packaging ALL
+-                  DEPENDS TexturePacker::TexturePacker::Executable export-files gen_skin_pack gen_system_addons)
++                  DEPENDS export-files gen_skin_pack gen_system_addons)
+ # Make sure we build any libs before we look to export-files.
+ # We may need to export some shared libs/data (eg Python)
+ add_dependencies(export-files ${GLOBAL_TARGET_DEPS})

+ 27 - 0
package/kodi/patches/patch-addons_resource_language_en_gb_resources_strings_po

@@ -0,0 +1,27 @@
+--- xbmc-21.2-Omega.orig/addons/resource.language.en_gb/resources/strings.po	2025-01-15 23:14:15.000000000 +0100
++++ xbmc-21.2-Omega/addons/resource.language.en_gb/resources/strings.po	2025-10-06 04:40:59.031472961 +0200
+@@ -7360,10 +7360,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"
+@@ -19519,11 +19516,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

+ 25 - 0
package/kodi/patches/patch-cmake_modules_FindFFMPEG_cmake

@@ -0,0 +1,25 @@
+--- xbmc-21.2-Omega.orig/cmake/modules/FindFFMPEG.cmake	2025-01-15 23:14:15.000000000 +0100
++++ xbmc-21.2-Omega/cmake/modules/FindFFMPEG.cmake	2025-10-06 04:40:59.031472961 +0200
+@@ -163,14 +163,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,

+ 8 - 0
package/kodi/patches/patch-tools_buildsteps_windows_ffmpeg_options_txt

@@ -0,0 +1,8 @@
+--- xbmc-21.2-Omega.orig/tools/buildsteps/windows/ffmpeg_options.txt	2025-01-15 23:14:15.000000000 +0100
++++ xbmc-21.2-Omega/tools/buildsteps/windows/ffmpeg_options.txt	2025-10-06 04:40:59.031472961 +0200
+@@ -1,5 +1,4 @@
+ --disable-avdevice
+---disable-crystalhd
+ --disable-cuda
+ --disable-cuvid
+ --disable-devices

+ 10 - 0
package/kodi/patches/patch-tools_depends_target_ffmpeg_FFMPEG-VERSION

@@ -0,0 +1,10 @@
+--- xbmc-21.2-Omega.orig/tools/depends/target/ffmpeg/FFMPEG-VERSION	2025-01-15 23:14:15.000000000 +0100
++++ xbmc-21.2-Omega/tools/depends/target/ffmpeg/FFMPEG-VERSION	2025-10-06 04:40:59.031472961 +0200
+@@ -1,5 +1,5 @@
+ LIBNAME=ffmpeg
+-VERSION=6.0.1
++VERSION=7.0.1
+ ARCHIVE=$(LIBNAME)-$(VERSION).tar.gz
+-SHA512=945e34840092dc0fd3824eb1af2be79868af2afb4fe13159b19a9bcfc464cc4d53243c13ff065199290e9393ddbf4b1c5c8abccf83a31a31d6c7490e499fd1fc
++SHA512=43b639b0bc0597e95dea2dce3e925f4b71ca8c4d9eadaef614941053e287f2d5c2e78d95413f0f7142da0f6ea1dbf443457e4fa1c2296cd8cf4081c185ed9c04
+ 

+ 11 - 0
package/kodi/patches/patch-xbmc_cdrip_EncoderFFmpeg_cpp

@@ -0,0 +1,11 @@
+--- xbmc-21.2-Omega.orig/xbmc/cdrip/EncoderFFmpeg.cpp	2025-01-15 23:14:15.000000000 +0100
++++ xbmc-21.2-Omega/xbmc/cdrip/EncoderFFmpeg.cpp	2025-10-06 04:40:59.031472961 +0200
+@@ -235,7 +235,7 @@ void CEncoderFFmpeg::SetTag(const std::s
+   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<CEncoderFFmpeg*>(opaque);
+   if (enc->Write(buf, buf_size) != buf_size)

+ 11 - 0
package/kodi/patches/patch-xbmc_cdrip_EncoderFFmpeg_h

@@ -0,0 +1,11 @@
+--- xbmc-21.2-Omega.orig/xbmc/cdrip/EncoderFFmpeg.h	2025-01-15 23:14:15.000000000 +0100
++++ xbmc-21.2-Omega/xbmc/cdrip/EncoderFFmpeg.h	2025-10-06 04:40:59.031472961 +0200
+@@ -33,7 +33,7 @@ public:
+   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);

+ 152 - 0
package/kodi/patches/patch-xbmc_cores_AudioEngine_Engines_ActiveAE_ActiveAEResampleFFMPEG_cpp

@@ -0,0 +1,152 @@
+--- xbmc-21.2-Omega.orig/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResampleFFMPEG.cpp	2025-01-15 23:14:15.000000000 +0100
++++ xbmc-21.2-Omega/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEResampleFFMPEG.cpp	2025-10-06 04:40:59.031472961 +0200
+@@ -66,51 +66,7 @@ bool CActiveAEResampleFFMPEG::Init(Sampl
+   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(Sampl
+     m_dst_chan_layout = 0;
+     for (unsigned int out=0; out<remapLayout->Count(); out++)
+     {
+-      m_dst_chan_layout += ((uint64_t)1) << out;
++      m_dst_chan_layout += static_cast<uint64_t>(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_dst_channels; out++)
+     {
+@@ -171,15 +118,64 @@ bool CActiveAEResampleFFMPEG::Init(Sampl
+       }
+     }
+ 
++    hasMatrix = true;
+     av_channel_layout_uninit(&dstChLayout);
++  }
+ 
+-    if (swr_set_matrix(m_pContext, (const double*)m_rematrix, AE_CH_MAX) < 0)
++  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 (hasMatrix)
++  {
++    if (swr_set_matrix(m_pContext, reinterpret_cast<const double*>(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");

+ 14 - 0
package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDCodecs_Video_DVDVideoCodecDRMPRIME_cpp

@@ -0,0 +1,14 @@
+--- xbmc-21.2-Omega.orig/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp	2025-01-15 23:14:15.000000000 +0100
++++ xbmc-21.2-Omega/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecDRMPRIME.cpp	2025-10-06 04:40:59.031472961 +0200
+@@ -582,8 +582,9 @@ void CDVDVideoCodecDRMPRIME::SetPictureP
+ 
+   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)

+ 29 - 0
package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDCodecs_Video_DVDVideoCodecFFmpeg_cpp

@@ -0,0 +1,29 @@
+--- xbmc-21.2-Omega.orig/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp	2025-01-15 23:14:15.000000000 +0100
++++ xbmc-21.2-Omega/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp	2025-10-06 04:40:59.031472961 +0200
+@@ -792,12 +792,12 @@ CDVDVideoCodec::VCReturn CDVDVideoCodecF
+   }
+   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::GetPictureCom
+ 
+   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)
+   {

+ 15 - 0
package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDCodecs_Video_VAAPI_cpp

@@ -0,0 +1,15 @@
+--- xbmc-21.2-Omega.orig/xbmc/cores/VideoPlayer/DVDCodecs/Video/VAAPI.cpp	2025-01-15 23:14:15.000000000 +0100
++++ xbmc-21.2-Omega/xbmc/cores/VideoPlayer/DVDCodecs/Video/VAAPI.cpp	2025-10-06 04:40:59.031472961 +0200
+@@ -3068,8 +3068,10 @@ bool CFFmpegPostproc::AddPicture(CVaapiD
+   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;

+ 11 - 0
package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDCodecs_Video_VTB_cpp

@@ -0,0 +1,11 @@
+--- xbmc-21.2-Omega.orig/xbmc/cores/VideoPlayer/DVDCodecs/Video/VTB.cpp	2025-01-15 23:14:15.000000000 +0100
++++ xbmc-21.2-Omega/xbmc/cores/VideoPlayer/DVDCodecs/Video/VTB.cpp	2025-10-06 04:40:59.031472961 +0200
+@@ -196,7 +196,7 @@ CDVDVideoCodec::VCReturn CDecoder::Decod
+ 
+   if(frame)
+   {
+-    if (frame->interlaced_frame)
++    if (frame->flags & AV_FRAME_FLAG_INTERLACED)
+       return CDVDVideoCodec::VC_FATAL;
+ 
+     if (m_renderBuffer)

+ 10 - 0
package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDDemuxers_DVDDemuxClient_cpp

@@ -0,0 +1,10 @@
+--- xbmc-21.2-Omega.orig/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxClient.cpp	2025-01-15 23:14:15.000000000 +0100
++++ xbmc-21.2-Omega/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxClient.cpp	2025-10-06 04:40:59.031472961 +0200
+@@ -188,7 +188,6 @@ bool CDVDDemuxClient::ParsePacket(DemuxP
+       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);

+ 178 - 0
package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDDemuxers_DVDDemuxFFmpeg_cpp

@@ -0,0 +1,178 @@
+--- xbmc-21.2-Omega.orig/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp	2025-01-15 23:14:15.000000000 +0100
++++ xbmc-21.2-Omega/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp	2025-10-06 04:40:59.031472961 +0200
+@@ -376,74 +376,7 @@ bool CDVDDemuxFFmpeg::Open(const std::sh
+     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<uint8_t[]> 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 ti
+ 
+     if (ret >= 0)
+     {
+-      if (m_pFormatContext->iformat->read_seek)
++      if (!(m_pFormatContext->iformat->flags & AVFMT_NOTIMESTAMPS))
+         m_seekToKeyFrame = true;
+       m_currentPts = DVD_NOPTS_VALUE;
+     }
+@@ -1697,42 +1630,49 @@ CDemuxStream* CDVDDemuxFFmpeg::AddStream
+         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<AVDOVIDecoderConfigurationRecord*>(side_data);
++            st->dovi = *reinterpret_cast<const AVDOVIDecoderConfigurationRecord*>(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<AVMasteringDisplayMetadata>(
+-              *reinterpret_cast<AVMasteringDisplayMetadata*>(side_data));
++              *reinterpret_cast<const AVMasteringDisplayMetadata*>(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<AVContentLightMetadata>(
+-              *reinterpret_cast<AVContentLightMetadata*>(side_data));
++              *reinterpret_cast<const AVContentLightMetadata*>(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<int32_t*>(displayMatrixSideData));
+-          if (!std::isnan(tetha))
++          const double theta =
++              av_display_rotation_get(reinterpret_cast<const int32_t*>(sideData->data));
++          if (!std::isnan(theta))
+           {
+-            st->iOrientation = ((static_cast<int>(-tetha) % 360) + 360) % 360;
++            st->iOrientation = ((static_cast<int>(-theta) % 360) + 360) % 360;
+           }
+         }
+ 
+@@ -2555,7 +2495,9 @@ StreamHdrType CDVDDemuxFFmpeg::Determine
+ {
+   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;
+@@ -2563,7 +2505,9 @@ StreamHdrType CDVDDemuxFFmpeg::Determine
+     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;

+ 55 - 0
package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDDemuxers_DVDDemux_cpp

@@ -0,0 +1,55 @@
+--- xbmc-21.2-Omega.orig/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemux.cpp	2025-01-15 23:14:15.000000000 +0100
++++ xbmc-21.2-Omega/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemux.cpp	2025-10-06 04:40:59.031472961 +0200
+@@ -15,15 +15,15 @@ std::string CDemuxStreamAudio::GetStream
+   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::GetStream
+     }
+     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::GetStream
+         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::GetStream
+       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:
+     {

+ 20 - 0
package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDInputStreams_InputStreamAddon_cpp

@@ -0,0 +1,20 @@
+--- xbmc-21.2-Omega.orig/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamAddon.cpp	2025-01-15 23:14:15.000000000 +0100
++++ xbmc-21.2-Omega/xbmc/cores/VideoPlayer/DVDInputStreams/InputStreamAddon.cpp	2025-10-06 04:40:59.031472961 +0200
+@@ -762,14 +762,11 @@ int CInputStreamAddon::ConvertAudioCodec
+     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;
+   }

+ 11 - 0
package/kodi/patches/patch-xbmc_filesystem_CurlFile_cpp

@@ -0,0 +1,11 @@
+--- xbmc-21.2-Omega.orig/xbmc/filesystem/CurlFile.cpp	2025-01-15 23:14:15.000000000 +0100
++++ xbmc-21.2-Omega/xbmc/filesystem/CurlFile.cpp	2025-10-06 04:56:01.878205684 +0200
+@@ -44,7 +44,7 @@ using namespace std::chrono_literals;
+ 
+ #define FITS_INT(a) (((a) <= INT_MAX) && ((a) >= INT_MIN))
+ 
+-curl_proxytype proxyType2CUrlProxyType[] = {
++long proxyType2CUrlProxyType[] = {
+     CURLPROXY_HTTP,   CURLPROXY_SOCKS4,          CURLPROXY_SOCKS4A,
+     CURLPROXY_SOCKS5, CURLPROXY_SOCKS5_HOSTNAME, CURLPROXY_HTTPS,
+ };

+ 18 - 0
package/kodi/patches/patch-xbmc_settings_AdvancedSettings_cpp

@@ -0,0 +1,18 @@
+--- xbmc-21.2-Omega.orig/xbmc/settings/AdvancedSettings.cpp	2025-01-15 23:14:15.000000000 +0100
++++ xbmc-21.2-Omega/xbmc/settings/AdvancedSettings.cpp	2025-10-06 04:40:59.031472961 +0200
+@@ -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;
+@@ -579,7 +578,6 @@ void CAdvancedSettings::ParseSettingsFil
+       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);

+ 10 - 0
package/kodi/patches/patch-xbmc_settings_AdvancedSettings_h

@@ -0,0 +1,10 @@
+--- xbmc-21.2-Omega.orig/xbmc/settings/AdvancedSettings.h	2025-01-15 23:14:15.000000000 +0100
++++ xbmc-21.2-Omega/xbmc/settings/AdvancedSettings.h	2025-10-06 04:40:59.031472961 +0200
+@@ -121,7 +121,6 @@ class CAdvancedSettings : public ISettin
+ 
+     std::string m_audioDefaultPlayer;
+     float m_audioPlayCountMinimumPercent;
+-    bool m_VideoPlayerIgnoreDTSinWAV;
+     float m_limiterHold;
+     float m_limiterRelease;
+