diff options
Diffstat (limited to 'package')
22 files changed, 650 insertions, 752 deletions
diff --git a/package/kodi/Makefile b/package/kodi/Makefile index 534269dc8..ce9869ea4 100644 --- a/package/kodi/Makefile +++ b/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 diff --git a/package/kodi/patches/ffmpeg7-debian.patch b/package/kodi/patches/ffmpeg7-debian.patch deleted file mode 100644 index 0c1e6851a..000000000 --- a/package/kodi/patches/ffmpeg7-debian.patch +++ /dev/null @@ -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; - } - - diff --git a/package/kodi/patches/patch-CMakeLists_txt b/package/kodi/patches/patch-CMakeLists_txt index 7fa65595b..492db43fa 100644 --- a/package/kodi/patches/patch-CMakeLists_txt +++ b/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 diff --git a/package/kodi/patches/patch-CMakeLists_txt.orig b/package/kodi/patches/patch-CMakeLists_txt.orig new file mode 100644 index 000000000..7fa65595b --- /dev/null +++ b/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}) diff --git a/package/kodi/patches/patch-addons_resource_language_en_gb_resources_strings_po b/package/kodi/patches/patch-addons_resource_language_en_gb_resources_strings_po new file mode 100644 index 000000000..0bd666de5 --- /dev/null +++ b/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 diff --git a/package/kodi/patches/patch-cmake_modules_FindFFMPEG_cmake b/package/kodi/patches/patch-cmake_modules_FindFFMPEG_cmake new file mode 100644 index 000000000..7fec44671 --- /dev/null +++ b/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, diff --git a/package/kodi/patches/patch-tools_buildsteps_windows_ffmpeg_options_txt b/package/kodi/patches/patch-tools_buildsteps_windows_ffmpeg_options_txt new file mode 100644 index 000000000..45689bb24 --- /dev/null +++ b/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 diff --git a/package/kodi/patches/patch-tools_depends_target_ffmpeg_FFMPEG-VERSION b/package/kodi/patches/patch-tools_depends_target_ffmpeg_FFMPEG-VERSION new file mode 100644 index 000000000..4c4dab53d --- /dev/null +++ b/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 + diff --git a/package/kodi/patches/patch-xbmc_cdrip_EncoderFFmpeg_cpp b/package/kodi/patches/patch-xbmc_cdrip_EncoderFFmpeg_cpp new file mode 100644 index 000000000..c77a69631 --- /dev/null +++ b/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) diff --git a/package/kodi/patches/patch-xbmc_cdrip_EncoderFFmpeg_h b/package/kodi/patches/patch-xbmc_cdrip_EncoderFFmpeg_h new file mode 100644 index 000000000..2c58fe3a2 --- /dev/null +++ b/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); diff --git a/package/kodi/patches/patch-xbmc_cores_AudioEngine_Engines_ActiveAE_ActiveAEResampleFFMPEG_cpp b/package/kodi/patches/patch-xbmc_cores_AudioEngine_Engines_ActiveAE_ActiveAEResampleFFMPEG_cpp new file mode 100644 index 000000000..b1ac0c853 --- /dev/null +++ b/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"); diff --git a/package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDCodecs_Video_DVDVideoCodecDRMPRIME_cpp b/package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDCodecs_Video_DVDVideoCodecDRMPRIME_cpp new file mode 100644 index 000000000..be8c94499 --- /dev/null +++ b/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) diff --git a/package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDCodecs_Video_DVDVideoCodecFFmpeg_cpp b/package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDCodecs_Video_DVDVideoCodecFFmpeg_cpp new file mode 100644 index 000000000..55c295130 --- /dev/null +++ b/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) + { diff --git a/package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDCodecs_Video_VAAPI_cpp b/package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDCodecs_Video_VAAPI_cpp new file mode 100644 index 000000000..645d15bd4 --- /dev/null +++ b/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; diff --git a/package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDCodecs_Video_VTB_cpp b/package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDCodecs_Video_VTB_cpp new file mode 100644 index 000000000..4b9814b4e --- /dev/null +++ b/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) diff --git a/package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDDemuxers_DVDDemuxClient_cpp b/package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDDemuxers_DVDDemuxClient_cpp new file mode 100644 index 000000000..ee898242e --- /dev/null +++ b/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); diff --git a/package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDDemuxers_DVDDemuxFFmpeg_cpp b/package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDDemuxers_DVDDemuxFFmpeg_cpp new file mode 100644 index 000000000..a0777d0f4 --- /dev/null +++ b/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; diff --git a/package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDDemuxers_DVDDemux_cpp b/package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDDemuxers_DVDDemux_cpp new file mode 100644 index 000000000..35ec99aac --- /dev/null +++ b/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: + { diff --git a/package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDInputStreams_InputStreamAddon_cpp b/package/kodi/patches/patch-xbmc_cores_VideoPlayer_DVDInputStreams_InputStreamAddon_cpp new file mode 100644 index 000000000..cc89afba7 --- /dev/null +++ b/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; + } diff --git a/package/kodi/patches/patch-xbmc_filesystem_CurlFile_cpp b/package/kodi/patches/patch-xbmc_filesystem_CurlFile_cpp new file mode 100644 index 000000000..42b47bad5 --- /dev/null +++ b/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, + }; diff --git a/package/kodi/patches/patch-xbmc_settings_AdvancedSettings_cpp b/package/kodi/patches/patch-xbmc_settings_AdvancedSettings_cpp new file mode 100644 index 000000000..b476d6b12 --- /dev/null +++ b/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); diff --git a/package/kodi/patches/patch-xbmc_settings_AdvancedSettings_h b/package/kodi/patches/patch-xbmc_settings_AdvancedSettings_h new file mode 100644 index 000000000..7d732d373 --- /dev/null +++ b/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; + |