diff options
author | Ruslan Baratov <ruslan_baratov@yahoo.com> | 2016-02-09 01:03:37 +0700 |
---|---|---|
committer | Yoann Lopes <yoann.lopes@qt.io> | 2016-06-02 14:53:37 +0000 |
commit | 62d9b69e4d9ee9f180e4ac07fb72e00a002d3c02 (patch) | |
tree | f67ccbe520e638938ac80e9d4079e4217f1c1e0c /src/plugins/android/src/wrappers/jni/androidcamera.cpp | |
parent | f2b9fb776b78fc10424c0325ab4316a45360130e (diff) |
Implement QCameraViewfinderSettingsControl2 interface for Android
Add class QAndroidViewfinderSettingsControl2 which implements
QCameraViewfinderSettingsControl2 interface. This make next QCamera methods
working on Android:
* QCamera::setViewfinderSettings
* QCamera::supportedViewfinderFrameRateRanges
* QCamera::supportedViewfinderPixelFormats
* QCamera::supportedViewfinderResolutions
* QCamera::supportedViewfinderSettings
* QCamera::viewfinderSettings
Originally from:
* https://github.com/headupinclouds/gatherer/issues/109
Change-Id: Ic43e434289a626691f01ed9832654fa9b0105c7d
Reviewed-by: Ruslan Baratov <ruslan_baratov@yahoo.com>
Reviewed-by: Christian Stromme <christian.stromme@qt.io>
Diffstat (limited to 'src/plugins/android/src/wrappers/jni/androidcamera.cpp')
-rw-r--r-- | src/plugins/android/src/wrappers/jni/androidcamera.cpp | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/src/plugins/android/src/wrappers/jni/androidcamera.cpp b/src/plugins/android/src/wrappers/jni/androidcamera.cpp index 476fb8957..fd5522e10 100644 --- a/src/plugins/android/src/wrappers/jni/androidcamera.cpp +++ b/src/plugins/android/src/wrappers/jni/androidcamera.cpp @@ -1,6 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2016 Ruslan Baratov ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Toolkit. @@ -171,11 +172,17 @@ public: Q_INVOKABLE QSize getPreferredPreviewSizeForVideo(); Q_INVOKABLE QList<QSize> getSupportedPreviewSizes(); + Q_INVOKABLE QList<AndroidCamera::FpsRange> getSupportedPreviewFpsRange(); + + Q_INVOKABLE AndroidCamera::FpsRange getPreviewFpsRange(); + Q_INVOKABLE void setPreviewFpsRange(int min, int max); + Q_INVOKABLE AndroidCamera::ImageFormat getPreviewFormat(); Q_INVOKABLE void setPreviewFormat(AndroidCamera::ImageFormat fmt); Q_INVOKABLE QList<AndroidCamera::ImageFormat> getSupportedPreviewFormats(); Q_INVOKABLE QSize previewSize() const { return m_previewSize; } + Q_INVOKABLE QSize getPreviewSize(); Q_INVOKABLE void updatePreviewSize(); Q_INVOKABLE bool setPreviewTexture(void *surfaceTexture); Q_INVOKABLE bool setPreviewDisplay(void *surfaceHolder); @@ -380,6 +387,24 @@ QList<QSize> AndroidCamera::getSupportedPreviewSizes() return d->getSupportedPreviewSizes(); } +QList<AndroidCamera::FpsRange> AndroidCamera::getSupportedPreviewFpsRange() +{ + Q_D(AndroidCamera); + return d->getSupportedPreviewFpsRange(); +} + +AndroidCamera::FpsRange AndroidCamera::getPreviewFpsRange() +{ + Q_D(AndroidCamera); + return d->getPreviewFpsRange(); +} + +void AndroidCamera::setPreviewFpsRange(FpsRange range) +{ + Q_D(AndroidCamera); + QMetaObject::invokeMethod(d, "setPreviewFpsRange", Q_ARG(int, range.min), Q_ARG(int, range.max)); +} + AndroidCamera::ImageFormat AndroidCamera::getPreviewFormat() { Q_D(AndroidCamera); @@ -404,6 +429,12 @@ QSize AndroidCamera::previewSize() const return d->m_previewSize; } +QSize AndroidCamera::actualPreviewSize() +{ + Q_D(AndroidCamera); + return d->getPreviewSize(); +} + void AndroidCamera::setPreviewSize(const QSize &size) { Q_D(AndroidCamera); @@ -877,6 +908,80 @@ QList<QSize> AndroidCameraPrivate::getSupportedPreviewSizes() return list; } +QList<AndroidCamera::FpsRange> AndroidCameraPrivate::getSupportedPreviewFpsRange() +{ + QMutexLocker parametersLocker(&m_parametersMutex); + + QJNIEnvironmentPrivate env; + + QList<AndroidCamera::FpsRange> rangeList; + + if (m_parameters.isValid()) { + QJNIObjectPrivate rangeListNative = m_parameters.callObjectMethod("getSupportedPreviewFpsRange", + "()Ljava/util/List;"); + int count = rangeListNative.callMethod<jint>("size"); + + rangeList.reserve(count); + + for (int i = 0; i < count; ++i) { + QJNIObjectPrivate range = rangeListNative.callObjectMethod("get", + "(I)Ljava/lang/Object;", + i); + + jintArray jRange = static_cast<jintArray>(range.object()); + jint* rangeArray = env->GetIntArrayElements(jRange, 0); + + AndroidCamera::FpsRange fpsRange; + + fpsRange.min = rangeArray[0]; + fpsRange.max = rangeArray[1]; + + env->ReleaseIntArrayElements(jRange, rangeArray, 0); + + rangeList << fpsRange; + } + } + + return rangeList; +} + +AndroidCamera::FpsRange AndroidCameraPrivate::getPreviewFpsRange() +{ + QMutexLocker parametersLocker(&m_parametersMutex); + + QJNIEnvironmentPrivate env; + + AndroidCamera::FpsRange range; + + if (!m_parameters.isValid()) + return range; + + jintArray jRangeArray = env->NewIntArray(2); + m_parameters.callMethod<void>("getPreviewFpsRange", "([I)V", jRangeArray); + + jint* jRangeElements = env->GetIntArrayElements(jRangeArray, 0); + + range.min = jRangeElements[0]; + range.max = jRangeElements[1]; + + env->ReleaseIntArrayElements(jRangeArray, jRangeElements, 0); + env->DeleteLocalRef(jRangeArray); + + return range; +} + +void AndroidCameraPrivate::setPreviewFpsRange(int min, int max) +{ + QMutexLocker parametersLocker(&m_parametersMutex); + + if (!m_parameters.isValid()) + return; + + QJNIEnvironmentPrivate env; + m_parameters.callMethod<void>("setPreviewFpsRange", "(II)V", min, max); + exceptionCheckAndClear(env); +} + AndroidCamera::ImageFormat AndroidCameraPrivate::getPreviewFormat() { QMutexLocker parametersLocker(&m_parametersMutex); @@ -919,6 +1024,22 @@ QList<AndroidCamera::ImageFormat> AndroidCameraPrivate::getSupportedPreviewForma return list; } +QSize AndroidCameraPrivate::getPreviewSize() +{ + QMutexLocker parametersLocker(&m_parametersMutex); + + if (!m_parameters.isValid()) + return QSize(); + + QJNIObjectPrivate size = m_parameters.callObjectMethod("getPreviewSize", + "()Landroid/hardware/Camera$Size;"); + + if (!size.isValid()) + return QSize(); + + return QSize(size.getField<jint>("width"), size.getField<jint>("height")); +} + void AndroidCameraPrivate::updatePreviewSize() { QMutexLocker parametersLocker(&m_parametersMutex); |