• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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