diff options
author | Yoann Lopes <yoann.lopes@theqtcompany.com> | 2015-05-05 17:39:06 +0200 |
---|---|---|
committer | Yoann Lopes <yoann.lopes@theqtcompany.com> | 2015-08-20 07:01:10 +0000 |
commit | 2e54790a59ebd279c140eaf127881ce07a539785 (patch) | |
tree | ffceff35597789d5c4090c5b3f679109450e887a /src | |
parent | 28a20861fdf6df5fda1bad73296e18f7ae9966f1 (diff) |
Android: fix video probes when recording the camera.
The preview frame callback is cleared by the Android Camera whenever a
MediaRecorder is set up. We need to reset the callback after starting
the media recorder.
Change-Id: I604320b11eb3a7f6f8d7d3167d5aae371999be14
Reviewed-by: Christian Stromme <christian.stromme@theqtcompany.com>
Diffstat (limited to 'src')
3 files changed, 30 insertions, 12 deletions
diff --git a/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp b/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp index aaad8fd8a..f2ea1b9d7 100644 --- a/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp +++ b/src/plugins/android/src/mediacapture/qandroidcapturesession.cpp @@ -233,9 +233,14 @@ void QAndroidCaptureSession::start() m_notifyTimer.start(); updateDuration(); - if (m_cameraSession) + if (m_cameraSession) { m_cameraSession->setReadyForCapture(false); + // Preview frame callback is cleared when setting up the camera with the media recorder. + // We need to reset it. + m_cameraSession->camera()->setupPreviewFrameCallback(); + } + m_state = QMediaRecorder::RecordingState; emit stateChanged(m_state); } diff --git a/src/plugins/android/src/wrappers/jni/androidcamera.cpp b/src/plugins/android/src/wrappers/jni/androidcamera.cpp index 7496e9cdc..9c98be5e0 100644 --- a/src/plugins/android/src/wrappers/jni/androidcamera.cpp +++ b/src/plugins/android/src/wrappers/jni/androidcamera.cpp @@ -204,6 +204,7 @@ public: Q_INVOKABLE void takePicture(); + Q_INVOKABLE void setupPreviewFrameCallback(); Q_INVOKABLE void fetchEachFrame(bool fetch); Q_INVOKABLE void fetchLastPreviewFrame(); @@ -633,6 +634,12 @@ void AndroidCamera::takePicture() QMetaObject::invokeMethod(d, "takePicture", Qt::BlockingQueuedConnection); } +void AndroidCamera::setupPreviewFrameCallback() +{ + Q_D(AndroidCamera); + QMetaObject::invokeMethod(d, "setupPreviewFrameCallback"); +} + void AndroidCamera::fetchEachFrame(bool fetch) { Q_D(AndroidCamera); @@ -1307,17 +1314,7 @@ void AndroidCameraPrivate::setJpegQuality(int quality) void AndroidCameraPrivate::startPreview() { - //We need to clear preview buffers queue here, but there is no method to do it - //Though just resetting preview callback do the trick - m_camera.callMethod<void>("setPreviewCallbackWithBuffer", - "(Landroid/hardware/Camera$PreviewCallback;)V", - jobject(0)); - m_cameraListener.callMethod<void>("preparePreviewBuffer", "(Landroid/hardware/Camera;)V", m_camera.object()); - QJNIObjectPrivate buffer = m_cameraListener.callObjectMethod<jbyteArray>("callbackBuffer"); - m_camera.callMethod<void>("addCallbackBuffer", "([B)V", buffer.object()); - m_camera.callMethod<void>("setPreviewCallbackWithBuffer", - "(Landroid/hardware/Camera$PreviewCallback;)V", - m_cameraListener.object()); + setupPreviewFrameCallback(); m_camera.callMethod<void>("startPreview"); emit previewStarted(); } @@ -1338,6 +1335,21 @@ void AndroidCameraPrivate::takePicture() m_cameraListener.object()); } +void AndroidCameraPrivate::setupPreviewFrameCallback() +{ + //We need to clear preview buffers queue here, but there is no method to do it + //Though just resetting preview callback do the trick + m_camera.callMethod<void>("setPreviewCallbackWithBuffer", + "(Landroid/hardware/Camera$PreviewCallback;)V", + jobject(0)); + m_cameraListener.callMethod<void>("preparePreviewBuffer", "(Landroid/hardware/Camera;)V", m_camera.object()); + QJNIObjectPrivate buffer = m_cameraListener.callObjectMethod<jbyteArray>("callbackBuffer"); + m_camera.callMethod<void>("addCallbackBuffer", "([B)V", buffer.object()); + m_camera.callMethod<void>("setPreviewCallbackWithBuffer", + "(Landroid/hardware/Camera$PreviewCallback;)V", + m_cameraListener.object()); +} + void AndroidCameraPrivate::fetchEachFrame(bool fetch) { m_cameraListener.callMethod<void>("fetchEachFrame", "(Z)V", fetch); diff --git a/src/plugins/android/src/wrappers/jni/androidcamera.h b/src/plugins/android/src/wrappers/jni/androidcamera.h index a14b77c7f..eecc48c07 100644 --- a/src/plugins/android/src/wrappers/jni/androidcamera.h +++ b/src/plugins/android/src/wrappers/jni/androidcamera.h @@ -155,6 +155,7 @@ public: void takePicture(); + void setupPreviewFrameCallback(); void fetchEachFrame(bool fetch); void fetchLastPreviewFrame(); QJNIObjectPrivate getCameraObject(); |