From 99ce312731aad8fbf64a748b147a40dec342bc95 Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Fri, 20 Jun 2014 10:56:59 +0200 Subject: Android: correctly update camera focus zones. When setting a null custom focus point, we were correctly resetting the focus zones but we were not emitting the focusZonesChanged signal, causing the QML Camera to not update its focus zones. Change-Id: I59940c4cd2979fa08dc26566dc0f6d19e503f64f Reviewed-by: Christian Stromme --- .../mediacapture/qandroidcamerafocuscontrol.cpp | 29 +++++++++++----------- 1 file changed, 14 insertions(+), 15 deletions(-) (limited to 'src/plugins') diff --git a/src/plugins/android/src/mediacapture/qandroidcamerafocuscontrol.cpp b/src/plugins/android/src/mediacapture/qandroidcamerafocuscontrol.cpp index 0b6ab80fc..c4e0ea1a8 100644 --- a/src/plugins/android/src/mediacapture/qandroidcamerafocuscontrol.cpp +++ b/src/plugins/android/src/mediacapture/qandroidcamerafocuscontrol.cpp @@ -234,25 +234,24 @@ void QAndroidCameraFocusControl::updateFocusZones(QCameraFocusZone::FocusZoneSta // create a focus zone (50x50 pixel) around the focus point m_focusZones.clear(); - if (m_actualFocusPoint.isNull()) - return; - - QSize viewportSize = m_session->camera()->previewSize(); + if (!m_actualFocusPoint.isNull()) { + QSize viewportSize = m_session->camera()->previewSize(); - if (!viewportSize.isValid()) - return; + if (!viewportSize.isValid()) + return; - QSizeF focusSize(50.f / viewportSize.width(), 50.f / viewportSize.height()); - float x = qBound(qreal(0), - m_actualFocusPoint.x() - (focusSize.width() / 2), - 1.f - focusSize.width()); - float y = qBound(qreal(0), - m_actualFocusPoint.y() - (focusSize.height() / 2), - 1.f - focusSize.height()); + QSizeF focusSize(50.f / viewportSize.width(), 50.f / viewportSize.height()); + float x = qBound(qreal(0), + m_actualFocusPoint.x() - (focusSize.width() / 2), + 1.f - focusSize.width()); + float y = qBound(qreal(0), + m_actualFocusPoint.y() - (focusSize.height() / 2), + 1.f - focusSize.height()); - QRectF area(QPointF(x, y), focusSize); + QRectF area(QPointF(x, y), focusSize); - m_focusZones.append(QCameraFocusZone(area, status)); + m_focusZones.append(QCameraFocusZone(area, status)); + } emit focusZonesChanged(); } -- cgit v1.2.3 From 23d7bf7ac882b899c7500611b0d57f4b2993d8e2 Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Tue, 24 Jun 2014 17:04:48 +0200 Subject: Android: fix registering recorded videos with the Android media scanner Change-Id: I6dfc4e13b8a0bccb1bcfead728f7e1ddb7b58bb4 Reviewed-by: Christian Stromme --- src/plugins/android/src/mediacapture/qandroidcapturesession.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/plugins') diff --git a/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp b/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp index 383af812a..44901a6c1 100644 --- a/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp +++ b/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp @@ -278,7 +278,7 @@ void QAndroidCaptureSession::stop(bool error) // if the media is saved into the standard media location, register it // with the Android media scanner so it appears immediately in apps // such as the gallery. - QString mediaPath = m_actualOutputLocation.toLocalFile(); + QString mediaPath = m_usedOutputLocation.toLocalFile(); QString standardLoc = m_cameraSession ? AndroidMultimediaUtils::getDefaultMediaDirectory(AndroidMultimediaUtils::DCIM) : AndroidMultimediaUtils::getDefaultMediaDirectory(AndroidMultimediaUtils::Sounds); if (mediaPath.startsWith(standardLoc)) -- cgit v1.2.3 From c8b88cd02752fb623f65dc3fe930d60fc00fd15d Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Tue, 24 Jun 2014 17:08:03 +0200 Subject: Android: fix crash when stopping the camera while a recording is active When unloading the camera, any active recording is automatically stopped, which in turn triggers the viewfinder to be restarted... We don't try anymore to restart the viewfinder after stopping recording unless the camera is still active. Change-Id: I77e4e3fc8d7116ac660d8bb23f6c400ebed4ffed Reviewed-by: Christian Stromme --- src/plugins/android/src/mediacapture/qandroidcapturesession.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/plugins') diff --git a/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp b/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp index 44901a6c1..c053c8e38 100644 --- a/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp +++ b/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp @@ -269,7 +269,7 @@ void QAndroidCaptureSession::stop(bool error) delete m_mediaRecorder; m_mediaRecorder = 0; - if (m_cameraSession) { + if (m_cameraSession && m_cameraSession->status() == QCamera::ActiveStatus) { // Viewport needs to be restarted after recording restartViewfinder(); } @@ -516,6 +516,7 @@ void QAndroidCaptureSession::updateStatus() if (m_cameraSession->status() == QCamera::StoppingStatus || !m_cameraSession->captureMode().testFlag(QCamera::CaptureVideo)) { setState(QMediaRecorder::StoppedState); + return; } if (m_state == QMediaRecorder::RecordingState) { -- cgit v1.2.3 From a7f924186c6cbb98ccf9be7e62ecb1eabb022703 Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Tue, 17 Jun 2014 14:28:20 +0200 Subject: GStreamer: fix looping a media when it's loaded from qrc. When playing a media for the second time, the backend resets the the media by calling setMedia() with the same value. The problem is that setMedia() clears the previous media, which is a QFile in this case and is the one we are trying to set again... The QFile was deleted, causing the current media to be a dangling pointer. Change-Id: I6854b40212fd084d1e31e756a040a02ad103b7ba Reviewed-by: Christian Stromme --- src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/plugins') diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.cpp b/src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.cpp index ff99aa3ff..99c471b5c 100644 --- a/src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.cpp +++ b/src/plugins/gstreamer/mediaplayer/qgstreamerplayercontrol.cpp @@ -371,7 +371,7 @@ void QGstreamerPlayerControl::setMedia(const QMediaContent &content, QIODevice * emit bufferStatusChanged(0); } - if (m_stream) { + if (m_stream && m_stream != stream) { if (m_ownStream) delete m_stream; m_stream = 0; -- cgit v1.2.3 From fbd57c983d512fdc9fda81432ae28e2e9bb6d6e4 Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Tue, 1 Jul 2014 12:34:58 +0200 Subject: GStreamer: correctly handle URLs from QMediaRecorder::setOutputLocation Task-number: QTBUG-39949 Change-Id: Idf575b126bd3531655c8abda55c9e04149a4fb85 Reviewed-by: Andrew den Exter --- src/plugins/gstreamer/camerabin/camerabinsession.cpp | 10 ++++++++-- .../gstreamer/mediacapture/qgstreamercapturesession.cpp | 9 ++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) (limited to 'src/plugins') diff --git a/src/plugins/gstreamer/camerabin/camerabinsession.cpp b/src/plugins/gstreamer/camerabin/camerabinsession.cpp index 6e3448ffe..a835b1ce5 100644 --- a/src/plugins/gstreamer/camerabin/camerabinsession.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinsession.cpp @@ -487,6 +487,11 @@ QUrl CameraBinSession::outputLocation() const bool CameraBinSession::setOutputLocation(const QUrl& sink) { + if (!sink.isRelative() && !sink.isLocalFile()) { + qWarning("Output location must be a local file"); + return false; + } + m_sink = m_actualSink = sink; return true; } @@ -1007,8 +1012,9 @@ void CameraBinSession::recordVideo() if (m_actualSink.isEmpty()) { QString ext = m_mediaContainerControl->suggestedFileExtension(m_mediaContainerControl->actualContainerFormat()); m_actualSink = QUrl::fromLocalFile(generateFileName("clip_", defaultDir(QCamera::CaptureVideo), ext)); - } else if (!m_actualSink.isLocalFile()) { - m_actualSink = QUrl::fromLocalFile(m_actualSink.toEncoded()); + } else { + // Output location was rejected in setOutputlocation() if not a local file + m_actualSink = QUrl::fromLocalFile(QDir::currentPath()).resolved(m_actualSink); } QString fileName = m_actualSink.toLocalFile(); diff --git a/src/plugins/gstreamer/mediacapture/qgstreamercapturesession.cpp b/src/plugins/gstreamer/mediacapture/qgstreamercapturesession.cpp index 518a66bc0..b9114c68d 100644 --- a/src/plugins/gstreamer/mediacapture/qgstreamercapturesession.cpp +++ b/src/plugins/gstreamer/mediacapture/qgstreamercapturesession.cpp @@ -134,8 +134,10 @@ GstElement *QGstreamerCaptureSession::buildEncodeBin() return 0; } + // Output location was rejected in setOutputlocation() if not a local file + QUrl actualSink = QUrl::fromLocalFile(QDir::currentPath()).resolved(m_sink); GstElement *fileSink = gst_element_factory_make("filesink", "filesink"); - g_object_set(G_OBJECT(fileSink), "location", m_sink.toString().toLocal8Bit().constData(), NULL); + g_object_set(G_OBJECT(fileSink), "location", QFile::encodeName(actualSink.toLocalFile()).constData(), NULL); gst_bin_add_many(GST_BIN(encodeBin), muxer, fileSink, NULL); if (!gst_element_link(muxer, fileSink)) { @@ -731,6 +733,11 @@ QUrl QGstreamerCaptureSession::outputLocation() const bool QGstreamerCaptureSession::setOutputLocation(const QUrl& sink) { + if (!sink.isRelative() && !sink.isLocalFile()) { + qWarning("Output location must be a local file"); + return false; + } + m_sink = sink; return true; } -- cgit v1.2.3 From a391ad476392927c55dff6bb4b4b3e561b3b8047 Mon Sep 17 00:00:00 2001 From: Dyami Caliri Date: Wed, 18 Jun 2014 08:44:33 -0700 Subject: QAlsaAudioInput remove unused async_handler member. The member 'ahandler' was not used and will not be used. Removing to avoid confusion. Change-Id: I35f3659a650f109c564c6308573a211f324e5411 Reviewed-by: Yoann Lopes --- src/plugins/alsa/qalsaaudioinput.cpp | 1 - src/plugins/alsa/qalsaaudioinput.h | 1 - 2 files changed, 2 deletions(-) (limited to 'src/plugins') diff --git a/src/plugins/alsa/qalsaaudioinput.cpp b/src/plugins/alsa/qalsaaudioinput.cpp index 902dd57d7..e01f2d702 100644 --- a/src/plugins/alsa/qalsaaudioinput.cpp +++ b/src/plugins/alsa/qalsaaudioinput.cpp @@ -63,7 +63,6 @@ QAlsaAudioInput::QAlsaAudioInput(const QByteArray &device) { bytesAvailable = 0; handle = 0; - ahandler = 0; access = SND_PCM_ACCESS_RW_INTERLEAVED; pcmformat = SND_PCM_FORMAT_S16; buffer_size = 0; diff --git a/src/plugins/alsa/qalsaaudioinput.h b/src/plugins/alsa/qalsaaudioinput.h index 6af566c8b..704758323 100644 --- a/src/plugins/alsa/qalsaaudioinput.h +++ b/src/plugins/alsa/qalsaaudioinput.h @@ -159,7 +159,6 @@ private: unsigned int period_time; snd_pcm_uframes_t buffer_frames; snd_pcm_uframes_t period_frames; - snd_async_handler_t* ahandler; snd_pcm_access_t access; snd_pcm_format_t pcmformat; snd_timestamp_t* timestamp; -- cgit v1.2.3 From a63da4b5935bcb1e1fbba6f3156e7dfa60c90782 Mon Sep 17 00:00:00 2001 From: Dyami Caliri Date: Tue, 17 Jun 2014 07:45:34 -0700 Subject: QAlsaAudioOutput remove async callback. The async callback mechanism in ALSA is prone to deadlock. There was already a timer fallback mechanism that appears to be sufficient. Task-number: QTBUG-39677 Change-Id: I44b59e6b16eea1c9c4eeb6967335ce4f468cf3c4 Reviewed-by: Yoann Lopes --- src/plugins/alsa/qalsaaudiooutput.cpp | 30 +----------------------------- src/plugins/alsa/qalsaaudiooutput.h | 4 ---- 2 files changed, 1 insertion(+), 33 deletions(-) (limited to 'src/plugins') diff --git a/src/plugins/alsa/qalsaaudiooutput.cpp b/src/plugins/alsa/qalsaaudiooutput.cpp index 192b63596..c8d709cf9 100644 --- a/src/plugins/alsa/qalsaaudiooutput.cpp +++ b/src/plugins/alsa/qalsaaudiooutput.cpp @@ -63,7 +63,6 @@ QAlsaAudioOutput::QAlsaAudioOutput(const QByteArray &device) { bytesAvailable = 0; handle = 0; - ahandler = 0; access = SND_PCM_ACCESS_RW_INTERLEAVED; pcmformat = SND_PCM_FORMAT_S16; buffer_frames = 0; @@ -118,17 +117,6 @@ QAudio::State QAlsaAudioOutput::state() const return deviceState; } -void QAlsaAudioOutput::async_callback(snd_async_handler_t *ahandler) -{ - QAlsaAudioOutput* audioOut; - - audioOut = static_cast - (snd_async_handler_get_callback_private(ahandler)); - - if (audioOut && (audioOut->deviceState == QAudio::ActiveState || audioOut->resuming)) - audioOut->feedback(); -} - int QAlsaAudioOutput::xrun_recovery(int err) { int count = 0; @@ -512,8 +500,7 @@ bool QAlsaAudioOutput::open() snd_pcm_prepare( handle ); snd_pcm_start(handle); - // Step 5: Setup callback and timer fallback - snd_async_add_pcm_handler(&ahandler, handle, async_callback, this); + // Step 5: Setup timer bytesAvailable = bytesFree(); // Step 6: Start audio processing @@ -715,21 +702,6 @@ void QAlsaAudioOutput::userFeed() deviceReady(); } -void QAlsaAudioOutput::feedback() -{ - updateAvailable(); -} - - -void QAlsaAudioOutput::updateAvailable() -{ -#ifdef DEBUG_AUDIO - QTime now(QTime::currentTime()); - qDebug()<