diff --git a/src/imports/multimedia/qdeclarativecamera.cpp b/src/imports/multimedia/qdeclarativecamera.cpp
index 6d36e462d07859d029848e2548d26e157de48903..91bda2ea213c126ccb72038f27799bde276ec010 100644
--- a/src/imports/multimedia/qdeclarativecamera.cpp
+++ b/src/imports/multimedia/qdeclarativecamera.cpp
@@ -177,7 +177,6 @@ QDeclarativeCamera::QDeclarativeCamera(QObject *parent) :
     QObject(parent),
     m_camera(0),
     m_metaData(0),
-    m_viewfinder(0),
     m_pendingState(ActiveState),
     m_componentComplete(false)
 {
@@ -190,6 +189,7 @@ QDeclarativeCamera::QDeclarativeCamera(QObject *parent) :
     m_flash = new QDeclarativeCameraFlash(m_camera);
     m_focus = new QDeclarativeCameraFocus(m_camera);
     m_imageProcessing = new QDeclarativeCameraImageProcessing(m_camera);
+    m_viewfinder = new QDeclarativeCameraViewfinder(m_camera);
 
     connect(m_camera, SIGNAL(captureModeChanged(QCamera::CaptureModes)),
             this, SIGNAL(captureModeChanged()));
@@ -960,9 +960,6 @@ QDeclarativeMediaMetaData *QDeclarativeCamera::metaData()
 
 QDeclarativeCameraViewfinder *QDeclarativeCamera::viewfinder()
 {
-    if (!m_viewfinder)
-        m_viewfinder = new QDeclarativeCameraViewfinder(m_camera);
-
     return m_viewfinder;
 }
 
diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm
index 3b3f47a43af4e884b8106e661a92fdea735383a7..3c59419e757eebc75904214842456f892952d8d8 100644
--- a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm
+++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm
@@ -922,6 +922,19 @@ void AVFMediaPlayerSession::processBufferStateChange(int bufferStatus)
     if (bufferStatus == m_bufferStatus)
         return;
 
+    auto status = m_mediaStatus;
+    // Buffered -> unbuffered.
+    if (!bufferStatus) {
+        status = QMediaPlayer::StalledMedia;
+    } else if (status == QMediaPlayer::StalledMedia) {
+        status = QMediaPlayer::BufferedMedia;
+        // Resume playback.
+        [[static_cast<AVFMediaPlayerSessionObserver*>(m_observer) player] setRate:m_rate];
+    }
+
+    if (m_mediaStatus != status)
+        Q_EMIT mediaStatusChanged(m_mediaStatus = status);
+
     m_bufferStatus = bufferStatus;
     Q_EMIT bufferStatusChanged(bufferStatus);
 }
diff --git a/src/plugins/directshow/player/directshowplayercontrol.cpp b/src/plugins/directshow/player/directshowplayercontrol.cpp
index 2fe43f21b8174a6ca99913178add60b4c4e7159d..50e8d642155cf81dd3cef6918d2ca52489c5a646 100644
--- a/src/plugins/directshow/player/directshowplayercontrol.cpp
+++ b/src/plugins/directshow/player/directshowplayercontrol.cpp
@@ -208,7 +208,7 @@ const QIODevice *DirectShowPlayerControl::mediaStream() const
 
 void DirectShowPlayerControl::setMedia(const QMediaContent &media, QIODevice *stream)
 {
-    if (m_media == media)
+    if (m_media == media && m_stream == stream)
         return;
 
     m_pendingPosition = -1;
diff --git a/src/plugins/winrt/qwinrtmediaplayercontrol.cpp b/src/plugins/winrt/qwinrtmediaplayercontrol.cpp
index 02d956b5b944b5521e518f700dbee167447a0f5f..ee916b750744429e51a8916fef10c67c66744d86 100644
--- a/src/plugins/winrt/qwinrtmediaplayercontrol.cpp
+++ b/src/plugins/winrt/qwinrtmediaplayercontrol.cpp
@@ -722,7 +722,7 @@ void QWinRTMediaPlayerControl::setMedia(const QMediaContent &media, QIODevice *s
 {
     Q_D(QWinRTMediaPlayerControl);
 
-    if (d->media == media)
+    if (d->media == media && d->stream.data() == stream)
         return;
 
     d->media = media;