New camera selection API in QML.

Also added a new QtMultimedia global object which makes it possible
to retrieve the list of available cameras. It can be extended with
new utility functions in the future.

Includes documentation, example and auto tests.

Task-number: QTBUG-23770
Change-Id: Ifea076329c3582ea99246ee1131853344a7b773f
Reviewed-by: Christian Stromme <christian.stromme@digia.com>
This commit is contained in:
Yoann Lopes
2014-02-10 19:33:51 +01:00
parent cddbe8736d
commit 888759e334
32 changed files with 1297 additions and 89 deletions

View File

@@ -0,0 +1,155 @@
/****************************************************************************
**
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia. For licensing terms and
** conditions see http://qt.digia.com/licensing. For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3.0 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU General Public License version 3.0 requirements will be
** met: http://www.gnu.org/copyleft/gpl.html.
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
import QtQuick 2.0
import QtTest 1.0
import QtMultimedia 5.4
TestCase {
Component {
id: cameraComponent
Camera { }
}
Loader {
id: cameraLoader
}
SignalSpy {
id: deviceIdSpy
target: cameraLoader.item
signalName: "deviceIdChanged"
}
function test_deviceId() {
deviceIdSpy.clear();
cameraLoader.sourceComponent = cameraComponent;
var camera = cameraLoader.item;
// default camera
compare(camera.deviceId, "othercamera", "deviceId");
compare(camera.displayName, "othercamera desc", "displayName");
compare(camera.position, Camera.UnspecifiedPosition, "position");
compare(camera.orientation, 0, "orientation");
// setting an invalid camera ID should leave the item unchanged
camera.deviceId = "invalidcamera";
compare(camera.deviceId, "othercamera");
compare(deviceIdSpy.count, 0);
compare(camera.displayName, "othercamera desc", "displayName");
compare(camera.position, Camera.UnspecifiedPosition, "position");
compare(camera.orientation, 0, "orientation");
// change to another valid camera
camera.deviceId = "backcamera";
compare(camera.deviceId, "backcamera");
compare(deviceIdSpy.count, 1);
compare(camera.displayName, "backcamera desc", "displayName");
compare(camera.position, Camera.BackFace, "position");
compare(camera.orientation, 90, "orientation");
// setting an empty device ID should load the default camera
camera.deviceId = "";
compare(camera.deviceId, "othercamera", "deviceId");
compare(deviceIdSpy.count, 2);
cameraLoader.sourceComponent = undefined;
}
function test_position() {
deviceIdSpy.clear();
cameraLoader.sourceComponent = cameraComponent;
var camera = cameraLoader.item;
// default camera
compare(camera.position, Camera.UnspecifiedPosition, "position");
compare(camera.deviceId, "othercamera", "deviceId");
// setting an unavailable camera position should leave the item unchanged
camera.position = Camera.FrontFace;
compare(camera.position, Camera.UnspecifiedPosition, "position");
compare(camera.deviceId, "othercamera", "deviceId");
compare(deviceIdSpy.count, 0);
// change to an available position
camera.position = Camera.BackFace;
compare(camera.position, Camera.BackFace, "position");
compare(camera.deviceId, "backcamera", "deviceId");
compare(deviceIdSpy.count, 1);
// setting UnspecifiedPosition should load the default camera
camera.position = Camera.UnspecifiedPosition;
compare(camera.position, Camera.UnspecifiedPosition, "position");
compare(camera.deviceId, "othercamera", "deviceId");
compare(deviceIdSpy.count, 2);
cameraLoader.sourceComponent = undefined;
}
SignalSpy {
id: cameraStateSpy
target: cameraLoader.item
signalName: "cameraStateChanged"
}
function test_cameraState() {
deviceIdSpy.clear();
cameraStateSpy.clear();
cameraLoader.sourceComponent = cameraComponent;
var camera = cameraLoader.item;
// camera should be in ActiveState by default
compare(camera.cameraState, Camera.ActiveState, "cameraState");
compare(camera.deviceId, "othercamera", "deviceId");
// Changing the camera device should unload the previous camera and apply the current state
// to the new camera
camera.deviceId = "backcamera";
compare(camera.deviceId, "backcamera", "deviceId");
compare(camera.cameraState, Camera.ActiveState, "cameraState");
compare(cameraStateSpy.count, 2);
compare(cameraStateSpy.signalArguments[0][0], Camera.UnloadedState);
compare(cameraStateSpy.signalArguments[1][0], Camera.ActiveState);
cameraLoader.sourceComponent = undefined;
}
}