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>
This commit is contained in:
Yoann Lopes
2013-11-06 14:27:00 +01:00
committed by The Qt Project
parent 2412c298d4
commit 301baf2b68
2 changed files with 40 additions and 10 deletions

View File

@@ -52,6 +52,41 @@
QT_BEGIN_NAMESPACE 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) QAndroidCameraSession::QAndroidCameraSession(QObject *parent)
: QObject(parent) : QObject(parent)
, m_selectedCamera(0) , m_selectedCamera(0)
@@ -463,6 +498,7 @@ void QAndroidCameraSession::onCameraPictureCaptured(const QByteArray &data)
QtConcurrent::run(this, &QAndroidCameraSession::processCapturedImage, QtConcurrent::run(this, &QAndroidCameraSession::processCapturedImage,
m_currentImageCaptureId, m_currentImageCaptureId,
data, data,
m_imageSettings.resolution(),
m_captureDestination, m_captureDestination,
m_currentImageCaptureFileName); m_currentImageCaptureFileName);
} }
@@ -477,6 +513,7 @@ void QAndroidCameraSession::onCameraPictureCaptured(const QByteArray &data)
void QAndroidCameraSession::processCapturedImage(int id, void QAndroidCameraSession::processCapturedImage(int id,
const QByteArray &data, const QByteArray &data,
const QSize &resolution,
QCameraImageCapture::CaptureDestinations dest, QCameraImageCapture::CaptureDestinations dest,
const QString &fileName) const QString &fileName)
{ {
@@ -509,16 +546,8 @@ void QAndroidCameraSession::processCapturedImage(int id,
} }
if (dest & QCameraImageCapture::CaptureToBuffer) { if (dest & QCameraImageCapture::CaptureToBuffer) {
QImage image; QVideoFrame frame(new DataVideoBuffer(data), resolution, QVideoFrame::Format_Jpeg);
const bool ok = image.loadFromData(data, "JPG"); emit imageAvailable(id, frame);
if (ok) {
QVideoFrame frame(image);
emit imageAvailable(id, frame);
} else {
emit imageCaptureError(id, QCameraImageCapture::FormatError,
tr("Could not load JPEG data from captured image"));
}
} }
} }

View File

@@ -127,6 +127,7 @@ private:
void processPreviewImage(int id, const QByteArray &data); void processPreviewImage(int id, const QByteArray &data);
void processCapturedImage(int id, void processCapturedImage(int id,
const QByteArray &data, const QByteArray &data,
const QSize &resolution,
QCameraImageCapture::CaptureDestinations dest, QCameraImageCapture::CaptureDestinations dest,
const QString &fileName); const QString &fileName);