| /* |
| * 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.filterpacks.transform; |
| |
| import androidx.media.filterfw.Frame; |
| import androidx.media.filterfw.FrameImage2D; |
| import androidx.media.filterfw.FrameType; |
| import androidx.media.filterfw.TextureSource; |
| |
| import java.util.Arrays; |
| |
| /** Internal class that contains utility functions used by the transform filters. **/ |
| class TransformUtils { |
| |
| public static int powOf2(int x) { |
| --x; |
| // Fill with 1s |
| x |= x >> 1; |
| x |= x >> 2; |
| x |= x >> 4; |
| x |= x >> 8; |
| x |= x >> 16; |
| // Next int is now pow-of-2 |
| return x + 1; |
| } |
| |
| public static FrameImage2D makeMipMappedFrame(FrameImage2D current, int[] dimensions) { |
| // Note: Future versions of GLES will support NPOT mipmapping. When these become more |
| // widely used, we can add a check here to disable frame expansion on such devices. |
| int[] pow2Dims = new int[] { powOf2(dimensions[0]), powOf2(dimensions[1]) }; |
| if (current == null) { |
| FrameType imageType = FrameType.image2D(FrameType.ELEMENT_RGBA8888, |
| FrameType.READ_GPU | FrameType.WRITE_GPU); |
| current = Frame.create(imageType, pow2Dims).asFrameImage2D(); |
| } else if (!Arrays.equals(dimensions, current.getDimensions())) { |
| current.resize(pow2Dims); |
| } |
| return current; |
| } |
| |
| public static FrameImage2D makeTempFrame(FrameImage2D current, int[] dimensions) { |
| if (current == null) { |
| FrameType imageType = FrameType.image2D(FrameType.ELEMENT_RGBA8888, |
| FrameType.READ_GPU | FrameType.WRITE_GPU); |
| current = Frame.create(imageType, dimensions).asFrameImage2D(); |
| } else if (!Arrays.equals(dimensions, current.getDimensions())) { |
| current.resize(dimensions); |
| } |
| return current; |
| } |
| |
| public static void generateMipMaps(FrameImage2D frame) { |
| TextureSource texture = frame.lockTextureSource(); |
| texture.generateMipmaps(); |
| frame.unlock(); |
| } |
| |
| public static void setTextureParameter(FrameImage2D frame, int param, int value) { |
| TextureSource texture = frame.lockTextureSource(); |
| texture.setParameter(param, value); |
| frame.unlock(); |
| } |
| |
| } |