diff options
author | Frederik Gladhorn <frederik.gladhorn@theqtcompany.com> | 2014-10-20 19:13:18 +0200 |
---|---|---|
committer | Frederik Gladhorn <frederik.gladhorn@theqtcompany.com> | 2014-10-20 19:13:19 +0200 |
commit | d7cfdf52fc446f668ba8f9c96dd39c4e32e24c98 (patch) | |
tree | 84579f2684ba869aac975b438f948f8cdf76a300 | |
parent | a7b67a97ecf0d5cf9d1c913c9367b7dd68c0108d (diff) | |
parent | b366a99eb14f166ebdcfcb6d328b4d7552227b71 (diff) | |
download | qtmultimedia-d7cfdf52fc446f668ba8f9c96dd39c4e32e24c98.tar.gz |
Merge remote-tracking branch 'origin/5.4' into dev
Change-Id: Ie44084828edf50050c695ac4dcc1cb532651499c
6 files changed, 68 insertions, 80 deletions
diff --git a/src/plugins/android/src/wrappers/jni/androidcamera.cpp b/src/plugins/android/src/wrappers/jni/androidcamera.cpp index dbe9393ca..b9ea1a6a3 100644 --- a/src/plugins/android/src/wrappers/jni/androidcamera.cpp +++ b/src/plugins/android/src/wrappers/jni/androidcamera.cpp @@ -43,7 +43,7 @@ QT_BEGIN_NAMESPACE -static jclass g_qtCameraListenerClass = 0; +static const char QtCameraListenerClassName[] = "org/qtproject/qt5/android/multimedia/QtCameraListener"; static QMutex g_cameraMapMutex; typedef QMap<int, AndroidCamera *> CameraMap; Q_GLOBAL_STATIC(CameraMap, g_cameraMap) @@ -720,7 +720,7 @@ bool AndroidCameraPrivate::init(int cameraId) if (exceptionCheckAndClear(env) || !m_camera.isValid()) return false; - m_cameraListener = QJNIObjectPrivate(g_qtCameraListenerClass, "(I)V", m_cameraId); + m_cameraListener = QJNIObjectPrivate(QtCameraListenerClassName, "(I)V", m_cameraId); m_info = QJNIObjectPrivate("android/hardware/Camera$CameraInfo"); m_camera.callStaticMethod<void>("android/hardware/Camera", "getCameraInfo", @@ -1392,24 +1392,22 @@ QStringList AndroidCameraPrivate::callParametersStringListMethod(const QByteArra return stringList; } -static JNINativeMethod methods[] = { - {"notifyAutoFocusComplete", "(IZ)V", (void *)notifyAutoFocusComplete}, - {"notifyPictureExposed", "(I)V", (void *)notifyPictureExposed}, - {"notifyPictureCaptured", "(I[B)V", (void *)notifyPictureCaptured}, - {"notifyFrameFetched", "(I[B)V", (void *)notifyFrameFetched} -}; - bool AndroidCamera::initJNI(JNIEnv *env) { - jclass clazz = env->FindClass("org/qtproject/qt5/android/multimedia/QtCameraListener"); + jclass clazz = QJNIEnvironmentPrivate::findClass(QtCameraListenerClassName, + env); - if (!exceptionCheckAndClear(env) && clazz) { - g_qtCameraListenerClass = static_cast<jclass>(env->NewGlobalRef(clazz)); - if (env->RegisterNatives(g_qtCameraListenerClass, - methods, - sizeof(methods) / sizeof(methods[0])) < 0) { - return false; - } + static const JNINativeMethod methods[] = { + {"notifyAutoFocusComplete", "(IZ)V", (void *)notifyAutoFocusComplete}, + {"notifyPictureExposed", "(I)V", (void *)notifyPictureExposed}, + {"notifyPictureCaptured", "(I[B)V", (void *)notifyPictureCaptured}, + {"notifyFrameFetched", "(I[B)V", (void *)notifyFrameFetched} + }; + + if (clazz && env->RegisterNatives(clazz, + methods, + sizeof(methods) / sizeof(methods[0])) != JNI_OK) { + return false; } return true; diff --git a/src/plugins/android/src/wrappers/jni/androidmediaplayer.cpp b/src/plugins/android/src/wrappers/jni/androidmediaplayer.cpp index a285f0180..9f8264565 100644 --- a/src/plugins/android/src/wrappers/jni/androidmediaplayer.cpp +++ b/src/plugins/android/src/wrappers/jni/androidmediaplayer.cpp @@ -39,7 +39,7 @@ #include "androidsurfacetexture.h" #include <QMap> -static jclass mediaPlayerClass = Q_NULLPTR; +static const char QtAndroidMediaPlayerClassName[] = "org/qtproject/qt5/android/multimedia/QtAndroidMediaPlayer"; typedef QMap<jlong, AndroidMediaPlayer *> MediaPlayerMap; Q_GLOBAL_STATIC(MediaPlayerMap, mediaPlayers) @@ -50,10 +50,10 @@ AndroidMediaPlayer::AndroidMediaPlayer() { const jlong id = reinterpret_cast<jlong>(this); - mMediaPlayer = QJNIObjectPrivate(mediaPlayerClass, - "(Landroid/app/Activity;J)V", - QtAndroidPrivate::activity(), - id); + mMediaPlayer = QJNIObjectPrivate(QtAndroidMediaPlayerClassName, + "(Landroid/app/Activity;J)V", + QtAndroidPrivate::activity(), + id); (*mediaPlayers)[id] = this; } @@ -233,26 +233,23 @@ static void onVideoSizeChangedNative(JNIEnv *env, bool AndroidMediaPlayer::initJNI(JNIEnv *env) { - jclass jClass = env->FindClass("org/qtproject/qt5/android/multimedia/QtAndroidMediaPlayer"); - - if (jClass) { - mediaPlayerClass = static_cast<jclass>(env->NewGlobalRef(jClass)); - - JNINativeMethod methods[] = { - {"onErrorNative", "(IIJ)V", reinterpret_cast<void *>(onErrorNative)}, - {"onBufferingUpdateNative", "(IJ)V", reinterpret_cast<void *>(onBufferingUpdateNative)}, - {"onProgressUpdateNative", "(IJ)V", reinterpret_cast<void *>(onProgressUpdateNative)}, - {"onDurationChangedNative", "(IJ)V", reinterpret_cast<void *>(onDurationChangedNative)}, - {"onInfoNative", "(IIJ)V", reinterpret_cast<void *>(onInfoNative)}, - {"onVideoSizeChangedNative", "(IIJ)V", reinterpret_cast<void *>(onVideoSizeChangedNative)}, - {"onStateChangedNative", "(IJ)V", reinterpret_cast<void *>(onStateChangedNative)} - }; - - if (env->RegisterNatives(mediaPlayerClass, - methods, - sizeof(methods) / sizeof(methods[0])) < 0) { + jclass clazz = QJNIEnvironmentPrivate::findClass(QtAndroidMediaPlayerClassName, + env); + + static const JNINativeMethod methods[] = { + {"onErrorNative", "(IIJ)V", reinterpret_cast<void *>(onErrorNative)}, + {"onBufferingUpdateNative", "(IJ)V", reinterpret_cast<void *>(onBufferingUpdateNative)}, + {"onProgressUpdateNative", "(IJ)V", reinterpret_cast<void *>(onProgressUpdateNative)}, + {"onDurationChangedNative", "(IJ)V", reinterpret_cast<void *>(onDurationChangedNative)}, + {"onInfoNative", "(IIJ)V", reinterpret_cast<void *>(onInfoNative)}, + {"onVideoSizeChangedNative", "(IIJ)V", reinterpret_cast<void *>(onVideoSizeChangedNative)}, + {"onStateChangedNative", "(IJ)V", reinterpret_cast<void *>(onStateChangedNative)} + }; + + if (clazz && env->RegisterNatives(clazz, + methods, + sizeof(methods) / sizeof(methods[0])) != JNI_OK) { return false; - } } return true; diff --git a/src/plugins/android/src/wrappers/jni/androidmediarecorder.cpp b/src/plugins/android/src/wrappers/jni/androidmediarecorder.cpp index 074f1c92b..2d2b6e2f3 100644 --- a/src/plugins/android/src/wrappers/jni/androidmediarecorder.cpp +++ b/src/plugins/android/src/wrappers/jni/androidmediarecorder.cpp @@ -113,7 +113,7 @@ AndroidCamcorderProfile::AndroidCamcorderProfile(const QJNIObjectPrivate &camcor m_camcorderProfile = camcorderProfile; } -static jclass g_qtMediaRecorderListenerClass = 0; +static const char QtMediaRecorderListenerClassName[] = "org/qtproject/qt5/android/multimedia/QtMediaRecorderListener"; typedef QMap<jlong, AndroidMediaRecorder*> MediaRecorderMap; Q_GLOBAL_STATIC(MediaRecorderMap, mediaRecorders) @@ -137,7 +137,7 @@ AndroidMediaRecorder::AndroidMediaRecorder() { m_mediaRecorder = QJNIObjectPrivate("android/media/MediaRecorder"); if (m_mediaRecorder.isValid()) { - QJNIObjectPrivate listener(g_qtMediaRecorderListenerClass, "(J)V", m_id); + QJNIObjectPrivate listener(QtMediaRecorderListenerClassName, "(J)V", m_id); m_mediaRecorder.callMethod<void>("setOnErrorListener", "(Landroid/media/MediaRecorder$OnErrorListener;)V", listener.object()); @@ -339,24 +339,20 @@ void AndroidMediaRecorder::setOutputFile(const QString &path) } } -static JNINativeMethod methods[] = { - {"notifyError", "(JII)V", (void *)notifyError}, - {"notifyInfo", "(JII)V", (void *)notifyInfo} -}; - bool AndroidMediaRecorder::initJNI(JNIEnv *env) { - jclass clazz = env->FindClass("org/qtproject/qt5/android/multimedia/QtMediaRecorderListener"); - if (env->ExceptionCheck()) - env->ExceptionClear(); + jclass clazz = QJNIEnvironmentPrivate::findClass(QtMediaRecorderListenerClassName, + env); + + static const JNINativeMethod methods[] = { + {"notifyError", "(JII)V", (void *)notifyError}, + {"notifyInfo", "(JII)V", (void *)notifyInfo} + }; - if (clazz) { - g_qtMediaRecorderListenerClass = static_cast<jclass>(env->NewGlobalRef(clazz)); - if (env->RegisterNatives(g_qtMediaRecorderListenerClass, - methods, - sizeof(methods) / sizeof(methods[0])) < 0) { + if (clazz && env->RegisterNatives(clazz, + methods, + sizeof(methods) / sizeof(methods[0])) != JNI_OK) { return false; - } } return true; diff --git a/src/plugins/android/src/wrappers/jni/androidsurfacetexture.cpp b/src/plugins/android/src/wrappers/jni/androidsurfacetexture.cpp index 261a644d5..7cdab0097 100644 --- a/src/plugins/android/src/wrappers/jni/androidsurfacetexture.cpp +++ b/src/plugins/android/src/wrappers/jni/androidsurfacetexture.cpp @@ -37,7 +37,7 @@ QT_BEGIN_NAMESPACE -static jclass g_qtSurfaceTextureListenerClass = 0; +static const char QtSurfaceTextureListenerClassName[] = "org/qtproject/qt5/android/multimedia/QtSurfaceTextureListener"; static QMap<int, AndroidSurfaceTexture*> g_objectMap; // native method for QtSurfaceTexture.java @@ -70,7 +70,7 @@ AndroidSurfaceTexture::AndroidSurfaceTexture(unsigned int texName) if (m_surfaceTexture.isValid()) g_objectMap.insert(int(texName), this); - QJNIObjectPrivate listener(g_qtSurfaceTextureListenerClass, "(I)V", jint(texName)); + QJNIObjectPrivate listener(QtSurfaceTextureListenerClassName, "(I)V", jint(texName)); m_surfaceTexture.callMethod<void>("setOnFrameAvailableListener", "(Landroid/graphics/SurfaceTexture$OnFrameAvailableListener;)V", listener.object()); @@ -144,27 +144,23 @@ jobject AndroidSurfaceTexture::surfaceHolder() return m_surfaceHolder.object(); } -static JNINativeMethod methods[] = { - {"notifyFrameAvailable", "(I)V", (void *)notifyFrameAvailable} -}; - bool AndroidSurfaceTexture::initJNI(JNIEnv *env) { // SurfaceTexture is available since API 11. if (QtAndroidPrivate::androidSdkVersion() < 11) return false; - jclass clazz = env->FindClass("org/qtproject/qt5/android/multimedia/QtSurfaceTextureListener"); - if (env->ExceptionCheck()) - env->ExceptionClear(); + jclass clazz = QJNIEnvironmentPrivate::findClass(QtSurfaceTextureListenerClassName, + env); - if (clazz) { - g_qtSurfaceTextureListenerClass = static_cast<jclass>(env->NewGlobalRef(clazz)); - if (env->RegisterNatives(g_qtSurfaceTextureListenerClass, - methods, - sizeof(methods) / sizeof(methods[0])) < 0) { - return false; - } + static const JNINativeMethod methods[] = { + {"notifyFrameAvailable", "(I)V", (void *)notifyFrameAvailable} + }; + + if (clazz && env->RegisterNatives(clazz, + methods, + sizeof(methods) / sizeof(methods[0])) != JNI_OK) { + return false; } return true; diff --git a/src/plugins/qnx/mediaplayer/mmrendererplayervideorenderercontrol.cpp b/src/plugins/qnx/mediaplayer/mmrendererplayervideorenderercontrol.cpp index e48cba794..f95cd8a99 100644 --- a/src/plugins/qnx/mediaplayer/mmrendererplayervideorenderercontrol.cpp +++ b/src/plugins/qnx/mediaplayer/mmrendererplayervideorenderercontrol.cpp @@ -70,7 +70,7 @@ void MmRendererPlayerVideoRendererControl::setSurface(QAbstractVideoSurface *sur m_surface = QPointer<QAbstractVideoSurface>(surface); if (QOpenGLContext::currentContext()) m_windowGrabber->checkForEglImageExtension(); - else + else if (m_surface) m_surface->setProperty("_q_GLThreadCallback", QVariant::fromValue<QObject*>(this)); } diff --git a/src/plugins/wmf/player/mfplayersession.cpp b/src/plugins/wmf/player/mfplayersession.cpp index 08baa779a..a01c0b92c 100644 --- a/src/plugins/wmf/player/mfplayersession.cpp +++ b/src/plugins/wmf/player/mfplayersession.cpp @@ -242,14 +242,19 @@ void MFPlayerSession::handleSourceError(long hr) void MFPlayerSession::handleMediaSourceReady() { - if (QMediaPlayer::LoadingMedia != m_status || !m_sourceResolver) + if (QMediaPlayer::LoadingMedia != m_status || !m_sourceResolver || m_sourceResolver != sender()) return; #ifdef DEBUG_MEDIAFOUNDATION qDebug() << "handleMediaSourceReady"; #endif HRESULT hr = S_OK; - IMFPresentationDescriptor* sourcePD; IMFMediaSource* mediaSource = m_sourceResolver->mediaSource(); + + DWORD dwCharacteristics = 0; + mediaSource->GetCharacteristics(&dwCharacteristics); + emit seekableUpdate(MFMEDIASOURCE_CAN_SEEK & dwCharacteristics); + + IMFPresentationDescriptor* sourcePD; hr = mediaSource->CreatePresentationDescriptor(&sourcePD); if (SUCCEEDED(hr)) { m_duration = 0; @@ -1630,10 +1635,6 @@ void MFPlayerSession::handleSessionEvent(IMFMediaEvent *sessionEvent) } } - DWORD dwCharacteristics = 0; - m_sourceResolver->mediaSource()->GetCharacteristics(&dwCharacteristics); - emit seekableUpdate(MFMEDIASOURCE_CAN_SEEK & dwCharacteristics); - // Topology is resolved and successfuly set, this happens only after loading a new media. // Make sure we always start the media from the beginning m_varStart.vt = VT_I8; |