ImageProcessingActivity.java revision 761d3d0df785761bb442c64793cc15eafa9171fd
1/*
2 * Copyright (C) 2012 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.image;
18
19import android.app.Activity;
20import android.os.Bundle;
21import android.graphics.BitmapFactory;
22import android.graphics.Bitmap;
23import android.graphics.Canvas;
24import android.renderscript.ScriptC;
25import android.renderscript.RenderScript;
26import android.renderscript.Type;
27import android.renderscript.Allocation;
28import android.renderscript.Element;
29import android.renderscript.Script;
30import android.view.SurfaceView;
31import android.view.SurfaceHolder;
32import android.widget.AdapterView;
33import android.widget.ArrayAdapter;
34import android.widget.ImageView;
35import android.widget.SeekBar;
36import android.widget.Spinner;
37import android.widget.TextView;
38import android.view.View;
39import android.util.Log;
40import java.lang.Math;
41
42import android.os.Environment;
43import android.app.Instrumentation;
44import android.content.Context;
45import android.content.Intent;
46import android.net.Uri;
47import java.io.BufferedWriter;
48import java.io.File;
49import java.io.FileWriter;
50import java.io.IOException;
51
52public class ImageProcessingActivity extends Activity
53                                       implements SeekBar.OnSeekBarChangeListener {
54    private final String TAG = "Img";
55    private final String RESULT_FILE = "image_processing_result.csv";
56
57    Bitmap mBitmapIn;
58    Bitmap mBitmapOut;
59    String mTestNames[];
60
61    private SeekBar mBar1;
62    private SeekBar mBar2;
63    private SeekBar mBar3;
64    private SeekBar mBar4;
65    private SeekBar mBar5;
66    private TextView mText1;
67    private TextView mText2;
68    private TextView mText3;
69    private TextView mText4;
70    private TextView mText5;
71
72    private float mSaturation = 1.0f;
73
74    private TextView mBenchmarkResult;
75    private Spinner mTestSpinner;
76
77    private SurfaceView mSurfaceView;
78    private ImageView mDisplayView;
79
80    private boolean mDoingBenchmark;
81
82    private TestBase mTest;
83
84
85    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
86        if (fromUser) {
87
88            if (seekBar == mBar1) {
89                mTest.onBar1Changed(progress);
90            } else if (seekBar == mBar2) {
91                mTest.onBar2Changed(progress);
92            } else if (seekBar == mBar3) {
93                mTest.onBar3Changed(progress);
94            } else if (seekBar == mBar4) {
95                mTest.onBar4Changed(progress);
96            } else if (seekBar == mBar5) {
97                mTest.onBar5Changed(progress);
98            }
99
100            mTest.runTest();
101            mTest.updateBitmap(mBitmapOut);
102            mDisplayView.invalidate();
103        }
104    }
105
106    public void onStartTrackingTouch(SeekBar seekBar) {
107    }
108
109    public void onStopTrackingTouch(SeekBar seekBar) {
110    }
111
112    void setupBars() {
113        mBar1.setVisibility(View.VISIBLE);
114        mText1.setVisibility(View.VISIBLE);
115        mTest.onBar1Setup(mBar1, mText1);
116
117        mBar2.setVisibility(View.VISIBLE);
118        mText2.setVisibility(View.VISIBLE);
119        mTest.onBar2Setup(mBar2, mText2);
120
121        mBar3.setVisibility(View.VISIBLE);
122        mText3.setVisibility(View.VISIBLE);
123        mTest.onBar3Setup(mBar3, mText3);
124
125        mBar4.setVisibility(View.VISIBLE);
126        mText4.setVisibility(View.VISIBLE);
127        mTest.onBar4Setup(mBar4, mText4);
128
129        mBar5.setVisibility(View.VISIBLE);
130        mText5.setVisibility(View.VISIBLE);
131        mTest.onBar5Setup(mBar5, mText5);
132    }
133
134
135    void changeTest(int testID) {
136        if (mTest != null) {
137            mTest.destroy();
138        }
139        switch(testID) {
140        case 0:
141            mTest = new LevelsV4(false, false);
142            break;
143        case 1:
144            mTest = new LevelsV4(false, true);
145            break;
146        case 2:
147            mTest = new LevelsV4(true, false);
148            break;
149        case 3:
150            mTest = new LevelsV4(true, true);
151            break;
152        case 4:
153            mTest = new Blur25(false);
154            break;
155        case 5:
156            mTest = new Blur25(true);
157            break;
158        case 6:
159            mTest = new Greyscale();
160            break;
161        case 7:
162            mTest = new Grain();
163            break;
164        case 8:
165            mTest = new Fisheye(false, false);
166            break;
167        case 9:
168            mTest = new Fisheye(false, true);
169            break;
170        case 10:
171            mTest = new Fisheye(true, false);
172            break;
173        case 11:
174            mTest = new Fisheye(true, true);
175            break;
176        case 12:
177            mTest = new Vignette(false, false);
178            break;
179        case 13:
180            mTest = new Vignette(false, true);
181            break;
182        case 14:
183            mTest = new Vignette(true, false);
184            break;
185        case 15:
186            mTest = new Vignette(true, true);
187            break;
188        case 16:
189            mTest = new GroupTest(false);
190            break;
191        case 17:
192            mTest = new GroupTest(true);
193            break;
194        case 18:
195            mTest = new Convolve3x3(false);
196            break;
197        case 19:
198            mTest = new Convolve3x3(true);
199            break;
200        case 20:
201            mTest = new ColorMatrix(false, false);
202            break;
203        case 21:
204            mTest = new ColorMatrix(true, false);
205            break;
206        case 22:
207            mTest = new ColorMatrix(true, true);
208            break;
209        case 23:
210            mTest = new Copy();
211            break;
212        case 24:
213            mTest = new CrossProcess();
214            break;
215        case 25:
216            mTest = new Convolve5x5(false);
217            break;
218        case 26:
219            mTest = new Convolve5x5(true);
220            break;
221        case 27:
222            mTest = new Mandelbrot();
223            break;
224        }
225
226        mTest.createBaseTest(this, mBitmapIn);
227        setupBars();
228
229        mTest.runTest();
230        mTest.updateBitmap(mBitmapOut);
231        mDisplayView.invalidate();
232        mBenchmarkResult.setText("Result: not run");
233    }
234
235    void setupTests() {
236        mTestNames = new String[28];
237        mTestNames[0] = "Levels Vec3 Relaxed";
238        mTestNames[1] = "Levels Vec4 Relaxed";
239        mTestNames[2] = "Levels Vec3 Full";
240        mTestNames[3] = "Levels Vec4 Full";
241        mTestNames[4] = "Blur radius 25";
242        mTestNames[5] = "Intrinsic Blur radius 25";
243        mTestNames[6] = "Greyscale";
244        mTestNames[7] = "Grain";
245        mTestNames[8] = "Fisheye Full";
246        mTestNames[9] = "Fisheye Relaxed";
247        mTestNames[10] = "Fisheye Approximate Full";
248        mTestNames[11] = "Fisheye Approximate Relaxed";
249        mTestNames[12] = "Vignette Full";
250        mTestNames[13] = "Vignette Relaxed";
251        mTestNames[14] = "Vignette Approximate Full";
252        mTestNames[15] = "Vignette Approximate Relaxed";
253        mTestNames[16] = "Group Test (emulated)";
254        mTestNames[17] = "Group Test (native)";
255        mTestNames[18] = "Convolve 3x3";
256        mTestNames[19] = "Intrinsics Convolve 3x3";
257        mTestNames[20] = "ColorMatrix";
258        mTestNames[21] = "Intrinsics ColorMatrix";
259        mTestNames[22] = "Intrinsics ColorMatrix Grey";
260        mTestNames[23] = "Copy";
261        mTestNames[24] = "CrossProcess (using LUT)";
262        mTestNames[25] = "Convolve 5x5";
263        mTestNames[26] = "Intrinsics Convolve 5x5";
264        mTestNames[27] = "Mandelbrot";
265
266        mTestSpinner.setAdapter(new ArrayAdapter<String>(
267            this, R.layout.spinner_layout, mTestNames));
268    }
269
270    private AdapterView.OnItemSelectedListener mTestSpinnerListener =
271            new AdapterView.OnItemSelectedListener() {
272                public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
273                    changeTest(pos);
274                }
275
276                public void onNothingSelected(AdapterView parent) {
277
278                }
279            };
280
281    @Override
282    protected void onCreate(Bundle savedInstanceState) {
283        super.onCreate(savedInstanceState);
284        setContentView(R.layout.main);
285
286        mBitmapIn = loadBitmap(R.drawable.img1600x1067);
287        mBitmapOut = loadBitmap(R.drawable.img1600x1067);
288
289        mSurfaceView = (SurfaceView) findViewById(R.id.surface);
290
291        mDisplayView = (ImageView) findViewById(R.id.display);
292        mDisplayView.setImageBitmap(mBitmapOut);
293
294        mBar1 = (SeekBar) findViewById(R.id.slider1);
295        mBar2 = (SeekBar) findViewById(R.id.slider2);
296        mBar3 = (SeekBar) findViewById(R.id.slider3);
297        mBar4 = (SeekBar) findViewById(R.id.slider4);
298        mBar5 = (SeekBar) findViewById(R.id.slider5);
299
300        mBar1.setOnSeekBarChangeListener(this);
301        mBar2.setOnSeekBarChangeListener(this);
302        mBar3.setOnSeekBarChangeListener(this);
303        mBar4.setOnSeekBarChangeListener(this);
304        mBar5.setOnSeekBarChangeListener(this);
305
306        mText1 = (TextView) findViewById(R.id.slider1Text);
307        mText2 = (TextView) findViewById(R.id.slider2Text);
308        mText3 = (TextView) findViewById(R.id.slider3Text);
309        mText4 = (TextView) findViewById(R.id.slider4Text);
310        mText5 = (TextView) findViewById(R.id.slider5Text);
311
312        mTestSpinner = (Spinner) findViewById(R.id.filterselection);
313        mTestSpinner.setOnItemSelectedListener(mTestSpinnerListener);
314
315        mBenchmarkResult = (TextView) findViewById(R.id.benchmarkText);
316        mBenchmarkResult.setText("Result: not run");
317
318        setupTests();
319        changeTest(0);
320    }
321
322
323    private Bitmap loadBitmap(int resource) {
324        final BitmapFactory.Options options = new BitmapFactory.Options();
325        options.inPreferredConfig = Bitmap.Config.ARGB_8888;
326        return copyBitmap(BitmapFactory.decodeResource(getResources(), resource, options));
327    }
328
329    private static Bitmap copyBitmap(Bitmap source) {
330        Bitmap b = Bitmap.createBitmap(source.getWidth(), source.getHeight(), source.getConfig());
331        Canvas c = new Canvas(b);
332        c.drawBitmap(source, 0, 0, null);
333        source.recycle();
334        return b;
335    }
336
337    // button hook
338    public void benchmark(View v) {
339        float t = getBenchmark();
340        //long javaTime = javaFilter();
341        //mBenchmarkResult.setText("RS: " + t + " ms  Java: " + javaTime + " ms");
342        mBenchmarkResult.setText("Result: " + t + " ms");
343        Log.v(TAG, "getBenchmark: Renderscript frame time core ms " + t);
344    }
345
346    public void benchmark_all(View v) {
347        // write result into a file
348        File externalStorage = Environment.getExternalStorageDirectory();
349        if (!externalStorage.canWrite()) {
350            Log.v(TAG, "sdcard is not writable");
351            return;
352        }
353        File resultFile = new File(externalStorage, RESULT_FILE);
354        resultFile.setWritable(true, false);
355        try {
356            BufferedWriter rsWriter = new BufferedWriter(new FileWriter(resultFile));
357            Log.v(TAG, "Saved results in: " + resultFile.getAbsolutePath());
358            for (int i = 0; i < mTestNames.length; i++ ) {
359                changeTest(i);
360                float t = getBenchmark();
361                String s = new String("" + mTestNames[i] + ", " + t);
362                rsWriter.write(s + "\n");
363                Log.v(TAG, "Test " + s + "ms\n");
364            }
365            rsWriter.close();
366        } catch (IOException e) {
367            Log.v(TAG, "Unable to write result file " + e.getMessage());
368        }
369        changeTest(0);
370    }
371
372    // For benchmark test
373    public float getBenchmark() {
374        mDoingBenchmark = true;
375
376        mTest.setupBenchmark();
377        long result = 0;
378
379        //Log.v(TAG, "Warming");
380        long t = java.lang.System.currentTimeMillis() + 250;
381        do {
382            mTest.runTest();
383            mTest.finish();
384        } while (t > java.lang.System.currentTimeMillis());
385
386
387        //Log.v(TAG, "Benchmarking");
388        int ct = 0;
389        t = java.lang.System.currentTimeMillis();
390        do {
391            mTest.runTest();
392            mTest.finish();
393            ct++;
394        } while ((t+1000) > java.lang.System.currentTimeMillis());
395        t = java.lang.System.currentTimeMillis() - t;
396        float ft = (float)t;
397        ft /= ct;
398
399        mTest.exitBenchmark();
400        mDoingBenchmark = false;
401
402        return ft;
403    }
404}
405