summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/graphics/android/MediaTexture.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/platform/graphics/android/MediaTexture.cpp')
-rw-r--r--WebCore/platform/graphics/android/MediaTexture.cpp137
1 files changed, 137 insertions, 0 deletions
diff --git a/WebCore/platform/graphics/android/MediaTexture.cpp b/WebCore/platform/graphics/android/MediaTexture.cpp
new file mode 100644
index 0000000..71a4a0e
--- /dev/null
+++ b/WebCore/platform/graphics/android/MediaTexture.cpp
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "config.h"
+#include "MediaTexture.h"
+#include "TilesManager.h"
+
+#if USE(ACCELERATED_COMPOSITING)
+
+#include <android/native_window.h>
+#include <gui/SurfaceTexture.h>
+#include <gui/SurfaceTextureClient.h>
+#include <wtf/CurrentTime.h>
+
+#define LAYER_DEBUG
+#undef LAYER_DEBUG
+
+#ifdef DEBUG
+
+#include <cutils/log.h>
+#include <wtf/text/CString.h>
+
+#undef XLOG
+#define XLOG(...) android_printLog(ANDROID_LOG_DEBUG, "MediaTexture", __VA_ARGS__)
+
+#else
+
+#undef XLOG
+#define XLOG(...)
+
+#endif // DEBUG
+
+namespace WebCore {
+
+VideoTexture::VideoTexture()
+{
+ m_textureId = 0;
+ m_dimensions.setEmpty();
+ m_newWindowRequest = false;
+ m_newWindowReady = false;
+}
+
+VideoTexture::~VideoTexture()
+{
+ releaseNativeWindow();
+ if (m_textureId)
+ glDeleteTextures(1, &m_textureId);
+}
+
+void VideoTexture::initNativeWindowIfNeeded()
+{
+ android::Mutex::Autolock lock(m_videoLock);
+
+ if(!m_newWindowRequest)
+ return;
+
+ // reuse an existing texture if possible
+ if (!m_textureId)
+ glGenTextures(1, &m_textureId);
+
+ m_surfaceTexture = new android::SurfaceTexture(m_textureId);
+ m_surfaceTextureClient = new android::SurfaceTextureClient(m_surfaceTexture);
+ m_newWindowRequest = false;
+ m_newWindowReady = true;
+ m_newVideoRequestCond.signal();
+}
+
+void VideoTexture::drawVideo(TransformationMatrix matrix)
+{
+ android::Mutex::Autolock lock(m_videoLock);
+
+ if(!m_surfaceTexture.get() || m_dimensions.isEmpty())
+ return;
+
+ m_surfaceTexture->updateTexImage();
+ TilesManager::instance()->shader()->drawLayerQuad(matrix, m_dimensions, m_textureId, 1.0f);
+}
+
+ANativeWindow* VideoTexture::requestNewWindow()
+{
+ android::Mutex::Autolock lock(m_videoLock);
+
+ // the window was not ready before the timeout so return it this time
+ if (m_newWindowReady) {
+ m_newWindowReady = false;
+ return m_surfaceTextureClient.get();
+ }
+ // we only allow for one texture, so if one already exists return null
+ else if (m_surfaceTextureClient.get()) {
+ return 0;
+ }
+
+ m_newWindowRequest = true;
+ //block until the request can be fulfilled or we time out
+ m_newVideoRequestCond.waitRelative(m_videoLock, 1000000000); // 1 sec
+
+ if (m_surfaceTextureClient.get())
+ m_newWindowReady = false;
+
+ return m_surfaceTextureClient.get();
+}
+
+ANativeWindow* VideoTexture::getNativeWindow()
+{
+ android::Mutex::Autolock lock(m_videoLock);
+ return m_surfaceTextureClient.get();
+}
+
+void VideoTexture::releaseNativeWindow()
+{
+ android::Mutex::Autolock lock(m_videoLock);
+ m_dimensions.setEmpty();
+ m_surfaceTextureClient.clear();
+ m_surfaceTexture.clear();
+}
+
+void VideoTexture::setDimensions(const SkRect& dimensions)
+{
+ android::Mutex::Autolock lock(m_videoLock);
+ m_dimensions = dimensions;
+}
+
+} // namespace WebCore
+
+#endif // USE(ACCELERATED_COMPOSITING)