summaryrefslogtreecommitdiffstats
path: root/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
diff options
context:
space:
mode:
authorYoann Lopes <yoann.lopes@digia.com>2013-11-06 14:27:00 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-11-06 14:28:16 +0100
commit301baf2b689bfdcc21a374b8831765a3fa63a174 (patch)
tree3a18297af8bfb07ab8528cc40ce12259927b9566 /src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
parent2412c298d4e8c112a63eb1e3ec9b5f2789bd3eeb (diff)
Android: use correct format when capturing a picture to a buffer.
Don't decode the JPEG data to raw RGB using QImage. QCameraImageCapture reports anyway that JPEG is the only supported buffer format. Change-Id: Ib17760e4361b004775c002b686ef7529b3768aab Reviewed-by: Christian Stromme <christian.stromme@digia.com>
Diffstat (limited to 'src/plugins/android/src/mediacapture/qandroidcamerasession.cpp')
-rw-r--r--src/plugins/android/src/mediacapture/qandroidcamerasession.cpp49
1 files changed, 39 insertions, 10 deletions
diff --git a/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp b/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
index 075fe78e5..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)
@@ -463,6 +498,7 @@ void QAndroidCameraSession::onCameraPictureCaptured(const QByteArray &data)
QtConcurrent::run(this, &QAndroidCameraSession::processCapturedImage,
m_currentImageCaptureId,
data,
+ m_imageSettings.resolution(),
m_captureDestination,
m_currentImageCaptureFileName);
}
@@ -477,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)
{
@@ -509,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);
}
}