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

Change-Id: If7566fe55f8600a0823e67a298cbaf25dcb69ee2
This commit is contained in:
Iikka Eklund
2014-04-01 11:46:34 +03:00
28 changed files with 214 additions and 137 deletions

View File

@@ -1188,7 +1188,7 @@ void QDeclarativeAudio::_q_statusChanged()
} }
VideoOutput { VideoOutput {
anchors: parent.fill anchors.fill: parent
source: mediaplayer source: mediaplayer
} }

View File

@@ -58,7 +58,7 @@ QT_BEGIN_NAMESPACE
settings and metadata for videos. settings and metadata for videos.
It should not be constructed separately, instead the It should not be constructed separately, instead the
\c videRecorder property of a \l Camera should be used. \c videoRecorder property of a \l Camera should be used.
\qml \qml
Camera { Camera {

View File

@@ -7,7 +7,7 @@ JAVACLASSPATH += $$PWD/src
JAVASOURCES += $$PWD/src/org/qtproject/qt5/android/multimedia/QtAndroidMediaPlayer.java \ JAVASOURCES += $$PWD/src/org/qtproject/qt5/android/multimedia/QtAndroidMediaPlayer.java \
$$PWD/src/org/qtproject/qt5/android/multimedia/QtCamera.java \ $$PWD/src/org/qtproject/qt5/android/multimedia/QtCamera.java \
$$PWD/src/org/qtproject/qt5/android/multimedia/QtSurfaceTexture.java \ $$PWD/src/org/qtproject/qt5/android/multimedia/QtSurfaceTextureListener.java \
$$PWD/src/org/qtproject/qt5/android/multimedia/QtSurfaceTextureHolder.java \ $$PWD/src/org/qtproject/qt5/android/multimedia/QtSurfaceTextureHolder.java \
$$PWD/src/org/qtproject/qt5/android/multimedia/QtMultimediaUtils.java \ $$PWD/src/org/qtproject/qt5/android/multimedia/QtMultimediaUtils.java \
$$PWD/src/org/qtproject/qt5/android/multimedia/QtMediaRecorder.java $$PWD/src/org/qtproject/qt5/android/multimedia/QtMediaRecorder.java

View File

@@ -43,15 +43,13 @@ package org.qtproject.qt5.android.multimedia;
import android.graphics.SurfaceTexture; import android.graphics.SurfaceTexture;
public class QtSurfaceTexture extends SurfaceTexture implements SurfaceTexture.OnFrameAvailableListener public class QtSurfaceTextureListener implements SurfaceTexture.OnFrameAvailableListener
{ {
private int texID; private final int texID;
public QtSurfaceTexture(int texName) public QtSurfaceTextureListener(int texName)
{ {
super(texName);
texID = texName; texID = texName;
setOnFrameAvailableListener(this);
} }
@Override @Override

View File

@@ -42,7 +42,6 @@
#include "qandroidvideorendercontrol.h" #include "qandroidvideorendercontrol.h"
#include <QtCore/private/qjni_p.h> #include <QtCore/private/qjni_p.h>
#include "jsurfacetextureholder.h"
#include <QAbstractVideoSurface> #include <QAbstractVideoSurface>
#include <QVideoSurfaceFormat> #include <QVideoSurfaceFormat>
#include <qevent.h> #include <qevent.h>
@@ -51,6 +50,7 @@
#include <qopenglfunctions.h> #include <qopenglfunctions.h>
#include <qopenglshaderprogram.h> #include <qopenglshaderprogram.h>
#include <qopenglframebufferobject.h> #include <qopenglframebufferobject.h>
#include <QtCore/private/qjnihelpers_p.h>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
@@ -177,7 +177,7 @@ bool QAndroidVideoRendererControl::initSurfaceTexture()
m_surfaceTexture = new JSurfaceTexture(m_externalTex); m_surfaceTexture = new JSurfaceTexture(m_externalTex);
if (m_surfaceTexture->isValid()) { if (m_surfaceTexture->object()) {
connect(m_surfaceTexture, SIGNAL(frameAvailable()), this, SLOT(onFrameAvailable())); connect(m_surfaceTexture, SIGNAL(frameAvailable()), this, SLOT(onFrameAvailable()));
} else { } else {
delete m_surfaceTexture; delete m_surfaceTexture;
@@ -193,11 +193,11 @@ bool QAndroidVideoRendererControl::initSurfaceTexture()
void QAndroidVideoRendererControl::clearSurfaceTexture() void QAndroidVideoRendererControl::clearSurfaceTexture()
{ {
if (m_surfaceTexture) { if (m_surfaceTexture) {
m_surfaceTexture->callMethod<void>("release");
delete m_surfaceTexture; delete m_surfaceTexture;
m_surfaceTexture = 0; m_surfaceTexture = 0;
} }
if (m_androidSurface) { if (m_androidSurface) {
if (QtAndroidPrivate::androidSdkVersion() > 13)
m_androidSurface->callMethod<void>("release"); m_androidSurface->callMethod<void>("release");
delete m_androidSurface; delete m_androidSurface;
m_androidSurface = 0; m_androidSurface = 0;
@@ -218,7 +218,9 @@ jobject QAndroidVideoRendererControl::surfaceHolder()
"(Landroid/graphics/SurfaceTexture;)V", "(Landroid/graphics/SurfaceTexture;)V",
m_surfaceTexture->object()); m_surfaceTexture->object());
m_surfaceHolder = new JSurfaceTextureHolder(m_androidSurface->object()); m_surfaceHolder = new QJNIObjectPrivate("org/qtproject/qt5/android/multimedia/QtSurfaceTextureHolder",
"(Landroid/view/Surface;)V",
m_androidSurface->object());
} }
return m_surfaceHolder->object(); return m_surfaceHolder->object();

View File

@@ -49,7 +49,6 @@
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class JSurfaceTextureHolder;
class QOpenGLTexture; class QOpenGLTexture;
class QOpenGLFramebufferObject; class QOpenGLFramebufferObject;
class QOpenGLShaderProgram; class QOpenGLShaderProgram;
@@ -115,7 +114,7 @@ private:
QJNIObjectPrivate *m_androidSurface; QJNIObjectPrivate *m_androidSurface;
JSurfaceTexture *m_surfaceTexture; JSurfaceTexture *m_surfaceTexture;
JSurfaceTextureHolder *m_surfaceHolder; QJNIObjectPrivate *m_surfaceHolder;
quint32 m_externalTex; quint32 m_externalTex;
QOpenGLFramebufferObject *m_fbo; QOpenGLFramebufferObject *m_fbo;

View File

@@ -289,6 +289,8 @@ void QAndroidMediaPlayerControl::setMedia(const QMediaContent &mediaContent,
mMediaStream = stream; mMediaStream = stream;
} }
// Release the mediaplayer if it's not in in Idle or Uninitialized state
if ((mState & (JMediaPlayer::Idle | JMediaPlayer::Uninitialized)) == 0)
mMediaPlayer->release(); mMediaPlayer->release();
if (mediaContent.isNull()) { if (mediaContent.isNull()) {
@@ -510,8 +512,10 @@ void QAndroidMediaPlayerControl::onVideoSizeChanged(qint32 width, qint32 height)
void QAndroidMediaPlayerControl::onStateChanged(qint32 state) void QAndroidMediaPlayerControl::onStateChanged(qint32 state)
{ {
// If reloading, don't report state changes unless the new state is Prepared or Error. // If reloading, don't report state changes unless the new state is Prepared or Error.
if ((mState & JMediaPlayer::Stopped) && !(state & (JMediaPlayer::Prepared | JMediaPlayer::Error))) if ((mState & JMediaPlayer::Stopped)
&& (state & (JMediaPlayer::Prepared | JMediaPlayer::Error | JMediaPlayer::Uninitialized)) == 0) {
return; return;
}
mState = state; mState = state;
switch (mState) { switch (mState) {

View File

@@ -74,13 +74,8 @@ static const char* qt_ID3GenreNames[] =
QAndroidMetaDataReaderControl::QAndroidMetaDataReaderControl(QObject *parent) QAndroidMetaDataReaderControl::QAndroidMetaDataReaderControl(QObject *parent)
: QMetaDataReaderControl(parent) : QMetaDataReaderControl(parent)
, m_available(false) , m_available(false)
, m_retriever(0) , m_retriever(new JMediaMetadataRetriever)
{ {
m_retriever = new JMediaMetadataRetriever;
if (!m_retriever->isValid()) {
delete m_retriever;
m_retriever = 0;
}
} }
QAndroidMetaDataReaderControl::~QAndroidMetaDataReaderControl() QAndroidMetaDataReaderControl::~QAndroidMetaDataReaderControl()

View File

@@ -48,7 +48,6 @@
#include "qandroidcamerasession.h" #include "qandroidcamerasession.h"
#include "jmediaplayer.h" #include "jmediaplayer.h"
#include "jsurfacetexture.h" #include "jsurfacetexture.h"
#include "jsurfacetextureholder.h"
#include "jcamera.h" #include "jcamera.h"
#include "jmultimediautils.h" #include "jmultimediautils.h"
#include "jmediarecorder.h" #include "jmediarecorder.h"
@@ -165,14 +164,13 @@ Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void * /*reserved*/)
JNIEnv *jniEnv = uenv.nativeEnvironment; JNIEnv *jniEnv = uenv.nativeEnvironment;
if (!JMediaPlayer::initJNI(jniEnv) || if (!JMediaPlayer::initJNI(jniEnv) ||
!JSurfaceTexture::initJNI(jniEnv) ||
!JSurfaceTextureHolder::initJNI(jniEnv) ||
!JCamera::initJNI(jniEnv) || !JCamera::initJNI(jniEnv) ||
!JMultimediaUtils::initJNI(jniEnv) ||
!JMediaRecorder::initJNI(jniEnv)) { !JMediaRecorder::initJNI(jniEnv)) {
return JNI_ERR; return JNI_ERR;
} }
JSurfaceTexture::initJNI(jniEnv);
return JNI_VERSION_1_4; return JNI_VERSION_1_4;
} }

View File

@@ -47,8 +47,8 @@
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
JMediaMetadataRetriever::JMediaMetadataRetriever() JMediaMetadataRetriever::JMediaMetadataRetriever()
: QJNIObjectPrivate("android/media/MediaMetadataRetriever")
{ {
m_metadataRetriever = QJNIObjectPrivate("android/media/MediaMetadataRetriever");
} }
JMediaMetadataRetriever::~JMediaMetadataRetriever() JMediaMetadataRetriever::~JMediaMetadataRetriever()
@@ -59,7 +59,7 @@ QString JMediaMetadataRetriever::extractMetadata(MetadataKey key)
{ {
QString value; QString value;
QJNIObjectPrivate metadata = callObjectMethod("extractMetadata", QJNIObjectPrivate metadata = m_metadataRetriever.callObjectMethod("extractMetadata",
"(I)Ljava/lang/String;", "(I)Ljava/lang/String;",
jint(key)); jint(key));
if (metadata.isValid()) if (metadata.isValid())
@@ -70,25 +70,31 @@ QString JMediaMetadataRetriever::extractMetadata(MetadataKey key)
void JMediaMetadataRetriever::release() void JMediaMetadataRetriever::release()
{ {
callMethod<void>("release"); if (!m_metadataRetriever.isValid())
return;
m_metadataRetriever.callMethod<void>("release");
} }
bool JMediaMetadataRetriever::setDataSource(const QUrl &url) bool JMediaMetadataRetriever::setDataSource(const QUrl &url)
{ {
if (!m_metadataRetriever.isValid())
return false;
QJNIEnvironmentPrivate env; QJNIEnvironmentPrivate env;
bool loaded = false; bool loaded = false;
QJNIObjectPrivate string = QJNIObjectPrivate::fromString(url.toString()); QJNIObjectPrivate string = QJNIObjectPrivate::fromString(url.toString());
QJNIObjectPrivate uri = callStaticObjectMethod("android/net/Uri", QJNIObjectPrivate uri = m_metadataRetriever.callStaticObjectMethod("android/net/Uri",
"parse", "parse",
"(Ljava/lang/String;)Landroid/net/Uri;", "(Ljava/lang/String;)Landroid/net/Uri;",
string.object()); string.object());
if (env->ExceptionCheck()) { if (env->ExceptionCheck()) {
env->ExceptionClear(); env->ExceptionClear();
} else { } else {
callMethod<void>("setDataSource", m_metadataRetriever.callMethod<void>("setDataSource",
"(Landroid/content/Context;Landroid/net/Uri;)V", "(Landroid/content/Context;Landroid/net/Uri;)V",
QtAndroidPrivate::activity(), QtAndroidPrivate::activity(),
uri.object()); uri.object());
@@ -103,11 +109,14 @@ bool JMediaMetadataRetriever::setDataSource(const QUrl &url)
bool JMediaMetadataRetriever::setDataSource(const QString &path) bool JMediaMetadataRetriever::setDataSource(const QString &path)
{ {
if (!m_metadataRetriever.isValid())
return false;
QJNIEnvironmentPrivate env; QJNIEnvironmentPrivate env;
bool loaded = false; bool loaded = false;
callMethod<void>("setDataSource", m_metadataRetriever.callMethod<void>("setDataSource",
"(Ljava/lang/String;)V", "(Ljava/lang/String;)V",
QJNIObjectPrivate::fromString(path).object()); QJNIObjectPrivate::fromString(path).object());
if (env->ExceptionCheck()) if (env->ExceptionCheck())

View File

@@ -47,7 +47,7 @@
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class JMediaMetadataRetriever : public QJNIObjectPrivate class JMediaMetadataRetriever
{ {
public: public:
enum MetadataKey { enum MetadataKey {
@@ -84,6 +84,8 @@ public:
bool setDataSource(const QUrl &url); bool setDataSource(const QUrl &url);
bool setDataSource(const QString &path); bool setDataSource(const QString &path);
private:
QJNIObjectPrivate m_metadataRetriever;
}; };
QT_END_NAMESPACE QT_END_NAMESPACE

View File

@@ -45,27 +45,24 @@
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
static jclass g_qtMultimediaUtilsClass = 0;
JMultimediaUtils::JMultimediaUtils()
: QObject()
, QJNIObjectPrivate(g_qtMultimediaUtilsClass)
{
}
void JMultimediaUtils::enableOrientationListener(bool enable) void JMultimediaUtils::enableOrientationListener(bool enable)
{ {
callStaticMethod<void>(g_qtMultimediaUtilsClass, "enableOrientationListener", "(Z)V", enable); QJNIObjectPrivate::callStaticMethod<void>("org/qtproject/qt5/android/multimedia/QtMultimediaUtils",
"enableOrientationListener",
"(Z)V",
enable);
} }
int JMultimediaUtils::getDeviceOrientation() int JMultimediaUtils::getDeviceOrientation()
{ {
return callStaticMethod<jint>(g_qtMultimediaUtilsClass, "getDeviceOrientation"); return QJNIObjectPrivate::callStaticMethod<jint>("org/qtproject/qt5/android/multimedia/QtMultimediaUtils",
"getDeviceOrientation");
} }
QString JMultimediaUtils::getDefaultMediaDirectory(MediaType type) QString JMultimediaUtils::getDefaultMediaDirectory(MediaType type)
{ {
QJNIObjectPrivate path = callStaticObjectMethod(g_qtMultimediaUtilsClass, QJNIObjectPrivate path = QJNIObjectPrivate::callStaticObjectMethod("org/qtproject/qt5/android/multimedia/QtMultimediaUtils",
"getDefaultMediaDirectory", "getDefaultMediaDirectory",
"(I)Ljava/lang/String;", "(I)Ljava/lang/String;",
jint(type)); jint(type));
@@ -74,22 +71,10 @@ QString JMultimediaUtils::getDefaultMediaDirectory(MediaType type)
void JMultimediaUtils::registerMediaFile(const QString &file) void JMultimediaUtils::registerMediaFile(const QString &file)
{ {
callStaticMethod<void>(g_qtMultimediaUtilsClass, QJNIObjectPrivate::callStaticMethod<void>("org/qtproject/qt5/android/multimedia/QtMultimediaUtils",
"registerMediaFile", "registerMediaFile",
"(Ljava/lang/String;)V", "(Ljava/lang/String;)V",
QJNIObjectPrivate::fromString(file).object()); QJNIObjectPrivate::fromString(file).object());
} }
bool JMultimediaUtils::initJNI(JNIEnv *env)
{
jclass clazz = env->FindClass("org/qtproject/qt5/android/multimedia/QtMultimediaUtils");
if (env->ExceptionCheck())
env->ExceptionClear();
if (clazz)
g_qtMultimediaUtilsClass = static_cast<jclass>(env->NewGlobalRef(clazz));
return true;
}
QT_END_NAMESPACE QT_END_NAMESPACE

View File

@@ -47,9 +47,8 @@
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class JMultimediaUtils : public QObject, public QJNIObjectPrivate class JMultimediaUtils
{ {
Q_OBJECT
public: public:
enum MediaType { enum MediaType {
Music = 0, Music = 0,
@@ -58,14 +57,10 @@ public:
Sounds = 3 Sounds = 3
}; };
JMultimediaUtils();
static void enableOrientationListener(bool enable); static void enableOrientationListener(bool enable);
static int getDeviceOrientation(); static int getDeviceOrientation();
static QString getDefaultMediaDirectory(MediaType type); static QString getDefaultMediaDirectory(MediaType type);
static void registerMediaFile(const QString &file); static void registerMediaFile(const QString &file);
static bool initJNI(JNIEnv *env);
}; };
QT_END_NAMESPACE QT_END_NAMESPACE

View File

@@ -41,10 +41,11 @@
#include "jsurfacetexture.h" #include "jsurfacetexture.h"
#include <QtCore/private/qjni_p.h> #include <QtCore/private/qjni_p.h>
#include <QtCore/private/qjnihelpers_p.h>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
static jclass g_qtSurfaceTextureClass = 0; static jclass g_qtSurfaceTextureListenerClass = 0;
static QMap<int, JSurfaceTexture*> g_objectMap; static QMap<int, JSurfaceTexture*> g_objectMap;
// native method for QtSurfaceTexture.java // native method for QtSurfaceTexture.java
@@ -57,37 +58,75 @@ static void notifyFrameAvailable(JNIEnv* , jobject, int id)
JSurfaceTexture::JSurfaceTexture(unsigned int texName) JSurfaceTexture::JSurfaceTexture(unsigned int texName)
: QObject() : QObject()
, QJNIObjectPrivate(g_qtSurfaceTextureClass, "(I)V", jint(texName))
, m_texID(int(texName)) , m_texID(int(texName))
{ {
if (isValid()) // API level 11 or higher is required
g_objectMap.insert(int(texName), this); if (QtAndroidPrivate::androidSdkVersion() < 11) {
else // If the class is not available, it means the Android version is < 3.0
qWarning("Camera preview and video playback require Android 3.0 (API level 11) or later."); qWarning("Camera preview and video playback require Android 3.0 (API level 11) or later.");
return;
}
QJNIEnvironmentPrivate env;
m_surfaceTexture = QJNIObjectPrivate("android/graphics/SurfaceTexture", "(I)V", jint(texName));
if (env->ExceptionCheck()) {
#ifdef QT_DEBUG
env->ExceptionDescribe();
#endif // QT_DEBUG
env->ExceptionClear();
}
if (m_surfaceTexture.isValid())
g_objectMap.insert(int(texName), this);
QJNIObjectPrivate listener(g_qtSurfaceTextureListenerClass, "(I)V", jint(texName));
m_surfaceTexture.callMethod<void>("setOnFrameAvailableListener",
"(Landroid/graphics/SurfaceTexture$OnFrameAvailableListener;)V",
listener.object());
} }
JSurfaceTexture::~JSurfaceTexture() JSurfaceTexture::~JSurfaceTexture()
{ {
if (isValid()) if (m_surfaceTexture.isValid()) {
release();
g_objectMap.remove(m_texID); g_objectMap.remove(m_texID);
} }
}
QMatrix4x4 JSurfaceTexture::getTransformMatrix() QMatrix4x4 JSurfaceTexture::getTransformMatrix()
{ {
QMatrix4x4 matrix;
if (!m_surfaceTexture.isValid())
return matrix;
QJNIEnvironmentPrivate env; QJNIEnvironmentPrivate env;
QMatrix4x4 matrix;
jfloatArray array = env->NewFloatArray(16); jfloatArray array = env->NewFloatArray(16);
callMethod<void>("getTransformMatrix", "([F)V", array); m_surfaceTexture.callMethod<void>("getTransformMatrix", "([F)V", array);
env->GetFloatArrayRegion(array, 0, 16, matrix.data()); env->GetFloatArrayRegion(array, 0, 16, matrix.data());
env->DeleteLocalRef(array); env->DeleteLocalRef(array);
return matrix; return matrix;
} }
void JSurfaceTexture::release()
{
if (QtAndroidPrivate::androidSdkVersion() < 14)
return;
m_surfaceTexture.callMethod<void>("release");
}
void JSurfaceTexture::updateTexImage() void JSurfaceTexture::updateTexImage()
{ {
callMethod<void>("updateTexImage"); if (!m_surfaceTexture.isValid())
return;
m_surfaceTexture.callMethod<void>("updateTexImage");
}
jobject JSurfaceTexture::object()
{
return m_surfaceTexture.object();
} }
static JNINativeMethod methods[] = { static JNINativeMethod methods[] = {
@@ -96,26 +135,22 @@ static JNINativeMethod methods[] = {
bool JSurfaceTexture::initJNI(JNIEnv *env) bool JSurfaceTexture::initJNI(JNIEnv *env)
{ {
// SurfaceTexture is available since API 11, try to find it first before loading // SurfaceTexture is available since API 11.
// our custom class if (QtAndroidPrivate::androidSdkVersion() < 11)
jclass surfaceTextureClass = env->FindClass("android/graphics/SurfaceTexture"); return false;
if (env->ExceptionCheck())
env->ExceptionClear();
if (surfaceTextureClass) { jclass clazz = env->FindClass("org/qtproject/qt5/android/multimedia/QtSurfaceTextureListener");
jclass clazz = env->FindClass("org/qtproject/qt5/android/multimedia/QtSurfaceTexture");
if (env->ExceptionCheck()) if (env->ExceptionCheck())
env->ExceptionClear(); env->ExceptionClear();
if (clazz) { if (clazz) {
g_qtSurfaceTextureClass = static_cast<jclass>(env->NewGlobalRef(clazz)); g_qtSurfaceTextureListenerClass = static_cast<jclass>(env->NewGlobalRef(clazz));
if (env->RegisterNatives(g_qtSurfaceTextureClass, if (env->RegisterNatives(g_qtSurfaceTextureListenerClass,
methods, methods,
sizeof(methods) / sizeof(methods[0])) < 0) { sizeof(methods) / sizeof(methods[0])) < 0) {
return false; return false;
} }
} }
}
return true; return true;
} }

View File

@@ -49,7 +49,7 @@
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class JSurfaceTexture : public QObject, public QJNIObjectPrivate class JSurfaceTexture : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
@@ -57,7 +57,10 @@ public:
~JSurfaceTexture(); ~JSurfaceTexture();
int textureID() const { return m_texID; } int textureID() const { return m_texID; }
jobject object();
QMatrix4x4 getTransformMatrix(); QMatrix4x4 getTransformMatrix();
void release(); // API level 14
void updateTexImage(); void updateTexImage();
static bool initJNI(JNIEnv *env); static bool initJNI(JNIEnv *env);
@@ -67,6 +70,7 @@ Q_SIGNALS:
private: private:
int m_texID; int m_texID;
QJNIObjectPrivate m_surfaceTexture;
}; };
QT_END_NAMESPACE QT_END_NAMESPACE

View File

@@ -5,7 +5,6 @@ INCLUDEPATH += $$PWD
HEADERS += \ HEADERS += \
$$PWD/jmediaplayer.h \ $$PWD/jmediaplayer.h \
$$PWD/jsurfacetexture.h \ $$PWD/jsurfacetexture.h \
$$PWD/jsurfacetextureholder.h \
$$PWD/jmediametadataretriever.h \ $$PWD/jmediametadataretriever.h \
$$PWD/jcamera.h \ $$PWD/jcamera.h \
$$PWD/jmultimediautils.h \ $$PWD/jmultimediautils.h \
@@ -14,7 +13,6 @@ HEADERS += \
SOURCES += \ SOURCES += \
$$PWD/jmediaplayer.cpp \ $$PWD/jmediaplayer.cpp \
$$PWD/jsurfacetexture.cpp \ $$PWD/jsurfacetexture.cpp \
$$PWD/jsurfacetextureholder.cpp \
$$PWD/jmediametadataretriever.cpp \ $$PWD/jmediametadataretriever.cpp \
$$PWD/jcamera.cpp \ $$PWD/jcamera.cpp \
$$PWD/jmultimediautils.cpp \ $$PWD/jmultimediautils.cpp \

View File

@@ -110,7 +110,7 @@ QAudioFormat CoreAudioDeviceInfo::preferredFormat() const
} }
} }
delete streams; delete[] streams;
} }
} }
#else //iOS #else //iOS
@@ -180,7 +180,7 @@ QList<int> CoreAudioDeviceInfo::supportedSampleRates()
} }
} }
delete vr; delete[] vr;
} }
} }
#else //iOS #else //iOS
@@ -380,7 +380,7 @@ QList<QByteArray> CoreAudioDeviceInfo::availableDevices(QAudio::Mode mode)
} }
} }
delete audioDevices; delete[] audioDevices;
} }
} }
#else //iOS #else //iOS

View File

@@ -125,7 +125,7 @@ CoreAudioRingBuffer::CoreAudioRingBuffer(int bufferSize):
CoreAudioRingBuffer::~CoreAudioRingBuffer() CoreAudioRingBuffer::~CoreAudioRingBuffer()
{ {
delete m_buffer; delete[] m_buffer;
} }
CoreAudioRingBuffer::Region CoreAudioRingBuffer::acquireReadRegion(int size) CoreAudioRingBuffer::Region CoreAudioRingBuffer::acquireReadRegion(int size)

View File

@@ -630,7 +630,7 @@ void QGstreamerPlayerControl::popAndNotifyState()
if (m_stateStack.isEmpty()) { if (m_stateStack.isEmpty()) {
if (m_currentState != oldState) { if (m_currentState != oldState) {
#ifdef DEBUG_PLAYBIN #ifdef DEBUG_PLAYBIN
qDebug() << "State changed:" << m_state; qDebug() << "State changed:" << m_currentState;
#endif #endif
emit stateChanged(m_currentState); emit stateChanged(m_currentState);
} }

View File

@@ -40,7 +40,9 @@
****************************************************************************/ ****************************************************************************/
#include "bbserviceplugin.h" #include "bbserviceplugin.h"
#include "bbcamerainfocontrol.h"
#include "bbcameraservice.h" #include "bbcameraservice.h"
#include "bbcamerasession.h"
#include "bbvideodeviceselectorcontrol.h" #include "bbvideodeviceselectorcontrol.h"
#include "mmrenderermediaplayerservice.h" #include "mmrenderermediaplayerservice.h"
@@ -120,8 +122,20 @@ void BbServicePlugin::updateDevices() const
if (m_cameraDevices.isEmpty()) { if (m_cameraDevices.isEmpty()) {
qWarning() << "No camera devices found"; qWarning() << "No camera devices found";
} else { } else {
m_defaultCameraDevice = m_cameraDevices.first(); m_defaultCameraDevice = m_cameraDevices.contains(BbCameraSession::cameraIdentifierRear())
? BbCameraSession::cameraIdentifierRear()
: m_cameraDevices.first();
} }
} }
QCamera::Position BbServicePlugin::cameraPosition(const QByteArray &device) const
{
return BbCameraInfoControl::position(device);
}
int BbServicePlugin::cameraOrientation(const QByteArray &device) const
{
return BbCameraInfoControl::orientation(device);
}
QT_END_NAMESPACE QT_END_NAMESPACE

View File

@@ -49,11 +49,13 @@ class BbServicePlugin
: public QMediaServiceProviderPlugin, : public QMediaServiceProviderPlugin,
public QMediaServiceSupportedDevicesInterface, public QMediaServiceSupportedDevicesInterface,
public QMediaServiceDefaultDeviceInterface, public QMediaServiceDefaultDeviceInterface,
public QMediaServiceCameraInfoInterface,
public QMediaServiceFeaturesInterface public QMediaServiceFeaturesInterface
{ {
Q_OBJECT Q_OBJECT
Q_INTERFACES(QMediaServiceSupportedDevicesInterface) Q_INTERFACES(QMediaServiceSupportedDevicesInterface)
Q_INTERFACES(QMediaServiceDefaultDeviceInterface) Q_INTERFACES(QMediaServiceDefaultDeviceInterface)
Q_INTERFACES(QMediaServiceCameraInfoInterface)
Q_INTERFACES(QMediaServiceFeaturesInterface) Q_INTERFACES(QMediaServiceFeaturesInterface)
Q_PLUGIN_METADATA(IID "org.qt-project.qt.mediaserviceproviderfactory/5.0" FILE "blackberry_mediaservice.json") Q_PLUGIN_METADATA(IID "org.qt-project.qt.mediaserviceproviderfactory/5.0" FILE "blackberry_mediaservice.json")
public: public:
@@ -68,6 +70,9 @@ public:
QString deviceDescription(const QByteArray &service, const QByteArray &device) Q_DECL_OVERRIDE; QString deviceDescription(const QByteArray &service, const QByteArray &device) Q_DECL_OVERRIDE;
QVariant deviceProperty(const QByteArray &service, const QByteArray &device, const QByteArray &property) Q_DECL_OVERRIDE; QVariant deviceProperty(const QByteArray &service, const QByteArray &device, const QByteArray &property) Q_DECL_OVERRIDE;
QCamera::Position cameraPosition(const QByteArray &device) const Q_DECL_OVERRIDE;
int cameraOrientation(const QByteArray &device) const Q_DECL_OVERRIDE;
private: private:
void updateDevices() const; void updateDevices() const;

View File

@@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal ** Contact: http://www.qt-project.org/legal
** **
** This file is part of the Qt Toolkit. ** This file is part of the Qt Toolkit.
@@ -39,27 +39,45 @@
** **
****************************************************************************/ ****************************************************************************/
#include "jsurfacetextureholder.h" #include "bbcamerainfocontrol.h"
#include "bbcamerasession.h"
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
static jclass g_qtSurfaceTextureHolderClass = 0; BbCameraInfoControl::BbCameraInfoControl(QObject *parent)
: QCameraInfoControl(parent)
JSurfaceTextureHolder::JSurfaceTextureHolder(jobject surface)
: QJNIObjectPrivate(g_qtSurfaceTextureHolderClass, "(Landroid/view/Surface;)V", surface)
{ {
} }
bool JSurfaceTextureHolder::initJNI(JNIEnv *env) QCamera::Position BbCameraInfoControl::position(const QString &deviceName)
{ {
jclass clazz = env->FindClass("org/qtproject/qt5/android/multimedia/QtSurfaceTextureHolder"); if (deviceName == QString::fromUtf8(BbCameraSession::cameraIdentifierFront()))
if (env->ExceptionCheck()) return QCamera::FrontFace;
env->ExceptionClear(); else if (deviceName == QString::fromUtf8(BbCameraSession::cameraIdentifierRear()))
return QCamera::BackFace;
else
return QCamera::UnspecifiedPosition;
}
if (clazz) int BbCameraInfoControl::orientation(const QString &deviceName)
g_qtSurfaceTextureHolderClass = static_cast<jclass>(env->NewGlobalRef(clazz)); {
// The camera sensor orientation could be retrieved with camera_get_native_orientation()
// but since the sensor angular offset is compensated with camera_set_videovf_property() and
// camera_set_photovf_property() we should always return 0 here.
Q_UNUSED(deviceName);
return 0;
}
return true; QCamera::Position BbCameraInfoControl::cameraPosition(const QString &deviceName) const
{
return position(deviceName);
}
int BbCameraInfoControl::cameraOrientation(const QString &deviceName) const
{
return orientation(deviceName);
} }
QT_END_NAMESPACE QT_END_NAMESPACE

View File

@@ -1,6 +1,6 @@
/**************************************************************************** /****************************************************************************
** **
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal ** Contact: http://www.qt-project.org/legal
** **
** This file is part of the Qt Toolkit. ** This file is part of the Qt Toolkit.
@@ -39,21 +39,27 @@
** **
****************************************************************************/ ****************************************************************************/
#ifndef JSURFACETEXTUREHOLDER_H #ifndef BBCAMERAINFOCONTROL_H
#define JSURFACETEXTUREHOLDER_H #define BBCAMERAINFOCONTROL_H
#include <QtCore/private/qjni_p.h> #include <qcamerainfocontrol.h>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class JSurfaceTextureHolder : public QJNIObjectPrivate class BbCameraInfoControl : public QCameraInfoControl
{ {
Q_OBJECT
public: public:
JSurfaceTextureHolder(jobject surface); explicit BbCameraInfoControl(QObject *parent = 0);
static bool initJNI(JNIEnv *env); QCamera::Position cameraPosition(const QString &deviceName) const;
int cameraOrientation(const QString &deviceName) const;
static QCamera::Position position(const QString &deviceName);
static int orientation(const QString &deviceName);
}; };
QT_END_NAMESPACE QT_END_NAMESPACE
#endif // JSURFACETEXTUREHOLDER_H #endif // BBCAMERAINFOCONTROL_H

View File

@@ -49,6 +49,7 @@
#include "bbcamerafocuscontrol.h" #include "bbcamerafocuscontrol.h"
#include "bbcameraimagecapturecontrol.h" #include "bbcameraimagecapturecontrol.h"
#include "bbcameraimageprocessingcontrol.h" #include "bbcameraimageprocessingcontrol.h"
#include "bbcamerainfocontrol.h"
#include "bbcameralockscontrol.h" #include "bbcameralockscontrol.h"
#include "bbcameramediarecordercontrol.h" #include "bbcameramediarecordercontrol.h"
#include "bbcamerasession.h" #include "bbcamerasession.h"
@@ -76,6 +77,7 @@ BbCameraService::BbCameraService(QObject *parent)
, m_cameraFocusControl(new BbCameraFocusControl(m_cameraSession, this)) , m_cameraFocusControl(new BbCameraFocusControl(m_cameraSession, this))
, m_cameraImageCaptureControl(new BbCameraImageCaptureControl(m_cameraSession, this)) , m_cameraImageCaptureControl(new BbCameraImageCaptureControl(m_cameraSession, this))
, m_cameraImageProcessingControl(new BbCameraImageProcessingControl(m_cameraSession, this)) , m_cameraImageProcessingControl(new BbCameraImageProcessingControl(m_cameraSession, this))
, m_cameraInfoControl(new BbCameraInfoControl(this))
, m_cameraLocksControl(new BbCameraLocksControl(m_cameraSession, this)) , m_cameraLocksControl(new BbCameraLocksControl(m_cameraSession, this))
, m_cameraMediaRecorderControl(new BbCameraMediaRecorderControl(m_cameraSession, this)) , m_cameraMediaRecorderControl(new BbCameraMediaRecorderControl(m_cameraSession, this))
, m_cameraVideoEncoderSettingsControl(new BbCameraVideoEncoderSettingsControl(m_cameraSession, this)) , m_cameraVideoEncoderSettingsControl(new BbCameraVideoEncoderSettingsControl(m_cameraSession, this))
@@ -101,6 +103,8 @@ QMediaControl* BbCameraService::requestControl(const char *name)
return m_cameraCaptureDestinationControl; return m_cameraCaptureDestinationControl;
else if (qstrcmp(name, QCameraControl_iid) == 0) else if (qstrcmp(name, QCameraControl_iid) == 0)
return m_cameraControl; return m_cameraControl;
else if (qstrcmp(name, QCameraInfoControl_iid) == 0)
return m_cameraInfoControl;
else if (qstrcmp(name, QCameraExposureControl_iid) == 0) else if (qstrcmp(name, QCameraExposureControl_iid) == 0)
return m_cameraExposureControl; return m_cameraExposureControl;
else if (qstrcmp(name, QCameraFlashControl_iid) == 0) else if (qstrcmp(name, QCameraFlashControl_iid) == 0)

View File

@@ -56,6 +56,7 @@ class BbCameraFlashControl;
class BbCameraFocusControl; class BbCameraFocusControl;
class BbCameraImageCaptureControl; class BbCameraImageCaptureControl;
class BbCameraImageProcessingControl; class BbCameraImageProcessingControl;
class BbCameraInfoControl;
class BbCameraLocksControl; class BbCameraLocksControl;
class BbCameraMediaRecorderControl; class BbCameraMediaRecorderControl;
class BbCameraSession; class BbCameraSession;
@@ -89,6 +90,7 @@ private:
BbCameraFocusControl* m_cameraFocusControl; BbCameraFocusControl* m_cameraFocusControl;
BbCameraImageCaptureControl* m_cameraImageCaptureControl; BbCameraImageCaptureControl* m_cameraImageCaptureControl;
BbCameraImageProcessingControl* m_cameraImageProcessingControl; BbCameraImageProcessingControl* m_cameraImageProcessingControl;
BbCameraInfoControl* m_cameraInfoControl;
BbCameraLocksControl* m_cameraLocksControl; BbCameraLocksControl* m_cameraLocksControl;
BbCameraMediaRecorderControl* m_cameraMediaRecorderControl; BbCameraMediaRecorderControl* m_cameraMediaRecorderControl;
BbCameraVideoEncoderSettingsControl* m_cameraVideoEncoderSettingsControl; BbCameraVideoEncoderSettingsControl* m_cameraVideoEncoderSettingsControl;

View File

@@ -49,6 +49,7 @@ QT_BEGIN_NAMESPACE
BbVideoDeviceSelectorControl::BbVideoDeviceSelectorControl(BbCameraSession *session, QObject *parent) BbVideoDeviceSelectorControl::BbVideoDeviceSelectorControl(BbCameraSession *session, QObject *parent)
: QVideoDeviceSelectorControl(parent) : QVideoDeviceSelectorControl(parent)
, m_session(session) , m_session(session)
, m_default(0)
, m_selected(0) , m_selected(0)
{ {
enumerateDevices(&m_devices, &m_descriptions); enumerateDevices(&m_devices, &m_descriptions);
@@ -56,7 +57,7 @@ BbVideoDeviceSelectorControl::BbVideoDeviceSelectorControl(BbCameraSession *sess
// pre-select the rear camera // pre-select the rear camera
const int index = m_devices.indexOf(BbCameraSession::cameraIdentifierRear()); const int index = m_devices.indexOf(BbCameraSession::cameraIdentifierRear());
if (index != -1) if (index != -1)
m_selected = index; m_default = m_selected = index;
} }
int BbVideoDeviceSelectorControl::deviceCount() const int BbVideoDeviceSelectorControl::deviceCount() const
@@ -82,7 +83,7 @@ QString BbVideoDeviceSelectorControl::deviceDescription(int index) const
int BbVideoDeviceSelectorControl::defaultDevice() const int BbVideoDeviceSelectorControl::defaultDevice() const
{ {
return 0; return m_default;
} }
int BbVideoDeviceSelectorControl::selectedDevice() const int BbVideoDeviceSelectorControl::selectedDevice() const

View File

@@ -71,6 +71,7 @@ private:
QList<QByteArray> m_devices; QList<QByteArray> m_devices;
QStringList m_descriptions; QStringList m_descriptions;
int m_default;
int m_selected; int m_selected;
}; };

View File

@@ -10,6 +10,7 @@ HEADERS += \
$$PWD/bbcamerafocuscontrol.h \ $$PWD/bbcamerafocuscontrol.h \
$$PWD/bbcameraimagecapturecontrol.h \ $$PWD/bbcameraimagecapturecontrol.h \
$$PWD/bbcameraimageprocessingcontrol.h \ $$PWD/bbcameraimageprocessingcontrol.h \
$$PWD/bbcamerainfocontrol.h \
$$PWD/bbcameralockscontrol.h \ $$PWD/bbcameralockscontrol.h \
$$PWD/bbcameramediarecordercontrol.h \ $$PWD/bbcameramediarecordercontrol.h \
$$PWD/bbcameraorientationhandler.h \ $$PWD/bbcameraorientationhandler.h \
@@ -33,6 +34,7 @@ SOURCES += \
$$PWD/bbcamerafocuscontrol.cpp \ $$PWD/bbcamerafocuscontrol.cpp \
$$PWD/bbcameraimagecapturecontrol.cpp \ $$PWD/bbcameraimagecapturecontrol.cpp \
$$PWD/bbcameraimageprocessingcontrol.cpp \ $$PWD/bbcameraimageprocessingcontrol.cpp \
$$PWD/bbcamerainfocontrol.cpp \
$$PWD/bbcameralockscontrol.cpp \ $$PWD/bbcameralockscontrol.cpp \
$$PWD/bbcameramediarecordercontrol.cpp \ $$PWD/bbcameramediarecordercontrol.cpp \
$$PWD/bbcameraorientationhandler.cpp \ $$PWD/bbcameraorientationhandler.cpp \