/* * 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.lang.reflect.Array; public class FrameValues extends FrameValue { /** * Returns the number of values in the Frame. * * This returns 1, if the Frame value is null, or if the value is not an array. * * @return The number of values in the Frame. */ public int getCount() { Object value = super.getValue(); if (value == null || !value.getClass().isArray()) { return 1; } else { return Array.getLength(super.getValue()); } } /** * Returns the values in the Frame as an array. * * Note, that this may be called on Frames that have a non-array object assigned to them. In * that case, this method will wrap the object in an array and return that. This way, filters * can treat any object based frame as arrays. * * @return The array of values in this frame. */ public Object getValues() { Object value = super.getValue(); if (value == null || value.getClass().isArray()) { return super.getValue(); } else { // Allow reading a single as an array. Object[] array = (Object[])Array.newInstance(value.getClass(), 1); array[0] = value; return array; } } /** * Returns the value at the specified index. * * In case the value is null or not an array, the index must be 0, and the value itself is * returned. * * @param index The index to access. * @return The value at that index. */ public Object getValueAtIndex(int index) { Object value = super.getValue(); if (value == null || !value.getClass().isArray()) { if (index != 0) { throw new ArrayIndexOutOfBoundsException(index); } else { return value; } } else { return Array.get(value, index); } } /** * Returns the value as a FrameValue at the specified index. * * Use this if you want to access elements as FrameValues. You must release the result when * you are done using it. * * @param index The index to access. * @return The value as a FrameValue at that index (must release). */ public FrameValue getFrameValueAtIndex(int index) { Object value = getValueAtIndex(index); FrameValue result = Frame.create(getType().asSingle(), new int[0]).asFrameValue(); result.setValue(value); return result; } /** * Assign the array of values to the frame. * * You may assign null or a non-array object, which are interpreted as a 1-length array. * * @param values The values to assign to the frame. */ public void setValues(Object values) { super.setValue(values); } /** * Assign a value at the specified index. * * In case the held value is not an array, the index must be 0, and the object will be replaced * by the new object. * * @param value The value to assign. * @param index The index to assign to. */ public void setValueAtIndex(Object value, int index) { super.assertAccessible(MODE_WRITE); Object curValue = super.getValue(); if (curValue == null || !curValue.getClass().isArray()) { if (index != 0) { throw new ArrayIndexOutOfBoundsException(index); } else { curValue = value; } } else { Array.set(curValue, index, value); } } /** * Assign a FrameValue's value at the specified index. * * This method unpacks the FrameValue and assigns the unpacked value to the specified index. * This does not affect the retain-count of the passed Frame. * * @param frame The frame value to assign. * @param index The index to assign to. */ public void setFrameValueAtIndex(FrameValue frame, int index) { Object value = frame.getValue(); setValueAtIndex(value, index); } static FrameValues create(BackingStore backingStore) { assertObjectBased(backingStore.getFrameType()); return new FrameValues(backingStore); } FrameValues(BackingStore backingStore) { super(backingStore); } }