Skip to content

Commit

Permalink
PiP: Remove the extra thread created for PiP playback.
Browse files Browse the repository at this point in the history
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).
  • Loading branch information
Mark Kendall committed May 10, 2011
1 parent c65b533 commit a90960c
Show file tree
Hide file tree
Showing 2 changed files with 2 additions and 59 deletions.
40 changes: 2 additions & 38 deletions mythtv/libs/libmythtv/playercontext.cpp
Expand Up @@ -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),
Expand All @@ -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)
{
Expand All @@ -80,7 +69,6 @@ void PlayerContext::TeardownPlayer(void)
SetRingBuffer(NULL);
SetTVChain(NULL);
SetPlayingInfo(NULL);
DeletePlayerThread();
}

/**
Expand Down Expand Up @@ -213,7 +201,6 @@ QRect PlayerContext::GetStandAlonePIPRect(void)
bool PlayerContext::StartPIPPlayer(TV *tv, TVState desiredState)
{
bool ok = false;
playerNeedsThread = true;

if (!useNullVideo && parentWidget)
{
Expand All @@ -230,7 +217,6 @@ bool PlayerContext::StartPIPPlayer(TV *tv, TVState desiredState)
0, NULL);
}

playerNeedsThread = false;
return ok;
}

Expand Down Expand Up @@ -479,17 +465,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
Expand Down Expand Up @@ -518,22 +494,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;
}
}

void PlayerContext::UpdateTVChain(void)
{
QMutexLocker locker(&deletePlayerLock);
Expand Down
21 changes: 0 additions & 21 deletions mythtv/libs/libmythtv/playercontext.h
Expand Up @@ -5,16 +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 "mythtvexp.h"
#include "mythdeque.h"
#include "tv.h"
Expand Down Expand Up @@ -46,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 MTV_PUBLIC PlayerContext
{
public:
Expand All @@ -74,7 +56,6 @@ class MTV_PUBLIC PlayerContext
void TeardownPlayer(void);
bool StartPlaying(int maxWait = -1);
void StopPlaying(void);
void DeletePlayerThread(void);
void UpdateTVChain(void);
bool ReloadTVChain(void);
void CreatePIPWindow(const QRect&, int pos = -1,
Expand Down Expand Up @@ -226,8 +207,6 @@ class MTV_PUBLIC 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
Expand Down

0 comments on commit a90960c

Please sign in to comment.