SurfaceTextureScreenNail.java revision b8be1e0ad76b6abc0da7ead39f7a9811195d001e
1b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang/* 2b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang * Copyright (C) 2012 The Android Open Source Project 3b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang * 4b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang * Licensed under the Apache License, Version 2.0 (the "License"); 5b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang * you may not use this file except in compliance with the License. 6b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang * You may obtain a copy of the License at 7b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang * 8b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang * http://www.apache.org/licenses/LICENSE-2.0 9b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang * 10b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang * Unless required by applicable law or agreed to in writing, software 11b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang * distributed under the License is distributed on an "AS IS" BASIS, 12b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang * See the License for the specific language governing permissions and 14b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang * limitations under the License. 15b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang */ 16b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 17b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Changpackage com.android.gallery3d.ui; 18b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 19b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Changimport android.graphics.RectF; 20b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Changimport android.graphics.SurfaceTexture; 21b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Changimport android.opengl.GLES11Ext; 22b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Changimport android.util.Log; 23b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 24b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Changimport com.android.gallery3d.ui.GLCanvas; 25b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Changimport com.android.gallery3d.ui.ScreenNail; 26b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Changimport com.android.gallery3d.ui.ExtTexture; 27b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 28b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Changpublic abstract class SurfaceTextureScreenNail implements ScreenNail, 29b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang SurfaceTexture.OnFrameAvailableListener { 30b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang private static final String TAG = "SurfaceTextureScreenNail"; 31b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang private ExtTexture mExtTexture; 32b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang private SurfaceTexture mSurfaceTexture; 33b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang private int mWidth, mHeight; 34b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang private float[] mTransform = new float[16]; 35b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang private boolean mHasTexture = false; 36b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 37b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang public SurfaceTextureScreenNail() { 38b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 39b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 40b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang public void acquireSurfaceTexture() { 41b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mExtTexture = new ExtTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES); 42b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mExtTexture.setSize(mWidth, mHeight); 43b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mSurfaceTexture = new SurfaceTexture(mExtTexture.getId()); 44b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mSurfaceTexture.setOnFrameAvailableListener(this); 45b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang synchronized (this) { 46b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mHasTexture = true; 47b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 48b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 49b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 50b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang public SurfaceTexture getSurfaceTexture() { 51b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang return mSurfaceTexture; 52b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 53b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 54b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang public void releaseSurfaceTexture() { 55b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang synchronized (this) { 56b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mHasTexture = false; 57b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 58b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mExtTexture.recycle(); 59b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mExtTexture = null; 60b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mSurfaceTexture.release(); 61b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mSurfaceTexture = null; 62b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 63b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 64b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang public void setSize(int width, int height) { 65b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mWidth = width; 66b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mHeight = height; 67b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 68b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 69b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang @Override 70b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang public int getWidth() { 71b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang return mWidth; 72b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 73b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 74b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang @Override 75b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang public int getHeight() { 76b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang return mHeight; 77b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 78b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 79b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang @Override 80b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang public int getRotation() { 81b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang return 0; 82b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 83b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 84b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang @Override 85b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang public void draw(GLCanvas canvas, int x, int y, int width, int height) { 86b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang synchronized (this) { 87b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang if (!mHasTexture) return; 88b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mSurfaceTexture.updateTexImage(); 89b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang mSurfaceTexture.getTransformMatrix(mTransform); 90b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 91b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang // Flip vertically. 92b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang canvas.save(GLCanvas.SAVE_FLAG_MATRIX); 93b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang int cx = x + width / 2; 94b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang int cy = y + height / 2; 95b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang canvas.translate(cx, cy); 96b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang canvas.scale(1, -1, 1); 97b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang canvas.translate(-cx, -cy); 98b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang canvas.drawTexture(mExtTexture, mTransform, x, y, width, height); 99b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang canvas.restore(); 100b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 101b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 102b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 103b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang @Override 104b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang public void draw(GLCanvas canvas, RectF source, RectF dest) { 105b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang throw new UnsupportedOperationException(); 106b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang } 107b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 108b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang @Override 109b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang abstract public void noDraw(); 110b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 111b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang @Override 112b8be1e0ad76b6abc0da7ead39f7a9811195d001eChih-Chung Chang abstract public void recycle(); 113b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang 114b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang @Override 115b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang abstract public void onFrameAvailable(SurfaceTexture surfaceTexture); 116b29a27f475a2c449abdda8d4e03d30914feed8c6Chih-Chung Chang} 117