OSDN Git Service

Add Plugin API for a video framerate callback.
authorDerek Sollenberger <djsollen@google.com>
Thu, 8 Sep 2011 15:25:50 +0000 (11:25 -0400)
committerDerek Sollenberger <djsollen@google.com>
Thu, 8 Sep 2011 15:25:50 +0000 (11:25 -0400)
bug: 5239378
Change-Id: I5f7d33302d5a40f58ec12a3c0be63cb51d4ffc75

Source/WebCore/platform/graphics/android/MediaLayer.cpp
Source/WebCore/platform/graphics/android/MediaLayer.h
Source/WebCore/platform/graphics/android/MediaListener.h
Source/WebCore/platform/graphics/android/MediaTexture.cpp
Source/WebCore/platform/graphics/android/MediaTexture.h
Source/WebKit/android/plugins/ANPVideoInterface.cpp
Source/WebKit/android/plugins/ANPVideo_npapi.h

index 5625bbe..85fb92f 100644 (file)
@@ -137,6 +137,13 @@ void MediaLayer::releaseNativeWindowForVideo(ANativeWindow* window)
         m_videoTexture->releaseNativeWindow();
 }
 
+void MediaLayer::setFramerateCallback(const ANativeWindow* window, FramerateCallbackProc callback)
+{
+    if (window != m_videoTexture->getNativeWindow())
+        return;
+     m_videoTexture->setFramerateCallback(callback);
+}
+
 } // namespace WebCore
 
 #endif // USE(ACCELERATED_COMPOSITING)
index 6d08ed6..cd15d9e 100644 (file)
@@ -53,6 +53,7 @@ public:
     ANativeWindow* acquireNativeWindowForVideo();
     void setWindowDimensionsForVideo(const ANativeWindow* window, const SkRect& dimensions);
     void releaseNativeWindowForVideo(ANativeWindow* window);
+    void setFramerateCallback(const ANativeWindow* window, FramerateCallbackProc callback);
 
 private:
     bool m_isCopy;
index 0a85574..5fcbbb2 100644 (file)
 #if USE(ACCELERATED_COMPOSITING)
 
 #include <gui/SurfaceTexture.h>
+#include <gui/SurfaceTextureClient.h>
 #include <jni.h>
 #include <JNIUtility.h>
+#include "MediaTexture.h"
 #include "WebCoreJni.h"
 
 #ifdef DEBUG
@@ -44,10 +46,15 @@ namespace WebCore {
 class MediaListener : public android::SurfaceTexture::FrameAvailableListener {
 
 public:
-    MediaListener(jobject weakWebViewRef)
+    MediaListener(jobject weakWebViewRef,
+                  const sp<android::SurfaceTexture>& surfaceTexture,
+                  const sp<ANativeWindow>& nativeWindow)
         : m_weakWebViewRef(weakWebViewRef)
         , m_postInvalMethod(0)
         , m_frameAvailable(false)
+        , m_surfaceTexture(surfaceTexture)
+        , m_nativeWindow(nativeWindow)
+        , m_framerateCallback(0)
     {
         if (!m_weakWebViewRef)
             return;
@@ -75,15 +82,20 @@ public:
         if (!m_frameAvailable) {
             m_frameAvailable = true;
         }
+        if (m_framerateCallback)
+            m_framerateCallback(m_nativeWindow.get(), m_surfaceTexture->getTimestamp());
     }
 
-    void resetFrameAvailable() { m_frameAvailable = false; }
     bool isFrameAvailable() { return m_frameAvailable; }
+    void setFramerateCallback(FramerateCallbackProc callback) { m_framerateCallback = callback; }
 
 private:
     jobject m_weakWebViewRef;
     jmethodID m_postInvalMethod;
     bool m_frameAvailable;
+    sp<android::SurfaceTexture> m_surfaceTexture;
+    sp<ANativeWindow> m_nativeWindow;
+    FramerateCallbackProc m_framerateCallback;
 };
 
 } // namespace WebCore
index eb143a4..0de7dfa 100644 (file)
@@ -61,7 +61,6 @@ MediaTexture::MediaTexture(jobject webViewRef) : android::LightRefBase<MediaText
     m_dimensions.setEmpty();
     m_newWindowRequest = false;
     m_newWindowReady = false;
-    m_mediaListener = new MediaListener(m_weakWebViewRef);
 }
 
 MediaTexture::~MediaTexture()
@@ -91,7 +90,9 @@ void MediaTexture::initNativeWindowIfNeeded()
         m_surfaceTextureClient = new android::SurfaceTextureClient(m_surfaceTexture);
 
         //setup callback
-        m_mediaListener->resetFrameAvailable();
+        m_mediaListener = new MediaListener(m_weakWebViewRef,
+                                            m_surfaceTexture,
+                                            m_surfaceTextureClient);
         m_surfaceTexture->setFrameAvailableListener(m_mediaListener);
 
         m_newWindowRequest = false;
@@ -210,6 +211,7 @@ void MediaTexture::releaseNativeWindow()
         m_surfaceTexture->setFrameAvailableListener(0);
 
     // clear the strong pointer references
+    m_mediaListener.clear();
     m_surfaceTextureClient.clear();
     m_surfaceTexture.clear();
 }
@@ -220,6 +222,12 @@ void MediaTexture::setDimensions(const SkRect& dimensions)
     m_dimensions = dimensions;
 }
 
+void MediaTexture::setFramerateCallback(FramerateCallbackProc callback)
+{
+    android::Mutex::Autolock lock(m_mediaLock);
+    m_mediaListener->setFramerateCallback(callback);
+}
+
 } // namespace WebCore
 
 #endif // USE(ACCELERATED_COMPOSITING)
index c617264..d5ecd7b 100644 (file)
@@ -31,6 +31,8 @@ namespace android {
 
 namespace WebCore {
 
+typedef void (*FramerateCallbackProc)(ANativeWindow* window, int64_t timestamp);
+
 class MediaListener;
 
 class MediaTexture : public android::LightRefBase<MediaTexture> {
@@ -47,6 +49,7 @@ public:
     ANativeWindow* getNativeWindow();
     void releaseNativeWindow();
     void setDimensions(const SkRect& dimensions);
+    void setFramerateCallback(FramerateCallbackProc callback);
 
 
 private:
index 8eb9846..f39d0b1 100644 (file)
@@ -70,6 +70,14 @@ static void anp_releaseNativeWindow(NPP instance, ANativeWindow* window) {
     mediaLayer->releaseNativeWindowForVideo(window);
 }
 
+static void anp_setFramerateCallback(NPP instance, const ANativeWindow* window, ANPVideoFrameCallbackProc callback) {
+    WebCore::MediaLayer* mediaLayer = mediaLayerForInstance(instance);
+    if (!mediaLayer)
+        return;
+
+    mediaLayer->setFramerateCallback(window, callback);
+}
+
 ///////////////////////////////////////////////////////////////////////////////
 
 #define ASSIGN(obj, name)   (obj)->name = anp_##name
@@ -81,3 +89,11 @@ void ANPVideoInterfaceV0_Init(ANPInterface* value) {
     ASSIGN(i, setWindowDimensions);
     ASSIGN(i, releaseNativeWindow);
 }
+
+void ANPVideoInterfaceV1_Init(ANPInterface* value) {
+    // initialize the functions from the previous interface
+    ANPVideoInterfaceV0_Init(value);
+    // add any new functions or override existing functions
+    ANPVideoInterfaceV1* i = reinterpret_cast<ANPVideoInterfaceV1*>(value);
+    ASSIGN(i, setFramerateCallback);
+}
index 3d234f2..02e8392 100644 (file)
@@ -58,4 +58,19 @@ struct ANPVideoInterfaceV0 : ANPInterface {
     void (*releaseNativeWindow)(NPP instance, ANativeWindow* window);
 };
 
+/** Called to notify the plugin that a video frame has been composited by the
+ *  browser for display.  This will be called in a separate thread and as such
+ *  you cannot call releaseNativeWindow from the callback.
+ *
+ *  The timestamp is in nanoseconds, and is monotonically increasing.
+ */
+typedef void (*ANPVideoFrameCallbackProc)(ANativeWindow* window, int64_t timestamp);
+
+struct ANPVideoInterfaceV1 : ANPVideoInterfaceV0 {
+    /** Set a callback to be notified when an ANativeWindow is composited by
+     *  the browser.
+     */
+    void (*setFramerateCallback)(NPP instance, const ANativeWindow* window, ANPVideoFrameCallbackProc);
+};
+
 #endif // ANPVideo_npapi_h