-
Notifications
You must be signed in to change notification settings - Fork 883
/
kodi-999.95-backportPR6312PR6311PR6295.patch
259 lines (222 loc) · 9.24 KB
/
kodi-999.95-backportPR6312PR6311PR6295.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
From 7f928f9f341b4321c24c58cb513edbc9107dbde2 Mon Sep 17 00:00:00 2001
From: fritsch <Peter.Fruehberger@gmail.com>
Date: Thu, 29 Jan 2015 14:55:18 +0100
Subject: [PATCH 1/5] dvdplayer: fix calculation of level when data based
---
xbmc/cores/dvdplayer/DVDPlayerVideo.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp
index f030e37..3a96bbc 100644
--- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp
+++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp
@@ -869,7 +869,7 @@ int CDVDPlayerVideo::GetLevel() const
int datasize = m_messageQueue.GetDataSize();
if (m_pVideoCodec)
datasize += m_pVideoCodec->GetDataSize();
- return min(100, (int)(100 * datasize / (m_messageQueue.GetMaxDataSize() * m_messageQueue.GetMaxTimeSize())));
+ return min(100, (int)((100.0 * datasize) / m_messageQueue.GetMaxDataSize()));
}
else
{
--
1.9.1
From 5e40b28269cf962f1585c44a2e0ff0f17d456877 Mon Sep 17 00:00:00 2001
From: Rainer Hochecker <fernetmenta@online.de>
Date: Sat, 31 Jan 2015 21:16:33 +0100
Subject: [PATCH 2/5] dvdplayer: drop dead code - IHardwareDecoder::Section
---
xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp | 6 +-----
xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h | 1 -
xbmc/cores/dvdplayer/DVDCodecs/Video/VDA.h | 1 -
3 files changed, 1 insertion(+), 7 deletions(-)
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp
index ae67480..e4b7c74 100644
--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp
@@ -451,10 +451,6 @@ int CDVDVideoCodecFFmpeg::Decode(uint8_t* pData, int iSize, double dts, double p
shared_ptr<CSingleLock> lock;
if(m_pHardware)
{
- CCriticalSection* section = m_pHardware->Section();
- if(section)
- lock = shared_ptr<CSingleLock>(new CSingleLock(*section));
-
int result;
if(pData)
result = m_pHardware->Check(m_pCodecContext);
@@ -909,4 +905,4 @@ void CDVDVideoCodecFFmpeg::DisposeHWDecoders()
m_disposeDecoders.back()->Release();
m_disposeDecoders.pop_back();
}
-}
\ No newline at end of file
+}
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h
index f18da12..ed806f8 100644
--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.h
@@ -52,7 +52,6 @@ public:
virtual unsigned GetAllowedReferences() { return 0; }
virtual bool CanSkipDeint() {return false; }
virtual const std::string Name() = 0;
- virtual CCriticalSection* Section() { return NULL; }
};
CDVDVideoCodecFFmpeg();
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDA.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDA.h
index 95adb94..5586259 100644
--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VDA.h
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VDA.h
@@ -39,7 +39,6 @@ public:
virtual int Check (AVCodecContext* avctx);
virtual void Close();
virtual const std::string Name() { return "vda"; }
- virtual CCriticalSection* Section() { return NULL; }
virtual unsigned GetAllowedReferences();
int GetBuffer(AVCodecContext *avctx, AVFrame *pic, int flags);
--
1.9.1
From 0949bda558b4dfa80bd81c828e779ef152197460 Mon Sep 17 00:00:00 2001
From: Rainer Hochecker <fernetmenta@online.de>
Date: Sat, 31 Jan 2015 22:29:11 +0100
Subject: [PATCH 3/5] dvdplayer: do not reset hw decoder if just ffmpeg
get_buffer failed
---
xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h | 1 +
xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp | 9 +++++++++
2 files changed, 10 insertions(+)
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h
index 1dd7590..909704e 100644
--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodec.h
@@ -171,6 +171,7 @@ class CDVDCodecOptions;
#define VC_USERDATA 0x00000008 // the decoder found some userdata, call Decode(NULL, 0) again to parse the rest of the data
#define VC_FLUSHED 0x00000010 // the decoder lost it's state, we need to restart decoding again
#define VC_DROPPED 0x00000020 // needed to identify if a picture was dropped
+#define VC_NOBUFFER 0x00000040 // last FFmpeg GetBuffer failed
class CDVDVideoCodec
{
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp
index e4b7c74..5ec0e9b 100644
--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp
@@ -495,6 +495,15 @@ int CDVDVideoCodecFFmpeg::Decode(uint8_t* pData, int iSize, double dts, double p
if (len < 0)
{
+ if(m_pHardware)
+ {
+ int result = m_pHardware->Check(m_pCodecContext);
+ if (result & VC_NOBUFFER)
+ {
+ result = m_pHardware->Decode(m_pCodecContext, NULL);
+ return result;
+ }
+ }
CLog::Log(LOGERROR, "%s - avcodec_decode_video returned failure", __FUNCTION__);
return VC_ERROR;
}
--
1.9.1
From 6eb4d52bf0183078cc8cbeb3f235e867066ae998 Mon Sep 17 00:00:00 2001
From: Rainer Hochecker <fernetmenta@online.de>
Date: Sun, 1 Feb 2015 07:47:12 +0100
Subject: [PATCH 4/5] VAAPI: avoid reset when running out of surfaces
---
xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp | 15 ++++++++++++---
xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h | 1 +
2 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp
index ed0b745..0f91b02 100644
--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.cpp
@@ -468,6 +468,7 @@ CDecoder::CDecoder() : m_vaapiOutput(&m_inMsgEvent)
m_vaapiConfig.contextId = VA_INVALID_ID;
m_vaapiConfig.configId = VA_INVALID_ID;
m_avctx = NULL;
+ m_getBufferError = false;
}
CDecoder::~CDecoder()
@@ -695,9 +696,9 @@ int CDecoder::FFGetBuffer(AVCodecContext *avctx, AVFrame *pic, int flags)
uint16_t decoded, processed, render;
bool vpp;
va->m_bufferStats.Get(decoded, processed, render, vpp);
- CLog::Log(LOGERROR, "VAAPI::FFGetBuffer - no surface available - dec: %d, render: %d",
+ CLog::Log(LOGWARNING, "VAAPI::FFGetBuffer - no surface available - dec: %d, render: %d",
decoded, render);
- va->m_DisplayState = VAAPI_ERROR;
+ va->m_getBufferError = true;
return -1;
}
@@ -732,6 +733,8 @@ void CDecoder::FFReleaseBuffer(uint8_t *data)
int CDecoder::Decode(AVCodecContext* avctx, AVFrame* pFrame)
{
+ m_getBufferError = false;
+
int result = Check(avctx);
if (result)
return result;
@@ -848,6 +851,7 @@ int CDecoder::Decode(AVCodecContext* avctx, AVFrame* pFrame)
int CDecoder::Check(AVCodecContext* avctx)
{
+ int ret = 0;
EDisplayState state;
{ CSingleLock lock(m_DecoderSection);
@@ -889,7 +893,12 @@ int CDecoder::Check(AVCodecContext* avctx)
else
return VC_ERROR;
}
- return 0;
+
+ if (m_getBufferError)
+ ret |= VC_NOBUFFER;
+
+ m_getBufferError = false;
+ return ret;
}
bool CDecoder::GetPicture(AVCodecContext* avctx, AVFrame* frame, DVDVideoPicture* picture)
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h
index 6b2b67a..f737edc 100644
--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/VAAPI.h
@@ -449,6 +449,7 @@ protected:
CVideoSurfaces m_videoSurfaces;
vaapi_context m_hwContext;
AVCodecContext* m_avctx;
+ bool m_getBufferError;
COutput m_vaapiOutput;
CVaapiBufferStats m_bufferStats;
--
1.9.1
From fe1f52cf795348b0a6816647acf46343b83dec4e Mon Sep 17 00:00:00 2001
From: Rainer Hochecker <fernetmenta@online.de>
Date: Sun, 1 Feb 2015 09:25:12 +0100
Subject: [PATCH 5/5] dvdplayer: avoid unwanted dropping in output stage of
video
Conflicts:
xbmc/cores/dvdplayer/DVDPlayerVideo.cpp
---
xbmc/cores/dvdplayer/DVDPlayerVideo.cpp | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp
index 3a96bbc..4556cc8 100644
--- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp
+++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp
@@ -1219,9 +1219,12 @@ int CDVDPlayerVideo::OutputPicture(const DVDVideoPicture* src, double pts)
AutoCrop(pPicture);
- int buffer = g_renderManager.WaitForBuffer(m_bStop, std::max(DVD_TIME_TO_MSEC(iSleepTime) + 500, 1));
+ int buffer = g_renderManager.WaitForBuffer(m_bStop, std::max(DVD_TIME_TO_MSEC(iSleepTime) + 500, 50));
if (buffer < 0)
+ {
+ m_droppingStats.AddOutputDropGain(pts, 1/m_fFrameRate);
return EOS_DROPPED;
+ }
ProcessOverlays(pPicture, pts);
@@ -1236,7 +1239,10 @@ int CDVDPlayerVideo::OutputPicture(const DVDVideoPicture* src, double pts)
}
if (index < 0)
+ {
+ m_droppingStats.AddOutputDropGain(pts, 1/m_fFrameRate);
return EOS_DROPPED;
+ }
g_renderManager.FlipPage(CThread::m_bStop, (iCurrentClock + iSleepTime) / DVD_TIME_BASE, pts, -1, mDisplayField);
--
1.9.1