1 /* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 18 package android.filterfw.core; 19 20 import android.filterfw.core.FrameFormat; 21 import android.filterfw.core.FrameManager; 22 import android.graphics.Bitmap; 23 import android.util.Log; 24 25 import java.nio.ByteBuffer; 26 27 /** 28 * @hide 29 */ 30 public abstract class Frame { 31 32 public final static int NO_BINDING = 0; 33 34 public final static long TIMESTAMP_NOT_SET = -2; 35 public final static long TIMESTAMP_UNKNOWN = -1; 36 37 private FrameFormat mFormat; 38 private FrameManager mFrameManager; 39 private boolean mReadOnly = false; 40 private boolean mReusable = false; 41 private int mRefCount = 1; 42 private int mBindingType = NO_BINDING; 43 private long mBindingId = 0; 44 private long mTimestamp = TIMESTAMP_NOT_SET; 45 Frame(FrameFormat format, FrameManager frameManager)46 Frame(FrameFormat format, FrameManager frameManager) { 47 mFormat = format.mutableCopy(); 48 mFrameManager = frameManager; 49 } 50 Frame(FrameFormat format, FrameManager frameManager, int bindingType, long bindingId)51 Frame(FrameFormat format, FrameManager frameManager, int bindingType, long bindingId) { 52 mFormat = format.mutableCopy(); 53 mFrameManager = frameManager; 54 mBindingType = bindingType; 55 mBindingId = bindingId; 56 } 57 getFormat()58 public FrameFormat getFormat() { 59 return mFormat; 60 } 61 getCapacity()62 public int getCapacity() { 63 return getFormat().getSize(); 64 } 65 isReadOnly()66 public boolean isReadOnly() { 67 return mReadOnly; 68 } 69 getBindingType()70 public int getBindingType() { 71 return mBindingType; 72 } 73 getBindingId()74 public long getBindingId() { 75 return mBindingId; 76 } 77 setObjectValue(Object object)78 public void setObjectValue(Object object) { 79 assertFrameMutable(); 80 81 // Attempt to set the value using a specific setter (which may be more optimized), and 82 // fall back to the setGenericObjectValue(...) in case of no match. 83 if (object instanceof int[]) { 84 setInts((int[])object); 85 } else if (object instanceof float[]) { 86 setFloats((float[])object); 87 } else if (object instanceof ByteBuffer) { 88 setData((ByteBuffer)object); 89 } else if (object instanceof Bitmap) { 90 setBitmap((Bitmap)object); 91 } else { 92 setGenericObjectValue(object); 93 } 94 } 95 getObjectValue()96 public abstract Object getObjectValue(); 97 setInts(int[] ints)98 public abstract void setInts(int[] ints); 99 getInts()100 public abstract int[] getInts(); 101 setFloats(float[] floats)102 public abstract void setFloats(float[] floats); 103 getFloats()104 public abstract float[] getFloats(); 105 setData(ByteBuffer buffer, int offset, int length)106 public abstract void setData(ByteBuffer buffer, int offset, int length); 107 setData(ByteBuffer buffer)108 public void setData(ByteBuffer buffer) { 109 setData(buffer, 0, buffer.limit()); 110 } 111 setData(byte[] bytes, int offset, int length)112 public void setData(byte[] bytes, int offset, int length) { 113 setData(ByteBuffer.wrap(bytes, offset, length)); 114 } 115 getData()116 public abstract ByteBuffer getData(); 117 setBitmap(Bitmap bitmap)118 public abstract void setBitmap(Bitmap bitmap); 119 getBitmap()120 public abstract Bitmap getBitmap(); 121 setTimestamp(long timestamp)122 public void setTimestamp(long timestamp) { 123 mTimestamp = timestamp; 124 } 125 getTimestamp()126 public long getTimestamp() { 127 return mTimestamp; 128 } 129 setDataFromFrame(Frame frame)130 public void setDataFromFrame(Frame frame) { 131 setData(frame.getData()); 132 } 133 requestResize(int[] newDimensions)134 protected boolean requestResize(int[] newDimensions) { 135 return false; 136 } 137 getRefCount()138 public int getRefCount() { 139 return mRefCount; 140 } 141 release()142 public Frame release() { 143 if (mFrameManager != null) { 144 return mFrameManager.releaseFrame(this); 145 } else { 146 return this; 147 } 148 } 149 retain()150 public Frame retain() { 151 if (mFrameManager != null) { 152 return mFrameManager.retainFrame(this); 153 } else { 154 return this; 155 } 156 } 157 getFrameManager()158 public FrameManager getFrameManager() { 159 return mFrameManager; 160 } 161 assertFrameMutable()162 protected void assertFrameMutable() { 163 if (isReadOnly()) { 164 throw new RuntimeException("Attempting to modify read-only frame!"); 165 } 166 } 167 setReusable(boolean reusable)168 protected void setReusable(boolean reusable) { 169 mReusable = reusable; 170 } 171 setFormat(FrameFormat format)172 protected void setFormat(FrameFormat format) { 173 mFormat = format.mutableCopy(); 174 } 175 setGenericObjectValue(Object value)176 protected void setGenericObjectValue(Object value) { 177 throw new RuntimeException( 178 "Cannot set object value of unsupported type: " + value.getClass()); 179 } 180 convertBitmapToRGBA(Bitmap bitmap)181 protected static Bitmap convertBitmapToRGBA(Bitmap bitmap) { 182 if (bitmap.getConfig() == Bitmap.Config.ARGB_8888) { 183 return bitmap; 184 } else { 185 Bitmap result = bitmap.copy(Bitmap.Config.ARGB_8888, false); 186 if (result == null) { 187 throw new RuntimeException("Error converting bitmap to RGBA!"); 188 } else if (result.getRowBytes() != result.getWidth() * 4) { 189 throw new RuntimeException("Unsupported row byte count in bitmap!"); 190 } 191 return result; 192 } 193 } 194 reset(FrameFormat newFormat)195 protected void reset(FrameFormat newFormat) { 196 mFormat = newFormat.mutableCopy(); 197 mReadOnly = false; 198 mRefCount = 1; 199 } 200 201 /** 202 * Called just before a frame is stored, such as when storing to a cache or context. 203 */ onFrameStore()204 protected void onFrameStore() { 205 } 206 207 /** 208 * Called when a frame is fetched from an internal store such as a cache. 209 */ onFrameFetch()210 protected void onFrameFetch() { 211 } 212 213 // Core internal methods /////////////////////////////////////////////////////////////////////// hasNativeAllocation()214 protected abstract boolean hasNativeAllocation(); 215 releaseNativeAllocation()216 protected abstract void releaseNativeAllocation(); 217 incRefCount()218 final int incRefCount() { 219 ++mRefCount; 220 return mRefCount; 221 } 222 decRefCount()223 final int decRefCount() { 224 --mRefCount; 225 return mRefCount; 226 } 227 isReusable()228 final boolean isReusable() { 229 return mReusable; 230 } 231 markReadOnly()232 final void markReadOnly() { 233 mReadOnly = true; 234 } 235 236 } 237