QNX: Evaluate mm-renderer buffer status
In the playing (or paused) state the media status should reflect the buffer state, it should not stay in the loaded media state. Mm-renderer differentiates between buffer "status" and "level". Unfortunately, QMediaPlayer's buffer status maps to mm-renderer's buffer level. Change-Id: I22ea8dc83cee975fc4aa1a6de4f172def042a9a8 QT-BUG: 37166 Reviewed-by: Rafael Roquetto <rafael.roquetto@kdab.com> Reviewed-by: Fabian Bumberger <fbumberger@rim.com>
This commit is contained in:
committed by
The Qt Project
parent
19ce431f9f
commit
d8764171d6
@@ -103,11 +103,15 @@ bool BpsMediaPlayerControl::nativeEventFilter(const QByteArray &eventType, void
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (bps_event_get_code(event) == MMRENDERER_STATUS_UPDATE) {
|
if (bps_event_get_code(event) == MMRENDERER_STATUS_UPDATE) {
|
||||||
const qint64 newPosition = QString::fromLatin1(mmrenderer_event_get_position(event)).toLongLong();
|
const qint64 newPosition = QString::fromLatin1(mmrenderer_event_get_position(event)).
|
||||||
|
toLongLong();
|
||||||
handleMmStatusUpdate(newPosition);
|
handleMmStatusUpdate(newPosition);
|
||||||
|
|
||||||
const QString bufferStatus = QString::fromLatin1(mmrenderer_event_get_bufferlevel(event));
|
const QString status = QString::fromLatin1(mmrenderer_event_get_bufferstatus(event));
|
||||||
setMmBufferStatus(bufferStatus);
|
setMmBufferStatus(status);
|
||||||
|
|
||||||
|
const QString level = QString::fromLatin1(mmrenderer_event_get_bufferlevel(event));
|
||||||
|
setMmBufferLevel(level);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ MmRendererMediaPlayerControl::MmRendererMediaPlayerControl(QObject *parent)
|
|||||||
m_playAfterMediaLoaded(false),
|
m_playAfterMediaLoaded(false),
|
||||||
m_inputAttached(false),
|
m_inputAttached(false),
|
||||||
m_stopEventsToIgnore(0),
|
m_stopEventsToIgnore(0),
|
||||||
m_bufferStatus(0)
|
m_bufferLevel(0)
|
||||||
{
|
{
|
||||||
m_loadingTimer.setSingleShot(true);
|
m_loadingTimer.setSingleShot(true);
|
||||||
m_loadingTimer.setInterval(0);
|
m_loadingTimer.setInterval(0);
|
||||||
@@ -234,8 +234,11 @@ void MmRendererMediaPlayerControl::attach()
|
|||||||
|
|
||||||
m_inputAttached = true;
|
m_inputAttached = true;
|
||||||
setMediaStatus(QMediaPlayer::LoadedMedia);
|
setMediaStatus(QMediaPlayer::LoadedMedia);
|
||||||
m_bufferStatus = 0;
|
|
||||||
emit bufferStatusChanged(m_bufferStatus);
|
// mm-renderer has buffer properties "status" and "level"
|
||||||
|
// QMediaPlayer's buffer status maps to mm-renderer's buffer level
|
||||||
|
m_bufferLevel = 0;
|
||||||
|
emit bufferStatusChanged(m_bufferLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MmRendererMediaPlayerControl::detach()
|
void MmRendererMediaPlayerControl::detach()
|
||||||
@@ -406,7 +409,9 @@ void MmRendererMediaPlayerControl::setMuted(bool muted)
|
|||||||
|
|
||||||
int MmRendererMediaPlayerControl::bufferStatus() const
|
int MmRendererMediaPlayerControl::bufferStatus() const
|
||||||
{
|
{
|
||||||
return m_bufferStatus;
|
// mm-renderer has buffer properties "status" and "level"
|
||||||
|
// QMediaPlayer's buffer status maps to mm-renderer's buffer level
|
||||||
|
return m_bufferLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MmRendererMediaPlayerControl::isAudioAvailable() const
|
bool MmRendererMediaPlayerControl::isAudioAvailable() const
|
||||||
@@ -585,13 +590,23 @@ void MmRendererMediaPlayerControl::setMmPosition(qint64 newPosition)
|
|||||||
|
|
||||||
void MmRendererMediaPlayerControl::setMmBufferStatus(const QString &bufferStatus)
|
void MmRendererMediaPlayerControl::setMmBufferStatus(const QString &bufferStatus)
|
||||||
{
|
{
|
||||||
const int slashPos = bufferStatus.indexOf('/');
|
if (bufferStatus == QLatin1String("buffering"))
|
||||||
|
setMediaStatus(QMediaPlayer::BufferingMedia);
|
||||||
|
else if (bufferStatus == QLatin1String("playing"))
|
||||||
|
setMediaStatus(QMediaPlayer::BufferedMedia);
|
||||||
|
// ignore "idle" buffer status
|
||||||
|
}
|
||||||
|
|
||||||
|
void MmRendererMediaPlayerControl::setMmBufferLevel(const QString &bufferLevel)
|
||||||
|
{
|
||||||
|
// buffer level has format level/capacity, e.g. "91319/124402"
|
||||||
|
const int slashPos = bufferLevel.indexOf('/');
|
||||||
if (slashPos != -1) {
|
if (slashPos != -1) {
|
||||||
const int fill = bufferStatus.leftRef(slashPos).toInt();
|
const int fill = bufferLevel.leftRef(slashPos).toInt();
|
||||||
const int capacity = bufferStatus.midRef(slashPos + 1).toInt();
|
const int capacity = bufferLevel.midRef(slashPos + 1).toInt();
|
||||||
if (capacity != 0) {
|
if (capacity != 0) {
|
||||||
m_bufferStatus = fill / static_cast<float>(capacity) * 100.0f;
|
m_bufferLevel = fill / static_cast<float>(capacity) * 100.0f;
|
||||||
emit bufferStatusChanged(m_bufferStatus);
|
emit bufferStatusChanged(m_bufferLevel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -115,6 +115,7 @@ protected:
|
|||||||
void emitPError(const QString &msg);
|
void emitPError(const QString &msg);
|
||||||
void setMmPosition(qint64 newPosition);
|
void setMmPosition(qint64 newPosition);
|
||||||
void setMmBufferStatus(const QString &bufferStatus);
|
void setMmBufferStatus(const QString &bufferStatus);
|
||||||
|
void setMmBufferLevel(const QString &bufferLevel);
|
||||||
void handleMmStopped();
|
void handleMmStopped();
|
||||||
void handleMmStatusUpdate(qint64 position);
|
void handleMmStatusUpdate(qint64 position);
|
||||||
|
|
||||||
@@ -162,7 +163,7 @@ private:
|
|||||||
bool m_playAfterMediaLoaded;
|
bool m_playAfterMediaLoaded;
|
||||||
bool m_inputAttached;
|
bool m_inputAttached;
|
||||||
int m_stopEventsToIgnore;
|
int m_stopEventsToIgnore;
|
||||||
int m_bufferStatus;
|
int m_bufferLevel;
|
||||||
QString m_tempMediaFileName;
|
QString m_tempMediaFileName;
|
||||||
QTimer m_loadingTimer;
|
QTimer m_loadingTimer;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -171,9 +171,12 @@ void PpsMediaPlayerControl::ppsReadyRead(int fd)
|
|||||||
pps_decoder_push(&decoder, 0);
|
pps_decoder_push(&decoder, 0);
|
||||||
|
|
||||||
const char *value = 0;
|
const char *value = 0;
|
||||||
if (pps_decoder_get_string(&decoder, "bufferlevel", &value) == PPS_DECODER_OK) {
|
|
||||||
|
if (pps_decoder_get_string(&decoder, "bufferstatus", &value) == PPS_DECODER_OK)
|
||||||
setMmBufferStatus(QString::fromLatin1(value));
|
setMmBufferStatus(QString::fromLatin1(value));
|
||||||
}
|
|
||||||
|
if (pps_decoder_get_string(&decoder, "bufferlevel", &value) == PPS_DECODER_OK)
|
||||||
|
setMmBufferLevel(QString::fromLatin1(value));
|
||||||
|
|
||||||
if (pps_decoder_get_string(&decoder, "state", &value) == PPS_DECODER_OK) {
|
if (pps_decoder_get_string(&decoder, "state", &value) == PPS_DECODER_OK) {
|
||||||
const QByteArray state = value;
|
const QByteArray state = value;
|
||||||
|
|||||||
Reference in New Issue
Block a user