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:
committed by
Qt by Nokia
parent
6854f07257
commit
f844d6d9da
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user