130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni/* 230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * Copyright (C) 2011 The Android Open Source Project 330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * 430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * Licensed under the Apache License, Version 2.0 (the "License"); 530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * you may not use this file except in compliance with the License. 630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * You may obtain a copy of the License at 730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * 830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * http://www.apache.org/licenses/LICENSE-2.0 930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * 1030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * Unless required by applicable law or agreed to in writing, software 1130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * distributed under the License is distributed on an "AS IS" BASIS, 1230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * See the License for the specific language governing permissions and 1430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni * limitations under the License. 1530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni */ 1630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 1730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 1830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceronipackage android.filterfw.core; 1930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 2030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.Frame; 2130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.FrameFormat; 2230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.FrameManager; 2330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.filterfw.core.NativeBuffer; 2421d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Rennimport android.filterfw.format.ObjectFormat; 2530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport android.graphics.Bitmap; 2630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 2730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport java.lang.reflect.Constructor; 2830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroniimport java.nio.ByteBuffer; 2930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 30a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala/** 31a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala * @hide 32a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala */ 33bf4aaebc555cfb1e49ee411e3477203749fe6a11Marius Rennpublic class SimpleFrame extends Frame { 3430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 3530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni private Object mObject; 3630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 37bf4aaebc555cfb1e49ee411e3477203749fe6a11Marius Renn SimpleFrame(FrameFormat format, FrameManager frameManager) { 3830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni super(format, frameManager); 39cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn initWithFormat(format); 4030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni setReusable(false); 4130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 4230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 43bf4aaebc555cfb1e49ee411e3477203749fe6a11Marius Renn static SimpleFrame wrapObject(Object object, FrameManager frameManager) { 44bf4aaebc555cfb1e49ee411e3477203749fe6a11Marius Renn FrameFormat format = ObjectFormat.fromObject(object, FrameFormat.TARGET_SIMPLE); 45bf4aaebc555cfb1e49ee411e3477203749fe6a11Marius Renn SimpleFrame result = new SimpleFrame(format, frameManager); 4621d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn result.setObjectValue(object); 4721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn return result; 4821d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn } 4921d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn 5030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni private void initWithFormat(FrameFormat format) { 5130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni final int count = format.getLength(); 5230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni final int baseType = format.getBaseType(); 53cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn switch (baseType) { 54cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn case FrameFormat.TYPE_BYTE: 55cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn mObject = new byte[count]; 56cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn break; 57cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn case FrameFormat.TYPE_INT16: 58cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn mObject = new short[count]; 59cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn break; 60cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn case FrameFormat.TYPE_INT32: 61cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn mObject = new int[count]; 62cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn break; 63cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn case FrameFormat.TYPE_FLOAT: 64cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn mObject = new float[count]; 65cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn break; 66cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn case FrameFormat.TYPE_DOUBLE: 67cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn mObject = new double[count]; 68cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn break; 69cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn default: 70cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn mObject = null; 71cfda0a38d6f394724e0cbd831ec9bc71d951fc74Marius Renn break; 7230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 7330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 7430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 7533d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua @Override 76f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn protected boolean hasNativeAllocation() { 77f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn return false; 78f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn } 79f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn 80f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn @Override 81f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn protected void releaseNativeAllocation() { 8230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 8330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 8433d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua @Override 8530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni public Object getObjectValue() { 8630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return mObject; 8730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 8830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 8933d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua @Override 9030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni public void setInts(int[] ints) { 9130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni assertFrameMutable(); 9230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni setGenericObjectValue(ints); 9330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 9430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 9533d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua @Override 9630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni public int[] getInts() { 9730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return (mObject instanceof int[]) ? (int[])mObject : null; 9830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 9930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 10033d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua @Override 10130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni public void setFloats(float[] floats) { 10230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni assertFrameMutable(); 10330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni setGenericObjectValue(floats); 10430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 10530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 10633d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua @Override 10730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni public float[] getFloats() { 10830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return (mObject instanceof float[]) ? (float[])mObject : null; 10930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 11030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 11133d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua @Override 11230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni public void setData(ByteBuffer buffer, int offset, int length) { 11330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni assertFrameMutable(); 11430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni setGenericObjectValue(ByteBuffer.wrap(buffer.array(), offset, length)); 11530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 11630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 11733d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua @Override 11830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni public ByteBuffer getData() { 11930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return (mObject instanceof ByteBuffer) ? (ByteBuffer)mObject : null; 12030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 12130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 12233d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua @Override 12330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni public void setBitmap(Bitmap bitmap) { 12430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni assertFrameMutable(); 12530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni setGenericObjectValue(bitmap); 12630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 12730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 12833d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua @Override 12930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni public Bitmap getBitmap() { 13030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni return (mObject instanceof Bitmap) ? (Bitmap)mObject : null; 13130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 13230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 13330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni private void setFormatObjectClass(Class objectClass) { 13430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni MutableFrameFormat format = getFormat().mutableCopy(); 13530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni format.setObjectClass(objectClass); 13630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni setFormat(format); 13730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 13830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 13933d107bf315c9cc01a02a7a4a2c10a01f62e8c85Wei Hua @Override 14030ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni protected void setGenericObjectValue(Object object) { 14130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni // Update the FrameFormat class 14230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni // TODO: Take this out! FrameFormats should not be modified and convenience formats used 14330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni // instead! 14430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni FrameFormat format = getFormat(); 14530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni if (format.getObjectClass() == null) { 14630ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni setFormatObjectClass(object.getClass()); 14730ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } else if (!format.getObjectClass().isAssignableFrom(object.getClass())) { 14830ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni throw new RuntimeException( 14930ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni "Attempting to set object value of type '" + object.getClass() + "' on " + 150bf4aaebc555cfb1e49ee411e3477203749fe6a11Marius Renn "SimpleFrame of type '" + format.getObjectClass() + "'!"); 15130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 15230ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni 15330ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni // Set the object value 15430ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni mObject = object; 15530ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni } 156f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn 157f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn @Override 158f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn public String toString() { 159bf4aaebc555cfb1e49ee411e3477203749fe6a11Marius Renn return "SimpleFrame (" + getFormat() + ")"; 160f5ae8eafa7605c6593f62f873b62cb64a3254db3Marius Renn } 16130ab3fc173709a491c9e2e103f53fb7c0d1b96b7Rodrigo Carceroni} 162