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>
This commit is contained in:
@@ -233,9 +233,14 @@ void QAndroidCaptureSession::start()
|
|||||||
m_notifyTimer.start();
|
m_notifyTimer.start();
|
||||||
updateDuration();
|
updateDuration();
|
||||||
|
|
||||||
if (m_cameraSession)
|
if (m_cameraSession) {
|
||||||
m_cameraSession->setReadyForCapture(false);
|
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;
|
m_state = QMediaRecorder::RecordingState;
|
||||||
emit stateChanged(m_state);
|
emit stateChanged(m_state);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -204,6 +204,7 @@ public:
|
|||||||
|
|
||||||
Q_INVOKABLE void takePicture();
|
Q_INVOKABLE void takePicture();
|
||||||
|
|
||||||
|
Q_INVOKABLE void setupPreviewFrameCallback();
|
||||||
Q_INVOKABLE void fetchEachFrame(bool fetch);
|
Q_INVOKABLE void fetchEachFrame(bool fetch);
|
||||||
Q_INVOKABLE void fetchLastPreviewFrame();
|
Q_INVOKABLE void fetchLastPreviewFrame();
|
||||||
|
|
||||||
@@ -633,6 +634,12 @@ void AndroidCamera::takePicture()
|
|||||||
QMetaObject::invokeMethod(d, "takePicture", Qt::BlockingQueuedConnection);
|
QMetaObject::invokeMethod(d, "takePicture", Qt::BlockingQueuedConnection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AndroidCamera::setupPreviewFrameCallback()
|
||||||
|
{
|
||||||
|
Q_D(AndroidCamera);
|
||||||
|
QMetaObject::invokeMethod(d, "setupPreviewFrameCallback");
|
||||||
|
}
|
||||||
|
|
||||||
void AndroidCamera::fetchEachFrame(bool fetch)
|
void AndroidCamera::fetchEachFrame(bool fetch)
|
||||||
{
|
{
|
||||||
Q_D(AndroidCamera);
|
Q_D(AndroidCamera);
|
||||||
@@ -1307,17 +1314,7 @@ void AndroidCameraPrivate::setJpegQuality(int quality)
|
|||||||
|
|
||||||
void AndroidCameraPrivate::startPreview()
|
void AndroidCameraPrivate::startPreview()
|
||||||
{
|
{
|
||||||
//We need to clear preview buffers queue here, but there is no method to do it
|
setupPreviewFrameCallback();
|
||||||
//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());
|
|
||||||
m_camera.callMethod<void>("startPreview");
|
m_camera.callMethod<void>("startPreview");
|
||||||
emit previewStarted();
|
emit previewStarted();
|
||||||
}
|
}
|
||||||
@@ -1338,6 +1335,21 @@ void AndroidCameraPrivate::takePicture()
|
|||||||
m_cameraListener.object());
|
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)
|
void AndroidCameraPrivate::fetchEachFrame(bool fetch)
|
||||||
{
|
{
|
||||||
m_cameraListener.callMethod<void>("fetchEachFrame", "(Z)V", fetch);
|
m_cameraListener.callMethod<void>("fetchEachFrame", "(Z)V", fetch);
|
||||||
|
|||||||
@@ -155,6 +155,7 @@ public:
|
|||||||
|
|
||||||
void takePicture();
|
void takePicture();
|
||||||
|
|
||||||
|
void setupPreviewFrameCallback();
|
||||||
void fetchEachFrame(bool fetch);
|
void fetchEachFrame(bool fetch);
|
||||||
void fetchLastPreviewFrame();
|
void fetchLastPreviewFrame();
|
||||||
QJNIObjectPrivate getCameraObject();
|
QJNIObjectPrivate getCameraObject();
|
||||||
|
|||||||
Reference in New Issue
Block a user