From cca3d6e4a263f57672928ec1e63ec5a74250ef33 Mon Sep 17 00:00:00 2001 From: Andrey Yaromenok Date: Fri, 14 Apr 2017 09:22:37 +0200 Subject: Fix access to multi front/back cameras on Android devices Allow to access second (and more) front or back cameras on Android devices by adding a counter number at the end of additional camera name and description (don't need to brake current code compatibility or confuse majority of the users with only one front/back cameras on their devices) Fixes: QTBUG-59726 Change-Id: Icecb3af7521d4bbd3fbb0b953895c045cfdbf60a Reviewed-by: Assam Boudjelthia --- src/plugins/android/src/wrappers/jni/androidcamera.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/plugins/android/src/wrappers/jni/androidcamera.cpp b/src/plugins/android/src/wrappers/jni/androidcamera.cpp index 9f56ac437..fc05ad6fb 100644 --- a/src/plugins/android/src/wrappers/jni/androidcamera.cpp +++ b/src/plugins/android/src/wrappers/jni/androidcamera.cpp @@ -797,6 +797,12 @@ void AndroidCamera::getCameraInfo(int id, AndroidCameraInfo *info) default: break; } + // Add a number to allow correct access to cameras on systems with two + // (and more) front/back cameras + if (id > 1) { + info->name.append(QByteArray::number(id)); + info->description.append(QString(" %1").arg(id)); + } } void AndroidCamera::startPreview() -- cgit v1.2.3 From a1ceef2eb06b1b5bcfe36c920f269697b66f5114 Mon Sep 17 00:00:00 2001 From: Tarja Sundqvist Date: Thu, 22 Dec 2022 11:11:09 +0200 Subject: Bump version to 5.15.13 Change-Id: I64c838c5afb34264b4fd127ca6816deb84711b7c Reviewed-by: Tarja Sundqvist --- .qmake.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.qmake.conf b/.qmake.conf index 0b51738b3..33171164d 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -2,4 +2,4 @@ load(qt_build_config) DEFINES += QT_NO_FOREACH QT_NO_JAVA_STYLE_ITERATORS QT_NO_LINKED_LIST -MODULE_VERSION = 5.15.12 +MODULE_VERSION = 5.15.13 -- cgit v1.2.3 From 31bca5ee1c511ffd211e06dc3828d64ec2311d46 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Tue, 6 Dec 2022 08:46:57 +0100 Subject: Use the right enum for the loops property Changed Audio.Infinite to MediaPlayer.Infinite, this fixes a problem on QNX where it would cause a crash when using the wrong enum. Change-Id: I01ae2feeea1a60e5771207320fb7caca1ed315f5 Reviewed-by: Artem Dyomin Reviewed-by: Doris Verria --- examples/multimedia/video/qmlvideo/qml/qmlvideo/VideoItem.qml | 2 +- examples/multimedia/video/qmlvideofx/qml/qmlvideofx/ContentVideo.qml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/multimedia/video/qmlvideo/qml/qmlvideo/VideoItem.qml b/examples/multimedia/video/qmlvideo/qml/qmlvideo/VideoItem.qml index 8372acb7e..6614863ec 100644 --- a/examples/multimedia/video/qmlvideo/qml/qmlvideo/VideoItem.qml +++ b/examples/multimedia/video/qmlvideo/qml/qmlvideo/VideoItem.qml @@ -71,7 +71,7 @@ VideoOutput { MediaPlayer { id: mediaPlayer autoLoad: false - loops: Audio.Infinite + loops: MediaPlayer.Infinite onError: { if (MediaPlayer.NoError != error) { diff --git a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/ContentVideo.qml b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/ContentVideo.qml index ade7012b1..7b3bba2b3 100644 --- a/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/ContentVideo.qml +++ b/examples/multimedia/video/qmlvideofx/qml/qmlvideofx/ContentVideo.qml @@ -61,7 +61,7 @@ VideoOutput { id: mediaPlayer autoPlay: true volume: 0.5 - loops: Audio.Infinite + loops: MediaPlayer.Infinite } function play() { mediaPlayer.play() } -- cgit v1.2.3 From 6681426b573125e8a4b0abac45acb10f79a7be65 Mon Sep 17 00:00:00 2001 From: Bartlomiej Moskal Date: Mon, 14 Nov 2022 14:23:33 +0100 Subject: Android: Handle Pause() by QAudioRecorder Add implementation for pause() method for the QAudioRecorder on the Android side. Fixes: QTBUG-106897 Fixes: QTBUG-105505 Change-Id: Ie98b35c2c5dcb09c141c0216ba01c732e85e75a4 Reviewed-by: Assam Boudjelthia --- .../src/mediacapture/qandroidcapturesession.cpp | 41 +++++++++++++++++++--- .../src/mediacapture/qandroidcapturesession.h | 3 ++ .../src/wrappers/jni/androidmediarecorder.cpp | 26 ++++++++++++++ .../src/wrappers/jni/androidmediarecorder.h | 2 ++ 4 files changed, 68 insertions(+), 4 deletions(-) diff --git a/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp b/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp index 03d04341f..1d95c2608 100644 --- a/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp +++ b/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp @@ -188,19 +188,30 @@ void QAndroidCaptureSession::setState(QMediaRecorder::State state) start(); break; case QMediaRecorder::PausedState: - // Not supported by Android API - qWarning("QMediaRecorder::PausedState is not supported on Android"); + pause(); break; } } void QAndroidCaptureSession::start() { - if (m_state == QMediaRecorder::RecordingState || m_status != QMediaRecorder::LoadedStatus) + if (m_state == QMediaRecorder::RecordingState + || (m_status != QMediaRecorder::LoadedStatus && m_status != QMediaRecorder::PausedStatus)) return; setStatus(QMediaRecorder::StartingStatus); + if (m_state == QMediaRecorder::PausedState) { + if (!m_mediaRecorder || !m_mediaRecorder->resume()) { + emit error(QMediaRecorder::FormatError, QLatin1String("Unable to resume the media recorder.")); + if (m_cameraSession) + restartViewfinder(); + } else { + updateStartState(); + } + return; + } + if (m_mediaRecorder) { m_mediaRecorder->release(); delete m_mediaRecorder; @@ -289,7 +300,11 @@ void QAndroidCaptureSession::start() restartViewfinder(); return; } + updateStartState(); +} +void QAndroidCaptureSession::updateStartState() +{ m_elapsedTime.start(); m_notifyTimer.start(); updateDuration(); @@ -328,6 +343,7 @@ void QAndroidCaptureSession::stop(bool error) m_mediaRecorder->stop(); m_notifyTimer.stop(); updateDuration(); + m_previousElapsedTime = 0; m_elapsedTime.invalidate(); m_mediaRecorder->release(); delete m_mediaRecorder; @@ -358,6 +374,23 @@ void QAndroidCaptureSession::stop(bool error) setStatus(QMediaRecorder::LoadedStatus); } +void QAndroidCaptureSession::pause() +{ + if (m_state == QMediaRecorder::PausedState || m_mediaRecorder == 0) + return; + + setStatus(QMediaRecorder::PausedStatus); + + m_mediaRecorder->pause(); + m_notifyTimer.stop(); + updateDuration(); + m_previousElapsedTime = m_duration; + m_elapsedTime.invalidate(); + + m_state = QMediaRecorder::PausedState; + emit stateChanged(m_state); +} + void QAndroidCaptureSession::setStatus(QMediaRecorder::Status status) { if (m_status == status) @@ -514,7 +547,7 @@ void QAndroidCaptureSession::restartViewfinder() void QAndroidCaptureSession::updateDuration() { if (m_elapsedTime.isValid()) - m_duration = m_elapsedTime.elapsed(); + m_duration = m_elapsedTime.elapsed() + m_previousElapsedTime; emit durationChanged(m_duration); } diff --git a/src/plugins/android/src/mediacapture/qandroidcapturesession.h b/src/plugins/android/src/mediacapture/qandroidcapturesession.h index 4e004798d..6d3ae14ec 100644 --- a/src/plugins/android/src/mediacapture/qandroidcapturesession.h +++ b/src/plugins/android/src/mediacapture/qandroidcapturesession.h @@ -136,7 +136,9 @@ private: CaptureProfile getProfile(int id); void start(); + void updateStartState(); void stop(bool error = false); + void pause(); void setStatus(QMediaRecorder::Status status); @@ -154,6 +156,7 @@ private: QElapsedTimer m_elapsedTime; QTimer m_notifyTimer; qint64 m_duration; + qint64 m_previousElapsedTime = 0; QMediaRecorder::State m_state; QMediaRecorder::Status m_status; diff --git a/src/plugins/android/src/wrappers/jni/androidmediarecorder.cpp b/src/plugins/android/src/wrappers/jni/androidmediarecorder.cpp index 0e44957a4..17aa0782d 100644 --- a/src/plugins/android/src/wrappers/jni/androidmediarecorder.cpp +++ b/src/plugins/android/src/wrappers/jni/androidmediarecorder.cpp @@ -213,6 +213,32 @@ void AndroidMediaRecorder::stop() } } +void AndroidMediaRecorder::pause() +{ + QJNIEnvironmentPrivate env; + m_mediaRecorder.callMethod("pause"); + if (env->ExceptionCheck()) { +#ifdef QT_DEBUG + env->ExceptionDescribe(); +#endif + env->ExceptionClear(); + } +} + +bool AndroidMediaRecorder::resume() +{ + QJNIEnvironmentPrivate env; + m_mediaRecorder.callMethod("resume"); + if (env->ExceptionCheck()) { +#ifdef QT_DEBUG + env->ExceptionDescribe(); +#endif + env->ExceptionClear(); + return false; + } + return true; +} + void AndroidMediaRecorder::setAudioChannels(int numChannels) { m_mediaRecorder.callMethod("setAudioChannels", "(I)V", numChannels); diff --git a/src/plugins/android/src/wrappers/jni/androidmediarecorder.h b/src/plugins/android/src/wrappers/jni/androidmediarecorder.h index adbf7f622..244371b10 100644 --- a/src/plugins/android/src/wrappers/jni/androidmediarecorder.h +++ b/src/plugins/android/src/wrappers/jni/androidmediarecorder.h @@ -138,6 +138,8 @@ public: bool start(); void stop(); + void pause(); + bool resume(); void setAudioChannels(int numChannels); void setAudioEncoder(AudioEncoder encoder); -- cgit v1.2.3 From 8d17f204d8aa06f03b5cc17764db28e959073c2a Mon Sep 17 00:00:00 2001 From: Lars Sutterud Date: Fri, 10 Feb 2023 17:19:27 +0100 Subject: Add Info.plist with NSCameraUsageDescription to qmlvideo example MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Created Info.plist containing NSCameraUsageDescription. Without it the example crashes when trying to use the camera on macOS. Also included the new file in qmlvideo.pro. Task-number: QTBUG-110015 Change-Id: I6ab57b690bc99fc0b63d5447f54f78d4b8351636 Reviewed-by: Tor Arne Vestbø --- examples/multimedia/video/qmlvideo/Info.plist | 26 +++++++++++++++++++++++++ examples/multimedia/video/qmlvideo/qmlvideo.pro | 2 ++ 2 files changed, 28 insertions(+) create mode 100644 examples/multimedia/video/qmlvideo/Info.plist diff --git a/examples/multimedia/video/qmlvideo/Info.plist b/examples/multimedia/video/qmlvideo/Info.plist new file mode 100644 index 000000000..92908df4b --- /dev/null +++ b/examples/multimedia/video/qmlvideo/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleIconFile + + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleExecutable + qmlvideo + CFBundleIdentifier + io.qt.${PRODUCT_NAME:rfc1034identifier} + CFBundleDisplayName + ${PRODUCT_NAME} + CFBundleName + ${PRODUCT_NAME} + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1.0 + NSCameraUsageDescription + Qt Multimedia Example + + diff --git a/examples/multimedia/video/qmlvideo/qmlvideo.pro b/examples/multimedia/video/qmlvideo/qmlvideo.pro index dbd3a42a1..4a73d6883 100644 --- a/examples/multimedia/video/qmlvideo/qmlvideo.pro +++ b/examples/multimedia/video/qmlvideo/qmlvideo.pro @@ -20,6 +20,8 @@ include($$SNIPPETS_PATH/performancemonitor/performancemonitordeclarative.pri) target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/video/qmlvideo INSTALLS += target +macos: QMAKE_INFO_PLIST = Info.plist + EXAMPLE_FILES += \ qmlvideo.png \ qmlvideo.svg -- cgit v1.2.3