1227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks/* 2227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Copyright 2013 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 Hendrickspackage androidx.media.filterfw; 17227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 18227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport java.nio.ByteBuffer; 19227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 20227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks/** 21227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * A collection of utilities to deal with pixel operations on ByteBuffers. 22227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks */ 23227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendrickspublic class PixelUtils { 24227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 25227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks /** 26227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Copy pixels from one buffer to another, applying a transformation. 27227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * 28227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * <p>The transformation is specified by specifying the initial offset in the output buffer, the 29227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * stride (in pixels) between each pixel, and the stride (in pixels) between each row. The row 30227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * stride is measured as the number of pixels between the start of each row.</p> 31227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * 32227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * <p>Note that this method is native for efficiency reasons. It does NOT do any bounds checking 33227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * other than making sure the buffers are of sufficient size. This means that you can corrupt 34227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * memory if specifying incorrect stride values!</p> 35227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * 36227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * @param input The input buffer containing pixel data. 37227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * @param output The output buffer to hold the transformed pixel data. 38227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * @param width The width of the input image. 39227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * @param height The height of the input image. 40227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * @param offset The start offset in the output (in pixels) 41227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * @param pixStride The stride between each pixel (in pixels) 42227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * @param rowStride The stride between the start of each row (in pixels) 43227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks */ 44227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks public static void copyPixels(ByteBuffer input, 45227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks ByteBuffer output, 46227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int width, 47227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int height, 48227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int offset, 49227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int pixStride, 50227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int rowStride) { 51227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks if (input.remaining() != output.remaining()) { 52227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks throw new IllegalArgumentException("Input and output buffers must have the same size!"); 53227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } else if (input.remaining() % 4 != 0) { 54227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks throw new IllegalArgumentException("Input buffer size must be a multiple of 4!"); 55227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } else if (output.remaining() % 4 != 0) { 56227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks throw new IllegalArgumentException("Output buffer size must be a multiple of 4!"); 57227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } else if ((width * height * 4) != input.remaining()) { 58227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks throw new IllegalArgumentException( 59227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks "Input buffer size does not match given dimensions!"); 60227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } else if ((width * height * 4) != output.remaining()) { 61227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks throw new IllegalArgumentException( 62227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks "Output buffer size does not match given dimensions!"); 63227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 64227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks nativeCopyPixels(input, output, width, height, offset, pixStride, rowStride); 65227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 66227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 67227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks private static native void nativeCopyPixels(ByteBuffer input, 68227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks ByteBuffer output, 69227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int width, 70227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int height, 71227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int offset, 72227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int pixStride, 73227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int rowStride); 74227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 75227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks static { 76227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks System.loadLibrary("smartcamera_jni"); 77227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 78227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 79227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks} 80