From 016011fdf8d920545c7e2e24ec8930c6abd37787 Mon Sep 17 00:00:00 2001 From: Andrey Pavlenko Date: Thu, 27 Aug 2015 13:23:39 +0300 Subject: [PATCH 1/4] fixing start faulure on some devices; syncronization improvements --- .../samples/tutorial4/Camera2Renderer.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/Camera2Renderer.java b/samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/Camera2Renderer.java index a0040ad3b..177fe0d35 100644 --- a/samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/Camera2Renderer.java +++ b/samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/Camera2Renderer.java @@ -73,7 +73,6 @@ import android.view.Surface; Math.abs(aspect - (float)w/h) < 0.2 ) { bestWidth = w; bestHeight = h; - //mPreviewSize = psize; } } Log.i(LOGTAG, "best size: "+bestWidth+"x"+bestHeight); @@ -156,9 +155,9 @@ import android.view.Surface; @Override public void onDisconnected(CameraDevice cameraDevice) { - //mCameraOpenCloseLock.release(); cameraDevice.close(); mCameraDevice = null; + mCameraOpenCloseLock.release(); } @Override @@ -185,6 +184,7 @@ import android.view.Surface; return; } if(null == mSTex) { + mCameraOpenCloseLock.release(); Log.e(LOGTAG, "createCameraPreviewSession: preview SurfaceTexture is null"); return; } @@ -192,7 +192,6 @@ import android.view.Surface; mSTex.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight()); Surface surface = new Surface(mSTex); - Log.d(LOGTAG, "createCameraPreviewSession: surface = " + surface); mPreviewRequestBuilder = mCameraDevice .createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); @@ -215,6 +214,7 @@ import android.view.Surface; mCaptureSession.setRepeatingRequest( mPreviewRequestBuilder.build(), null, mBackgroundHandler); + Log.i(LOGTAG, "CameraPreviewSession has been started"); } catch (CameraAccessException e) { Log.e(LOGTAG, "createCaptureSession failed"); } @@ -227,7 +227,7 @@ import android.view.Surface; Log.e(LOGTAG, "createCameraPreviewSession failed"); mCameraOpenCloseLock.release(); } - }, null); + }, mBackgroundHandler); } catch (CameraAccessException e) { Log.e(LOGTAG, "createCameraPreviewSession"); } catch (InterruptedException e) { @@ -235,7 +235,7 @@ import android.view.Surface; "Interrupted while createCameraPreviewSession", e); } finally { - mCameraOpenCloseLock.release(); + //mCameraOpenCloseLock.release(); } } @@ -262,12 +262,15 @@ import android.view.Surface; @Override protected void setCameraPreviewSize(int width, int height) { - //mPreviewSize = new Size(width, height); - if( !cacPreviewSize(width, height) ) - return; + Log.i(LOGTAG, "setCameraPreviewSize("+width+"x"+height+")"); try { mCameraOpenCloseLock.acquire(); + if( !cacPreviewSize(width, height) ) { + mCameraOpenCloseLock.release(); + return; + } if (null != mCaptureSession) { + Log.d(LOGTAG, "closing existing previewSession"); mCaptureSession.close(); mCaptureSession = null; } From 43b76e548b04871d0535a6b6affa4b31782d2db3 Mon Sep 17 00:00:00 2001 From: Andrey Pavlenko Date: Thu, 27 Aug 2015 13:28:09 +0300 Subject: [PATCH 2/4] adding `NO_PROCESSING` (i.e. just preview) mode --- .../android/tutorial-4-opencl/jni/CLprocessor.cpp | 7 +++++++ samples/android/tutorial-4-opencl/jni/GLrender.cpp | 6 ++++-- samples/android/tutorial-4-opencl/res/menu/menu.xml | 1 + .../opencv/samples/tutorial4/NativeGLRenderer.java | 1 + .../opencv/samples/tutorial4/Tutorial4Activity.java | 12 ++++++++++-- 5 files changed, 23 insertions(+), 4 deletions(-) diff --git a/samples/android/tutorial-4-opencl/jni/CLprocessor.cpp b/samples/android/tutorial-4-opencl/jni/CLprocessor.cpp index dcad18e26..bf4f25c40 100644 --- a/samples/android/tutorial-4-opencl/jni/CLprocessor.cpp +++ b/samples/android/tutorial-4-opencl/jni/CLprocessor.cpp @@ -79,6 +79,7 @@ void dumpCLinfo() cl::Context theContext; cl::CommandQueue theQueue; cl::Program theProgB2B, theProgI2B, theProgI2I; +bool haveOpenCL = false; void initCL() { @@ -100,6 +101,7 @@ void initCL() try { + haveOpenCL = false; cl::Platform p = cl::Platform::getDefault(); std::string ext = p.getInfo(); if(ext.find("cl_khr_gl_sharing") == std::string::npos) @@ -124,6 +126,7 @@ void initCL() LOGD("OpenCV+OpenCL works OK!"); else LOGE("Can't init OpenCV with OpenCL TAPI"); + haveOpenCL = true; } catch(cl::Error& e) { @@ -147,6 +150,8 @@ void closeCL() #define GL_TEXTURE_2D 0x0DE1 void procOCL_I2I(int texIn, int texOut, int w, int h) { + if(!haveOpenCL) return; + LOGD("procOCL_I2I(%d, %d, %d, %d)", texIn, texOut, w, h); cl::ImageGL imgIn (theContext, CL_MEM_READ_ONLY, GL_TEXTURE_2D, 0, texIn); cl::ImageGL imgOut(theContext, CL_MEM_WRITE_ONLY, GL_TEXTURE_2D, 0, texOut); @@ -179,6 +184,8 @@ void procOCL_I2I(int texIn, int texOut, int w, int h) void procOCL_OCV(int tex, int w, int h) { + if(!haveOpenCL) return; + int64_t t = getTimeMs(); cl::ImageGL imgIn (theContext, CL_MEM_READ_ONLY, GL_TEXTURE_2D, 0, tex); std::vector < cl::Memory > images(1, imgIn); diff --git a/samples/android/tutorial-4-opencl/jni/GLrender.cpp b/samples/android/tutorial-4-opencl/jni/GLrender.cpp index 05b796ff3..d3e09de36 100644 --- a/samples/android/tutorial-4-opencl/jni/GLrender.cpp +++ b/samples/android/tutorial-4-opencl/jni/GLrender.cpp @@ -63,9 +63,9 @@ GLuint FBO = 0; GLuint texOES = 0; int texWidth = 0, texHeight = 0; -enum ProcMode {PROC_MODE_CPU=1, PROC_MODE_OCL_DIRECT=2, PROC_MODE_OCL_OCV=3}; +enum ProcMode {PROC_MODE_NO_PROC=0, PROC_MODE_CPU=1, PROC_MODE_OCL_DIRECT=2, PROC_MODE_OCL_OCV=3}; -ProcMode procMode = PROC_MODE_CPU; +ProcMode procMode = PROC_MODE_NO_PROC; static inline void deleteTex(GLuint* tex) { @@ -298,6 +298,7 @@ extern "C" void drawFrame() switch(procMode) { + case PROC_MODE_NO_PROC: drawFrameOrig(); break; case PROC_MODE_CPU: drawFrameProcCPU(); break; case PROC_MODE_OCL_DIRECT: drawFrameProcOCL(); break; case PROC_MODE_OCL_OCV: drawFrameProcOCLOCV(); break; @@ -366,6 +367,7 @@ extern "C" void setProcessingMode(int mode) { switch(mode) { + case PROC_MODE_NO_PROC: procMode = PROC_MODE_NO_PROC; break; case PROC_MODE_CPU: procMode = PROC_MODE_CPU; break; case PROC_MODE_OCL_DIRECT: procMode = PROC_MODE_OCL_DIRECT; break; case PROC_MODE_OCL_OCV: procMode = PROC_MODE_OCL_OCV; break; diff --git a/samples/android/tutorial-4-opencl/res/menu/menu.xml b/samples/android/tutorial-4-opencl/res/menu/menu.xml index 2b317e20f..a737e39d2 100644 --- a/samples/android/tutorial-4-opencl/res/menu/menu.xml +++ b/samples/android/tutorial-4-opencl/res/menu/menu.xml @@ -1,6 +1,7 @@ + diff --git a/samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/NativeGLRenderer.java b/samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/NativeGLRenderer.java index 40eef1e6a..8d9216c97 100644 --- a/samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/NativeGLRenderer.java +++ b/samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/NativeGLRenderer.java @@ -7,6 +7,7 @@ public class NativeGLRenderer { System.loadLibrary("JNIrender"); } + public static final int PROCESSING_MODE_NO_PROCESSING = 0; public static final int PROCESSING_MODE_CPU = 1; public static final int PROCESSING_MODE_OCL_DIRECT = 2; public static final int PROCESSING_MODE_OCL_OCV = 3; diff --git a/samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/Tutorial4Activity.java b/samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/Tutorial4Activity.java index cda66df7c..56b416c80 100644 --- a/samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/Tutorial4Activity.java +++ b/samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/Tutorial4Activity.java @@ -34,11 +34,11 @@ public class Tutorial4Activity extends Activity { mProcMode = (TextView)findViewById(R.id.proc_mode_text_view); runOnUiThread(new Runnable() { public void run() { - mProcMode.setText("Processing mode: CPU"); + mProcMode.setText("Processing mode: No processing"); } }); - NativeGLRenderer.setProcessingMode(NativeGLRenderer.PROCESSING_MODE_CPU); } + NativeGLRenderer.setProcessingMode(NativeGLRenderer.PROCESSING_MODE_NO_PROCESSING); } @Override protected void onPause() { @@ -62,6 +62,14 @@ public class Tutorial4Activity extends Activity { @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { + case R.id.no_proc: + runOnUiThread(new Runnable() { + public void run() { + mProcMode.setText("Processing mode: No Processing"); + } + }); + NativeGLRenderer.setProcessingMode(NativeGLRenderer.PROCESSING_MODE_NO_PROCESSING); + return true; case R.id.cpu: runOnUiThread(new Runnable() { public void run() { From 8031742817eb59148336dc1b77d3b573732c334f Mon Sep 17 00:00:00 2001 From: Andrey Pavlenko Date: Thu, 27 Aug 2015 14:03:08 +0300 Subject: [PATCH 3/4] unused imports clean-up --- .../src/org/opencv/samples/tutorial4/Camera2Renderer.java | 4 ---- .../src/org/opencv/samples/tutorial4/MyGLRendererBase.java | 1 - 2 files changed, 5 deletions(-) diff --git a/samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/Camera2Renderer.java b/samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/Camera2Renderer.java index 177fe0d35..217268a78 100644 --- a/samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/Camera2Renderer.java +++ b/samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/Camera2Renderer.java @@ -4,12 +4,8 @@ import java.util.Arrays; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; -import javax.microedition.khronos.egl.EGLConfig; -import javax.microedition.khronos.opengles.GL10; - import android.annotation.SuppressLint; import android.content.Context; -import android.graphics.Point; import android.graphics.SurfaceTexture; import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CameraCaptureSession; diff --git a/samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/MyGLRendererBase.java b/samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/MyGLRendererBase.java index a0045696c..f3abe87b3 100644 --- a/samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/MyGLRendererBase.java +++ b/samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/MyGLRendererBase.java @@ -9,7 +9,6 @@ import android.opengl.GLSurfaceView; import android.os.Handler; import android.os.Looper; import android.util.Log; -import android.view.View; import android.widget.TextView; public abstract class MyGLRendererBase implements GLSurfaceView.Renderer, SurfaceTexture.OnFrameAvailableListener { From 74fcefedcb26dc4e4a1da903f38c7e00026ebc64 Mon Sep 17 00:00:00 2001 From: Andrey Pavlenko Date: Thu, 27 Aug 2015 14:04:08 +0300 Subject: [PATCH 4/4] giving a chance for OpenCL 1.1 devices --- samples/android/tutorial-4-opencl/jni/CLprocessor.cpp | 7 ++++--- samples/android/tutorial-4-opencl/jni/GLrender.cpp | 8 ++++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/samples/android/tutorial-4-opencl/jni/CLprocessor.cpp b/samples/android/tutorial-4-opencl/jni/CLprocessor.cpp index bf4f25c40..a46cac424 100644 --- a/samples/android/tutorial-4-opencl/jni/CLprocessor.cpp +++ b/samples/android/tutorial-4-opencl/jni/CLprocessor.cpp @@ -1,4 +1,5 @@ #define __CL_ENABLE_EXCEPTIONS +#define CL_USE_DEPRECATED_OPENCL_1_1_APIS /*let's give a chance for OpenCL 1.1 devices*/ #include #include @@ -182,12 +183,12 @@ void procOCL_I2I(int texIn, int texOut, int w, int h) LOGD("enqueueReleaseGLObjects() costs %d ms", getTimeInterval(t)); } -void procOCL_OCV(int tex, int w, int h) +void procOCL_OCV(int texIn, int texOut, int w, int h) { if(!haveOpenCL) return; int64_t t = getTimeMs(); - cl::ImageGL imgIn (theContext, CL_MEM_READ_ONLY, GL_TEXTURE_2D, 0, tex); + cl::ImageGL imgIn (theContext, CL_MEM_READ_ONLY, GL_TEXTURE_2D, 0, texIn); std::vector < cl::Memory > images(1, imgIn); theQueue.enqueueAcquireGLObjects(&images); theQueue.finish(); @@ -204,7 +205,7 @@ void procOCL_OCV(int tex, int w, int h) LOGD("OpenCV processing costs %d ms", getTimeInterval(t)); t = getTimeMs(); - cl::ImageGL imgOut(theContext, CL_MEM_WRITE_ONLY, GL_TEXTURE_2D, 0, tex); + cl::ImageGL imgOut(theContext, CL_MEM_WRITE_ONLY, GL_TEXTURE_2D, 0, texOut); images.clear(); images.push_back(imgOut); theQueue.enqueueAcquireGLObjects(&images); diff --git a/samples/android/tutorial-4-opencl/jni/GLrender.cpp b/samples/android/tutorial-4-opencl/jni/GLrender.cpp index d3e09de36..5c2862026 100644 --- a/samples/android/tutorial-4-opencl/jni/GLrender.cpp +++ b/samples/android/tutorial-4-opencl/jni/GLrender.cpp @@ -31,7 +31,7 @@ const char vss[] = \ "varying vec2 texCoord;\n" \ "void main() {\n" \ " texCoord = vTexCoord;\n" \ - " gl_Position = vec4 ( vPosition, 0.0f, 1.0f );\n" \ + " gl_Position = vec4 ( vPosition, 0.0, 1.0 );\n" \ "}"; const char fssOES[] = \ @@ -268,7 +268,7 @@ void drawFrameProcCPU() } void procOCL_I2I(int texIn, int texOut, int w, int h); -void procOCL_OCV(int tex, int w, int h); +void procOCL_OCV(int texIn, int texOut, int w, int h); void drawFrameProcOCL() { drawTex(texOES, GL_TEXTURE_EXTERNAL_OES, FBO); @@ -285,10 +285,10 @@ void drawFrameProcOCLOCV() drawTex(texOES, GL_TEXTURE_EXTERNAL_OES, FBO); // modify pixels in FBO texture using OpenCL and CL-GL interop - procOCL_OCV(FBOtex, texWidth, texHeight); + procOCL_OCV(FBOtex, FBOtex2, texWidth, texHeight); // render to screen - drawTex(FBOtex, GL_TEXTURE_2D, 0); + drawTex(FBOtex2, GL_TEXTURE_2D, 0); } extern "C" void drawFrame()