1
0
mirror of https://github.com/dguglielmi/sunny-overlay.git synced 2025-12-06 20:22:38 +01:00

media-tv/kodi: fix crash with pvr.hts

This commit is contained in:
2023-09-26 22:05:52 +02:00
parent db8dd5912c
commit a588a0138a
5 changed files with 1219 additions and 1 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,36 @@
From 3ad9588656e30abd421e48147b23aee9fb4b3557 Mon Sep 17 00:00:00 2001
From: Miguel Borges de Freitas <92enen@gmail.com>
Date: Sun, 12 Feb 2023 12:08:36 +0000
Subject: [PATCH] [video] fix crash in avcodec_parameters_from_context
---
xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxClient.cpp | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxClient.cpp b/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxClient.cpp
index 9ca07b9a2dd39..26fa9522eea7a 100644
--- a/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxClient.cpp
+++ b/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxClient.cpp
@@ -162,11 +162,12 @@ bool CDVDDemuxClient::ParsePacket(DemuxPacket* pkt)
avpkt->size = pkt->iSize;
avpkt->dts = avpkt->pts = AV_NOPTS_VALUE;
- AVCodecParameters* codecPar = nullptr;
+ AVCodecParameters* codecPar = avcodec_parameters_alloc();
int ret = avcodec_parameters_from_context(codecPar, stream->m_context);
if (ret < 0)
{
CLog::LogF(LOGERROR, "avcodec_parameters_from_context failed");
+ avcodec_parameters_free(&codecPar);
return false;
}
@@ -188,7 +189,7 @@ bool CDVDDemuxClient::ParsePacket(DemuxPacket* pkt)
avcodec_close(stream->m_context);
}
}
-
+ avcodec_parameters_free(&codecPar);
av_packet_free(&avpkt);
}

View File

@@ -0,0 +1,55 @@
From 456d6557ea570f63dc18831242b9189f96c1097d Mon Sep 17 00:00:00 2001
From: Steve Hartwell <steve.hartwell@gmail.com>
Date: Sun, 12 Feb 2023 18:10:45 +0000
Subject: [PATCH] [video] use smart_ptr and custom destructor for
AVCodecParameters
Co-authored-by: Miguel Borges de Freitas <92enen@gmail.com>
---
.../cores/VideoPlayer/DVDDemuxers/DVDDemuxClient.cpp | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxClient.cpp b/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxClient.cpp
index 26fa9522eea7a..2a42244b62b68 100644
--- a/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxClient.cpp
+++ b/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxClient.cpp
@@ -14,7 +14,9 @@
#include "cores/VideoPlayer/Interface/TimingConstants.h"
#include "utils/log.h"
+#include <memory>
#include <tuple>
+#include <type_traits>
#include <utility>
class CDemuxStreamClientInternal
@@ -162,16 +164,17 @@ bool CDVDDemuxClient::ParsePacket(DemuxPacket* pkt)
avpkt->size = pkt->iSize;
avpkt->dts = avpkt->pts = AV_NOPTS_VALUE;
- AVCodecParameters* codecPar = avcodec_parameters_alloc();
- int ret = avcodec_parameters_from_context(codecPar, stream->m_context);
+ constexpr auto codecParDeleter = [](AVCodecParameters* p) { avcodec_parameters_free(&p); };
+ auto codecPar = std::unique_ptr<AVCodecParameters, decltype(codecParDeleter)>(
+ avcodec_parameters_alloc(), codecParDeleter);
+ int ret = avcodec_parameters_from_context(codecPar.get(), stream->m_context);
if (ret < 0)
{
CLog::LogF(LOGERROR, "avcodec_parameters_from_context failed");
- avcodec_parameters_free(&codecPar);
return false;
}
- auto [retExtraData, len] = GetPacketExtradata(avpkt, codecPar);
+ auto [retExtraData, len] = GetPacketExtradata(avpkt, codecPar.get());
if (len > 0)
{
st->changes++;
@@ -189,7 +192,6 @@ bool CDVDDemuxClient::ParsePacket(DemuxPacket* pkt)
avcodec_close(stream->m_context);
}
}
- avcodec_parameters_free(&codecPar);
av_packet_free(&avpkt);
}