Improved on the performance on Android

Rotated/flipped the image to match the subject
This commit is contained in:
Mathias Westerdahl 2018-05-16 21:17:37 +02:00
parent e76c937266
commit 73f8212c14
3 changed files with 48 additions and 46 deletions

View File

@ -42,9 +42,6 @@ class CameraExtension implements Camera.PreviewCallback {
private Camera.Parameters parameters; private Camera.Parameters parameters;
private SurfaceView surfaceView; private SurfaceView surfaceView;
private byte[] previewPixels;
private byte[] picturePixels;
private static CameraExtension instance; private static CameraExtension instance;
private CameraExtension() { private CameraExtension() {
@ -53,7 +50,7 @@ class CameraExtension implements Camera.PreviewCallback {
private static CameraExtension getInstance() { private static CameraExtension getInstance() {
if (instance == null) { if (instance == null) {
Log.v(TAG, "No instance, creating"); //Log.v(TAG, "No instance, creating");
instance = new CameraExtension(); instance = new CameraExtension();
} }
return instance; return instance;
@ -103,15 +100,15 @@ class CameraExtension implements Camera.PreviewCallback {
@Override @Override
public void onPreviewFrame(byte[] data, Camera camera) { public void onPreviewFrame(byte[] data, Camera camera) {
Log.v(TAG, "onPreviewFrame " + previewSize.width + "x" + previewSize.height); //Log.v(TAG, "onPreviewFrame " + previewSize.width + "x" + previewSize.height);
if (data != null) { if (data != null) {
handleCameraFrame(data, previewSize.width, previewSize.height); handleCameraFrame(data, previewSize.width, previewSize.height);
surfaceView.setVisibility(View.VISIBLE); // surfaceView.setVisibility(View.VISIBLE);
camera.startPreview(); // camera.startPreview();
surfaceView.setVisibility(View.INVISIBLE); // surfaceView.setVisibility(View.INVISIBLE);
} }
else { else {
Log.v(TAG, "onPreviewFrame - data is null"); //Log.v(TAG, "onPreviewFrame - data is null");
} }
} }
@ -131,7 +128,7 @@ class CameraExtension implements Camera.PreviewCallback {
* camera properties. * camera properties.
*/ */
private boolean prepareCapture(final Context context, int facing) { private boolean prepareCapture(final Context context, int facing) {
Log.v(TAG, "prepareCapture"); //Log.v(TAG, "prepareCapture");
if (!hasAllPermissions(context, PERMISSIONS)) { if (!hasAllPermissions(context, PERMISSIONS)) {
requestPermissions(context, PERMISSIONS); requestPermissions(context, PERMISSIONS);
return false; return false;
@ -144,37 +141,34 @@ class CameraExtension implements Camera.PreviewCallback {
camera = openFrontCamera(); camera = openFrontCamera();
} }
if (camera == null) { if (camera == null) {
Log.v(TAG, "Unable to open camera"); //Log.v(TAG, "Unable to open camera");
return false; return false;
} }
try { try {
parameters = camera.getParameters(); parameters = camera.getParameters();
for(Camera.Size size : parameters.getSupportedPictureSizes()) { // for(Camera.Size size : parameters.getSupportedPictureSizes()) {
Log.v(TAG, "Supported picture size: " + size.width + "x" + size.height); // Log.v(TAG, "Supported picture size: " + size.width + "x" + size.height);
} // }
for(Camera.Size size : parameters.getSupportedPreviewSizes()) { // for(Camera.Size size : parameters.getSupportedPreviewSizes()) {
Log.v(TAG, "Supported preview size: " + size.width + "x" + size.height); // Log.v(TAG, "Supported preview size: " + size.width + "x" + size.height);
} // }
for(int format : parameters.getSupportedPictureFormats()) { // for(int format : parameters.getSupportedPictureFormats()) {
Log.v(TAG, "Supported picture format: " + format); // Log.v(TAG, "Supported picture format: " + format);
} // }
for(int format : parameters.getSupportedPreviewFormats()) { // for(int format : parameters.getSupportedPreviewFormats()) {
Log.v(TAG, "Supported preview format: " + format); // Log.v(TAG, "Supported preview format: " + format);
} // }
Log.v(TAG, "Current preview format:" + parameters.getPreviewFormat()); // Log.v(TAG, "Current preview format:" + parameters.getPreviewFormat());
pictureSize = parameters.getPictureSize(); pictureSize = parameters.getPictureSize();
previewSize = getPreferredPreviewSize(); previewSize = getPreferredPreviewSize();
parameters.setPreviewSize(previewSize.width, previewSize.height); parameters.setPreviewSize(previewSize.width, previewSize.height);
Log.v(TAG, "Camera parameters. picture size: " + pictureSize.width + "x" + pictureSize.height + " preview size: " + previewSize.width + "x" + previewSize.height); //Log.v(TAG, "Camera parameters. picture size: " + pictureSize.width + "x" + pictureSize.height + " preview size: " + previewSize.width + "x" + previewSize.height);
//parameters.setPictureFormat(ImageFormat.RGB_565); //parameters.setPictureFormat(ImageFormat.RGB_565);
//parameters.setPictureSize(previewSize.width, previewSize.height); //parameters.setPictureSize(previewSize.width, previewSize.height);
camera.setParameters(parameters); camera.setParameters(parameters);
previewPixels = new byte[previewSize.width * previewSize.height * 3];
picturePixels = new byte[pictureSize.width * pictureSize.height * 3];
//camera.setDisplayOrientation() // use utility function from Google example //camera.setDisplayOrientation() // use utility function from Google example
} }
catch(Exception e) { catch(Exception e) {
@ -201,14 +195,14 @@ class CameraExtension implements Camera.PreviewCallback {
* Start capturing images with the camera * Start capturing images with the camera
*/ */
private void startCapture(final Context context) { private void startCapture(final Context context) {
Log.v(TAG, "startCapture"); //Log.v(TAG, "startCapture");
((Activity)context).runOnUiThread(new Runnable() { ((Activity)context).runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
Log.v(TAG, "runOnUiThread"); //Log.v(TAG, "runOnUiThread");
try { try {
Log.v(TAG, "Create surface"); //Log.v(TAG, "Create surface");
surfaceView = new SurfaceView(context); surfaceView = new SurfaceView(context);
Activity activity = (Activity)context; Activity activity = (Activity)context;
ViewGroup viewGroup = (ViewGroup)activity.findViewById(android.R.id.content); ViewGroup viewGroup = (ViewGroup)activity.findViewById(android.R.id.content);
@ -218,12 +212,12 @@ class CameraExtension implements Camera.PreviewCallback {
surfaceHolder.addCallback(new SurfaceHolder.Callback() { surfaceHolder.addCallback(new SurfaceHolder.Callback() {
@Override @Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Log.v(TAG, "surfaceChanged"); //Log.v(TAG, "surfaceChanged");
} }
@Override @Override
public void surfaceCreated(SurfaceHolder holder) { public void surfaceCreated(SurfaceHolder holder) {
Log.v(TAG, "surfaceCreated"); //Log.v(TAG, "surfaceCreated");
try { try {
camera.stopPreview(); camera.stopPreview();
camera.setPreviewCallback(CameraExtension.this); camera.setPreviewCallback(CameraExtension.this);
@ -239,7 +233,7 @@ class CameraExtension implements Camera.PreviewCallback {
@Override @Override
public void surfaceDestroyed(SurfaceHolder holder) { public void surfaceDestroyed(SurfaceHolder holder) {
Log.v(TAG, "surfaceDestroyed"); //Log.v(TAG, "surfaceDestroyed");
} }
}); });
@ -267,27 +261,27 @@ class CameraExtension implements Camera.PreviewCallback {
} }
public static boolean PrepareCapture(final Context context, int facing) { public static boolean PrepareCapture(final Context context, int facing) {
Log.v(TAG, "PrepareCapture " + facing); //Log.v(TAG, "PrepareCapture " + facing);
return CameraExtension.getInstance().prepareCapture(context, facing); return CameraExtension.getInstance().prepareCapture(context, facing);
} }
public static void StartCapture(final Context context) { public static void StartCapture(final Context context) {
Log.v(TAG, "StartCapture"); //Log.v(TAG, "StartCapture");
CameraExtension.getInstance().startCapture(context); CameraExtension.getInstance().startCapture(context);
} }
public static void StopCapture(final Context context) { public static void StopCapture(final Context context) {
Log.v(TAG, "StopCapture"); //Log.v(TAG, "StopCapture");
CameraExtension.getInstance().stopCapture(); CameraExtension.getInstance().stopCapture();
} }
public static int GetWidth() { public static int GetWidth() {
Log.v(TAG, "GetWidth"); //Log.v(TAG, "GetWidth");
return CameraExtension.getInstance().getWidth(); return CameraExtension.getInstance().getWidth();
} }
public static int GetHeight() { public static int GetHeight() {
Log.v(TAG, "GetHeight"); //Log.v(TAG, "GetHeight");
return CameraExtension.getInstance().getHeight(); return CameraExtension.getInstance().getHeight();
} }

View File

@ -117,12 +117,12 @@ JNIEXPORT void JNICALL Java_com_defold_android_camera_CameraExtension_handleCame
B = Y + Cb + (Cb >> 1) + (Cb >> 4) + (Cb >> 5); B = Y + Cb + (Cb >> 1) + (Cb >> 4) + (Cb >> 5);
if(B < 0) B = 0; else if(B > 255) B = 255; if(B < 0) B = 0; else if(B > 255) B = 255;
data[0] = R; // We get the image in landscape mode, so we flip it to portrait mode
data++; int index = (w-i-1)*height*3 + (h-j-1)*3;
data[0] = G; data[index + 0] = R;
data++; data[index + 1] = G;
data[0] = B; data[index + 2] = B;
data++;
pixPtr++; pixPtr++;
//data[(pixPtr * 3) + 0] = R; //data[(pixPtr * 3) + 0] = R;
//data[(pixPtr * 3) + 1] = G; //data[(pixPtr * 3) + 1] = G;
@ -160,6 +160,14 @@ int CameraPlatform_StartCapture(dmBuffer::HBuffer* buffer, CameraType type, Capt
jint width = env->CallStaticIntMethod(cls, env->GetStaticMethodID(cls, "GetWidth", "()I")); jint width = env->CallStaticIntMethod(cls, env->GetStaticMethodID(cls, "GetWidth", "()I"));
jint height = env->CallStaticIntMethod(cls, env->GetStaticMethodID(cls, "GetHeight", "()I")); jint height = env->CallStaticIntMethod(cls, env->GetStaticMethodID(cls, "GetHeight", "()I"));
// currently, we have portrait mode
if (width > height)
{
int tmp = width;
width = height;
height = tmp;
}
// set out parameters and create video buffer // set out parameters and create video buffer
outparams.m_Width = (uint32_t)width; outparams.m_Width = (uint32_t)width;
outparams.m_Height = (uint32_t)height; outparams.m_Height = (uint32_t)height;

View File

@ -14,7 +14,7 @@ function init(self)
local quality = camera.CAPTURE_QUALITY_HIGH local quality = camera.CAPTURE_QUALITY_HIGH
local type = camera.CAMERA_TYPE_FRONT local type = camera.CAMERA_TYPE_FRONT
if sysinfo.system_name == 'iPhone OS' then if sysinfo.system_name == 'iPhone OS' or sysinfo.system_name == 'Android' then
type = camera.CAMERA_TYPE_BACK type = camera.CAMERA_TYPE_BACK
quality = camera.CAPTURE_QUALITY_MEDIUM quality = camera.CAPTURE_QUALITY_MEDIUM
end end