Merge remote-tracking branch 'origin/5.4' into dev
Conflicts: .qmake.conf Change-Id: I31e377cdccf8bf5c1ea8143faf2001ac99608c27
This commit is contained in:
@@ -35,6 +35,7 @@
|
||||
|
||||
#include "qopenslesengine.h"
|
||||
#include <qbuffer.h>
|
||||
#include <private/qaudiohelpers_p.h>
|
||||
#include <qdebug.h>
|
||||
|
||||
#ifdef ANDROID
|
||||
@@ -70,6 +71,7 @@ QOpenSLESAudioInput::QOpenSLESAudioInput(const QByteArray &device)
|
||||
, m_errorState(QAudio::NoError)
|
||||
, m_deviceState(QAudio::StoppedState)
|
||||
, m_lastNotifyTime(0)
|
||||
, m_volume(1.0)
|
||||
, m_bufferSize(0)
|
||||
, m_periodSize(0)
|
||||
, m_intervalTime(1000)
|
||||
@@ -395,9 +397,19 @@ void QOpenSLESAudioInput::writeDataToDevice(const char *data, int size)
|
||||
{
|
||||
m_processedBytes += size;
|
||||
|
||||
QByteArray outData;
|
||||
|
||||
// Apply volume
|
||||
if (m_volume < 1.0f) {
|
||||
outData.resize(size);
|
||||
QAudioHelperInternal::qMultiplySamples(m_volume, m_format, data, outData.data(), size);
|
||||
} else {
|
||||
outData.append(data, size);
|
||||
}
|
||||
|
||||
if (m_pullMode) {
|
||||
// write buffer to the QIODevice
|
||||
if (m_audioSource->write(data, size) < 0) {
|
||||
if (m_audioSource->write(outData) < 0) {
|
||||
stop();
|
||||
m_errorState = QAudio::IOError;
|
||||
Q_EMIT errorChanged(m_errorState);
|
||||
@@ -405,7 +417,7 @@ void QOpenSLESAudioInput::writeDataToDevice(const char *data, int size)
|
||||
} else {
|
||||
// emits readyRead() so user will call read() on QIODevice to get some audio data
|
||||
if (m_bufferIODevice != 0) {
|
||||
m_pushBuffer.append(data, size);
|
||||
m_pushBuffer.append(outData);
|
||||
Q_EMIT m_bufferIODevice->readyRead();
|
||||
}
|
||||
}
|
||||
@@ -478,13 +490,12 @@ qint64 QOpenSLESAudioInput::elapsedUSecs() const
|
||||
|
||||
void QOpenSLESAudioInput::setVolume(qreal vol)
|
||||
{
|
||||
// Volume interface is not available for the recorder on Android
|
||||
Q_UNUSED(vol);
|
||||
m_volume = vol;
|
||||
}
|
||||
|
||||
qreal QOpenSLESAudioInput::volume() const
|
||||
{
|
||||
return qreal(1.0);
|
||||
return m_volume;
|
||||
}
|
||||
|
||||
void QOpenSLESAudioInput::reset()
|
||||
|
||||
@@ -113,6 +113,7 @@ private:
|
||||
QAudio::State m_deviceState;
|
||||
QTime m_clockStamp;
|
||||
qint64 m_lastNotifyTime;
|
||||
qreal m_volume;
|
||||
int m_bufferSize;
|
||||
int m_periodSize;
|
||||
int m_intervalTime;
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
#include <QtCore/qfunctions_winrt.h>
|
||||
#include <QtCore/QGlobalStatic>
|
||||
#include <QtCore/QMetaMethod>
|
||||
#include <QtCore/QPointer>
|
||||
#include <QtGui/QOpenGLContext>
|
||||
#include <QtGui/QOpenGLTexture>
|
||||
#include <QtMultimedia/QAbstractVideoBuffer>
|
||||
@@ -181,7 +182,7 @@ enum DirtyState {
|
||||
class QWinRTAbstractVideoRendererControlPrivate
|
||||
{
|
||||
public:
|
||||
QAbstractVideoSurface *surface;
|
||||
QPointer<QAbstractVideoSurface> surface;
|
||||
QVideoSurfaceFormat format;
|
||||
|
||||
DirtyState dirtyState;
|
||||
@@ -219,7 +220,6 @@ QWinRTAbstractVideoRendererControl::QWinRTAbstractVideoRendererControl(const QSi
|
||||
{
|
||||
Q_D(QWinRTAbstractVideoRendererControl);
|
||||
|
||||
d->surface = Q_NULLPTR;
|
||||
d->format = QVideoSurfaceFormat(size, QVideoFrame::Format_BGRA32,
|
||||
QAbstractVideoBuffer::GLTextureHandle);
|
||||
d->dirtyState = TextureDirty;
|
||||
@@ -310,6 +310,16 @@ void QWinRTAbstractVideoRendererControl::setSize(const QSize &size)
|
||||
d->dirtyState = TextureDirty;
|
||||
}
|
||||
|
||||
void QWinRTAbstractVideoRendererControl::setScanLineDirection(QVideoSurfaceFormat::Direction scanLineDirection)
|
||||
{
|
||||
Q_D(QWinRTAbstractVideoRendererControl);
|
||||
|
||||
if (d->format.scanLineDirection() == scanLineDirection)
|
||||
return;
|
||||
|
||||
d->format.setScanLineDirection(scanLineDirection);
|
||||
}
|
||||
|
||||
void QWinRTAbstractVideoRendererControl::setActive(bool active)
|
||||
{
|
||||
Q_D(QWinRTAbstractVideoRendererControl);
|
||||
@@ -330,6 +340,8 @@ void QWinRTAbstractVideoRendererControl::setActive(bool active)
|
||||
}
|
||||
|
||||
d->renderThread.requestInterruption();
|
||||
if (d->surface && d->surface->isActive())
|
||||
d->surface->stop();
|
||||
}
|
||||
|
||||
void QWinRTAbstractVideoRendererControl::present()
|
||||
|
||||
@@ -43,6 +43,7 @@
|
||||
#define QWINRTABSTRACTVIDEORENDERERCONTROL_H
|
||||
|
||||
#include <QtMultimedia/QVideoRendererControl>
|
||||
#include <QtMultimedia/QVideoSurfaceFormat>
|
||||
|
||||
struct ID3D11Device;
|
||||
struct ID3D11Texture2D;
|
||||
@@ -63,6 +64,8 @@ public:
|
||||
QSize size() const;
|
||||
void setSize(const QSize &size);
|
||||
|
||||
void setScanLineDirection(QVideoSurfaceFormat::Direction direction);
|
||||
|
||||
void setActive(bool active);
|
||||
|
||||
virtual bool render(ID3D11Texture2D *texture) = 0;
|
||||
|
||||
@@ -677,6 +677,9 @@ HRESULT QWinRTCameraControl::initialize()
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
if (d->videoDeviceSelector->cameraPosition(deviceName) == QCamera::FrontFace)
|
||||
d->videoRenderer->setScanLineDirection(QVideoSurfaceFormat::BottomToTop);
|
||||
|
||||
ComPtr<IMediaCaptureInitializationSettings> settings;
|
||||
hr = RoActivateInstance(HString::MakeReference(RuntimeClass_Windows_Media_Capture_MediaCaptureInitializationSettings).Get(),
|
||||
&settings);
|
||||
@@ -708,7 +711,20 @@ HRESULT QWinRTCameraControl::initialize()
|
||||
hr = videoDeviceController.As(&deviceController);
|
||||
Q_ASSERT_SUCCEEDED(hr);
|
||||
ComPtr<IVectorView<IMediaEncodingProperties *>> encodingPropertiesList;
|
||||
hr = deviceController->GetAvailableMediaStreamProperties(MediaStreamType_Photo, &encodingPropertiesList);
|
||||
MediaStreamType mediaStreamType;
|
||||
switch (d->captureMode) {
|
||||
default:
|
||||
case QCamera::CaptureViewfinder:
|
||||
mediaStreamType = MediaStreamType_VideoPreview;
|
||||
break;
|
||||
case QCamera::CaptureStillImage:
|
||||
mediaStreamType = MediaStreamType_Photo;
|
||||
break;
|
||||
case QCamera::CaptureVideo:
|
||||
mediaStreamType = MediaStreamType_VideoRecord;
|
||||
break;
|
||||
}
|
||||
hr = deviceController->GetAvailableMediaStreamProperties(mediaStreamType, &encodingPropertiesList);
|
||||
Q_ASSERT_SUCCEEDED(hr);
|
||||
|
||||
d->size = QSize();
|
||||
@@ -721,12 +737,12 @@ HRESULT QWinRTCameraControl::initialize()
|
||||
hr = encodingPropertiesList->GetAt(i, &properties);
|
||||
Q_ASSERT_SUCCEEDED(hr);
|
||||
ComPtr<IVideoEncodingProperties> videoProperties;
|
||||
hr = properties.As(&videoEncodingProperties);
|
||||
hr = properties.As(&videoProperties);
|
||||
Q_ASSERT_SUCCEEDED(hr);
|
||||
UINT32 width, height;
|
||||
hr = videoEncodingProperties->get_Width(&width);
|
||||
hr = videoProperties->get_Width(&width);
|
||||
Q_ASSERT_SUCCEEDED(hr);
|
||||
hr = videoEncodingProperties->get_Height(&height);
|
||||
hr = videoProperties->get_Height(&height);
|
||||
Q_ASSERT_SUCCEEDED(hr);
|
||||
// Choose the highest-quality format
|
||||
if (int(width * height) > d->size.width() * d->size.height()) {
|
||||
|
||||
@@ -337,7 +337,17 @@ QCamera::Position QWinRTVideoDeviceSelectorControl::cameraPosition(const QString
|
||||
|
||||
int QWinRTVideoDeviceSelectorControl::cameraOrientation(const QString &deviceName)
|
||||
{
|
||||
#ifdef Q_OS_WINPHONE
|
||||
switch (cameraPosition(deviceName)) {
|
||||
case QCamera::FrontFace:
|
||||
case QCamera::BackFace:
|
||||
return 270;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
#else
|
||||
Q_UNUSED(deviceName);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user