1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package androidx.media.filterfw;
18 
19 import android.annotation.TargetApi;
20 import android.renderscript.Allocation;
21 
22 import java.nio.ByteBuffer;
23 import java.nio.ByteOrder;
24 
25 public class FrameBuffer1D extends Frame {
26 
27     private int mLength = 0;
28 
29     /**
30      * Access frame's data using a {@link ByteBuffer}.
31      * This is a convenience method and is equivalent to calling {@code lockData} with an
32      * {@code accessFormat} of {@code ACCESS_BYTES}.
33      * When writing to the {@link ByteBuffer}, the byte order should be always set to
34      * {@link ByteOrder#nativeOrder()}.
35      *
36      * @return The byte buffer instance holding the Frame's data.
37      */
lockBytes(int mode)38     public ByteBuffer lockBytes(int mode) {
39         assertAccessible(mode);
40         return (ByteBuffer)mBackingStore.lockData(mode, BackingStore.ACCESS_BYTES);
41     }
42 
43     /**
44      * Access frame's data using a RenderScript {@link Allocation}.
45      * This is a convenience method and is equivalent to calling {@code lockData} with an
46      * {@code accessFormat} of {@code ACCESS_ALLOCATION}.
47      *
48      * @return The Allocation instance holding the Frame's data.
49      */
50     @TargetApi(11)
lockAllocation(int mode)51     public Allocation lockAllocation(int mode) {
52         assertAccessible(mode);
53         return (Allocation) mBackingStore.lockData(mode, BackingStore.ACCESS_ALLOCATION);
54     }
55 
getLength()56     public int getLength() {
57         return mLength;
58     }
59 
60     @Override
getDimensions()61     public int[] getDimensions() {
62         return super.getDimensions();
63     }
64 
65     /**
66      * TODO: Documentation. Note that frame contents are invalidated.
67      */
68     @Override
resize(int[] newDimensions)69     public void resize(int[] newDimensions) {
70         super.resize(newDimensions);
71     }
72 
create(BackingStore backingStore)73     static FrameBuffer1D create(BackingStore backingStore) {
74         assertCanCreate(backingStore);
75         return new FrameBuffer1D(backingStore);
76     }
77 
FrameBuffer1D(BackingStore backingStore)78     FrameBuffer1D(BackingStore backingStore) {
79         super(backingStore);
80         updateLength(backingStore.getDimensions());
81     }
82 
assertCanCreate(BackingStore backingStore)83     static void assertCanCreate(BackingStore backingStore) {
84         FrameType type = backingStore.getFrameType();
85         if (type.getElementSize() == 0) {
86             throw new RuntimeException("Cannot access Frame of type " + type + " as a FrameBuffer "
87                 + "instance!");
88         }
89         int[] dims = backingStore.getDimensions();
90         if (dims == null || dims.length == 0) {
91             throw new RuntimeException("Cannot access Frame with no dimensions as a FrameBuffer "
92                 + "instance!");
93         }
94     }
95 
updateLength(int[] dimensions)96     void updateLength(int[] dimensions) {
97         mLength = 1;
98         for (int dim : dimensions) {
99             mLength *= dim;
100         }
101     }
102 }
103 
104