Methods Summary |
---|
public void | clearCache()
for (Frame frame : mAvailableFrames.values()) {
frame.releaseNativeAllocation();
}
mAvailableFrames.clear();
|
private void | dropOldestFrame()
int oldest = mAvailableFrames.firstKey();
Frame frame = mAvailableFrames.get(oldest);
mStorageSize -= frame.getFormat().getSize();
frame.releaseNativeAllocation();
mAvailableFrames.remove(oldest);
|
private android.filterfw.core.Frame | findAvailableFrame(android.filterfw.core.FrameFormat format, int bindingType, long bindingId)
// Look for a frame that is compatible with the requested format
synchronized(mAvailableFrames) {
for (Map.Entry<Integer, Frame> entry : mAvailableFrames.entrySet()) {
Frame frame = entry.getValue();
// Check that format is compatible
if (frame.getFormat().isReplaceableBy(format)) {
// Check that binding is compatible (if frame is bound)
if ((bindingType == frame.getBindingType())
&& (bindingType == Frame.NO_BINDING || bindingId == frame.getBindingId())) {
// We found one! Take it out of the set of available frames and attach the
// requested format to it.
super.retainFrame(frame);
mAvailableFrames.remove(entry.getKey());
frame.onFrameFetch();
frame.reset(format);
mStorageSize -= format.getSize();
return frame;
}
}
}
}
return null;
|
public android.filterfw.core.Frame | newBoundFrame(android.filterfw.core.FrameFormat format, int bindingType, long bindingId)
Frame result = findAvailableFrame(format, bindingType, bindingId);
if (result == null) {
result = super.newBoundFrame(format, bindingType, bindingId);
}
result.setTimestamp(Frame.TIMESTAMP_NOT_SET);
return result;
|
public android.filterfw.core.Frame | newFrame(android.filterfw.core.FrameFormat format)
Frame result = findAvailableFrame(format, Frame.NO_BINDING, 0);
if (result == null) {
result = super.newFrame(format);
}
result.setTimestamp(Frame.TIMESTAMP_NOT_SET);
return result;
|
public android.filterfw.core.Frame | releaseFrame(android.filterfw.core.Frame frame)
if (frame.isReusable()) {
int refCount = frame.decRefCount();
if (refCount == 0 && frame.hasNativeAllocation()) {
if (!storeFrame(frame)) {
frame.releaseNativeAllocation();
}
return null;
} else if (refCount < 0) {
throw new RuntimeException("Frame reference count dropped below 0!");
}
} else {
super.releaseFrame(frame);
}
return frame;
|
public android.filterfw.core.Frame | retainFrame(android.filterfw.core.Frame frame)
return super.retainFrame(frame);
|
private boolean | storeFrame(android.filterfw.core.Frame frame)
synchronized(mAvailableFrames) {
// Make sure this frame alone does not exceed capacity
int frameSize = frame.getFormat().getSize();
if (frameSize > mStorageCapacity) {
return false;
}
// Drop frames if adding this frame would exceed capacity
int newStorageSize = mStorageSize + frameSize;
while (newStorageSize > mStorageCapacity) {
dropOldestFrame();
newStorageSize = mStorageSize + frameSize;
}
// Store new frame
frame.onFrameStore();
mStorageSize = newStorageSize;
mAvailableFrames.put(mTimeStamp, frame);
++mTimeStamp;
return true;
}
|
public void | tearDown()
clearCache();
|