Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 22f70dbc authored by Vadim Caen's avatar Vadim Caen Committed by Android (Google) Code Review
Browse files

Merge changes I63f51dd6,Iaf161a2d into main

* changes:
  Add missing request key for backward compatible camera
  Generate correct Exif data from capture metadata
parents 441a4282 d86a3a4c
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -296,8 +296,10 @@ std::optional<CameraMetadata> initCameraCharacteristics(
                                    ANDROID_CONTROL_ZOOM_RATIO,
                                    ANDROID_FLASH_MODE,
                                    ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
                                    ANDROID_JPEG_ORIENTATION,
                                    ANDROID_JPEG_QUALITY,
                                    ANDROID_JPEG_THUMBNAIL_QUALITY,
                                    ANDROID_JPEG_THUMBNAIL_SIZE,
                                    ANDROID_NOISE_REDUCTION_MODE,
                                    ANDROID_STATISTICS_FACE_DETECT_MODE})
          .setAvailableResultKeys({
+6 −0
Original line number Diff line number Diff line
@@ -122,6 +122,12 @@ class VirtualCameraDevice
  // Default JPEG compression quality.
  static constexpr uint8_t kDefaultJpegQuality = 80;

  // Default JPEG orientation.
  static constexpr uint8_t kDefaultJpegOrientation = 0;

  // Default Make and Model for Exif
  static constexpr char kDefaultMakeAndModel[] = "Android Virtual Camera";

  static constexpr camera_metadata_enum_android_control_capture_intent_t
      kDefaultCaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;

+27 −8
Original line number Diff line number Diff line
@@ -14,7 +14,6 @@
 * limitations under the License.
 */

#include "system/camera_metadata.h"
#define LOG_TAG "VirtualCameraRenderThread"
#include "VirtualCameraRenderThread.h"

@@ -45,6 +44,7 @@
#include "android-base/thread_annotations.h"
#include "android/binder_auto_utils.h"
#include "android/hardware_buffer.h"
#include "system/camera_metadata.h"
#include "ui/GraphicBuffer.h"
#include "util/EglFramebuffer.h"
#include "util/JpegUtil.h"
@@ -128,6 +128,7 @@ CameraMetadata createCaptureResultMetadata(
          .setFlashMode(ANDROID_FLASH_MODE_OFF)
          .setFocalLength(VirtualCameraDevice::kFocalLength)
          .setJpegQuality(requestSettings.jpegQuality)
          .setJpegOrientation(requestSettings.jpegOrientation)
          .setJpegThumbnailSize(requestSettings.thumbnailResolution.width,
                                requestSettings.thumbnailResolution.height)
          .setJpegThumbnailQuality(requestSettings.thumbnailJpegQuality)
@@ -146,6 +147,11 @@ CameraMetadata createCaptureResultMetadata(
    builder.setControlAeTargetFpsRange(requestSettings.fpsRange.value());
  }

  if (requestSettings.gpsCoordinates.has_value()) {
    const GpsCoordinates& coordinates = requestSettings.gpsCoordinates.value();
    builder.setJpegGpsCoordinates(coordinates);
  }

  std::unique_ptr<CameraMetadata> metadata = builder.build();

  if (metadata == nullptr) {
@@ -224,12 +230,24 @@ bool isYuvFormat(const PixelFormat pixelFormat) {
}

std::vector<uint8_t> createExif(
    Resolution imageSize, const std::vector<uint8_t>& compressedThumbnail = {}) {
    Resolution imageSize, const CameraMetadata resultMetadata,
    const std::vector<uint8_t>& compressedThumbnail = {}) {
  std::unique_ptr<ExifUtils> exifUtils(ExifUtils::create());
  exifUtils->initialize();
  exifUtils->setImageWidth(imageSize.width);
  exifUtils->setImageHeight(imageSize.height);
  // TODO(b/324383963) Set Make/Model and orientation.

  // Make a copy of the metadata in order to converting it the HAL metadata
  // format (as opposed to the AIDL class) and use the setFromMetadata method
  // from ExifUtil
  camera_metadata_t* rawSettings =
      clone_camera_metadata((camera_metadata_t*)resultMetadata.metadata.data());
  if (rawSettings != nullptr) {
    android::hardware::camera::common::helper::CameraMetadata halMetadata(
        rawSettings);
    exifUtils->setFromMetadata(halMetadata, imageSize.width, imageSize.height);
  }
  exifUtils->setMake(VirtualCameraDevice::kDefaultMakeAndModel);
  exifUtils->setModel(VirtualCameraDevice::kDefaultMakeAndModel);
  exifUtils->setFlash(0);

  std::vector<uint8_t> app1Data;

@@ -427,7 +445,8 @@ void VirtualCameraRenderThread::processCaptureRequest(
    auto status = streamConfig->format == PixelFormat::BLOB
                      ? renderIntoBlobStreamBuffer(
                            reqBuffer.getStreamId(), reqBuffer.getBufferId(),
                            request.getRequestSettings(), reqBuffer.getFence())
                            captureResult.result, request.getRequestSettings(),
                            reqBuffer.getFence())
                      : renderIntoImageStreamBuffer(reqBuffer.getStreamId(),
                                                    reqBuffer.getBufferId(),
                                                    reqBuffer.getFence());
@@ -569,7 +588,7 @@ std::vector<uint8_t> VirtualCameraRenderThread::createThumbnail(
}

ndk::ScopedAStatus VirtualCameraRenderThread::renderIntoBlobStreamBuffer(
    const int streamId, const int bufferId,
    const int streamId, const int bufferId, const CameraMetadata& resultMetadata,
    const RequestSettings& requestSettings, sp<Fence> fence) {
  std::shared_ptr<AHardwareBuffer> hwBuffer =
      mSessionContext.fetchHardwareBuffer(streamId, bufferId);
@@ -635,7 +654,7 @@ ndk::ScopedAStatus VirtualCameraRenderThread::renderIntoBlobStreamBuffer(
  }

  std::vector<uint8_t> app1ExifData =
      createExif(Resolution(stream->width, stream->height),
      createExif(Resolution(stream->width, stream->height), resultMetadata,
                 createThumbnail(requestSettings.thumbnailResolution,
                                 requestSettings.thumbnailJpegQuality));
  std::optional<size_t> compressedSize = compressJpeg(
+5 −1
Original line number Diff line number Diff line
@@ -57,11 +57,13 @@ class CaptureRequestBuffer {

struct RequestSettings {
  int jpegQuality = VirtualCameraDevice::kDefaultJpegQuality;
  int jpegOrientation = VirtualCameraDevice::kDefaultJpegOrientation;
  Resolution thumbnailResolution = Resolution(0, 0);
  int thumbnailJpegQuality = VirtualCameraDevice::kDefaultJpegQuality;
  std::optional<FpsRange> fpsRange = {};
  std::optional<FpsRange> fpsRange;
  camera_metadata_enum_android_control_capture_intent_t captureIntent =
      VirtualCameraDevice::kDefaultCaptureIntent;
  std::optional<GpsCoordinates> gpsCoordinates;
};

// Represents single capture request to fill set of buffers.
@@ -153,6 +155,8 @@ class VirtualCameraRenderThread {
  // Always called on render thread.
  ndk::ScopedAStatus renderIntoBlobStreamBuffer(
      const int streamId, const int bufferId,
      const ::aidl::android::hardware::camera::device::CameraMetadata&
          resultMetadata,
      const RequestSettings& requestSettings, sp<Fence> fence = nullptr);

  // Render current image to the YCbCr buffer.
+3 −1
Original line number Diff line number Diff line
@@ -257,13 +257,15 @@ RequestSettings createSettingsFromMetadata(const CameraMetadata& metadata) {
  return RequestSettings{
      .jpegQuality = getJpegQuality(metadata).value_or(
          VirtualCameraDevice::kDefaultJpegQuality),
      .jpegOrientation = getJpegOrientation(metadata),
      .thumbnailResolution =
          getJpegThumbnailSize(metadata).value_or(Resolution(0, 0)),
      .thumbnailJpegQuality = getJpegThumbnailQuality(metadata).value_or(
          VirtualCameraDevice::kDefaultJpegQuality),
      .fpsRange = getFpsRange(metadata),
      .captureIntent = getCaptureIntent(metadata).value_or(
          ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW)};
          ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW),
      .gpsCoordinates = getGpsCoordinates(metadata)};
}

}  // namespace
Loading