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