/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package androidx.media.filterfw; import java.util.Vector; class FrameQueue { public static class Builder { private FrameType mReadType = null; private FrameType mWriteType = null; private Vector mAttachedQueues = new Vector(); public Builder() {} public void setWriteType(FrameType type) { mWriteType = type; } public void setReadType(FrameType type) { mReadType = type; } public void attachQueue(FrameQueue queue) { mAttachedQueues.add(queue); } public FrameQueue build(String name) { FrameType type = buildType(); // TODO: This currently does not work correctly (Try camera -> branch -> target-slot) //validateType(type, name); FrameQueue result = new FrameQueue(type, name); buildQueueImpl(result); return result; } private void buildQueueImpl(FrameQueue queue) { QueueImpl queueImpl = queue.new SingleFrameQueueImpl(); queue.mQueueImpl = queueImpl; } private FrameType buildType() { FrameType result = FrameType.merge(mWriteType, mReadType); for (FrameQueue queue : mAttachedQueues) { result = FrameType.merge(result, queue.mType); } return result; } /* private void validateType(FrameType type, String queueName) { if (!type.isSpecified()) { throw new RuntimeException("Cannot build connection queue '" + queueName + "' as " + "its type (" + type + ") is underspecified!"); } } */ } private interface QueueImpl { public boolean canPull(); public boolean canPush(); public Frame pullFrame(); public Frame fetchAvailableFrame(int[] dimensions); public Frame peek(); public void pushFrame(Frame frame); public void clear(); } private class SingleFrameQueueImpl implements QueueImpl { private Frame mFrame = null; @Override public boolean canPull() { return mFrame != null; } @Override public boolean canPush() { return mFrame == null; } @Override public Frame pullFrame() { Frame result = mFrame; mFrame = null; return result; } @Override public Frame peek() { return mFrame; } @Override public Frame fetchAvailableFrame(int[] dimensions) { // Note that we cannot use a cached frame here, as we do not know where that cached // instance would end up. FrameManager manager = FrameManager.current(); return new Frame(mType, dimensions, manager); } @Override public void pushFrame(Frame frame) { mFrame = frame.retain(); mFrame.setReadOnly(true); } @Override public void clear() { if (mFrame != null) { mFrame.release(); mFrame = null; } } } private QueueImpl mQueueImpl; private FrameType mType; private String mName; public FrameType getType() { return mType; } public boolean canPull() { return mQueueImpl.canPull(); } public boolean canPush() { return mQueueImpl.canPush(); } public Frame pullFrame() { return mQueueImpl.pullFrame(); } public Frame fetchAvailableFrame(int[] dimensions) { return mQueueImpl.fetchAvailableFrame(dimensions); } public void pushFrame(Frame frame) { mQueueImpl.pushFrame(frame); } public Frame peek() { return mQueueImpl.peek(); } @Override public String toString() { return mName; } public void clear() { mQueueImpl.clear(); } private FrameQueue(FrameType type, String name) { mType = type; mName = name; } }