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.FrameFormat; 2165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport android.filterfw.core.FrameManager; 2265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport android.graphics.Bitmap; 2365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport android.util.Log; 2465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 2565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennimport java.nio.ByteBuffer; 2665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 2765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn/** 2865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * @hide 2965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */ 3065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennpublic abstract class Frame { 3165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 3265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public final static int NO_BINDING = 0; 3365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 3465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public final static long TIMESTAMP_NOT_SET = -2; 3565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public final static long TIMESTAMP_UNKNOWN = -1; 3665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 3765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private FrameFormat mFormat; 3865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private FrameManager mFrameManager; 3965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private boolean mReadOnly = false; 4065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private boolean mReusable = false; 4165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private int mRefCount = 1; 4265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private int mBindingType = NO_BINDING; 4365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private long mBindingId = 0; 4465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn private long mTimestamp = TIMESTAMP_NOT_SET; 4565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 4665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn Frame(FrameFormat format, FrameManager frameManager) { 4765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mFormat = format.mutableCopy(); 4865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mFrameManager = frameManager; 4965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 5065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 5165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn Frame(FrameFormat format, FrameManager frameManager, int bindingType, long bindingId) { 5265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mFormat = format.mutableCopy(); 5365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mFrameManager = frameManager; 5465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mBindingType = bindingType; 5565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mBindingId = bindingId; 5665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 5765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 5865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public FrameFormat getFormat() { 5965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return mFormat; 6065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 6165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 6265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public int getCapacity() { 6365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return getFormat().getSize(); 6465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 6565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 6665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public boolean isReadOnly() { 6765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return mReadOnly; 6865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 6965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 7065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public int getBindingType() { 7165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return mBindingType; 7265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 7365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 7465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public long getBindingId() { 7565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return mBindingId; 7665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 7765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 7865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public void setObjectValue(Object object) { 7965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn assertFrameMutable(); 8065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 8165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Attempt to set the value using a specific setter (which may be more optimized), and 8265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // fall back to the setGenericObjectValue(...) in case of no match. 8365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (object instanceof int[]) { 8465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn setInts((int[])object); 8565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } else if (object instanceof float[]) { 8665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn setFloats((float[])object); 8765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } else if (object instanceof ByteBuffer) { 8865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn setData((ByteBuffer)object); 8965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } else if (object instanceof Bitmap) { 9065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn setBitmap((Bitmap)object); 9165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } else { 9265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn setGenericObjectValue(object); 9365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 9465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 9565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 9665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public abstract Object getObjectValue(); 9765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 9865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public abstract void setInts(int[] ints); 9965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 10065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public abstract int[] getInts(); 10165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 10265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public abstract void setFloats(float[] floats); 10365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 10465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public abstract float[] getFloats(); 10565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 10665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public abstract void setData(ByteBuffer buffer, int offset, int length); 10765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 10865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public void setData(ByteBuffer buffer) { 10965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn setData(buffer, 0, buffer.limit()); 11065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 11165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 11265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public void setData(byte[] bytes, int offset, int length) { 11365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn setData(ByteBuffer.wrap(bytes, offset, length)); 11465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 11565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 11665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public abstract ByteBuffer getData(); 11765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 11865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public abstract void setBitmap(Bitmap bitmap); 11965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 12065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public abstract Bitmap getBitmap(); 12165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 12265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public void setTimestamp(long timestamp) { 12365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mTimestamp = timestamp; 12465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 12565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 12665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public long getTimestamp() { 12765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return mTimestamp; 12865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 12965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 13065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public void setDataFromFrame(Frame frame) { 13165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn setData(frame.getData()); 13265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 13365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 13465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn protected boolean requestResize(int[] newDimensions) { 13565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return false; 13665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 13765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 13865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public int getRefCount() { 13965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return mRefCount; 14065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 14165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 14265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public Frame release() { 14365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (mFrameManager != null) { 14465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return mFrameManager.releaseFrame(this); 14565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } else { 14665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return this; 14765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 14865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 14965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 15065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public Frame retain() { 15165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (mFrameManager != null) { 15265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return mFrameManager.retainFrame(this); 15365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } else { 15465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return this; 15565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 15665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 15765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 15865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn public FrameManager getFrameManager() { 15965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return mFrameManager; 16065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 16165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 16265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn protected void assertFrameMutable() { 16365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (isReadOnly()) { 16465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn throw new RuntimeException("Attempting to modify read-only frame!"); 16565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 16665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 16765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 16865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn protected void setReusable(boolean reusable) { 16965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mReusable = reusable; 17065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 17165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 17265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn protected void setFormat(FrameFormat format) { 17365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mFormat = format.mutableCopy(); 17465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 17565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 17665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn protected void setGenericObjectValue(Object value) { 17765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn throw new RuntimeException( 17865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn "Cannot set object value of unsupported type: " + value.getClass()); 17965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 18065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 18165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn protected static Bitmap convertBitmapToRGBA(Bitmap bitmap) { 18265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (bitmap.getConfig() == Bitmap.Config.ARGB_8888) { 18365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return bitmap; 18465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } else { 18565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn Bitmap result = bitmap.copy(Bitmap.Config.ARGB_8888, false); 18665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn if (result == null) { 18765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn throw new RuntimeException("Error converting bitmap to RGBA!"); 18865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } else if (result.getRowBytes() != result.getWidth() * 4) { 18965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn throw new RuntimeException("Unsupported row byte count in bitmap!"); 19065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 19165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return result; 19265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 19365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 19465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 19565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn protected void reset(FrameFormat newFormat) { 19665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mFormat = newFormat.mutableCopy(); 19765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mReadOnly = false; 19865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mRefCount = 1; 19965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 20065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 20165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn /** 20265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Called just before a frame is stored, such as when storing to a cache or context. 20365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */ 20465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn protected void onFrameStore() { 20565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 20665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 20765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn /** 20865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Called when a frame is fetched from an internal store such as a cache. 20965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */ 21065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn protected void onFrameFetch() { 21165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 21265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 21365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn // Core internal methods /////////////////////////////////////////////////////////////////////// 21465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn protected abstract boolean hasNativeAllocation(); 21565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 21665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn protected abstract void releaseNativeAllocation(); 21765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 21865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn final int incRefCount() { 21965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn ++mRefCount; 22065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return mRefCount; 22165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 22265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 22365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn final int decRefCount() { 22465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn --mRefCount; 22565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return mRefCount; 22665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 22765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 22865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn final boolean isReusable() { 22965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn return mReusable; 23065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 23165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 23265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn final void markReadOnly() { 23365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn mReadOnly = true; 23465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn } 23565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn 23665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn} 237