7#include "private/qwindowsmultimediautils_p.h"
8#include "private/qplatformvideosink_p.h"
10#include <QtCore/qdebug.h>
11#include <qaudioinput.h>
12#include <qaudiooutput.h>
21 m_mediaDeviceReader =
new QWindowsMediaDeviceReader(
this);
22 connect(m_mediaDeviceReader, &QWindowsMediaDeviceReader::streamingStarted,
23 this, &QWindowsMediaDeviceSession::handleStreamingStarted);
24 connect(m_mediaDeviceReader, &QWindowsMediaDeviceReader::streamingStopped,
25 this, &QWindowsMediaDeviceSession::handleStreamingStopped);
26 connect(m_mediaDeviceReader, &QWindowsMediaDeviceReader::streamingError,
27 this, &QWindowsMediaDeviceSession::handleStreamingError);
28 connect(m_mediaDeviceReader, &QWindowsMediaDeviceReader::videoFrameChanged,
29 this, &QWindowsMediaDeviceSession::handleVideoFrameChanged);
30 connect(m_mediaDeviceReader, &QWindowsMediaDeviceReader::recordingStarted,
31 this, &QWindowsMediaDeviceSession::recordingStarted);
32 connect(m_mediaDeviceReader, &QWindowsMediaDeviceReader::recordingStopped,
33 this, &QWindowsMediaDeviceSession::recordingStopped);
34 connect(m_mediaDeviceReader, &QWindowsMediaDeviceReader::recordingError,
35 this, &QWindowsMediaDeviceSession::recordingError);
36 connect(m_mediaDeviceReader, &QWindowsMediaDeviceReader::durationChanged,
37 this, &QWindowsMediaDeviceSession::durationChanged);
40QWindowsMediaDeviceSession::~QWindowsMediaDeviceSession()
42 delete m_mediaDeviceReader;
57 if ((active && (m_active || m_activating)) || (!active && !m_active && !m_activating))
61 auto camId = QString::fromUtf8(m_activeCameraDevice.id());
62 auto micId = m_audioInput ? QString::fromUtf8(m_audioInput->device().id()) : QString();
63 if (!camId.isEmpty() || !micId.isEmpty()) {
64 if (m_mediaDeviceReader->activate(camId, m_cameraFormat, micId)) {
67 emit streamingError(MF_E_NOT_AVAILABLE);
70 qWarning() << Q_FUNC_INFO <<
"Camera ID and Microphone ID both undefined.";
76 emit activeChanged(m_active);
77 emit readyForCaptureChanged(m_active);
83 if (m_active || m_activating) {
93 m_activeCameraDevice = camera;
99 return m_activeCameraDevice;
104 m_cameraFormat = cameraFormat;
116 m_activating =
false;
117 emit activeChanged(m_active);
118 emit readyForCaptureChanged(m_active);
125 emit activeChanged(m_active);
126 emit readyForCaptureChanged(m_active);
132 m_surface->platformVideoSink()->setVideoFrame(QVideoFrame());
133 emit streamingError(errorCode);
139 m_surface->platformVideoSink()->setVideoFrame(frame);
140 emit videoFrameChanged(frame);
150 m_mediaDeviceReader->setInputVolume(volume);
165 m_mediaDeviceReader->setOutputVolume(volume);
170 if (m_active || m_activating)
171 m_mediaDeviceReader->setAudioOutput(QString::fromUtf8(m_audioOutput->device().id()));
176 if (m_audioInput == input)
179 m_audioInput->disconnect(
this);
180 m_audioInput = input;
186 connect(m_audioInput, &QAudioInput::mutedChanged,
this, &QWindowsMediaDeviceSession::setAudioInputMuted);
187 connect(m_audioInput, &QAudioInput::volumeChanged,
this, &QWindowsMediaDeviceSession::setAudioInputVolume);
188 connect(m_audioInput, &QAudioInput::deviceChanged,
this, &QWindowsMediaDeviceSession::audioInputDeviceChanged);
193 if (m_audioOutput == output)
196 m_audioOutput->disconnect(
this);
197 m_audioOutput = output;
198 if (!m_audioOutput) {
199 m_mediaDeviceReader->setAudioOutput({});
203 m_mediaDeviceReader->setAudioOutput(QString::fromUtf8(m_audioOutput->device().id()));
205 connect(m_audioOutput, &QAudioOutput::mutedChanged,
this, &QWindowsMediaDeviceSession::setAudioOutputMuted);
206 connect(m_audioOutput, &QAudioOutput::volumeChanged,
this, &QWindowsMediaDeviceSession::setAudioOutputVolume);
207 connect(m_audioOutput, &QAudioOutput::deviceChanged,
this, &QWindowsMediaDeviceSession::audioOutputDeviceChanged);
212 GUID container = audioOnly ? QWindowsMultimediaUtils::containerForAudioFileFormat(settings.mediaFormat().fileFormat())
213 : QWindowsMultimediaUtils::containerForVideoFileFormat(settings.mediaFormat().fileFormat());
214 GUID videoFormat = QWindowsMultimediaUtils::videoFormatForCodec(settings.videoCodec());
215 GUID audioFormat = QWindowsMultimediaUtils::audioFormatForCodec(settings.audioCodec());
217 QSize res = settings.videoResolution();
218 UINT32 width, height;
219 if (res.width() > 0 && res.height() > 0) {
220 width = UINT32(res.width());
221 height = UINT32(res.height());
223 width = m_mediaDeviceReader->frameWidth();
224 height = m_mediaDeviceReader->frameHeight();
225 settings.setVideoResolution(QSize(
int(width),
int(height)));
228 qreal frameRate = settings.videoFrameRate();
229 if (frameRate <= 0) {
230 frameRate = m_mediaDeviceReader->frameRate();
231 settings.setVideoFrameRate(frameRate);
234 auto quality = settings.quality();
236 UINT32 videoBitRate = 0;
237 if (settings.videoBitRate() > 0) {
238 videoBitRate = UINT32(settings.videoBitRate());
240 videoBitRate = estimateVideoBitRate(videoFormat, width, height, frameRate, quality);
241 settings.setVideoBitRate(
int(videoBitRate));
244 UINT32 audioBitRate = 0;
245 if (settings.audioBitRate() > 0) {
246 audioBitRate = UINT32(settings.audioBitRate());
248 audioBitRate = estimateAudioBitRate(audioFormat, quality);
249 settings.setAudioBitRate(
int(audioBitRate));
252 return m_mediaDeviceReader->startRecording(fileName, container, audioOnly ? GUID_NULL : videoFormat,
253 videoBitRate, width, height, frameRate,
254 audioFormat, audioBitRate);
274 qreal frameRate, QMediaRecorder::Quality quality)
276 Q_UNUSED(videoFormat);
280 case QMediaRecorder::Quality::VeryLowQuality:
283 case QMediaRecorder::Quality::LowQuality:
286 case QMediaRecorder::Quality::NormalQuality:
289 case QMediaRecorder::Quality::HighQuality:
292 case QMediaRecorder::Quality::VeryHighQuality:
301 quint32 pixelsPerSec = quint32(qMax(width, 320u) * qMax(height, 240u) * qMax(frameRate, 6.0));
302 return pixelsPerSec * bitsPerPixel;
307 if (audioFormat == MFAudioFormat_AAC) {
310 case QMediaRecorder::Quality::VeryLowQuality:
312 case QMediaRecorder::Quality::LowQuality:
314 case QMediaRecorder::Quality::NormalQuality:
316 case QMediaRecorder::Quality::HighQuality:
318 case QMediaRecorder::Quality::VeryHighQuality:
323 }
else if (audioFormat == MFAudioFormat_MP3) {
327 case QMediaRecorder::Quality::VeryLowQuality:
329 case QMediaRecorder::Quality::LowQuality:
331 case QMediaRecorder::Quality::NormalQuality:
333 case QMediaRecorder::Quality::HighQuality:
335 case QMediaRecorder::Quality::VeryHighQuality:
340 }
else if (audioFormat == MFAudioFormat_WMAudioV8) {
343 case QMediaRecorder::Quality::VeryLowQuality:
345 case QMediaRecorder::Quality::LowQuality:
347 case QMediaRecorder::Quality::NormalQuality:
349 case QMediaRecorder::Quality::HighQuality:
351 case QMediaRecorder::Quality::VeryHighQuality:
356 }
else if (audioFormat == MFAudioFormat_WMAudioV9) {
359 case QMediaRecorder::Quality::VeryLowQuality:
361 case QMediaRecorder::Quality::LowQuality:
363 case QMediaRecorder::Quality::NormalQuality:
365 case QMediaRecorder::Quality::HighQuality:
367 case QMediaRecorder::Quality::VeryHighQuality:
378#include "moc_qwindowsmediadevicesession_p.cpp"