summaryrefslogtreecommitdiffstats
path: root/tests/src/com/android
diff options
context:
space:
mode:
authorRuben Brunk <rubenbrunk@google.com>2013-06-28 20:02:54 -0700
committerRuben Brunk <rubenbrunk@google.com>2013-07-11 13:41:29 -0700
commit8d8d5cf2943da78ca5f84d1729b081312c031e6a (patch)
treef4c60b00a469733ff11901bd8fdc030c8f537f5c /tests/src/com/android
parent3ea8558300780ca5269d75230f78eadf4100876c (diff)
downloadandroid_packages_apps_Snap-8d8d5cf2943da78ca5f84d1729b081312c031e6a.zip
android_packages_apps_Snap-8d8d5cf2943da78ca5f84d1729b081312c031e6a.tar.gz
android_packages_apps_Snap-8d8d5cf2943da78ca5f84d1729b081312c031e6a.tar.bz2
Added jpeg streaming classes.
- Provides streaming operations for decompressing/compressing JPEG files. - Allows pixel operations to be performed on large JPEG images without holding the entire bitmap in memory. Change-Id: I597ddf282b59d2ba6d6bca4722208121e3728f94
Diffstat (limited to 'tests/src/com/android')
-rw-r--r--tests/src/com/android/gallery3d/jpegstream/JpegStreamReaderTest.java81
-rw-r--r--tests/src/com/android/gallery3d/jpegstream/JpegStreamTestCase.java71
-rw-r--r--tests/src/com/android/gallery3d/jpegstream/JpegStreamTestRunner.java78
-rw-r--r--tests/src/com/android/gallery3d/jpegstream/JpegStreamWriterTest.java138
4 files changed, 368 insertions, 0 deletions
diff --git a/tests/src/com/android/gallery3d/jpegstream/JpegStreamReaderTest.java b/tests/src/com/android/gallery3d/jpegstream/JpegStreamReaderTest.java
new file mode 100644
index 0000000..2e56145
--- /dev/null
+++ b/tests/src/com/android/gallery3d/jpegstream/JpegStreamReaderTest.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.gallery3d.jpegstream;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Point;
+import android.os.Environment;
+import android.util.Log;
+
+import com.android.gallery3d.common.Utils;
+import com.android.gallery3d.tests.R;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.Arrays;
+
+public class JpegStreamReaderTest extends JpegStreamTestCase {
+ public static final String TAG = "JpegStreamReaderTest";
+ private JPEGInputStream mStream;
+ private Bitmap mBitmap;
+
+ public JpegStreamReaderTest(int imageRes) {
+ super(imageRes);
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ mBitmap = BitmapFactory.decodeStream(getImageInputStream());
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ super.tearDown();
+ Utils.closeSilently(mStream);
+ mStream = null;
+ if (mBitmap != null) {
+ mBitmap.recycle();
+ mBitmap = null;
+ }
+ }
+
+ public void testBasicReads() throws Exception {
+
+ // Setup input stream.
+ mStream = new JPEGInputStream(reopenFileStream(), JpegConfig.FORMAT_RGBA);
+ Point dimens = mStream.getDimensions();
+
+ // Read whole stream into array.
+ byte[] bytes = new byte[dimens.x * StreamUtils.pixelSize(JpegConfig.FORMAT_RGBA) * dimens.y];
+ assertTrue(mStream.read(bytes, 0, bytes.length) == bytes.length);
+
+ // Set pixels in bitmap
+ Bitmap test = Bitmap.createBitmap(dimens.x, dimens.y, Bitmap.Config.ARGB_8888);
+ ByteBuffer buf = ByteBuffer.wrap(bytes);
+ test.copyPixelsFromBuffer(buf);
+ assertTrue(test.getWidth() == mBitmap.getWidth() && test.getHeight() == mBitmap.getHeight());
+ assertTrue(mStream.read(bytes, 0, bytes.length) == -1);
+ }
+
+ // TODO : more tests
+}
diff --git a/tests/src/com/android/gallery3d/jpegstream/JpegStreamTestCase.java b/tests/src/com/android/gallery3d/jpegstream/JpegStreamTestCase.java
new file mode 100644
index 0000000..ed3b08a
--- /dev/null
+++ b/tests/src/com/android/gallery3d/jpegstream/JpegStreamTestCase.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.gallery3d.jpegstream;
+
+import android.content.res.Resources;
+import android.test.InstrumentationTestCase;
+import android.util.Log;
+
+import com.android.gallery3d.common.Utils;
+
+import java.io.InputStream;
+
+public class JpegStreamTestCase extends InstrumentationTestCase {
+ public static final String TAG = "JpegStreamTestCase";
+
+ private static final String RES_ID_TITLE = "Resource ID: %x";
+
+ private InputStream mImageInputStream;
+ private final int mImageResourceId;
+
+ public JpegStreamTestCase(int imageRes) {
+ mImageResourceId = imageRes;
+ }
+
+ protected InputStream getImageInputStream() {
+ return mImageInputStream;
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ Log.d(TAG, "doing setUp...");
+ mImageInputStream = reopenFileStream();
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ Log.d(TAG, "doing tearDown...");
+ Utils.closeSilently(mImageInputStream);
+ mImageInputStream = null;
+ }
+
+ protected String getImageTitle() {
+ return String.format(RES_ID_TITLE, mImageResourceId);
+ }
+
+ protected InputStream reopenFileStream() throws Exception {
+ return openResource(mImageResourceId);
+ }
+
+ protected InputStream openResource(int resourceID) throws Exception {
+ try {
+ Resources res = getInstrumentation().getContext().getResources();
+ return res.openRawResource(resourceID);
+ } catch (Exception e) {
+ throw new Exception(getImageTitle(), e);
+ }
+ }
+}
diff --git a/tests/src/com/android/gallery3d/jpegstream/JpegStreamTestRunner.java b/tests/src/com/android/gallery3d/jpegstream/JpegStreamTestRunner.java
new file mode 100644
index 0000000..2afaf39
--- /dev/null
+++ b/tests/src/com/android/gallery3d/jpegstream/JpegStreamTestRunner.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.gallery3d.jpegstream;
+
+import android.test.InstrumentationTestRunner;
+import android.test.InstrumentationTestSuite;
+import android.util.Log;
+
+import com.android.gallery3d.exif.ExifTestRunner;
+import com.android.gallery3d.tests.R;
+
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+public class JpegStreamTestRunner extends InstrumentationTestRunner {
+ private static final String TAG = "JpegStreamTestRunner";
+
+ private static final int[] IMG_RESOURCE = {
+ R.raw.galaxy_nexus
+ };
+
+ @Override
+ public TestSuite getAllTests() {
+ TestSuite suite = new InstrumentationTestSuite(this);
+ addAllTestsFromTestCase(JpegStreamReaderTest.class, suite);
+ addAllTestsFromTestCase(JpegStreamWriterTest.class, suite);
+ return suite;
+ }
+
+ private void addAllTestsFromTestCase(Class<? extends JpegStreamTestCase> testClass,
+ TestSuite suite) {
+ for (Method method : testClass.getDeclaredMethods()) {
+ if (method.getName().startsWith("test") && method.getParameterTypes().length == 0) {
+ for (int i = 0; i < IMG_RESOURCE.length; i++) {
+ TestCase test;
+ try {
+ test = testClass.getDeclaredConstructor(int.class).
+ newInstance(IMG_RESOURCE[i]);
+ test.setName(method.getName());
+ suite.addTest(test);
+ } catch (IllegalArgumentException e) {
+ Log.e(TAG, "Failed to create test case", e);
+ } catch (InstantiationException e) {
+ Log.e(TAG, "Failed to create test case", e);
+ } catch (IllegalAccessException e) {
+ Log.e(TAG, "Failed to create test case", e);
+ } catch (InvocationTargetException e) {
+ Log.e(TAG, "Failed to create test case", e);
+ } catch (NoSuchMethodException e) {
+ Log.e(TAG, "Failed to create test case", e);
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public ClassLoader getLoader() {
+ return ExifTestRunner.class.getClassLoader();
+ }
+}
diff --git a/tests/src/com/android/gallery3d/jpegstream/JpegStreamWriterTest.java b/tests/src/com/android/gallery3d/jpegstream/JpegStreamWriterTest.java
new file mode 100644
index 0000000..befba4c
--- /dev/null
+++ b/tests/src/com/android/gallery3d/jpegstream/JpegStreamWriterTest.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.gallery3d.jpegstream;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.os.Environment;
+import android.util.Log;
+
+import com.android.gallery3d.common.Utils;
+import com.android.gallery3d.tests.R;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.nio.ByteBuffer;
+
+public class JpegStreamWriterTest extends JpegStreamTestCase {
+ public static final String TAG = "JpegStreamWriterTest";
+ private JPEGOutputStream mStream;
+ private ByteArrayOutputStream mWrappedStream;
+ private Bitmap mBitmap;
+ private Bitmap mControl;
+
+ // galaxy_nexus.jpg image compressed with q=20
+ private static final int CONTROL_RID = R.raw.jpeg_control;
+
+ public JpegStreamWriterTest(int imageRes) {
+ super(imageRes);
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ mBitmap = BitmapFactory.decodeStream(getImageInputStream());
+ mControl = BitmapFactory.decodeStream(openResource(CONTROL_RID));
+ mWrappedStream = new ByteArrayOutputStream();
+
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ super.tearDown();
+ Utils.closeSilently(mStream);
+ Utils.closeSilently(mWrappedStream);
+ mWrappedStream = null;
+ mStream = null;
+ if (mBitmap != null) {
+ mBitmap.recycle();
+ mBitmap = null;
+ }
+ if (mControl != null) {
+ mControl.recycle();
+ mControl = null;
+ }
+ }
+
+ public void testBasicWrites() throws Exception {
+ assertTrue(mBitmap != null);
+ int width = mBitmap.getWidth();
+ int height = mBitmap.getHeight();
+ mStream = new JPEGOutputStream(mWrappedStream, width,
+ height, 20, JpegConfig.FORMAT_RGBA);
+
+ // Put bitmap pixels into a byte array (format is RGBA).
+ int rowLength = width * StreamUtils.pixelSize(JpegConfig.FORMAT_RGBA);
+ int size = height * rowLength;
+ byte[] byteArray = new byte[size];
+ ByteBuffer buf = ByteBuffer.wrap(byteArray);
+ mBitmap.copyPixelsToBuffer(buf);
+
+ // Write out whole array
+ mStream.write(byteArray, 0, byteArray.length);
+ mStream.close();
+
+ // Get compressed jpeg output
+ byte[] compressed = mWrappedStream.toByteArray();
+
+ // Check jpeg
+ ByteArrayInputStream inStream = new ByteArrayInputStream(compressed);
+ Bitmap test = BitmapFactory.decodeStream(inStream);
+ assertTrue(test != null);
+ assertTrue(test.sameAs(mControl));
+ }
+
+ public void testStreamingWrites() throws Exception {
+ assertTrue(mBitmap != null);
+ int width = mBitmap.getWidth();
+ int height = mBitmap.getHeight();
+ mStream = new JPEGOutputStream(mWrappedStream, width,
+ height, 20, JpegConfig.FORMAT_RGBA);
+
+ // Put bitmap pixels into a byte array (format is RGBA).
+ int rowLength = width * StreamUtils.pixelSize(JpegConfig.FORMAT_RGBA);
+ int size = height * rowLength;
+ byte[] byteArray = new byte[size];
+ ByteBuffer buf = ByteBuffer.wrap(byteArray);
+ mBitmap.copyPixelsToBuffer(buf);
+
+ // Write array in chunks
+ int chunkSize = rowLength / 3;
+ int written = 0;
+ while (written < size) {
+ if (written + chunkSize > size) {
+ chunkSize = size - written;
+ }
+ mStream.write(byteArray, written, chunkSize);
+ written += chunkSize;
+ }
+ mStream.close();
+
+ // Get compressed jpeg output
+ byte[] compressed = mWrappedStream.toByteArray();
+
+ // Check jpeg
+ ByteArrayInputStream inStream = new ByteArrayInputStream(compressed);
+ Bitmap test = BitmapFactory.decodeStream(inStream);
+ assertTrue(test != null);
+ assertTrue(test.sameAs(mControl));
+ }
+
+ // TODO : more tests
+}