Permalink
Browse files

PiP: Remove the extra thread created for PiP playback.

This is no longer needed as all players are run from the main thread. By
and large, the 'playback loop' for a pip player is a no-op as the
decoding is elsewhere and the actual processing of video frames is
handled by the main player (though a small optimisation is needed for
the VideoSync).

Cherry-picked from a90960c
  • Loading branch information...
1 parent 4062695 commit 983e6d74fa9ee4a8693606bce8d9be5237a9f7d2 Mark Kendall committed May 10, 2011
Showing with 2 additions and 58 deletions.
  1. +2 −38 mythtv/libs/libmythtv/playercontext.cpp
  2. +0 −20 mythtv/libs/libmythtv/playercontext.h
@@ -23,17 +23,6 @@
const uint PlayerContext::kSMExitTimeout = 2000;
const uint PlayerContext::kMaxChannelHistory = 30;
-void PlayerThread::run(void)
-{
- if (!m_player)
- return;
-
- VERBOSE(VB_PLAYBACK, QString("PiP thread starting"));
- m_player->StartPlaying();
- exec();
- VERBOSE(VB_PLAYBACK, QString("PiP thread finishing"));
-}
-
PlayerContext::PlayerContext(const QString &inUseID) :
recUsage(inUseID), player(NULL), playerUnsafe(false), recorder(NULL),
tvchain(NULL), buffer(NULL), playingInfo(NULL),
@@ -54,7 +43,7 @@ PlayerContext::PlayerContext(const QString &inUseID) :
stateLock(QMutex::Recursive),
// pip
pipState(kPIPOff), pipRect(0,0,0,0), parentWidget(NULL), pipLocation(0),
- useNullVideo(false), playerNeedsThread(false), playerThread(NULL),
+ useNullVideo(false),
// embedding
embedWinID(0), embedBounds(0,0,0,0)
{
@@ -80,7 +69,6 @@ void PlayerContext::TeardownPlayer(void)
SetRingBuffer(NULL);
SetTVChain(NULL);
SetPlayingInfo(NULL);
- DeletePlayerThread();
}
/**
@@ -220,7 +208,6 @@ QRect PlayerContext::GetStandAlonePIPRect(void)
bool PlayerContext::StartPIPPlayer(TV *tv, TVState desiredState)
{
bool ok = false;
- playerNeedsThread = true;
if (!useNullVideo && parentWidget)
{
@@ -237,7 +224,6 @@ bool PlayerContext::StartPIPPlayer(TV *tv, TVState desiredState)
0, NULL);
}
- playerNeedsThread = false;
return ok;
}
@@ -486,17 +472,7 @@ bool PlayerContext::StartPlaying(int maxWait)
if (!player)
return false;
- DeletePlayerThread();
- if (playerNeedsThread)
- {
- playerThread = new PlayerThread(player);
- if (playerThread)
- playerThread->start();
- }
- else
- {
- player->StartPlaying();
- }
+ player->StartPlaying();
maxWait = (maxWait <= 0) ? 20000 : maxWait;
#ifdef USING_VALGRIND
@@ -525,22 +501,10 @@ bool PlayerContext::StartPlaying(int maxWait)
void PlayerContext::StopPlaying(void)
{
- DeletePlayerThread();
if (player)
player->StopPlaying();
}
-void PlayerContext::DeletePlayerThread(void)
-{
- if (playerThread)
- {
- playerThread->exit();
- playerThread->wait();
- delete playerThread;
- playerThread = NULL;
- }
-}
-
/** \fn PlayerContext::StartOSD(TV *tv)
* \brief Initializes the on screen display.
*
@@ -5,15 +5,12 @@
#include <deque>
using namespace std;
-#include <pthread.h>
-
// Qt headers
#include <QWidget>
#include <QString>
#include <QMutex>
#include <QHash>
#include <QRect>
-#include <QThread>
#include "mythdeque.h"
#include "tv.h"
@@ -45,20 +42,6 @@ typedef enum
typedef deque<QString> StringDeque;
typedef QHash<QString,QString> InfoMap;
-class PlayerThread : public QThread
-{
- Q_OBJECT
-
- public:
- PlayerThread(MythPlayer *player) : QThread(NULL), m_player(player) { }
-
- protected:
- virtual void run(void);
-
- private:
- MythPlayer *m_player;
-};
-
class MPUBLIC PlayerContext
{
public:
@@ -73,7 +56,6 @@ class MPUBLIC PlayerContext
void TeardownPlayer(void);
bool StartPlaying(int maxWait = -1);
void StopPlaying(void);
- void DeletePlayerThread(void);
bool StartOSD(TV *tv);
void UpdateTVChain(void);
bool ReloadTVChain(void);
@@ -228,8 +210,6 @@ class MPUBLIC PlayerContext
int pipLocation;
/// True iff software scaled PIP should be used
bool useNullVideo;
- bool playerNeedsThread;
- PlayerThread *playerThread;
// Embedding related
WId embedWinID; ///< Window ID when embedded in another widget

0 comments on commit 983e6d7

Please sign in to comment.