That's right, and also you are spawning new threads in every preview frame. And last but not least, i don't think having two surfaceview stacked is a good solution, at least is not intended for using it that way.
On Dec 7, 2:10 pm, Streets Of Boston <flyingdutc...@gmail.com> wrote: > How fast is 'decodeYUV' method? You call this method while your canvas > is locked. > If 'decodeYUV' is slow, it not only makes your background thread > sluggish, but your main GUI-thread as well, because the canvas is > locked for too long. > > Also, you don't synchronize on '_data'... Your implementation of > 'onPreviewFrame' is filling '_data' and your background thread is > reading it. The filling(=arraycopy) of '_data' may not be finished > before your it's being read by your background thread. > > On Dec 5, 9:41 pm, Greg <madma...@gmail.com> wrote: > > > Hello, > > I've been working on creating a program that will output the Camera > > Preview with various user-chosen filters (SnapPhoto has this > > functionality) and I've run into some problems. > > > I have the following set up. > > - Camera preview set to a SurfaceView (I had to set PUSH_BUFFERS or > > the program fails). > > - Have another SurfaceView lieing over the Camera preview SurfaceView > > (in a FrameLayout) > > - Registered a camera callback for the preview data > > > My problem is that the output is extremely choppy and the program > > quickly becomes unresponsive. I've set up a thread to do the > > processing, but this doesn't seem to help. I've implemented the > > decoding (into rgb_8888) algorithm (courtesy of > > dmanpearlhttp://groups.google.com/group/android-developers/msg/d3b29d3ddc8abf9b > > ) Is there anything I'm doing blatantly wrong or something I could fix > > to make this program run at a decent speed? Sorry if the code has poor > > style, I'm sort of an Android beginner and, for that matter, Java > > beginner. > > > This code is inside the second SurfaceView, lieing over the Camera > > preview SurfaceView > > > public void onPreviewFrame(byte[] data, Camera camera) { > > if(hasSurface) { > > System.arraycopy(data, 0, _data, 0, > > data.length); > > outputThread = new HandleOutput(); > > outputThread.start(); > > } > > } > > > where HandleOutput() extends Thread, and _data is a global array. > > > and this is inside the Thread > > > public void run() { > > while(!done) { > > canvas = mHolder.lockCanvas(); > > PixelManip.decodeYUV(rgb, _data, width, > > height); //courtesy of > > dmanpearl (link above) > > PixelManip.applyFilter(filterID, _data, > > rgb); > > bitmap.setPixels(rgb, 0, width, 0, 0, > > width, height); > > canvas.drawBitmap(bitmap, 0, 0, paint); > > mHolder.unlockCanvasAndPost(canvas); > > done = true; > > } > > } > > > Thanks, > > Greg > > > P.S. Let me know if I should post any more code. -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en