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