Fixed crash when QCameraImageCapture is deleted before QMediaRecorder.
Change-Id: I3bbb87f03f122378e9367e1f2c0cc5b61fce6ed7 Reviewed-on: http://codereview.qt.nokia.com/3550 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Michael Goddard <michael.goddard@nokia.com>
This commit is contained in:
committed by
Qt by Nokia
parent
ba62df130c
commit
47a5dd4371
@@ -109,6 +109,7 @@ public:
|
|||||||
|
|
||||||
void _q_error(int id, int error, const QString &errorString);
|
void _q_error(int id, int error, const QString &errorString);
|
||||||
void _q_readyChanged(bool);
|
void _q_readyChanged(bool);
|
||||||
|
void _q_serviceDestroyed();
|
||||||
|
|
||||||
void unsetError() { error = QCameraImageCapture::NoError; errorString.clear(); }
|
void unsetError() { error = QCameraImageCapture::NoError; errorString.clear(); }
|
||||||
|
|
||||||
@@ -141,6 +142,14 @@ void QCameraImageCapturePrivate::_q_readyChanged(bool ready)
|
|||||||
emit q->readyForCaptureChanged(ready);
|
emit q->readyForCaptureChanged(ready);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QCameraImageCapturePrivate::_q_serviceDestroyed()
|
||||||
|
{
|
||||||
|
mediaObject = 0;
|
||||||
|
control = 0;
|
||||||
|
encoderControl = 0;
|
||||||
|
captureDestinationControl = 0;
|
||||||
|
bufferFormatControl = 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Constructs a media recorder which records the media produced by \a mediaObject.
|
Constructs a media recorder which records the media produced by \a mediaObject.
|
||||||
@@ -225,6 +234,8 @@ bool QCameraImageCapture::setMediaObject(QMediaObject *mediaObject)
|
|||||||
service->releaseControl(d->captureDestinationControl);
|
service->releaseControl(d->captureDestinationControl);
|
||||||
if (d->bufferFormatControl)
|
if (d->bufferFormatControl)
|
||||||
service->releaseControl(d->bufferFormatControl);
|
service->releaseControl(d->bufferFormatControl);
|
||||||
|
|
||||||
|
disconnect(service, SIGNAL(destroyed()), this, SLOT(_q_serviceDestroyed()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -269,6 +280,8 @@ bool QCameraImageCapture::setMediaObject(QMediaObject *mediaObject)
|
|||||||
this, SIGNAL(bufferFormatChanged(QVideoFrame::PixelFormat)));
|
this, SIGNAL(bufferFormatChanged(QVideoFrame::PixelFormat)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
connect(service, SIGNAL(destroyed()), this, SLOT(_q_serviceDestroyed()));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -145,6 +145,7 @@ private:
|
|||||||
Q_DECLARE_PRIVATE(QCameraImageCapture)
|
Q_DECLARE_PRIVATE(QCameraImageCapture)
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_error(int, int, const QString &))
|
Q_PRIVATE_SLOT(d_func(), void _q_error(int, int, const QString &))
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_readyChanged(bool))
|
Q_PRIVATE_SLOT(d_func(), void _q_readyChanged(bool))
|
||||||
|
Q_PRIVATE_SLOT(d_func(), void _q_serviceDestroyed())
|
||||||
};
|
};
|
||||||
|
|
||||||
Q_DECLARE_OPERATORS_FOR_FLAGS(QCameraImageCapture::CaptureDestinations)
|
Q_DECLARE_OPERATORS_FOR_FLAGS(QCameraImageCapture::CaptureDestinations)
|
||||||
|
|||||||
@@ -107,6 +107,7 @@ public slots:
|
|||||||
private slots:
|
private slots:
|
||||||
void constructor();
|
void constructor();
|
||||||
void mediaObject();
|
void mediaObject();
|
||||||
|
void deleteMediaObject();
|
||||||
void isReadyForCapture();
|
void isReadyForCapture();
|
||||||
void capture();
|
void capture();
|
||||||
void cancelCapture();
|
void cancelCapture();
|
||||||
@@ -165,6 +166,29 @@ void tst_QCameraImageCapture::mediaObject()
|
|||||||
QCOMPARE(medobj1, &camera1);
|
QCOMPARE(medobj1, &camera1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_QCameraImageCapture::deleteMediaObject()
|
||||||
|
{
|
||||||
|
MockMediaServiceProvider *provider = new MockMediaServiceProvider;
|
||||||
|
provider->service = new MockCameraService;
|
||||||
|
|
||||||
|
QCamera *camera = new QCamera(0, provider);
|
||||||
|
QCameraImageCapture *capture = new QCameraImageCapture(camera);
|
||||||
|
|
||||||
|
QVERIFY(capture->mediaObject() == camera);
|
||||||
|
QVERIFY(capture->isAvailable());
|
||||||
|
|
||||||
|
delete camera;
|
||||||
|
delete provider->service;
|
||||||
|
delete provider;
|
||||||
|
|
||||||
|
//capture should detach from camera
|
||||||
|
QVERIFY(capture->mediaObject() == 0);
|
||||||
|
QVERIFY(!capture->isAvailable());
|
||||||
|
|
||||||
|
capture->capture();
|
||||||
|
delete capture;
|
||||||
|
}
|
||||||
|
|
||||||
//MaemoAPI-1825:test isReadyForCapture
|
//MaemoAPI-1825:test isReadyForCapture
|
||||||
void tst_QCameraImageCapture::isReadyForCapture()
|
void tst_QCameraImageCapture::isReadyForCapture()
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user