1572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams/* 2572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * Copyright (C) 2013 The Android Open Source Project 3572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * 4572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * you may not use this file except in compliance with the License. 6572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * You may obtain a copy of the License at 7572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * 8572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 9572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * 10572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * Unless required by applicable law or agreed to in writing, software 11572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * See the License for the specific language governing permissions and 14572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * limitations under the License. 15572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams */ 16572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 17572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samspackage com.android.rs.livepreview; 18572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 19572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.app.Activity; 20572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.graphics.Bitmap; 21572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.graphics.BitmapFactory; 22572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.graphics.Canvas; 23572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.os.Bundle; 24572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.graphics.SurfaceTexture; 25572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.Allocation; 26572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.Matrix3f; 27572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.RenderScript; 28572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.util.Log; 29572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.view.TextureView; 304056102a0400c892d20121b078d9d5d979539a6fJason Samsimport android.view.Surface; 31572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.view.View; 32572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 33572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.content.res.Resources; 34572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.renderscript.*; 35572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 36572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsimport android.graphics.Bitmap; 37572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 38572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samspublic class RsYuv implements TextureView.SurfaceTextureListener 39572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams{ 40572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private int mHeight; 41572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private int mWidth; 42572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private RenderScript mRS; 43572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private Allocation mAllocationOut; 44572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private Allocation mAllocationIn; 45572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private ScriptC_yuv mScript; 46572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private ScriptIntrinsicYuvToRGB mYuv; 47572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private boolean mHaveSurface; 484056102a0400c892d20121b078d9d5d979539a6fJason Sams private Surface mSurface; 49572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private ScriptGroup mGroup; 50572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 51572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams RsYuv(RenderScript rs) { 52572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mRS = rs; 53572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mScript = new ScriptC_yuv(mRS); 54572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mYuv = ScriptIntrinsicYuvToRGB.create(rs, Element.RGBA_8888(mRS)); 55572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 56572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 57572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams void setupSurface() { 58572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams if (mAllocationOut != null) { 594056102a0400c892d20121b078d9d5d979539a6fJason Sams mAllocationOut.setSurface(mSurface); 60572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 61572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams if (mSurface != null) { 62572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mHaveSurface = true; 63572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } else { 64572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mHaveSurface = false; 65572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 66572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 67572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 68572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams void reset(int width, int height) { 69572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams if (mAllocationOut != null) { 70572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mAllocationOut.destroy(); 71572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 72572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 73572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams android.util.Log.v("cpa", "reset " + width + ", " + height); 74572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mHeight = height; 75572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mWidth = width; 76572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mScript.invoke_setSize(mWidth, mHeight); 77572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 78572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams Type.Builder tb = new Type.Builder(mRS, Element.RGBA_8888(mRS)); 79572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams tb.setX(mWidth); 80572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams tb.setY(mHeight); 81572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams Type t = tb.create(); 82572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mAllocationOut = Allocation.createTyped(mRS, t, Allocation.USAGE_SCRIPT | 83572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams Allocation.USAGE_IO_OUTPUT); 84572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 85572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 86572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams tb = new Type.Builder(mRS, Element.createPixel(mRS, Element.DataType.UNSIGNED_8, Element.DataKind.PIXEL_YUV)); 87572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams tb.setX(mWidth); 88572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams tb.setY(mHeight); 89572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams tb.setYuvFormat(android.graphics.ImageFormat.NV21); 90572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mAllocationIn = Allocation.createTyped(mRS, tb.create(), Allocation.USAGE_SCRIPT); 91572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mYuv.setInput(mAllocationIn); 92572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams setupSurface(); 93572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 94572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 95572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams ScriptGroup.Builder b = new ScriptGroup.Builder(mRS); 96572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams b.addKernel(mScript.getKernelID_root()); 97572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams b.addKernel(mYuv.getKernelID()); 98572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams b.addConnection(t, mYuv.getKernelID(), mScript.getKernelID_root()); 99572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mGroup = b.create(); 100572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 101572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 102572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams public int getWidth() { 103572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams return mWidth; 104572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 105572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams public int getHeight() { 106572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams return mHeight; 107572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 108572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 109572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private long mTiming[] = new long[50]; 110572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams private int mTimingSlot = 0; 111572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 112572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams void execute(byte[] yuv) { 113572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mAllocationIn.copyFrom(yuv); 114572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams if (mHaveSurface) { 115572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mGroup.setOutput(mScript.getKernelID_root(), mAllocationOut); 116572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams mGroup.execute(); 117572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 118572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams //mYuv.forEach(mAllocationOut); 119572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams //mScript.forEach_root(mAllocationOut, mAllocationOut); 120da26caa6eecf945ddcb4f6d65b250cbd5ba3a7fdJason Sams mAllocationOut.ioSend(); 121572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 122572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 123572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 124572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 125572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 126572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams @Override 127572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { 128572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams android.util.Log.v("cpa", "onSurfaceTextureAvailable " + surface); 1294056102a0400c892d20121b078d9d5d979539a6fJason Sams mSurface = new Surface(surface); 130572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams setupSurface(); 131572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 132572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 133572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams @Override 134572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { 135572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams android.util.Log.v("cpa", "onSurfaceTextureSizeChanged " + surface); 1364056102a0400c892d20121b078d9d5d979539a6fJason Sams mSurface = new Surface(surface); 137572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams setupSurface(); 138572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 139572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 140572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams @Override 141572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { 142572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams android.util.Log.v("cpa", "onSurfaceTextureDestroyed " + surface); 1434056102a0400c892d20121b078d9d5d979539a6fJason Sams mSurface = null; 144572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams setupSurface(); 145572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams return true; 146572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 147572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 148572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams @Override 149572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams public void onSurfaceTextureUpdated(SurfaceTexture surface) { 150572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 151572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams} 152572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 153