121d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn/* 221d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn * Copyright (C) 2011 The Android Open Source Project 321d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn * 421d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn * Licensed under the Apache License, Version 2.0 (the "License"); 521d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn * you may not use this file except in compliance with the License. 621d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn * You may obtain a copy of the License at 721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn * 821d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn * http://www.apache.org/licenses/LICENSE-2.0 921d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn * 1021d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn * Unless required by applicable law or agreed to in writing, software 1121d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn * distributed under the License is distributed on an "AS IS" BASIS, 1221d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1321d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn * See the License for the specific language governing permissions and 1421d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn * limitations under the License. 1521d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn */ 1621d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn 1721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn 1821d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Rennpackage android.filterfw.format; 1921d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn 2021d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Rennimport android.filterfw.core.FrameFormat; 2121d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Rennimport android.filterfw.core.MutableFrameFormat; 2221d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Rennimport android.filterfw.core.NativeBuffer; 2321d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn 24a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala/** 25a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala * @hide 26a3bfbe5389c6146abe318a7add3fa688d69bc01bEino-Ville Talvala */ 2721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Rennpublic class ObjectFormat { 2821d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn 2921d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn public static MutableFrameFormat fromClass(Class clazz, int count, int target) { 3021d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn // Create frame format 3121d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn MutableFrameFormat result = new MutableFrameFormat(FrameFormat.TYPE_OBJECT, target); 32489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn result.setObjectClass(getBoxedClass(clazz)); 3321d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn if (count != FrameFormat.SIZE_UNSPECIFIED) { 3421d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn result.setDimensions(count); 3521d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn } 3621d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn result.setBytesPerSample(bytesPerSampleForClass(clazz, target)); 3721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn return result; 3821d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn } 3921d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn 4021d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn public static MutableFrameFormat fromClass(Class clazz, int target) { 4121d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn return fromClass(clazz, FrameFormat.SIZE_UNSPECIFIED, target); 4221d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn } 4321d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn 4421d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn public static MutableFrameFormat fromObject(Object object, int target) { 454b7aa0db47d885d6cb8948442916a560f5e5162aMarius Renn return object == null 464b7aa0db47d885d6cb8948442916a560f5e5162aMarius Renn ? new MutableFrameFormat(FrameFormat.TYPE_OBJECT, target) 474b7aa0db47d885d6cb8948442916a560f5e5162aMarius Renn : fromClass(object.getClass(), FrameFormat.SIZE_UNSPECIFIED, target); 4821d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn } 4921d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn 5021d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn public static MutableFrameFormat fromObject(Object object, int count, int target) { 514b7aa0db47d885d6cb8948442916a560f5e5162aMarius Renn return object == null 524b7aa0db47d885d6cb8948442916a560f5e5162aMarius Renn ? new MutableFrameFormat(FrameFormat.TYPE_OBJECT, target) 534b7aa0db47d885d6cb8948442916a560f5e5162aMarius Renn : fromClass(object.getClass(), count, target); 5421d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn } 5521d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn 5621d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn private static int bytesPerSampleForClass(Class clazz, int target) { 5721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn // Native targets have objects manifested in a byte buffer. Thus it is important to 5821d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn // correctly determine the size of single element here. 5921d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn if (target == FrameFormat.TARGET_NATIVE) { 6021d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn if (!NativeBuffer.class.isAssignableFrom(clazz)) { 6121d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn throw new IllegalArgumentException("Native object-based formats must be of a " + 6221d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn "NativeBuffer subclass! (Received class: " + clazz + ")."); 6321d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn } 6421d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn try { 6521d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn return ((NativeBuffer)clazz.newInstance()).getElementSize(); 6621d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn } catch (Exception e) { 6721d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn throw new RuntimeException("Could not determine the size of an element in a " 6821d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn + "native object-based frame of type " + clazz + "! Perhaps it is missing a " 6921d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn + "default constructor?"); 7021d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn } 7121d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn } else { 7221d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn return FrameFormat.BYTES_PER_SAMPLE_UNSPECIFIED; 7321d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn } 7421d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn } 75489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn 76489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn private static Class getBoxedClass(Class type) { 77489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn // Check if type is primitive 78489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn if (type.isPrimitive()) { 79489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn // Yes -> box it 80489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn if (type == boolean.class) { 81489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn return java.lang.Boolean.class; 82489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn } else if (type == byte.class) { 83489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn return java.lang.Byte.class; 84489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn } else if (type == char.class) { 85489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn return java.lang.Character.class; 86489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn } else if (type == short.class) { 87489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn return java.lang.Short.class; 88489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn } else if (type == int.class) { 89489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn return java.lang.Integer.class; 90489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn } else if (type == long.class) { 91489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn return java.lang.Long.class; 92489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn } else if (type == float.class) { 93489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn return java.lang.Float.class; 94489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn } else if (type == double.class) { 95489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn return java.lang.Double.class; 96489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn } else { 97489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn throw new IllegalArgumentException( 98489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn "Unknown primitive type: " + type.getSimpleName() + "!"); 99489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn } 100489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn } else { 101489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn // No -> return it 102489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn return type; 103489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn } 104489c240d3ae33e83dc62ea6f3cc864e47c0e2e3bMarius Renn } 10521d0ac7403b836e32e2bdbdc8dc98f42b2dfa4e5Marius Renn} 106