summaryrefslogtreecommitdiffstats
path: root/framesequence
diff options
context:
space:
mode:
Diffstat (limited to 'framesequence')
-rw-r--r--framesequence/Android.mk2
-rw-r--r--framesequence/jni/Android.mk12
-rw-r--r--framesequence/jni/FrameSequence.h1
-rw-r--r--framesequence/jni/FrameSequenceJNI.cpp25
-rw-r--r--framesequence/jni/FrameSequence_gif.cpp5
-rw-r--r--framesequence/jni/FrameSequence_gif.h4
-rw-r--r--framesequence/jni/FrameSequence_webp.cpp47
-rw-r--r--framesequence/jni/FrameSequence_webp.h5
-rw-r--r--framesequence/jni/Registry.cpp27
-rw-r--r--framesequence/jni/Registry.h4
-rw-r--r--framesequence/jni/Stream.cpp28
-rw-r--r--framesequence/jni/Stream.h16
-rw-r--r--framesequence/samples/FrameSequenceSamples/Android.mk (renamed from framesequence/samples/RastermillSamples/Android.mk)2
-rw-r--r--framesequence/samples/FrameSequenceSamples/AndroidManifest.xml (renamed from framesequence/samples/RastermillSamples/AndroidManifest.xml)4
-rw-r--r--framesequence/samples/FrameSequenceSamples/build.xml (renamed from framesequence/samples/RastermillSamples/build.xml)0
-rw-r--r--framesequence/samples/FrameSequenceSamples/proguard.flags (renamed from framesequence/samples/RastermillSamples/proguard.flags)0
-rw-r--r--framesequence/samples/FrameSequenceSamples/project.properties (renamed from framesequence/samples/RastermillSamples/project.properties)0
-rw-r--r--framesequence/samples/FrameSequenceSamples/res/drawable-hdpi/ic_launcher.png (renamed from framesequence/samples/RastermillSamples/res/drawable-hdpi/ic_launcher.png)bin9397 -> 9397 bytes
-rw-r--r--framesequence/samples/FrameSequenceSamples/res/drawable-mdpi/ic_launcher.png (renamed from framesequence/samples/RastermillSamples/res/drawable-mdpi/ic_launcher.png)bin5237 -> 5237 bytes
-rw-r--r--framesequence/samples/FrameSequenceSamples/res/drawable-xhdpi/ic_launcher.png (renamed from framesequence/samples/RastermillSamples/res/drawable-xhdpi/ic_launcher.png)bin14383 -> 14383 bytes
-rw-r--r--framesequence/samples/FrameSequenceSamples/res/layout/basic_test_activity.xml (renamed from framesequence/samples/RastermillSamples/res/layout/basic_test_activity.xml)0
-rw-r--r--framesequence/samples/FrameSequenceSamples/res/raw/animated_gif.gif (renamed from framesequence/samples/RastermillSamples/res/raw/animated.gif)bin34978 -> 34978 bytes
-rw-r--r--framesequence/samples/FrameSequenceSamples/res/raw/animated_webp.webpbin0 -> 380850 bytes
-rw-r--r--framesequence/samples/FrameSequenceSamples/res/values/strings.xml (renamed from framesequence/samples/RastermillSamples/res/values/strings.xml)2
-rw-r--r--framesequence/samples/FrameSequenceSamples/res/values/styles.xml (renamed from framesequence/samples/RastermillSamples/res/values/styles.xml)0
-rw-r--r--framesequence/samples/FrameSequenceSamples/src/com/android/framesequence/samples/FrameSequenceTest.java (renamed from framesequence/samples/RastermillSamples/src/com/android/rastermill/samples/AnimatedGifTest.java)11
-rw-r--r--framesequence/samples/FrameSequenceSamples/src/com/android/framesequence/samples/SamplesList.java (renamed from framesequence/samples/RastermillSamples/src/com/android/rastermill/samples/SamplesList.java)15
-rw-r--r--framesequence/src/android/support/rastermill/FrameSequence.java15
28 files changed, 179 insertions, 46 deletions
diff --git a/framesequence/Android.mk b/framesequence/Android.mk
index cc2c16c..1b3cf2d 100644
--- a/framesequence/Android.mk
+++ b/framesequence/Android.mk
@@ -21,6 +21,8 @@ LOCAL_MODULE := android-common-framesequence
LOCAL_SDK_VERSION := 8
LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_PROGUARD_FLAG_FILES := proguard.flags
+
include $(BUILD_STATIC_JAVA_LIBRARY)
include $(call all-makefiles-under, $(LOCAL_PATH))
diff --git a/framesequence/jni/Android.mk b/framesequence/jni/Android.mk
index e9d0ec5..7353436 100644
--- a/framesequence/jni/Android.mk
+++ b/framesequence/jni/Android.mk
@@ -19,13 +19,12 @@ include $(CLEAR_VARS)
## Main library
-LOCAL_STATIC_LIBRARIES += libgif libwebp-decode
+LOCAL_STATIC_LIBRARIES = libgif
LOCAL_LDFLAGS := -llog -ljnigraphics
LOCAL_C_INCLUDES := \
- external/giflib \
- external/webp/include
+ external/giflib
LOCAL_MODULE := libframesequence
LOCAL_SRC_FILES := \
@@ -33,11 +32,16 @@ LOCAL_SRC_FILES := \
FrameSequence.cpp \
FrameSequenceJNI.cpp \
FrameSequence_gif.cpp \
- FrameSequence_webp.cpp \
JNIHelpers.cpp \
Registry.cpp \
Stream.cpp
+ifeq ($(FRAMESEQUENCE_INCLUDE_WEBP),true)
+ LOCAL_C_INCLUDES += external/webp/include
+ LOCAL_SRC_FILES += FrameSequence_webp.cpp
+ LOCAL_STATIC_LIBRARIES += libwebp-decode
+endif
+
LOCAL_CFLAGS += -Wall -Wno-unused-parameter -Wno-unused-variable -Wno-overloaded-virtual
LOCAL_CFLAGS += -fvisibility=hidden
diff --git a/framesequence/jni/FrameSequence.h b/framesequence/jni/FrameSequence.h
index 6667cdd..134c81a 100644
--- a/framesequence/jni/FrameSequence.h
+++ b/framesequence/jni/FrameSequence.h
@@ -49,6 +49,7 @@ public:
virtual bool isOpaque() const = 0;
virtual int getFrameCount() const = 0;
virtual int getDefaultLoopCount() const = 0;
+ virtual jobject getRawByteBuffer() const = 0;
virtual FrameSequenceState* createState() const = 0;
};
diff --git a/framesequence/jni/FrameSequenceJNI.cpp b/framesequence/jni/FrameSequenceJNI.cpp
index 08a73bc..dfc51ec 100644
--- a/framesequence/jni/FrameSequenceJNI.cpp
+++ b/framesequence/jni/FrameSequenceJNI.cpp
@@ -53,12 +53,27 @@ static jobject nativeDecodeByteArray(JNIEnv* env, jobject clazz,
"couldn't read array bytes");
return NULL;
}
- MemoryStream stream(bytes + offset, length);
+ MemoryStream stream(bytes + offset, length, NULL);
FrameSequence* frameSequence = FrameSequence::create(&stream);
env->ReleasePrimitiveArrayCritical(byteArray, bytes, 0);
return createJavaFrameSequence(env, frameSequence);
}
+static jobject nativeDecodeByteBuffer(JNIEnv* env, jobject clazz,
+ jobject buf, jint offset, jint limit) {
+ jobject globalBuf = env->NewGlobalRef(buf);
+ JavaVM* vm;
+ env->GetJavaVM(&vm);
+ MemoryStream stream(
+ (reinterpret_cast<uint8_t*>(
+ env->GetDirectBufferAddress(globalBuf))) + offset,
+ limit,
+ globalBuf);
+ FrameSequence* frameSequence = FrameSequence::create(&stream);
+ jobject finalSequence = createJavaFrameSequence(env, frameSequence);
+ return finalSequence;
+}
+
static jobject nativeDecodeStream(JNIEnv* env, jobject clazz,
jobject istream, jbyteArray byteArray) {
JavaInputStream stream(env, istream, byteArray);
@@ -69,6 +84,10 @@ static jobject nativeDecodeStream(JNIEnv* env, jobject clazz,
static void nativeDestroyFrameSequence(JNIEnv* env, jobject clazz,
jlong frameSequenceLong) {
FrameSequence* frameSequence = reinterpret_cast<FrameSequence*>(frameSequenceLong);
+ jobject buf = frameSequence->getRawByteBuffer();
+ if (buf != NULL) {
+ env->DeleteGlobalRef(buf);
+ }
delete frameSequence;
}
@@ -123,6 +142,10 @@ static JNINativeMethod gMethods[] = {
"([BII)L" JNI_PACKAGE "/FrameSequence;",
(void*) nativeDecodeByteArray
},
+ { "nativeDecodeByteBuffer",
+ "(Ljava/nio/ByteBuffer;II)L" JNI_PACKAGE "/FrameSequence;",
+ (void*) nativeDecodeByteBuffer
+ },
{ "nativeDecodeStream",
"(Ljava/io/InputStream;[B)L" JNI_PACKAGE "/FrameSequence;",
(void*) nativeDecodeStream
diff --git a/framesequence/jni/FrameSequence_gif.cpp b/framesequence/jni/FrameSequence_gif.cpp
index f3e94df..2188c53 100644
--- a/framesequence/jni/FrameSequence_gif.cpp
+++ b/framesequence/jni/FrameSequence_gif.cpp
@@ -352,6 +352,10 @@ static bool isGif(void* header, int header_size) {
|| !memcmp(GIF89_STAMP, header, GIF_STAMP_LEN);
}
+static bool acceptsBuffers() {
+ return false;
+}
+
static FrameSequence* createFramesequence(Stream* stream) {
return new FrameSequence_gif(stream);
}
@@ -361,6 +365,7 @@ static RegistryEntry gEntry = {
isGif,
createFramesequence,
NULL,
+ acceptsBuffers,
};
static Registry gRegister(gEntry);
diff --git a/framesequence/jni/FrameSequence_gif.h b/framesequence/jni/FrameSequence_gif.h
index 8bf57b6..563f5b8 100644
--- a/framesequence/jni/FrameSequence_gif.h
+++ b/framesequence/jni/FrameSequence_gif.h
@@ -49,6 +49,10 @@ public:
return mLoopCount;
}
+ virtual jobject getRawByteBuffer() const {
+ return NULL;
+ }
+
virtual FrameSequenceState* createState() const;
GifFileType* getGif() const { return mGif; }
diff --git a/framesequence/jni/FrameSequence_webp.cpp b/framesequence/jni/FrameSequence_webp.cpp
index 602feb7..c33a7e2 100644
--- a/framesequence/jni/FrameSequence_webp.cpp
+++ b/framesequence/jni/FrameSequence_webp.cpp
@@ -85,22 +85,28 @@ void FrameSequence_webp::constructDependencyChain() {
}
FrameSequence_webp::FrameSequence_webp(Stream* stream) {
- // Read RIFF header to get file size.
- uint8_t riff_header[RIFF_HEADER_SIZE];
- if (stream->read(riff_header, RIFF_HEADER_SIZE) != RIFF_HEADER_SIZE) {
- ALOGE("WebP header load failed");
- return;
- }
- mData.size = CHUNK_HEADER_SIZE + GetLE32(riff_header + TAG_SIZE);
- mData.bytes = new uint8_t[mData.size];
- memcpy((void*)mData.bytes, riff_header, RIFF_HEADER_SIZE);
-
- // Read rest of the bytes.
- void* remaining_bytes = (void*)(mData.bytes + RIFF_HEADER_SIZE);
- size_t remaining_size = mData.size - RIFF_HEADER_SIZE;
- if (stream->read(remaining_bytes, remaining_size) != remaining_size) {
- ALOGE("WebP full load failed");
- return;
+ if (stream->getRawBuffer() != NULL) {
+ mData.size = stream->getRawBufferSize();
+ mData.bytes = stream->getRawBufferAddr();
+ mRawByteBuffer = stream->getRawBuffer();
+ } else {
+ // Read RIFF header to get file size.
+ uint8_t riff_header[RIFF_HEADER_SIZE];
+ if (stream->read(riff_header, RIFF_HEADER_SIZE) != RIFF_HEADER_SIZE) {
+ ALOGE("WebP header load failed");
+ return;
+ }
+ mData.size = CHUNK_HEADER_SIZE + GetLE32(riff_header + TAG_SIZE);
+ mData.bytes = new uint8_t[mData.size];
+ memcpy((void*)mData.bytes, riff_header, RIFF_HEADER_SIZE);
+
+ // Read rest of the bytes.
+ void* remaining_bytes = (void*)(mData.bytes + RIFF_HEADER_SIZE);
+ size_t remaining_size = mData.size - RIFF_HEADER_SIZE;
+ if (stream->read(remaining_bytes, remaining_size) != remaining_size) {
+ ALOGE("WebP full load failed");
+ return;
+ }
}
// Construct demux.
@@ -120,8 +126,10 @@ FrameSequence_webp::FrameSequence_webp(Stream* stream) {
FrameSequence_webp::~FrameSequence_webp() {
WebPDemuxDelete(mDemux);
- delete[] mData.bytes;
delete[] mIsKeyFrame;
+ if (mRawByteBuffer == NULL) {
+ delete[] mData.bytes;
+ }
}
FrameSequenceState* FrameSequence_webp::createState() const {
@@ -366,6 +374,10 @@ static bool isWebP(void* header, int header_size) {
!memcmp("WEBP", header_str + 8, 4);
}
+static bool acceptsWebPBuffer() {
+ return true;
+}
+
static FrameSequence* createFramesequence(Stream* stream) {
return new FrameSequence_webp(stream);
}
@@ -375,6 +387,7 @@ static RegistryEntry gEntry = {
isWebP,
createFramesequence,
NULL,
+ acceptsWebPBuffer,
};
static Registry gRegister(gEntry);
diff --git a/framesequence/jni/FrameSequence_webp.h b/framesequence/jni/FrameSequence_webp.h
index f4fbec0..94dcc3b 100644
--- a/framesequence/jni/FrameSequence_webp.h
+++ b/framesequence/jni/FrameSequence_webp.h
@@ -51,6 +51,10 @@ public:
return mLoopCount;
}
+ virtual jobject getRawByteBuffer() const {
+ return mRawByteBuffer;
+ }
+
virtual FrameSequenceState* createState() const;
WebPDemuxer* getDemuxer() const { return mDemux; }
@@ -66,6 +70,7 @@ private:
uint32_t mFormatFlags;
// mIsKeyFrame[i] is true if ith canvas can be constructed without decoding any prior frames.
bool* mIsKeyFrame;
+ jobject mRawByteBuffer;
};
// Produces frames of a possibly-animated WebP file for display.
diff --git a/framesequence/jni/Registry.cpp b/framesequence/jni/Registry.cpp
index 125ac66..e632bb2 100644
--- a/framesequence/jni/Registry.cpp
+++ b/framesequence/jni/Registry.cpp
@@ -34,15 +34,26 @@ Registry::Registry(const RegistryEntry& entry) {
const RegistryEntry* Registry::Find(Stream* stream) {
Registry* registry = gHead;
- int headerSize = gHeaderBytesRequired;
- char header[headerSize];
- headerSize = stream->peek(header, headerSize);
- while (registry) {
- if (headerSize >= registry->mImpl.requiredHeaderBytes
- && registry->mImpl.checkHeader(header, headerSize)) {
- return &(registry->mImpl);
+
+ if (stream->getRawBuffer() != NULL) {
+ while (registry) {
+ if (registry->mImpl.acceptsBuffer()) {
+ return &(registry->mImpl);
+ }
+ registry = registry->mNext;
+ }
+ } else {
+ int headerSize = gHeaderBytesRequired;
+ char header[headerSize];
+ headerSize = stream->peek(header, headerSize);
+ while (registry) {
+ if (headerSize >= registry->mImpl.requiredHeaderBytes
+ && registry->mImpl.checkHeader(header, headerSize)) {
+ return &(registry->mImpl);
+ }
+ registry = registry->mNext;
}
- registry = registry->mNext;
}
return 0;
}
+
diff --git a/framesequence/jni/Registry.h b/framesequence/jni/Registry.h
index 571c611..8db43cf 100644
--- a/framesequence/jni/Registry.h
+++ b/framesequence/jni/Registry.h
@@ -17,6 +17,9 @@
#ifndef RASTERMILL_REGISTRY_H
#define RASTERMILL_REGISTRY_H
+#include "jni.h"
+#include <stdint.h>
+
class FrameSequence;
class Decoder;
class Stream;
@@ -26,6 +29,7 @@ struct RegistryEntry {
bool (*checkHeader)(void* header, int header_size);
FrameSequence* (*createFrameSequence)(Stream* stream);
Decoder* (*createDecoder)(Stream* stream);
+ bool (*acceptsBuffer)();
};
/**
diff --git a/framesequence/jni/Stream.cpp b/framesequence/jni/Stream.cpp
index b2e0c39..a576e66 100644
--- a/framesequence/jni/Stream.cpp
+++ b/framesequence/jni/Stream.cpp
@@ -79,6 +79,34 @@ size_t Stream::read(void* buffer, size_t size) {
return bytes_read;
}
+uint8_t* Stream::getRawBufferAddr() {
+ return NULL;
+}
+
+jobject Stream::getRawBuffer() {
+ return NULL;
+}
+
+int Stream::getRawBufferSize() {
+ return 0;
+}
+
+uint8_t* MemoryStream::getRawBufferAddr() {
+ return mBuffer;
+}
+
+jobject MemoryStream::getRawBuffer() {
+ return mRawBuffer;
+}
+
+int MemoryStream::getRawBufferSize() {
+ if (mRawBuffer != NULL) {
+ return mRemaining;
+ } else {
+ return 0;
+ }
+}
+
size_t MemoryStream::doRead(void* buffer, size_t size) {
size = min(size, mRemaining);
memcpy(buffer, mBuffer, size);
diff --git a/framesequence/jni/Stream.h b/framesequence/jni/Stream.h
index f8f2427..f0f3895 100644
--- a/framesequence/jni/Stream.h
+++ b/framesequence/jni/Stream.h
@@ -28,6 +28,9 @@ public:
size_t peek(void* buffer, size_t size);
size_t read(void* buffer, size_t size);
+ virtual uint8_t* getRawBufferAddr();
+ virtual jobject getRawBuffer();
+ virtual int getRawBufferSize();
protected:
virtual size_t doRead(void* buffer, size_t size) = 0;
@@ -40,16 +43,21 @@ private:
class MemoryStream : public Stream {
public:
- MemoryStream(void* buffer, size_t size) :
- mBuffer((char*)buffer),
- mRemaining(size) {}
+ MemoryStream(void* buffer, size_t size, jobject buf) :
+ mBuffer((uint8_t*)buffer),
+ mRemaining(size),
+ mRawBuffer(buf) {}
+ virtual uint8_t* getRawBufferAddr();
+ virtual jobject getRawBuffer();
+ virtual int getRawBufferSize();
protected:
virtual size_t doRead(void* buffer, size_t size);
private:
- char* mBuffer;
+ uint8_t* mBuffer;
size_t mRemaining;
+ jobject mRawBuffer;
};
class FileStream : public Stream {
diff --git a/framesequence/samples/RastermillSamples/Android.mk b/framesequence/samples/FrameSequenceSamples/Android.mk
index bb8920f..fff4a15 100644
--- a/framesequence/samples/RastermillSamples/Android.mk
+++ b/framesequence/samples/FrameSequenceSamples/Android.mk
@@ -35,6 +35,6 @@ LOCAL_SDK_VERSION := 19
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, res)
LOCAL_AAPT_FLAGS := --auto-add-overlay
-LOCAL_AAPT_FLAGS += --extra-packages com.android.rastermill.samples
+LOCAL_AAPT_FLAGS += --extra-packages com.android.framesequence.samples
include $(BUILD_PACKAGE)
diff --git a/framesequence/samples/RastermillSamples/AndroidManifest.xml b/framesequence/samples/FrameSequenceSamples/AndroidManifest.xml
index b554021..d614631 100644
--- a/framesequence/samples/RastermillSamples/AndroidManifest.xml
+++ b/framesequence/samples/FrameSequenceSamples/AndroidManifest.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.rastermill.samples"
+ package="com.android.framesequence.samples"
android:versionCode="1"
android:versionName="1.0" >
@@ -20,7 +20,7 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
- <activity android:name=".AnimatedGifTest" />
+ <activity android:name=".FrameSequenceTest" />
</application>
</manifest>
diff --git a/framesequence/samples/RastermillSamples/build.xml b/framesequence/samples/FrameSequenceSamples/build.xml
index 5e55b4e..5e55b4e 100644
--- a/framesequence/samples/RastermillSamples/build.xml
+++ b/framesequence/samples/FrameSequenceSamples/build.xml
diff --git a/framesequence/samples/RastermillSamples/proguard.flags b/framesequence/samples/FrameSequenceSamples/proguard.flags
index 4acde2d..4acde2d 100644
--- a/framesequence/samples/RastermillSamples/proguard.flags
+++ b/framesequence/samples/FrameSequenceSamples/proguard.flags
diff --git a/framesequence/samples/RastermillSamples/project.properties b/framesequence/samples/FrameSequenceSamples/project.properties
index ce39f2d..ce39f2d 100644
--- a/framesequence/samples/RastermillSamples/project.properties
+++ b/framesequence/samples/FrameSequenceSamples/project.properties
diff --git a/framesequence/samples/RastermillSamples/res/drawable-hdpi/ic_launcher.png b/framesequence/samples/FrameSequenceSamples/res/drawable-hdpi/ic_launcher.png
index 96a442e..96a442e 100644
--- a/framesequence/samples/RastermillSamples/res/drawable-hdpi/ic_launcher.png
+++ b/framesequence/samples/FrameSequenceSamples/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/framesequence/samples/RastermillSamples/res/drawable-mdpi/ic_launcher.png b/framesequence/samples/FrameSequenceSamples/res/drawable-mdpi/ic_launcher.png
index 359047d..359047d 100644
--- a/framesequence/samples/RastermillSamples/res/drawable-mdpi/ic_launcher.png
+++ b/framesequence/samples/FrameSequenceSamples/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/framesequence/samples/RastermillSamples/res/drawable-xhdpi/ic_launcher.png b/framesequence/samples/FrameSequenceSamples/res/drawable-xhdpi/ic_launcher.png
index 71c6d76..71c6d76 100644
--- a/framesequence/samples/RastermillSamples/res/drawable-xhdpi/ic_launcher.png
+++ b/framesequence/samples/FrameSequenceSamples/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/framesequence/samples/RastermillSamples/res/layout/basic_test_activity.xml b/framesequence/samples/FrameSequenceSamples/res/layout/basic_test_activity.xml
index 0b9a2df..0b9a2df 100644
--- a/framesequence/samples/RastermillSamples/res/layout/basic_test_activity.xml
+++ b/framesequence/samples/FrameSequenceSamples/res/layout/basic_test_activity.xml
diff --git a/framesequence/samples/RastermillSamples/res/raw/animated.gif b/framesequence/samples/FrameSequenceSamples/res/raw/animated_gif.gif
index 51baf15..51baf15 100644
--- a/framesequence/samples/RastermillSamples/res/raw/animated.gif
+++ b/framesequence/samples/FrameSequenceSamples/res/raw/animated_gif.gif
Binary files differ
diff --git a/framesequence/samples/FrameSequenceSamples/res/raw/animated_webp.webp b/framesequence/samples/FrameSequenceSamples/res/raw/animated_webp.webp
new file mode 100644
index 0000000..25c6a4d
--- /dev/null
+++ b/framesequence/samples/FrameSequenceSamples/res/raw/animated_webp.webp
Binary files differ
diff --git a/framesequence/samples/RastermillSamples/res/values/strings.xml b/framesequence/samples/FrameSequenceSamples/res/values/strings.xml
index 811c979..dc0962e 100644
--- a/framesequence/samples/RastermillSamples/res/values/strings.xml
+++ b/framesequence/samples/FrameSequenceSamples/res/values/strings.xml
@@ -3,7 +3,7 @@
<!-- NOTE: all strings should be marked as translatable=false,
since this sample app is for testing, and won't be shipped -->
- <string name="app_name" translatable="false">Rastermill Samples</string>
+ <string name="app_name" translatable="false">FrameSequence Samples</string>
<string name="action_settings" translatable="false">Settings</string>
<string name="start" translatable="false">start</string>
diff --git a/framesequence/samples/RastermillSamples/res/values/styles.xml b/framesequence/samples/FrameSequenceSamples/res/values/styles.xml
index 737bdc3..737bdc3 100644
--- a/framesequence/samples/RastermillSamples/res/values/styles.xml
+++ b/framesequence/samples/FrameSequenceSamples/res/values/styles.xml
diff --git a/framesequence/samples/RastermillSamples/src/com/android/rastermill/samples/AnimatedGifTest.java b/framesequence/samples/FrameSequenceSamples/src/com/android/framesequence/samples/FrameSequenceTest.java
index 2328975..5587dc6 100644
--- a/framesequence/samples/RastermillSamples/src/com/android/rastermill/samples/AnimatedGifTest.java
+++ b/framesequence/samples/FrameSequenceSamples/src/com/android/framesequence/samples/FrameSequenceTest.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.rastermill.samples;
+package com.android.framesequence.samples;
import android.app.Activity;
import android.graphics.Bitmap;
@@ -27,8 +27,9 @@ import android.widget.Toast;
import java.io.InputStream;
import java.util.HashSet;
-public class AnimatedGifTest extends Activity {
+public class FrameSequenceTest extends Activity {
FrameSequenceDrawable mDrawable;
+ int mResourceId;
// This provider is entirely unnecessary, just here to validate the acquire/release process
private class CheckingProvider implements FrameSequenceDrawable.BitmapProvider {
@@ -59,6 +60,8 @@ public class AnimatedGifTest extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ mResourceId = getIntent().getIntExtra("resourceId", R.raw.animated_gif);
+
setContentView(R.layout.basic_test_activity);
findViewById(R.id.start).setOnClickListener(new View.OnClickListener() {
@Override
@@ -91,7 +94,7 @@ public class AnimatedGifTest extends Activity {
super.onResume();
ImageView imageView = (ImageView) findViewById(R.id.imageview);
- InputStream is = getResources().openRawResource(R.raw.animated);
+ InputStream is = getResources().openRawResource(mResourceId);
FrameSequence fs = FrameSequence.decodeStream(is);
mDrawable = new FrameSequenceDrawable(fs, mProvider);
@@ -99,7 +102,7 @@ public class AnimatedGifTest extends Activity {
@Override
public void onFinished(FrameSequenceDrawable drawable) {
Toast.makeText(getApplicationContext(),
- "THE ANIMATION HAS FINISHED", Toast.LENGTH_SHORT).show();
+ "The animation has finished", Toast.LENGTH_SHORT).show();
}
});
imageView.setImageDrawable(mDrawable);
diff --git a/framesequence/samples/RastermillSamples/src/com/android/rastermill/samples/SamplesList.java b/framesequence/samples/FrameSequenceSamples/src/com/android/framesequence/samples/SamplesList.java
index 0447537..c67b83c 100644
--- a/framesequence/samples/RastermillSamples/src/com/android/rastermill/samples/SamplesList.java
+++ b/framesequence/samples/FrameSequenceSamples/src/com/android/framesequence/samples/SamplesList.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.rastermill.samples;
+package com.android.framesequence.samples;
import android.app.ListActivity;
import android.content.Intent;
@@ -31,17 +31,20 @@ public class SamplesList extends ListActivity {
static final String KEY_NAME = "name";
static final String KEY_CLASS = "clazz";
+ static final String KEY_RESOURCE = "res";
- static Map<String,?> makeSample(String name, Class<?> activity) {
+ static Map<String,?> makeSample(String name, Class<?> activity, int resourceId) {
Map<String,Object> ret = new HashMap<String,Object>();
ret.put(KEY_NAME, name);
ret.put(KEY_CLASS, activity);
+ ret.put(KEY_RESOURCE, resourceId);
return ret;
}
@SuppressWarnings("serial")
static final ArrayList<Map<String,?>> SAMPLES = new ArrayList<Map<String,?>>() {{
- add(makeSample("Animation Test", AnimatedGifTest.class));
+ add(makeSample("GIF animation", FrameSequenceTest.class, R.raw.animated_gif));
+ add(makeSample("WEBP animation", FrameSequenceTest.class, R.raw.animated_webp));
}};
@Override
@@ -55,7 +58,11 @@ public class SamplesList extends ListActivity {
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Class<?> clazz = (Class<?>) SAMPLES.get(position).get(KEY_CLASS);
- startActivity(new Intent(this, clazz));
+ int resourceId = ((Integer) SAMPLES.get(position).get(KEY_RESOURCE)).intValue();
+
+ Intent intent = new Intent(this, clazz);
+ intent.putExtra("resourceId", resourceId);
+ startActivity(intent);
}
}
diff --git a/framesequence/src/android/support/rastermill/FrameSequence.java b/framesequence/src/android/support/rastermill/FrameSequence.java
index d2bd128..8ff241f 100644
--- a/framesequence/src/android/support/rastermill/FrameSequence.java
+++ b/framesequence/src/android/support/rastermill/FrameSequence.java
@@ -17,6 +17,7 @@
package android.support.rastermill;
import android.graphics.Bitmap;
+import java.nio.ByteBuffer;
import java.io.InputStream;
@@ -40,6 +41,7 @@ public class FrameSequence {
private static native FrameSequence nativeDecodeByteArray(byte[] data, int offset, int length);
private static native FrameSequence nativeDecodeStream(InputStream is, byte[] tempStorage);
+ private static native FrameSequence nativeDecodeByteBuffer(ByteBuffer buffer, int offset, int capacity);
private static native void nativeDestroyFrameSequence(long nativeFrameSequence);
private static native long nativeCreateState(long nativeFrameSequence);
private static native void nativeDestroyState(long nativeState);
@@ -69,6 +71,19 @@ public class FrameSequence {
return nativeDecodeByteArray(data, offset, length);
}
+ public static FrameSequence decodeByteBuffer(ByteBuffer buffer) {
+ if (buffer == null) throw new IllegalArgumentException();
+ if (!buffer.isDirect()) {
+ if (buffer.hasArray()) {
+ byte[] byteArray = buffer.array();
+ return decodeByteArray(byteArray, buffer.position(), buffer.remaining());
+ } else {
+ throw new IllegalArgumentException("Cannot have non-direct ByteBuffer with no byte array");
+ }
+ }
+ return nativeDecodeByteBuffer(buffer, buffer.position(), buffer.remaining());
+ }
+
public static FrameSequence decodeStream(InputStream stream) {
if (stream == null) throw new IllegalArgumentException();
byte[] tempStorage = new byte[16 * 1024]; // TODO: use buffer pool