diff --git a/samples/android/tutorial-4-opencl/jni/CLprocessor.cpp b/samples/android/tutorial-4-opencl/jni/CLprocessor.cpp index dcad18e267..a46cac4247 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 @@ -79,6 +80,7 @@ void dumpCLinfo() cl::Context theContext; cl::CommandQueue theQueue; cl::Program theProgB2B, theProgI2B, theProgI2I; +bool haveOpenCL = false; void initCL() { @@ -100,6 +102,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 +127,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 +151,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); @@ -177,10 +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(); @@ -197,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 05b796ff36..5c2862026a 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[] = \ @@ -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) { @@ -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() @@ -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 2b317e20f7..a737e39d2c 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/Camera2Renderer.java b/samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/Camera2Renderer.java index a0040ad3b4..217268a78f 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; @@ -73,7 +69,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 +151,9 @@ import android.view.Surface; @Override public void onDisconnected(CameraDevice cameraDevice) { - //mCameraOpenCloseLock.release(); cameraDevice.close(); mCameraDevice = null; + mCameraOpenCloseLock.release(); } @Override @@ -185,6 +180,7 @@ import android.view.Surface; return; } if(null == mSTex) { + mCameraOpenCloseLock.release(); Log.e(LOGTAG, "createCameraPreviewSession: preview SurfaceTexture is null"); return; } @@ -192,7 +188,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 +210,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 +223,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 +231,7 @@ import android.view.Surface; "Interrupted while createCameraPreviewSession", e); } finally { - mCameraOpenCloseLock.release(); + //mCameraOpenCloseLock.release(); } } @@ -262,12 +258,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; } 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 a0045696cf..f3abe87b39 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 { 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 40eef1e6a9..8d9216c97c 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 cda66df7c4..56b416c808 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() {