1/* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.rs.livepreview; 18 19import android.app.Activity; 20import android.graphics.Bitmap; 21import android.graphics.BitmapFactory; 22import android.graphics.Canvas; 23import android.os.Bundle; 24import android.graphics.SurfaceTexture; 25import android.renderscript.Allocation; 26import android.renderscript.Matrix3f; 27import android.renderscript.RenderScript; 28import android.util.Log; 29import android.view.TextureView; 30import android.view.Surface; 31import android.view.View; 32 33import android.content.res.Resources; 34import android.renderscript.*; 35 36import android.graphics.Bitmap; 37 38public class RsYuv implements TextureView.SurfaceTextureListener 39{ 40 private int mHeight; 41 private int mWidth; 42 private RenderScript mRS; 43 private Allocation mAllocationOut; 44 private Allocation mAllocationIn; 45 private ScriptC_yuv mScript; 46 private ScriptIntrinsicYuvToRGB mYuv; 47 private boolean mHaveSurface; 48 private Surface mSurface; 49 private ScriptGroup mGroup; 50 51 RsYuv(RenderScript rs) { 52 mRS = rs; 53 mScript = new ScriptC_yuv(mRS); 54 mYuv = ScriptIntrinsicYuvToRGB.create(rs, Element.RGBA_8888(mRS)); 55 } 56 57 void setupSurface() { 58 if (mAllocationOut != null) { 59 mAllocationOut.setSurface(mSurface); 60 } 61 if (mSurface != null) { 62 mHaveSurface = true; 63 } else { 64 mHaveSurface = false; 65 } 66 } 67 68 void reset(int width, int height) { 69 if (mAllocationOut != null) { 70 mAllocationOut.destroy(); 71 } 72 73 android.util.Log.v("cpa", "reset " + width + ", " + height); 74 mHeight = height; 75 mWidth = width; 76 mScript.invoke_setSize(mWidth, mHeight); 77 78 Type.Builder tb = new Type.Builder(mRS, Element.RGBA_8888(mRS)); 79 tb.setX(mWidth); 80 tb.setY(mHeight); 81 Type t = tb.create(); 82 mAllocationOut = Allocation.createTyped(mRS, t, Allocation.USAGE_SCRIPT | 83 Allocation.USAGE_IO_OUTPUT); 84 85 86 tb = new Type.Builder(mRS, Element.createPixel(mRS, Element.DataType.UNSIGNED_8, Element.DataKind.PIXEL_YUV)); 87 tb.setX(mWidth); 88 tb.setY(mHeight); 89 tb.setYuvFormat(android.graphics.ImageFormat.NV21); 90 mAllocationIn = Allocation.createTyped(mRS, tb.create(), Allocation.USAGE_SCRIPT); 91 mYuv.setInput(mAllocationIn); 92 setupSurface(); 93 94 95 ScriptGroup.Builder b = new ScriptGroup.Builder(mRS); 96 b.addKernel(mScript.getKernelID_root()); 97 b.addKernel(mYuv.getKernelID()); 98 b.addConnection(t, mYuv.getKernelID(), mScript.getKernelID_root()); 99 mGroup = b.create(); 100 } 101 102 public int getWidth() { 103 return mWidth; 104 } 105 public int getHeight() { 106 return mHeight; 107 } 108 109 private long mTiming[] = new long[50]; 110 private int mTimingSlot = 0; 111 112 void execute(byte[] yuv) { 113 mAllocationIn.copyFrom(yuv); 114 if (mHaveSurface) { 115 mGroup.setOutput(mScript.getKernelID_root(), mAllocationOut); 116 mGroup.execute(); 117 118 //mYuv.forEach(mAllocationOut); 119 //mScript.forEach_root(mAllocationOut, mAllocationOut); 120 mAllocationOut.ioSend(); 121 } 122 } 123 124 125 126 @Override 127 public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { 128 android.util.Log.v("cpa", "onSurfaceTextureAvailable " + surface); 129 mSurface = new Surface(surface); 130 setupSurface(); 131 } 132 133 @Override 134 public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { 135 android.util.Log.v("cpa", "onSurfaceTextureSizeChanged " + surface); 136 mSurface = new Surface(surface); 137 setupSurface(); 138 } 139 140 @Override 141 public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { 142 android.util.Log.v("cpa", "onSurfaceTextureDestroyed " + surface); 143 mSurface = null; 144 setupSurface(); 145 return true; 146 } 147 148 @Override 149 public void onSurfaceTextureUpdated(SurfaceTexture surface) { 150 } 151} 152 153