xref: /OK3568_Linux_fs/app/qcamera/qtcamera.cpp.bk (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/****************************************************************************
2*4882a593Smuzhiyun**
3*4882a593Smuzhiyun** Copyright (C) 2017 The Qt Company Ltd.
4*4882a593Smuzhiyun** Contact: https://www.qt.io/licensing/
5*4882a593Smuzhiyun**
6*4882a593Smuzhiyun** This file is part of the examples of the Qt Toolkit.
7*4882a593Smuzhiyun**
8*4882a593Smuzhiyun** $QT_BEGIN_LICENSE:BSD$
9*4882a593Smuzhiyun** Commercial License Usage
10*4882a593Smuzhiyun** Licensees holding valid commercial Qt licenses may use this file in
11*4882a593Smuzhiyun** accordance with the commercial license agreement provided with the
12*4882a593Smuzhiyun** Software or, alternatively, in accordance with the terms contained in
13*4882a593Smuzhiyun** a written agreement between you and The Qt Company. For licensing terms
14*4882a593Smuzhiyun** and conditions see https://www.qt.io/terms-conditions. For further
15*4882a593Smuzhiyun** information use the contact form at https://www.qt.io/contact-us.
16*4882a593Smuzhiyun**
17*4882a593Smuzhiyun** BSD License Usage
18*4882a593Smuzhiyun** Alternatively, you may use this file under the terms of the BSD license
19*4882a593Smuzhiyun** as follows:
20*4882a593Smuzhiyun**
21*4882a593Smuzhiyun** "Redistribution and use in source and binary forms, with or without
22*4882a593Smuzhiyun** modification, are permitted provided that the following conditions are
23*4882a593Smuzhiyun** met:
24*4882a593Smuzhiyun**   * Redistributions of source code must retain the above copyright
25*4882a593Smuzhiyun**     notice, this list of conditions and the following disclaimer.
26*4882a593Smuzhiyun**   * Redistributions in binary form must reproduce the above copyright
27*4882a593Smuzhiyun**     notice, this list of conditions and the following disclaimer in
28*4882a593Smuzhiyun**     the documentation and/or other materials provided with the
29*4882a593Smuzhiyun**     distribution.
30*4882a593Smuzhiyun**   * Neither the name of The Qt Company Ltd nor the names of its
31*4882a593Smuzhiyun**     contributors may be used to endorse or promote products derived
32*4882a593Smuzhiyun**     from this software without specific prior written permission.
33*4882a593Smuzhiyun**
34*4882a593Smuzhiyun**
35*4882a593Smuzhiyun** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
36*4882a593Smuzhiyun** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
37*4882a593Smuzhiyun** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
38*4882a593Smuzhiyun** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
39*4882a593Smuzhiyun** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40*4882a593Smuzhiyun** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
41*4882a593Smuzhiyun** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
42*4882a593Smuzhiyun** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
43*4882a593Smuzhiyun** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
44*4882a593Smuzhiyun** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
45*4882a593Smuzhiyun** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
46*4882a593Smuzhiyun**
47*4882a593Smuzhiyun** $QT_END_LICENSE$
48*4882a593Smuzhiyun**
49*4882a593Smuzhiyun****************************************************************************/
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun#include "qtcamera.h"
52*4882a593Smuzhiyun#include <QApplication>
53*4882a593Smuzhiyun#include <QMediaService>
54*4882a593Smuzhiyun#include <QMediaRecorder>
55*4882a593Smuzhiyun#include <QCameraViewfinder>
56*4882a593Smuzhiyun#include <QCameraInfo>
57*4882a593Smuzhiyun#include <QMediaMetaData>
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun#include <QMessageBox>
60*4882a593Smuzhiyun#include <QPalette>
61*4882a593Smuzhiyun#include <QTabWidget>
62*4882a593Smuzhiyun#include <QtWidgets>
63*4882a593Smuzhiyun#include <QHBoxLayout>
64*4882a593Smuzhiyun#include <QVBoxLayout>
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun#define QCAMERA_CAPTURE_MODE "Image Mode"
68*4882a593Smuzhiyun#define QCAMERA_VIDEO_MODE "Video Mode"
69*4882a593Smuzhiyun#define DIR_USERDATA "/userdata"
70*4882a593Smuzhiyun#define DIR_HOME QStandardPaths::writableLocation(QStandardPaths::HomeLocation)
71*4882a593SmuzhiyunQ_DECLARE_METATYPE(QCameraInfo)
72*4882a593Smuzhiyun
73*4882a593SmuzhiyunqtCamera::qtCamera()
74*4882a593Smuzhiyun{
75*4882a593Smuzhiyun    initlayout();
76*4882a593Smuzhiyun    QFileInfo fi(DIR_USERDATA);
77*4882a593Smuzhiyun    if(fi.isDir()){
78*4882a593Smuzhiyun        locationDir = DIR_USERDATA;
79*4882a593Smuzhiyun    }else {
80*4882a593Smuzhiyun        QFileInfo fi(DIR_HOME);
81*4882a593Smuzhiyun        if(fi.isDir()){
82*4882a593Smuzhiyun            locationDir = DIR_HOME;
83*4882a593Smuzhiyun        }
84*4882a593Smuzhiyun    }
85*4882a593Smuzhiyun    imageCnt = videoCnt = 0;
86*4882a593Smuzhiyun    setCamera(QCameraInfo::defaultCamera());
87*4882a593Smuzhiyun}
88*4882a593Smuzhiyun
89*4882a593Smuzhiyunvoid qtCamera::initlayout()
90*4882a593Smuzhiyun{
91*4882a593Smuzhiyun    QBoxLayout *vLayout = new QVBoxLayout();
92*4882a593Smuzhiyun    const QRect availableGeometry = QApplication::desktop()->availableGeometry(this);
93*4882a593Smuzhiyun    resize(availableGeometry.width(), availableGeometry.height());
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun    const QList<QCameraInfo> availableCameras = QCameraInfo::availableCameras();
96*4882a593Smuzhiyun    for (const QCameraInfo &cameraInfo : availableCameras) {
97*4882a593Smuzhiyun//        qDebug() << cameraInfo.description();
98*4882a593Smuzhiyun        QPushButton *camera = getButton();
99*4882a593Smuzhiyun        camera->setText(cameraInfo.description());
100*4882a593Smuzhiyun        camera->setCheckable(true);
101*4882a593Smuzhiyun        if (cameraInfo == QCameraInfo::defaultCamera()){
102*4882a593Smuzhiyun            camera->setDefault(true);
103*4882a593Smuzhiyun        }else {
104*4882a593Smuzhiyun            camera->setDefault(false);
105*4882a593Smuzhiyun        }
106*4882a593Smuzhiyun        connect(camera, SIGNAL(clicked(bool)), this, SLOT(on_cameraSwitch()));
107*4882a593Smuzhiyun        vLayout->addWidget(camera);
108*4882a593Smuzhiyun    }
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun    modeButton = getButton();
111*4882a593Smuzhiyun    modeButton->setText(cameraMode);
112*4882a593Smuzhiyun    connect(modeButton, SIGNAL(clicked(bool)), this, SLOT(updateCaptureMode()));
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun    captureButton = getButton();
115*4882a593Smuzhiyun    captureButton->setText(tr("Capture"));
116*4882a593Smuzhiyun    connect(captureButton, SIGNAL(clicked(bool)), this, SLOT(on_captureClicked()));
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun    exitButton = getButton();
119*4882a593Smuzhiyun    exitButton->setText(tr("Exit"));
120*4882a593Smuzhiyun    connect(exitButton, SIGNAL(clicked(bool)), this, SLOT(on_exitClicked()));
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun    vLayout->addWidget(modeButton);
123*4882a593Smuzhiyun    vLayout->addWidget(captureButton);
124*4882a593Smuzhiyun    vLayout->addWidget(exitButton);
125*4882a593Smuzhiyun    vLayout->setAlignment(Qt::AlignTop);
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun    viewfinder.setWindowFlag(Qt::FramelessWindowHint);
128*4882a593Smuzhiyun    viewfinder.setFixedSize(availableGeometry.width() - 150, availableGeometry.height());
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun    QBoxLayout *hlayout = new QHBoxLayout;
131*4882a593Smuzhiyun    hlayout->setMargin(0);
132*4882a593Smuzhiyun    hlayout->addWidget(&viewfinder);
133*4882a593Smuzhiyun    hlayout->addLayout(vLayout);
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun    QWidget *widget = new QWidget;
136*4882a593Smuzhiyun    widget->setLayout(hlayout);
137*4882a593Smuzhiyun    setCentralWidget(widget);
138*4882a593Smuzhiyun//    setWindowState(Qt::WindowMaximized);
139*4882a593Smuzhiyun    setWindowFlags(Qt::FramelessWindowHint);
140*4882a593Smuzhiyun}
141*4882a593Smuzhiyun
142*4882a593Smuzhiyunvoid qtCamera::setCamera(const QCameraInfo &cameraInfo)
143*4882a593Smuzhiyun{
144*4882a593Smuzhiyun    m_camera.reset(new QCamera(cameraInfo));
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun    connect(m_camera.data(), &QCamera::stateChanged, this, &qtCamera::updateCameraState);
147*4882a593Smuzhiyun    connect(m_camera.data(), QOverload<QCamera::Error>::of(&QCamera::error), this, &qtCamera::displayCameraError);
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun    m_mediaRecorder.reset(new QMediaRecorder(m_camera.data()));
150*4882a593Smuzhiyun    connect(m_mediaRecorder.data(), &QMediaRecorder::stateChanged, this, &qtCamera::updateRecorderState);
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun    m_imageCapture.reset(new QCameraImageCapture(m_camera.data()));
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun    connect(m_mediaRecorder.data(), &QMediaRecorder::durationChanged, this, &qtCamera::updateRecordTime);
155*4882a593Smuzhiyun    connect(m_mediaRecorder.data(), QOverload<QMediaRecorder::Error>::of(&QMediaRecorder::error),
156*4882a593Smuzhiyun            this, &qtCamera::displayRecorderError);
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun    m_mediaRecorder->setMetaData(QMediaMetaData::Title, QVariant(QLatin1String("Test Title")));
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun    configureCaptureSettings();
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun    m_camera->setViewfinder(&viewfinder);
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun    updateCameraState(m_camera->state());
165*4882a593Smuzhiyun    updateRecorderState(m_mediaRecorder->state());
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun    connect(m_imageCapture.data(), &QCameraImageCapture::imageSaved, this, &qtCamera::imageSaved);
168*4882a593Smuzhiyun    connect(m_imageCapture.data(), QOverload<int, QCameraImageCapture::Error, const QString &>::of(&QCameraImageCapture::error),
169*4882a593Smuzhiyun            this, &qtCamera::displayCaptureError);
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun    updateCaptureMode();
172*4882a593Smuzhiyun}
173*4882a593Smuzhiyun
174*4882a593Smuzhiyunvoid qtCamera::configureCaptureSettings()
175*4882a593Smuzhiyun{
176*4882a593Smuzhiyun    QSize size(640, 480);
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun    m_imageSettings.setCodec("jpeg");
179*4882a593Smuzhiyun    m_imageSettings.setQuality(QMultimedia::VeryHighQuality);
180*4882a593Smuzhiyun    m_imageSettings.setResolution(size);
181*4882a593Smuzhiyun    m_imageCapture->setEncodingSettings(m_imageSettings);
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun    m_audioSettings.setCodec("audio/x-adpcm");
184*4882a593Smuzhiyun    m_audioSettings.setChannelCount(2);
185*4882a593Smuzhiyun    m_audioSettings.setQuality(QMultimedia::NormalQuality);
186*4882a593Smuzhiyun    m_mediaRecorder->setAudioSettings(m_audioSettings);
187*4882a593Smuzhiyun
188*4882a593Smuzhiyun    m_videoSettings.setCodec("video/x-h264");
189*4882a593Smuzhiyun    m_videoSettings.setResolution(size);
190*4882a593Smuzhiyun    m_videoSettings.setQuality(QMultimedia::NormalQuality);
191*4882a593Smuzhiyun    m_mediaRecorder->setVideoSettings(m_videoSettings);
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun    m_mediaRecorder->setContainerFormat("video/quicktime");
194*4882a593Smuzhiyun
195*4882a593Smuzhiyun    if (0) {
196*4882a593Smuzhiyun        QList<QSize> supportedResolutions;
197*4882a593Smuzhiyun        supportedResolutions = m_imageCapture->supportedResolutions();
198*4882a593Smuzhiyun        for (const QSize &resolution : supportedResolutions) {
199*4882a593Smuzhiyun             qDebug() << "image resolution: " << resolution.width() << "x" << resolution.height();
200*4882a593Smuzhiyun        }
201*4882a593Smuzhiyun
202*4882a593Smuzhiyun        supportedResolutions = m_mediaRecorder->supportedResolutions();
203*4882a593Smuzhiyun        for (const QSize &resolution : supportedResolutions) {
204*4882a593Smuzhiyun            qDebug() << "video resolution: " << resolution.width() << "x" << resolution.height();
205*4882a593Smuzhiyun        }
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun        const QStringList supportedAudioCodecs = m_mediaRecorder->supportedAudioCodecs();
208*4882a593Smuzhiyun        for (const QString &codecName : supportedAudioCodecs) {
209*4882a593Smuzhiyun            QString description = m_mediaRecorder->audioCodecDescription(codecName);
210*4882a593Smuzhiyun            qDebug() << "audio codec:" << codecName + ": " + description;
211*4882a593Smuzhiyun        }
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun        const QStringList supportedVideoCodecs = m_mediaRecorder->supportedVideoCodecs();
214*4882a593Smuzhiyun        for (const QString &codecName : supportedVideoCodecs) {
215*4882a593Smuzhiyun            QString description = m_mediaRecorder->videoCodecDescription(codecName);
216*4882a593Smuzhiyun            qDebug() << "video codec:" << codecName + ": " + description;
217*4882a593Smuzhiyun        }
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun        const QStringList formats = m_mediaRecorder->supportedContainers();
220*4882a593Smuzhiyun        for (const QString &format : formats) {
221*4882a593Smuzhiyun<<<<<<< Updated upstream
222*4882a593Smuzhiyun            QString description = m_mediaRecorder->containerDescription(format);
223*4882a593Smuzhiyun            qDebug() << "container: " << format << ": " << description;
224*4882a593Smuzhiyun        }
225*4882a593Smuzhiyun=======
226*4882a593Smuzhiyun            qDebug() << format;
227*4882a593Smuzhiyun        }
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun        supportedResolutions = m_mediaRecorder->supportedResolutions();
230*4882a593Smuzhiyun        for (const QSize &resolution : supportedResolutions) {
231*4882a593Smuzhiyun            if(size.width()<resolution.width() && size.height()<resolution.height())
232*4882a593Smuzhiyun                size = resolution;
233*4882a593Smuzhiyun        }
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun        m_audioSettings.setCodec("audio/mpeg");
236*4882a593Smuzhiyun        m_audioSettings.setQuality(QMultimedia::VeryHighQuality);
237*4882a593Smuzhiyun        m_videoSettings.setCodec("video/x-h264");
238*4882a593Smuzhiyun        m_videoSettings.setQuality(QMultimedia::VeryHighQuality);
239*4882a593Smuzhiyun        m_videoSettings.setResolution(size);
240*4882a593Smuzhiyun        m_mediaRecorder->setAudioSettings(m_audioSettings);
241*4882a593Smuzhiyun        m_mediaRecorder->setVideoSettings(m_videoSettings);
242*4882a593Smuzhiyun        m_mediaRecorder->setContainerFormat("video/quicktime, variant=(string)iso");
243*4882a593Smuzhiyun        break;
244*4882a593Smuzhiyun    }
245*4882a593Smuzhiyun    default:
246*4882a593Smuzhiyun        break;
247*4882a593Smuzhiyun>>>>>>> Stashed changes
248*4882a593Smuzhiyun    }
249*4882a593Smuzhiyun}
250*4882a593Smuzhiyun
251*4882a593SmuzhiyunQPushButton* qtCamera::getButton()
252*4882a593Smuzhiyun{
253*4882a593Smuzhiyun    QPushButton *button = new QPushButton;
254*4882a593Smuzhiyun    button->setFixedSize(144, 70);
255*4882a593Smuzhiyun    return button;
256*4882a593Smuzhiyun}
257*4882a593Smuzhiyun
258*4882a593Smuzhiyunvoid qtCamera::updateRecordTime()
259*4882a593Smuzhiyun{
260*4882a593Smuzhiyun    QString str = QString("Recorded %1 sec").arg(m_mediaRecorder->duration()/1000);
261*4882a593Smuzhiyun    statusBar()->showMessage(str);
262*4882a593Smuzhiyun}
263*4882a593Smuzhiyun
264*4882a593Smuzhiyunvoid qtCamera::record()
265*4882a593Smuzhiyun{
266*4882a593Smuzhiyun    QFileInfo fi;
267*4882a593Smuzhiyun    QString lo;
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun    lo = locationDir + "/" + "VIDEO" + QString::number(videoCnt) + ".mov";
270*4882a593Smuzhiyun    fi = QFileInfo(lo);
271*4882a593Smuzhiyun
272*4882a593Smuzhiyun    while(fi.isFile()){
273*4882a593Smuzhiyun        videoCnt++;
274*4882a593Smuzhiyun        lo = locationDir + "/" + "VIDEO" + QString::number(videoCnt) + ".mov";
275*4882a593Smuzhiyun        fi = QFileInfo(lo);
276*4882a593Smuzhiyun    }
277*4882a593Smuzhiyun
278*4882a593Smuzhiyun    m_mediaRecorder->setOutputLocation(QUrl::fromLocalFile(lo));
279*4882a593Smuzhiyun    m_mediaRecorder->record();
280*4882a593Smuzhiyun    updateRecordTime();
281*4882a593Smuzhiyun}
282*4882a593Smuzhiyun
283*4882a593Smuzhiyunvoid qtCamera::stop()
284*4882a593Smuzhiyun{
285*4882a593Smuzhiyun    m_mediaRecorder->stop();
286*4882a593Smuzhiyun}
287*4882a593Smuzhiyun
288*4882a593Smuzhiyunvoid qtCamera::takeImage()
289*4882a593Smuzhiyun{
290*4882a593Smuzhiyun    m_isCapturingImage = true;
291*4882a593Smuzhiyun    QFileInfo fi;
292*4882a593Smuzhiyun    QString lo;
293*4882a593Smuzhiyun
294*4882a593Smuzhiyun    lo = locationDir + "/" + "PIC" + QString::number(imageCnt) + ".jpg";
295*4882a593Smuzhiyun    fi = QFileInfo(lo);
296*4882a593Smuzhiyun
297*4882a593Smuzhiyun    while(fi.isFile()){
298*4882a593Smuzhiyun        imageCnt++;
299*4882a593Smuzhiyun        lo = locationDir + "/" + "PIC" + QString::number(imageCnt) + ".jpg";
300*4882a593Smuzhiyun        fi = QFileInfo(lo);
301*4882a593Smuzhiyun    }
302*4882a593Smuzhiyun
303*4882a593Smuzhiyun    m_imageCapture->capture(lo);
304*4882a593Smuzhiyun}
305*4882a593Smuzhiyun
306*4882a593Smuzhiyunvoid qtCamera::displayCaptureError(int id, const QCameraImageCapture::Error error, const QString &errorString)
307*4882a593Smuzhiyun{
308*4882a593Smuzhiyun    Q_UNUSED(id);
309*4882a593Smuzhiyun    Q_UNUSED(error);
310*4882a593Smuzhiyun    QMessageBox::warning(this, tr("Image Capture Error"), errorString);
311*4882a593Smuzhiyun    m_isCapturingImage = false;
312*4882a593Smuzhiyun}
313*4882a593Smuzhiyun
314*4882a593Smuzhiyunvoid qtCamera::updateCaptureMode()
315*4882a593Smuzhiyun{
316*4882a593Smuzhiyun    QCamera::CaptureModes captureMode;
317*4882a593Smuzhiyun    QString capture;
318*4882a593Smuzhiyun    if (cameraMode.compare(QCAMERA_CAPTURE_MODE)){
319*4882a593Smuzhiyun        captureMode = QCamera::CaptureStillImage ;
320*4882a593Smuzhiyun    }else {
321*4882a593Smuzhiyun        captureMode = QCamera::CaptureVideo;
322*4882a593Smuzhiyun    }
323*4882a593Smuzhiyun
324*4882a593Smuzhiyun    if (m_camera->isCaptureModeSupported(captureMode)){
325*4882a593Smuzhiyun        m_camera->unload();
326*4882a593Smuzhiyun        m_camera->setCaptureMode(captureMode);
327*4882a593Smuzhiyun        m_camera->start();
328*4882a593Smuzhiyun        if(captureMode == QCamera::CaptureStillImage){
329*4882a593Smuzhiyun            cameraMode = QString(QCAMERA_CAPTURE_MODE);
330*4882a593Smuzhiyun            capture = "Capture";
331*4882a593Smuzhiyun        }else {
332*4882a593Smuzhiyun            cameraMode = QString(QCAMERA_VIDEO_MODE);
333*4882a593Smuzhiyun            capture = "Record";
334*4882a593Smuzhiyun        }
335*4882a593Smuzhiyun        modeButton->setText(cameraMode);
336*4882a593Smuzhiyun        captureButton->setText(capture);
337*4882a593Smuzhiyun    }
338*4882a593Smuzhiyun}
339*4882a593Smuzhiyun
340*4882a593Smuzhiyunvoid qtCamera::updateCameraState(QCamera::State state)
341*4882a593Smuzhiyun{
342*4882a593Smuzhiyun    switch (state) {
343*4882a593Smuzhiyun    case QCamera::ActiveState:
344*4882a593Smuzhiyun        break;
345*4882a593Smuzhiyun    case QCamera::UnloadedState:
346*4882a593Smuzhiyun    case QCamera::LoadedState:
347*4882a593Smuzhiyun        break;
348*4882a593Smuzhiyun    }
349*4882a593Smuzhiyun}
350*4882a593Smuzhiyun
351*4882a593Smuzhiyunvoid qtCamera::updateRecorderState(QMediaRecorder::State state)
352*4882a593Smuzhiyun{
353*4882a593Smuzhiyun    switch (state) {
354*4882a593Smuzhiyun    case QMediaRecorder::StoppedState:
355*4882a593Smuzhiyun        captureButton->setText(tr("Record"));
356*4882a593Smuzhiyun        break;
357*4882a593Smuzhiyun    case QMediaRecorder::PausedState:
358*4882a593Smuzhiyun        break;
359*4882a593Smuzhiyun    case QMediaRecorder::RecordingState:
360*4882a593Smuzhiyun        captureButton->setText(tr("Recording"));
361*4882a593Smuzhiyun        break;
362*4882a593Smuzhiyun    }
363*4882a593Smuzhiyun}
364*4882a593Smuzhiyun
365*4882a593Smuzhiyunvoid qtCamera::displayRecorderError()
366*4882a593Smuzhiyun{
367*4882a593Smuzhiyun    QMessageBox::warning(this, tr("Capture Error"), m_mediaRecorder->errorString());
368*4882a593Smuzhiyun}
369*4882a593Smuzhiyun
370*4882a593Smuzhiyunvoid qtCamera::displayCameraError()
371*4882a593Smuzhiyun{
372*4882a593Smuzhiyun    QMessageBox::warning(this, tr("Camera Error"), m_camera->errorString());
373*4882a593Smuzhiyun}
374*4882a593Smuzhiyun
375*4882a593Smuzhiyunvoid qtCamera::imageSaved(int id, const QString &fileName)
376*4882a593Smuzhiyun{
377*4882a593Smuzhiyun    Q_UNUSED(id);
378*4882a593Smuzhiyun    statusBar()->showMessage(tr("Captured \"%1\"").arg(QDir::toNativeSeparators(fileName)));
379*4882a593Smuzhiyun    statusBar()->show();
380*4882a593Smuzhiyun    m_isCapturingImage = false;
381*4882a593Smuzhiyun    if (m_applicationExiting)
382*4882a593Smuzhiyun        close();
383*4882a593Smuzhiyun}
384*4882a593Smuzhiyun
385*4882a593Smuzhiyunvoid qtCamera::closeEvent(QCloseEvent *event)
386*4882a593Smuzhiyun{
387*4882a593Smuzhiyun    if (m_isCapturingImage) {
388*4882a593Smuzhiyun        setEnabled(false);
389*4882a593Smuzhiyun        m_applicationExiting = true;
390*4882a593Smuzhiyun        event->ignore();
391*4882a593Smuzhiyun    } else {
392*4882a593Smuzhiyun        event->accept();
393*4882a593Smuzhiyun    }
394*4882a593Smuzhiyun}
395*4882a593Smuzhiyun
396*4882a593Smuzhiyunvoid qtCamera::on_cameraSwitch()
397*4882a593Smuzhiyun{
398*4882a593Smuzhiyun    QList<QPushButton *> buttons = centralWidget()->findChildren<QPushButton *>();
399*4882a593Smuzhiyun    for(auto *but: buttons){
400*4882a593Smuzhiyun        if(but->isChecked()){
401*4882a593Smuzhiyun            for(auto *button: buttons){
402*4882a593Smuzhiyun                if(button->isDefault())
403*4882a593Smuzhiyun                    button->setDefault(false);
404*4882a593Smuzhiyun            }
405*4882a593Smuzhiyun            but->setDefault(true);
406*4882a593Smuzhiyun            but->setChecked(false);
407*4882a593Smuzhiyun            qDebug() << "switch to " + but->text();
408*4882a593Smuzhiyun            const QList<QCameraInfo> availableCameras = QCameraInfo::availableCameras();
409*4882a593Smuzhiyun            for (const QCameraInfo &cameraInfo : availableCameras) {
410*4882a593Smuzhiyun                if(! but->text().compare(cameraInfo.description())){
411*4882a593Smuzhiyun                    qDebug() << cameraInfo.description();
412*4882a593Smuzhiyun                    setCamera(cameraInfo);
413*4882a593Smuzhiyun                }
414*4882a593Smuzhiyun            }
415*4882a593Smuzhiyun            break;
416*4882a593Smuzhiyun        }
417*4882a593Smuzhiyun    }
418*4882a593Smuzhiyun}
419*4882a593Smuzhiyun
420*4882a593Smuzhiyunvoid qtCamera::on_captureClicked()
421*4882a593Smuzhiyun{
422*4882a593Smuzhiyun    if (m_camera->captureMode() == QCamera::CaptureStillImage) {
423*4882a593Smuzhiyun        takeImage();
424*4882a593Smuzhiyun    } else {
425*4882a593Smuzhiyun        if (m_mediaRecorder->state() == QMediaRecorder::RecordingState)
426*4882a593Smuzhiyun            stop();
427*4882a593Smuzhiyun        else
428*4882a593Smuzhiyun            record();
429*4882a593Smuzhiyun    }
430*4882a593Smuzhiyun}
431*4882a593Smuzhiyun
432*4882a593Smuzhiyunvoid qtCamera::on_exitClicked()
433*4882a593Smuzhiyun{
434*4882a593Smuzhiyun        qApp->exit(0);
435*4882a593Smuzhiyun}
436