6#include <common/mfmetadata_p.h>
7#include <mediacapture/qwindowsmediacapture_p.h>
8#include <mediacapture/qwindowsmediadevicesession_p.h>
10#include <QtMultimedia/private/qmediarecorder_p.h>
11#include <QtMultimedia/private/qmediastoragelocation_p.h>
12#include <QtCore/qurl.h>
13#include <QtCore/private/qcomptr_p.h>
22 QPlatformMediaRecorder(parent)
28 return location.scheme() == u"file" || location.scheme().isEmpty();
43 if (!m_captureService || !m_mediaDeviceSession) {
44 qWarning() << Q_FUNC_INFO <<
"Encoder is not set to a capture session";
47 if (m_state != QMediaRecorder::StoppedState)
52 if (!m_sessionWasActive) {
57 updateError(QMediaRecorder::ResourceError,
58 QMediaRecorderPrivate::msgFailedStartRecording());
63 const auto audioOnly = settings.videoCodec() == QMediaFormat::VideoCodec::Unspecified;
64 m_fileName = QMediaStorageLocation::generateFileName(outputLocation().toLocalFile(),
65 audioOnly ? QStandardPaths::MusicLocation
66 : QStandardPaths::MoviesLocation,
67 settings.preferredSuffix());
69 QMediaRecorder::Error ec = m_mediaDeviceSession->startRecording(settings, m_fileName, audioOnly);
70 if (ec == QMediaRecorder::NoError) {
71 m_state = QMediaRecorder::RecordingState;
73 actualLocationChanged(QUrl::fromLocalFile(m_fileName));
74 stateChanged(m_state);
77 updateError(ec, QMediaRecorderPrivate::msgFailedStartRecording());
83 if (!m_mediaDeviceSession || m_state != QMediaRecorder::RecordingState)
87 m_state = QMediaRecorder::PausedState;
88 stateChanged(m_state);
90 updateError(QMediaRecorder::FormatError, tr(
"Failed to pause recording"));
96 if (!m_mediaDeviceSession || m_state != QMediaRecorder::PausedState)
100 m_state = QMediaRecorder::RecordingState;
101 stateChanged(m_state);
103 updateError(QMediaRecorder::FormatError, tr(
"Failed to resume recording"));
109 if (m_mediaDeviceSession && m_state != QMediaRecorder::StoppedState) {
111 if (!m_sessionWasActive)
121 if (m_captureService == captureSession)
124 if (m_captureService)
127 m_captureService = captureSession;
128 if (!m_captureService) {
129 m_mediaDeviceSession =
nullptr;
133 m_mediaDeviceSession = m_captureService
->session();
134 Q_ASSERT(m_mediaDeviceSession);
138 connect(m_mediaDeviceSession, &QWindowsMediaDeviceSession::streamingError,
this, &QWindowsMediaEncoder::onStreamingError);
139 connect(m_mediaDeviceSession, &QWindowsMediaDeviceSession::recordingError,
this, &QWindowsMediaEncoder::onRecordingError);
140 connect(m_mediaDeviceSession, &QWindowsMediaDeviceSession::durationChanged,
this, &QWindowsMediaEncoder::onDurationChanged);
141 connect(m_captureService, &QWindowsMediaCaptureService::cameraChanged,
this, &QWindowsMediaEncoder::onCameraChanged);
147 m_metaData = metaData;
157 if (!m_metaData.isEmpty()) {
159 const QString nativeFileName = QDir::toNativeSeparators(m_fileName);
161 ComPtr<IPropertyStore> store;
163 if (SUCCEEDED(SHGetPropertyStoreFromParsingName(
reinterpret_cast<LPCWSTR>(nativeFileName.utf16()),
164 nullptr, GPS_READWRITE, IID_PPV_ARGS(&store)))) {
166 MFMetaData::toNative(m_metaData, store.Get());
175 m_duration = duration;
176 durationChanged(m_duration);
181 if (errorCode == MF_E_VIDEO_RECORDING_DEVICE_INVALIDATED)
182 updateError(QMediaRecorder::ResourceError, tr(
"Camera is no longer present"));
183 else if (errorCode == MF_E_AUDIO_RECORDING_DEVICE_INVALIDATED)
184 updateError(QMediaRecorder::ResourceError, tr(
"Audio input is no longer present"));
186 updateError(QMediaRecorder::ResourceError, tr(
"Streaming error"));
188 if (m_state != QMediaRecorder::StoppedState) {
190 if (!m_sessionWasActive)
198 updateError(QMediaRecorder::ResourceError, tr(
"Recording error"));
200 auto lastState = m_state;
201 m_state = QMediaRecorder::StoppedState;
202 if (m_state != lastState)
203 stateChanged(m_state);
218 auto lastState = m_state;
219 m_state = QMediaRecorder::StoppedState;
220 if (m_state != lastState)
221 stateChanged(m_state);
226#include "moc_qwindowsmediaencoder_p.cpp"
Combined button and popup list for selecting options.