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");
5227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * you may not use this file except in compliance with the License.
6227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * You may obtain a copy of the License at
7227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *
8227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *      http://www.apache.org/licenses/LICENSE-2.0
9227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *
10227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Unless required by applicable law or agreed to in writing, software
11227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * distributed under the License is distributed on an "AS IS" BASIS,
12227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * See the License for the specific language governing permissions and
14227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * limitations under the License.
15227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks */
16227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
17227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendrickspackage androidx.media.filterfw;
18227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
19227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport java.lang.reflect.Array;
20227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
21227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendrickspublic class FrameValues extends FrameValue {
22227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
23227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    /**
24227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * Returns the number of values in the Frame.
25227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     *
26227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * This returns 1, if the Frame value is null, or if the value is not an array.
27227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     *
28227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * @return The number of values in the Frame.
29227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     */
30227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public int getCount() {
31227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Object value = super.getValue();
32227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        if (value == null || !value.getClass().isArray()) {
33227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            return 1;
34227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        } else {
35227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            return Array.getLength(super.getValue());
36227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
37227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
38227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
39227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    /**
40227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * Returns the values in the Frame as an array.
41227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     *
42227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * Note, that this may be called on Frames that have a non-array object assigned to them. In
43227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * that case, this method will wrap the object in an array and return that. This way, filters
44227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * can treat any object based frame as arrays.
45227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     *
46227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * @return The array of values in this frame.
47227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     */
48227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public Object getValues() {
49227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Object value = super.getValue();
50227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        if (value == null || value.getClass().isArray()) {
51227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            return super.getValue();
52227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        } else {
53227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            // Allow reading a single as an array.
54227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            Object[] array = (Object[])Array.newInstance(value.getClass(), 1);
55227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            array[0] = value;
56227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            return array;
57227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
58227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
59227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
60227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    /**
61227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * Returns the value at the specified index.
62227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     *
63227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * In case the value is null or not an array, the index must be 0, and the value itself is
64227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * returned.
65227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     *
66227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * @param index The index to access.
67227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * @return The value at that index.
68227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     */
69227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public Object getValueAtIndex(int index) {
70227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Object value = super.getValue();
71227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        if (value == null || !value.getClass().isArray()) {
72227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            if (index != 0) {
73227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                throw new ArrayIndexOutOfBoundsException(index);
74227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            } else {
75227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                return value;
76227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            }
77227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        } else {
78227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            return Array.get(value, index);
79227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
80227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
81227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
82227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    /**
83227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * Returns the value as a FrameValue at the specified index.
84227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     *
85227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * Use this if you want to access elements as FrameValues. You must release the result when
86227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * you are done using it.
87227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     *
88227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * @param index The index to access.
89227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * @return The value as a FrameValue at that index (must release).
90227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     */
91227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public FrameValue getFrameValueAtIndex(int index) {
92227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Object value = getValueAtIndex(index);
93227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        FrameValue result = Frame.create(getType().asSingle(), new int[0]).asFrameValue();
94227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        result.setValue(value);
95227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        return result;
96227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
97227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
98227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    /**
99227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * Assign the array of values to the frame.
100227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     *
101227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * You may assign null or a non-array object, which are interpreted as a 1-length array.
102227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     *
103227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * @param values The values to assign to the frame.
104227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     */
105227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public void setValues(Object values) {
106227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        super.setValue(values);
107227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
108227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
109227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    /**
110227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * Assign a value at the specified index.
111227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     *
112227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * In case the held value is not an array, the index must be 0, and the object will be replaced
113227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * by the new object.
114227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     *
115227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * @param value The value to assign.
116227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * @param index The index to assign to.
117227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     */
118227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public void setValueAtIndex(Object value, int index) {
119227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        super.assertAccessible(MODE_WRITE);
120227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Object curValue = super.getValue();
121227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        if (curValue == null || !curValue.getClass().isArray()) {
122227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            if (index != 0) {
123227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                throw new ArrayIndexOutOfBoundsException(index);
124227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            } else {
125227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                curValue = value;
126227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            }
127227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        } else {
128227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            Array.set(curValue, index, value);
129227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
130227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
131227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
132227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    /**
133227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * Assign a FrameValue's value at the specified index.
134227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     *
135227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * This method unpacks the FrameValue and assigns the unpacked value to the specified index.
136227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * This does not affect the retain-count of the passed Frame.
137227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     *
138227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * @param frame The frame value to assign.
139227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     * @param index The index to assign to.
140227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks     */
141227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public void setFrameValueAtIndex(FrameValue frame, int index) {
142227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Object value = frame.getValue();
143227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        setValueAtIndex(value, index);
144227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
145227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
146227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    static FrameValues create(BackingStore backingStore) {
147227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        assertObjectBased(backingStore.getFrameType());
148227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        return new FrameValues(backingStore);
149227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
150227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
151227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    FrameValues(BackingStore backingStore) {
152227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        super(backingStore);
153227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
154227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks}
155227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
156