diff options
-rw-r--r-- | src/gsttools/qgstutils.cpp | 2 | ||||
-rw-r--r-- | src/imports/multimedia/qdeclarativecamera.cpp | 2 | ||||
-rw-r--r-- | src/plugins/avfoundation/camera/avfmediarecordercontrol.mm | 6 | ||||
-rw-r--r-- | src/plugins/directshow/player/directshowplayerservice.cpp | 21 |
4 files changed, 23 insertions, 8 deletions
diff --git a/src/gsttools/qgstutils.cpp b/src/gsttools/qgstutils.cpp index 58dd6e5fe..2cc7663b8 100644 --- a/src/gsttools/qgstutils.cpp +++ b/src/gsttools/qgstutils.cpp @@ -649,7 +649,7 @@ QVector<QGstUtils::CameraInfo> QGstUtils::enumerateCameras(GstElementFactory *fa for (; ::ioctl(fd, VIDIOC_ENUMINPUT, &input) >= 0; ++input.index) { if (input.type == V4L2_INPUT_TYPE_CAMERA || input.type == 0) { const int ret = ::ioctl(fd, VIDIOC_S_INPUT, &input.index); - isCamera = (ret == 0 || errno == ENOTTY); + isCamera = (ret == 0 || errno == ENOTTY || errno == EBUSY); break; } } diff --git a/src/imports/multimedia/qdeclarativecamera.cpp b/src/imports/multimedia/qdeclarativecamera.cpp index e9c708a21..c499de3b6 100644 --- a/src/imports/multimedia/qdeclarativecamera.cpp +++ b/src/imports/multimedia/qdeclarativecamera.cpp @@ -138,7 +138,7 @@ void QDeclarativeCamera::_q_availabilityChanged(QMultimedia::AvailabilityStatus \header \li Property \li Description \row \li \l {CameraCapture} {imageCapture} \li Methods and properties for capturing still images. - \row \li \l {CameraRecorder} {videoRecording} + \row \li \l {CameraRecorder} {videoRecorder} \li Methods and properties for capturing movies. \row \li \l {CameraExposure} {exposure} \li Methods and properties for adjusting exposure (aperture, shutter speed etc). diff --git a/src/plugins/avfoundation/camera/avfmediarecordercontrol.mm b/src/plugins/avfoundation/camera/avfmediarecordercontrol.mm index 546eabf89..a67918bbc 100644 --- a/src/plugins/avfoundation/camera/avfmediarecordercontrol.mm +++ b/src/plugins/avfoundation/camera/avfmediarecordercontrol.mm @@ -294,6 +294,8 @@ void AVFMediaRecorderControl::setState(QMediaRecorder::State state) m_recordingFinished = false; Q_EMIT actualLocationChanged(actualLocation); + updateStatus(); + Q_EMIT stateChanged(m_state); } else { Q_EMIT error(QMediaRecorder::FormatError, tr("Recorder not configured")); } @@ -312,10 +314,6 @@ void AVFMediaRecorderControl::setState(QMediaRecorder::State state) unapplySettings(); } } - - updateStatus(); - if (state != m_state) - Q_EMIT stateChanged(m_state); } void AVFMediaRecorderControl::setMuted(bool muted) diff --git a/src/plugins/directshow/player/directshowplayerservice.cpp b/src/plugins/directshow/player/directshowplayerservice.cpp index 2eeb06159..78b4be35b 100644 --- a/src/plugins/directshow/player/directshowplayerservice.cpp +++ b/src/plugins/directshow/player/directshowplayerservice.cpp @@ -524,9 +524,16 @@ void DirectShowPlayerService::doRender(QMutexLocker *locker) } else { locker->unlock(); HRESULT hr = graph->RenderEx(pin, /*AM_RENDEREX_RENDERTOEXISTINGRENDERERS*/ 1, 0); - // Do not return an error if no video output is set yet. - if (SUCCEEDED(hr) || !(m_executedTasks & SetVideoOutput)) { + if (SUCCEEDED(hr)) { rendered = true; + m_error = QMediaPlayer::NoError; + } else if (!(m_executedTasks & SetVideoOutput)) { + // Do not return an error if no video output is set yet. + rendered = true; + // Remember the error in this case. + // Handle it when playing is requested and no video output has been provided. + m_error = QMediaPlayer::ResourceError; + m_errorString = QString("%1: %2").arg(__FUNCTION__).arg(qt_error_string(hr)); } else if (renderHr == S_OK || renderHr == VFW_E_NO_DECOMPRESSOR){ renderHr = hr; } @@ -918,6 +925,16 @@ void DirectShowPlayerService::play() void DirectShowPlayerService::doPlay(QMutexLocker *locker) { + // Invalidate if there is an error while loading. + if (m_error != QMediaPlayer::NoError) { + m_graphStatus = InvalidMedia; + if (!m_errorString.isEmpty()) + qWarning("%s", qPrintable(m_errorString)); + m_errorString = QString(); + QCoreApplication::postEvent(this, new QEvent(QEvent::Type(Error))); + return; + } + if (IMediaControl *control = com_cast<IMediaControl>(m_graph, IID_IMediaControl)) { locker->unlock(); HRESULT hr = control->Run(); |