12#include <private/qmediastoragelocation_p.h>
13#include <private/qmediarecorder_p.h>
17QWindowsMediaEncoder::QWindowsMediaEncoder(QMediaRecorder *parent)
19 QPlatformMediaRecorder(parent)
25 return location.scheme() == QLatin1String(
"file") || location.scheme().isEmpty();
40 if (!m_captureService || !m_mediaDeviceSession) {
41 qWarning() << Q_FUNC_INFO <<
"Encoder is not set to a capture session";
44 if (m_state != QMediaRecorder::StoppedState)
49 if (!m_sessionWasActive) {
54 updateError(QMediaRecorder::ResourceError,
55 QMediaRecorderPrivate::msgFailedStartRecording());
60 const auto audioOnly = settings.videoCodec() == QMediaFormat::VideoCodec::Unspecified;
61 m_fileName = QMediaStorageLocation::generateFileName(outputLocation().toLocalFile(),
62 audioOnly ? QStandardPaths::MusicLocation
63 : QStandardPaths::MoviesLocation,
64 settings.preferredSuffix());
66 QMediaRecorder::Error ec = m_mediaDeviceSession->startRecording(settings, m_fileName, audioOnly);
67 if (ec == QMediaRecorder::NoError) {
68 m_state = QMediaRecorder::RecordingState;
70 actualLocationChanged(QUrl::fromLocalFile(m_fileName));
71 stateChanged(m_state);
74 updateError(ec, QMediaRecorderPrivate::msgFailedStartRecording());
80 if (!m_mediaDeviceSession || m_state != QMediaRecorder::RecordingState)
84 m_state = QMediaRecorder::PausedState;
85 stateChanged(m_state);
87 updateError(QMediaRecorder::FormatError, tr(
"Failed to pause recording"));
93 if (!m_mediaDeviceSession || m_state != QMediaRecorder::PausedState)
97 m_state = QMediaRecorder::RecordingState;
98 stateChanged(m_state);
100 updateError(QMediaRecorder::FormatError, tr(
"Failed to resume recording"));
106 if (m_mediaDeviceSession && m_state != QMediaRecorder::StoppedState) {
108 if (!m_sessionWasActive)
118 if (m_captureService == captureSession)
121 if (m_captureService)
124 m_captureService = captureSession;
125 if (!m_captureService) {
126 m_mediaDeviceSession =
nullptr;
130 m_mediaDeviceSession = m_captureService
->session();
131 Q_ASSERT(m_mediaDeviceSession);
137 connect(m_mediaDeviceSession, &QWindowsMediaDeviceSession::durationChanged,
this, &QWindowsMediaEncoder::onDurationChanged);
138 connect(m_captureService, &QWindowsMediaCaptureService::cameraChanged,
this, &QWindowsMediaEncoder::onCameraChanged);
144 m_metaData = metaData;
154 if (!m_metaData.isEmpty()) {
156 const QString nativeFileName = QDir::toNativeSeparators(m_fileName);
158 IPropertyStore *store =
nullptr;
160 if (SUCCEEDED(SHGetPropertyStoreFromParsingName(
reinterpret_cast<LPCWSTR>(nativeFileName.utf16()),
161 nullptr, GPS_READWRITE, IID_PPV_ARGS(&store)))) {
163 MFMetaData::toNative(m_metaData, store);
173 m_duration = duration;
174 durationChanged(m_duration);
179 if (errorCode == MF_E_VIDEO_RECORDING_DEVICE_INVALIDATED)
180 updateError(QMediaRecorder::ResourceError, tr(
"Camera is no longer present"));
181 else if (errorCode == MF_E_AUDIO_RECORDING_DEVICE_INVALIDATED)
182 updateError(QMediaRecorder::ResourceError, tr(
"Audio input is no longer present"));
184 updateError(QMediaRecorder::ResourceError, tr(
"Streaming error"));
186 if (m_state != QMediaRecorder::StoppedState) {
188 if (!m_sessionWasActive)
196 updateError(QMediaRecorder::ResourceError, tr(
"Recording error"));
198 auto lastState = m_state;
199 m_state = QMediaRecorder::StoppedState;
200 if (m_state != lastState)
201 stateChanged(m_state);
216 auto lastState = m_state;
217 m_state = QMediaRecorder::StoppedState;
218 if (m_state != lastState)
219 stateChanged(m_state);
224#include "moc_qwindowsmediaencoder_p.cpp"