Home | History | Annotate | Download | only in image
      1 /*
      2  * Copyright (C) 2011 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 
     17 package com.android.rs.imagejb;
     18 
     19 
     20 import android.os.Bundle;
     21 import android.util.Log;
     22 import android.app.Activity;
     23 
     24 import com.android.rs.imagejb.IPTestListJB.TestName;
     25 
     26 import android.test.ActivityInstrumentationTestCase2;
     27 import android.test.suitebuilder.annotation.MediumTest;
     28 
     29 import android.os.Environment;
     30 import java.io.BufferedWriter;
     31 import java.io.File;
     32 import java.io.FileWriter;
     33 import java.io.IOException;
     34 
     35 /**
     36  * ImageProcessing benchmark test.
     37  * To run the test, please use command
     38  *
     39  * adb shell am instrument -w com.android.rs.imagejb/android.support.test.runner.AndroidJUnitRunner
     40  *
     41  */
     42 public class ImageProcessingTest extends ActivityInstrumentationTestCase2<ImageProcessingActivityJB> {
     43     private final String TAG = "ImageProcessingTest";
     44     // Only run 1 iteration now to fit the MediumTest time requirement.
     45     // One iteration means running the tests continuous for 1s.
     46     private ImageProcessingActivityJB mActivity;
     47 
     48     public ImageProcessingTest() {
     49         super(ImageProcessingActivityJB.class);
     50     }
     51 
     52 
     53     // Initialize the parameter for ImageProcessingActivityJB.
     54     protected void prepareTest() {
     55         mActivity = getActivity();
     56         mActivity.prepareInstrumentationTest();
     57     }
     58 
     59     @Override
     60     public void setUp() throws Exception {
     61         super.setUp();
     62         prepareTest();
     63         setActivityInitialTouchMode(false);
     64    }
     65 
     66     @Override
     67     public void tearDown() throws Exception {
     68         if (mActivity.mProcessor != null) {
     69             mActivity.mProcessor.exit();
     70             mActivity.mProcessor = null;
     71         }
     72         super.tearDown();
     73     }
     74 
     75     class TestAction implements Runnable {
     76         private TestName mTestName;
     77         private Result mResult;
     78         public TestAction(TestName testName) {
     79             mTestName = testName;
     80         }
     81         public void run() {
     82             mResult = mActivity.mProcessor.getInstrumentationResult(mTestName);
     83             Log.v(TAG, "Benchmark for test \"" + mTestName.toString() + "\" is: " +
     84                     mResult.getAvg() * 1000.f);
     85             synchronized(this) {
     86                 this.notify();
     87             }
     88         }
     89         public Result getBenchmark() {
     90             return mResult;
     91         }
     92     }
     93 
     94     // Set the benchmark thread to run on ui thread
     95     // Synchronized the thread such that the test will wait for the benchmark thread to finish
     96     public void runOnUiThread(Runnable action) {
     97         synchronized(action) {
     98             mActivity.runOnUiThread(action);
     99             try {
    100                 action.wait();
    101             } catch (InterruptedException e) {
    102                 Log.v(TAG, "waiting for action running on UI thread is interrupted: " +
    103                         e.toString());
    104             }
    105         }
    106     }
    107 
    108     // TODO: Report more info: mean, median, std, etc.
    109     public void runTest(TestAction ta, String testName) {
    110         runOnUiThread(ta);
    111         Result times = ta.getBenchmark();
    112 
    113         // post result to INSTRUMENTATION_STATUS
    114         Bundle results = new Bundle();
    115         results.putFloat(testName + "_avg", times.getAvg() * 1000.0f); // ms
    116         results.putFloat(testName + "_stdevp", times.getStdevp() * 1000.0f); // ms
    117         results.putFloat(testName + "_stdcoef", times.getStdCoef() * 100.0f); // %
    118         getInstrumentation().sendStatus(Activity.RESULT_OK, results);
    119 
    120         // save the runtime distribution to a file on the sdcard so a script can plot it
    121         writeResults("rsTimes/", testName + "_DATA.txt", times);
    122     }
    123 
    124     private void writeResults(String directory, String filename, Result times) {
    125         // write result into a file
    126         File externalStorage = Environment.getExternalStorageDirectory();
    127         if (!externalStorage.canWrite()) {
    128             Log.v(TAG, "sdcard is not writable");
    129             return;
    130         }
    131         File resultDirectory = new File(externalStorage, directory);
    132         resultDirectory.mkdirs();
    133         File resultFile = new File(externalStorage, directory + filename);
    134         resultFile.setWritable(true, false);
    135         try {
    136             BufferedWriter rsWriter = new BufferedWriter(new FileWriter(resultFile));
    137             Log.v(TAG, "Saved results in: " + resultFile.getAbsolutePath());
    138 
    139             float[] datapoints = times.getTimes();
    140             for (int i = 0; i < times.getIterations(); i++) {
    141                 rsWriter.write(String.format("%d %f\n", i, datapoints[i] * 1000.0));
    142             }
    143             rsWriter.close();
    144         } catch (IOException e) {
    145             Log.v(TAG, "Unable to write result file " + e.getMessage());
    146         }
    147     }
    148 
    149     // Test case 0: Levels Vec3 Relaxed
    150     @MediumTest
    151     public void testLevelsVec3Relaxed() {
    152         TestAction ta = new TestAction(TestName.LEVELS_VEC3_RELAXED);
    153         runTest(ta, TestName.LEVELS_VEC3_RELAXED.name());
    154     }
    155 
    156     // Test case 1: Levels Vec4 Relaxed
    157     @MediumTest
    158     public void testLevelsVec4Relaxed() {
    159         TestAction ta = new TestAction(TestName.LEVELS_VEC4_RELAXED);
    160         runTest(ta, TestName.LEVELS_VEC4_RELAXED.name());
    161     }
    162 
    163     // Test case 2: Levels Vec3 Full
    164     @MediumTest
    165     public void testLevelsVec3Full() {
    166         TestAction ta = new TestAction(TestName.LEVELS_VEC3_FULL);
    167         runTest(ta, TestName.LEVELS_VEC3_FULL.name());
    168     }
    169 
    170     // Test case 3: Levels Vec4 Full
    171     @MediumTest
    172     public void testLevelsVec4Full() {
    173         TestAction ta = new TestAction(TestName.LEVELS_VEC4_FULL);
    174         runTest(ta, TestName.LEVELS_VEC4_FULL.name());
    175     }
    176 
    177     // Test case 4: Blur Radius 25
    178     @MediumTest
    179     public void testBlurRadius25() {
    180         TestAction ta = new TestAction(TestName.BLUR_RADIUS_25);
    181         runTest(ta, TestName.BLUR_RADIUS_25.name());
    182     }
    183 
    184     // Test case 5: Intrinsic Blur Radius 25
    185     @MediumTest
    186     public void testIntrinsicBlurRadius25() {
    187         TestAction ta = new TestAction(TestName.INTRINSIC_BLUR_RADIUS_25);
    188         runTest(ta, TestName.INTRINSIC_BLUR_RADIUS_25.name());
    189     }
    190 
    191     // Test case 6: Greyscale
    192     @MediumTest
    193     public void testGreyscale() {
    194         TestAction ta = new TestAction(TestName.GREYSCALE);
    195         runTest(ta, TestName.GREYSCALE.name());
    196     }
    197 
    198     // Test case 7: Grain
    199     @MediumTest
    200     public void testGrain() {
    201         TestAction ta = new TestAction(TestName.GRAIN);
    202         runTest(ta, TestName.GRAIN.name());
    203     }
    204 
    205     // Test case 8: Fisheye Full
    206     @MediumTest
    207     public void testFisheyeFull() {
    208         TestAction ta = new TestAction(TestName.FISHEYE_FULL);
    209         runTest(ta, TestName.FISHEYE_FULL.name());
    210     }
    211 
    212     // Test case 9: Fisheye Relaxed
    213     @MediumTest
    214     public void testFishEyeRelaxed() {
    215         TestAction ta = new TestAction(TestName.FISHEYE_RELAXED);
    216         runTest(ta, TestName.FISHEYE_RELAXED.name());
    217     }
    218 
    219     // Test case 10: Fisheye Approximate Full
    220     @MediumTest
    221     public void testFisheyeApproximateFull() {
    222         TestAction ta = new TestAction(TestName.FISHEYE_APPROXIMATE_FULL);
    223         runTest(ta, TestName.FISHEYE_APPROXIMATE_FULL.name());
    224     }
    225 
    226     // Test case 11: Fisheye Approximate Relaxed
    227     @MediumTest
    228     public void testFisheyeApproximateRelaxed() {
    229         TestAction ta = new TestAction(TestName.FISHEYE_APPROXIMATE_RELAXED);
    230         runTest(ta, TestName.FISHEYE_APPROXIMATE_RELAXED.name());
    231     }
    232 
    233     // Test case 12: Vignette Full
    234     @MediumTest
    235     public void testVignetteFull() {
    236         TestAction ta = new TestAction(TestName.VIGNETTE_FULL);
    237         runTest(ta, TestName.VIGNETTE_FULL.name());
    238     }
    239 
    240     // Test case 13: Vignette Relaxed
    241     @MediumTest
    242     public void testVignetteRelaxed() {
    243         TestAction ta = new TestAction(TestName.VIGNETTE_RELAXED);
    244         runTest(ta, TestName.VIGNETTE_RELAXED.name());
    245     }
    246 
    247     // Test case 14: Vignette Approximate Full
    248     @MediumTest
    249     public void testVignetteApproximateFull() {
    250         TestAction ta = new TestAction(TestName.VIGNETTE_APPROXIMATE_FULL);
    251         runTest(ta, TestName.VIGNETTE_APPROXIMATE_FULL.name());
    252     }
    253 
    254     // Test case 15: Vignette Approximate Relaxed
    255     @MediumTest
    256     public void testVignetteApproximateRelaxed() {
    257         TestAction ta = new TestAction(TestName.VIGNETTE_APPROXIMATE_RELAXED);
    258         runTest(ta, TestName.VIGNETTE_APPROXIMATE_RELAXED.name());
    259     }
    260 
    261     // Test case 16: Group Test (emulated)
    262     @MediumTest
    263     public void testGroupTestEmulated() {
    264         TestAction ta = new TestAction(TestName.GROUP_TEST_EMULATED);
    265         runTest(ta, TestName.GROUP_TEST_EMULATED.name());
    266     }
    267 
    268     // Test case 17: Group Test (native)
    269     @MediumTest
    270     public void testGroupTestNative() {
    271         TestAction ta = new TestAction(TestName.GROUP_TEST_NATIVE);
    272         runTest(ta, TestName.GROUP_TEST_NATIVE.name());
    273     }
    274 
    275     // Test case 18: Convolve 3x3
    276     @MediumTest
    277     public void testConvolve3x3() {
    278         TestAction ta = new TestAction(TestName.CONVOLVE_3X3);
    279         runTest(ta, TestName.CONVOLVE_3X3.name());
    280     }
    281 
    282     // Test case 19: Intrinsics Convolve 3x3
    283     @MediumTest
    284     public void testIntrinsicsConvolve3x3() {
    285         TestAction ta = new TestAction(TestName.INTRINSICS_CONVOLVE_3X3);
    286         runTest(ta, TestName.INTRINSICS_CONVOLVE_3X3.name());
    287     }
    288 
    289     // Test case 20: ColorMatrix
    290     @MediumTest
    291     public void testColorMatrix() {
    292         TestAction ta = new TestAction(TestName.COLOR_MATRIX);
    293         runTest(ta, TestName.COLOR_MATRIX.name());
    294     }
    295 
    296     // Test case 21: Intrinsics ColorMatrix
    297     @MediumTest
    298     public void testIntrinsicsColorMatrix() {
    299         TestAction ta = new TestAction(TestName.INTRINSICS_COLOR_MATRIX);
    300         runTest(ta, TestName.INTRINSICS_COLOR_MATRIX.name());
    301     }
    302 
    303     // Test case 22: Intrinsics ColorMatrix Grey
    304     @MediumTest
    305     public void testIntrinsicsColorMatrixGrey() {
    306         TestAction ta = new TestAction(TestName.INTRINSICS_COLOR_MATRIX_GREY);
    307         runTest(ta, TestName.INTRINSICS_COLOR_MATRIX_GREY.name());
    308     }
    309 
    310     // Test case 23: Copy
    311     @MediumTest
    312     public void testCopy() {
    313         TestAction ta = new TestAction(TestName.COPY);
    314         runTest(ta, TestName.COPY.name());
    315     }
    316 
    317     // Test case 24: CrossProcess (using LUT)
    318     @MediumTest
    319     public void testCrossProcessUsingLUT() {
    320         TestAction ta = new TestAction(TestName.CROSS_PROCESS_USING_LUT);
    321         runTest(ta, TestName.CROSS_PROCESS_USING_LUT.name());
    322     }
    323 
    324     // Test case 25: Convolve 5x5
    325     @MediumTest
    326     public void testConvolve5x5() {
    327         TestAction ta = new TestAction(TestName.CONVOLVE_5X5);
    328         runTest(ta, TestName.CONVOLVE_5X5.name());
    329     }
    330 
    331     // Test case 26: Intrinsics Convolve 5x5
    332     @MediumTest
    333     public void testIntrinsicsConvolve5x5() {
    334         TestAction ta = new TestAction(TestName.INTRINSICS_CONVOLVE_5X5);
    335         runTest(ta, TestName.INTRINSICS_CONVOLVE_5X5.name());
    336     }
    337 
    338     // Test case 27: Mandelbrot
    339     @MediumTest
    340     public void testMandelbrot() {
    341         TestAction ta = new TestAction(TestName.MANDELBROT_FLOAT);
    342         runTest(ta, TestName.MANDELBROT_FLOAT.name());
    343     }
    344 
    345     // Test case 28: Intrinsics Blend
    346     @MediumTest
    347     public void testIntrinsicsBlend() {
    348         TestAction ta = new TestAction(TestName.INTRINSICS_BLEND);
    349         runTest(ta, TestName.INTRINSICS_BLEND.name());
    350     }
    351 
    352     // Test case 29: Intrinsics Blur 25 uchar
    353     @MediumTest
    354     public void testIntrinsicsBlur25G() {
    355         TestAction ta = new TestAction(TestName.INTRINSICS_BLUR_25G);
    356         runTest(ta, TestName.INTRINSICS_BLUR_25G.name());
    357     }
    358 
    359     // Test case 30: Vibrance
    360     @MediumTest
    361     public void testVibrance() {
    362         TestAction ta = new TestAction(TestName.VIBRANCE);
    363         runTest(ta, TestName.VIBRANCE.name());
    364     }
    365 
    366     // Test case 31: BWFilter
    367     @MediumTest
    368     public void testBWFilter() {
    369         TestAction ta = new TestAction(TestName.BW_FILTER);
    370         runTest(ta, TestName.BW_FILTER.name());
    371     }
    372 
    373     // Test case 32: Shadows
    374     @MediumTest
    375     public void testShadows() {
    376         TestAction ta = new TestAction(TestName.SHADOWS);
    377         runTest(ta, TestName.SHADOWS.name());
    378     }
    379 
    380     // Test case 33: Contrast
    381     @MediumTest
    382     public void testContrast() {
    383         TestAction ta = new TestAction(TestName.CONTRAST);
    384         runTest(ta, TestName.CONTRAST.name());
    385     }
    386 
    387     // Test case 34: Exposure
    388     @MediumTest
    389     public void testExposure(){
    390         TestAction ta = new TestAction(TestName.EXPOSURE);
    391         runTest(ta, TestName.EXPOSURE.name());
    392     }
    393 
    394     // Test case 35: White Balance
    395     @MediumTest
    396     public void testWhiteBalance() {
    397         TestAction ta = new TestAction(TestName.WHITE_BALANCE);
    398         runTest(ta, TestName.WHITE_BALANCE.name());
    399     }
    400 
    401     // Test case 36: Color Cube
    402     @MediumTest
    403     public void testColorCube() {
    404         TestAction ta = new TestAction(TestName.COLOR_CUBE);
    405         runTest(ta, TestName.COLOR_CUBE.name());
    406     }
    407 
    408     // Test case 37: Color Cube (3D Intrinsic)
    409     @MediumTest
    410     public void testColorCube3DIntrinsic() {
    411         TestAction ta = new TestAction(TestName.COLOR_CUBE_3D_INTRINSIC);
    412         runTest(ta, TestName.COLOR_CUBE_3D_INTRINSIC.name());
    413     }
    414 
    415     // Test case 38: Artistic 1
    416     @MediumTest
    417     public void testArtistic1() {
    418         TestAction ta = new TestAction(TestName.ARTISTIC1);
    419         runTest(ta, TestName.ARTISTIC1.name());
    420     }
    421 
    422     // Test case 39: Resize BiCubic Script
    423     @MediumTest
    424     public void testResizeBiCubicScript() {
    425         TestAction ta = new TestAction(TestName.RESIZE_BI_SCRIPT);
    426         runTest(ta, TestName.RESIZE_BI_SCRIPT.name());
    427     }
    428 
    429     // Test case 40: Resize BiCubic Intrinsic
    430     @MediumTest
    431     public void testResizeBiCubicIntrinsic() {
    432         TestAction ta = new TestAction(TestName.RESIZE_BI_INTRINSIC);
    433         runTest(ta, TestName.RESIZE_BI_INTRINSIC.name());
    434     }
    435 
    436     // Test case 41: Posterize with invoke
    437     @MediumTest
    438     public void testPosterizeInvoke() {
    439         TestAction ta = new TestAction(TestName.POSTERIZE_INVOKE);
    440         runTest(ta, TestName.POSTERIZE_INVOKE.name());
    441     }
    442 
    443     // Test case 42: Posterize with set
    444     @MediumTest
    445     public void testPosterizeSet() {
    446         TestAction ta = new TestAction(TestName.POSTERIZE_SET);
    447         runTest(ta, TestName.POSTERIZE_SET.name());
    448     }
    449 
    450     // Test case 43 Histogram intrinsic
    451     @MediumTest
    452     public void testHistogramIntrinsic() {
    453         TestAction ta = new TestAction(TestName.HISTOGRAM_INTRINSIC);
    454         runTest(ta, TestName.HISTOGRAM_INTRINSIC.name());
    455     }
    456 
    457     // Test case 44 Histogram script
    458     @MediumTest
    459     public void testHistogramScript() {
    460         TestAction ta = new TestAction(TestName.HISTOGRAM_SCRIPT);
    461         runTest(ta, TestName.HISTOGRAM_SCRIPT.name());
    462     }
    463 
    464     // Test case 45: Mandelbrot fp64
    465     @MediumTest
    466     public void testMandelbrotfp64() {
    467         TestAction ta = new TestAction(TestName.MANDELBROT_DOUBLE);
    468         runTest(ta, TestName.MANDELBROT_DOUBLE.name());
    469     }
    470 
    471     // Test case 46: Blur Radius 25 Half Precision
    472     @MediumTest
    473     public void testBlurRadius25Half() {
    474         TestAction ta = new TestAction(TestName.BLUR_RADIUS_25_HALF);
    475         runTest(ta, TestName.BLUR_RADIUS_25_HALF.name());
    476     }
    477 }
    478