/
0002-Add-resource-release-timer-when-pausing-or-stopping-.patch
168 lines (146 loc) · 5.32 KB
/
0002-Add-resource-release-timer-when-pausing-or-stopping-.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
From 570a25bbcee641b1e2d720b540d21c3d6884ab6c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Juho=20H=C3=A4m=C3=A4l=C3=A4inen?=
<juho.hamalainen@tieto.com>
Date: Fri, 13 Jun 2014 10:29:47 +0300
Subject: [PATCH 02/15] Add resource release timer when pausing or stopping
media.
If media is paused, stopped, or end of media, if state hasn't changed to
playing state, release the resources. The idea with the timer is that if
for example media player is playing one song which ends, there won't be
release()/acquire() unnecessarily if next song is immediately set as
media and started playing.
---
.../mediaplayer/qgstreamerplayercontrol.cpp | 41 ++++++++++++++++++++++
.../mediaplayer/qgstreamerplayercontrol.h | 7 ++++
2 files changed, 48 insertions(+)
diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.cpp b/src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.cpp
index 0bfe76f2..ffb36e7e 100644
--- a/src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.cpp
+++ b/src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.cpp
@@ -48,6 +48,7 @@
#include <QtCore/qsocketnotifier.h>
#include <QtCore/qurl.h>
#include <QtCore/qdebug.h>
+#include <QTimer>
#include <sys/types.h>
#include <sys/stat.h>
@@ -56,6 +57,11 @@
//#define DEBUG_PLAYBIN
+// 2 second timeout for releasing the resources
+// Value was selected as combination of fair dice roll and personal
+// feeling when testing.
+#define RELEASE_TIMER_TIMEOUT (1000 * 2)
+
QT_BEGIN_NAMESPACE
QGstreamerPlayerControl::QGstreamerPlayerControl(QGstreamerPlayerSession *session, QObject *parent)
@@ -68,6 +74,7 @@ QGstreamerPlayerControl::QGstreamerPlayerControl(QGstreamerPlayerSession *sessio
, m_pendingSeekPosition(-1)
, m_setMediaPending(false)
, m_stream(0)
+ , m_releaseTimer(0)
{
m_resources = QMediaResourcePolicy::createResourceSet<QMediaPlayerResourceSetInterface>();
Q_ASSERT(m_resources);
@@ -105,10 +112,16 @@ QGstreamerPlayerControl::QGstreamerPlayerControl(QGstreamerPlayerSession *sessio
//so handleResourcesDenied should be processed later, otherwise it will be overwritten by state update later in playOrPause.
connect(m_resources, SIGNAL(resourcesDenied()), this, SLOT(handleResourcesDenied()), Qt::QueuedConnection);
connect(m_resources, SIGNAL(resourcesLost()), SLOT(handleResourcesLost()));
+
+ m_releaseTimer = new QTimer(this);
+ m_releaseTimer->setSingleShot(true);
+
+ connect(m_releaseTimer, SIGNAL(timeout()), this, SLOT(handleRelease()));
}
QGstreamerPlayerControl::~QGstreamerPlayerControl()
{
+ stopReleaseTimer();
QMediaResourcePolicy::destroyResourceSet(m_resources);
}
@@ -216,6 +229,7 @@ void QGstreamerPlayerControl::play()
//m_userRequestedState is needed to know that we need to resume playback when resource-policy
//regranted the resources after lost, since m_currentState will become paused when resources are
//lost.
+ stopReleaseTimer();
m_userRequestedState = QMediaPlayer::PlayingState;
playOrPause(QMediaPlayer::PlayingState);
}
@@ -225,6 +239,7 @@ void QGstreamerPlayerControl::pause()
#ifdef DEBUG_PLAYBIN
qDebug() << Q_FUNC_INFO;
#endif
+ restartReleaseTimer();
m_userRequestedState = QMediaPlayer::PausedState;
playOrPause(QMediaPlayer::PausedState);
@@ -317,6 +332,8 @@ void QGstreamerPlayerControl::stop()
}
}
+ restartReleaseTimer();
+
popAndNotifyState();
}
@@ -511,6 +528,8 @@ void QGstreamerPlayerControl::processEOS()
m_session->showPrerollFrames(false); // stop showing prerolled frames in stop state
}
+ restartReleaseTimer();
+
popAndNotifyState();
}
@@ -623,4 +642,26 @@ void QGstreamerPlayerControl::popAndNotifyState()
}
}
+void QGstreamerPlayerControl::restartReleaseTimer()
+{
+ stopReleaseTimer();
+ m_releaseTimer->start(RELEASE_TIMER_TIMEOUT);
+}
+
+void QGstreamerPlayerControl::stopReleaseTimer()
+{
+ m_releaseTimer->stop();
+}
+
+void QGstreamerPlayerControl::handleRelease()
+{
+ if (m_currentState != QMediaPlayer::PlayingState ||
+ m_mediaStatus == QMediaPlayer::EndOfMedia) {
+#ifdef DEBUG_PLAYBIN
+ qDebug() << "handleRelease currentState " << m_currentState << " mediaStatus " << m_mediaStatus;
+#endif
+ m_resources->release();
+ }
+}
+
QT_END_NAMESPACE
diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.h b/src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.h
index 6067a68f..b2cf7262 100644
--- a/src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.h
+++ b/src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.h
@@ -42,6 +42,7 @@
#include <QtCore/qobject.h>
#include <QtCore/qstack.h>
+#include <QTimer>
#include <qmediaplayercontrol.h>
#include <qmediaplayer.h>
@@ -116,12 +117,17 @@ private Q_SLOTS:
void handleResourcesLost();
void handleResourcesDenied();
+ void handleRelease();
+
private:
void playOrPause(QMediaPlayer::State state);
void pushState();
void popAndNotifyState();
+ void restartReleaseTimer();
+ void stopReleaseTimer();
+
QGstreamerPlayerSession *m_session;
QMediaPlayer::State m_userRequestedState;
QMediaPlayer::State m_currentState;
@@ -136,6 +142,7 @@ private:
QIODevice *m_stream;
QMediaPlayerResourceSetInterface *m_resources;
+ QTimer *m_releaseTimer;
};
QT_END_NAMESPACE
--
2.15.0