I had intended to tackle some aspect of the Swift 6 data concurrency migration in this release, but, as hoped, I got side-tracked by client work. I really don’t want to do the Swift 6 work.
High-Res Fullscreen
This feature posed some interesting challenges, and it came directly from a Streamie user — a camera installer — who identified it as being key to his customers. It’s difficult to say “no” to that. Here’s the details.
First, configure your cameras, choosing any of the sub-streams for each camera (that is, any stream with a reduced resolution). Create a new Group and assign these cameras to that group. Tap on the new Full Screen option when configuring the group which will toggle between Regular and High Res. Once you’re streaming this group, whenever you choose to view a camera in full screen mode, Streamie will discover and stream the highest resolution stream available for that camera. You could, for instance, have sixty-four low-res streams in a group on an Apple TV and still be able to view any given camera in full screen 4k mode.
Because this feature requires being able to discover the various streams available to a camera, it is only supported by the ONVIF, Rhombus and UniFi camera types. This feature does not apply to RTSP, Attached, HomeKit, Google Nest, RAW or Shared cameras.
Aspect & Gravity
In the process of working on the above feature, it was discovered that some cameras skew their low-res streams. For instance, a camera may claim a resolution of 704 x 480, when in fact the stream, if displayed at that aspect ratio, would be skewed and should instead be displayed as a 704 x 398 (16:9) aspect ratio. New in this version are two options available when configuring a camera to specify a forced aspect ratio (16:9, 4:3, 1:1, natural) and gravity (fit, fill or stretch). A shocking number of cameras have this problem with their low-res streams, so this feature will probably be very useful for many users.
Mac Catalyst
We were a little late to the game with this, but Streamie now legit appears in the Mac App Store. We transitioned from “Designed for iPad” to Mac Catalyst and were able to make some interesting improvements as a result.
- Mac Icons: If you look in the Members screen, you’ll notice that Streamie now correctly determines the device type and displays the corresponding icon for all of your Mac devices.
- Attached Cameras: When capturing content from an attached camera (think: USB or built-in), the captured video is cropped based on the device orientation. Before transitioning Streamie to Mac Catalyst, there was no way to work around a portrait orientation cropping when running Streamie on a Mac. Subsequent to the transition, Streamie can now correctly capture video from attached cameras in landscape orientation.
- Google Nest: This is the one downside to the Mac Catalyst transition. We can no longer use the iOS-targeted WebRTC framework, and must instead re-build WebRTC for this new platform, which hasn’t yet been accomplished. Stick with the iOS app (running on Mac) if Google Nest is important to you.
Update Nags & Release Notes
Not more than once a month, we update a configuration file that signals that Streamie should start letting you know about a new version available in the App Store. This dialog appears for not more than 30 minutes and then automatically dismisses itself. This behavior has been updated so that the duration of the nagging dialog is proportional to how negligent you’ve been in updating Streamie. Update Streamie. Just do it.
I put all of this work into detailed and informative release notes, and I suspect that very few people actually ever see it, so starting in this release, each time you launch the app for the first time following an app update, you’ll be accosted by the release notes, which you can immediately dismiss if you want to. The release notes contain great information about new features and enhancements. It’s worth taking a few minutes to skim through them.
Lorex & Ubiquiti
This was the biggest (and certainly most unexpected) challenge tackled during this development cycle. Related to testing low-res streams, a user reported frequent decoding errors. I was able to reproduce the problem and I found that it was directly related to a fix I put in place to support Ubiquiti’s new H.265 support. In an RTSP stream, an RTP marker flag is used to indicate that all of the packets have been received that are necessary to decode the video frame. Ubiquiti, for reasons unknown, just has this flag enabled for every single packet. All the time. No exceptions. Basically, they made the flag worthless. My fix for this was to watch the timestamp associated with each packet and only process the accumulated packets if the timestamp had advanced — completely disregarding the RTP marker flag.
What I discovered with this low-res stream is that it had duplicated the timestamp across multiple frames (for reasons unknown), but correctly signaled the end of a frame with the RTP marker.
Intuitively supporting both these behaviors was basically impossible. I slept on it and finally decided that since it is trivial to detect whether we’re streaming from Ubiquiti (by checking for port 7447), and since the Ubiquiti behavior was definitely “more wrong” than Lorex, that Streamie’s RTSP parsing behavior would have to rely on a new isThisUbiquiti flag before disregarding the RTP markers.
Google Nest
One final change worth noting is that Streamie’s Google Nest WebRTC support has improved incrementally. Streamie did not correctly anticipate and support changes in a stream’s encoding settings, which is something that Google Nest apparently does: it can start out with a very low resolution stream and then switch to a higher resolution. Streamie now correctly receives and handles mid-stream encoding parameter changes both in terms of decoding and displaying.
(I need to dust off an old computer so that I can run the setup app on each of these cameras and reset them. I’d almost rather just throw them away, but I hate wasting stuff.)
What’s Next
I’m going to once again plan on doing the Swift 6 migration, and I’m going to continue to hope that client work derails these plans.
Adds
- Adds support for a fullscreen feature that switches to a high-res stream. This feature works with ONVIF, Rhombus and UniFi cameras when being viewed in a Group context.
- Adds support for skewing a video stream to a specific aspect ratio and controlling the gravity (fit, fill, stretch). You can control this by editing a camera and changing the new Aspect and Gravity options.
- Adds Mac icon support to the DeviceIcon service so that Member devices that are Macs will now correctly show their device icons.
- Adds support for parsing the frame copping offset from the SPS in a RAW Streaming Session.
- Adds a "File Info" popup to the Recording Playback Screen which shows file info (size, name, location, etc). This information was formerly available, but was lost when I overhauled the playback screen.
Updates
- Updates some 3rd party packages.
- Updates Streamie with the correct link for v4.9.0 release notes.
- Updates the Streamie launch behavior so that instead of just trying to show the Welcome tutorial for first-time-users, it will also try to show the current Release Notes if they have not yet been seen by this user.
- Updates the UniFi Camera Configure screen to include the channel id number on each stream cell.
Improves
- Improves file server connection caching specifically with the intent of resolving some SMB-related crashes.
- Improves the RTSP streaming code (Krill) to support Lorex (which requires that we pay attention to the RTP marker) and Ubiquiti (which requires that we disregard the RTP marker).
- Improves the BufferView and StreamerView to better handle stall situations, including triggering a view reset if a stall lasts very long. Also, we new distinguish between stalling due to lack of frames, and stalling due to the display layer not accepting new frames.
- Improves the Group-edit process by NOT pulling the Group from remote. Ehh.
- Improves WebRtcClient with better NALU parsing and support for mid-stream encoder changes. Basically, if the source changes its SPS or PPS, we notify the upstream with a new format and we expect the decoder to reset and (possibly) the display layer to notice a change in decoded image size.
- Improves Attached camera support so that the capture cropping correctly matches the device orientation except on the Mac where it should always be landscape.
- Improves the camera "reachable" cache invalidation so that any time a camera is edited, or any time a camera is discovered (via OnvifDeviceProber), it's cached reachable status is cleared.
- Improves the responsiveness of the Home tab screens by removing their default reload-on-appear behavior with more precise reloading that occurs when specific data changes. More specifically, the thumbnails for streamable things (groups, cameras, modules) are refreshed individually instead of just wholesale refoading the screen.
Fixes
- Fixes a time-to-first-frame issue with VideoToolboxDecoder where the first key frame was dropped because the decoder was only fully initialized after that first frame arrived, resulting in the first frame being dropped and the decoding process stalling until the 2nd key frame arrived.
- Fixes a BufferView CMCVideoFormatDescription reset issue where the frame.size differed from the format description size, causing the format description to be re-created for every frame.
- Fixes a main queue issue when linking a Google Nest account.
- Fixes Attached camera support issues related to macOS 15.
- Fixes some UI reloading issues in the Home => Member screen.
- Fixes a long-standing camera cell placement issue on the Home Cameras Screen that occurs when the screen is reloaded when it reappears. I'm not sure that disabling this behavior is necessarily the greatest idea, but I'll do some testing and make sure it doesn't cause any regressions.
Changes
- Changes the isUpdateAvailable() mechanism to multiply the alert display time by the number of missed version updates.
- Changes PortalService to remove use of the main queue in one instance.
- Changes the App Store category for the iOS, tvOS apps from Utilities to Video. We also set the App Store category for the Mac Catalyst app.
- Changes from 'Designed for iPad' to 'Mac Catalyst'. The main tradeoff here is that I now have good Attached camera support but I sacrificed Google Nest support. I can re-enable Google Nest by re-building WebRTC for the macCatalyst target. That's a very painful thought.
- Changes the full screen behavior: all of the other cameras are paused while viewing one camera in full screen. This change feels appropriate because with the switch-to-high-res feature, we might be increasing the load when we switch to full screen.
Created: 3 weeks ago
Updated: 3 days ago
Author: Curtis Jones
Topics: Release Notes
Streamie provides a best-in-class user experience on your iPhone, iPad, Apple TV and Apple Silicon Mac, with an intuitive user interface that makes it simple to discover, stream, record, monitor and share your HomeKit, Google Nest, Ubiquiti UniFi Protect and ONVIF-compatible IP and RTSP cameras. Streamie keeps you informed with motion event notifications and it works with most cameras using its advanced audio and video codec support. You can watch your cameras from anywhere, record 24/7 to your private NAS, remotely manage multiple locations, device permissions and seamlessly synchronize settings across your devices; configure Hubitat smart home automations, live stream to YouTube and rely on the in-app technical support system when you need help -- and you can also reach us by phone. Download Streamie today for all of your CCTV needs.