15#include <private/qplatformaudioinput_p.h>
16#include <private/qplatformaudiooutput_p.h>
17#include <private/qmediarecorder_p.h>
18#include <private/qmediastoragelocation_p.h>
19#include <QtCore/qmimetype.h>
42 m_mediaRecorder =
nullptr;
43 if (m_audioInput && m_audioOutput)
49 if (m_cameraSession) {
54 m_cameraSession = cameraSession;
55 if (m_cameraSession) {
57 this, &QAndroidCaptureSession::onCameraOpened);
68 if (m_audioInput ==
input)
79 if (m_state == QMediaRecorder::RecordingState)
80 m_mediaRecorder->setAudioInput(m_audioInput->device.id());
81 updateStreamingState();
84 updateStreamingState();
89 if (m_audioOutput ==
output)
100 AndroidMediaPlayer::setAudioOutput(m_audioOutput->device.id());
101 updateStreamingState();
105 updateStreamingState();
108void QAndroidCaptureSession::updateStreamingState()
110 if (m_audioInput && m_audioOutput) {
123void QAndroidCaptureSession::setKeepAlive(
bool keepAlive)
135 if (!m_cameraSession && !m_audioInput) {
142 const bool validCameraSession = m_cameraSession && m_cameraSession->
camera();
156 m_mediaRecorder = std::make_shared<AndroidMediaRecorder>();
158 &QAndroidCaptureSession::onError);
160 &QAndroidCaptureSession::onInfo);
165 if (validCameraSession) {
169 m_mediaRecorder->setCamera(m_cameraSession->
camera());
174 m_mediaRecorder->setAudioInput(m_audioInput->
device.
id());
175 if (!m_mediaRecorder->isAudioSourceSet())
180 m_mediaRecorder->setOutputFormat(m_outputFormat);
183 if (validCameraSession) {
184 m_mediaRecorder->setVideoSize(
settings.videoResolution());
185 m_mediaRecorder->setVideoFrameRate(
qRound(
settings.videoFrameRate()));
186 m_mediaRecorder->setVideoEncodingBitRate(
settings.videoBitRate());
187 m_mediaRecorder->setVideoEncoder(m_videoEncoder);
192 rotation = (360 - rotation) % 360;
194 m_mediaRecorder->setOrientationHint(rotation);
199 m_mediaRecorder->setAudioChannels(
settings.audioChannelCount());
200 m_mediaRecorder->setAudioEncodingBitRate(
settings.audioBitRate());
201 m_mediaRecorder->setAudioSamplingRate(
settings.audioSampleRate());
202 m_mediaRecorder->setAudioEncoder(m_audioEncoder);
217 m_mediaRecorder->setOutputFile(filePath);
219 if (validCameraSession) {
223 if (!m_mediaRecorder->prepare()) {
231 if (!m_mediaRecorder->start()) {
238 m_elapsedTime.
start();
239 m_notifyTimer.
start();
242 if (validCameraSession) {
259 m_mediaRecorder->stop();
260 m_notifyTimer.
stop();
264 m_mediaRecorder =
nullptr;
266 if (m_cameraSession && m_cameraSession->
isActive()) {
275 if (m_outputLocationIsStandard)
308 if (
settings.audioChannelCount() <= 0)
309 settings.setAudioChannelCount(m_defaultSettings.audioChannels);
311 settings.setAudioBitRate(m_defaultSettings.audioBitRate);
312 if (
settings.audioSampleRate() <= 0)
313 settings.setAudioSampleRate(m_defaultSettings.audioSampleRate);
322 m_audioEncoder = m_defaultSettings.audioEncoder;
326 if (m_cameraSession && m_cameraSession->
camera()) {
327 if (
settings.videoResolution().isEmpty()) {
328 settings.setVideoResolution(m_defaultSettings.videoResolution);
332 int reqPixelCount = reqSize.width() * reqSize.height();
333 QList<int> supportedPixelCounts;
334 for (
int i = 0;
i < m_supportedResolutions.
size(); ++
i) {
335 const QSize &
s = m_supportedResolutions.
at(
i);
336 supportedPixelCounts.append(
s.width() *
s.height());
339 settings.setVideoResolution(m_supportedResolutions.
at(closestIndex));
343 settings.setVideoFrameRate(m_defaultSettings.videoFrameRate);
345 settings.setVideoBitRate(m_defaultSettings.videoBitRate);
354 m_videoEncoder = m_defaultSettings.videoEncoder;
359void QAndroidCaptureSession::restartViewfinder()
364 if (!m_cameraSession)
367 if (m_cameraSession && m_cameraSession->
camera()) {
375 m_mediaRecorder =
nullptr;
378void QAndroidCaptureSession::updateDuration()
381 m_duration = m_elapsedTime.
elapsed();
386void QAndroidCaptureSession::onCameraOpened()
388 m_supportedResolutions.
clear();
389 m_supportedFramerates.
clear();
392 for (
int i = 0;
i < 8; ++
i) {
393 CaptureProfile profile = getProfile(
i);
394 if (!profile.isNull) {
396 m_defaultSettings = profile;
398 if (!m_supportedResolutions.
contains(profile.videoResolution))
399 m_supportedResolutions.
append(profile.videoResolution);
400 if (!m_supportedFramerates.
contains(profile.videoFrameRate))
401 m_supportedFramerates.
append(profile.videoFrameRate);
406 std::sort(m_supportedFramerates.
begin(), m_supportedFramerates.
end());
409 applySettings(defaultSettings);
413QAndroidCaptureSession::CaptureProfile QAndroidCaptureSession::getProfile(
int id)
415 CaptureProfile profile;
443 profile.isNull =
false;
449void QAndroidCaptureSession::onError(
int what,
int extra)
457void QAndroidCaptureSession::onInfo(
int what,
int extra)
464 }
else if (what == 801) {
473#include "moc_qandroidcapturesession_p.cpp"
static bool hasProfile(jint cameraId, Quality quality)
static AndroidCamcorderProfile get(jint cameraId, Quality quality)
void setupPreviewFrameCallback()
void stopPreviewSynchronous()
int currentCameraRotation() const
void applyResolution(const QSize &captureSize=QSize(), bool restartPreview=true)
AndroidCamera * camera() const
void setKeepAlive(bool keepAlive)
void setReadyForCapture(bool ready)
void stateChanged(QMediaRecorder::RecorderState state)
QMediaRecorder::RecorderState state() const
void start(QMediaEncoderSettings &settings, const QUrl &outputLocation)
void actualLocationChanged(const QUrl &location)
void setAudioInput(QPlatformAudioInput *input)
void stop(bool error=false)
void setAudioOutput(QPlatformAudioOutput *output)
void durationChanged(qint64 position)
void updateError(int error, const QString &errorString)
~QAndroidCaptureSession()
void setCameraSession(QAndroidCameraSession *cameraSession=0)
QByteArray id
\qmlproperty string QtMultimedia::audioDevice::id
int toInt(bool *ok=nullptr, int base=10) const
Returns the byte array converted to an int using base base, which is ten by default.
void invalidate() noexcept
Marks this QElapsedTimer object as invalid.
qint64 elapsed() const noexcept
Returns the number of milliseconds since this QElapsedTimer was last started.
void start() noexcept
\typealias QElapsedTimer::Duration Synonym for std::chrono::nanoseconds.
bool isValid() const noexcept
Returns false if the timer has never been started or invalidated by a call to invalidate().
bool isRelative() const
Returns true if the file system entry's path is relative, otherwise returns false (that is,...
qsizetype size() const noexcept
const_reference at(qsizetype i) const noexcept
void append(parameter_type t)
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
\macro QT_RESTRICTED_CAST_FROM_ASCII
void start(int msec)
Starts or restarts the timer with a timeout interval of msec milliseconds.
void setInterval(int msec)
void stop()
Stops the timer.
void timeout(QPrivateSignal)
This signal is emitted when the timer times out.
static QUrl fromLocalFile(const QString &localfile)
Returns a QUrl representation of localFile, interpreted as a local file.
QString scheme() const
Returns the scheme of the URL.
QString toString(FormattingOptions options=FormattingOptions(PrettyDecoded)) const
Returns a string representation of the URL.
QString toLocalFile() const
Returns the path of this URL formatted as a local file path.
Combined button and popup list for selecting options.
DBusConnection const char DBusError * error
int qRound(qfloat16 d) noexcept
GLenum GLenum GLenum input
QLatin1StringView QLatin1String
#define QStringLiteral(str)
QT_BEGIN_NAMESPACE typedef uchar * output
QSettings settings("MySoft", "Star Runner")
[0]
myObject disconnect()
[26]
bool contains(const AT &t) const noexcept