SerializedFrame.java revision 65953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9
165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn/* 265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Copyright (C) 2011 The Android Open Source Project 365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * 465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Licensed under the Apache License, Version 2.0 (the "License"); 565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * you may not use this file except in compliance with the License. 665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * You may obtain a copy of the License at 765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * 865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * http://www.apache.org/licenses/LICENSE-2.0 965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * 1065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Unless required by applicable law or agreed to in writing, software 1165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * distributed under the License is distributed on an "AS IS" BASIS, 1265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * See the License for the specific language governing permissions and 1465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * limitations under the License. 1565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */ 1665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 1765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 1865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennpackage android.filterfw.core; 1965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 2065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport android.filterfw.core.Frame; 2165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport android.filterfw.core.FrameFormat; 2265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport android.filterfw.core.FrameManager; 2365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport android.filterfw.core.NativeBuffer; 2465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport android.filterfw.format.ObjectFormat; 2565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport android.graphics.Bitmap; 2665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 2765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport java.io.InputStream; 2865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport java.io.IOException; 2965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport java.io.ObjectInputStream; 3065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport java.io.ObjectOutputStream; 3165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport java.io.OptionalDataException; 3265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport java.io.OutputStream; 3365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport java.io.StreamCorruptedException; 3465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport java.lang.reflect.Constructor; 3565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport java.nio.ByteBuffer; 3665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 3765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn/** 3865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * A frame that serializes any assigned values. Such a frame is used when passing data objects 3965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * between threads. 4065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * 4165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * @hide 4265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */ 4365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennpublic class SerializedFrame extends Frame { 4465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 4565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn /** 4665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * The initial capacity of the serialized data stream. 4765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */ 4865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private final static int INITIAL_CAPACITY = 64; 4965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 5065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn /** 5165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * The internal data streams. 5265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */ 5365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private DirectByteOutputStream mByteOutputStream; 5465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private ObjectOutputStream mObjectOut; 5565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 5665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn /** 5765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * An unsynchronized output stream that writes data to an accessible byte array. Callers are 5865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * responsible for synchronization. This is more efficient than a ByteArrayOutputStream, as 5965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * there are no array copies or synchronization involved to read back written data. 6065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */ 6165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private class DirectByteOutputStream extends OutputStream { 6265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private byte[] mBuffer = null; 6365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private int mOffset = 0; 6465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private int mDataOffset = 0; 6565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 6665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public DirectByteOutputStream(int size) { 6765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mBuffer = new byte[size]; 6865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 6965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 7065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private final void ensureFit(int bytesToWrite) { 7165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (mOffset + bytesToWrite > mBuffer.length) { 7265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn byte[] oldBuffer = mBuffer; 7365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mBuffer = new byte[Math.max(mOffset + bytesToWrite, mBuffer.length * 2)]; 7465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn System.arraycopy(oldBuffer, 0, mBuffer, 0, mOffset); 7565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn oldBuffer = null; 7665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 7765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 7865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 7965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public final void markHeaderEnd() { 8065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mDataOffset = mOffset; 8165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 8265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 8365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public final int getSize() { 8465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return mOffset; 8565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 8665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 8765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public byte[] getByteArray() { 8865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return mBuffer; 8965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 9065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 9165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn @Override 9265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public final void write(byte b[]) { 9365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn write(b, 0, b.length); 9465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 9565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 9665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn @Override 9765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public final void write(byte b[], int off, int len) { 9865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn ensureFit(len); 9965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn System.arraycopy(b, off, mBuffer, mOffset, len); 10065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mOffset += len; 10165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 10265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 10365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn @Override 10465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public final void write(int b) { 10565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn ensureFit(1); 10665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mBuffer[mOffset++] = (byte)b; 10765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 10865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 10965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public final void reset() { 11065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mOffset = mDataOffset; 11165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 11265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 11365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public final DirectByteInputStream getInputStream() { 11465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return new DirectByteInputStream(mBuffer, mOffset); 11565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 11665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 11765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 11865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn /** 11965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * An unsynchronized input stream that reads data directly from a provided byte array. Callers 12065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * are responsible for synchronization and ensuring that the byte buffer is valid. 12165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */ 12265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private class DirectByteInputStream extends InputStream { 12365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 12465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private byte[] mBuffer; 12565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private int mPos = 0; 12665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private int mSize; 12765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 12865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public DirectByteInputStream(byte[] buffer, int size) { 12965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mBuffer = buffer; 13065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mSize = size; 13165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 13265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 13365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn @Override 13465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public final int available() { 13565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return mSize - mPos; 13665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 13765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 13865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn @Override 13965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public final int read() { 14065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return (mPos < mSize) ? (mBuffer[mPos++] & 0xFF) : -1; 14165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 14265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 14365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn @Override 14465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public final int read(byte[] b, int off, int len) { 14565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (mPos >= mSize) { 14665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return -1; 14765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 14865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if ((mPos + len) > mSize) { 14965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn len = mSize - mPos; 15065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 15165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn System.arraycopy(mBuffer, mPos, b, off, len); 15265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mPos += len; 15365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return len; 15465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 15565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 15665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn @Override 15765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public final long skip(long n) { 15865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if ((mPos + n) > mSize) { 15965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn n = mSize - mPos; 16065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 16165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (n < 0) { 16265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return 0; 16365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 16465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mPos += n; 16565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return n; 16665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 16765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 16865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 16965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn SerializedFrame(FrameFormat format, FrameManager frameManager) { 17065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn super(format, frameManager); 17165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn setReusable(false); 17265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 17365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Setup streams 17465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn try { 17565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mByteOutputStream = new DirectByteOutputStream(INITIAL_CAPACITY); 17665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mObjectOut = new ObjectOutputStream(mByteOutputStream); 17765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mByteOutputStream.markHeaderEnd(); 17865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } catch (IOException e) { 17965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn throw new RuntimeException("Could not create serialization streams for " 18065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn + "SerializedFrame!", e); 18165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 18265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 18365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 18465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn static SerializedFrame wrapObject(Object object, FrameManager frameManager) { 18565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn FrameFormat format = ObjectFormat.fromObject(object, FrameFormat.TARGET_SIMPLE); 18665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn SerializedFrame result = new SerializedFrame(format, frameManager); 18765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn result.setObjectValue(object); 18865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return result; 18965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 19065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 19165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn @Override 19265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn protected boolean hasNativeAllocation() { 19365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return false; 19465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 19565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 19665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn @Override 19765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn protected void releaseNativeAllocation() { 19865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 19965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 20065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn @Override 20165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public Object getObjectValue() { 20265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return deserializeObjectValue(); 20365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 20465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 20565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn @Override 20665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public void setInts(int[] ints) { 20765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn assertFrameMutable(); 20865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn setGenericObjectValue(ints); 20965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 21065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 21165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn @Override 21265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public int[] getInts() { 21365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn Object result = deserializeObjectValue(); 21465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return (result instanceof int[]) ? (int[])result : null; 21565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 21665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 21765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn @Override 21865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public void setFloats(float[] floats) { 21965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn assertFrameMutable(); 22065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn setGenericObjectValue(floats); 22165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 22265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 22365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn @Override 22465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public float[] getFloats() { 22565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn Object result = deserializeObjectValue(); 22665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return (result instanceof float[]) ? (float[])result : null; 22765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 22865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 22965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn @Override 23065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public void setData(ByteBuffer buffer, int offset, int length) { 23165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn assertFrameMutable(); 23265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn setGenericObjectValue(ByteBuffer.wrap(buffer.array(), offset, length)); 23365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 23465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 23565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn @Override 23665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public ByteBuffer getData() { 23765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn Object result = deserializeObjectValue(); 23865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return (result instanceof ByteBuffer) ? (ByteBuffer)result : null; 23965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 24065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 24165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn @Override 24265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public void setBitmap(Bitmap bitmap) { 24365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn assertFrameMutable(); 24465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn setGenericObjectValue(bitmap); 24565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 24665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 24765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn @Override 24865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public Bitmap getBitmap() { 24965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn Object result = deserializeObjectValue(); 25065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return (result instanceof Bitmap) ? (Bitmap)result : null; 25165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 25265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 25365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn @Override 25465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn protected void setGenericObjectValue(Object object) { 25565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn serializeObjectValue(object); 25665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 25765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 25865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private final void serializeObjectValue(Object object) { 25965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn try { 26065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mByteOutputStream.reset(); 26165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mObjectOut.writeObject(object); 26265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mObjectOut.flush(); 26365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mObjectOut.close(); 26465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } catch (IOException e) { 26565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn throw new RuntimeException("Could not serialize object " + object + " in " 26665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn + this + "!", e); 26765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 26865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 26965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 27065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private final Object deserializeObjectValue() { 27165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn try { 27265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn InputStream inputStream = mByteOutputStream.getInputStream(); 27365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn ObjectInputStream objectStream = new ObjectInputStream(inputStream); 27465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return objectStream.readObject(); 27565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } catch (IOException e) { 27665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn throw new RuntimeException("Could not deserialize object in " + this + "!", e); 27765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } catch (ClassNotFoundException e) { 27865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn throw new RuntimeException("Unable to deserialize object of unknown class in " 27965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn + this + "!", e); 28065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 28165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 28265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 28365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn @Override 28465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public String toString() { 28565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return "SerializedFrame (" + getFormat() + ")"; 28665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 28765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} 288