Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qandroidcamera.cpp
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qandroidcamera_p.h"
5
6#include <jni.h>
7#include <QMediaFormat>
8#include <memory>
9#include <optional>
10#include <qmediadevices.h>
11#include <qguiapplication.h>
12#include <qscreen.h>
13#include <QDebug>
14#include <qloggingcategory.h>
15#include <QtCore/qcoreapplication.h>
16#include <QtCore/qpermissions.h>
17#include <QtCore/private/qandroidextras_p.h>
18#include <private/qcameradevice_p.h>
19#include <QReadWriteLock>
20#include <private/qvideoframeconverter_p.h>
21#include <private/qvideotexturehelper_p.h>
23
25#include <utility>
26
27extern "C" {
28#include "libavutil/hwcontext.h"
29#include "libavutil/pixfmt.h"
30}
31
32Q_DECLARE_JNI_CLASS(QtCamera2, "org/qtproject/qt/android/multimedia/QtCamera2");
34 "org/qtproject/qt/android/multimedia/QtVideoDeviceManager");
35
36Q_DECLARE_JNI_CLASS(AndroidImageFormat, "android/graphics/ImageFormat");
37
38Q_DECLARE_JNI_TYPE(AndroidImage, "Landroid/media/Image;")
39Q_DECLARE_JNI_TYPE(AndroidImagePlaneArray, "[Landroid/media/Image$Plane;")
40Q_DECLARE_JNI_TYPE(JavaByteBuffer, "Ljava/nio/ByteBuffer;")
41Q_DECLARE_JNI_TYPE(StringArray, "[Ljava/lang/String;")
42
44static Q_LOGGING_CATEGORY(qLCAndroidCamera, "qt.multimedia.ffmpeg.androidCamera");
45
49
50namespace {
51
52QCameraFormat getDefaultCameraFormat()
53{
54 // default settings
55 QCameraFormatPrivate *defaultFormat = new QCameraFormatPrivate{
57 .resolution = { 1920, 1080 },
58 .minFrameRate = 30,
59 .maxFrameRate = 60,
60 };
61 return defaultFormat->create();
62}
63
64bool checkCameraPermission()
65{
66 QCameraPermission permission;
67
68 const bool granted = qApp->checkPermission(permission) == Qt::PermissionStatus::Granted;
69 if (!granted)
70 qCWarning(qLCAndroidCamera) << "Access to camera not granted!";
71
72 return granted;
73}
74
75int sensorOrientation(QString cameraId)
76{
77 QJniObject deviceManager(QtJniTypes::className<QtJniTypes::QtVideoDeviceManager>(),
78 QNativeInterface::QAndroidApplication::context());
79
80 if (!deviceManager.isValid()) {
81 qCWarning(qLCAndroidCamera) << "Failed to connect to Qt Video Device Manager.";
82 return 0;
83 }
84
85 return deviceManager.callMethod<jint>("getSensorOrientation",
86 QJniObject::fromString(cameraId).object<jstring>());
87}
88} // namespace
89
90// QAndroidCamera
91
93{
94 m_jniCamera = QJniObject(QtJniTypes::className<QtJniTypes::QtCamera2>(),
95 QNativeInterface::QAndroidApplication::context());
96
97 m_hwAccel = QFFmpeg::HWAccel::create(AVHWDeviceType::AV_HWDEVICE_TYPE_MEDIACODEC);
98 if (camera) {
99 m_cameraDevice = camera->cameraDevice();
100 m_cameraFormat = !camera->cameraFormat().isNull() ? camera->cameraFormat()
101 : getDefaultCameraFormat();
102 updateCameraCharacteristics();
103 }
104
105 if (qApp) {
108 }
109};
110
112{
113 {
114 QWriteLocker locker(rwLock);
115 g_qcameras->remove(m_cameraDevice.id());
116
117 m_jniCamera.callMethod<void>("stopAndClose");
118 setState(State::Closed);
119 }
120
121 m_jniCamera.callMethod<void>("stopBackgroundThread");
122}
123
125{
126 const bool active = isActive();
127 if (active)
128 setActive(false);
129
130 m_cameraDevice = camera;
131 updateCameraCharacteristics();
132 m_cameraFormat = getDefaultCameraFormat();
133
134 if (active)
135 setActive(true);
136}
137
138std::optional<int> QAndroidCamera::ffmpegHWPixelFormat() const
139{
140 return QFFmpegVideoBuffer::toAVPixelFormat(m_androidFramePixelFormat);
141}
142
143static void deleteFrame(void *opaque, uint8_t *data)
144{
145 Q_UNUSED(data);
146
147 auto frame = reinterpret_cast<QAndroidCameraFrame *>(opaque);
148
149 if (frame)
150 delete frame;
151}
152
154{
155 if (!(m_state == State::WaitingStart || m_state == State::Started) && !m_waitingForFirstFrame) {
156 qCWarning(qLCAndroidCamera) << "Received frame when not active... ignoring";
157 qCWarning(qLCAndroidCamera) << "state:" << m_state;
158 image.callMethod<void>("close");
159 return;
160 }
161
162 auto androidFrame = new QAndroidCameraFrame(image);
163 if (!androidFrame->isParsed()) {
164 qCWarning(qLCAndroidCamera) << "Failed to parse frame.. dropping frame";
165 delete androidFrame;
166 return;
167 }
168
169 int timestamp = androidFrame->timestamp();
170 m_androidFramePixelFormat = androidFrame->format();
171 if (m_waitingForFirstFrame) {
172 m_waitingForFirstFrame = false;
173 setState(State::Started);
174 }
175 auto avframe = QFFmpeg::makeAVFrame();
176
177 avframe->width = androidFrame->size().width();
178 avframe->height = androidFrame->size().height();
179 avframe->format = QFFmpegVideoBuffer::toAVPixelFormat(androidFrame->format());
180
181 avframe->extended_data = avframe->data;
182 avframe->pts = androidFrame->timestamp();
183
184 for (int planeNumber = 0; planeNumber < androidFrame->numberPlanes(); planeNumber++) {
185 QAndroidCameraFrame::Plane plane = androidFrame->plane(planeNumber);
186 avframe->linesize[planeNumber] = plane.rowStride;
187 avframe->data[planeNumber] = plane.data;
188 }
189
190 avframe->data[3] = nullptr;
191 avframe->buf[0] = nullptr;
192
193 avframe->opaque_ref = av_buffer_create(NULL, 1, deleteFrame, androidFrame, 0);
194 avframe->extended_data = avframe->data;
195 avframe->pts = timestamp;
196
197 QVideoFrameFormat format(androidFrame->size(), androidFrame->format());
198
199 QVideoFrame videoFrame(new QFFmpegVideoBuffer(std::move(avframe)), format);
200
201 if (lastTimestamp == 0)
202 lastTimestamp = timestamp;
203
204 videoFrame.setRotationAngle(rotation());
205 videoFrame.setMirrored(m_cameraDevice.position() == QCameraDevice::Position::FrontFace);
206
207 videoFrame.setStartTime(lastTimestamp);
208 videoFrame.setEndTime(timestamp);
209
210 if (!takePhoto)
211 emit newVideoFrame(videoFrame);
212 else
213 emit onCaptured(videoFrame);
214
215 lastTimestamp = timestamp;
216}
217
218QVideoFrame::RotationAngle QAndroidCamera::rotation()
219{
221 auto screenOrientation = screen->orientation();
222 if (screenOrientation == Qt::PrimaryOrientation)
223 screenOrientation = screen->primaryOrientation();
224
225 int deviceOrientation = 0;
226 bool isFrontCamera = m_cameraDevice.position() == QCameraDevice::Position::FrontFace;
227
228 switch (screenOrientation) {
231 break;
233 deviceOrientation = 90;
234 break;
236 deviceOrientation = 180;
237 break;
239 deviceOrientation = 270;
240 break;
241 }
242
243 int rotation;
244 // subtract natural camera orientation and physical device orientation
245 if (isFrontCamera) {
246 rotation = (sensorOrientation(m_cameraDevice.id()) - deviceOrientation + 360) % 360;
247 rotation = (180 + rotation) % 360; // compensate the mirror
248 } else { // back-facing camera
249 rotation = (sensorOrientation(m_cameraDevice.id()) - deviceOrientation + 360) % 360;
250 }
251 return QVideoFrame::RotationAngle(rotation);
252}
253
254void QAndroidCamera::setActive(bool active)
255{
256 if (isActive() == active)
257 return;
258
259 if (!m_jniCamera.isValid()) {
260 emit error(QCamera::CameraError, "No connection to Android Camera2 API");
261 return;
262 }
263
264 if (active && checkCameraPermission()) {
265 QWriteLocker locker(rwLock);
266 int width = m_cameraFormat.resolution().width();
267 int height = m_cameraFormat.resolution().height();
268
269 if (width < 0 || height < 0) {
270 m_cameraFormat = getDefaultCameraFormat();
271 width = m_cameraFormat.resolution().width();
272 height = m_cameraFormat.resolution().height();
273 }
274
275 width = FFALIGN(width, 16);
276 height = FFALIGN(height, 16);
277
278 setState(State::WaitingOpen);
279 g_qcameras->insert(m_cameraDevice.id(), this);
280
281 bool canOpen = m_jniCamera.callMethod<jboolean>(
282 "open", QJniObject::fromString(m_cameraDevice.id()).object<jstring>());
283
284 if (!canOpen) {
285 g_qcameras->remove(m_cameraDevice.id());
286 setState(State::Closed);
288 QString("Failed to start camera: ").append(m_cameraDevice.description()));
289 }
290
291 // this should use the camera format.
292 // but there is only 2 fully supported formats on android - JPG and YUV420P
293 // and JPEG is not supported for encoding in FFMpeg, so it's locked for YUV for now.
294 const static int imageFormat =
295 QJniObject::getStaticField<QtJniTypes::AndroidImageFormat, jint>("YUV_420_888");
296 m_jniCamera.callMethod<jboolean>("addImageReader", jint(width), jint(height),
297 jint(imageFormat));
298
299 } else {
300 m_jniCamera.callMethod<void>("stopAndClose");
301 m_jniCamera.callMethod<void>("clearSurfaces");
302 setState(State::Closed);
303 }
304}
305
306void QAndroidCamera::setState(QAndroidCamera::State newState)
307{
308 if (newState == m_state)
309 return;
310
311 bool wasActive = isActive();
312
314 m_state = State::Started;
315
316 if (m_state == State::Started && newState == State::Closed)
317 m_state = State::Closed;
318
319 if ((m_state == State::WaitingOpen || m_state == State::WaitingStart)
320 && newState == State::Closed) {
321
322 m_state = State::Closed;
323
325 QString("Failed to start Camera %1").arg(m_cameraDevice.description()));
326 }
327
328 if (m_state == State::Closed && newState == State::WaitingOpen)
329 m_state = State::WaitingOpen;
330
332 m_state = State::WaitingStart;
333
334 if (wasActive != isActive())
336}
337
339{
340 if (!format.isNull() && !m_cameraDevice.videoFormats().contains(format))
341 return false;
342
343 m_cameraFormat = format.isNull() ? getDefaultCameraFormat() : format;
344
345 return true;
346}
347
348void QAndroidCamera::updateCameraCharacteristics()
349{
350 if (m_cameraDevice.id().isEmpty()) {
351 cleanCameraCharacteristics();
352 return;
353 }
354
355 QJniObject deviceManager(QtJniTypes::className<QtJniTypes::QtVideoDeviceManager>(),
356 QNativeInterface::QAndroidApplication::context());
357
358 if (!deviceManager.isValid()) {
359 qCWarning(qLCAndroidCamera) << "Failed to connect to Qt Video Device Manager.";
360 cleanCameraCharacteristics();
361 return;
362 }
363
364 const float maxZoom = deviceManager.callMethod<jfloat>(
365 "getMaxZoom", QJniObject::fromString(m_cameraDevice.id()).object<jstring>());
367
368 m_TorchModeSupported = deviceManager.callMethod<jboolean>(
369 "isTorchModeSupported", QJniObject::fromString(m_cameraDevice.id()).object<jstring>());
370
371 m_supportedFlashModes.append(QCamera::FlashOff);
372 QJniObject flashModesObj = deviceManager.callMethod<QtJniTypes::StringArray>(
373 "getSupportedFlashModes",
374 QJniObject::fromString(m_cameraDevice.id()).object<jstring>());
375 QJniEnvironment jniEnv;
376 jobjectArray flashModes = flashModesObj.object<jobjectArray>();
377 int size = jniEnv->GetArrayLength(flashModes);
378 for (int i = 0; i < size; ++i) {
379 QJniObject flashModeObj = jniEnv->GetObjectArrayElement(flashModes, i);
380 QString flashMode = flashModeObj.toString();
381 if (flashMode == QLatin1String("auto"))
382 m_supportedFlashModes.append(QCamera::FlashAuto);
383 else if (flashMode == QLatin1String("on"))
384 m_supportedFlashModes.append(QCamera::FlashOn);
385 }
386}
387
388void QAndroidCamera::cleanCameraCharacteristics()
389{
391 if (torchMode() != QCamera::TorchOff) {
393 }
394 m_TorchModeSupported = false;
395
396 if (flashMode() != QCamera::FlashOff) {
398 }
399 m_supportedFlashModes.clear();
400}
401
403{
405 return;
406
408 switch (mode) {
410 flashMode = QLatin1String("auto");
411 break;
412 case QCamera::FlashOn:
413 flashMode = QLatin1String("on");
414 break;
416 default:
417 flashMode = QLatin1String("off");
418 break;
419 }
420
421 m_jniCamera.callMethod<void>("setFlashMode", QJniObject::fromString(flashMode).object<jstring>());
423}
424
426{
427 return m_supportedFlashModes.contains(mode);
428}
429
431{
432 // Android doesn't have an API for that.
433 // Only check if device supports more flash modes than just FlashOff.
434 return m_supportedFlashModes.size() > 1;
435}
436
438{
439 if (mode == QCamera::TorchOff)
440 return true;
441 else if (mode == QCamera::TorchOn)
442 return m_TorchModeSupported;
443
444 return false;
445}
446
448{
449 bool torchMode;
450 if (mode == QCamera::TorchOff) {
451 torchMode = false;
452 } else if (mode == QCamera::TorchOn) {
453 torchMode = true;
454 } else {
455 qWarning() << "Unknown Torch mode";
456 return;
457 }
458 m_jniCamera.callMethod<void>("setTorchMode", jboolean(torchMode));
460}
461
462void QAndroidCamera::zoomTo(float factor, float rate)
463{
464 Q_UNUSED(rate);
465 m_jniCamera.callMethod<void>("zoomTo", factor);
466 zoomFactorChanged(factor);
467}
468
470{
473 if (isActive()) {
474 setActive(false);
475 m_wasActive = true;
476 }
477 break;
479 if (m_wasActive) {
480 setActive(true);
481 m_wasActive = false;
482 }
483 break;
484 default:
485 break;
486 }
487}
488
490{
491 bool canStart = m_jniCamera.callMethod<jboolean>("start", 3);
492 setState(canStart ? State::WaitingStart : State::Closed);
493}
494
496{
497 setState(State::Closed);
498}
499
500void QAndroidCamera::onCameraOpened()
501{
502 bool canStart = m_jniCamera.callMethod<jboolean>("createSession");
503 setState(canStart ? State::WaitingStart : State::Closed);
504}
505
507{
508 setState(State::Closed);
509}
510
512{
514 QString("Capture error with Camera %1. Camera2 Api error code: %2")
515 .arg(m_cameraDevice.description())
516 .arg(reason));
517}
518
520{
521 m_waitingForFirstFrame = true;
522}
523
525{
526 m_waitingForFirstFrame = false;
527 setState(State::Closed);
528}
529
531{
532 m_jniCamera.callMethod<void>("takePhoto");
533}
534
535void QAndroidCamera::onCaptureSessionFailed(int reason, long frameNumber)
536{
537 Q_UNUSED(frameNumber);
538
540 QString("Capture session failure with Camera %1. Camera2 Api error code: %2")
541 .arg(m_cameraDevice.description())
542 .arg(reason));
543}
544
545// JNI logic
546
547#define GET_CAMERA(cameraId) \
548 QString key = QJniObject(cameraId).toString(); \
549 QReadLocker locker(rwLock); \
550 if (!g_qcameras->contains(key)) { \
551 qCWarning(qLCAndroidCamera) << "Calling back a QtCamera2 after being destroyed."; \
552 return; \
553 } \
554 QAndroidCamera *camera = g_qcameras->find(key).value();
555
556static void onFrameAvailable(JNIEnv *env, jobject obj, jstring cameraId,
557 QtJniTypes::AndroidImage image)
558{
559 Q_UNUSED(env);
560 Q_UNUSED(obj);
561 GET_CAMERA(cameraId);
562
563 camera->frameAvailable(QJniObject(image));
564}
565Q_DECLARE_JNI_NATIVE_METHOD(onFrameAvailable)
566
567static void onPhotoAvailable(JNIEnv *env, jobject obj, jstring cameraId,
568 QtJniTypes::AndroidImage image)
569{
570 Q_UNUSED(env);
571 Q_UNUSED(obj);
572 GET_CAMERA(cameraId);
573
574 camera->frameAvailable(QJniObject(image), true);
575}
576Q_DECLARE_JNI_NATIVE_METHOD(onPhotoAvailable)
577
578
579static void onCameraOpened(JNIEnv *env, jobject obj, jstring cameraId)
580{
581 Q_UNUSED(env);
582 Q_UNUSED(obj);
583 GET_CAMERA(cameraId);
584
585 camera->onCameraOpened();
586}
587Q_DECLARE_JNI_NATIVE_METHOD(onCameraOpened)
588
589static void onCameraDisconnect(JNIEnv *env, jobject obj, jstring cameraId)
590{
591 Q_UNUSED(env);
592 Q_UNUSED(obj);
593 GET_CAMERA(cameraId);
594
595 camera->onCameraDisconnect();
596}
597Q_DECLARE_JNI_NATIVE_METHOD(onCameraDisconnect)
598
599static void onCameraError(JNIEnv *env, jobject obj, jstring cameraId, jint error)
600{
601 Q_UNUSED(env);
602 Q_UNUSED(obj);
603 GET_CAMERA(cameraId);
604
605 camera->onCameraError(error);
606}
607Q_DECLARE_JNI_NATIVE_METHOD(onCameraError)
608
609static void onCaptureSessionConfigured(JNIEnv *env, jobject obj, jstring cameraId)
610{
611 Q_UNUSED(env);
612 Q_UNUSED(obj);
613 GET_CAMERA(cameraId);
614
615 camera->onCaptureSessionConfigured();
616}
617Q_DECLARE_JNI_NATIVE_METHOD(onCaptureSessionConfigured)
618
619static void onCaptureSessionConfigureFailed(JNIEnv *env, jobject obj, jstring cameraId)
620{
621 Q_UNUSED(env);
622 Q_UNUSED(obj);
623 GET_CAMERA(cameraId);
624
625 camera->onCaptureSessionConfigureFailed();
626}
627Q_DECLARE_JNI_NATIVE_METHOD(onCaptureSessionConfigureFailed)
628
629static void onSessionActive(JNIEnv *env, jobject obj, jstring cameraId)
630{
631 Q_UNUSED(env);
632 Q_UNUSED(obj);
633 GET_CAMERA(cameraId);
634
635 camera->onSessionActive();
636}
637Q_DECLARE_JNI_NATIVE_METHOD(onSessionActive)
638
639static void onSessionClosed(JNIEnv *env, jobject obj, jstring cameraId)
640{
641 Q_UNUSED(env);
642 Q_UNUSED(obj);
643 GET_CAMERA(cameraId);
644
645 camera->onSessionClosed();
646}
647Q_DECLARE_JNI_NATIVE_METHOD(onSessionClosed)
648
649static void onCaptureSessionFailed(JNIEnv *env, jobject obj, jstring cameraId, jint reason,
650 jlong framenumber)
651{
652 Q_UNUSED(env);
653 Q_UNUSED(obj);
654 GET_CAMERA(cameraId);
655
656 camera->onCaptureSessionFailed(reason, framenumber);
657}
658Q_DECLARE_JNI_NATIVE_METHOD(onCaptureSessionFailed)
659
660bool QAndroidCamera::registerNativeMethods()
661{
662 static const bool registered = []() {
663 return QJniEnvironment().registerNativeMethods(
664 QtJniTypes::className<QtJniTypes::QtCamera2>(),
665 {
666 Q_JNI_NATIVE_METHOD(onCameraOpened),
667 Q_JNI_NATIVE_METHOD(onCameraDisconnect),
668 Q_JNI_NATIVE_METHOD(onCameraError),
669 Q_JNI_NATIVE_METHOD(onCaptureSessionConfigured),
670 Q_JNI_NATIVE_METHOD(onCaptureSessionConfigureFailed),
671 Q_JNI_NATIVE_METHOD(onCaptureSessionFailed),
672 Q_JNI_NATIVE_METHOD(onFrameAvailable),
673 Q_JNI_NATIVE_METHOD(onPhotoAvailable),
674 Q_JNI_NATIVE_METHOD(onSessionActive),
675 Q_JNI_NATIVE_METHOD(onSessionClosed),
676 });
677 }();
678 return registered;
679}
680
bool isTorchModeSupported(QCamera::TorchMode mode) const override
void onApplicationStateChanged()
QAndroidCamera(QCamera *camera)
void setFlashMode(QCamera::FlashMode mode) override
void onCaptureSessionFailed(int reason, long frameNumber)
void zoomTo(float factor, float rate) override
void setCamera(const QCameraDevice &camera) override
void onCaptureSessionConfigured()
bool setCameraFormat(const QCameraFormat &format) override
void frameAvailable(QJniObject image, bool takePhoto=false)
void onCaptured(const QVideoFrame &)
bool isFlashReady() const override
bool isFlashModeSupported(QCamera::FlashMode mode) const override
virtual ~QAndroidCamera()
std::optional< int > ffmpegHWPixelFormat() const override
void onCaptureSessionConfigureFailed()
void setActive(bool active) override
bool isActive() const override
void onCameraError(int error)
void setTorchMode(QCamera::TorchMode mode) override
bool isEmpty() const noexcept
Returns true if the byte array has size 0; otherwise returns false.
Definition qbytearray.h:106
The QCameraDevice class provides general information about camera devices.
Position position
\qmlproperty enumeration QtMultimedia::cameraDevice::position
QString description
\qmlproperty string QtMultimedia::cameraDevice::description
QList< QCameraFormat > videoFormats
\qmlproperty CameraFormat QtMultimedia::cameraDevice::videoFormats
QByteArray id
\qmlproperty string QtMultimedia::cameraDevice::id
QVideoFrameFormat::PixelFormat pixelFormat
QCameraFormat create()
The QCameraFormat class describes a video format supported by a camera device. \inmodule QtMultimedia...
QSize resolution
\qmlproperty size QtMultimedia::cameraFormat::resolution
bool isNull() const noexcept
Returns true if this is a default constructed QCameraFormat.
Access the camera for taking pictures or videos.
The QCamera class provides interface for system camera devices.
Definition qcamera.h:28
TorchMode
\value TorchOff Torch is Off.
Definition qcamera.h:84
@ TorchOn
Definition qcamera.h:86
@ TorchOff
Definition qcamera.h:85
QCameraDevice cameraDevice
\qmlproperty cameraDevice QtMultimedia::Camera::cameraDevice
Definition qcamera.h:32
QCameraFormat cameraFormat
\qmlproperty cameraFormat QtMultimedia::Camera::cameraFormat
Definition qcamera.h:35
FlashMode
\value FlashOff Flash is Off.
Definition qcamera.h:77
@ FlashAuto
Definition qcamera.h:80
@ FlashOn
Definition qcamera.h:79
@ FlashOff
Definition qcamera.h:78
@ CameraError
Definition qcamera.h:63
static AVPixelFormat toAVPixelFormat(QVideoFrameFormat::PixelFormat pixelFormat)
static std::unique_ptr< HWAccel > create(AVHWDeviceType deviceType)
static Qt::ApplicationState applicationState()
QScreen * primaryScreen
the primary (or default) screen of the application.
void applicationStateChanged(Qt::ApplicationState state)
\inmodule QtCore
\inmodule QtCore
qsizetype size() const noexcept
Definition qlist.h:386
void append(parameter_type t)
Definition qlist.h:441
void clear()
Definition qlist.h:417
Definition qmap.h:186
void torchModeChanged(QCamera::TorchMode mode)
QCamera::FlashMode flashMode() const
void maximumZoomFactorChanged(float)
void flashModeChanged(QCamera::FlashMode mode)
void zoomFactorChanged(float zoom)
QCamera::TorchMode torchMode() const
void error(int error, const QString &errorString)
void newVideoFrame(const QVideoFrame &)
void activeChanged(bool)
\inmodule QtCore
Qt::ScreenOrientation primaryOrientation
the primary screen orientation
Definition qscreen.h:61
Qt::ScreenOrientation orientation
the screen orientation
Definition qscreen.h:62
constexpr int height() const noexcept
Returns the height.
Definition qsize.h:132
constexpr int width() const noexcept
Returns the width.
Definition qsize.h:129
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
The QVideoFrameFormat class specifies the stream format of a video presentation surface.
The QVideoFrame class represents a frame of video data.
Definition qvideoframe.h:26
void setRotationAngle(RotationAngle)
Sets the angle the frame should be rotated clockwise before displaying.
RotationAngle
The angle of the clockwise rotation that should be applied to a video frame before displaying.
Definition qvideoframe.h:44
void setMirrored(bool)
Sets the mirrored flag for the frame.
void setEndTime(qint64 time)
Sets the presentation time (in microseconds) when a frame should stop being displayed.
void setStartTime(qint64 time)
Sets the presentation time (in microseconds) when the frame should initially be displayed.
\inmodule QtCore
QCamera * camera
Definition camera.cpp:19
list append(new Employee("Blackpool", "Stephen"))
static void onFrameAvailable(JNIEnv *env, jobject obj, jstring cameraId, QtJniTypes::AndroidImage image)
static void onCaptureSessionFailed(JNIEnv *env, jobject obj, jstring cameraId, jint reason, jlong framenumber)
static void onSessionClosed(JNIEnv *env, jobject obj, jstring cameraId)
Q_DECLARE_JNI_CLASS(QtCamera2, "org/qtproject/qt/android/multimedia/QtCamera2")
#define GET_CAMERA(cameraId)
static void onPhotoAvailable(JNIEnv *env, jobject obj, jstring cameraId, QtJniTypes::AndroidImage image)
static void onCameraError(JNIEnv *env, jobject obj, jstring cameraId, jint error)
static void onCaptureSessionConfigureFailed(JNIEnv *env, jobject obj, jstring cameraId)
static void onCameraOpened(JNIEnv *env, jobject obj, jstring cameraId)
static void onSessionActive(JNIEnv *env, jobject obj, jstring cameraId)
static void onCameraDisconnect(JNIEnv *env, jobject obj, jstring cameraId)
static void deleteFrame(void *opaque, uint8_t *data)
static void onCaptureSessionConfigured(JNIEnv *env, jobject obj, jstring cameraId)
void newState(QList< State > &states, const char *token, const char *lexem, bool pre)
AVFrameUPtr makeAVFrame()
Definition qffmpeg_p.h:119
Combined button and popup list for selecting options.
@ InvertedLandscapeOrientation
Definition qnamespace.h:275
@ InvertedPortraitOrientation
Definition qnamespace.h:274
@ LandscapeOrientation
Definition qnamespace.h:273
@ PortraitOrientation
Definition qnamespace.h:272
@ PrimaryOrientation
Definition qnamespace.h:271
@ ApplicationActive
Definition qnamespace.h:265
@ ApplicationInactive
Definition qnamespace.h:264
Definition image.cpp:4
static org qtproject qt android multimedia QtVideoDeviceManager
#define qApp
DBusConnection const char DBusError * error
#define Q_GLOBAL_STATIC(TYPE, NAME,...)
#define qWarning
Definition qlogging.h:162
#define Q_LOGGING_CATEGORY(name,...)
#define qCWarning(category,...)
GLenum mode
GLint GLsizei GLsizei height
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLint GLsizei width
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLint GLsizei GLsizei GLenum format
GLhandleARB obj
[2]
GLuint GLenum * rate
SSL_CTX int(*) void arg)
Q_DECLARE_JNI_TYPE(File, "Ljava/io/File;")
QLatin1StringView QLatin1String
Definition qstringfwd.h:31
QScreen * screen
[1]
Definition main.cpp:29
#define emit
#define Q_UNUSED(x)
connect(quitButton, &QPushButton::clicked, &app, &QCoreApplication::quit, Qt::QueuedConnection)
QFrame frame
[0]
bool contains(const AT &t) const noexcept
Definition qlist.h:44