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());
175 m_mediaRecorder->setAudioInput(m_audioInput->
device.
id());
176 if (!m_mediaRecorder->isAudioSourceSet())
181 m_mediaRecorder->setOutputFormat(m_outputFormat);
184 if (validCameraSession) {
185 m_mediaRecorder->setVideoSize(
settings.videoResolution());
186 m_mediaRecorder->setVideoFrameRate(
qRound(
settings.videoFrameRate()));
187 m_mediaRecorder->setVideoEncodingBitRate(
settings.videoBitRate());
188 m_mediaRecorder->setVideoEncoder(m_videoEncoder);
193 rotation = (360 - rotation) % 360;
195 m_mediaRecorder->setOrientationHint(rotation);
200 m_mediaRecorder->setAudioChannels(
settings.audioChannelCount());
201 m_mediaRecorder->setAudioEncodingBitRate(
settings.audioBitRate());
202 m_mediaRecorder->setAudioSamplingRate(
settings.audioSampleRate());
203 m_mediaRecorder->setAudioEncoder(m_audioEncoder);
218 m_mediaRecorder->setOutputFile(filePath);
224 if (validCameraSession) {
231 m_mediaRecorder->setSurfaceTexture(
240 if (!m_mediaRecorder->prepare()) {
247 if (!m_mediaRecorder->start()) {
255 m_elapsedTime.
start();
256 m_notifyTimer.
start();
259 if (validCameraSession) {
276 m_mediaRecorder->stop();
277 m_notifyTimer.
stop();
281 m_mediaRecorder =
nullptr;
283 if (m_cameraSession && m_cameraSession->
isActive()) {
292 if (m_outputLocationIsStandard)
325 if (
settings.audioChannelCount() <= 0)
326 settings.setAudioChannelCount(m_defaultSettings.audioChannels);
328 settings.setAudioBitRate(m_defaultSettings.audioBitRate);
329 if (
settings.audioSampleRate() <= 0)
330 settings.setAudioSampleRate(m_defaultSettings.audioSampleRate);
339 m_audioEncoder = m_defaultSettings.audioEncoder;
343 if (m_cameraSession && m_cameraSession->
camera()) {
344 if (
settings.videoResolution().isEmpty()) {
345 settings.setVideoResolution(m_defaultSettings.videoResolution);
349 int reqPixelCount = reqSize.
width() * reqSize.
height();
351 for (
int i = 0;
i < m_supportedResolutions.
size(); ++
i) {
352 const QSize &
s = m_supportedResolutions.
at(
i);
353 supportedPixelCounts.
append(
s.width() *
s.height());
356 settings.setVideoResolution(m_supportedResolutions.
at(closestIndex));
360 settings.setVideoFrameRate(m_defaultSettings.videoFrameRate);
362 settings.setVideoBitRate(m_defaultSettings.videoBitRate);
371 m_videoEncoder = m_defaultSettings.videoEncoder;
376void QAndroidCaptureSession::restartViewfinder()
381 if (!m_cameraSession)
384 if (m_cameraSession && m_cameraSession->
camera()) {
408 m_mediaRecorder =
nullptr;
411void QAndroidCaptureSession::updateDuration()
414 m_duration = m_elapsedTime.
elapsed();
419void QAndroidCaptureSession::onCameraOpened()
421 m_supportedResolutions.
clear();
422 m_supportedFramerates.
clear();
425 for (
int i = 0;
i < 8; ++
i) {
426 CaptureProfile profile = getProfile(
i);
427 if (!profile.isNull) {
429 m_defaultSettings = profile;
431 if (!m_supportedResolutions.
contains(profile.videoResolution))
432 m_supportedResolutions.
append(profile.videoResolution);
433 if (!m_supportedFramerates.
contains(profile.videoFrameRate))
434 m_supportedFramerates.
append(profile.videoFrameRate);
439 std::sort(m_supportedFramerates.
begin(), m_supportedFramerates.
end());
442 applySettings(defaultSettings);
446QAndroidCaptureSession::CaptureProfile QAndroidCaptureSession::getProfile(
int id)
448 CaptureProfile profile;
476 profile.isNull =
false;
482void QAndroidCaptureSession::onError(
int what,
int extra)
490void QAndroidCaptureSession::onInfo(
int what,
int extra)
497 }
else if (what == 801) {
506#include "moc_qandroidcapturesession_p.cpp"
int getValue(Field field) const
static bool hasProfile(jint cameraId, Quality quality)
static AndroidCamcorderProfile get(jint cameraId, Quality quality)
void setupPreviewFrameCallback()
void stopPreviewSynchronous()
bool setPreviewDisplay(AndroidSurfaceHolder *surfaceHolder)
bool setPreviewTexture(AndroidSurfaceTexture *surfaceTexture)
QAndroidVideoOutput * videoOutput() const
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)
~QAndroidCaptureSession()
void setCameraSession(QAndroidCameraSession *cameraSession=0)
virtual AndroidSurfaceHolder * surfaceHolder()
virtual AndroidSurfaceTexture * surfaceTexture()
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
Starts this timer.
bool isValid() const noexcept
Returns false if the timer has never been started or invalidated by a call to invalidate().
\inmodule QtCore \reentrant
bool isRelative() const
Returns true if the file path is relative, otherwise returns false (i.e.
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
constexpr int height() const noexcept
Returns the height.
constexpr int width() const noexcept
Returns the width.
\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