summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYoann Lopes <yoann.lopes@theqtcompany.com>2015-05-05 17:39:06 +0200
committerYoann Lopes <yoann.lopes@theqtcompany.com>2015-08-20 07:01:10 +0000
commit2e54790a59ebd279c140eaf127881ce07a539785 (patch)
treeffceff35597789d5c4090c5b3f679109450e887a
parent28a20861fdf6df5fda1bad73296e18f7ae9966f1 (diff)
downloadqtmultimedia-2e54790a59ebd279c140eaf127881ce07a539785.tar.gz
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>
-rw-r--r--src/plugins/android/src/mediacapture/qandroidcapturesession.cpp7
-rw-r--r--src/plugins/android/src/wrappers/jni/androidcamera.cpp34
-rw-r--r--src/plugins/android/src/wrappers/jni/androidcamera.h1
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();