summaryrefslogtreecommitdiffstats
path: root/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/samples/simplecamera/FaceSquareFilter.java
diff options
context:
space:
mode:
Diffstat (limited to 'tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/samples/simplecamera/FaceSquareFilter.java')
-rw-r--r--tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/samples/simplecamera/FaceSquareFilter.java159
1 files changed, 159 insertions, 0 deletions
diff --git a/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/samples/simplecamera/FaceSquareFilter.java b/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/samples/simplecamera/FaceSquareFilter.java
new file mode 100644
index 0000000..c4a39e8
--- /dev/null
+++ b/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/samples/simplecamera/FaceSquareFilter.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright 2013 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.
+ */
+// Takes in an array, returns the size of the array
+
+package androidx.media.filterfw.samples.simplecamera;
+
+import android.graphics.Rect;
+import android.hardware.Camera;
+import android.hardware.Camera.Face;
+import android.util.Log;
+import androidx.media.filterfw.Filter;
+import androidx.media.filterfw.Frame;
+import androidx.media.filterfw.FrameImage2D;
+import androidx.media.filterfw.FrameType;
+import androidx.media.filterfw.FrameValues;
+import androidx.media.filterfw.MffContext;
+import androidx.media.filterfw.OutputPort;
+import androidx.media.filterfw.Signature;
+
+import java.nio.ByteBuffer;
+
+public class FaceSquareFilter extends Filter {
+
+ private static final String TAG = "FaceSquareFilter";
+ private static boolean mLogVerbose = Log.isLoggable(TAG, Log.VERBOSE);
+
+ private static int FACE_X_RANGE = 2000;
+ private static int WIDTH_OFFSET = 1000;
+ private static int HEIGHT_OFFSET = 1000;
+
+ public FaceSquareFilter(MffContext context, String name) {
+ super(context, name);
+ }
+
+ @Override
+ public Signature getSignature() {
+ FrameType imageType = FrameType.buffer2D(FrameType.ELEMENT_RGBA8888);
+ FrameType facesType = FrameType.array(Camera.Face.class);
+ return new Signature()
+ .addInputPort("image", Signature.PORT_REQUIRED, imageType)
+ .addInputPort("faces", Signature.PORT_REQUIRED, facesType)
+ .addOutputPort("image", Signature.PORT_REQUIRED, imageType)
+ .disallowOtherPorts();
+ }
+
+ /**
+ * @see androidx.media.filterfw.Filter#onProcess()
+ */
+ @Override
+ protected void onProcess() {
+ // Get inputs
+ FrameImage2D imageFrame = getConnectedInputPort("image").pullFrame().asFrameImage2D();
+ FrameValues facesFrame = getConnectedInputPort("faces").pullFrame().asFrameValues();
+ Face[] faces = (Face[]) facesFrame.getValues();
+ int[] dims = imageFrame.getDimensions();
+ ByteBuffer buffer = imageFrame.lockBytes(Frame.MODE_WRITE);
+ byte[] pixels = buffer.array();
+
+ // For every face in faces, draw a white rect around the
+ // face following the rect member of the Face
+ drawBoxes(pixels, faces, dims);
+
+ imageFrame.unlock();
+
+ OutputPort outPort = getConnectedOutputPort("image");
+ outPort.pushFrame(imageFrame);
+ }
+
+ public void drawBoxes(byte[] pixels, Face[] faces, int[] dims) {
+ for(int i = 0; i < faces.length; i++) {
+ Rect tempRect = faces[i].rect;
+ int top = (tempRect.top+HEIGHT_OFFSET)*dims[1]/FACE_X_RANGE;
+ int bottom = (tempRect.bottom+HEIGHT_OFFSET)*dims[1]/FACE_X_RANGE;
+ int left = (tempRect.left+WIDTH_OFFSET)*dims[0]/FACE_X_RANGE;
+ int right = (tempRect.right+WIDTH_OFFSET)*dims[0]/FACE_X_RANGE;
+
+ if (top < 0) {
+ top = 0;
+ } else if (top > dims[1]) {
+ top = dims[1];
+ }
+ if (left < 0) {
+ left = 0;
+ } else if (left > dims[0]) {
+ left = dims[0];
+ }
+ if (bottom > dims[1]) {
+ bottom = dims[1];
+ } else if (bottom < 0) {
+ bottom = 0;
+ }
+ if (right > dims[0]) {
+ right = dims[0];
+ } else if (right < 0) {
+ right = 0;
+ }
+
+ for (int j = 0; j < (bottom - top); j++) {
+ // Left edge
+ if (left > 0 && top > 0) {
+ pixels[ImageConstants.PIX_CHANNELS * (dims[0] * (top + j) + left) +
+ ImageConstants.RED_OFFSET] = (byte) ImageConstants.MAX_BYTE;
+ pixels[ImageConstants.PIX_CHANNELS * (dims[0] * (top + j) + left) +
+ ImageConstants.GREEN_OFFSET] = (byte) ImageConstants.MAX_BYTE;
+ pixels[ImageConstants.PIX_CHANNELS * (dims[0] * (top + j) + left) +
+ ImageConstants.BLUE_OFFSET] = (byte) ImageConstants.MAX_BYTE;
+ }
+
+ // Right edge
+ if (right > 0 && top > 0) {
+ pixels[ImageConstants.PIX_CHANNELS * (dims[0] * (top + j) + right) +
+ ImageConstants.RED_OFFSET] = (byte) ImageConstants.MAX_BYTE;
+ pixels[ImageConstants.PIX_CHANNELS * (dims[0] * (top + j) + right) +
+ ImageConstants.GREEN_OFFSET] = (byte) ImageConstants.MAX_BYTE;
+ pixels[ImageConstants.PIX_CHANNELS * (dims[0] * (top + j) + right) +
+ ImageConstants.BLUE_OFFSET] = (byte) ImageConstants.MAX_BYTE;
+ }
+
+ }
+ for (int k = 0; k < (right - left); k++) {
+ // Top edge
+ if (top < dims[1]) {
+ pixels[ImageConstants.PIX_CHANNELS * (dims[0] * top + left + k) +
+ ImageConstants.RED_OFFSET] = (byte) ImageConstants.MAX_BYTE;
+ pixels[ImageConstants.PIX_CHANNELS * (dims[0] * top + left + k) +
+ ImageConstants.GREEN_OFFSET] = (byte) ImageConstants.MAX_BYTE;
+ pixels[ImageConstants.PIX_CHANNELS * (dims[0] * top + left + k) +
+ ImageConstants.BLUE_OFFSET] = (byte) ImageConstants.MAX_BYTE;
+
+ }
+ // Bottom edge
+ if (bottom < dims[1]) {
+ pixels[ImageConstants.PIX_CHANNELS * (dims[0] * bottom + left + k) +
+ ImageConstants.RED_OFFSET] = (byte) ImageConstants.MAX_BYTE;
+ pixels[ImageConstants.PIX_CHANNELS * (dims[0] * bottom + left + k) +
+ ImageConstants.GREEN_OFFSET] = (byte) ImageConstants.MAX_BYTE;
+ pixels[ImageConstants.PIX_CHANNELS * (dims[0] * bottom + left + k) +
+ ImageConstants.BLUE_OFFSET] = (byte) ImageConstants.MAX_BYTE;
+ }
+
+
+ }
+
+ }
+ }
+}