code: private void decode(byte[] data, int width, int height) {
      long start = System.nanoTime();
      Result rawResult = null;
      PlanarYUVLuminanceSource source = activity.getCameraManager().buildLuminanceSource(data, width, height);
      if (source != null) {
        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
        try {
          rawResult = multiFormatReader.decodeWithState(bitmap);
        } catch (ReaderException re) {
          // continue
        } finally {
          multiFormatReader.reset();
        }
      }
  
      Handler handler = activity.getHandler();
      if (rawResult != null) {
        // Don't log the barcode contents for security.
        long end = System.nanoTime();
        Log.d(TAG, "Found barcode in " + TimeUnit.NANOSECONDS.toMillis(end - start) + " ms");
        if (handler != null) {
          Message message = Message.obtain(handler, R.id.decode_succeeded, rawResult);
          Bundle bundle = new Bundle();
          bundleThumbnail(source, bundle);        
          message.setData(bundle);
          message.sendToTarget();
        }
      } else {
        if (handler != null) {
          Message message = Message.obtain(handler, R.id.decode_failed);
          message.sendToTarget();
        }
      }
    }
docs: Decode the data within the viewfinder rectangle, and time how long it took. For efficiency,
  reuse the same reader objects from one decode to the next.
  
  @param data   The YUV preview frame.
  @param width  The width of the preview frame.
  @param height The height of the preview frame.