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