blob: 02387fe06e704896fcdf3d6e1f443c1f1ef6ca50 [file] [log] [blame]
/*
* 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.
*/
package androidx.media.filterfw.samples.simplecamera;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.provider.MediaStore;
import androidx.media.filterfw.Filter;
import androidx.media.filterfw.FrameImage2D;
import androidx.media.filterfw.FrameType;
import androidx.media.filterfw.FrameValues;
import androidx.media.filterfw.MffContext;
import androidx.media.filterfw.MffFilterTestCase;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException;
import android.hardware.Camera;
import android.hardware.Camera.Face;
import android.graphics.Rect;
public class FaceSquareFilterTest extends MffFilterTestCase {
private AssetManager assetMgr = null;
@Override
protected Filter createFilter(MffContext mffContext) {
assetMgr = mffContext.getApplicationContext().getAssets();
return new FaceSquareFilter(mffContext, "faceSquareFilter");
}
public void testFaceSquareFilter() throws Exception{
final int INPUT_WIDTH = 1536;
final int INPUT_HEIGHT = 2048;
FrameImage2D image =
createFrame(FrameType.image2D(FrameType.ELEMENT_RGBA8888, FrameType.READ_CPU),
new int[] {INPUT_WIDTH,INPUT_HEIGHT}).asFrameImage2D();
FrameValues facesFrame = createFrame(FrameType.array(Camera.Face.class), new int[] {1,1}).
asFrameValues();
Bitmap bitmap = BitmapFactory.decodeStream(assetMgr.open("XZZ019.jpg"));
image.setBitmap(bitmap);
injectInputFrame("image", image);
Face face = new Face();
Rect faceRect = new Rect();
// These are the values for image 141 with 1 face
faceRect.set(-533, -453, 369, 224);
face.rect = faceRect;
Face[] faces = new Face[1];
faces[0] = face;
facesFrame.setValue(faces);
injectInputFrame("faces", facesFrame);
process();
// ensure the output image has the rectangle in the right place
FrameImage2D outputImage = getOutputFrame("image").asFrameImage2D();
int[] pixels = new int[bitmap.getByteCount()];
bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(),
bitmap.getHeight());
final int FACE_X_RANGE = 2000;
final int WIDTH_OFFSET = 1000;
final int HEIGHT_OFFSET = 1000;
int top = (faceRect.top+HEIGHT_OFFSET)*bitmap.getHeight()/FACE_X_RANGE;
int bottom = (faceRect.bottom+HEIGHT_OFFSET)*bitmap.getHeight()/FACE_X_RANGE;
int left = (faceRect.left+WIDTH_OFFSET)*bitmap.getWidth()/FACE_X_RANGE;
int right = (faceRect.right+WIDTH_OFFSET)*bitmap.getWidth()/FACE_X_RANGE;
if (top < 0) {
top = 0;
} else if (top > bitmap.getHeight()) {
top = bitmap.getHeight();
}
if (left < 0) {
left = 0;
} else if (left > bitmap.getWidth()) {
left = bitmap.getWidth();
}
if (bottom > bitmap.getHeight()) {
bottom = bitmap.getHeight();
} else if (bottom < 0) {
bottom = 0;
}
if (right > bitmap.getWidth()) {
right = bitmap.getWidth();
} 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 * (bitmap.getWidth() * (top + j) + left) +
ImageConstants.RED_OFFSET] = (byte) ImageConstants.MAX_BYTE;
pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * (top + j) + left) +
ImageConstants.GREEN_OFFSET] = (byte) ImageConstants.MAX_BYTE;
pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * (top + j) + left) +
ImageConstants.BLUE_OFFSET] = (byte) ImageConstants.MAX_BYTE;
}
// Right edge
if (right > 0 && top > 0) {
pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * (top + j) + right) +
ImageConstants.RED_OFFSET] = (byte) ImageConstants.MAX_BYTE;
pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * (top + j) + right) +
ImageConstants.GREEN_OFFSET] = (byte) ImageConstants.MAX_BYTE;
pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * (top + j) + right) +
ImageConstants.BLUE_OFFSET] = (byte) ImageConstants.MAX_BYTE;
}
}
for (int k = 0; k < (right - left); k++) {
// Top edge
if (top < bitmap.getHeight()) {
pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * top + left + k) +
ImageConstants.RED_OFFSET] = (byte) ImageConstants.MAX_BYTE;
pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * top + left + k) +
ImageConstants.GREEN_OFFSET] = (byte) ImageConstants.MAX_BYTE;
pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * top + left + k) +
ImageConstants.BLUE_OFFSET] = (byte) ImageConstants.MAX_BYTE;
}
// Bottom edge
if (bottom < bitmap.getHeight()) {
pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * bottom + left + k) +
ImageConstants.RED_OFFSET] = (byte) ImageConstants.MAX_BYTE;
pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * bottom + left + k) +
ImageConstants.GREEN_OFFSET] = (byte) ImageConstants.MAX_BYTE;
pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * bottom + left + k) +
ImageConstants.BLUE_OFFSET] = (byte) ImageConstants.MAX_BYTE;
}
}
Bitmap outputBitmap = outputImage.toBitmap();
int[] outputPixels = new int[outputBitmap.getByteCount()];
outputBitmap.getPixels(outputPixels, 0, outputBitmap.getWidth(), 0, 0,
outputBitmap.getWidth(), outputBitmap.getHeight());
int equalCount = 0;
for ( int i = 0; i < outputBitmap.getByteCount(); i++) {
if (pixels[i] == outputPixels[i])
equalCount++;
}
if (equalCount + (0.05f*outputBitmap.getByteCount()) < outputBitmap.getByteCount()) {
// Assertion will fail if condition is true
assertEquals(equalCount, outputBitmap.getByteCount());
}
}
}