// Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include "qandroidmultimediautils_p.h" #include "qandroidglobal_p.h" #include #include #include #include QT_BEGIN_NAMESPACE int qt_findClosestValue(const QList &list, int value) { if (list.size() < 2) return 0; int begin = 0; int end = list.size() - 1; int pivot = begin + (end - begin) / 2; int v = list.at(pivot); while (end - begin > 1) { if (value == v) return pivot; if (value > v) begin = pivot; else end = pivot; pivot = begin + (end - begin) / 2; v = list.at(pivot); } return value - v >= list.at(pivot + 1) - value ? pivot + 1 : pivot; } bool qt_sizeLessThan(const QSize &s1, const QSize &s2) { return s1.width() * s1.height() < s2.width() * s2.height(); } QVideoFrameFormat::PixelFormat qt_pixelFormatFromAndroidImageFormat(AndroidCamera::ImageFormat f) { switch (f) { case AndroidCamera::NV21: return QVideoFrameFormat::Format_NV21; case AndroidCamera::YV12: return QVideoFrameFormat::Format_YV12; case AndroidCamera::YUY2: return QVideoFrameFormat::Format_YUYV; case AndroidCamera::JPEG: return QVideoFrameFormat::Format_Jpeg; default: return QVideoFrameFormat::Format_Invalid; } } AndroidCamera::ImageFormat qt_androidImageFormatFromPixelFormat(QVideoFrameFormat::PixelFormat f) { switch (f) { case QVideoFrameFormat::Format_NV21: return AndroidCamera::NV21; case QVideoFrameFormat::Format_YV12: return AndroidCamera::YV12; case QVideoFrameFormat::Format_YUYV: return AndroidCamera::YUY2; case QVideoFrameFormat::Format_Jpeg: return AndroidCamera::JPEG; default: return AndroidCamera::UnknownImageFormat; } } static bool androidRequestPermission(const QString &permission) { if (QNativeInterface::QAndroidApplication::sdkVersion() < 23) return true; // Permission already granted? if (QtAndroidPrivate::checkPermission(permission).result() == QtAndroidPrivate::Authorized) return true; if (QtAndroidPrivate::requestPermission(permission).result() != QtAndroidPrivate::Authorized) return false; return true; } static bool androidCheckPermission(const QPermission &permission) { return qApp->checkPermission(permission) == Qt::PermissionStatus::Granted; } bool qt_androidCheckCameraPermission() { const QCameraPermission permission; const auto granted = androidCheckPermission(permission); if (!granted) qCDebug(qtAndroidMediaPlugin, "Camera permission not granted!"); return granted; } bool qt_androidCheckMicrophonePermission() { const QMicrophonePermission permission; const auto granted = androidCheckPermission(permission); if (!granted) qCDebug(qtAndroidMediaPlugin, "Microphone permission not granted!"); return granted; } bool qt_androidRequestWriteStoragePermission() { if (!androidRequestPermission(QStringLiteral("android.permission.WRITE_EXTERNAL_STORAGE"))) { qCDebug(qtAndroidMediaPlugin, "Storage permission denied by user!"); return false; } return true; } QT_END_NAMESPACE