@Override
        public InputStream streaming(Properties parms) {
          VideoFrame targetFrame = null;
          for (int i = 0; i < maxVideoNumber; i++) {
            if (videoFrames[i].acquire()) {
              targetFrame = videoFrames[i];
              break;
            }
          }
          // return 503 internal error
          if (targetFrame == null) {
            Log.d(TAG, "No free videoFrame found!");
            return null;
          }

          // compress yuv to jpeg
          int picWidth = cameraView_.Width();
          int picHeight = cameraView_.Height();
          YuvImage newImage = new YuvImage(preFrame, ImageFormat.NV21, picWidth, picHeight, null);
          targetFrame.reset();
          boolean ret;
          inProcessing = true;
          try {
            ret =
                newImage.compressToJpeg(new Rect(0, 0, picWidth, picHeight), mQuality, targetFrame);
          } catch (Exception ex) {
            ret = false;
          }
          inProcessing = false;

          // compress success, return ok
          if (ret == true) {
            parms.setProperty("mime", "image/jpeg");
            InputStream ins = targetFrame.getInputStream();
            return ins;
          }
          // send 503 error
          targetFrame.release();

          return null;
        }