Revision control

Copy as Markdown

// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QANDROIDCAPTURESESSION_H
#define QANDROIDCAPTURESESSION_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include <qobject.h>
#include <qmediarecorder.h>
#include <qurl.h>
#include <qelapsedtimer.h>
#include <qtimer.h>
#include "androidmediarecorder_p.h"
#include "qandroidmediaencoder_p.h"
QT_BEGIN_NAMESPACE
class QAudioInput;
class QAndroidCameraSession;
class QAndroidCaptureSession : public QObject
{
Q_OBJECT
public:
explicit QAndroidCaptureSession();
~QAndroidCaptureSession();
QList<QSize> supportedResolutions() const { return m_supportedResolutions; }
QList<qreal> supportedFrameRates() const { return m_supportedFramerates; }
void setCameraSession(QAndroidCameraSession *cameraSession = 0);
void setAudioInput(QPlatformAudioInput *input);
void setAudioOutput(QPlatformAudioOutput *output);
QMediaRecorder::RecorderState state() const;
void start(QMediaEncoderSettings &settings, const QUrl &outputLocation);
void stop(bool error = false);
qint64 duration() const;
QMediaEncoderSettings encoderSettings() { return m_encoderSettings; }
void setMediaEncoder(QAndroidMediaEncoder *encoder) { m_mediaEncoder = encoder; }
void stateChanged(QMediaRecorder::RecorderState state) {
if (m_mediaEncoder)
m_mediaEncoder->stateChanged(state);
}
void durationChanged(qint64 position)
{
if (m_mediaEncoder)
m_mediaEncoder->durationChanged(position);
}
void actualLocationChanged(const QUrl &location)
{
if (m_mediaEncoder)
m_mediaEncoder->actualLocationChanged(location);
}
void updateError(int error, const QString &errorString)
{
if (m_mediaEncoder)
m_mediaEncoder->updateError(QMediaRecorder::Error(error), errorString);
}
private Q_SLOTS:
void updateDuration();
void onCameraOpened();
void onError(int what, int extra);
void onInfo(int what, int extra);
private:
void applySettings(QMediaEncoderSettings &settings);
struct CaptureProfile {
AndroidMediaRecorder::OutputFormat outputFormat;
QString outputFileExtension;
AndroidMediaRecorder::AudioEncoder audioEncoder;
int audioBitRate;
int audioChannels;
int audioSampleRate;
AndroidMediaRecorder::VideoEncoder videoEncoder;
int videoBitRate;
int videoFrameRate;
QSize videoResolution;
bool isNull;
CaptureProfile()
: outputFormat(AndroidMediaRecorder::MPEG_4)
, outputFileExtension(QLatin1String("mp4"))
, audioEncoder(AndroidMediaRecorder::DefaultAudioEncoder)
, audioBitRate(128000)
, audioChannels(2)
, audioSampleRate(44100)
, videoEncoder(AndroidMediaRecorder::DefaultVideoEncoder)
, videoBitRate(1)
, videoFrameRate(-1)
, videoResolution(1280, 720)
, isNull(true)
{ }
};
CaptureProfile getProfile(int id);
void restartViewfinder();
void updateStreamingState();
QAndroidMediaEncoder *m_mediaEncoder = nullptr;
std::shared_ptr<AndroidMediaRecorder> m_mediaRecorder;
QAndroidCameraSession *m_cameraSession;
QPlatformAudioInput *m_audioInput = nullptr;
QPlatformAudioOutput *m_audioOutput = nullptr;
QElapsedTimer m_elapsedTime;
QTimer m_notifyTimer;
qint64 m_duration;
QMediaRecorder::RecorderState m_state;
QUrl m_usedOutputLocation;
bool m_outputLocationIsStandard = false;
CaptureProfile m_defaultSettings;
QMediaEncoderSettings m_encoderSettings;
AndroidMediaRecorder::OutputFormat m_outputFormat;
AndroidMediaRecorder::AudioEncoder m_audioEncoder;
AndroidMediaRecorder::VideoEncoder m_videoEncoder;
QList<QSize> m_supportedResolutions;
QList<qreal> m_supportedFramerates;
QMetaObject::Connection m_audioInputChanged;
QMetaObject::Connection m_audioOutputChanged;
QMetaObject::Connection m_connOpenCamera;
QMetaObject::Connection m_connActiveChangedCamera;
void setKeepAlive(bool keepAlive);
};
QT_END_NAMESPACE
#endif // QANDROIDCAPTURESESSION_H