Merge lp:~fboucault/qtubuntu-camera/resolution_fixes into lp:qtubuntu-camera

Proposed by Florian Boucault
Status: Superseded
Proposed branch: lp:~fboucault/qtubuntu-camera/resolution_fixes
Merge into: lp:qtubuntu-camera
Diff against target: 1161 lines (+302/-286)
28 files modified
.qmake.conf (+5/-0)
aalCamera.pro (+2/-0)
src/aalcameracontrol.cpp (+14/-5)
src/aalcamerafocuscontrol.cpp (+2/-0)
src/aalcameraservice.cpp (+43/-20)
src/aalcameraservice.h (+4/-1)
src/aalimagecapturecontrol.cpp (+0/-123)
src/aalimagecapturecontrol.h (+0/-10)
src/aalimageencodercontrol.cpp (+53/-30)
src/aalimageencodercontrol.h (+2/-2)
src/aalvideodeviceselectorcontrol.cpp (+3/-1)
src/aalvideoencodersettingscontrol.cpp (+11/-1)
src/aalvideorenderercontrol.cpp (+1/-4)
src/aalviewfindersettingscontrol.cpp (+7/-21)
src/aalviewfindersettingscontrol.h (+1/-1)
src/src.pro (+1/-9)
unittests/aalcameracontrol/aalcameraservice.cpp (+15/-0)
unittests/aalcameraexposurecontrol/aalcameraservice.cpp (+15/-0)
unittests/aalcameraflashcontrol/aalcameraservice.cpp (+15/-0)
unittests/aalcamerafocuscontrol/aalcameraservice.cpp (+15/-0)
unittests/aalcamerazoomcontrol/aalcameraservice.cpp (+15/-0)
unittests/aalimagecapturecontrol/aalcameraservice.cpp (+15/-0)
unittests/aalimagecapturecontrol/aalimageencodercontrol.cpp (+4/-8)
unittests/aalimagecapturecontrol/tst_aalimagecapturecontrol.cpp (+0/-44)
unittests/aalvideodeviceselectorcontrol/aalcameraservice.cpp (+15/-5)
unittests/aalvideodeviceselectorcontrol/aalimageencodercontrol.cpp (+2/-1)
unittests/aalviewfindersettingscontrol/aalcameraservice.cpp (+34/-0)
unittests/stubs/aalcameraservice_stub.cpp (+8/-0)
To merge this branch: bzr merge lp:~fboucault/qtubuntu-camera/resolution_fixes
Reviewer Review Type Date Requested Status
PS Jenkins bot continuous-integration Approve
Ubuntu Phablet Team Pending
Review via email: mp+274404@code.launchpad.net

This proposal has been superseded by a proposal from 2015-11-25.

Commit message

Make it possible to set resolution at application startup by not
starting the viewfinder the first time the camera state is set to Unloaded.

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

Merged with staging

Unmerged revisions

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added file '.qmake.conf'
--- .qmake.conf 1970-01-01 00:00:00 +0000
+++ .qmake.conf 2015-11-17 15:24:47 +0000
@@ -0,0 +1,5 @@
1PKG_CONFIG_ARCH = $$section(QMAKE_CC, -, 0, -2)
2!isEmpty (PKG_CONFIG_ARCH) {
3 PKG_CONFIG = $$PKG_CONFIG_ARCH-pkg-config
4}
5
06
=== modified file 'aalCamera.pro'
--- aalCamera.pro 2012-11-01 14:51:08 +0000
+++ aalCamera.pro 2015-11-17 15:24:47 +0000
@@ -5,3 +5,5 @@
5SUBDIRS += \5SUBDIRS += \
6 src \6 src \
7 unittests7 unittests
8
9OTHER_FILES += .qmake.conf
810
=== modified file 'src/aalcameracontrol.cpp'
--- src/aalcameracontrol.cpp 2013-07-26 16:46:16 +0000
+++ src/aalcameracontrol.cpp 2015-11-17 15:24:47 +0000
@@ -42,14 +42,25 @@
42 if (m_state == state)42 if (m_state == state)
43 return;43 return;
4444
45 if (m_state == QCamera::ActiveState) {45 if (state == QCamera::ActiveState) {
46 m_service->disconnectCamera();
47 } else {
48 bool ok = m_service->connectCamera();46 bool ok = m_service->connectCamera();
49 if (!ok) {47 if (!ok) {
50 Q_EMIT error(QCamera::CameraError, QLatin1String("Unable to connect to camera"));48 Q_EMIT error(QCamera::CameraError, QLatin1String("Unable to connect to camera"));
51 return;49 return;
52 }50 }
51 m_service->startPreview();
52 } else if (state == QCamera::LoadedState) {
53 if (m_state == QCamera::UnloadedState) {
54 bool ok = m_service->connectCamera();
55 if (!ok) {
56 Q_EMIT error(QCamera::CameraError, QLatin1String("Unable to connect to camera"));
57 return;
58 }
59 } else {
60 m_service->disconnectCamera();
61 }
62 } else if (state == QCamera::UnloadedState) {
63 m_service->disconnectCamera();
53 }64 }
5465
55 m_state = state;66 m_state = state;
@@ -106,9 +117,7 @@
106117
107void AalCameraControl::handleError()118void AalCameraControl::handleError()
108{119{
109 setState(QCamera::LoadedState);
110 Q_EMIT error(QCamera::CameraError, QLatin1String("Unknown error in camera"));120 Q_EMIT error(QCamera::CameraError, QLatin1String("Unknown error in camera"));
111 setState(QCamera::ActiveState);
112}121}
113122
114void AalCameraControl::errorCB(void *context)123void AalCameraControl::errorCB(void *context)
115124
=== modified file 'src/aalcamerafocuscontrol.cpp'
--- src/aalcamerafocuscontrol.cpp 2015-04-09 17:54:55 +0000
+++ src/aalcamerafocuscontrol.cpp 2015-11-17 15:24:47 +0000
@@ -100,6 +100,7 @@
100 return;100 return;
101101
102 m_focusRunning = false;102 m_focusRunning = false;
103 m_service->updateCaptureReady();
103 AutoFocusMode focusMode = qt2Android(mode);104 AutoFocusMode focusMode = qt2Android(mode);
104 m_focusMode = mode;105 m_focusMode = mode;
105 if (m_service->androidControl()) {106 if (m_service->androidControl()) {
@@ -154,6 +155,7 @@
154 AutoFocusMode mode = qt2Android(m_focusMode);155 AutoFocusMode mode = qt2Android(m_focusMode);
155 android_camera_set_auto_focus_mode(control, mode);156 android_camera_set_auto_focus_mode(control, mode);
156 m_focusRunning = false;157 m_focusRunning = false;
158 m_service->updateCaptureReady();
157}159}
158160
159void AalCameraFocusControl::startFocus()161void AalCameraFocusControl::startFocus()
160162
=== modified file 'src/aalcameraservice.cpp'
--- src/aalcameraservice.cpp 2015-01-28 14:11:53 +0000
+++ src/aalcameraservice.cpp 2015-11-17 15:24:47 +0000
@@ -33,6 +33,7 @@
33#include <hybris/camera/camera_compatibility_layer.h>33#include <hybris/camera/camera_compatibility_layer.h>
3434
35#include <QDebug>35#include <QDebug>
36#include <cmath>
3637
37AalCameraService *AalCameraService::m_service = 0;38AalCameraService *AalCameraService::m_service = 0;
3839
@@ -171,16 +172,13 @@
171172
172 m_androidListener->context = m_androidControl;173 m_androidListener->context = m_androidControl;
173 initControls(m_androidControl, m_androidListener);174 initControls(m_androidControl, m_androidListener);
174 m_videoOutput->startPreview();
175175
176 return true;176 return true;
177}177}
178178
179void AalCameraService::disconnectCamera()179void AalCameraService::disconnectCamera()
180{180{
181 if (m_service->videoOutputControl()) {181 stopPreview();
182 m_service->videoOutputControl()->stopPreview();
183 }
184182
185 if (m_androidControl) {183 if (m_androidControl) {
186 android_camera_disconnect(m_androidControl);184 android_camera_disconnect(m_androidControl);
@@ -193,6 +191,20 @@
193 }191 }
194}192}
195193
194void AalCameraService::startPreview()
195{
196 if (m_videoOutput) {
197 m_videoOutput->startPreview();
198 }
199}
200
201void AalCameraService::stopPreview()
202{
203 if (m_videoOutput) {
204 m_videoOutput->stopPreview();
205 }
206}
207
196bool AalCameraService::isCameraActive() const208bool AalCameraService::isCameraActive() const
197{209{
198 return m_cameraControl->state() == QCamera::ActiveState;210 return m_cameraControl->state() == QCamera::ActiveState;
@@ -211,7 +223,7 @@
211 m_imageEncoderControl->enablePhotoMode();223 m_imageEncoderControl->enablePhotoMode();
212 m_focusControl->enablePhotoMode();224 m_focusControl->enablePhotoMode();
213 m_zoomControl->enablePhotoMode();225 m_zoomControl->enablePhotoMode();
214 m_viewfinderControl->setAspectRatio(m_imageCaptureControl->getAspectRatio());226 m_viewfinderControl->setAspectRatio(m_imageEncoderControl->getAspectRatio());
215}227}
216228
217/*!229/*!
@@ -225,15 +237,6 @@
225}237}
226238
227/*!239/*!
228 * \brief AalCameraService::isReady return if the camera is ready for capturing
229 * \return
230 */
231bool AalCameraService::isReady() const
232{
233 return m_imageCaptureControl->isReadyForCapture();
234}
235
236/*!
237 * \brief AalCameraService::isRecording returns true is a video recording is240 * \brief AalCameraService::isRecording returns true is a video recording is
238 * currently ongoing241 * currently ongoing
239 * \return242 * \return
@@ -268,17 +271,37 @@
268void AalCameraService::initControls(CameraControl *camControl, CameraControlListener *listener)271void AalCameraService::initControls(CameraControl *camControl, CameraControlListener *listener)
269{272{
270 m_cameraControl->init(camControl, listener);273 m_cameraControl->init(camControl, listener);
274 m_videoOutput->init(camControl, listener);
275 m_viewfinderControl->init(camControl, listener);
271 m_imageEncoderControl->init(camControl);276 m_imageEncoderControl->init(camControl);
272 m_imageCaptureControl->init(camControl, listener);277 m_imageCaptureControl->init(camControl, listener);
273 m_flashControl->init(camControl);278 m_flashControl->init(camControl);
274 m_focusControl->init(camControl, listener);279 m_focusControl->init(camControl, listener);
275 m_zoomControl->init(camControl, listener);280 m_zoomControl->init(camControl, listener);
276 m_videoEncoderControl->init(camControl, listener);281 m_videoEncoderControl->init(camControl, listener);
277 if (m_cameraControl->captureMode() == QCamera::CaptureStillImage)
278 m_viewfinderControl->setAspectRatio(m_imageCaptureControl->getAspectRatio());
279 else
280 m_viewfinderControl->setAspectRatio(m_videoEncoderControl->getAspectRatio());
281 m_viewfinderControl->init(camControl, listener);
282 m_videoOutput->init(camControl, listener);
283 m_exposureControl->init(camControl, listener);282 m_exposureControl->init(camControl, listener);
284}283}
284
285QSize AalCameraService::selectSizeWithAspectRatio(const QList<QSize> &sizes, float targetAspectRatio) const
286{
287 QSize selectedSize;
288 long selectedPixelCount = 0;
289 const float EPSILON = 0.02;
290
291 if (!sizes.empty()) {
292 // Loop over all sizes until we find the highest one that matches targetAspectRatio.
293 QList<QSize>::const_iterator it = sizes.begin();
294 while (it != sizes.end()) {
295 QSize size = *it;
296 const float aspectRatio = (float)size.width() / (float)size.height();
297 const long pixelCount = (long)size.width() * (long)size.height();
298 if (fabs(aspectRatio - targetAspectRatio) < EPSILON && pixelCount > selectedPixelCount) {
299 selectedSize = size;
300 selectedPixelCount = pixelCount;
301 }
302 ++it;
303 }
304 }
305
306 return selectedSize;
307}
285308
=== modified file 'src/aalcameraservice.h'
--- src/aalcameraservice.h 2014-07-30 19:35:51 +0000
+++ src/aalcameraservice.h 2015-11-17 15:24:47 +0000
@@ -18,6 +18,7 @@
18#define AALCAMERASERVICE_H18#define AALCAMERASERVICE_H
1919
20#include <QMediaService>20#include <QMediaService>
21#include <QSize>
2122
22class AalCameraControl;23class AalCameraControl;
23class AalCameraFlashControl;24class AalCameraFlashControl;
@@ -69,6 +70,8 @@
6970
70 bool connectCamera();71 bool connectCamera();
71 void disconnectCamera();72 void disconnectCamera();
73 void startPreview();
74 void stopPreview();
7275
73 bool isCameraActive() const;76 bool isCameraActive() const;
74 bool isBackCameraUsed() const;77 bool isBackCameraUsed() const;
@@ -76,8 +79,8 @@
76 void enablePhotoMode();79 void enablePhotoMode();
77 void enableVideoMode();80 void enableVideoMode();
7881
79 bool isReady() const;
80 bool isRecording() const;82 bool isRecording() const;
83 QSize selectSizeWithAspectRatio(const QList<QSize> &sizes, float targetAspectRatio) const;
8184
82 static AalCameraService *instance() { return m_service; }85 static AalCameraService *instance() { return m_service; }
8386
8487
=== modified file 'src/aalimagecapturecontrol.cpp'
--- src/aalimagecapturecontrol.cpp 2015-07-06 18:22:43 +0000
+++ src/aalimagecapturecontrol.cpp 2015-11-17 15:24:47 +0000
@@ -43,9 +43,6 @@
43 m_lastRequestId(0),43 m_lastRequestId(0),
44 m_ready(false),44 m_ready(false),
45 m_pendingCaptureFile(),45 m_pendingCaptureFile(),
46 m_photoWidth(320),
47 m_photoHeight(240),
48 m_aspectRatio(0.0),
49 m_screenAspectRatio(0.0),46 m_screenAspectRatio(0.0),
50 m_audioPlayer(new QMediaPlayer(this))47 m_audioPlayer(new QMediaPlayer(this))
51{48{
@@ -141,36 +138,6 @@
141{138{
142 Q_UNUSED(control);139 Q_UNUSED(control);
143140
144 // Set the optimal image resolution that will be used by the camera
145 QImageEncoderSettings settings;
146 AalImageEncoderControl *imageEncoderControl = AalCameraService::instance()->imageEncoderControl();
147 float imageAspectRatio = 0.0, thumbnailAspectRatio = 0.0;
148 if (!imageEncoderControl->supportedResolutions(settings).empty()) {
149 const QSize s = chooseOptimalSize(imageEncoderControl->supportedResolutions(settings));
150 imageAspectRatio = (float)s.width() / (float)s.height();
151 qDebug() << "Setting image resolution: " << s;
152 qDebug() << "Image aspect ratio: " << imageAspectRatio;
153 imageEncoderControl->setSize(s);
154 }
155 else
156 qWarning() << "No supported resolutions detected for currently selected camera device." << endl;
157
158 // Set the optimal thumbnail image resolution that will be saved to the JPEG file
159 if (!imageEncoderControl->supportedThumbnailResolutions(settings).empty()) {
160 const QSize s = chooseOptimalSize(imageEncoderControl->supportedThumbnailResolutions(settings), false);
161 thumbnailAspectRatio = (float)s.width() / (float)s.height();
162 qDebug() << "Setting thumbnail resolution: " << s;
163 qDebug() << "Thumbnail aspect ratio: " << thumbnailAspectRatio;
164 imageEncoderControl->setThumbnailSize(s);
165 }
166 else
167 qWarning() << "No supported resolutions detected for currently selected camera device." << endl;
168
169 // Thumbnails will appear squashed or stretched if not the same aspect ratio as the original image.
170 // This will most likely be an incorrect size list supplied to qtubuntu-camera from the camera driver.
171 if (imageAspectRatio != thumbnailAspectRatio)
172 qWarning() << "** The image and thumbnail aspect ratios are not equal. Thumbnails will display wrong!";
173
174 listener->on_msg_shutter_cb = &AalImageCaptureControl::shutterCB;141 listener->on_msg_shutter_cb = &AalImageCaptureControl::shutterCB;
175 listener->on_data_compressed_image_cb = &AalImageCaptureControl::saveJpegCB;142 listener->on_data_compressed_image_cb = &AalImageCaptureControl::saveJpegCB;
176143
@@ -196,102 +163,12 @@
196 return !m_pendingCaptureFile.isNull();163 return !m_pendingCaptureFile.isNull();
197}164}
198165
199float AalImageCaptureControl::getAspectRatio() const
200{
201 return m_aspectRatio;
202}
203
204void AalImageCaptureControl::shutter()166void AalImageCaptureControl::shutter()
205{167{
206 m_audioPlayer->play();168 m_audioPlayer->play();
207 Q_EMIT imageExposed(m_lastRequestId);169 Q_EMIT imageExposed(m_lastRequestId);
208}170}
209171
210QSize AalImageCaptureControl::chooseOptimalSize(const QList<QSize> &sizes, bool updateAspectRatio)
211{
212 QSize optimalSize;
213 long optimalPixels = 0;
214
215 if (!sizes.empty()) {
216 getPriorityAspectRatios();
217 float aspectRatio = m_prioritizedAspectRatios.front();
218 if (updateAspectRatio)
219 m_aspectRatio = aspectRatio;
220
221 // Loop over all reported camera resolutions until we find the highest
222 // one that matches the current prioritized aspect ratio. If it doesn't
223 // find one on the current aspect ration, it selects the next ratio and
224 // tries again.
225 QList<float>::const_iterator ratioIt = m_prioritizedAspectRatios.begin();
226 while (ratioIt != m_prioritizedAspectRatios.end()) {
227 // Don't update the aspect ratio when using this function for finding
228 // the optimal thumbnail size as it will affect the preview window size
229 if (updateAspectRatio)
230 m_aspectRatio = (*ratioIt);
231 else
232 aspectRatio = (*ratioIt);
233
234 QList<QSize>::const_iterator it = sizes.begin();
235 while (it != sizes.end()) {
236 const float ratio = (float)(*it).width() / (float)(*it).height();
237 const long pixels = ((long)((*it).width())) * ((long)((*it).height()));
238 const float EPSILON = 10e-3;
239 if (fabs(ratio - aspectRatio) < EPSILON && pixels > optimalPixels) {
240 optimalSize = *it;
241 optimalPixels = pixels;
242 }
243 ++it;
244 }
245 if (optimalPixels > 0) break;
246 ++ratioIt;
247 }
248 }
249
250 return optimalSize;
251}
252
253float AalImageCaptureControl::getScreenAspectRatio()
254{
255 // Only get the screen aspect ratio once, otherwise use the cached copy
256 if (m_screenAspectRatio == 0.0) {
257 // Get screen resolution.
258 QScreen *screen = QGuiApplication::primaryScreen();
259 Q_ASSERT(!screen);
260 const int kScreenWidth = screen->geometry().width();
261 const int kScreenHeight = screen->geometry().height();
262 Q_ASSERT(kScreenWidth > 0 && kScreenHeight > 0);
263
264 m_screenAspectRatio = (kScreenWidth > kScreenHeight) ?
265 ((float)kScreenWidth / (float)kScreenHeight) : ((float)kScreenHeight / (float)kScreenWidth);
266 }
267
268 return m_screenAspectRatio;
269}
270
271void AalImageCaptureControl::getPriorityAspectRatios()
272{
273 m_prioritizedAspectRatios.clear();
274
275 if (m_service->isBackCameraUsed()) {
276 if (m_screenAspectRatio > 0.0f) {
277 m_prioritizedAspectRatios.append(getScreenAspectRatio());
278 }
279 // Prioritized list of aspect ratios for the back camera
280 const float backAspectRatios[4] = { 16.0f/9.0f, 3.0f/2.0f, 4.0f/3.0f, 5.0f/4.0f };
281 for (uint8_t i=0; i<4; ++i) {
282 if (!m_prioritizedAspectRatios.contains(backAspectRatios[i])) {
283 m_prioritizedAspectRatios.append(backAspectRatios[i]);
284 }
285 }
286 } else {
287 // Prioritized list of aspect ratios for the front camera
288 const float frontAspectRatios[4] = { 4.0f/3.0f, 5.0f/4.0f, 16.0f/9.0f, 3.0f/2.0f };
289 for (uint8_t i=0; i<4; ++i) {
290 m_prioritizedAspectRatios.append(frontAspectRatios[i]);
291 }
292 }
293}
294
295bool AalImageCaptureControl::updateJpegMetadata(void* data, uint32_t dataSize, QTemporaryFile* destination)172bool AalImageCaptureControl::updateJpegMetadata(void* data, uint32_t dataSize, QTemporaryFile* destination)
296{173{
297 if (data == 0 || destination == 0) return false;174 if (data == 0 || destination == 0) return false;
298175
=== modified file 'src/aalimagecapturecontrol.h'
--- src/aalimagecapturecontrol.h 2014-12-02 20:56:46 +0000
+++ src/aalimagecapturecontrol.h 2015-11-17 15:24:47 +0000
@@ -52,10 +52,6 @@
5252
53 bool isCaptureRunning() const;53 bool isCaptureRunning() const;
5454
55 /// Find the highest optimal aspect ratio resolution, which depends
56 /// on the type of camera currently selected:
57 float getAspectRatio() const;
58
59public Q_SLOTS:55public Q_SLOTS:
60 void init(CameraControl *control, CameraControlListener *listener);56 void init(CameraControl *control, CameraControlListener *listener);
61 void onPreviewReady();57 void onPreviewReady();
@@ -64,9 +60,6 @@
64 void shutter();60 void shutter();
6561
66private:62private:
67 QSize chooseOptimalSize(const QList<QSize> &sizes, bool updateAspectRatio = true);
68 float getScreenAspectRatio();
69 void getPriorityAspectRatios();
70 void saveJpeg(void* data, uint32_t dataSize);63 void saveJpeg(void* data, uint32_t dataSize);
71 bool updateJpegMetadata(void* data, uint32_t dataSize, QTemporaryFile* destination);64 bool updateJpegMetadata(void* data, uint32_t dataSize, QTemporaryFile* destination);
7265
@@ -76,9 +69,6 @@
76 StorageManager m_storageManager;69 StorageManager m_storageManager;
77 bool m_ready;70 bool m_ready;
78 QString m_pendingCaptureFile;71 QString m_pendingCaptureFile;
79 int m_photoWidth;
80 int m_photoHeight;
81 float m_aspectRatio;
82 float m_screenAspectRatio;72 float m_screenAspectRatio;
83 /// Maintains a list of highest priority aspect ratio to lowest, for the73 /// Maintains a list of highest priority aspect ratio to lowest, for the
84 /// currently selected camera74 /// currently selected camera
8575
=== modified file 'src/aalimageencodercontrol.cpp'
--- src/aalimageencodercontrol.cpp 2015-01-28 14:11:53 +0000
+++ src/aalimageencodercontrol.cpp 2015-11-17 15:24:47 +0000
@@ -15,12 +15,17 @@
15 */15 */
1616
17#include "aalimageencodercontrol.h"17#include "aalimageencodercontrol.h"
18#include "aalcameracontrol.h"
19#include "aalviewfindersettingscontrol.h"
20#include "aalvideoencodersettingscontrol.h"
21#include "aalimagecapturecontrol.h"
18#include "aalcameraservice.h"22#include "aalcameraservice.h"
1923
20#include <hybris/camera/camera_compatibility_layer_capabilities.h>24#include <hybris/camera/camera_compatibility_layer_capabilities.h>
2125
22#include <unistd.h>26#include <unistd.h>
2327
28#include <QCamera>
24#include <QDebug>29#include <QDebug>
2530
26AalImageEncoderControl::AalImageEncoderControl(AalCameraService *service, QObject *parent)31AalImageEncoderControl::AalImageEncoderControl(AalCameraService *service, QObject *parent)
@@ -63,7 +68,7 @@
6368
64 // resolution69 // resolution
65 if (!settings.resolution().isNull()) {70 if (!settings.resolution().isNull()) {
66 m_encoderSettings.setResolution(settings.resolution());71 setSize(settings.resolution());
67 }72 }
6873
69 // encoding options74 // encoding options
@@ -94,6 +99,11 @@
94 return m_availableThumbnailSizes;99 return m_availableThumbnailSizes;
95}100}
96101
102float AalImageEncoderControl::getAspectRatio() const
103{
104 return (float)m_currentSize.width() / (float)m_currentSize.height();
105}
106
97void AalImageEncoderControl::init(CameraControl *control)107void AalImageEncoderControl::init(CameraControl *control)
98{108{
99 Q_ASSERT(control != NULL);109 Q_ASSERT(control != NULL);
@@ -106,47 +116,60 @@
106 int jpegQuality;116 int jpegQuality;
107 android_camera_get_jpeg_quality(control, &jpegQuality);117 android_camera_get_jpeg_quality(control, &jpegQuality);
108 m_encoderSettings.setQuality(jpegQualityToQtEncodingQuality(jpegQuality));118 m_encoderSettings.setQuality(jpegQualityToQtEncodingQuality(jpegQuality));
119
120 if (m_availableSizes.empty()) {
121 qWarning() << "(AalImageEncoderControl::init) No supported resolutions detected for currently selected camera device." << endl;
122 return;
123 }
124
125 if (!m_currentSize.isValid() || !m_availableSizes.contains(m_currentSize)) {
126 setSize(m_availableSizes.last());
127 } else {
128 setSize(m_currentSize);
129 }
109}130}
110131
111void AalImageEncoderControl::setSize(const QSize &size)132bool AalImageEncoderControl::setSize(const QSize &size)
112{133{
113 CameraControl *cc = m_service->androidControl();134 CameraControl *cc = m_service->androidControl();
114 if (!cc) {135 if (!cc) {
115 m_currentSize = size;136 m_currentSize = size;
116 return;137 m_encoderSettings.setResolution(m_currentSize);
138 return true;
117 }139 }
118140
119 if (!m_availableSizes.contains(size)) {141 if (!m_availableSizes.contains(size)) {
120 qWarning() << "Size " << size << "is not supported by the camera";142 qWarning() << "(AalImageEncoderControl::setSize) Size " << size << "is not supported by the camera";
121 qWarning() << "Supported sizes are: " << m_availableSizes;143 qWarning() << "(AalImageEncoderControl::setSize) Supported sizes are: " << m_availableSizes;
122 return;144 return false;
123 }145 }
124146
125 m_currentSize = size;147 m_currentSize = size;
126148 m_encoderSettings.setResolution(m_currentSize);
127 android_camera_set_picture_size(cc, size.width(), size.height());149 if (m_service->cameraControl()->captureMode() == QCamera::CaptureStillImage) {
128}150 m_service->viewfinderControl()->setAspectRatio(getAspectRatio());
129151 }
130/*!152
131 * \brief AalImageEncoderControl::setThumbnailSize sets the resolution of JPEG thumbnail153 // Select m_currentThumbnailSize so that its aspect ratio is the same
132 */154 // as m_currentSize's aspect ratio
133void AalImageEncoderControl::setThumbnailSize(const QSize &size)155 float imageAspectRatio = getAspectRatio();
134{156 float thumbnailAspectRatio;
135 CameraControl *cc = m_service->androidControl();157
136 if (!cc) {158 // Set the optimal thumbnail image resolution that will be saved to the JPEG file
137 m_currentThumbnailSize = size;159 if (!m_availableThumbnailSizes.empty()) {
138 return;160 m_currentThumbnailSize = m_service->selectSizeWithAspectRatio(m_availableThumbnailSizes, imageAspectRatio);
139 }161 thumbnailAspectRatio = (float)m_currentThumbnailSize.width() / (float)m_currentThumbnailSize.height();
140162 }
141 if (!m_availableThumbnailSizes.contains(size)) {163
142 qWarning() << "Thumbnail size " << size << "is not supported by the camera";164 // Thumbnails will appear squashed or stretched if not the same aspect ratio as the original image.
143 qWarning() << "Supported thumbnail sizes are: " << m_availableThumbnailSizes;165 // This will most likely be an incorrect size list supplied to qtubuntu-camera from the camera driver.
144 return;166 if (imageAspectRatio != thumbnailAspectRatio) {
145 }167 qWarning() << "(AalImageEncoderControl::setSize) ** Image and thumbnail aspect ratios are different. Thumbnails will look wrong!";
146168 }
147 m_currentThumbnailSize = size;169
148170 android_camera_set_picture_size(cc, m_currentSize.width(), m_currentSize.height());
149 android_camera_set_thumbnail_size(cc, size.width(), size.height());171 android_camera_set_thumbnail_size(cc, m_currentThumbnailSize.width(), m_currentThumbnailSize.height());
172 return true;
150}173}
151174
152void AalImageEncoderControl::resetAllSettings()175void AalImageEncoderControl::resetAllSettings()
153176
=== modified file 'src/aalimageencodercontrol.h'
--- src/aalimageencodercontrol.h 2014-11-24 10:58:09 +0000
+++ src/aalimageencodercontrol.h 2015-11-17 15:24:47 +0000
@@ -37,10 +37,9 @@
37 QStringList supportedImageCodecs() const;37 QStringList supportedImageCodecs() const;
38 QList<QSize> supportedResolutions(const QImageEncoderSettings &settings, bool *continuous = 0) const;38 QList<QSize> supportedResolutions(const QImageEncoderSettings &settings, bool *continuous = 0) const;
39 QList<QSize> supportedThumbnailResolutions(const QImageEncoderSettings &settings, bool *continuous = 0) const;39 QList<QSize> supportedThumbnailResolutions(const QImageEncoderSettings &settings, bool *continuous = 0) const;
40 float getAspectRatio() const;
4041
41 void init(CameraControl *control);42 void init(CameraControl *control);
42 void setSize(const QSize &size);
43 void setThumbnailSize(const QSize &size);
44 void resetAllSettings();43 void resetAllSettings();
4544
46 void enablePhotoMode();45 void enablePhotoMode();
@@ -56,6 +55,7 @@
56 QSize m_currentThumbnailSize;55 QSize m_currentThumbnailSize;
57 QImageEncoderSettings m_encoderSettings;56 QImageEncoderSettings m_encoderSettings;
5857
58 bool setSize(const QSize &size);
59 void getPictureSize(int width, int height);59 void getPictureSize(int width, int height);
60 void getThumbnailSize(int width, int height);60 void getThumbnailSize(int width, int height);
61 QMultimedia::EncodingQuality jpegQualityToQtEncodingQuality(int jpegQuality);61 QMultimedia::EncodingQuality jpegQualityToQtEncodingQuality(int jpegQuality);
6262
=== modified file 'src/aalvideodeviceselectorcontrol.cpp'
--- src/aalvideodeviceselectorcontrol.cpp 2014-07-28 12:52:45 +0000
+++ src/aalvideodeviceselectorcontrol.cpp 2015-11-17 15:24:47 +0000
@@ -86,8 +86,10 @@
86 m_service->imageEncoderControl()->resetAllSettings();86 m_service->imageEncoderControl()->resetAllSettings();
87 m_service->videoEncoderControl()->resetAllSettings();87 m_service->videoEncoderControl()->resetAllSettings();
88 m_currentDevice = index;88 m_currentDevice = index;
89 if (m_service->isCameraActive())89 if (m_service->isCameraActive()) {
90 m_service->connectCamera();90 m_service->connectCamera();
91 m_service->startPreview();
92 }
9193
92 Q_EMIT selectedDeviceChanged(m_currentDevice);94 Q_EMIT selectedDeviceChanged(m_currentDevice);
93 Q_EMIT selectedDeviceChanged(deviceName(m_currentDevice));95 Q_EMIT selectedDeviceChanged(deviceName(m_currentDevice));
9496
=== modified file 'src/aalvideoencodersettingscontrol.cpp'
--- src/aalvideoencodersettingscontrol.cpp 2013-07-24 06:50:58 +0000
+++ src/aalvideoencodersettingscontrol.cpp 2015-11-17 15:24:47 +0000
@@ -16,10 +16,13 @@
1616
17#include "aalvideoencodersettingscontrol.h"17#include "aalvideoencodersettingscontrol.h"
18#include "aalcameraservice.h"18#include "aalcameraservice.h"
19#include "aalcameracontrol.h"
19#include "aalviewfindersettingscontrol.h"20#include "aalviewfindersettingscontrol.h"
2021
21#include <hybris/camera/camera_compatibility_layer_capabilities.h>22#include <hybris/camera/camera_compatibility_layer_capabilities.h>
2223
24#include <QCamera>
25
23const QSize AalVideoEncoderSettingsControl::DEFAULT_SIZE = QSize(1280,720);26const QSize AalVideoEncoderSettingsControl::DEFAULT_SIZE = QSize(1280,720);
24const int AalVideoEncoderSettingsControl::DEFAULT_FPS = 30;27const int AalVideoEncoderSettingsControl::DEFAULT_FPS = 30;
25const QString AalVideoEncoderSettingsControl::DEFAULT_CODEC = QString("H.264");28const QString AalVideoEncoderSettingsControl::DEFAULT_CODEC = QString("H.264");
@@ -49,8 +52,12 @@
49 if (supportedFrameRates(settings, &continuous).contains(settings.frameRate()))52 if (supportedFrameRates(settings, &continuous).contains(settings.frameRate()))
50 m_settings.setFrameRate(settings.frameRate());53 m_settings.setFrameRate(settings.frameRate());
5154
52 if (supportedResolutions(settings, &continuous).contains(settings.resolution()))55 if (supportedResolutions(settings, &continuous).contains(settings.resolution())) {
53 m_settings.setResolution(settings.resolution());56 m_settings.setResolution(settings.resolution());
57 if (m_service->cameraControl()->captureMode() == QCamera::CaptureVideo) {
58 m_service->viewfinderControl()->setAspectRatio(getAspectRatio());
59 }
60 }
5461
55 // FIXME support more options62 // FIXME support more options
56}63}
@@ -136,6 +143,9 @@
136143
137 if (!m_availableSizes.contains(m_settings.resolution()) && !m_availableSizes.empty()) {144 if (!m_availableSizes.contains(m_settings.resolution()) && !m_availableSizes.empty()) {
138 m_settings.setResolution(m_availableSizes[0]);145 m_settings.setResolution(m_availableSizes[0]);
146 if (m_service->cameraControl()->captureMode() == QCamera::CaptureVideo) {
147 m_service->viewfinderControl()->setAspectRatio(getAspectRatio());
148 }
139 }149 }
140}150}
141151
142152
=== modified file 'src/aalvideorenderercontrol.cpp'
--- src/aalvideorenderercontrol.cpp 2014-09-05 15:20:34 +0000
+++ src/aalvideorenderercontrol.cpp 2015-11-17 15:24:47 +0000
@@ -129,9 +129,6 @@
129129
130void AalVideoRendererControl::stopPreview()130void AalVideoRendererControl::stopPreview()
131{131{
132 if (!m_viewFinderRunning || !m_surface)
133 return;
134
135 m_viewFinderRunning = false;132 m_viewFinderRunning = false;
136133
137 CameraControl *cc = m_service->androidControl();134 CameraControl *cc = m_service->androidControl();
@@ -139,7 +136,7 @@
139 android_camera_stop_preview(cc);136 android_camera_stop_preview(cc);
140 }137 }
141138
142 if (m_surface->isActive())139 if (m_surface && m_surface->isActive())
143 m_surface->stop();140 m_surface->stop();
144141
145 m_frameCount = 0;142 m_frameCount = 0;
146143
=== modified file 'src/aalviewfindersettingscontrol.cpp'
--- src/aalviewfindersettingscontrol.cpp 2013-07-16 13:09:15 +0000
+++ src/aalviewfindersettingscontrol.cpp 2015-11-17 15:24:47 +0000
@@ -20,8 +20,6 @@
2020
21#include <QDebug>21#include <QDebug>
2222
23#include <cmath>
24
25#include <hybris/camera/camera_compatibility_layer_capabilities.h>23#include <hybris/camera/camera_compatibility_layer_capabilities.h>
2624
27AalViewfinderSettingsControl::AalViewfinderSettingsControl(AalCameraService *service, QObject *parent)25AalViewfinderSettingsControl::AalViewfinderSettingsControl(AalCameraService *service, QObject *parent)
@@ -111,15 +109,9 @@
111 m_currentSize = size;109 m_currentSize = size;
112110
113 AalVideoRendererControl *videoRenderer = m_service->videoOutputControl();111 AalVideoRendererControl *videoRenderer = m_service->videoOutputControl();
114 bool vfRunning = videoRenderer->isViewfinderRunning();112 videoRenderer->stopPreview();
115
116 if (vfRunning)
117 videoRenderer->stopPreview();
118
119 android_camera_set_preview_size(cc, m_currentSize.width(), m_currentSize.height());113 android_camera_set_preview_size(cc, m_currentSize.width(), m_currentSize.height());
120114 videoRenderer->startPreview();
121 if (vfRunning)
122 videoRenderer->startPreview();
123}115}
124116
125QSize AalViewfinderSettingsControl::currentSize() const117QSize AalViewfinderSettingsControl::currentSize() const
@@ -172,7 +164,9 @@
172 }164 }
173165
174 // Choose optimal resolution based on the current camera's aspect ratio166 // Choose optimal resolution based on the current camera's aspect ratio
175 m_currentSize = chooseOptimalSize(m_availableSizes);167 if (m_currentSize.isEmpty()) {
168 m_currentSize = chooseOptimalSize(m_availableSizes);
169 }
176 android_camera_set_preview_size(control, m_currentSize.width(), m_currentSize.height());170 android_camera_set_preview_size(control, m_currentSize.width(), m_currentSize.height());
177171
178 android_camera_get_preview_fps_range(control, &m_minFPS, &m_maxFPS);172 android_camera_get_preview_fps_range(control, &m_minFPS, &m_maxFPS);
@@ -211,16 +205,8 @@
211 if (m_aspectRatio == 0) {205 if (m_aspectRatio == 0) {
212 // There are resolutions supported, choose one non-optimal one):206 // There are resolutions supported, choose one non-optimal one):
213 return sizes[1];207 return sizes[1];
214 }208 } else {
215209 return m_service->selectSizeWithAspectRatio(sizes, m_aspectRatio);
216 QList<QSize>::const_iterator it = sizes.begin();
217 while (it != sizes.end()) {
218 const float ratio = (float)(*it).width() / (float)(*it).height();
219 const float EPSILON = 10e-3;
220 if (fabs(ratio - m_aspectRatio) < EPSILON) {
221 return *it;
222 }
223 ++it;
224 }210 }
225 }211 }
226212
227213
=== modified file 'src/aalviewfindersettingscontrol.h'
--- src/aalviewfindersettingscontrol.h 2013-06-21 15:57:39 +0000
+++ src/aalviewfindersettingscontrol.h 2015-11-17 15:24:47 +0000
@@ -35,7 +35,6 @@
35 void setViewfinderParameter(ViewfinderParameter parameter, const QVariant & value);35 void setViewfinderParameter(ViewfinderParameter parameter, const QVariant & value);
36 QVariant viewfinderParameter(ViewfinderParameter parameter) const;36 QVariant viewfinderParameter(ViewfinderParameter parameter) const;
3737
38 void setSize(const QSize &size);
39 QSize currentSize() const;38 QSize currentSize() const;
40 const QList<QSize> &supportedSizes() const;39 const QList<QSize> &supportedSizes() const;
4140
@@ -47,6 +46,7 @@
47 static void sizeCB(void* ctx, int width, int height);46 static void sizeCB(void* ctx, int width, int height);
4847
49private:48private:
49 void setSize(const QSize &size);
50 QSize chooseOptimalSize(const QList<QSize> &sizes) const;50 QSize chooseOptimalSize(const QList<QSize> &sizes) const;
5151
52 AalCameraService *m_service;52 AalCameraService *m_service;
5353
=== modified file 'src/src.pro'
--- src/src.pro 2015-06-24 04:36:42 +0000
+++ src/src.pro 2015-11-17 15:24:47 +0000
@@ -9,16 +9,8 @@
9target.path += $$[QT_INSTALL_PLUGINS]/$${PLUGIN_TYPE}9target.path += $$[QT_INSTALL_PLUGINS]/$${PLUGIN_TYPE}
10INSTALLS = target10INSTALLS = target
1111
12INCLUDEPATH += /usr/include/libqtubuntu-media-signals
13LIBS += \
14 -lcamera \
15 -lmedia \
16 -lqtubuntu-media-signals \
17 -lpulse \
18 -lpulse-simple
19
20CONFIG += link_pkgconfig12CONFIG += link_pkgconfig
21PKGCONFIG += exiv213PKGCONFIG += exiv2 libqtubuntu-media-signals libmedia libcamera hybris-egl-platform libpulse-simple
2214
23OTHER_FILES += aalcamera.json15OTHER_FILES += aalcamera.json
2416
2517
=== modified file 'unittests/aalcameracontrol/aalcameraservice.cpp'
--- unittests/aalcameracontrol/aalcameraservice.cpp 2013-07-26 16:46:16 +0000
+++ unittests/aalcameracontrol/aalcameraservice.cpp 2015-11-17 15:24:47 +0000
@@ -54,6 +54,14 @@
54{54{
55}55}
5656
57void AalCameraService::startPreview()
58{
59}
60
61void AalCameraService::stopPreview()
62{
63}
64
57bool AalCameraService::isCameraActive() const65bool AalCameraService::isCameraActive() const
58{66{
59 return true;67 return true;
@@ -81,3 +89,10 @@
81void AalCameraService::updateCaptureReady()89void AalCameraService::updateCaptureReady()
82{90{
83}91}
92
93QSize AalCameraService::selectSizeWithAspectRatio(const QList<QSize> &sizes, float targetAspectRatio) const
94{
95 Q_UNUSED(sizes);
96 Q_UNUSED(targetAspectRatio);
97 return QSize();
98}
8499
=== modified file 'unittests/aalcameraexposurecontrol/aalcameraservice.cpp'
--- unittests/aalcameraexposurecontrol/aalcameraservice.cpp 2014-07-15 12:38:55 +0000
+++ unittests/aalcameraexposurecontrol/aalcameraservice.cpp 2015-11-17 15:24:47 +0000
@@ -66,6 +66,14 @@
66 android_camera_disconnect(m_androidControl);66 android_camera_disconnect(m_androidControl);
67}67}
6868
69void AalCameraService::startPreview()
70{
71}
72
73void AalCameraService::stopPreview()
74{
75}
76
69void AalCameraService::initControls(CameraControl *camControl, CameraControlListener *listener)77void AalCameraService::initControls(CameraControl *camControl, CameraControlListener *listener)
70{78{
71 m_exposureControl->init(camControl, listener);79 m_exposureControl->init(camControl, listener);
@@ -74,3 +82,10 @@
74void AalCameraService::updateCaptureReady()82void AalCameraService::updateCaptureReady()
75{83{
76}84}
85
86QSize AalCameraService::selectSizeWithAspectRatio(const QList<QSize> &sizes, float targetAspectRatio) const
87{
88 Q_UNUSED(sizes);
89 Q_UNUSED(targetAspectRatio);
90 return QSize();
91}
7792
=== modified file 'unittests/aalcameraflashcontrol/aalcameraservice.cpp'
--- unittests/aalcameraflashcontrol/aalcameraservice.cpp 2013-08-05 07:29:41 +0000
+++ unittests/aalcameraflashcontrol/aalcameraservice.cpp 2015-11-17 15:24:47 +0000
@@ -57,6 +57,14 @@
57{57{
58}58}
5959
60void AalCameraService::startPreview()
61{
62}
63
64void AalCameraService::stopPreview()
65{
66}
67
60void AalCameraService::initControls(CameraControl *camControl, CameraControlListener *listener)68void AalCameraService::initControls(CameraControl *camControl, CameraControlListener *listener)
61{69{
62 Q_UNUSED(camControl);70 Q_UNUSED(camControl);
@@ -76,3 +84,10 @@
76void AalCameraService::updateCaptureReady()84void AalCameraService::updateCaptureReady()
77{85{
78}86}
87
88QSize AalCameraService::selectSizeWithAspectRatio(const QList<QSize> &sizes, float targetAspectRatio) const
89{
90 Q_UNUSED(sizes);
91 Q_UNUSED(targetAspectRatio);
92 return QSize();
93}
7994
=== modified file 'unittests/aalcamerafocuscontrol/aalcameraservice.cpp'
--- unittests/aalcamerafocuscontrol/aalcameraservice.cpp 2013-02-11 15:56:21 +0000
+++ unittests/aalcamerafocuscontrol/aalcameraservice.cpp 2015-11-17 15:24:47 +0000
@@ -54,6 +54,14 @@
54{54{
55}55}
5656
57void AalCameraService::startPreview()
58{
59}
60
61void AalCameraService::stopPreview()
62{
63}
64
57void AalCameraService::initControls(CameraControl *camControl, CameraControlListener *listener)65void AalCameraService::initControls(CameraControl *camControl, CameraControlListener *listener)
58{66{
59 Q_UNUSED(camControl);67 Q_UNUSED(camControl);
@@ -63,3 +71,10 @@
63void AalCameraService::updateCaptureReady()71void AalCameraService::updateCaptureReady()
64{72{
65}73}
74
75QSize AalCameraService::selectSizeWithAspectRatio(const QList<QSize> &sizes, float targetAspectRatio) const
76{
77 Q_UNUSED(sizes);
78 Q_UNUSED(targetAspectRatio);
79 return QSize();
80}
6681
=== modified file 'unittests/aalcamerazoomcontrol/aalcameraservice.cpp'
--- unittests/aalcamerazoomcontrol/aalcameraservice.cpp 2013-07-23 16:02:22 +0000
+++ unittests/aalcamerazoomcontrol/aalcameraservice.cpp 2015-11-17 15:24:47 +0000
@@ -68,6 +68,14 @@
68 android_camera_disconnect(m_androidControl);68 android_camera_disconnect(m_androidControl);
69}69}
7070
71void AalCameraService::startPreview()
72{
73}
74
75void AalCameraService::stopPreview()
76{
77}
78
71void AalCameraService::initControls(CameraControl *camControl, CameraControlListener *listener)79void AalCameraService::initControls(CameraControl *camControl, CameraControlListener *listener)
72{80{
73 m_zoomControl->init(camControl, listener);81 m_zoomControl->init(camControl, listener);
@@ -76,3 +84,10 @@
76void AalCameraService::updateCaptureReady()84void AalCameraService::updateCaptureReady()
77{85{
78}86}
87
88QSize AalCameraService::selectSizeWithAspectRatio(const QList<QSize> &sizes, float targetAspectRatio) const
89{
90 Q_UNUSED(sizes);
91 Q_UNUSED(targetAspectRatio);
92 return QSize();
93}
7994
=== modified file 'unittests/aalimagecapturecontrol/aalcameraservice.cpp'
--- unittests/aalimagecapturecontrol/aalcameraservice.cpp 2013-02-14 19:37:36 +0000
+++ unittests/aalimagecapturecontrol/aalcameraservice.cpp 2015-11-17 15:24:47 +0000
@@ -54,6 +54,14 @@
54{54{
55}55}
5656
57void AalCameraService::startPreview()
58{
59}
60
61void AalCameraService::stopPreview()
62{
63}
64
57void AalCameraService::initControls(CameraControl *camControl, CameraControlListener *listener)65void AalCameraService::initControls(CameraControl *camControl, CameraControlListener *listener)
58{66{
59 Q_UNUSED(camControl);67 Q_UNUSED(camControl);
@@ -73,3 +81,10 @@
73void AalCameraService::updateCaptureReady()81void AalCameraService::updateCaptureReady()
74{82{
75}83}
84
85QSize AalCameraService::selectSizeWithAspectRatio(const QList<QSize> &sizes, float targetAspectRatio) const
86{
87 Q_UNUSED(sizes);
88 Q_UNUSED(targetAspectRatio);
89 return QSize();
90}
7691
=== modified file 'unittests/aalimagecapturecontrol/aalimageencodercontrol.cpp'
--- unittests/aalimagecapturecontrol/aalimageencodercontrol.cpp 2014-11-24 11:16:57 +0000
+++ unittests/aalimagecapturecontrol/aalimageencodercontrol.cpp 2015-11-17 15:24:47 +0000
@@ -76,14 +76,10 @@
76 Q_UNUSED(control);76 Q_UNUSED(control);
77}77}
7878
79void AalImageEncoderControl::setSize(const QSize &size)79bool AalImageEncoderControl::setSize(const QSize &size)
80{80{
81 Q_UNUSED(size);81 Q_UNUSED(size);
82}82 return true;
83
84void AalImageEncoderControl::setThumbnailSize(const QSize &size)
85{
86 Q_UNUSED(size);
87}83}
8884
89void AalImageEncoderControl::resetAllSettings()85void AalImageEncoderControl::resetAllSettings()
9086
=== modified file 'unittests/aalimagecapturecontrol/tst_aalimagecapturecontrol.cpp'
--- unittests/aalimagecapturecontrol/tst_aalimagecapturecontrol.cpp 2014-09-29 10:05:25 +0000
+++ unittests/aalimagecapturecontrol/tst_aalimagecapturecontrol.cpp 2015-11-17 15:24:47 +0000
@@ -31,11 +31,6 @@
31 void initTestCase();31 void initTestCase();
32 void cleanupTestCase();32 void cleanupTestCase();
3333
34 void chooseOptimalSize16by9();
35 void chooseOptimalSizeEmpty();
36
37 void priorityAspectRatio();
38
39 void updateEXIF();34 void updateEXIF();
4035
41private:36private:
@@ -57,45 +52,6 @@
57 delete m_service;52 delete m_service;
58}53}
5954
60void tst_AalImageCaptureControl::chooseOptimalSize16by9()
61{
62 Q_ASSERT(m_service->isBackCameraUsed());
63
64 m_icControl->m_aspectRatio = 16.0f / 9.0f;
65 QList<QSize> resolutions;
66 resolutions.append(QSize(1920, 1080));
67 resolutions.append(QSize(1280, 720));
68 resolutions.append(QSize(960, 720));
69
70 QCOMPARE(m_icControl->chooseOptimalSize(resolutions), QSize(1920, 1080));
71}
72
73void tst_AalImageCaptureControl::chooseOptimalSizeEmpty()
74{
75 m_icControl->m_aspectRatio = 4.0f / 3.0f;
76 QList<QSize> resolutions;
77
78 QCOMPARE(m_icControl->chooseOptimalSize(resolutions), QSize());
79}
80
81void tst_AalImageCaptureControl::priorityAspectRatio()
82{
83 Q_ASSERT(m_service->isBackCameraUsed());
84
85 QList<float> backAspectRatios;
86 backAspectRatios.append(16.0f / 9.0f);
87 backAspectRatios.append(15.0f / 10.0f);
88 backAspectRatios.append(4.0f / 3.0f);
89 backAspectRatios.append(5.0f / 4.0f);
90 m_icControl->getPriorityAspectRatios();
91 for (uint8_t i=0; i<4; ++i) {
92 const float EPSILON = 10e-2;
93 qDebug() << "m_icControl->m_prioritizedAspectRatios[i]: " << m_icControl->m_prioritizedAspectRatios[i] << endl;
94 qDebug() << "backAspectRatios[i]: " << backAspectRatios[i] << endl;
95 Q_ASSERT(fabs(m_icControl->m_prioritizedAspectRatios[i] - backAspectRatios[i]) < EPSILON);
96 }
97}
98
99void tst_AalImageCaptureControl::updateEXIF()55void tst_AalImageCaptureControl::updateEXIF()
100{56{
101 bool result;57 bool result;
10258
=== modified file 'unittests/aalvideodeviceselectorcontrol/aalcameraservice.cpp'
--- unittests/aalvideodeviceselectorcontrol/aalcameraservice.cpp 2013-08-01 10:41:04 +0000
+++ unittests/aalvideodeviceselectorcontrol/aalcameraservice.cpp 2015-11-17 15:24:47 +0000
@@ -54,6 +54,14 @@
54{54{
55}55}
5656
57void AalCameraService::startPreview()
58{
59}
60
61void AalCameraService::stopPreview()
62{
63}
64
57bool AalCameraService::isCameraActive() const65bool AalCameraService::isCameraActive() const
58{66{
59 return true;67 return true;
@@ -65,11 +73,6 @@
65 Q_UNUSED(listener);73 Q_UNUSED(listener);
66}74}
6775
68bool AalCameraService::isReady() const
69{
70 return true;
71}
72
73bool AalCameraService::isRecording() const76bool AalCameraService::isRecording() const
74{77{
75 return false;78 return false;
@@ -78,3 +81,10 @@
78void AalCameraService::updateCaptureReady()81void AalCameraService::updateCaptureReady()
79{82{
80}83}
84
85QSize AalCameraService::selectSizeWithAspectRatio(const QList<QSize> &sizes, float targetAspectRatio) const
86{
87 Q_UNUSED(sizes);
88 Q_UNUSED(targetAspectRatio);
89 return QSize();
90}
8191
=== modified file 'unittests/aalvideodeviceselectorcontrol/aalimageencodercontrol.cpp'
--- unittests/aalvideodeviceselectorcontrol/aalimageencodercontrol.cpp 2014-10-27 17:25:50 +0000
+++ unittests/aalvideodeviceselectorcontrol/aalimageencodercontrol.cpp 2015-11-17 15:24:47 +0000
@@ -61,9 +61,10 @@
61 Q_UNUSED(control);61 Q_UNUSED(control);
62}62}
6363
64void AalImageEncoderControl::setSize(const QSize &size)64bool AalImageEncoderControl::setSize(const QSize &size)
65{65{
66 Q_UNUSED(size);66 Q_UNUSED(size);
67 return true;
67}68}
6869
69void AalImageEncoderControl::resetAllSettings()70void AalImageEncoderControl::resetAllSettings()
7071
=== modified file 'unittests/aalviewfindersettingscontrol/aalcameraservice.cpp'
--- unittests/aalviewfindersettingscontrol/aalcameraservice.cpp 2013-02-11 15:56:21 +0000
+++ unittests/aalviewfindersettingscontrol/aalcameraservice.cpp 2015-11-17 15:24:47 +0000
@@ -15,6 +15,7 @@
15 */15 */
1616
17#include "aalcameraservice.h"17#include "aalcameraservice.h"
18#include <cmath>
1819
19AalCameraService *AalCameraService::m_service = 0;20AalCameraService *AalCameraService::m_service = 0;
2021
@@ -54,6 +55,14 @@
54{55{
55}56}
5657
58void AalCameraService::startPreview()
59{
60}
61
62void AalCameraService::stopPreview()
63{
64}
65
57void AalCameraService::initControls(CameraControl *camControl, CameraControlListener *listener)66void AalCameraService::initControls(CameraControl *camControl, CameraControlListener *listener)
58{67{
59 Q_UNUSED(camControl);68 Q_UNUSED(camControl);
@@ -73,3 +82,28 @@
73void AalCameraService::updateCaptureReady()82void AalCameraService::updateCaptureReady()
74{83{
75}84}
85
86QSize AalCameraService::selectSizeWithAspectRatio(const QList<QSize> &sizes, float targetAspectRatio) const
87{
88 QSize selectedSize;
89 long selectedPixelCount = 0;
90 const float EPSILON = 0.02;
91
92 if (!sizes.empty()) {
93 // Loop over all sizes until we find the highest one that matches targetAspectRatio.
94 QList<QSize>::const_iterator it = sizes.begin();
95 while (it != sizes.end()) {
96 QSize size = *it;
97 const float aspectRatio = (float)size.width() / (float)size.height();
98 const long pixelCount = (long)size.width() * (long)size.height();
99 if (fabs(aspectRatio - targetAspectRatio) < EPSILON && pixelCount > selectedPixelCount) {
100 selectedSize = size;
101 selectedPixelCount = pixelCount;
102 }
103 ++it;
104 }
105 }
106
107 return selectedSize;
108}
109
76110
=== modified file 'unittests/stubs/aalcameraservice_stub.cpp'
--- unittests/stubs/aalcameraservice_stub.cpp 2013-06-22 07:29:20 +0000
+++ unittests/stubs/aalcameraservice_stub.cpp 2015-11-17 15:24:47 +0000
@@ -65,6 +65,14 @@
65{65{
66}66}
6767
68void AalCameraService::startPreview()
69{
70}
71
72void AalCameraService::stopPreview()
73{
74}
75
68void AalCameraService::initControls(CameraControl *camControl, CameraControlListener *listener)76void AalCameraService::initControls(CameraControl *camControl, CameraControlListener *listener)
69{77{
70 delete m_androidControl;78 delete m_androidControl;

Subscribers

People subscribed via source and target branches