summaryrefslogtreecommitdiffstats
path: root/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/FrameQueue.java
blob: c26f9375b77c616e2a20e568ef521ca64c4e9518 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
/*
 * 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<FrameQueue> mAttachedQueues = new Vector<FrameQueue>();

        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;
    }

}