8#include <qmediadevices.h>
9#include <qcameradevice.h>
16 : QPlatformCamera(camera)
21QAndroidCamera::~QAndroidCamera()
27 if (m_cameraSession) {
30 isPendingSetActive = active;
36 return m_cameraSession ? m_cameraSession
->isActive() :
false;
43 if (m_cameraSession) {
45 auto cameras = QMediaDevices::videoInputs();
46 for (
int i = 0; i < cameras.size(); ++i) {
47 if (cameras.at(i) == camera) {
54 reactivateCameraSession();
62 if (m_service->captureSession() &&
63 m_service->captureSession()->state() == QMediaRecorder::RecordingState) {
65 qWarning() <<
"Changing camera during recording not supported";
74 m_cameraFormat = format;
77 m_cameraSession->setCameraFormat(m_cameraFormat);
85 if (m_service == captureSession)
88 m_service = captureSession;
90 disconnect(m_cameraSession,
nullptr,
this,
nullptr);
91 m_cameraSession =
nullptr;
96 Q_ASSERT(m_cameraSession);
97 if (!m_cameraFormat.isNull())
98 m_cameraSession->setCameraFormat(m_cameraFormat);
100 setCamera(m_cameraDev);
102 connect(m_cameraSession, &QAndroidCameraSession::activeChanged,
this, &QAndroidCamera::activeChanged);
103 connect(m_cameraSession, &QAndroidCameraSession::error,
this, &QAndroidCamera::error);
104 connect(m_cameraSession, &QAndroidCameraSession::opened,
this, &QAndroidCamera::onCameraOpened);
106 if (isPendingSetActive) {
108 isPendingSetActive =
false;
114 if (!m_cameraSession || !m_cameraSession
->camera())
117 if (isFocusModeSupported(mode)) {
121 case QCamera::FocusModeHyperfocal:
122 focusMode = QLatin1String(
"edof");
124 case QCamera::FocusModeInfinity:
125 focusMode = QLatin1String(
"infinity");
127 case QCamera::FocusModeManual:
128 focusMode = QLatin1String(
"fixed");
130 case QCamera::FocusModeAutoNear:
131 focusMode = QLatin1String(
"macro");
133 case QCamera::FocusModeAuto:
134 case QCamera::FocusModeAutoFar:
136 focusMode = QLatin1String(
"continuous-video");
138 focusMode = QLatin1String(
"continuous-picture");
143 m_cameraSession
->camera()->setFocusMode(focusMode);
148 focusModeChanged(mode);
154 return (m_cameraSession && m_cameraSession->camera()) ? m_supportedFocusModes.contains(mode) :
false;
159 Q_ASSERT(m_cameraSession);
160 connect(m_cameraSession->camera(), &AndroidCamera::previewSizeChanged,
this, &QAndroidCamera::setCameraFocusArea);
162 m_supportedFocusModes.clear();
163 m_continuousPictureFocusSupported =
false;
164 m_continuousVideoFocusSupported =
false;
165 m_focusPointSupported =
false;
167 QStringList focusModes = m_cameraSession
->camera()->getSupportedFocusModes();
168 for (
int i = 0; i < focusModes.size(); ++i) {
169 const QString &focusMode = focusModes.at(i);
170 if (focusMode == QLatin1String(
"continuous-picture")) {
171 m_supportedFocusModes << QCamera::FocusModeAuto;
172 m_continuousPictureFocusSupported =
true;
173 }
else if (focusMode == QLatin1String(
"continuous-video")) {
174 m_supportedFocusModes << QCamera::FocusModeAuto;
175 m_continuousVideoFocusSupported =
true;
176 }
else if (focusMode == QLatin1String(
"edof")) {
177 m_supportedFocusModes << QCamera::FocusModeHyperfocal;
178 }
else if (focusMode == QLatin1String(
"fixed")) {
179 m_supportedFocusModes << QCamera::FocusModeManual;
180 }
else if (focusMode == QLatin1String(
"infinity")) {
181 m_supportedFocusModes << QCamera::FocusModeInfinity;
182 }
else if (focusMode == QLatin1String(
"macro")) {
183 m_supportedFocusModes << QCamera::FocusModeAutoNear;
188 m_focusPointSupported =
true;
190 auto m = focusMode();
191 if (!m_supportedFocusModes.contains(m))
192 m = QCamera::FocusModeAuto;
195 setCustomFocusPoint(focusPoint());
198 m_zoomRatios = m_cameraSession->camera()->getZoomRatios();
199 qreal maxZoom = m_zoomRatios.last() / qreal(100);
200 maximumZoomFactorChanged(maxZoom);
203 m_zoomRatios.clear();
204 maximumZoomFactorChanged(1.0);
209 m_exposureCompensationStep = m_cameraSession->camera()->getExposureCompensationStep();
210 exposureCompensationRangeChanged(m_minExposureCompensationIndex*m_exposureCompensationStep,
211 m_maxExposureCompensationIndex*m_exposureCompensationStep);
213 m_supportedExposureModes.clear();
214 QStringList sceneModes = m_cameraSession
->camera()->getSupportedSceneModes();
215 if (!sceneModes.isEmpty()) {
216 for (
int i = 0; i < sceneModes.size(); ++i) {
217 const QString &sceneMode = sceneModes.at(i);
218 if (sceneMode == QLatin1String(
"auto"))
219 m_supportedExposureModes << QCamera::ExposureAuto;
220 else if (sceneMode == QLatin1String(
"beach"))
221 m_supportedExposureModes << QCamera::ExposureBeach;
222 else if (sceneMode == QLatin1String(
"night"))
223 m_supportedExposureModes << QCamera::ExposureNight;
224 else if (sceneMode == QLatin1String(
"portrait"))
225 m_supportedExposureModes << QCamera::ExposurePortrait;
226 else if (sceneMode == QLatin1String(
"snow"))
227 m_supportedExposureModes << QCamera::ExposureSnow;
228 else if (sceneMode == QLatin1String(
"sports"))
229 m_supportedExposureModes << QCamera::ExposureSports;
230 else if (sceneMode == QLatin1String(
"action"))
231 m_supportedExposureModes << QCamera::ExposureAction;
232 else if (sceneMode == QLatin1String(
"landscape"))
233 m_supportedExposureModes << QCamera::ExposureLandscape;
234 else if (sceneMode == QLatin1String(
"night-portrait"))
235 m_supportedExposureModes << QCamera::ExposureNightPortrait;
236 else if (sceneMode == QLatin1String(
"theatre"))
237 m_supportedExposureModes << QCamera::ExposureTheatre;
238 else if (sceneMode == QLatin1String(
"sunset"))
239 m_supportedExposureModes << QCamera::ExposureSunset;
240 else if (sceneMode == QLatin1String(
"steadyphoto"))
241 m_supportedExposureModes << QCamera::ExposureSteadyPhoto;
242 else if (sceneMode == QLatin1String(
"fireworks"))
243 m_supportedExposureModes << QCamera::ExposureFireworks;
244 else if (sceneMode == QLatin1String(
"party"))
245 m_supportedExposureModes << QCamera::ExposureParty;
246 else if (sceneMode == QLatin1String(
"candlelight"))
247 m_supportedExposureModes << QCamera::ExposureCandlelight;
248 else if (sceneMode == QLatin1String(
"barcode"))
249 m_supportedExposureModes << QCamera::ExposureBarcode;
254 setExposureMode(exposureMode());
256 isFlashSupported =
false;
257 isFlashAutoSupported =
false;
258 isTorchSupported =
false;
260 QStringList flashModes = m_cameraSession
->camera()->getSupportedFlashModes();
261 for (
int i = 0; i < flashModes.size(); ++i) {
262 const QString &flashMode = flashModes.at(i);
263 if (flashMode == QLatin1String(
"auto"))
264 isFlashAutoSupported =
true;
265 else if (flashMode == QLatin1String(
"on"))
266 isFlashSupported =
true;
267 else if (flashMode == QLatin1String(
"torch"))
268 isTorchSupported =
true;
271 setFlashMode(flashMode());
273 m_supportedWhiteBalanceModes.clear();
274 QStringList whiteBalanceModes = m_cameraSession
->camera()->getSupportedWhiteBalance();
275 for (
int i = 0; i < whiteBalanceModes.size(); ++i) {
276 const QString &wb = whiteBalanceModes.at(i);
277 if (wb == QLatin1String(
"auto")) {
278 m_supportedWhiteBalanceModes.insert(QCamera::WhiteBalanceAuto,
279 QStringLiteral(
"auto"));
280 }
else if (wb == QLatin1String(
"cloudy-daylight")) {
281 m_supportedWhiteBalanceModes.insert(QCamera::WhiteBalanceCloudy,
282 QStringLiteral(
"cloudy-daylight"));
283 }
else if (wb == QLatin1String(
"daylight")) {
284 m_supportedWhiteBalanceModes.insert(QCamera::WhiteBalanceSunlight,
285 QStringLiteral(
"daylight"));
286 }
else if (wb == QLatin1String(
"fluorescent")) {
287 m_supportedWhiteBalanceModes.insert(QCamera::WhiteBalanceFluorescent,
288 QStringLiteral(
"fluorescent"));
289 }
else if (wb == QLatin1String(
"incandescent")) {
290 m_supportedWhiteBalanceModes.insert(QCamera::WhiteBalanceTungsten,
291 QStringLiteral(
"incandescent"));
292 }
else if (wb == QLatin1String(
"shade")) {
293 m_supportedWhiteBalanceModes.insert(QCamera::WhiteBalanceShade,
294 QStringLiteral(
"shade"));
295 }
else if (wb == QLatin1String(
"twilight")) {
296 m_supportedWhiteBalanceModes.insert(QCamera::WhiteBalanceSunset,
297 QStringLiteral(
"twilight"));
298 }
else if (wb == QLatin1String(
"warm-fluorescent")) {
299 m_supportedWhiteBalanceModes.insert(QCamera::WhiteBalanceFlash,
300 QStringLiteral(
"warm-fluorescent"));
326 return QRect(-1000 + qRound(area.x() * 2000),
327 -1000 + qRound(area.y() * 2000),
328 qRound(area.width() * 2000),
329 qRound(area.height() * 2000))
330 .intersected(QRect(-1000, -1000, 2000, 2000));
335 if (!m_cameraSession)
339 auto focusPoint = customFocusPoint();
340 if (QRectF(0., 0., 1., 1.).contains(focusPoint)) {
343 QSize viewportSize = m_cameraSession->camera()->previewSize();
345 if (!viewportSize.isValid())
349 QSizeF focusSize(50.f / viewportSize.width(), 50.f / viewportSize.height());
350 float x = qBound(qreal(0),
351 focusPoint.x() - (focusSize.width() / 2),
352 1.f - focusSize.width());
353 float y = qBound(qreal(0),
354 focusPoint.y() - (focusSize.height() / 2),
355 1.f - focusSize.height());
357 QRectF area(QPointF(x, y), focusSize);
359 areas.append(adjustedArea(area));
361 m_cameraSession
->camera()->setFocusAreas(areas);
368 if (zoomFactor() == factor)
371 if (!m_cameraSession || !m_cameraSession
->camera())
374 factor = qBound(qreal(1), factor, maxZoomFactor());
375 int validZoomIndex = qt_findClosestValue(m_zoomRatios, qRound(factor * 100));
376 float newZoom = m_zoomRatios.at(validZoomIndex) / qreal(100);
378 zoomFactorChanged(newZoom);
383 if (!m_cameraSession || !m_cameraSession
->camera())
386 if (!isFlashModeSupported(mode))
390 if (mode == QCamera::FlashAuto)
391 flashMode = QLatin1String(
"auto");
392 else if (mode == QCamera::FlashOn)
393 flashMode = QLatin1String(
"on");
395 flashMode = QLatin1String(
"off");
397 m_cameraSession
->camera()->setFlashMode(flashMode);
398 flashModeChanged(mode);
403 if (!m_cameraSession || !m_cameraSession
->camera())
406 case QCamera::FlashOff:
408 case QCamera::FlashOn:
409 return isFlashSupported;
410 case QCamera::FlashAuto:
411 return isFlashAutoSupported;
423 if (!m_cameraSession)
426 if (!camera || !isTorchSupported || mode == QCamera::TorchAuto)
429 if (mode == QCamera::TorchOn) {
430 camera->setFlashMode(QLatin1String(
"torch"));
431 }
else if (mode == QCamera::TorchOff) {
433 camera->setFlashMode(QLatin1String(
"off"));
434 setFlashMode(flashMode());
436 torchModeChanged(mode);
441 if (!m_cameraSession || !m_cameraSession
->camera())
444 case QCamera::TorchOff:
446 case QCamera::TorchOn:
447 return isTorchSupported;
448 case QCamera::TorchAuto:
455 if (exposureMode() == mode)
458 if (!m_cameraSession || !m_cameraSession
->camera())
461 if (!m_supportedExposureModes.contains(mode))
466 case QCamera::ExposureAuto:
467 sceneMode = QLatin1String(
"auto");
469 case QCamera::ExposureSports:
470 sceneMode = QLatin1String(
"sports");
472 case QCamera::ExposurePortrait:
473 sceneMode = QLatin1String(
"portrait");
475 case QCamera::ExposureBeach:
476 sceneMode = QLatin1String(
"beach");
478 case QCamera::ExposureSnow:
479 sceneMode = QLatin1String(
"snow");
481 case QCamera::ExposureNight:
482 sceneMode = QLatin1String(
"night");
484 case QCamera::ExposureAction:
485 sceneMode = QLatin1String(
"action");
487 case QCamera::ExposureLandscape:
488 sceneMode = QLatin1String(
"landscape");
490 case QCamera::ExposureNightPortrait:
491 sceneMode = QLatin1String(
"night-portrait");
493 case QCamera::ExposureTheatre:
494 sceneMode = QLatin1String(
"theatre");
496 case QCamera::ExposureSunset:
497 sceneMode = QLatin1String(
"sunset");
499 case QCamera::ExposureSteadyPhoto:
500 sceneMode = QLatin1String(
"steadyphoto");
502 case QCamera::ExposureFireworks:
503 sceneMode = QLatin1String(
"fireworks");
505 case QCamera::ExposureParty:
506 sceneMode = QLatin1String(
"party");
508 case QCamera::ExposureCandlelight:
509 sceneMode = QLatin1String(
"candlelight");
511 case QCamera::ExposureBarcode:
512 sceneMode = QLatin1String(
"barcode");
515 sceneMode = QLatin1String(
"auto");
516 mode = QCamera::ExposureAuto;
520 m_cameraSession
->camera()->setSceneMode(sceneMode);
521 exposureModeChanged(mode);
526 return m_supportedExposureModes.contains(mode);
531 if (exposureCompensation() == bias || !m_cameraSession || !m_cameraSession
->camera())
534 int biasIndex = qRound(bias / m_exposureCompensationStep);
535 biasIndex = qBound(m_minExposureCompensationIndex, biasIndex, m_maxExposureCompensationIndex);
536 float comp = biasIndex * m_exposureCompensationStep;
538 exposureCompensationChanged(comp);
543 return m_supportedWhiteBalanceModes.contains(mode);
548 if (!m_cameraSession)
553 QString wb = m_supportedWhiteBalanceModes.value(mode, QString());
555 camera->setWhiteBalance(wb);
556 whiteBalanceModeChanged(mode);
562#include "moc_qandroidcamera_p.cpp"
void setExposureCompensation(int value)
int getMaxNumFocusAreas()
int getMinExposureCompensation()
int getMaxExposureCompensation()
void setActive(bool active)
int getSelectedCameraId()
void setSelectedCameraId(int cameraId)
AndroidCamera * camera() const
void setExposureCompensation(float bias) override
void setFocusMode(QCamera::FocusMode mode) override
void setExposureMode(QCamera::ExposureMode mode) override
bool isTorchModeSupported(QCamera::TorchMode mode) const override
void setFlashMode(QCamera::FlashMode mode) override
bool isWhiteBalanceModeSupported(QCamera::WhiteBalanceMode mode) const override
void zoomTo(float factor, float rate) override
bool isFocusModeSupported(QCamera::FocusMode mode) const override
bool setCameraFormat(const QCameraFormat &format) override
bool isFlashReady() const override
void setWhiteBalanceMode(QCamera::WhiteBalanceMode mode) override
bool isFlashModeSupported(QCamera::FlashMode mode) const override
void setActive(bool active) override
bool isActive() const override
bool isExposureModeSupported(QCamera::ExposureMode mode) const override
void setTorchMode(QCamera::TorchMode mode) override
void stop(bool error=false)
The QCamera class provides interface for system camera devices.