Gst player backend: removed fifo based stream playback fallback

It was used on systems without appsrc element support,
but since the appsrc is part of base elements for a long,
thre is a very little value in fifo based fallback.

Change-Id: I162233cbb55821443c892f00ebd29c0498ae7152
Reviewed-by: Ling Hu <ling.hu@nokia.com>
Reviewed-by: Michael Goddard <michael.goddard@nokia.com>
This commit is contained in:
Dmytro Poplavskiy
2012-07-19 15:40:42 +10:00
committed by Qt by Nokia
parent 6854f07257
commit f844d6d9da
3 changed files with 5 additions and 137 deletions

View File

@@ -72,14 +72,7 @@ QGstreamerPlayerControl::QGstreamerPlayerControl(QGstreamerPlayerSession *sessio
, m_pendingSeekPosition(-1) , m_pendingSeekPosition(-1)
, m_setMediaPending(false) , m_setMediaPending(false)
, m_stream(0) , m_stream(0)
, m_fifoNotifier(0)
, m_fifoCanWrite(false)
, m_bufferSize(0)
, m_bufferOffset(0)
{ {
m_fifoFd[0] = -1;
m_fifoFd[1] = -1;
m_resources = QMediaResourcePolicy::createResourceSet<QMediaPlayerResourceSetInterface>(); m_resources = QMediaResourcePolicy::createResourceSet<QMediaPlayerResourceSetInterface>();
Q_ASSERT(m_resources); Q_ASSERT(m_resources);
@@ -123,13 +116,6 @@ QGstreamerPlayerControl::QGstreamerPlayerControl(QGstreamerPlayerSession *sessio
QGstreamerPlayerControl::~QGstreamerPlayerControl() QGstreamerPlayerControl::~QGstreamerPlayerControl()
{ {
QMediaResourcePolicy::destroyResourceSet(m_resources); QMediaResourcePolicy::destroyResourceSet(m_resources);
if (m_fifoFd[0] >= 0) {
::close(m_fifoFd[0]);
::close(m_fifoFd[1]);
m_fifoFd[0] = -1;
m_fifoFd[1] = -1;
}
} }
QMediaPlayerResourceSetInterface* QGstreamerPlayerControl::resources() const QMediaPlayerResourceSetInterface* QGstreamerPlayerControl::resources() const
@@ -386,12 +372,6 @@ void QGstreamerPlayerControl::setMedia(const QMediaContent &content, QIODevice *
} }
if (m_stream) { if (m_stream) {
#if !defined(HAVE_GST_APPSRC)
closeFifo();
disconnect(m_stream, SIGNAL(readyRead()), this, SLOT(writeFifo()));
#endif
if (m_ownStream) if (m_ownStream)
delete m_stream; delete m_stream;
m_stream = 0; m_stream = 0;
@@ -423,14 +403,8 @@ void QGstreamerPlayerControl::setMedia(const QMediaContent &content, QIODevice *
QNetworkRequest request; QNetworkRequest request;
if (m_stream) { if (m_stream) {
#if !defined(HAVE_GST_APPSRC)
if (m_stream->isReadable() && openFifo()) {
request = QNetworkRequest(QUrl(QString(QLatin1String("fd://%1")).arg(m_fifoFd[0])));
}
#else
userStreamValid = stream->isOpen() && m_stream->isReadable(); userStreamValid = stream->isOpen() && m_stream->isReadable();
request = content.canonicalRequest(); request = content.canonicalRequest();
#endif
} else if (!content.isNull()) { } else if (!content.isNull()) {
request = content.canonicalRequest(); request = content.canonicalRequest();
} }
@@ -453,13 +427,6 @@ void QGstreamerPlayerControl::setMedia(const QMediaContent &content, QIODevice *
m_session->loadFromUri(request); m_session->loadFromUri(request);
#endif #endif
#if !defined(HAVE_GST_APPSRC)
if (m_fifoFd[1] >= 0) {
m_fifoCanWrite = true;
writeFifo();
}
#endif
#if defined(HAVE_GST_APPSRC) #if defined(HAVE_GST_APPSRC)
if (!request.url().isEmpty() || userStreamValid) { if (!request.url().isEmpty() || userStreamValid) {
@@ -590,98 +557,6 @@ void QGstreamerPlayerControl::setBufferProgress(int progress)
emit bufferStatusChanged(m_bufferProgress); emit bufferStatusChanged(m_bufferProgress);
} }
void QGstreamerPlayerControl::writeFifo()
{
if (m_fifoCanWrite) {
qint64 bytesToRead = qMin<qint64>(
m_stream->bytesAvailable(), PIPE_BUF - m_bufferSize);
if (bytesToRead > 0) {
int bytesRead = m_stream->read(&m_buffer[m_bufferOffset + m_bufferSize], bytesToRead);
if (bytesRead > 0)
m_bufferSize += bytesRead;
}
if (m_bufferSize > 0) {
int bytesWritten = ::write(m_fifoFd[1], &m_buffer[m_bufferOffset], size_t(m_bufferSize));
if (bytesWritten > 0) {
m_bufferOffset += bytesWritten;
m_bufferSize -= bytesWritten;
if (m_bufferSize == 0)
m_bufferOffset = 0;
} else if (errno == EAGAIN) {
m_fifoCanWrite = false;
} else {
closeFifo();
}
}
}
m_fifoNotifier->setEnabled(m_stream->bytesAvailable() > 0);
}
void QGstreamerPlayerControl::fifoReadyWrite(int socket)
{
if (socket == m_fifoFd[1]) {
m_fifoCanWrite = true;
writeFifo();
}
}
bool QGstreamerPlayerControl::openFifo()
{
Q_ASSERT(m_fifoFd[0] < 0);
Q_ASSERT(m_fifoFd[1] < 0);
if (::pipe(m_fifoFd) == 0) {
int flags = ::fcntl(m_fifoFd[1], F_GETFD);
if (::fcntl(m_fifoFd[1], F_SETFD, flags | O_NONBLOCK) >= 0) {
m_fifoNotifier = new QSocketNotifier(m_fifoFd[1], QSocketNotifier::Write);
connect(m_fifoNotifier, SIGNAL(activated(int)), this, SLOT(fifoReadyWrite(int)));
return true;
} else {
qWarning("Failed to make pipe non blocking %d", errno);
::close(m_fifoFd[0]);
::close(m_fifoFd[1]);
m_fifoFd[0] = -1;
m_fifoFd[1] = -1;
return false;
}
} else {
qWarning("Failed to create pipe %d", errno);
return false;
}
}
void QGstreamerPlayerControl::closeFifo()
{
if (m_fifoFd[0] >= 0) {
delete m_fifoNotifier;
m_fifoNotifier = 0;
::close(m_fifoFd[0]);
::close(m_fifoFd[1]);
m_fifoFd[0] = -1;
m_fifoFd[1] = -1;
m_fifoCanWrite = false;
m_bufferSize = 0;
m_bufferOffset = 0;
}
}
void QGstreamerPlayerControl::applyPendingSeek(bool isSeekable) void QGstreamerPlayerControl::applyPendingSeek(bool isSeekable)
{ {
if (isSeekable && m_pendingSeekPosition != -1) if (isSeekable && m_pendingSeekPosition != -1)

View File

@@ -111,9 +111,6 @@ public Q_SLOTS:
void setMuted(bool muted); void setMuted(bool muted);
private Q_SLOTS: private Q_SLOTS:
void writeFifo();
void fifoReadyWrite(int socket);
void updateSessionState(QMediaPlayer::State state); void updateSessionState(QMediaPlayer::State state);
void updateMediaStatus(); void updateMediaStatus();
void processEOS(); void processEOS();
@@ -128,8 +125,6 @@ private Q_SLOTS:
void handleResourcesDenied(); void handleResourcesDenied();
private: private:
bool openFifo();
void closeFifo();
void playOrPause(QMediaPlayer::State state); void playOrPause(QMediaPlayer::State state);
void pushState(); void pushState();
@@ -149,12 +144,6 @@ private:
bool m_setMediaPending; bool m_setMediaPending;
QMediaContent m_currentResource; QMediaContent m_currentResource;
QIODevice *m_stream; QIODevice *m_stream;
QSocketNotifier *m_fifoNotifier;
int m_fifoFd[2];
bool m_fifoCanWrite;
int m_bufferSize;
int m_bufferOffset;
char m_buffer[PIPE_BUF];
QMediaPlayerResourceSetInterface *m_resources; QMediaPlayerResourceSetInterface *m_resources;
}; };

View File

@@ -85,7 +85,11 @@ QMediaServiceProviderHint::Features QGstreamerPlayerServicePlugin::supportedFeat
const QByteArray &service) const const QByteArray &service) const
{ {
if (service == Q_MEDIASERVICE_MEDIAPLAYER) if (service == Q_MEDIASERVICE_MEDIAPLAYER)
return QMediaServiceProviderHint::StreamPlayback | QMediaServiceProviderHint::VideoSurface; return
#ifdef HAVE_GST_APPSRC
QMediaServiceProviderHint::StreamPlayback |
#endif
QMediaServiceProviderHint::VideoSurface;
else else
return QMediaServiceProviderHint::Features(); return QMediaServiceProviderHint::Features();
} }