From 4585518d523ec5fcc2c0e35f472926d060ca7871 Mon Sep 17 00:00:00 2001
From: Yoann Lopes <yoann.lopes@digia.com>
Date: Mon, 29 Jul 2013 16:28:15 +0200
Subject: [PATCH] Android: fixed media player buffering logic.

When the media is ready, the status should always transition to
LoadedMedia and then immediately to BufferingMedia or BufferedMedia.
Also, when the duration is queried before the media is ready but already
buffering, it should always return 0 to avoid errors from the Android
media player.

Task-number: QTBUG-32635
Change-Id: Ibcb9c23b4f64c4f9a1a8e0ef81989ae78cfb19ef
Reviewed-by: Christian Stromme <christian.stromme@digia.com>
---
 .../android/multimedia/QtAndroidMediaPlayer.java    |  2 +-
 .../mediaplayer/qandroidmediaplayercontrol.cpp      | 13 ++++++-------
 2 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/QtAndroidMediaPlayer.java b/src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/QtAndroidMediaPlayer.java
index d1abf658e..2ca07a63e 100644
--- a/src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/QtAndroidMediaPlayer.java
+++ b/src/plugins/android/jar/src/org/qtproject/qt5/android/multimedia/QtAndroidMediaPlayer.java
@@ -191,8 +191,8 @@ public class QtAndroidMediaPlayer extends MediaPlayer
         @Override
         public void onPrepared(final MediaPlayer mp)
         {
-            onMediaPlayerInfoNative(MEDIA_PLAYER_DURATION, getDuration(), mID);
             onMediaPlayerInfoNative(MEDIA_PLAYER_READY, 0, mID);
+            onMediaPlayerInfoNative(MEDIA_PLAYER_DURATION, getDuration(), mID);
             mPreparing = false;
         }
 
diff --git a/src/plugins/android/mediaplayer/qandroidmediaplayercontrol.cpp b/src/plugins/android/mediaplayer/qandroidmediaplayercontrol.cpp
index a70f4e130..4dc56ebd9 100644
--- a/src/plugins/android/mediaplayer/qandroidmediaplayercontrol.cpp
+++ b/src/plugins/android/mediaplayer/qandroidmediaplayercontrol.cpp
@@ -98,8 +98,9 @@ QMediaPlayer::MediaStatus QAndroidMediaPlayerControl::mediaStatus() const
 qint64 QAndroidMediaPlayerControl::duration() const
 {
     return (mCurrentMediaStatus == QMediaPlayer::InvalidMedia
-            || mCurrentMediaStatus == QMediaPlayer::NoMedia) ? 0
-                                                             : mMediaPlayer->getDuration();
+            || mCurrentMediaStatus == QMediaPlayer::NoMedia
+            || !mMediaPlayerReady) ? 0
+                                   : mMediaPlayer->getDuration();
 }
 
 qint64 QAndroidMediaPlayerControl::position() const
@@ -330,14 +331,12 @@ void QAndroidMediaPlayerControl::onMediaPlayerInfo(qint32 what, qint32 extra)
         setState(QMediaPlayer::StoppedState);
         break;
     case JMediaPlayer::MEDIA_PLAYER_READY:
+        setMediaStatus(QMediaPlayer::LoadedMedia);
         if (mBuffering) {
             setMediaStatus(mBufferPercent == 100 ? QMediaPlayer::BufferedMedia
                                                  : QMediaPlayer::BufferingMedia);
         } else {
-            setMediaStatus(QMediaPlayer::LoadedMedia);
-            mBufferPercent = 100;
-            Q_EMIT bufferStatusChanged(mBufferPercent);
-            updateAvailablePlaybackRanges();
+            onBufferChanged(100);
         }
         setAudioAvailable(true);
         mMediaPlayerReady = true;
@@ -402,7 +401,7 @@ void QAndroidMediaPlayerControl::onError(qint32 what, qint32 extra)
 
 void QAndroidMediaPlayerControl::onBufferChanged(qint32 percent)
 {
-    mBuffering = true;
+    mBuffering = percent != 100;
     mBufferPercent = percent;
     Q_EMIT bufferStatusChanged(mBufferPercent);
 
-- 
GitLab