Merge lp:qtubuntu-camera/staging into lp:qtubuntu-camera

Proposed by Florian Boucault
Status: Merged
Approved by: Florian Boucault
Approved revision: 179
Merged at revision: 157
Proposed branch: lp:qtubuntu-camera/staging
Merge into: lp:qtubuntu-camera
Diff against target: 1363 lines (+394/-621)
20 files modified
aalCamera.pro (+0/-1)
src/aalcamerafocuscontrol.cpp (+1/-1)
src/aalimagecapturecontrol.cpp (+63/-133)
src/aalimagecapturecontrol.h (+8/-4)
src/storagemanager.cpp (+173/-1)
src/storagemanager.h (+29/-5)
unittests/aalcamerafocuscontrol/aalcamerafocuscontrol.pro (+3/-1)
unittests/aalcamerafocuscontrol/aalimagecapturecontrol.cpp (+10/-8)
unittests/aalcamerafocuscontrol/storagemanager.cpp (+76/-0)
unittests/aalcamerafocuscontrol/tst_aalcamerafocuscontrol.cpp (+2/-2)
unittests/aalimagecapturecontrol/aalcameraservice.cpp (+0/-99)
unittests/aalimagecapturecontrol/aalimagecapturecontrol.pro (+0/-31)
unittests/aalimagecapturecontrol/aalimageencodercontrol.cpp (+0/-125)
unittests/aalimagecapturecontrol/aalvideorenderercontrol.cpp (+0/-84)
unittests/aalimagecapturecontrol/storagemanager.cpp (+0/-50)
unittests/aalimagecapturecontrol/tst_aalimagecapturecontrol.cpp (+0/-74)
unittests/storagemanager/storagemanager.pro (+5/-0)
unittests/storagemanager/tst_storagemanager.cpp (+22/-0)
unittests/stubs/storagemanager_stub.cpp (+2/-1)
unittests/unittests.pro (+0/-1)
To merge this branch: bzr merge lp:qtubuntu-camera/staging
Reviewer Review Type Date Requested Status
PS Jenkins bot continuous-integration Approve
Ubuntu Phablet Team Pending
Review via email: mp+286880@code.launchpad.net

Commit message

New release:
- Performance improvements to minimize the time necessary between when pressing the shutter button and being able to capture the next pitcure. Remove sliding out the preview as a part of this.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'aalCamera.pro'
--- aalCamera.pro 2015-11-12 10:32:24 +0000
+++ aalCamera.pro 2016-02-23 11:36:01 +0000
@@ -5,5 +5,4 @@
5SUBDIRS += \5SUBDIRS += \
6 src \6 src \
7 unittests7 unittests
8
9OTHER_FILES += .qmake.conf8OTHER_FILES += .qmake.conf
109
=== modified file 'src/aalcamerafocuscontrol.cpp'
--- src/aalcamerafocuscontrol.cpp 2015-10-14 13:54:37 +0000
+++ src/aalcamerafocuscontrol.cpp 2016-02-23 11:36:01 +0000
@@ -212,7 +212,7 @@
212 int centerX = (point.x() * (2* focusFullSize)) - focusFullSize;212 int centerX = (point.x() * (2* focusFullSize)) - focusFullSize;
213 int maxCenterPosition = focusFullSize - focusRegionSize;213 int maxCenterPosition = focusFullSize - focusRegionSize;
214 centerX = std::max(std::min(centerX, maxCenterPosition), -maxCenterPosition);214 centerX = std::max(std::min(centerX, maxCenterPosition), -maxCenterPosition);
215 int centerY = -1 * ((point.y() * (2 * focusFullSize)) - focusFullSize);215 int centerY = (point.y() * (2 * focusFullSize)) - focusFullSize;
216 centerY = std::max(std::min(centerY, maxCenterPosition), -maxCenterPosition);216 centerY = std::max(std::min(centerY, maxCenterPosition), -maxCenterPosition);
217217
218 FocusRegion region;218 FocusRegion region;
219219
=== modified file 'src/aalimagecapturecontrol.cpp'
--- src/aalimagecapturecontrol.cpp 2016-01-11 15:10:38 +0000
+++ src/aalimagecapturecontrol.cpp 2016-02-23 11:36:01 +0000
@@ -19,13 +19,14 @@
19#include "aalimageencodercontrol.h"19#include "aalimageencodercontrol.h"
20#include "aalmetadatawritercontrol.h"20#include "aalmetadatawritercontrol.h"
21#include "aalvideorenderercontrol.h"21#include "aalvideorenderercontrol.h"
22#include "aalviewfindersettingscontrol.h"
22#include "storagemanager.h"23#include "storagemanager.h"
2324
24#include <hybris/camera/camera_compatibility_layer.h>25#include <hybris/camera/camera_compatibility_layer.h>
25#include <hybris/camera/camera_compatibility_layer_capabilities.h>26#include <hybris/camera/camera_compatibility_layer_capabilities.h>
26#include <exiv2/exiv2.hpp>
2727
28#include <QDir>28#include <QDir>
29#include <QObject>
29#include <QFile>30#include <QFile>
30#include <QFileInfo>31#include <QFileInfo>
31#include <QMediaPlayer>32#include <QMediaPlayer>
@@ -34,8 +35,7 @@
34#include <QGuiApplication>35#include <QGuiApplication>
35#include <QScreen>36#include <QScreen>
36#include <QSettings>37#include <QSettings>
3738#include <QtConcurrent/QtConcurrent>
38#include <cmath>
3939
40AalImageCaptureControl::AalImageCaptureControl(AalCameraService *service, QObject *parent)40AalImageCaptureControl::AalImageCaptureControl(AalCameraService *service, QObject *parent)
41 : QCameraImageCaptureControl(parent),41 : QCameraImageCaptureControl(parent),
@@ -43,7 +43,7 @@
43 m_cameraControl(service->cameraControl()),43 m_cameraControl(service->cameraControl()),
44 m_lastRequestId(0),44 m_lastRequestId(0),
45 m_ready(false),45 m_ready(false),
46 m_pendingCaptureFile(),46 m_targetFileName(),
47 m_captureCancelled(false),47 m_captureCancelled(false),
48 m_screenAspectRatio(0.0),48 m_screenAspectRatio(0.0),
49 m_audioPlayer(new QMediaPlayer(this))49 m_audioPlayer(new QMediaPlayer(this))
@@ -55,6 +55,9 @@
55#else55#else
56 m_audioPlayer->setAudioRole(QAudio::NotificationRole);56 m_audioPlayer->setAudioRole(QAudio::NotificationRole);
57#endif57#endif
58
59 QObject::connect(&m_storageManager, &StorageManager::previewReady,
60 this, &AalImageCaptureControl::imageCaptured);
58}61}
5962
60AalImageCaptureControl::~AalImageCaptureControl()63AalImageCaptureControl::~AalImageCaptureControl()
@@ -76,58 +79,24 @@
76 return m_lastRequestId;79 return m_lastRequestId;
77 }80 }
7881
82 m_targetFileName = fileName;
79 m_captureCancelled = false;83 m_captureCancelled = false;
80 QFileInfo fi(fileName);
81 if (fileName.isEmpty() || fi.isDir()) {
82 m_pendingCaptureFile = m_storageManager.nextPhotoFileName(fileName);
83 } else {
84 m_pendingCaptureFile = fileName;
85 }
86 bool diskOk = m_storageManager.checkDirectory(m_pendingCaptureFile);
87 if (!diskOk) {
88 emit error(m_lastRequestId, QCameraImageCapture::ResourceError,
89 QString("Won't be able to save file %1 to disk").arg(m_pendingCaptureFile));
90 return m_lastRequestId;
91 }
9284
93 AalMetaDataWriterControl* metadataControl = m_service->metadataWriterControl();85 AalMetaDataWriterControl* metadataControl = m_service->metadataWriterControl();
94
95 int rotation = metadataControl->correctedOrientation();86 int rotation = metadataControl->correctedOrientation();
96 android_camera_set_rotation(m_service->androidControl(), rotation);87 android_camera_set_rotation(m_service->androidControl(), rotation);
9788
98 QStringList availableMetadata = metadataControl->availableMetaData();
99 if (availableMetadata.contains("GPSLatitude") &&
100 availableMetadata.contains("GPSLongitude") &&
101 availableMetadata.contains("GPSTimeStamp")) {
102 float latitude = metadataControl->metaData("GPSLatitude").toFloat();
103 float longitude = metadataControl->metaData("GPSLongitude").toFloat();
104 float altitude = 0.0f;
105 if (availableMetadata.contains("GPSAltitude")) {
106 altitude = metadataControl->metaData("GPSAltitude").toFloat();
107 }
108 QDateTime timestamp = metadataControl->metaData("GPSTimeStamp").toDateTime();
109 QString processingMethod = metadataControl->metaData("GPSProcessingMethod").toString();
110 android_camera_set_location(m_service->androidControl(),
111 &latitude, &longitude, &altitude,
112 timestamp.toTime_t(),
113 processingMethod.toLocal8Bit().constData());
114 }
115
116 android_camera_take_snapshot(m_service->androidControl());89 android_camera_take_snapshot(m_service->androidControl());
11790
118 m_service->updateCaptureReady();91 m_service->updateCaptureReady();
11992
120 m_service->videoOutputControl()->createPreview();
121
122 m_service->metadataWriterControl()->clearAllMetaData();
123
124 return m_lastRequestId;93 return m_lastRequestId;
125}94}
12695
127void AalImageCaptureControl::cancelCapture()96void AalImageCaptureControl::cancelCapture()
128{97{
129 m_captureCancelled = true;98 m_captureCancelled = true;
130 m_pendingCaptureFile.clear();99 m_targetFileName.clear();
131}100}
132101
133void AalImageCaptureControl::shutterCB(void *context)102void AalImageCaptureControl::shutterCB(void *context)
@@ -140,7 +109,14 @@
140void AalImageCaptureControl::saveJpegCB(void *data, uint32_t data_size, void *context)109void AalImageCaptureControl::saveJpegCB(void *data, uint32_t data_size, void *context)
141{110{
142 Q_UNUSED(context);111 Q_UNUSED(context);
143 AalCameraService::instance()->imageCaptureControl()->saveJpeg(data, data_size);112
113 // Copy the data buffer so that it is safe to pass it off to another thread,
114 // since it will be destroyed once this function returns
115 QByteArray dataCopy((const char*)data, data_size);
116
117 QMetaObject::invokeMethod(AalCameraService::instance()->imageCaptureControl(),
118 "saveJpeg", Qt::QueuedConnection,
119 Q_ARG(QByteArray, dataCopy));
144}120}
145121
146void AalImageCaptureControl::init(CameraControl *control, CameraControlListener *listener)122void AalImageCaptureControl::init(CameraControl *control, CameraControlListener *listener)
@@ -153,12 +129,6 @@
153 connect(m_service->videoOutputControl(), SIGNAL(previewReady()), this, SLOT(onPreviewReady()));129 connect(m_service->videoOutputControl(), SIGNAL(previewReady()), this, SLOT(onPreviewReady()));
154}130}
155131
156void AalImageCaptureControl::onPreviewReady()
157{
158 // The preview image was fully captured, notify the UI layer
159 Q_EMIT imageCaptured(m_lastRequestId, m_service->videoOutputControl()->preview());
160}
161
162void AalImageCaptureControl::setReady(bool ready)132void AalImageCaptureControl::setReady(bool ready)
163{133{
164 if (m_ready != ready) {134 if (m_ready != ready) {
@@ -169,7 +139,7 @@
169139
170bool AalImageCaptureControl::isCaptureRunning() const140bool AalImageCaptureControl::isCaptureRunning() const
171{141{
172 return !m_pendingCaptureFile.isNull();142 return !m_targetFileName.isEmpty();
173}143}
174144
175void AalImageCaptureControl::shutter()145void AalImageCaptureControl::shutter()
@@ -181,96 +151,56 @@
181 Q_EMIT imageExposed(m_lastRequestId);151 Q_EMIT imageExposed(m_lastRequestId);
182}152}
183153
184bool AalImageCaptureControl::updateJpegMetadata(void* data, uint32_t dataSize, QTemporaryFile* destination)154void AalImageCaptureControl::saveJpeg(const QByteArray& data)
185{
186 if (data == 0 || destination == 0) return false;
187
188 Exiv2::Image::AutoPtr image;
189 try {
190 image = Exiv2::ImageFactory::open(static_cast<Exiv2::byte*>(data), dataSize);
191 if (!image.get()) {
192 return false;
193 }
194 } catch(const Exiv2::AnyError&) {
195 return false;
196 }
197
198 try {
199 image->readMetadata();
200 Exiv2::ExifData ed = image->exifData();
201 const QString now = QDateTime::currentDateTime().toString("yyyy:MM:dd HH:mm:ss");
202 ed["Exif.Photo.DateTimeOriginal"].setValue(now.toStdString());
203 ed["Exif.Photo.DateTimeDigitized"].setValue(now.toStdString());
204 image->setExifData(ed);
205 image->writeMetadata();
206 } catch(const Exiv2::AnyError&) {
207 return false;
208 }
209
210 if (!destination->open()) {
211 return false;
212 }
213
214 try {
215 Exiv2::BasicIo& io = image->io();
216 char* modifiedMetadata = reinterpret_cast<char*>(io.mmap());
217 const long size = io.size();
218 const qint64 writtenSize = destination->write(modifiedMetadata, size);
219 io.munmap();
220 destination->close();
221 return (writtenSize == size);
222
223 } catch(const Exiv2::AnyError&) {
224 destination->close();
225 return false;
226 }
227}
228
229void AalImageCaptureControl::saveJpeg(void *data, uint32_t dataSize)
230{155{
231 if (m_captureCancelled) {156 if (m_captureCancelled) {
232 m_captureCancelled = false;157 m_captureCancelled = false;
233 return;158 return;
234 }159 }
235160
236 if (m_pendingCaptureFile.isNull() || !m_service->androidControl())161 // Copy the metadata so that we can clear its container
237 return;162 QVariantMap metadata;
238163 AalMetaDataWriterControl* metadataControl = m_service->metadataWriterControl();
239 QTemporaryFile file;164 Q_FOREACH(QString key, metadataControl->availableMetaData()) {
240 if (!updateJpegMetadata(data, dataSize, &file)) {165 metadata.insert(key, metadataControl->metaData(key));
241 qWarning() << "Failed to update EXIF timestamps. Picture will be saved as UTC timezone.";166 }
242 if (!file.open()) {167 m_service->metadataWriterControl()->clearAllMetaData();
243 emit error(m_lastRequestId, QCameraImageCapture::ResourceError,168
244 QString("Could not open temprary file %1").arg(file.fileName()));169 QString fileName = m_targetFileName;
245 m_pendingCaptureFile.clear();170 m_targetFileName.clear();
246 m_service->updateCaptureReady();171
247 return;172 AalViewfinderSettingsControl* viewfinder = m_service->viewfinderControl();
248 }173 QSize resolution = viewfinder->viewfinderParameter(QCameraViewfinderSettingsControl::Resolution).toSize();
249174
250 const qint64 writtenSize = file.write(static_cast<const char*>(data), dataSize);175 // Restart the viewfinder and notify that the camera is ready to capture again
251 file.close();176 if (m_service->androidControl()) {
252 if (writtenSize != dataSize) {177 android_camera_start_preview(m_service->androidControl());
253 emit error(m_lastRequestId, QCameraImageCapture::ResourceError,178 }
254 QString("Could not write file %1").arg(file.fileName()));
255 m_pendingCaptureFile.clear();
256 m_service->updateCaptureReady();
257 return;
258 }
259 }
260
261 QFile finalFile(file.fileName());
262 bool ok = finalFile.rename(m_pendingCaptureFile);
263 if (!ok) {
264 emit error(m_lastRequestId, QCameraImageCapture::ResourceError,
265 QString("Could not save image to %1").arg(m_pendingCaptureFile));
266 m_pendingCaptureFile.clear();
267 m_service->updateCaptureReady();
268 return;
269 }
270
271 Q_EMIT imageSaved(m_lastRequestId, m_pendingCaptureFile);
272 m_pendingCaptureFile.clear();
273
274 android_camera_start_preview(m_service->androidControl());
275 m_service->updateCaptureReady();179 m_service->updateCaptureReady();
180
181 DiskWriteWatcher* watcher = new DiskWriteWatcher(this);
182 QObject::connect(watcher, &QFutureWatcher<QString>::finished, this, &AalImageCaptureControl::onImageFileSaved);
183 m_pendingSaveOperations.insert(watcher, m_lastRequestId);
184
185 QFuture<SaveToDiskResult> future = QtConcurrent::run(&m_storageManager, &StorageManager::saveJpegImage,
186 data, metadata, fileName, resolution, m_lastRequestId);
187 watcher->setFuture(future);
188}
189
190void AalImageCaptureControl::onImageFileSaved()
191{
192 DiskWriteWatcher* watcher = static_cast<DiskWriteWatcher*>(sender());
193
194 if (m_pendingSaveOperations.contains(watcher)) {
195 int requestID = m_pendingSaveOperations.take(watcher);
196
197 SaveToDiskResult result = watcher->result();
198 delete watcher;
199
200 if (result.success) {
201 Q_EMIT imageSaved(requestID, result.fileName);
202 } else {
203 Q_EMIT error(requestID, QCameraImageCapture::ResourceError, result.errorMessage);
204 }
205 }
276}206}
277207
=== modified file 'src/aalimagecapturecontrol.h'
--- src/aalimagecapturecontrol.h 2016-01-11 15:10:38 +0000
+++ src/aalimagecapturecontrol.h 2016-02-23 11:36:01 +0000
@@ -20,7 +20,7 @@
20#include <QCameraImageCaptureControl>20#include <QCameraImageCaptureControl>
21#include <QSettings>21#include <QSettings>
22#include <QString>22#include <QString>
23#include <QTemporaryFile>23#include <QFutureWatcher>
24#include <storagemanager.h>24#include <storagemanager.h>
2525
26#include <stdint.h>26#include <stdint.h>
@@ -31,6 +31,8 @@
31class CameraControlListener;31class CameraControlListener;
32class QMediaPlayer;32class QMediaPlayer;
3333
34typedef QFutureWatcher<SaveToDiskResult> DiskWriteWatcher;
35
34class AalImageCaptureControl : public QCameraImageCaptureControl36class AalImageCaptureControl : public QCameraImageCaptureControl
35{37{
36Q_OBJECT38Q_OBJECT
@@ -55,13 +57,13 @@
5557
56public Q_SLOTS:58public Q_SLOTS:
57 void init(CameraControl *control, CameraControlListener *listener);59 void init(CameraControl *control, CameraControlListener *listener);
58 void onPreviewReady();60 void onImageFileSaved();
5961
60private Q_SLOTS:62private Q_SLOTS:
61 void shutter();63 void shutter();
64 void saveJpeg(const QByteArray& data);
6265
63private:66private:
64 void saveJpeg(void* data, uint32_t dataSize);
65 bool updateJpegMetadata(void* data, uint32_t dataSize, QTemporaryFile* destination);67 bool updateJpegMetadata(void* data, uint32_t dataSize, QTemporaryFile* destination);
6668
67 AalCameraService *m_service;69 AalCameraService *m_service;
@@ -69,7 +71,7 @@
69 int m_lastRequestId;71 int m_lastRequestId;
70 StorageManager m_storageManager;72 StorageManager m_storageManager;
71 bool m_ready;73 bool m_ready;
72 QString m_pendingCaptureFile;74 QString m_targetFileName;
73 bool m_captureCancelled;75 bool m_captureCancelled;
74 float m_screenAspectRatio;76 float m_screenAspectRatio;
75 /// Maintains a list of highest priority aspect ratio to lowest, for the77 /// Maintains a list of highest priority aspect ratio to lowest, for the
@@ -78,6 +80,8 @@
78 QString m_galleryPath;80 QString m_galleryPath;
79 QMediaPlayer *m_audioPlayer;81 QMediaPlayer *m_audioPlayer;
80 QSettings m_settings;82 QSettings m_settings;
83
84 QMap<DiskWriteWatcher*, int> m_pendingSaveOperations;
81};85};
8286
83#endif87#endif
8488
=== modified file 'src/storagemanager.cpp'
--- src/storagemanager.cpp 2014-09-10 19:48:00 +0000
+++ src/storagemanager.cpp 2016-02-23 11:36:01 +0000
@@ -15,12 +15,18 @@
15 */15 */
1616
17#include "storagemanager.h"17#include "storagemanager.h"
18
18#include <QDateTime>19#include <QDateTime>
19#include <QDebug>20#include <QDebug>
20#include <QDir>21#include <QDir>
21#include <QFileInfo>22#include <QFileInfo>
22#include <QStandardPaths>23#include <QStandardPaths>
23#include <QCoreApplication>24#include <QCoreApplication>
25#include <QBuffer>
26#include <QImageReader>
27
28#include <exiv2/exiv2.hpp>
29#include <cmath>
2430
25const QLatin1String photoBase = QLatin1String("image");31const QLatin1String photoBase = QLatin1String("image");
26const QLatin1String videoBase = QLatin1String("video");32const QLatin1String videoBase = QLatin1String("video");
@@ -28,7 +34,7 @@
28const QLatin1String videoExtension = QLatin1String("mp4");34const QLatin1String videoExtension = QLatin1String("mp4");
29const QLatin1String dateFormat = QLatin1String("yyyyMMdd_HHmmsszzz");35const QLatin1String dateFormat = QLatin1String("yyyyMMdd_HHmmsszzz");
3036
31StorageManager::StorageManager()37StorageManager::StorageManager(QObject* parent) : QObject(parent)
32{38{
33}39}
3440
@@ -87,3 +93,169 @@
87 .arg(date)93 .arg(date)
88 .arg(extension);94 .arg(extension);
89}95}
96
97bool StorageManager::updateJpegMetadata(QByteArray data, QVariantMap metadata, QTemporaryFile* destination)
98{
99 if (data.isEmpty() || destination == 0) return false;
100
101 Exiv2::Image::AutoPtr image;
102 try {
103 image = Exiv2::ImageFactory::open(static_cast<const Exiv2::byte*>((const unsigned char*)data.constData()), data.size());
104 if (!image.get()) {
105 return false;
106 }
107 } catch(const Exiv2::AnyError&) {
108 return false;
109 }
110
111 try {
112 image->readMetadata();
113 Exiv2::ExifData ed = image->exifData();
114 const QString now = QDateTime::currentDateTime().toString("yyyy:MM:dd HH:mm:ss");
115 ed["Exif.Photo.DateTimeOriginal"].setValue(now.toStdString());
116 ed["Exif.Photo.DateTimeDigitized"].setValue(now.toStdString());
117
118 if (metadata.contains("GPSLatitude") &&
119 metadata.contains("GPSLongitude") &&
120 metadata.contains("GPSTimeStamp")) {
121
122 // Write all GPS metadata according to version 2.2 of the EXIF spec,
123 // which is what Android did. See: http://www.exiv2.org/Exif2-2.PDF
124 const char version[4] = {2, 2, 0, 0};
125 Exiv2::DataValue versionValue(Exiv2::unsignedByte);
126 versionValue.read((const Exiv2::byte*)version, 4);
127 ed.add(Exiv2::ExifKey("Exif.GPSInfo.GPSVersionID"), &versionValue);
128
129 // According to the spec, the GPS processing method is a buffer of type Undefined, which
130 // does not need to be zero terminated. It should be prepended by an 8 byte, zero padded
131 // string specifying the encoding.
132 const char methodHeader[8] = {'A', 'S', 'C', 'I', 'I', 0, 0, 0};
133 QByteArray method = metadata.value("GPSProcessingMethod").toString().toLatin1();
134 method.prepend(methodHeader, 8);
135 Exiv2::DataValue methodValue(Exiv2::undefined);
136 methodValue.read((const Exiv2::byte*)method.constData(), method.size());
137 ed.add(Exiv2::ExifKey("Exif.GPSInfo.GPSProcessingMethod"), &methodValue);
138
139 double latitude = metadata.value("GPSLatitude").toDouble();
140 ed["Exif.GPSInfo.GPSLatitude"] = decimalToExifRational(latitude).toStdString();
141 ed["Exif.GPSInfo.GPSLatitudeRef"] = (latitude < 0 ) ? "S" : "N";
142
143 double longitude = metadata.value("GPSLongitude").toDouble();
144 ed["Exif.GPSInfo.GPSLongitude"] = decimalToExifRational(longitude).toStdString();
145 ed["Exif.GPSInfo.GPSLongitudeRef"] = (longitude < 0 ) ? "W" : "E";
146
147 if (metadata.contains("GPSAltitude")) {
148 // Assume altitude precision to the meter
149 unsigned int altitude = floor(metadata.value("GPSAltitude").toDouble());
150 Exiv2::URationalValue::AutoPtr altitudeValue(new Exiv2::URationalValue);
151 altitudeValue->value_.push_back(std::make_pair(altitude,1));
152 ed.add(Exiv2::ExifKey("Exif.GPSInfo.GPSAltitude"), altitudeValue.get());
153
154 // Byte field of lenght 1. Value of 0 means the reference is sea level.
155 const char reference = 0;
156 Exiv2::DataValue referenceValue(Exiv2::unsignedByte);
157 referenceValue.read((const Exiv2::byte*) &reference, 1);
158 ed.add(Exiv2::ExifKey("Exif.GPSInfo.GPSAltitudeRef"), &referenceValue);
159 }
160
161 QDateTime stamp = metadata.value("GPSTimeStamp").toDateTime();
162 ed["Exif.GPSInfo.GPSTimeStamp"] = stamp.toString("HH/1 mm/1 ss/1").toStdString();
163 ed["Exif.GPSInfo.GPSDateStamp"] = stamp.toString("yyyy:MM:dd").toStdString();
164 }
165
166 image->setExifData(ed);
167 image->writeMetadata();
168 } catch(const Exiv2::AnyError&) {
169 return false;
170 }
171
172 if (!destination->open()) {
173 return false;
174 }
175
176 try {
177 Exiv2::BasicIo& io = image->io();
178 char* modifiedMetadata = reinterpret_cast<char*>(io.mmap());
179 const long size = io.size();
180 const qint64 writtenSize = destination->write(modifiedMetadata, size);
181 io.munmap();
182 destination->close();
183 return (writtenSize == size);
184
185 } catch(const Exiv2::AnyError&) {
186 destination->close();
187 return false;
188 }
189}
190
191SaveToDiskResult StorageManager::saveJpegImage(QByteArray data, QVariantMap metadata, QString fileName,
192 QSize previewResolution, int captureID)
193{
194 SaveToDiskResult result;
195
196 QString captureFile;
197 QFileInfo fi(fileName);
198 if (fileName.isEmpty() || fi.isDir()) {
199 captureFile = nextPhotoFileName(fileName);
200 } else {
201 captureFile = fileName;
202 }
203 result.fileName = captureFile;
204
205 bool diskOk = checkDirectory(captureFile);
206 if (!diskOk) {
207 result.errorMessage = QString("Won't be able to save file %1 to disk").arg(captureFile);
208 return result;
209 }
210
211 QBuffer buffer(&data);
212 QImageReader reader(&buffer, "jpg");
213
214 QSize scaledSize = reader.size(); // fast, as it does not decode the JPEG
215 scaledSize.scale(previewResolution, Qt::KeepAspectRatio);
216 reader.setScaledSize(scaledSize);
217 reader.setQuality(25);
218 QImage image = reader.read();
219 Q_EMIT previewReady(captureID, image);
220
221 QTemporaryFile file;
222 if (!updateJpegMetadata(data, metadata, &file)) {
223 qWarning() << "Failed to update EXIF timestamps. Picture will be saved as UTC timezone.";
224 if (!file.open()) {
225 result.errorMessage = QString("Could not open temprary file %1").arg(file.fileName());
226 return result;
227 }
228
229 const qint64 writtenSize = file.write(data);
230 file.close();
231 if (writtenSize != data.size()) {
232 result.errorMessage = QString("Could not write file %1").arg(fileName);
233 return result;
234 }
235 }
236
237 QFile finalFile(file.fileName());
238 bool ok = finalFile.rename(captureFile);
239 if (!ok) {
240 result.errorMessage = QString("Could not save image to %1").arg(fileName);
241 return result;
242 }
243
244 result.success = true;
245 return result;
246}
247
248QString StorageManager::decimalToExifRational(double decimal)
249{
250 decimal = fabs(decimal);
251 unsigned int degrees = floor(decimal);
252 unsigned int minutes = floor((decimal - degrees) * 60);
253 double seconds = (decimal - degrees - minutes / 60) * 3600;
254 seconds = floor(seconds * 100);
255
256 return QString("%1/1 %2/1 %3/100").arg(degrees).arg(minutes).arg(seconds);
257}
258
259SaveToDiskResult::SaveToDiskResult() : success(false)
260{
261}
90262
=== modified file 'src/storagemanager.h'
--- src/storagemanager.h 2014-09-10 19:48:00 +0000
+++ src/storagemanager.h 2016-02-23 11:36:01 +0000
@@ -18,19 +18,43 @@
18#define STORAGEMANAGER_H18#define STORAGEMANAGER_H
1919
20#include <QString>20#include <QString>
2121#include <QVariantMap>
22class StorageManager22#include <QByteArray>
23{23#include <QTemporaryFile>
24public:24#include <QImage>
25 StorageManager();25
26class SaveToDiskResult
27{
28public:
29 SaveToDiskResult();
30 bool success;
31 QString fileName;
32 QString errorMessage;
33};
34
35class StorageManager : public QObject
36{
37 Q_OBJECT
38
39public:
40 explicit StorageManager(QObject* parent = 0);
2641
27 QString nextPhotoFileName(const QString &directoy = QString());42 QString nextPhotoFileName(const QString &directoy = QString());
28 QString nextVideoFileName(const QString &directoy = QString());43 QString nextVideoFileName(const QString &directoy = QString());
2944
30 bool checkDirectory(const QString &path) const;45 bool checkDirectory(const QString &path) const;
3146
47 SaveToDiskResult saveJpegImage(QByteArray data, QVariantMap metadata,
48 QString fileName, QSize previewResolution,
49 int captureID);
50
51Q_SIGNALS:
52 void previewReady(int captureID, QImage image);
53
32private:54private:
33 QString fileNameGenerator(const QString &base, const QString &extension);55 QString fileNameGenerator(const QString &base, const QString &extension);
56 bool updateJpegMetadata(QByteArray data, QVariantMap metadata, QTemporaryFile* destination);
57 QString decimalToExifRational(double decimal);
3458
35 QString m_directory;59 QString m_directory;
36};60};
3761
=== modified file 'unittests/aalcamerafocuscontrol/aalcamerafocuscontrol.pro'
--- unittests/aalcamerafocuscontrol/aalcamerafocuscontrol.pro 2014-01-16 14:20:08 +0000
+++ unittests/aalcamerafocuscontrol/aalcamerafocuscontrol.pro 2016-02-23 11:36:01 +0000
@@ -10,10 +10,12 @@
1010
11HEADERS += ../../src/aalcamerafocuscontrol.h \11HEADERS += ../../src/aalcamerafocuscontrol.h \
12 ../../src/aalcameraservice.h \12 ../../src/aalcameraservice.h \
13 ../../src/aalimagecapturecontrol.h13 ../../src/aalimagecapturecontrol.h \
14 ../../src/storagemanager.h
1415
15SOURCES += tst_aalcamerafocuscontrol.cpp \16SOURCES += tst_aalcamerafocuscontrol.cpp \
16 ../../src/aalcamerafocuscontrol.cpp \17 ../../src/aalcamerafocuscontrol.cpp \
18 storagemanager.cpp \
17 aalcameraservice.cpp \19 aalcameraservice.cpp \
18 aalimagecapturecontrol.cpp20 aalimagecapturecontrol.cpp
1921
2022
=== modified file 'unittests/aalcamerafocuscontrol/aalimagecapturecontrol.cpp'
--- unittests/aalcamerafocuscontrol/aalimagecapturecontrol.cpp 2013-06-05 16:11:12 +0000
+++ unittests/aalcamerafocuscontrol/aalimagecapturecontrol.cpp 2016-02-23 11:36:01 +0000
@@ -19,10 +19,6 @@
19#include <hybris/camera/camera_compatibility_layer.h>19#include <hybris/camera/camera_compatibility_layer.h>
20#include <hybris/camera/camera_compatibility_layer_capabilities.h>20#include <hybris/camera/camera_compatibility_layer_capabilities.h>
2121
22StorageManager::StorageManager()
23{
24}
25
26AalImageCaptureControl::AalImageCaptureControl(AalCameraService *service, QObject *parent)22AalImageCaptureControl::AalImageCaptureControl(AalCameraService *service, QObject *parent)
27 : QCameraImageCaptureControl(parent)23 : QCameraImageCaptureControl(parent)
28{24{
@@ -54,10 +50,6 @@
54 Q_UNUSED(listener);50 Q_UNUSED(listener);
55}51}
5652
57void AalImageCaptureControl::onPreviewReady()
58{
59}
60
61void AalImageCaptureControl::setReady(bool ready)53void AalImageCaptureControl::setReady(bool ready)
62{54{
63 Q_UNUSED(ready);55 Q_UNUSED(ready);
@@ -66,3 +58,13 @@
66void AalImageCaptureControl::shutter()58void AalImageCaptureControl::shutter()
67{59{
68}60}
61
62void AalImageCaptureControl::onImageFileSaved()
63{
64}
65
66void AalImageCaptureControl::saveJpeg(const QByteArray& data)
67{
68 Q_UNUSED(data);
69}
70
6971
=== added file 'unittests/aalcamerafocuscontrol/storagemanager.cpp'
--- unittests/aalcamerafocuscontrol/storagemanager.cpp 1970-01-01 00:00:00 +0000
+++ unittests/aalcamerafocuscontrol/storagemanager.cpp 2016-02-23 11:36:01 +0000
@@ -0,0 +1,76 @@
1/*
2 * Copyright (C) 2016 Canonical, Ltd.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License as published by
6 * the Free Software Foundation; version 3.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#include "storagemanager.h"
18
19StorageManager::StorageManager(QObject* parent) : QObject(parent)
20{
21}
22
23QString StorageManager::nextPhotoFileName(const QString &directoy)
24{
25 Q_UNUSED(directoy);
26 return QString();
27}
28
29QString StorageManager::nextVideoFileName(const QString &directoy)
30{
31 Q_UNUSED(directoy);
32 return QString();
33}
34
35bool StorageManager::checkDirectory(const QString &path) const
36{
37 Q_UNUSED(path);
38 return true;
39}
40
41QString StorageManager::fileNameGenerator(const QString &base, const QString& extension)
42{
43 Q_UNUSED(base);
44 Q_UNUSED(extension);
45 return QString();
46}
47
48bool StorageManager::updateJpegMetadata(QByteArray data, QVariantMap metadata, QTemporaryFile* destination)
49{
50 Q_UNUSED(data);
51 Q_UNUSED(metadata);
52 Q_UNUSED(destination);
53
54 return true;
55}
56
57SaveToDiskResult StorageManager::saveJpegImage(QByteArray data, QVariantMap metadata,
58 QString fileName, QSize previewResolution, int captureID)
59{
60 Q_UNUSED(data);
61 Q_UNUSED(metadata);
62 Q_UNUSED(fileName);
63 Q_UNUSED(captureID);
64 Q_UNUSED(previewResolution);
65 return SaveToDiskResult();
66}
67
68QString StorageManager::decimalToExifRational(double decimal)
69{
70 Q_UNUSED(decimal);
71 return QString();
72}
73
74SaveToDiskResult::SaveToDiskResult() : success(false)
75{
76}
077
=== modified file 'unittests/aalcamerafocuscontrol/tst_aalcamerafocuscontrol.cpp'
--- unittests/aalcamerafocuscontrol/tst_aalcamerafocuscontrol.cpp 2015-04-08 12:57:01 +0000
+++ unittests/aalcamerafocuscontrol/tst_aalcamerafocuscontrol.cpp 2016-02-23 11:36:01 +0000
@@ -127,8 +127,8 @@
127 QTest::addColumn<int>("bottom");127 QTest::addColumn<int>("bottom");
128128
129 QTest::newRow("center") << (qreal)0.5 << (qreal)0.5 << -100 << 100 << -100 << 100;129 QTest::newRow("center") << (qreal)0.5 << (qreal)0.5 << -100 << 100 << -100 << 100;
130 QTest::newRow("topLeft") << (qreal)0.0 << (qreal)1.0 << -1000 << -800 << -1000 << -800;130 QTest::newRow("topLeft") << (qreal)0.0 << (qreal)1.0 << -1000 << -800 << 800 << 1000;
131 QTest::newRow("bottomRight") << (qreal)1.0 << (qreal)0.0 << 800 << 1000 << 800 << 1000;131 QTest::newRow("bottomRight") << (qreal)1.0 << (qreal)0.0 << 800 << 1000 << -1000 << -800;
132}132}
133133
134void tst_AalCameraFocusControl::point2Region()134void tst_AalCameraFocusControl::point2Region()
135135
=== removed directory 'unittests/aalimagecapturecontrol'
=== removed file 'unittests/aalimagecapturecontrol/aalcameraservice.cpp'
--- unittests/aalimagecapturecontrol/aalcameraservice.cpp 2015-12-07 15:16:51 +0000
+++ unittests/aalimagecapturecontrol/aalcameraservice.cpp 1970-01-01 00:00:00 +0000
@@ -1,99 +0,0 @@
1/*
2 * Copyright (C) 2013 Canonical, Ltd.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License as published by
6 * the Free Software Foundation; version 3.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#include "aalcameraservice.h"
18
19AalCameraService *AalCameraService::m_service = 0;
20
21AalCameraService::AalCameraService(QObject *parent) :
22 QMediaService(parent),
23 m_androidControl(0),
24 m_androidListener(0)
25{
26}
27
28AalCameraService::~AalCameraService()
29{
30}
31
32QMediaControl *AalCameraService::requestControl(const char *name)
33{
34 Q_UNUSED(name);
35 return 0;
36}
37
38void AalCameraService::releaseControl(QMediaControl *control)
39{
40 Q_UNUSED(control);
41}
42
43CameraControl *AalCameraService::androidControl()
44{
45 return m_androidControl;
46}
47
48bool AalCameraService::connectCamera()
49{
50 return true;
51}
52
53void AalCameraService::disconnectCamera()
54{
55}
56
57void AalCameraService::startPreview()
58{
59}
60
61void AalCameraService::stopPreview()
62{
63}
64
65bool AalCameraService::isPreviewStarted() const
66{
67 return true;
68}
69
70void AalCameraService::onApplicationStateChanged()
71{
72}
73
74void AalCameraService::initControls(CameraControl *camControl, CameraControlListener *listener)
75{
76 Q_UNUSED(camControl);
77 Q_UNUSED(listener);
78}
79
80bool AalCameraService::isCameraActive() const
81{
82 return true;
83}
84
85bool AalCameraService::isBackCameraUsed() const
86{
87 return true;
88}
89
90void AalCameraService::updateCaptureReady()
91{
92}
93
94QSize AalCameraService::selectSizeWithAspectRatio(const QList<QSize> &sizes, float targetAspectRatio) const
95{
96 Q_UNUSED(sizes);
97 Q_UNUSED(targetAspectRatio);
98 return QSize();
99}
1000
=== removed file 'unittests/aalimagecapturecontrol/aalimagecapturecontrol.pro'
--- unittests/aalimagecapturecontrol/aalimagecapturecontrol.pro 2014-09-23 18:12:45 +0000
+++ unittests/aalimagecapturecontrol/aalimagecapturecontrol.pro 1970-01-01 00:00:00 +0000
@@ -1,31 +0,0 @@
1include(../../coverage.pri)
2
3TARGET = tst_aalimagecapturecontrol
4
5QT += testlib multimedia opengl
6
7LIBS += -L../mocks/aal -laal
8INCLUDEPATH += ../../src
9INCLUDEPATH += ../mocks/aal
10
11CONFIG += link_pkgconfig
12PKGCONFIG += exiv2
13
14HEADERS += ../../src/aalimagecapturecontrol.h \
15 ../../src/aalcameraservice.h \
16 ../../src/aalimageencodercontrol.h \
17 ../../src/aalmetadatawritercontrol.h \
18 ../../src/aalvideorenderercontrol.h \
19 ../../src/storagemanager.h
20
21SOURCES += tst_aalimagecapturecontrol.cpp \
22 ../../src/aalimagecapturecontrol.cpp \
23 aalcameraservice.cpp \
24 aalimageencodercontrol.cpp \
25 ../stubs/aalmetadatawritercontrol_stub.cpp \
26 aalvideorenderercontrol.cpp \
27 storagemanager.cpp
28
29check.depends = $${TARGET}
30check.commands = ./$${TARGET}
31QMAKE_EXTRA_TARGETS += check
320
=== removed file 'unittests/aalimagecapturecontrol/aalimageencodercontrol.cpp'
--- unittests/aalimagecapturecontrol/aalimageencodercontrol.cpp 2015-10-14 21:22:46 +0000
+++ unittests/aalimagecapturecontrol/aalimageencodercontrol.cpp 1970-01-01 00:00:00 +0000
@@ -1,125 +0,0 @@
1/*
2 * Copyright (C) 2013-2014 Canonical, Ltd.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License as published by
6 * the Free Software Foundation; version 3.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#include <QImageEncoderControl>
18#include <QList>
19#include <QString>
20#include <QStringList>
21
22#include <QDebug>
23
24#include "aalimageencodercontrol.h"
25
26AalImageEncoderControl::AalImageEncoderControl(AalCameraService *service, QObject *parent)
27 : QImageEncoderControl(parent),
28 m_service(service),
29 m_currentSize()
30{
31}
32
33AalImageEncoderControl::~AalImageEncoderControl()
34{
35}
36
37QString AalImageEncoderControl::imageCodecDescription(const QString &codec) const
38{
39 Q_UNUSED(codec);
40 return QString();
41}
42
43QImageEncoderSettings AalImageEncoderControl::imageSettings() const
44{
45 return QImageEncoderSettings();
46}
47
48void AalImageEncoderControl::setImageSettings(const QImageEncoderSettings &settings)
49{
50 Q_UNUSED(settings);
51}
52
53QStringList AalImageEncoderControl::supportedImageCodecs() const
54{
55 return QStringList();
56}
57
58QList<QSize> AalImageEncoderControl::supportedResolutions(const QImageEncoderSettings &settings, bool *continuous) const
59{
60 Q_UNUSED(settings);
61 Q_UNUSED(continuous);
62
63 return QList<QSize>();
64}
65
66QList<QSize> AalImageEncoderControl::supportedThumbnailResolutions(const QImageEncoderSettings &settings, bool *continuous) const
67{
68 Q_UNUSED(settings);
69 Q_UNUSED(continuous);
70
71 return QList<QSize>();
72}
73
74void AalImageEncoderControl::init(CameraControl *control)
75{
76 Q_UNUSED(control);
77}
78
79bool AalImageEncoderControl::setSize(const QSize &size)
80{
81 Q_UNUSED(size);
82 return true;
83}
84
85void AalImageEncoderControl::resetAllSettings()
86{
87}
88
89void AalImageEncoderControl::getPictureSizeCb(void *ctx, int width, int height)
90{
91 Q_UNUSED(ctx);
92 Q_UNUSED(width);
93 Q_UNUSED(height);
94}
95
96void AalImageEncoderControl::getPictureSize(int width, int height)
97{
98 Q_UNUSED(width);
99 Q_UNUSED(height);
100}
101
102void AalImageEncoderControl::getThumbnailSizeCb(void *ctx, int width, int height)
103{
104 Q_UNUSED(ctx);
105 Q_UNUSED(width);
106 Q_UNUSED(height);
107}
108
109void AalImageEncoderControl::getThumbnailSize(int width, int height)
110{
111 Q_UNUSED(width);
112 Q_UNUSED(height);
113}
114
115QMultimedia::EncodingQuality AalImageEncoderControl::jpegQualityToQtEncodingQuality(int jpegQuality)
116{
117 Q_UNUSED(jpegQuality)
118 return QMultimedia::NormalQuality;
119}
120
121int AalImageEncoderControl::qtEncodingQualityToJpegQuality(QMultimedia::EncodingQuality quality)
122{
123 Q_UNUSED(quality)
124 return 100;
125}
1260
=== removed file 'unittests/aalimagecapturecontrol/aalvideorenderercontrol.cpp'
--- unittests/aalimagecapturecontrol/aalvideorenderercontrol.cpp 2015-12-07 15:16:51 +0000
+++ unittests/aalimagecapturecontrol/aalvideorenderercontrol.cpp 1970-01-01 00:00:00 +0000
@@ -1,84 +0,0 @@
1/*
2 * Copyright (C) 2013 Canonical, Ltd.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License as published by
6 * the Free Software Foundation; version 3.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#include "aalvideorenderercontrol.h"
18#include "aalcameraservice.h"
19
20
21AalVideoRendererControl::AalVideoRendererControl(AalCameraService *service, QObject *parent)
22 : QVideoRendererControl(parent)
23 , m_surface(0),
24 m_service(service),
25 m_viewFinderRunning(false),
26 m_textureId(0)
27{
28}
29
30AalVideoRendererControl::~AalVideoRendererControl()
31{
32}
33
34QAbstractVideoSurface *AalVideoRendererControl::surface() const
35{
36 return m_surface;
37}
38
39void AalVideoRendererControl::setSurface(QAbstractVideoSurface *surface)
40{
41 Q_UNUSED(surface);
42}
43
44void AalVideoRendererControl::init(CameraControl *control, CameraControlListener *listener)
45{
46 Q_UNUSED(control);
47 Q_UNUSED(listener);
48}
49
50void AalVideoRendererControl::startPreview()
51{
52}
53
54void AalVideoRendererControl::stopPreview()
55{
56}
57
58bool AalVideoRendererControl::isPreviewStarted() const
59{
60 return true;
61}
62
63void AalVideoRendererControl::updateViewfinderFrame()
64{
65}
66
67void AalVideoRendererControl::onTextureCreated(unsigned int textureID)
68{
69 Q_UNUSED(textureID);
70}
71
72void AalVideoRendererControl::onSnapshotTaken(QImage snapshotImage)
73{
74 Q_UNUSED(snapshotImage);
75}
76
77const QImage &AalVideoRendererControl::preview() const
78{
79 return m_preview;
80}
81
82void AalVideoRendererControl::createPreview()
83{
84}
850
=== removed file 'unittests/aalimagecapturecontrol/storagemanager.cpp'
--- unittests/aalimagecapturecontrol/storagemanager.cpp 2014-09-10 19:48:00 +0000
+++ unittests/aalimagecapturecontrol/storagemanager.cpp 1970-01-01 00:00:00 +0000
@@ -1,50 +0,0 @@
1/*
2 * Copyright (C) 2013 Canonical, Ltd.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License as published by
6 * the Free Software Foundation; version 3.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#include <QDebug>
18#include <QString>
19
20#include "storagemanager.h"
21
22StorageManager::StorageManager()
23{
24}
25
26QString StorageManager::nextPhotoFileName(const QString &directory)
27{
28 Q_UNUSED(directory);
29 return QString();
30}
31
32QString StorageManager::nextVideoFileName(const QString &directory)
33{
34 Q_UNUSED(directory);
35 return QString();
36}
37
38bool StorageManager::checkDirectory(const QString &path) const
39{
40 Q_UNUSED(path);
41 return true;
42}
43
44QString StorageManager::fileNameGenerator(const QString &base,
45 const QString& extension)
46{
47 Q_UNUSED(base);
48 Q_UNUSED(extension);
49 return QString();
50}
510
=== removed file 'unittests/aalimagecapturecontrol/tst_aalimagecapturecontrol.cpp'
--- unittests/aalimagecapturecontrol/tst_aalimagecapturecontrol.cpp 2015-10-14 21:22:46 +0000
+++ unittests/aalimagecapturecontrol/tst_aalimagecapturecontrol.cpp 1970-01-01 00:00:00 +0000
@@ -1,74 +0,0 @@
1/*
2 * Copyright (C) 2013 Canonical, Ltd.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License as published by
6 * the Free Software Foundation; version 3.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16
17#include <QtTest/QtTest>
18#include <cmath>
19
20#include "aalcameraservice.h"
21#include "data_validjpeg.h"
22#include "data_noexifjpeg.h"
23
24#define private public
25#include "aalimagecapturecontrol.h"
26
27class tst_AalImageCaptureControl : public QObject
28{
29 Q_OBJECT
30private slots:
31 void initTestCase();
32 void cleanupTestCase();
33
34 void updateEXIF();
35
36private:
37 AalImageCaptureControl *m_icControl;
38 AalCameraService *m_service;
39
40 friend class AalImageCaptureControl;
41};
42
43void tst_AalImageCaptureControl::initTestCase()
44{
45 m_service = new AalCameraService();
46 m_icControl = new AalImageCaptureControl(m_service);
47}
48
49void tst_AalImageCaptureControl::cleanupTestCase()
50{
51 delete m_icControl;
52 delete m_service;
53}
54
55void tst_AalImageCaptureControl::updateEXIF()
56{
57 bool result;
58 QTemporaryFile tmp;
59 char *invalidJPEG = "INVALID_IMAGE";
60 result = m_icControl->updateJpegMetadata(0, 0, &tmp);
61 QCOMPARE(result, false);
62 result = m_icControl->updateJpegMetadata(invalidJPEG, strlen(invalidJPEG), 0);
63 QCOMPARE(result, false);
64 result = m_icControl->updateJpegMetadata(invalidJPEG, strlen(invalidJPEG), &tmp);
65 QCOMPARE(result, false);
66 result = m_icControl->updateJpegMetadata(data_validjpeg, data_validjpeg_len, &tmp);
67 QCOMPARE(result, true);
68 result = m_icControl->updateJpegMetadata(data_noexifjpeg, data_noexifjpeg_len, &tmp);
69 QCOMPARE(result, true);
70}
71
72QTEST_GUILESS_MAIN(tst_AalImageCaptureControl)
73
74#include "tst_aalimagecapturecontrol.moc"
750
=== renamed file 'unittests/aalimagecapturecontrol/data_noexifjpeg.h' => 'unittests/storagemanager/data_noexifjpeg.h'
=== renamed file 'unittests/aalimagecapturecontrol/data_validjpeg.h' => 'unittests/storagemanager/data_validjpeg.h'
=== modified file 'unittests/storagemanager/storagemanager.pro'
--- unittests/storagemanager/storagemanager.pro 2013-06-13 19:13:27 +0000
+++ unittests/storagemanager/storagemanager.pro 2016-02-23 11:36:01 +0000
@@ -4,6 +4,11 @@
44
5QT += testlib5QT += testlib
66
7CONFIG += link_pkgconfig
8PKGCONFIG += exiv2
9
10HEADERS += ../../src/storagemanager.h
11
7SOURCES += tst_storagemanager.cpp \12SOURCES += tst_storagemanager.cpp \
8 ../../src/storagemanager.cpp13 ../../src/storagemanager.cpp
914
1015
=== modified file 'unittests/storagemanager/tst_storagemanager.cpp'
--- unittests/storagemanager/tst_storagemanager.cpp 2014-09-10 19:48:00 +0000
+++ unittests/storagemanager/tst_storagemanager.cpp 2016-02-23 11:36:01 +0000
@@ -22,6 +22,8 @@
2222
23#define private public23#define private public
24#include "storagemanager.h"24#include "storagemanager.h"
25#include "data_validjpeg.h"
26#include "data_noexifjpeg.h"
2527
26const QLatin1String testPath("/tmp/aalCameraStorageManagerUnitTestDirectory0192837465/");28const QLatin1String testPath("/tmp/aalCameraStorageManagerUnitTestDirectory0192837465/");
2729
@@ -34,6 +36,7 @@
34 void checkDirectory();36 void checkDirectory();
35 void fileNameGenerator_data();37 void fileNameGenerator_data();
36 void fileNameGenerator();38 void fileNameGenerator();
39 void updateEXIF();
3740
38private:41private:
39 void removeTestDirectory();42 void removeTestDirectory();
@@ -112,6 +115,25 @@
112 dir.rmdir(testPath);115 dir.rmdir(testPath);
113}116}
114117
118void tst_StorageManager::updateEXIF()
119{
120 StorageManager storage;
121 bool result;
122 QTemporaryFile tmp;
123 QVariantMap metadata;
124 QByteArray invalidJPEG("INVALID_IMAGE");
125 result = storage.updateJpegMetadata(invalidJPEG, metadata, &tmp);
126 QCOMPARE(result, false);
127 result = storage.updateJpegMetadata(invalidJPEG, metadata, 0);
128 QCOMPARE(result, false);
129 result = storage.updateJpegMetadata(invalidJPEG, metadata, &tmp);
130 QCOMPARE(result, false);
131 result = storage.updateJpegMetadata(QByteArray((char*)data_validjpeg, data_validjpeg_len), metadata, &tmp);
132 QCOMPARE(result, true);
133 result = storage.updateJpegMetadata(QByteArray((char*)data_noexifjpeg, data_noexifjpeg_len), metadata, &tmp);
134 QCOMPARE(result, true);
135}
136
115QTEST_GUILESS_MAIN(tst_StorageManager);137QTEST_GUILESS_MAIN(tst_StorageManager);
116138
117#include "tst_storagemanager.moc"139#include "tst_storagemanager.moc"
118140
=== modified file 'unittests/stubs/storagemanager_stub.cpp'
--- unittests/stubs/storagemanager_stub.cpp 2014-09-10 19:48:00 +0000
+++ unittests/stubs/storagemanager_stub.cpp 2016-02-23 11:36:01 +0000
@@ -19,8 +19,9 @@
1919
20#include "storagemanager.h"20#include "storagemanager.h"
2121
22StorageManager::StorageManager()22StorageManager::StorageManager(QObject* parent)
23{23{
24 Q_UNUSED(parent);
24}25}
2526
26QString StorageManager::nextPhotoFileName(const QString &directory)27QString StorageManager::nextPhotoFileName(const QString &directory)
2728
=== modified file 'unittests/unittests.pro'
--- unittests/unittests.pro 2014-07-14 16:18:14 +0000
+++ unittests/unittests.pro 2016-02-23 11:36:01 +0000
@@ -7,7 +7,6 @@
7 aalcameraflashcontrol \7 aalcameraflashcontrol \
8 aalcamerafocuscontrol \8 aalcamerafocuscontrol \
9 aalcamerazoomcontrol \9 aalcamerazoomcontrol \
10 aalimagecapturecontrol \
11 aalmediarecordercontrol \10 aalmediarecordercontrol \
12 aalvideodeviceselectorcontrol \11 aalvideodeviceselectorcontrol \
13 aalviewfindersettingscontrol \12 aalviewfindersettingscontrol \

Subscribers

People subscribed via source and target branches

to all changes: