1227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks/*
2227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Copyright (C) 2011 The Android Open Source Project
3227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *
4227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * in compliance with the License. You may obtain a copy of the License at
6227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *
7227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * http://www.apache.org/licenses/LICENSE-2.0
8227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *
9227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Unless required by applicable law or agreed to in writing, software distributed under the License
10227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * or implied. See the License for the specific language governing permissions and limitations under
12227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * the License.
13227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks */
14227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
15227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendrickspackage androidx.media.filterfw;
16227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
17227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport java.util.Vector;
18227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
19227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass FrameQueue {
20227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
21227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public static class Builder {
22227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
23227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        private FrameType mReadType = null;
24227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        private FrameType mWriteType = null;
25227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
26227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        private Vector<FrameQueue> mAttachedQueues = new Vector<FrameQueue>();
27227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
28227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        public Builder() {}
29227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
30227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        public void setWriteType(FrameType type) {
31227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mWriteType = type;
32227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
33227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
34227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        public void setReadType(FrameType type) {
35227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mReadType = type;
36227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
37227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
38227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        public void attachQueue(FrameQueue queue) {
39227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mAttachedQueues.add(queue);
40227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
41227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
42227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        public FrameQueue build(String name) {
43227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            FrameType type = buildType();
44227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            // TODO: This currently does not work correctly (Try camera -> branch -> target-slot)
45227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            //validateType(type, name);
46227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            FrameQueue result = new FrameQueue(type, name);
47227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            buildQueueImpl(result);
48227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            return result;
49227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
50227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
51227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        private void buildQueueImpl(FrameQueue queue) {
52227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            QueueImpl queueImpl = queue.new SingleFrameQueueImpl();
53227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            queue.mQueueImpl = queueImpl;
54227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
55227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
56227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        private FrameType buildType() {
57227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            FrameType result = FrameType.merge(mWriteType, mReadType);
58227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            for (FrameQueue queue : mAttachedQueues) {
59227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                result = FrameType.merge(result, queue.mType);
60227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            }
61227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            return result;
62227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
63227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
64227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        /*
65227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        private void validateType(FrameType type, String queueName) {
66227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            if (!type.isSpecified()) {
67227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                throw new RuntimeException("Cannot build connection queue '" + queueName + "' as "
68227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                        + "its type (" + type + ") is underspecified!");
69227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            }
70227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
71227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks         */
72227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
73227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
74227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private interface QueueImpl {
75227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        public boolean canPull();
76227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
77227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        public boolean canPush();
78227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
79227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        public Frame pullFrame();
80227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
81227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        public Frame fetchAvailableFrame(int[] dimensions);
82227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
83227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        public Frame peek();
84227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
85227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        public void pushFrame(Frame frame);
86227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
87227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        public void clear();
88227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
89227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
90227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private class SingleFrameQueueImpl implements QueueImpl {
91227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        private Frame mFrame = null;
92227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
93227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        @Override
94227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        public boolean canPull() {
95227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            return mFrame != null;
96227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
97227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
98227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        @Override
99227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        public boolean canPush() {
100227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            return mFrame == null;
101227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
102227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
103227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        @Override
104227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        public Frame pullFrame() {
105227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            Frame result = mFrame;
106227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mFrame = null;
107227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            return result;
108227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
109227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
110227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        @Override
111227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        public Frame peek() {
112227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            return mFrame;
113227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
114227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
115227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        @Override
116227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        public Frame fetchAvailableFrame(int[] dimensions) {
117227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            // Note that we cannot use a cached frame here, as we do not know where that cached
118227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            // instance would end up.
119227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            FrameManager manager = FrameManager.current();
120227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            return new Frame(mType, dimensions, manager);
121227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
122227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
123227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        @Override
124227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        public void pushFrame(Frame frame) {
125227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mFrame = frame.retain();
126227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mFrame.setReadOnly(true);
127227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
128227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
129227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        @Override
130227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        public void clear() {
131227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            if (mFrame != null) {
132227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                mFrame.release();
133227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                mFrame = null;
134227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            }
135227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
136227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
137227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
138227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private QueueImpl mQueueImpl;
139227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private FrameType mType;
140227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private String mName;
141227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
142227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public FrameType getType() {
143227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        return mType;
144227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
145227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
146227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public boolean canPull() {
147227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        return mQueueImpl.canPull();
148227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
149227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
150227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public boolean canPush() {
151227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        return mQueueImpl.canPush();
152227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
153227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
154227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public Frame pullFrame() {
155227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        return mQueueImpl.pullFrame();
156227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
157227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
158227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public Frame fetchAvailableFrame(int[] dimensions) {
159227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        return mQueueImpl.fetchAvailableFrame(dimensions);
160227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
161227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
162227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public void pushFrame(Frame frame) {
163227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mQueueImpl.pushFrame(frame);
164227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
165227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
166227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public Frame peek() {
167227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        return mQueueImpl.peek();
168227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
169227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
170227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    @Override
171227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public String toString() {
172227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        return mName;
173227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
174227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
175227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public void clear() {
176227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mQueueImpl.clear();
177227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
178227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
179227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private FrameQueue(FrameType type, String name) {
180227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mType = type;
181227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mName = name;
182227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
183227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
184227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks}
185