void QMediaRecorderPrivate::restartCamera() { //restart camera if it can't apply new settings in the Active state QCamera *camera = qobject_cast<QCamera*>(mediaObject); if (camera && camera->captureMode() == QCamera::CaptureVideo) { QMetaObject::invokeMethod(camera, "_q_preparePropertyChange", Qt::DirectConnection, Q_ARG(int, QCameraControl::VideoEncodingSettings)); }
void tst_QCameraBackend::testCaptureMode() { QCamera camera; QSignalSpy errorSignal(&camera, SIGNAL(error(QCamera::Error))); QSignalSpy stateChangedSignal(&camera, SIGNAL(stateChanged(QCamera::State))); QSignalSpy captureModeSignal(&camera, SIGNAL(captureModeChanged(QCamera::CaptureModes))); QCOMPARE(camera.captureMode(), QCamera::CaptureStillImage); if (!camera.isCaptureModeSupported(QCamera::CaptureVideo)) { camera.setCaptureMode(QCamera::CaptureVideo); QCOMPARE(camera.captureMode(), QCamera::CaptureStillImage); QSKIP("Video capture not supported"); } camera.setCaptureMode(QCamera::CaptureVideo); QCOMPARE(camera.captureMode(), QCamera::CaptureVideo); QTRY_COMPARE(captureModeSignal.size(), 1); QCOMPARE(captureModeSignal.last().first().value<QCamera::CaptureModes>(), QCamera::CaptureVideo); captureModeSignal.clear(); camera.load(); QTRY_COMPARE(camera.status(), QCamera::LoadedStatus); //capture mode should still be video QCOMPARE(camera.captureMode(), QCamera::CaptureVideo); //it should be possible to switch capture mode in Loaded state camera.setCaptureMode(QCamera::CaptureStillImage); QTRY_COMPARE(captureModeSignal.size(), 1); QCOMPARE(captureModeSignal.last().first().value<QCamera::CaptureModes>(), QCamera::CaptureStillImage); captureModeSignal.clear(); camera.setCaptureMode(QCamera::CaptureVideo); QTRY_COMPARE(captureModeSignal.size(), 1); QCOMPARE(captureModeSignal.last().first().value<QCamera::CaptureModes>(), QCamera::CaptureVideo); captureModeSignal.clear(); camera.start(); QTRY_COMPARE(camera.status(), QCamera::ActiveStatus); //capture mode should still be video QCOMPARE(camera.captureMode(), QCamera::CaptureVideo); stateChangedSignal.clear(); //it should be possible to switch capture mode in Active state camera.setCaptureMode(QCamera::CaptureStillImage); //camera may leave Active status, but should return to Active QTest::qWait(10); //camera may leave Active status async QTRY_COMPARE(camera.status(), QCamera::ActiveStatus); QCOMPARE(camera.captureMode(), QCamera::CaptureStillImage); QVERIFY2(stateChangedSignal.isEmpty(), "camera should not change the state during capture mode changes"); QCOMPARE(captureModeSignal.size(), 1); QCOMPARE(captureModeSignal.last().first().value<QCamera::CaptureModes>(), QCamera::CaptureStillImage); captureModeSignal.clear(); camera.setCaptureMode(QCamera::CaptureVideo); //camera may leave Active status, but should return to Active QTest::qWait(10); //camera may leave Active status async QTRY_COMPARE(camera.status(), QCamera::ActiveStatus); QCOMPARE(camera.captureMode(), QCamera::CaptureVideo); QVERIFY2(stateChangedSignal.isEmpty(), "camera should not change the state during capture mode changes"); QCOMPARE(captureModeSignal.size(), 1); QCOMPARE(captureModeSignal.last().first().value<QCamera::CaptureModes>(), QCamera::CaptureVideo); captureModeSignal.clear(); camera.stop(); QCOMPARE(camera.captureMode(), QCamera::CaptureVideo); camera.unload(); QCOMPARE(camera.captureMode(), QCamera::CaptureVideo); QVERIFY2(errorSignal.isEmpty(), QString("Camera error: %1").arg(camera.errorString()).toLocal8Bit()); }