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