Commit 2282cd01 authored by Liang Qi's avatar Liang Qi
Browse files

Merge remote-tracking branch 'origin/5.9' into dev

Conflicts:
	.qmake.conf

Change-Id: I5f9bed6cb611471db61b9c69004f16786822625d
Showing with 165 additions and 70 deletions
Qt 5.9.1 is a bug-fix release. It maintains both forward and backward
compatibility (source and binary) with Qt 5.9.0.
For more details, refer to the online documentation included in this
distribution. The documentation is also available online:
http://doc.qt.io/qt-5/index.html
The Qt version 5.9 series is binary compatible with the 5.8.x series.
Applications compiled for 5.8 will continue to run with 5.9.
Some of the changes listed in this file include issue tracking numbers
corresponding to tasks in the Qt Bug Tracker:
https://bugreports.qt.io/
Each of these identifiers can be entered in the bug tracker to obtain more
information about a particular change.
****************************************************************************
* Library *
****************************************************************************
QtMultimedia
------------
- Fixed overflow in the QML MediaPlayer/Audio items loop counter.
****************************************************************************
* Platform Specific Changes *
****************************************************************************
Android
-------
- [QTBUG-61085] Fixed crash in OpenSL ES input device caused by over-committing
the device with data.
macOS & iOS
-----------
- [QTBUG-50588] Fixed the StoppedState signal in the media-recorder, so it's not
emitted before the file has been written.
......@@ -58,12 +58,7 @@ Q_DECLARE_METATYPE(QCameraInfo)
Camera::Camera(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Camera),
camera(0),
imageCapture(0),
mediaRecorder(0),
isCapturingImage(false),
applicationExiting(false)
ui(new Ui::Camera)
{
ui->setupUi(this);
......@@ -71,7 +66,8 @@ Camera::Camera(QWidget *parent) :
QActionGroup *videoDevicesGroup = new QActionGroup(this);
videoDevicesGroup->setExclusive(true);
foreach (const QCameraInfo &cameraInfo, QCameraInfo::availableCameras()) {
const QList<QCameraInfo> availableCameras = QCameraInfo::availableCameras();
for (const QCameraInfo &cameraInfo : availableCameras) {
QAction *videoDeviceAction = new QAction(cameraInfo.description(), videoDevicesGroup);
videoDeviceAction->setCheckable(true);
videoDeviceAction->setData(QVariant::fromValue(cameraInfo));
......@@ -81,8 +77,8 @@ Camera::Camera(QWidget *parent) :
ui->menuDevices->addAction(videoDeviceAction);
}
connect(videoDevicesGroup, SIGNAL(triggered(QAction*)), SLOT(updateCameraDevice(QAction*)));
connect(ui->captureWidget, SIGNAL(currentChanged(int)), SLOT(updateCaptureMode()));
connect(videoDevicesGroup, &QActionGroup::triggered, this, &Camera::updateCameraDevice);
connect(ui->captureWidget, &QTabWidget::currentChanged, this, &Camera::updateCaptureMode);
setCamera(QCameraInfo::defaultCamera());
}
......@@ -102,20 +98,21 @@ void Camera::setCamera(const QCameraInfo &cameraInfo)
camera = new QCamera(cameraInfo);
connect(camera, SIGNAL(stateChanged(QCamera::State)), this, SLOT(updateCameraState(QCamera::State)));
connect(camera, SIGNAL(error(QCamera::Error)), this, SLOT(displayCameraError()));
connect(camera, &QCamera::stateChanged, this, &Camera::updateCameraState);
connect(camera, QOverload<QCamera::Error>::of(&QCamera::error), this, &Camera::displayCameraError);
mediaRecorder = new QMediaRecorder(camera);
connect(mediaRecorder, SIGNAL(stateChanged(QMediaRecorder::State)), this, SLOT(updateRecorderState(QMediaRecorder::State)));
connect(mediaRecorder, &QMediaRecorder::stateChanged, this, &Camera::updateRecorderState);
imageCapture = new QCameraImageCapture(camera);
connect(mediaRecorder, SIGNAL(durationChanged(qint64)), this, SLOT(updateRecordTime()));
connect(mediaRecorder, SIGNAL(error(QMediaRecorder::Error)), this, SLOT(displayRecorderError()));
connect(mediaRecorder, &QMediaRecorder::durationChanged, this, &Camera::updateRecordTime);
connect(mediaRecorder, QOverload<QMediaRecorder::Error>::of(&QMediaRecorder::error),
this, &Camera::displayRecorderError);
mediaRecorder->setMetaData(QMediaMetaData::Title, QVariant(QLatin1String("Test Title")));
connect(ui->exposureCompensation, SIGNAL(valueChanged(int)), SLOT(setExposureCompensation(int)));
connect(ui->exposureCompensation, &QAbstractSlider::valueChanged, this, &Camera::setExposureCompensation);
camera->setViewfinder(ui->viewfinder);
......@@ -123,14 +120,14 @@ void Camera::setCamera(const QCameraInfo &cameraInfo)
updateLockStatus(camera->lockStatus(), QCamera::UserRequest);
updateRecorderState(mediaRecorder->state());
connect(imageCapture, SIGNAL(readyForCaptureChanged(bool)), this, SLOT(readyForCapture(bool)));
connect(imageCapture, SIGNAL(imageCaptured(int,QImage)), this, SLOT(processCapturedImage(int,QImage)));
connect(imageCapture, SIGNAL(imageSaved(int,QString)), this, SLOT(imageSaved(int,QString)));
connect(imageCapture, SIGNAL(error(int,QCameraImageCapture::Error,QString)), this,
SLOT(displayCaptureError(int,QCameraImageCapture::Error,QString)));
connect(imageCapture, &QCameraImageCapture::readyForCaptureChanged, this, &Camera::readyForCapture);
connect(imageCapture, &QCameraImageCapture::imageCaptured, this, &Camera::processCapturedImage);
connect(imageCapture, &QCameraImageCapture::imageSaved, this, &Camera::imageSaved);
connect(imageCapture, QOverload<int, QCameraImageCapture::Error, const QString &>::of(&QCameraImageCapture::error),
this, &Camera::displayCaptureError);
connect(camera, SIGNAL(lockStatusChanged(QCamera::LockStatus,QCamera::LockChangeReason)),
this, SLOT(updateLockStatus(QCamera::LockStatus,QCamera::LockChangeReason)));
connect(camera, QOverload<QCamera::LockStatus, QCamera::LockChangeReason>::of(&QCamera::lockStatusChanged),
this, &Camera::updateLockStatus);
ui->captureWidget->setTabEnabled(0, (camera->isCaptureModeSupported(QCamera::CaptureStillImage)));
ui->captureWidget->setTabEnabled(1, (camera->isCaptureModeSupported(QCamera::CaptureVideo)));
......@@ -197,7 +194,7 @@ void Camera::processCapturedImage(int requestId, const QImage& img)
// Display captured image for 4 seconds.
displayCapturedImage();
QTimer::singleShot(4000, this, SLOT(displayViewfinder()));
QTimer::singleShot(4000, this, &Camera::displayViewfinder);
}
void Camera::configureCaptureSettings()
......@@ -217,6 +214,7 @@ void Camera::configureCaptureSettings()
void Camera::configureVideoSettings()
{
VideoSettings settingsDialog(mediaRecorder);
settingsDialog.setWindowFlags(settingsDialog.windowFlags() & ~Qt::WindowContextHelpButtonHint);
settingsDialog.setAudioSettings(audioSettings);
settingsDialog.setVideoSettings(videoSettings);
......@@ -237,6 +235,7 @@ void Camera::configureVideoSettings()
void Camera::configureImageSettings()
{
ImageSettings settingsDialog(imageCapture);
settingsDialog.setWindowFlags(settingsDialog.windowFlags() & ~Qt::WindowContextHelpButtonHint);
settingsDialog.setImageSettings(imageSettings);
......@@ -385,12 +384,12 @@ void Camera::setExposureCompensation(int index)
void Camera::displayRecorderError()
{
QMessageBox::warning(this, tr("Capture error"), mediaRecorder->errorString());
QMessageBox::warning(this, tr("Capture Error"), mediaRecorder->errorString());
}
void Camera::displayCameraError()
{
QMessageBox::warning(this, tr("Camera error"), camera->errorString());
QMessageBox::warning(this, tr("Camera Error"), camera->errorString());
}
void Camera::updateCameraDevice(QAction *action)
......@@ -416,7 +415,7 @@ void Camera::readyForCapture(bool ready)
void Camera::imageSaved(int id, const QString &fileName)
{
Q_UNUSED(id);
Q_UNUSED(fileName);
ui->statusbar->showMessage(tr("Captured \"%1\"").arg(QDir::toNativeSeparators(fileName)));
isCapturingImage = false;
if (applicationExiting)
......
......@@ -56,7 +56,7 @@ class Camera : public QMainWindow
Q_OBJECT
public:
Camera(QWidget *parent = 0);
explicit Camera(QWidget *parent = nullptr);
~Camera();
private slots:
......@@ -107,16 +107,16 @@ protected:
private:
Ui::Camera *ui;
QCamera *camera;
QCameraImageCapture *imageCapture;
QMediaRecorder* mediaRecorder;
QCamera *camera = nullptr;
QCameraImageCapture *imageCapture = nullptr;
QMediaRecorder* mediaRecorder = nullptr;
QImageEncoderSettings imageSettings;
QAudioEncoderSettings audioSettings;
QVideoEncoderSettings videoSettings;
QString videoContainerFormat;
bool isCapturingImage;
bool applicationExiting;
bool isCapturingImage = false;
bool applicationExiting = false;
};
#endif
......@@ -19,6 +19,8 @@ FORMS += \
videosettings.ui \
imagesettings.ui
RESOURCES += camera.qrc
target.path = $$[QT_INSTALL_EXAMPLES]/multimediawidgets/camera
INSTALLS += target
......
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>images/shutter.svg</file>
</qresource>
</RCC>
......@@ -144,6 +144,10 @@
<property name="text">
<string>Capture Photo</string>
</property>
<property name="icon">
<iconset resource="camera.qrc">
<normaloff>:/images/shutter.svg</normaloff>:/images/shutter.svg</iconset>
</property>
</widget>
</item>
<item row="1" column="0">
......@@ -248,7 +252,7 @@
<x>0</x>
<y>0</y>
<width>668</width>
<height>25</height>
<height>21</height>
</rect>
</property>
<widget class="QMenu" name="menuFile">
......@@ -300,7 +304,9 @@
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<resources>
<include location="camera.qrc"/>
</resources>
<connections>
<connection>
<sender>recordButton</sender>
......
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 20.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 23.3 19.4" style="enable-background:new 0 0 23.3 19.4;" xml:space="preserve">
<style type="text/css">
.st0{fill:none;}
</style>
<g>
<path class="st0" d="M6.2,4.8H2.4c-0.2,0-0.1-0.1-0.1,0.1V17c0,0.2-0.1,0.8,0.1,0.8h3.9V4.8z"/>
<circle class="st0" cx="14" cy="11" r="4.5"/>
<path class="st0" d="M20.9,4.8h-1.8c-0.3,0-0.6-0.4-0.8-0.6l-1.7-2.4h-5.3L9.7,4.2C9.5,4.4,9.2,4.8,8.9,4.8H7.2v13h13.7
c0.2,0,0.3-0.6,0.3-0.8V4.9C21.2,4.7,21.1,4.8,20.9,4.8z M14,16.4c-3,0-5.5-2.4-5.5-5.5c0-3,2.4-5.5,5.5-5.5c3,0,5.5,2.4,5.5,5.5
C19.5,14,17,16.4,14,16.4z"/>
<path d="M14,5.5C11,5.5,8.6,8,8.6,11c0,3,2.4,5.5,5.5,5.5c3,0,5.5-2.4,5.5-5.5C19.5,8,17,5.5,14,5.5z M14,15.4
c-2.5,0-4.5-2-4.5-4.5c0-2.5,2-4.5,4.5-4.5c2.5,0,4.5,2,4.5,4.5C18.5,13.4,16.5,15.4,14,15.4z"/>
<path d="M20.9,2.8h-1.3l-1.7-2.4c-0.2-0.2-0.5-0.6-0.8-0.6h-6.3c-0.3,0-0.6,0.4-0.8,0.6L8.4,2.8h-6c-1.3,0-2.1,0.8-2.1,2.1V17
c0,1.3,0.8,2.8,2.1,2.8h18.5c1.3,0,2.3-1.5,2.3-2.8V4.9C23.2,3.6,22.2,2.8,20.9,2.8z M2.2,17V4.9c0-0.2-0.1-0.1,0.1-0.1h3.9v13H2.4
C2.2,17.8,2.2,17.2,2.2,17z M21.2,17c0,0.2-0.1,0.8-0.3,0.8H7.2v-13h1.7c0.3,0,0.6-0.4,0.8-0.6l1.7-2.4h5.3l1.7,2.4
c0.2,0.2,0.5,0.6,0.8,0.6h1.8c0.2,0,0.3-0.1,0.3,0.1V17z"/>
</g>
</svg>
......@@ -56,16 +56,17 @@ ImageSettings::ImageSettings(QCameraImageCapture *imageCapture, QWidget *parent)
//image codecs
ui->imageCodecBox->addItem(tr("Default image format"), QVariant(QString()));
foreach(const QString &codecName, imagecapture->supportedImageCodecs()) {
const QStringList supportedImageCodecs = imagecapture->supportedImageCodecs();
for (const QString &codecName : supportedImageCodecs) {
QString description = imagecapture->imageCodecDescription(codecName);
ui->imageCodecBox->addItem(codecName+": "+description, QVariant(codecName));
ui->imageCodecBox->addItem(codecName + ": " + description, QVariant(codecName));
}
ui->imageQualitySlider->setRange(0, int(QMultimedia::VeryHighQuality));
ui->imageResolutionBox->addItem(tr("Default Resolution"));
QList<QSize> supportedResolutions = imagecapture->supportedResolutions();
foreach(const QSize &resolution, supportedResolutions) {
const QList<QSize> supportedResolutions = imagecapture->supportedResolutions();
for (const QSize &resolution : supportedResolutions) {
ui->imageResolutionBox->addItem(QString("%1x%2").arg(resolution.width()).arg(resolution.height()),
QVariant(resolution));
}
......
......@@ -56,7 +56,7 @@ class ImageSettings : public QDialog
Q_OBJECT
public:
ImageSettings(QCameraImageCapture *imageCapture, QWidget *parent = 0);
explicit ImageSettings(QCameraImageCapture *imageCapture, QWidget *parent = nullptr);
~ImageSettings();
QAudioEncoderSettings audioSettings() const;
......
......@@ -11,7 +11,7 @@
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
<string>Image Settings</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
......
......@@ -56,47 +56,49 @@ VideoSettings::VideoSettings(QMediaRecorder *mediaRecorder, QWidget *parent) :
//audio codecs
ui->audioCodecBox->addItem(tr("Default audio codec"), QVariant(QString()));
foreach (const QString &codecName, mediaRecorder->supportedAudioCodecs()) {
const QStringList supportedAudioCodecs = mediaRecorder->supportedAudioCodecs();
for (const QString &codecName : supportedAudioCodecs) {
QString description = mediaRecorder->audioCodecDescription(codecName);
ui->audioCodecBox->addItem(codecName+": "+description, QVariant(codecName));
ui->audioCodecBox->addItem(codecName + ": " + description, QVariant(codecName));
}
//sample rate:
foreach (int sampleRate, mediaRecorder->supportedAudioSampleRates()) {
const QList<int>supportedAudioSampleRates = mediaRecorder->supportedAudioSampleRates();
for (int sampleRate : supportedAudioSampleRates)
ui->audioSampleRateBox->addItem(QString::number(sampleRate), QVariant(sampleRate));
}
ui->audioQualitySlider->setRange(0, int(QMultimedia::VeryHighQuality));
//video codecs
ui->videoCodecBox->addItem(tr("Default video codec"), QVariant(QString()));
foreach (const QString &codecName, mediaRecorder->supportedVideoCodecs()) {
const QStringList supportedVideoCodecs = mediaRecorder->supportedVideoCodecs();
for (const QString &codecName : supportedVideoCodecs) {
QString description = mediaRecorder->videoCodecDescription(codecName);
ui->videoCodecBox->addItem(codecName+": "+description, QVariant(codecName));
ui->videoCodecBox->addItem(codecName + ": " + description, QVariant(codecName));
}
ui->videoQualitySlider->setRange(0, int(QMultimedia::VeryHighQuality));
ui->videoResolutionBox->addItem(tr("Default"));
QList<QSize> supportedResolutions = mediaRecorder->supportedResolutions();
foreach (const QSize &resolution, supportedResolutions) {
const QList<QSize> supportedResolutions = mediaRecorder->supportedResolutions();
for (const QSize &resolution : supportedResolutions) {
ui->videoResolutionBox->addItem(QString("%1x%2").arg(resolution.width()).arg(resolution.height()),
QVariant(resolution));
}
ui->videoFramerateBox->addItem(tr("Default"));
QList<qreal> supportedFrameRates = mediaRecorder->supportedFrameRates();
qreal rate;
foreach (rate, supportedFrameRates) {
const QList<qreal> supportedFrameRates = mediaRecorder->supportedFrameRates();
for (qreal rate : supportedFrameRates) {
QString rateString = QString("%1").arg(rate, 0, 'f', 2);
ui->videoFramerateBox->addItem(rateString, QVariant(rate));
}
//containers
ui->containerFormatBox->addItem(tr("Default container"), QVariant(QString()));
foreach (const QString &format, mediaRecorder->supportedContainers()) {
ui->containerFormatBox->addItem(format+":"+mediaRecorder->containerDescription(format),
const QStringList formats = mediaRecorder->supportedContainers();
for (const QString &format : formats) {
ui->containerFormatBox->addItem(format + ": " + mediaRecorder->containerDescription(format),
QVariant(format));
}
}
......
......@@ -56,7 +56,7 @@ class VideoSettings : public QDialog
Q_OBJECT
public:
VideoSettings(QMediaRecorder *mediaRecorder, QWidget *parent = 0);
explicit VideoSettings(QMediaRecorder *mediaRecorder, QWidget *parent = nullptr);
~VideoSettings();
QAudioEncoderSettings audioSettings() const;
......
......@@ -11,7 +11,7 @@
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
<string>Video Settings</string>
</property>
<layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0">
......
......@@ -900,7 +900,7 @@ void QDeclarativeAudio::componentComplete()
void QDeclarativeAudio::_q_statusChanged()
{
if (m_player->mediaStatus() == QMediaPlayer::EndOfMedia && m_runningCount != 0) {
m_runningCount -= 1;
m_runningCount = std::max(m_runningCount - 1, -2);
m_player->play();
}
const QMediaPlayer::MediaStatus oldStatus = m_status;
......
......@@ -44,6 +44,7 @@
#include <QtCore/qqueue.h>
#include <QtCore/qsemaphore.h>
#include <QtCore/qsharedpointer.h>
#include <QtMultimedia/qcameraimagecapturecontrol.h>
#include "avfcamerasession.h"
#include "avfstoragelocation.h"
......@@ -56,7 +57,7 @@ Q_OBJECT
public:
struct CaptureRequest {
int captureId;
QSemaphore *previewReady;
QSharedPointer<QSemaphore> previewReady;
};
AVFImageCaptureControl(AVFCameraService *service, QObject *parent = 0);
......@@ -79,6 +80,7 @@ private Q_SLOTS:
private:
void makeCapturePreview(CaptureRequest request, const QVideoFrame &frame, int rotation);
AVFCameraService *m_service;
AVFCameraSession *m_session;
AVFCameraControl *m_cameraControl;
bool m_ready;
......
......@@ -54,6 +54,7 @@ QT_USE_NAMESPACE
AVFImageCaptureControl::AVFImageCaptureControl(AVFCameraService *service, QObject *parent)
: QCameraImageCaptureControl(parent)
, m_service(service)
, m_session(service->session())
, m_cameraControl(service->cameraControl())
, m_ready(false)
......@@ -68,7 +69,6 @@ AVFImageCaptureControl::AVFImageCaptureControl(AVFCameraService *service, QObjec
[m_stillImageOutput setOutputSettings:outputSettings];
[outputSettings release];
connect(m_cameraControl, SIGNAL(captureModeChanged(QCamera::CaptureModes)), SLOT(updateReadyStatus()));
connect(m_cameraControl, SIGNAL(statusChanged(QCamera::Status)), SLOT(updateReadyStatus()));
......@@ -119,7 +119,7 @@ int AVFImageCaptureControl::capture(const QString &fileName)
qDebugCamera() << "Capture image to" << actualFileName;
CaptureRequest request = { m_lastCaptureId, new QSemaphore };
CaptureRequest request = { m_lastCaptureId, QSharedPointer<QSemaphore>::create()};
m_requestsMutex.lock();
m_captureRequests.enqueue(request);
m_requestsMutex.unlock();
......@@ -127,10 +127,6 @@ int AVFImageCaptureControl::capture(const QString &fileName)
[m_stillImageOutput captureStillImageAsynchronouslyFromConnection:m_videoConnection
completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error) {
// Wait for the preview to be generated before saving the JPEG
request.previewReady->acquire();
delete request.previewReady;
if (error) {
QStringList messageParts;
messageParts << QString::fromUtf8([[error localizedDescription] UTF8String]);
......@@ -144,7 +140,19 @@ int AVFImageCaptureControl::capture(const QString &fileName)
Q_ARG(int, request.captureId),
Q_ARG(int, QCameraImageCapture::ResourceError),
Q_ARG(QString, errorMessage));
} else {
return;
}
// Wait for the preview to be generated before saving the JPEG (but only
// if we have AVFCameraRendererControl attached).
// It is possible to stop camera immediately after trying to capture an
// image; this can result in a blocked callback's thread, waiting for a
// new viewfinder's frame to arrive/semaphore to be released. It is also
// unspecified on which thread this callback gets executed, (probably it's
// not the same thread that initiated a capture and stopped the camera),
// so we cannot reliably check the camera's status. Instead, we wait
// with a timeout and treat a failure to acquire a semaphore as an error.
if (!m_service->videoOutput() || request.previewReady->tryAcquire(1, 1000)) {
qDebugCamera() << "Image capture completed:" << actualFileName;
NSData *nsJpgData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];
......@@ -169,6 +177,14 @@ int AVFImageCaptureControl::capture(const QString &fileName)
Q_ARG(int, QCameraImageCapture::ResourceError),
Q_ARG(QString, errorMessage));
}
} else {
const QLatin1String errorMessage("Image capture failed: timed out waiting"
" for a preview frame.");
qDebugCamera() << errorMessage;
QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection,
Q_ARG(int, request.captureId),
Q_ARG(int, QCameraImageCapture::ResourceError),
Q_ARG(QString, errorMessage));
}
}];
......
......@@ -515,7 +515,7 @@ done:
if (SUCCEEDED(hr)) {
m_surfaceFormat = QVideoSurfaceFormat(QSize(width, height),
m_useTextureRendering ? QVideoFrame::Format_RGB32
: qt_evr_pixelFormatFromD3DFormat((D3DFORMAT)d3dFormat),
: qt_evr_pixelFormatFromD3DFormat(d3dFormat),
m_useTextureRendering ? QAbstractVideoBuffer::GLTextureHandle
: QAbstractVideoBuffer::NoHandle);
} else {
......
......@@ -117,7 +117,7 @@ bool qt_evr_isSampleTimePassed(IMFClock *clock, IMFSample *sample)
return false;
}
QVideoFrame::PixelFormat qt_evr_pixelFormatFromD3DFormat(D3DFORMAT format)
QVideoFrame::PixelFormat qt_evr_pixelFormatFromD3DFormat(DWORD format)
{
switch (format) {
case D3DFMT_R8G8B8:
......
......@@ -90,7 +90,7 @@ inline HRESULT qt_evr_getFrameRate(IMFMediaType *pType, MFRatio *pRatio)
return MFGetAttributeRatio(pType, MF_MT_FRAME_RATE, (UINT32*)&pRatio->Numerator, (UINT32*)&pRatio->Denominator);
}
QVideoFrame::PixelFormat qt_evr_pixelFormatFromD3DFormat(D3DFORMAT format);
QVideoFrame::PixelFormat qt_evr_pixelFormatFromD3DFormat(DWORD format);
D3DFORMAT qt_evr_D3DFormatFromPixelFormat(QVideoFrame::PixelFormat format);
QT_END_NAMESPACE
......
......@@ -624,9 +624,7 @@ void DirectShowMetaDataControl::updateMetadata(IFilterGraph2 *graph, IBaseFilter
#endif
#if QT_CONFIG(wmsdk)
IWMHeaderInfo *info = com_cast<IWMHeaderInfo>(source, IID_IWMHeaderInfo);
if (info) {
if (IWMHeaderInfo *info = com_cast<IWMHeaderInfo>(source, IID_IWMHeaderInfo)) {
const auto keys = *qt_wmMetaDataKeys();
for (const QWMMetaDataKey &key : keys) {
QVariant var = getValue(info, key.wmName);
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment