Releases: Cascable/cascablecore-distribution
15.0.1
15.0
Support for "True Tethering" for Canon and Nikon Cameras
CascableCore 15 adds support for "true tethering" for Canon and Nikon cameras — that is, being able to transfer images from the camera without involving the camera's storage at all. When the camera is set to this mode, this behaviour matches that of newer Sony cameras. [CORE-374]
This is done with the addition of the CBLPropertyIdentifierImageDestination
property to Canon and Nikon cameras that support this mode. Typically, you'll see values like:
- "Camera" (
CBLPropertyCommonValueImageDestinationCamera
) - "Host + Camera" (
CBLPropertyCommonValueImageDestinationCameraAndHost
) - "Host" (
CBLPropertyCommonValueImageDestinationConnectedHost
)
When set to "Host + Camera" or "Host", you'll get camera-initiated transfer requests from the camera to transfer these images. Important: These requests will have their executionRequiredToClearBuffer
property set to true
, and you must handle them - even if you discard the result - to keep the requests flowing. If you don't, the camera will get stuck waiting for the images to be transferred and will eventually refuse to shoot images.
When deciding how to handle a camera-initiated transfer request, you can inspect the request object:
-
Requests with both
isOnlyDestinationForImage
andexecutionRequiredToClearBuffer
set tofalse
are images saved to the camera's storage card(s) and the camera isn't particularly fussed if you transfer them over or not. You can ignore these entirely if you wish. -
Requests with
isOnlyDestinationForImage
set tofalse
andexecutionRequiredToClearBuffer
set totrue
are images saved to the camera's storage card(s) but the camera is waiting for you to transfer them as well. You must handle these requests, but the image data isn't critical (since it's also stored on the camera). -
Requests with both
isOnlyDestinationForImage
andexecutionRequiredToClearBuffer
set totrue
are images that're only being transferred to the connected host (i.e., you) and won't be saved to the camera's storage card(s). You must handle these requests, and if you don't store the result you will be losing image data. You'll get two separate transfer requests in this case - one for the image on the storage card(s), and another for the one being transferred directly to the host.
Note: Cameras often have no opinion on the file name of images transferred directly to the host, even if that image also gets saved to the storage card(s). Such requests will have a nil
value for the fileNameHint
property.
Other Camera-Initiated Transfer Behaviour Changes
-
When possible, camera-initiated transfers from Canon and Nikon cameras will offer an original representation of the image whether "true tethering" or not. Previously, they'd only offer preview representations.
-
Canon and Nikon cameras will no longer filter out camera-initiated transfer requests that come in very close to one other (such as a RAW+JPEG pair). It's up to clients to handle such filtering if it's desired.
Camera-Initiated Transfer API Changes
-
Added
-predictedFileSizeForRepresentation:
toid <CBLCameraInitiatedTransferRequest>
. -
Added
-predictedUTIForRepresentation:
toid <CBLCameraInitiatedTransferRequest>
. -
Added
-fileSizeForRepresentation:
toid <CBLCameraInitiatedTransferResult>
. -
Added
-dateProduced
to bothid <CBLCameraInitiatedTransferRequest>
andid <CBLCameraInitiatedTransferResult>
. -
Added variants of the
-writeRepresentation:…
and-generateDataForRepresentation:…
APIs onid <CBLCameraInitiatedTransferResult>
that take acompletionQueue:
parameter.
New API
-
Added
-fetchVideoMetadata…
methods toid <CBLFileSystemItem>
, which can be used to load video-specific metadata. [CORE-919] -
Added additional property identifiers and support for cameras (notably Nikon cameras) that have separate exposure properties for video recording vs. stills shooting. For other cameras that support video recording, CascableCore will mirror the "standard" properties to the video variants, meaning you can always use the video variants when a camera is in video mode. These new properties are
CBLPropertyIdentifierVideoISOSpeed
,CBLPropertyIdentifierVideoShutterSpeed
,CBLPropertyIdentifierVideoAperture
, andCBLPropertyIdentifierVideoExposureCompensation
. [CORE-921]
14.1.2
Bug Fixes
-
Fixed a bug where attempting to put a Canon camera that supports simultaneous filesystem and shooting command categories into the filesystem category would (erroneously) fail with a
CBLErrorCodeRequiresPhysicalInteraction
error. -
Fixed a bug where USB cameras could fail to be discovered if the device has no active network interfaces and the camera was connected after camera discovery starts. [CORE-926]
-
Worked around a bug introduced in iOS 18.1 and macOS 15.1 that'd cause thumbnails for JPEG images from Canon cameras to be rendered incorrectly. [CORE-918]
-
Thumbnails are now loaded for video files from Canon cameras.
-
Fixed duplicate events being delivered via the filesystem observer APIs from some cameras.
14.1.1
14.1
Camera Compatibility
- Added initial support for the Canon EOS R5 Mark II.
Note: The EOS R5 Mark II has a number of... eccentricities that make it behave a little bit differently to prior Canon cameras. We've done our best to shield clients of CascableCore from these, but a couple of exceptions remain:
-
The
fetchThumbnail…
andfetchEXIFMetadata…
methods will always fail with the errorCBLErrorCodeNotAvailable
. -
The
fetchPreview…
methods may take longer to execute than is expected. -
When streaming files from the camera with the
streamItem…
methods, cancelling the transfer midway through may have a longer period than expected between cancelling the transfer and the transfer's completion handler being called.
We're continuing to investigate these issues.
14.0.2
14.0.1
14.0.0
Support for visionOS
CascableCore now supports the visionOS platform. Unfortunately, visionOS doesn't currently support USB connections to cameras.
Support for Applying Ratings to Files
CascableCore now allows you to apply ratings to images and videos on camera storage cards. Currently, this is only supported by Canon EOS cameras. [CORE-332]
The API for this is mainly in id <CBLFileSystemItem>
. The -ratingMutationType
property tells you the type of rating the particular file supports, and -updateRatingTo:completionHandler:
can be called to apply a new rating to the file.
Additionally, the CBLCameraSupportedFunctionalityMutableRatings
functionality flag can be used to see if a camera generally supports applying ratings to files.
Camera Compatibility
- Added support for newer Canon PowerShot cameras via USB. This includes the G7X II and newer, SX70 HS and newer, SX730 HS and newer, and the V10. Do note that PowerShot models tend to have quite a restricted set of property options compared to EOS models. [CORE-744]
API Changes
- Renamed the
-operatingSystemIsNewEnoughForWiredCameras
property onCBLCameraDiscovery
to-platformSupportsWiredCameras
.
Bug Fixes
-
Fixed a bug that'd cause thumbnails of JPEG images to load incorrectly from Canon and Nikon cameras. [CORE-718]
-
Fixed a bug that'd cause discovery of all camera types (including via USB and the simulated camera plugin) to take several minutes if the client device happened to be connected to a WiFi network with certain traffic limitations in place (such as a strict firewall). Network-connected cameras may still not be detected if traffic to them is blocked, but discovery of other cameras will no longer be affected. [CORE-725]
Misc.
- Numeric
CBLErrorCode
values are now explicitly declared in theNSError+CBLExtensions.h
header to aid debugging. The values themselves are unchanged.
13.2.0
API Changes
- Added the
naturalImageSize
andrequiresImageResizeToAvoidDistortion
properties toid <CBLCameraLiveViewFrame>
to aid with situations where cameras deliver distorted live view images. See the documentation for these properties for a detailed discussion.
13.1.0
Camera Compatibility
- Added support for non-JPEG live view streams from the Canon EOS 1300D. [CORE-694]
Important: If you're working with live view pixel buffers directly, it's important to handle the case where the pixel buffer format changes mid-stream. The EOS 1300D switches from JPEG to RGB24 for live view during video recording, for instance. If you're using CascableCore's own image rendering via the image
property on live view frames, no code changes should be necessary.