feat: Split videoHdr
and photoHdr
into two settings (#2161)
* feat: Split `videoHdr` and `photoHdr` into two settings * fix: Rename all `hdr` * fix: Fix HDR on Android * Update CameraDeviceDetails.kt * Update CameraDeviceDetails.kt * fix: Correctly configure `pixelFormat` AFTER `format` * Update CameraSession+Configuration.swift * fix: Also after format changed
This commit is contained in:
@@ -207,7 +207,7 @@ extension CameraConfiguration.Video {
|
||||
|
||||
// Find the best matching format
|
||||
guard let format = videoOutput.findPixelFormat(firstOf: targetFormats) else {
|
||||
throw CameraError.format(.invalidHdr)
|
||||
throw CameraError.format(.invalidVideoHdr)
|
||||
}
|
||||
// YUV 4:2:0 10-bit (compressed/uncompressed)
|
||||
return format
|
||||
|
@@ -108,7 +108,7 @@ enum DeviceError: String {
|
||||
|
||||
enum FormatError {
|
||||
case invalidFps(fps: Int)
|
||||
case invalidHdr
|
||||
case invalidVideoHdr
|
||||
case invalidFormat
|
||||
case incompatiblePixelFormatWithHDR
|
||||
|
||||
@@ -118,8 +118,8 @@ enum FormatError {
|
||||
return "invalid-format"
|
||||
case .invalidFps:
|
||||
return "invalid-fps"
|
||||
case .invalidHdr:
|
||||
return "invalid-hdr"
|
||||
case .invalidVideoHdr:
|
||||
return "invalid-video-hdr"
|
||||
case .incompatiblePixelFormatWithHDR:
|
||||
return "incompatible-pixel-format-with-hdr-setting"
|
||||
}
|
||||
@@ -131,8 +131,8 @@ enum FormatError {
|
||||
return "The given format was invalid. Did you check if the current device supports the given format in `device.formats`?"
|
||||
case let .invalidFps(fps):
|
||||
return "The given format cannot run at \(fps) FPS! Make sure your FPS is lower than `format.maxFps` but higher than `format.minFps`."
|
||||
case .invalidHdr:
|
||||
return "The currently selected format does not support HDR capture! Make sure you select a format which includes `supportsPhotoHDR`/`supportsVideoHDR`!"
|
||||
case .invalidVideoHdr:
|
||||
return "The currently selected format does not support 10-bit Video HDR streaming! Make sure you select a format which includes `supportsVideoHdr`!"
|
||||
case .incompatiblePixelFormatWithHDR:
|
||||
return "The currently selected pixelFormat is not compatible with HDR! HDR only works with the `yuv` pixelFormat."
|
||||
}
|
||||
|
@@ -100,7 +100,7 @@ extension CameraSession {
|
||||
}
|
||||
|
||||
// Video Output + Frame Processor
|
||||
if case let .enabled(video) = configuration.video {
|
||||
if case .enabled = configuration.video {
|
||||
ReactLogger.log(level: .info, message: "Adding Video Data output...")
|
||||
|
||||
// 1. Add
|
||||
@@ -113,11 +113,6 @@ extension CameraSession {
|
||||
// 2. Configure
|
||||
videoOutput.setSampleBufferDelegate(self, queue: CameraQueues.videoQueue)
|
||||
videoOutput.alwaysDiscardsLateVideoFrames = true
|
||||
let pixelFormatType = try video.getPixelFormat(for: videoOutput)
|
||||
videoOutput.videoSettings = [
|
||||
String(kCVPixelBufferPixelFormatTypeKey): pixelFormatType,
|
||||
]
|
||||
|
||||
self.videoOutput = videoOutput
|
||||
}
|
||||
|
||||
@@ -210,6 +205,21 @@ extension CameraSession {
|
||||
ReactLogger.log(level: .info, message: "Successfully configured Format!")
|
||||
}
|
||||
|
||||
func configurePixelFormat(configuration: CameraConfiguration) throws {
|
||||
guard case let .enabled(video) = configuration.video,
|
||||
let videoOutput else {
|
||||
// Video is not enabled
|
||||
return
|
||||
}
|
||||
|
||||
// Configure the VideoOutput Settings to use the given Pixel Format.
|
||||
// We need to run this after device.activeFormat has been set, otherwise the VideoOutput can't stream the given Pixel Format.
|
||||
let pixelFormatType = try video.getPixelFormat(for: videoOutput)
|
||||
videoOutput.videoSettings = [
|
||||
String(kCVPixelBufferPixelFormatTypeKey): pixelFormatType,
|
||||
]
|
||||
}
|
||||
|
||||
// pragma MARK: Side-Props
|
||||
|
||||
/**
|
||||
|
@@ -141,21 +141,26 @@ class CameraSession: NSObject, AVCaptureVideoDataOutputSampleBufferDelegate, AVC
|
||||
if difference.formatChanged {
|
||||
try self.configureFormat(configuration: config, device: device)
|
||||
}
|
||||
// 5. Configure side-props (fps, lowLightBoost)
|
||||
// 5. After step 2. and 4., we also need to configure the PixelFormat.
|
||||
// This needs to be done AFTER we updated the `format`, as this controls the supported PixelFormats.
|
||||
if difference.outputsChanged || difference.formatChanged {
|
||||
try self.configurePixelFormat(configuration: config)
|
||||
}
|
||||
// 6. Configure side-props (fps, lowLightBoost)
|
||||
if difference.sidePropsChanged {
|
||||
try self.configureSideProps(configuration: config, device: device)
|
||||
}
|
||||
// 6. Configure zoom
|
||||
// 7. Configure zoom
|
||||
if difference.zoomChanged {
|
||||
self.configureZoom(configuration: config, device: device)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 7. Start or stop the session if needed
|
||||
// 8. Start or stop the session if needed
|
||||
self.checkIsActive(configuration: config)
|
||||
|
||||
// 8. Enable or disable the Torch if needed (requires session to be running)
|
||||
// 9. Enable or disable the Torch if needed (requires session to be running)
|
||||
if difference.torchChanged {
|
||||
try self.withDeviceLock { device in
|
||||
try self.configureTorch(configuration: config, device: device)
|
||||
|
Reference in New Issue
Block a user