summaryrefslogtreecommitdiffstats
path: root/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/android/src/mediacapture/qandroidcamerasession.cpp')
-rw-r--r--src/plugins/android/src/mediacapture/qandroidcamerasession.cpp55
1 files changed, 44 insertions, 11 deletions
diff --git a/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp b/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
index 75b0c5e9b..3a50139c3 100644
--- a/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
+++ b/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
@@ -52,6 +52,41 @@
QT_BEGIN_NAMESPACE
+class DataVideoBuffer : public QAbstractVideoBuffer
+{
+public:
+ DataVideoBuffer(const QByteArray &d)
+ : QAbstractVideoBuffer(NoHandle)
+ , data(d)
+ , mode(NotMapped)
+ { }
+
+ MapMode mapMode() const { return mode; }
+
+ uchar *map(MapMode m, int *numBytes, int *bytesPerLine)
+ {
+ if (mode != NotMapped || m == NotMapped)
+ return 0;
+
+ mode = m;
+
+ if (numBytes)
+ *numBytes = data.size();
+
+ if (bytesPerLine)
+ *bytesPerLine = -1;
+
+ return reinterpret_cast<uchar *>(data.data());
+ }
+
+ void unmap() { mode = NotMapped; }
+
+private:
+ QByteArray data;
+ MapMode mode;
+};
+
+
QAndroidCameraSession::QAndroidCameraSession(QObject *parent)
: QObject(parent)
, m_selectedCamera(0)
@@ -205,8 +240,11 @@ void QAndroidCameraSession::adjustViewfinderSize(const QSize &captureSize, bool
QSize viewfinderResolution = m_camera->previewSize();
const qreal aspectRatio = qreal(captureSize.width()) / qreal(captureSize.height());
- if (qFuzzyCompare(aspectRatio, qreal(viewfinderResolution.width()) / qreal(viewfinderResolution.height())))
+ if (viewfinderResolution.isValid() &&
+ qFuzzyCompare(aspectRatio,
+ qreal(viewfinderResolution.width()) / viewfinderResolution.height())) {
return;
+ }
QList<QSize> previewSizes = m_camera->getSupportedPreviewSizes();
for (int i = previewSizes.count() - 1; i >= 0; --i) {
@@ -270,6 +308,7 @@ void QAndroidCameraSession::stopPreview()
JMultimediaUtils::enableOrientationListener(false);
m_camera->stopPreview();
+ m_camera->setPreviewSize(QSize());
if (m_videoOutput)
m_videoOutput->stop();
m_previewStarted = false;
@@ -459,6 +498,7 @@ void QAndroidCameraSession::onCameraPictureCaptured(const QByteArray &data)
QtConcurrent::run(this, &QAndroidCameraSession::processCapturedImage,
m_currentImageCaptureId,
data,
+ m_imageSettings.resolution(),
m_captureDestination,
m_currentImageCaptureFileName);
}
@@ -473,6 +513,7 @@ void QAndroidCameraSession::onCameraPictureCaptured(const QByteArray &data)
void QAndroidCameraSession::processCapturedImage(int id,
const QByteArray &data,
+ const QSize &resolution,
QCameraImageCapture::CaptureDestinations dest,
const QString &fileName)
{
@@ -505,16 +546,8 @@ void QAndroidCameraSession::processCapturedImage(int id,
}
if (dest & QCameraImageCapture::CaptureToBuffer) {
- QImage image;
- const bool ok = image.loadFromData(data, "JPG");
-
- if (ok) {
- QVideoFrame frame(image);
- emit imageAvailable(id, frame);
- } else {
- emit imageCaptureError(id, QCameraImageCapture::FormatError,
- tr("Could not load JPEG data from captured image"));
- }
+ QVideoFrame frame(new DataVideoBuffer(data), resolution, QVideoFrame::Format_Jpeg);
+ emit imageAvailable(id, frame);
}
}