3package org.qtproject.qt.android.multimedia.qffmpeg;
5import android.annotation.SuppressLint;
6import android.annotation.TargetApi;
7import android.content.Context;
8import android.graphics.ImageFormat;
9import android.graphics.Rect;
10import android.hardware.camera2.CameraAccessException;
11import android.hardware.camera2.CameraCaptureSession;
12import android.hardware.camera2.CameraDevice;
13import android.hardware.camera2.CameraMetadata;
14import android.hardware.camera2.CameraManager;
15import android.hardware.camera2.CaptureFailure;
16import android.hardware.camera2.CaptureResult;
17import android.hardware.camera2.CaptureRequest;
18import android.hardware.camera2.params.OutputConfiguration;
19import android.hardware.camera2.params.SessionConfiguration;
20import android.media.Image;
21import android.media.ImageReader;
22import android.os.Handler;
23import android.os.HandlerThread;
24import android.util.Log;
25import android.util.Range;
26import android.view.Surface;
27import java.lang.Thread;
28import java.util.ArrayList;
30import java.util.concurrent.CountDownLatch;
31import java.util.concurrent.TimeUnit;
33import org.qtproject.qt.android.UsedFromNativeCode;
46 CameraDevice mCameraDevice =
null;
48 volatile CountDownLatch mDeviceClosedLatch =
null;
49 QtVideoDeviceManager mVideoDeviceManager =
null;
51 HandlerThread mBackgroundThread;
55 ImageReader mPreviewImageReader =
null;
57 ImageReader mStillPhotoImageReader =
null;
58 CameraManager mCameraManager;
59 CameraCaptureSession mCaptureSession;
62 volatile CameraCaptureSessionStateCallback mCurrentSessionCallback;
63 CaptureRequest.Builder mPreviewRequestBuilder;
64 CaptureRequest mPreviewRequest;
68 private static int MaxNumberFrames = 12;
82 boolean mStillCaptureDeferred =
false;
89 boolean isTakingStillPhoto() {
90 return mState ==
State.Capturing;
93 void endStillPhoto() {
94 if (mState ==
State.Capturing)
95 mState =
State.Started;
98 private CameraSettings mCameraSettings =
new CameraSettings();
100 final SyncedMembers mSyncedMembers =
new SyncedMembers();
104 public void resetControlProperties() {
105 synchronized (mSyncedMembers) {
106 mSyncedMembers.mCameraSettings =
new CameraSettings();
111 private CameraSettings atomicCameraSettingsCopy() {
112 synchronized (mSyncedMembers) {
113 return new CameraSettings(mSyncedMembers.mCameraSettings);
117 QtExifDataHandler mExifDataHandler =
null;
123 CameraDeviceStateCallback mStateCallback =
new CameraDeviceStateCallback(
this);
136 class PreviewCaptureSessionCallback
extends CameraCaptureSession.CaptureCallback {
138 public void onCaptureFailed(
139 CameraCaptureSession session,
141 CaptureFailure failure)
143 super.onCaptureFailed(session,
request, failure);
151 PreviewCaptureSessionCallback mPreviewCaptureCallback =
new PreviewCaptureSessionCallback();
154 mCameraManager = (CameraManager)
context.getSystemService(
Context.CAMERA_SERVICE);
155 mVideoDeviceManager =
new QtVideoDeviceManager(
context);
156 startBackgroundThread();
159 void startBackgroundThread() {
160 mBackgroundThread =
new HandlerThread(
"CameraBackground");
161 mBackgroundThread.start();
162 mBackgroundHandler =
new Handler(mBackgroundThread.getLooper());
166 void stopBackgroundThread() {
167 mBackgroundThread.quitSafely();
169 mBackgroundThread.join();
170 mBackgroundThread =
null;
171 mBackgroundHandler =
null;
172 }
catch (Exception e) {
177 @SuppressLint(
"MissingPermission")
180 mCameraId = cameraId;
181 mCameraManager.openCamera(cameraId,mStateCallback,mBackgroundHandler);
183 }
catch (Exception e){
193 ImageReader.OnImageAvailableListener mOnStillPhotoAvailableListener =
new ImageReader.OnImageAvailableListener() {
195 public void onImageAvailable(ImageReader reader) {
196 QtCamera2.this.onStillPhotoAvailable(mCameraId,
reader.acquireLatestImage());
203 ImageReader.OnImageAvailableListener mOnPreviewImageAvailableListener =
new ImageReader.OnImageAvailableListener() {
205 public void onImageAvailable(ImageReader reader) {
209 QtCamera2.this.onPreviewFrameAvailable(mCameraId,
img);
210 }
catch (IllegalStateException e) {
213 Log.e(
LOG_TAG,
"Image processing taking too long. Let's wait 0,5s more " + e);
216 QtCamera2.this.onPreviewFrameAvailable(mCameraId,
reader.acquireLatestImage());
217 }
catch (IllegalStateException | InterruptedException e2) {
218 Log.e(
LOG_TAG,
"Will not wait anymore. Restart camera session. " + e2);
220 String cameraId = mCameraId;
223 addPreviewImageReader(mPreviewImageReader.getWidth(),
224 mPreviewImageReader.getHeight());
225 if (mStillPhotoImageReader !=
null) {
226 addStillImageReader(mStillPhotoImageReader.getWidth(),
227 mStillPhotoImageReader.getHeight());
236 void prepareCamera(
int width,
int height,
int minFps,
int maxFps,
int stillWidth,
int stillHeight) {
238 setFrameRate(minFps, maxFps);
239 addStillImageReader(stillWidth, stillHeight);
242 private void addPreviewImageReader(
int width,
int height) {
243 if (mPreviewImageReader !=
null)
244 removeSurface(mPreviewImageReader.getSurface());
246 mPreviewImageReader =
247 ImageReader.newInstance(
width,
height, ImageFormat.YUV_420_888, MaxNumberFrames);
248 mPreviewImageReader.setOnImageAvailableListener(mOnPreviewImageAvailableListener, mBackgroundHandler);
249 addSurface(mPreviewImageReader.getSurface());
253 if (mStillPhotoImageReader !=
null)
254 removeSurface(mStillPhotoImageReader.getSurface());
256 mStillPhotoImageReader =
257 ImageReader.newInstance(
width,
height, ImageFormat.JPEG, MaxNumberFrames);
258 mStillPhotoImageReader.setOnImageAvailableListener(mOnStillPhotoAvailableListener, mBackgroundHandler);
259 addSurface(mStillPhotoImageReader.getSurface());
266 boolean updateStillImageReader(
int width,
int height) {
268 if (mCameraDevice ==
null || mStillPhotoImageReader ==
null || handler ==
null)
271 synchronized (mSyncedMembers) {
272 if (mSyncedMembers.isTakingStillPhoto())
274 mSyncedMembers.mState = SyncedMembers.State.Reconfiguring;
278 if (mCameraDevice ==
null || mStillPhotoImageReader ==
null)
281 mCurrentSessionCallback =
null;
282 if (mCaptureSession !=
null) {
283 mCaptureSession.close();
284 mCaptureSession =
null;
288 mStillPhotoImageReader.setOnImageAvailableListener(
null,
null);
291 if (!createSession())
292 onSessionConfigureFailed();
297 void onSessionConfigureFailed() {
298 final boolean isStillReaderSwap;
299 synchronized (mSyncedMembers) {
300 isStillReaderSwap = mSyncedMembers.mState == SyncedMembers.State.Reconfiguring;
302 if (isStillReaderSwap)
306 onSessionReconfigured(
false);
310 void onSessionReconfigured(
boolean success) {
311 final boolean captureDeferred;
312 synchronized (mSyncedMembers) {
313 if (mSyncedMembers.mState == SyncedMembers.State.Reconfiguring)
314 mSyncedMembers.mState = SyncedMembers.State.Idle;
315 captureDeferred = mSyncedMembers.mStillCaptureDeferred;
316 mSyncedMembers.mStillCaptureDeferred =
false;
318 if (!captureDeferred)
321 beginStillPhotoCapture();
326 private void setFrameRate(
int minFrameRate,
int maxFrameRate) {
327 synchronized (mSyncedMembers) {
328 if (minFrameRate <= 0 || maxFrameRate <= 0)
329 mSyncedMembers.mCameraSettings.mFpsRange =
null;
331 mSyncedMembers.mCameraSettings.mFpsRange =
new Range<>(minFrameRate, maxFrameRate);
335 boolean addSurface(Surface surface) {
336 if (mTargetSurfaces.contains(surface))
339 return mTargetSurfaces.add(surface);
342 boolean removeSurface(Surface surface) {
343 return mTargetSurfaces.remove(surface);
347 void clearSurfaces() {
348 mTargetSurfaces.clear();
352 boolean createSession() {
353 if (mCameraDevice ==
null)
358 for (Surface surface : mTargetSurfaces)
361 mCurrentSessionCallback =
new CameraCaptureSessionStateCallback(
this);
362 SessionConfiguration
config =
new SessionConfiguration(
363 SessionConfiguration.SESSION_REGULAR, outputs,
364 mBackgroundHandler::post, mCurrentSessionCallback);
365 mCameraDevice.createCaptureSession(
config);
367 }
catch (Exception exception) {
368 Log.w(
LOG_TAG,
"Failed to create a capture session:" + exception);
375 if (mCameraDevice ==
null)
378 if (mCaptureSession ==
null)
382 synchronized (mSyncedMembers) {
383 setRepeatingRequestToPreview();
384 if (!mSyncedMembers.isTakingStillPhoto())
385 mSyncedMembers.mState = SyncedMembers.State.Started;
388 }
catch (CameraAccessException exception) {
389 Log.w(
LOG_TAG,
"Failed to start preview:" + exception);
395 void stopAndClose() {
398 CountDownLatch closedLatch =
null;
401 String abortedStillPhotoCameraId =
null;
403 synchronized (mSyncedMembers) {
405 if (mSyncedMembers.isTakingStillPhoto() || mSyncedMembers.mStillCaptureDeferred)
406 abortedStillPhotoCameraId = mCameraId;
407 if (
null != mCaptureSession) {
408 mCaptureSession.close();
409 mCaptureSession =
null;
411 if (
null != mCameraDevice) {
412 closedLatch =
new CountDownLatch(1);
413 mDeviceClosedLatch = closedLatch;
414 mCameraDevice.close();
415 mCameraDevice =
null;
418 mTargetSurfaces.clear();
419 }
catch (Exception exception) {
420 Log.w(
LOG_TAG,
"Failed to stop and close:" + exception);
422 mSyncedMembers.mState = SyncedMembers.State.Idle;
423 mSyncedMembers.mStillCaptureDeferred =
false;
426 if (abortedStillPhotoCameraId !=
null)
430 if (closedLatch !=
null) {
432 if (!closedLatch.await(2, TimeUnit.SECONDS))
434 Log.w(
LOG_TAG,
"Timed out waiting for camera device to close");
435 }
catch (InterruptedException exception) {
436 Thread.currentThread().interrupt();
443 void finalizeStillPhoto(CameraSettings cameraSettings)
throws CameraAccessException
445 final CaptureRequest.Builder requestBuilder =
446 mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
447 requestBuilder.addTarget(mStillPhotoImageReader.getSurface());
449 CaptureRequest.CONTROL_CAPTURE_INTENT,
450 CaptureRequest.CONTROL_CAPTURE_INTENT_STILL_CAPTURE);
452 applyStillPhotoSettingsToCaptureRequestBuilder(
456 mCaptureSession.capture(
457 requestBuilder.build(),
458 new CameraStillPhotoFinalizerCallback(
this),
479 void beginStillPhotoCapture() {
480 boolean abortCapture =
false;
481 synchronized (mSyncedMembers) {
482 if (mSyncedMembers.mState == SyncedMembers.State.Reconfiguring
483 || mSyncedMembers.mStillCaptureDeferred) {
484 mSyncedMembers.mStillCaptureDeferred =
true;
487 if (mSyncedMembers.isTakingStillPhoto()) {
492 "beginStillPhotoCapture() was called on camera backend while there " +
493 "is already a still photo in progress. This is not supported. Likely Qt " +
498 if (!mSyncedMembers.isStarted()) {
499 Log.w(
LOG_TAG,
"Can't begin still photo capture, camera is not started");
502 mSyncedMembers.mState = SyncedMembers.State.Capturing;
511 final CameraSettings cameraSettings = atomicCameraSettingsCopy();
513 submitNewStillPhotoCapture(cameraSettings);
514 }
catch (Exception e) {
515 Log.w(
LOG_TAG,
"Failed to begin still photo capture: " + e);
517 synchronized (mSyncedMembers) {
518 mSyncedMembers.endStillPhoto();
526 void submitNewStillPhotoCapture(CameraSettings cameraSettings)
throws CameraAccessException
528 CaptureRequest.Builder requestBuilder = mCameraDevice.createCaptureRequest(
529 CameraDevice.TEMPLATE_STILL_CAPTURE);
532 requestBuilder.addTarget(mPreviewImageReader.getSurface());
534 applyStillPhotoSettingsToCaptureRequestBuilder(
542 final boolean triggerAutoFocus = requestBuilder.get(CaptureRequest.CONTROL_AF_MODE)
543 == CaptureResult.CONTROL_AF_MODE_AUTO;
545 final Integer aeMode = requestBuilder.get(CaptureRequest.CONTROL_AE_MODE);
546 boolean triggerAutoExposure = aeMode !=
null
547 && aeMode != CaptureResult.CONTROL_AE_MODE_OFF;
549 final CameraStillPhotoPrecaptureCallback precaptureCallback =
550 new CameraStillPhotoPrecaptureCallback(
554 triggerAutoExposure);
556 mCaptureSession.setRepeatingRequest(
557 requestBuilder.build(),
564 if (triggerAutoFocus) {
566 CaptureRequest.CONTROL_AF_TRIGGER,
567 CaptureRequest.CONTROL_AF_TRIGGER_START);
569 if (triggerAutoExposure) {
571 CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
572 CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);
576 mCaptureSession.capture(requestBuilder.build(),
null, mBackgroundHandler);
582 if (mExifDataHandler !=
null)
583 mExifDataHandler.save(
path);
588 private Rect getScalerCropRegion(
float zoomFactor)
590 Rect activePixels = mVideoDeviceManager.getActiveArraySize(mCameraId);
591 float zoomRatio = 1.0f;
592 if (zoomFactor != 0.0
f)
593 zoomRatio = 1.0f / zoomFactor;
595 int croppedWidth = activePixels.width() - (int)(activePixels.width() * zoomRatio);
596 int croppedHeight = activePixels.height() - (int)(activePixels.height() * zoomRatio);
597 return new Rect(croppedWidth/2, croppedHeight/2, activePixels.width() - croppedWidth/2,
598 activePixels.height() - croppedHeight/2);
601 private void applyZoomSettingsToRequestBuilder(CaptureRequest.Builder requBuilder,
float zoomFactor)
603 if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.R) {
604 requBuilder.set(CaptureRequest.SCALER_CROP_REGION, getScalerCropRegion(zoomFactor));
606 requBuilder.set(CaptureRequest.CONTROL_ZOOM_RATIO, zoomFactor);
611 void zoomTo(
float factor)
613 synchronized (mSyncedMembers) {
614 mSyncedMembers.mCameraSettings.mZoomFactor = factor;
616 if (!mSyncedMembers.isStarted()) {
624 applyZoomSettingsToRequestBuilder(mPreviewRequestBuilder, factor);
625 mPreviewRequest = mPreviewRequestBuilder.build();
627 if (mSyncedMembers.isTakingStillPhoto()) {
633 mCaptureSession.setRepeatingRequest(
635 mPreviewCaptureCallback,
637 }
catch (Exception exception) {
638 Log.w(
LOG_TAG,
"Failed to set zoom:" + exception);
647 void setFocusMode(
int newFocusMode)
656 if (newFocusMode == 0)
657 newAfMode = CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE;
658 else if (newFocusMode == 5)
659 newAfMode = CaptureRequest.CONTROL_AF_MODE_OFF;
663 "received a QCamera::FocusMode from native code that is not recognized. " +
664 "Likely Qt developer bug. Ignoring.");
681 synchronized (mSyncedMembers) {
682 mSyncedMembers.mCameraSettings.mAFMode = newAfMode;
686 if (!mSyncedMembers.isStarted())
689 applyFocusSettingsToCaptureRequestBuilder(
690 mPreviewRequestBuilder,
691 mSyncedMembers.mCameraSettings,
693 mPreviewRequest = mPreviewRequestBuilder.build();
695 if (mSyncedMembers.isTakingStillPhoto()) {
701 mCaptureSession.setRepeatingRequest(
703 mPreviewCaptureCallback,
705 }
catch (Exception exception) {
706 Log.w(
LOG_TAG,
"Failed to set focus mode:" + exception);
712 void setFlashMode(
String flashMode)
714 synchronized (mSyncedMembers) {
715 int flashModeValue = mVideoDeviceManager.stringToControlAEMode(flashMode);
716 if (flashModeValue < 0) {
720 mSyncedMembers.mCameraSettings.mStillPhotoFlashMode = flashModeValue;
730 public void setFocusDistance(
float distanceInput)
732 if (distanceInput < 0.f || distanceInput > 1.
f) {
735 "received out-of-bounds value when setting camera focus-distance. " +
736 "Likely Qt developer bug. Ignoring.");
743 synchronized (mSyncedMembers) {
744 mSyncedMembers.mCameraSettings.mFocusDistance = distanceInput;
748 if (!mSyncedMembers.isStarted())
753 if (mSyncedMembers.mCameraSettings.mAFMode == CaptureRequest.CONTROL_AF_MODE_OFF) {
754 applyFocusSettingsToCaptureRequestBuilder(
755 mPreviewRequestBuilder,
756 mSyncedMembers.mCameraSettings,
759 mPreviewRequest = mPreviewRequestBuilder.build();
761 if (mSyncedMembers.isTakingStillPhoto()) {
768 mCaptureSession.setRepeatingRequest(
770 mPreviewCaptureCallback,
772 }
catch (Exception exception) {
773 Log.w(
LOG_TAG,
"Failed to set focus distance:" + exception);
779 private int getTorchModeValue(
boolean mode)
781 return mode ? CameraMetadata.FLASH_MODE_TORCH : CameraMetadata.FLASH_MODE_OFF;
785 void setTorchMode(
boolean torchMode)
787 synchronized (mSyncedMembers) {
788 mSyncedMembers.mCameraSettings.mTorchMode = getTorchModeValue(torchMode);
790 if (mSyncedMembers.isStarted()) {
791 mPreviewRequestBuilder.set(CaptureRequest.FLASH_MODE, mSyncedMembers.mCameraSettings.mTorchMode);
792 mPreviewRequest = mPreviewRequestBuilder.build();
794 if (mSyncedMembers.isTakingStillPhoto()) {
801 mCaptureSession.setRepeatingRequest(
803 mPreviewCaptureCallback,
805 }
catch (Exception exception) {
806 Log.w(
LOG_TAG,
"Failed to set flash mode:" + exception);
815 void setRepeatingRequestToPreview() throws CameraAccessException {
816 synchronized (mSyncedMembers) {
817 mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
818 mPreviewRequestBuilder.addTarget(mPreviewImageReader.getSurface());
820 applyPreviewSettingsToCaptureRequestBuilder(
821 mPreviewRequestBuilder,
822 mSyncedMembers.mCameraSettings);
824 mPreviewRequest = mPreviewRequestBuilder.build();
825 mCaptureSession.setRepeatingRequest(
827 mPreviewCaptureCallback,
832 private void applyStillPhotoSettingsToCaptureRequestBuilder(
833 CaptureRequest.Builder requestBuilder,
834 CameraSettings cameraSettings)
837 CaptureRequest.CONTROL_CAPTURE_INTENT,
838 CaptureRequest.CONTROL_CAPTURE_INTENT_STILL_CAPTURE);
842 CaptureRequest.CONTROL_MODE,
843 CaptureRequest.CONTROL_MODE_AUTO);
847 CaptureRequest.CONTROL_AE_MODE,
848 CaptureRequest.CONTROL_AE_MODE_ON);
850 applyZoomSettingsToRequestBuilder(requestBuilder, cameraSettings.mZoomFactor);
852 applyFocusSettingsToCaptureRequestBuilder(
860 if (cameraSettings.mStillPhotoFlashMode == CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH) {
862 CaptureRequest.CONTROL_AE_MODE,
863 CaptureRequest.CONTROL_AE_MODE_ON);
869 CaptureRequest.FLASH_MODE,
870 CaptureRequest.FLASH_MODE_TORCH);
871 }
else if (cameraSettings.mStillPhotoFlashMode == CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH) {
873 CaptureRequest.CONTROL_AE_MODE,
874 CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
878 private void applyPreviewSettingsToCaptureRequestBuilder(
879 CaptureRequest.Builder requestBuilder,
880 CameraSettings cameraSettings)
882 requestBuilder.set(CaptureRequest.CONTROL_CAPTURE_INTENT, CameraMetadata.CONTROL_CAPTURE_INTENT_VIDEO_RECORD);
884 applyFocusSettingsToCaptureRequestBuilder(
890 requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
891 requestBuilder.set(CaptureRequest.FLASH_MODE, cameraSettings.mTorchMode);
893 applyZoomSettingsToRequestBuilder(requestBuilder, cameraSettings.mZoomFactor);
894 if (cameraSettings.mFpsRange !=
null) {
896 CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE,
897 cameraSettings.mFpsRange);
902 mPreviewRequestBuilder.set(
903 CaptureRequest.CONTROL_AF_TRIGGER,
904 CameraMetadata.CONTROL_AF_TRIGGER_IDLE);
905 mPreviewRequestBuilder.set(
906 CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER,
907 CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_IDLE);
912 void applyFocusSettingsToCaptureRequestBuilder(
913 CaptureRequest.Builder requestBuilder,
914 CameraSettings cameraSettings,
917 int desiredAfMode = cameraSettings.mAFMode;
922 if (stillPhoto && desiredAfMode == CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE) {
923 desiredAfMode = CaptureRequest.CONTROL_AF_MODE_AUTO;
926 if (!isAfModeAvailable(desiredAfMode)) {
931 if (isAfModeAvailable(CaptureRequest.CONTROL_AF_MODE_OFF)) {
933 CaptureRequest.CONTROL_AF_MODE,
934 CaptureRequest.CONTROL_AF_MODE_OFF);
937 requestBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE,
null);
941 requestBuilder.set(CaptureRequest.CONTROL_AF_MODE, desiredAfMode);
944 if (desiredAfMode == CaptureRequest.CONTROL_AF_MODE_OFF) {
945 final float lensFocusDistance = calcLensFocusDistanceFromQCameraFocusDistance(
946 cameraSettings.mFocusDistance);
947 if (lensFocusDistance < 0) {
950 "Tried to apply FocusModeManual on a camera that doesn't support "
951 +
"setting lens distance. Likely Qt developer bug. Ignoring.");
953 requestBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, lensFocusDistance);
956 requestBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE,
null);
963 private float calcLensFocusDistanceFromQCameraFocusDistance(
float qCameraFocusDistance) {
964 float lensMinimumFocusDistance =
965 mVideoDeviceManager.getLensInfoMinimumFocusDistance(mCameraId);
966 if (lensMinimumFocusDistance <= 0)
973 return (1.
f - qCameraFocusDistance) * lensMinimumFocusDistance;
978 private boolean isAfModeAvailable(
int afMode) {
979 if (mVideoDeviceManager ==
null || mCameraId ==
null || mCameraId.isEmpty())
981 return mVideoDeviceManager.isAfModeAvailable(mCameraId, afMode);
986 static boolean afStateIsReadyForCapture(
Integer afState) {
987 return afState ==
null
988 || afState == CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED
989 || afState == CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED;
992 static boolean aeStateIsReadyForCapture(
Integer aeState) {
993 return aeState ==
null
994 || aeState == CaptureResult.CONTROL_AE_STATE_CONVERGED
995 || aeState == CaptureResult.CONTROL_AE_STATE_FLASH_REQUIRED;
static void onPreviewFrameAvailable(JNIEnv *env, jobject obj, jstring cameraId, QtJniTypes::Image image)
static void onCaptureSessionFailed(JNIEnv *env, jobject obj, jstring cameraId, jint reason, jlong framenumber)
static void onSessionClosed(JNIEnv *env, jobject obj, jstring cameraId)
static void onStillPhotoCaptureFailed(JNIEnv *env, jobject obj, jstring cameraId)
static void onStillReaderSwapFailed(JNIEnv *env, jobject obj, jstring cameraId)
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 onCaptureSessionConfigured(JNIEnv *env, jobject obj, jstring cameraId)
static void onStillPhotoAvailable(JNIEnv *env, jobject obj, jstring cameraId, QtJniTypes::Image image)
static const QString context()
Catch::Generators::GeneratorWrapper< T > handler(Catch::Generators::GeneratorWrapper< T > &&generator)
Returns a generator wrapping generator that ensures that changes its semantics so that the first call...
QImageReader reader("image.png")
[1]
DBusConnection const char DBusError * error
GLsizei const GLchar *const * path
file open(QIODevice::ReadOnly)
QNetworkRequest request(url)
[0]