1227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks/* 2227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Copyright (C) 2011 The Android Open Source Project 3227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * 4227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Licensed under the Apache License, Version 2.0 (the "License"); 5227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * you may not use this file except in compliance with the License. 6227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * You may obtain a copy of the License at 7227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * 8227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * http://www.apache.org/licenses/LICENSE-2.0 9227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * 10227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Unless required by applicable law or agreed to in writing, software 11227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * distributed under the License is distributed on an "AS IS" BASIS, 12227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * See the License for the specific language governing permissions and 14227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * limitations under the License. 15227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks */ 16227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 17227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendrickspackage androidx.media.filterfw; 18227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 19227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.graphics.Bitmap; 20227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.opengl.GLES11Ext; 21227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.opengl.GLES20; 22227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 23227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport java.nio.ByteBuffer; 24227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 25227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendrickspublic class TextureSource { 26227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 27227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks private int mTexId; 28227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks private int mTarget; 29227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks private boolean mIsOwner; 30227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks private boolean mIsAllocated = false; 31227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 32227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public static TextureSource fromTexture(int texId, int target) { 33227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return new TextureSource(texId, target, false); 34227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 35227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 36227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public static TextureSource fromTexture(int texId) { 37227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return new TextureSource(texId, GLES20.GL_TEXTURE_2D, false); 38227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 39227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 40227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public static TextureSource newTexture() { 41227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return new TextureSource(GLToolbox.generateTexture(), GLES20.GL_TEXTURE_2D, true); 42227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 43227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 44227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public static TextureSource newExternalTexture() { 45227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return new TextureSource(GLToolbox.generateTexture(), 46227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 47227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks true); 48227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 49227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 50227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public int getTextureId() { 51227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return mTexId; 52227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 53227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 54227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public int getTarget() { 55227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return mTarget; 56227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 57227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 58227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public void bind() { 59227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks GLES20.glBindTexture(mTarget, mTexId); 60227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks GLToolbox.checkGlError("glBindTexture"); 61227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 62227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 63227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public void allocate(int width, int height) { 64227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks //Log.i("TextureSource", "Allocating empty texture " + mTexId + ": " + width + "x" + height + "."); 65227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks GLToolbox.allocateTexturePixels(mTexId, mTarget, width, height); 66227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mIsAllocated = true; 67227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 68227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 69227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public void allocateWithPixels(ByteBuffer pixels, int width, int height) { 70227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks //Log.i("TextureSource", "Uploading pixels to texture " + mTexId + ": " + width + "x" + height + "."); 71227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks GLToolbox.setTexturePixels(mTexId, mTarget, pixels, width, height); 72227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mIsAllocated = true; 73227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 74227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 75227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public void allocateWithBitmapPixels(Bitmap bitmap) { 76227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks //Log.i("TextureSource", "Uploading pixels to texture " + mTexId + "!"); 77227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks GLToolbox.setTexturePixels(mTexId, mTarget, bitmap); 78227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mIsAllocated = true; 79227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 80227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 81227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public void generateMipmaps() { 82227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks GLES20.glBindTexture(mTarget, mTexId); 83227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks GLES20.glTexParameteri(mTarget, 84227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks GLES20.GL_TEXTURE_MIN_FILTER, 85227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks GLES20.GL_LINEAR_MIPMAP_LINEAR); 86227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks GLES20.glGenerateMipmap(mTarget); 87227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks GLES20.glBindTexture(mTarget, 0); 88227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 89227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 90227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public void setParameter(int parameter, int value) { 91227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks GLES20.glBindTexture(mTarget, mTexId); 92227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks GLES20.glTexParameteri(mTarget, parameter, value); 93227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks GLES20.glBindTexture(mTarget, 0); 94227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 95227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 96227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks /** 97227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * @hide 98227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks */ 99227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public void release() { 100227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks if (GLToolbox.isTexture(mTexId) && mIsOwner) { 101227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks GLToolbox.deleteTexture(mTexId); 102227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 103227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mTexId = GLToolbox.textureNone(); 104227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 105227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 106227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks @Override 107227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public String toString() { 108227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return "TextureSource(id=" + mTexId + ", target=" + mTarget + ")"; 109227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 110227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 111227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks boolean isAllocated() { 112227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return mIsAllocated; 113227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 114227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 115227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks private TextureSource(int texId, int target, boolean isOwner) { 116227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mTexId = texId; 117227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mTarget = target; 118227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mIsOwner = isOwner; 119227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 120227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks} 121227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 122