FileDocCategorySizeDatePackage
CachedFrameManager.javaAPI DocAndroid 5.1 API5226Thu Mar 12 22:22:30 GMT 2015android.filterfw.core

CachedFrameManager

public class CachedFrameManager extends android.filterfw.core.SimpleFrameManager
hide

Fields Summary
private SortedMap
mAvailableFrames
private int
mStorageCapacity
private int
mStorageSize
private int
mTimeStamp
Constructors Summary
public CachedFrameManager()


      
        super();
        mAvailableFrames = new TreeMap<Integer, Frame>();
    
Methods Summary
public voidclearCache()

        for (Frame frame : mAvailableFrames.values()) {
            frame.releaseNativeAllocation();
        }
        mAvailableFrames.clear();
    
private voiddropOldestFrame()

        int oldest = mAvailableFrames.firstKey();
        Frame frame = mAvailableFrames.get(oldest);
        mStorageSize -= frame.getFormat().getSize();
        frame.releaseNativeAllocation();
        mAvailableFrames.remove(oldest);
    
private android.filterfw.core.FramefindAvailableFrame(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.FramenewBoundFrame(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.FramenewFrame(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.FramereleaseFrame(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.FrameretainFrame(android.filterfw.core.Frame frame)

        return super.retainFrame(frame);
    
private booleanstoreFrame(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 voidtearDown()

        clearCache();