Use preview buffer approach to avoid excessive GC

This commit is contained in:
Sean Owen 2014-04-30 23:25:27 +01:00
parent 461d15a890
commit d5852ff9ef
3 changed files with 10 additions and 3 deletions

View file

@ -15,6 +15,7 @@
limitations under the License.
-->
<resources>
<item type="id" name="decode_start"/>
<item type="id" name="decode"/>
<item type="id" name="decode_failed"/>
<item type="id" name="decode_succeeded"/>

View file

@ -147,7 +147,7 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal
camera.setPreviewDisplay(holder);
camera.startPreview();
} catch (IOException e) {
Log.e(TAG, "Cannot start prevew", e);
Log.e(TAG, "Cannot start preview", e);
}
decodeRunnable = new DecodeRunnable(this, camera);

View file

@ -47,6 +47,7 @@ final class DecodeRunnable implements Runnable, Camera.PreviewCallback {
private final Camera camera;
private final int height;
private final int width;
private final byte[] previewBuffer;
private boolean running;
private Handler handler;
private final CountDownLatch handlerInitLatch;
@ -58,6 +59,7 @@ final class DecodeRunnable implements Runnable, Camera.PreviewCallback {
Camera.Size previewSize = parameters.getPreviewSize();
height = previewSize.height;
width = previewSize.width;
previewBuffer = new byte[(height * width * 3) / 2];
running = true;
handlerInitLatch = new CountDownLatch(1);
}
@ -81,7 +83,7 @@ final class DecodeRunnable implements Runnable, Camera.PreviewCallback {
}
void startScanning() {
getHandler().obtainMessage(R.id.decode_failed).sendToTarget();
getHandler().obtainMessage(R.id.decode_start).sendToTarget();
}
void stop() {
@ -111,6 +113,10 @@ final class DecodeRunnable implements Runnable, Camera.PreviewCallback {
return;
}
switch (message.what) {
case R.id.decode_start:
camera.setPreviewCallbackWithBuffer(DecodeRunnable.this);
camera.addCallbackBuffer(previewBuffer);
break;
case R.id.decode:
decode((byte[]) message.obj);
break;
@ -124,7 +130,7 @@ final class DecodeRunnable implements Runnable, Camera.PreviewCallback {
});
break;
case R.id.decode_failed:
camera.setOneShotPreviewCallback(DecodeRunnable.this);
camera.addCallbackBuffer(previewBuffer);
break;
case R.id.quit:
running = false;