Changelog: Video SDK - macOS - 2.6.0

Released: 2026-06-24 Updated: 2026-07-01

Visit Changelog

Summary: Breaking changes include typo corrections in ZMVideoSDKSessionASVStatisticInfo property names, external video source format configuration moved to ZoomVideoSDKSessionContext, and audio configuration API renaming for consistency (e.g., isMicOriginalInputEnable to isMicOriginalInputEnabled). Adds a pre-connection flow to accelerate session joins, machine-answer detection for PSTN call-outs, and comprehensive audio QoS statistics including jitter buffer metrics, concealment data, and audio energy measurements. Additional improvements include user failover status tracking, expanded command channel payload limits (now 1024 bytes), sharing window state change notifications, subsession status callbacks, second camera sharing support, and removal of the xmpp_framework.framework dependency.

Breaking Changes

  • Fix typos in the property names of ZMVideoSDKSessionASVStatisticInfo.

    • Rename sendFrameHeigh to sendFrameHeight.
    • Rename sendJitte to sendJitter.
    • Rename recvFrameHeigh to recvFrameHeight.
    • Rename recvJitte to recvJitter.
  • Support the I420Limited and I420Full color ranges for the external video source.

    • Add a new property externalVideoSourceDataFormat to ZoomVideoSDKSessionContext

      @property (nonatomic, assign) ZoomVideoSDKFrameDataFormat externalVideoSourceDataFormat;
      
    • Remove the last parameter format from sendVideoFrame

      - (void)sendVideoFrame:(char *)frameBuffer width:(NSUInteger)width height:(NSUInteger)height dataLength:(NSUInteger)dataLength rotation:(ZoomVideoSDKVideoRawDataRotation)rotation format:(ZoomVideoSDKFrameDataFormat)format;
      change to:
      - (void)sendVideoFrame:(char *)frameBuffer width:(NSUInteger)width height:(NSUInteger)height dataLength:(NSUInteger)dataLength rotation:(ZoomVideoSDKVideoRawDataRotation)rotation;
      
  • Rename several audio configuration APIs for naming consistency.

    - (ZMVideoSDKErrors)isMicOriginalInputEnable:(BOOL*)bEnable;
    change to:
    - (ZMVideoSDKErrors)isMicOriginalInputEnabled:(BOOL*)bEnable;
    
    - (ZMVideoSDKErrors)isHighFidelityMusicModeEnable:(BOOL*)bEnable;
    change to:
    - (ZMVideoSDKErrors)isHighFidelityMusicModeEnabled:(BOOL*)bEnable;
    
    - (ZMVideoSDKErrors)isEchoCancellationEnable:(BOOL*)bEnable;
    change to:
    - (ZMVideoSDKErrors)isEchoCancellationEnabled:(BOOL*)bEnable;
    
    - (ZMVideoSDKErrors)isStereoAudioEnable:(BOOL*)bEnable;
    change to:
    - (ZMVideoSDKErrors)isStereoAudioEnabled:(BOOL*)bEnable;
    
    - (BOOL)isFileTransferEnable;
    change to:
    - (BOOL)isFileTransferEnabled;
    
  • Joining or leaving a subsession now triggers the onSubSessionStatusChanged:subSessionKit: and onSessionLeave: callbacks in ZMVideoSDKDelegate (ZMVideoSDKDelegate.h).

    • New callbacks in ZMVideoSDKDelegate

      @protocol ZMVideoSDKDelegate <NSObject>
      - (void)onSubSessionStatusChanged:(ZMVideoSDKSubSessionStatus)status subSessionKit:(NSArray<ZMVideoSDKSubSessionKit*>* _Nullable)subSessionKitList;
      - (void)onSessionLeave:(ZMVideoSDKSessionLeaveReason)reason;
      @end
      
    • New enumeration values in ZMVideoSDKSessionLeaveReason (ZMVideoSDKDef.h)

      typedef enum
      {
          /** User leaves current session because joining a subsession. */
          ZMVideoSDKSessionLeaveReason_JoinSubsession,
          /** User leaves current session because returning to the main session. */
          ZMVideoSDKSessionLeaveReason_ReturnToMainSession
      }ZMVideoSDKSessionLeaveReason;
      

Added

  • Add machine-answer detection for PSTN call-out, so the host can tell whether a call was answered by a person or forwarded to voicemail.

    • New enum value in ZMPhoneStatus (ZMVideoSDKDef.h)

      typedef enum
      {
          // ...
          /** Call was answered by machine. */
          ZMPhoneStatus_AnsweredByMachine,
      }ZMPhoneStatus;
      
    • New property in ZMVideoSDKInvitePhoneUserInfo (ZMVideoSDKPhoneHelper.h)

      @property (nonatomic, assign) BOOL bDetectMachine;
      
  • Add a pre-connection (two-step join) flow to speed up the actual session join.

    • New interfaces in ZMVideoSDK

      - (ZMVideoSDKSession* _Nullable)prepareJoin:(ZMVideoSDKSessionContext*)params preJoinParam:(ZMVideoSDKPreJoinParam*)preJoinParam;
      - (ZMVideoSDKErrors)commitJoin;
      - (ZMVideoSDKErrors)cancelPrepareJoin;
      
    • New class ZMVideoSDKPreJoinParam in ZMVideoSDK.h

      @interface ZMVideoSDKPreJoinParam : NSObject
      @property (nonatomic, assign) NSUInteger timeoutInterval;
      @end
      
    • New error codes in ZMVideoSDKErrors (ZMVideoSDKDef.h)

      ZMVideoSDKErrors_Session_PreJoin_Not_In_Flow,
      ZMVideoSDKErrors_Session_PreJoin_Already_Commit,
      ZMVideoSDKErrors_Session_PreJoin_Timeout,
      
  • Support user failover status change.

    • New callback in ZMVideoSDKDelegate (ZMVideoSDKDelegate.h)

      - (void)onUserFailoverStatusChanged:(ZoomVideoSDKUser * _Nullable)user inFailover:(BOOL)inFailover;
      
    • New interface in ZMVideoSDKUser

      - (BOOL)isInFailover;
      
  • Add a callback to notify when the window state changes during a sharing process.

    • New callback in ZMVideoSDKDelegate (ZMVideoSDKDelegate.h)

      - (void)onSharingProcessWindowsStateChanged:(BOOL)isAnyWindowSharing shareHelper:(ZMVideoSDKShareHelper* _Nonnull)shareHelper user:(ZMVideoSDKUser *)user shareAction:(ZMVideoSDKShareAction* _Nullable)shareAction;
      
  • Provide audio QoS statistics data.

    • New property in ZMVideoSDKQOSSendStatistics (ZMVideoSDKUserHelper.h)

      /** @brief Gets the total bytes of RTP headers (and padding) sent (send only). */
      @property (nonatomic, assign, readonly) NSUInteger headerBytesSent;
      
    • New properties in ZMVideoSDKQOSRecvStatistics (ZMVideoSDKUserHelper.h)

      /** @brief Gets the total bytes of RTP headers (and padding) received (receive only). */
      @property (nonatomic, assign, readonly) unsigned long long headerBytesReceived;
      /** @brief Gets the non-FEC packets discarded by NetEQ (receive only, audio only). */
      @property (nonatomic, assign, readonly) NSUInteger packetsDiscarded;
      /** @brief Gets the total number of FEC packets received (receive only, audio only). */
      @property (nonatomic, assign, readonly) NSUInteger fecPacketsReceived;
      /** @brief Gets the FEC packets discarded by NetEQ (receive only, audio only). */
      @property (nonatomic, assign, readonly) NSUInteger fecPacketsDiscarded;
      /** @brief Gets the accumulated current target delay of the jitter buffer, in seconds (receive only, audio only). */
      @property (nonatomic, assign, readonly) double jitterBufferTargetDelay;
      /** @brief Gets the accumulated minimum achievable jitter buffer delay, in seconds (receive only, audio only). */
      @property (nonatomic, assign, readonly) double jitterBufferMinimumDelay;
      /** @brief Gets the total audio samples generated by NetEQ (receive only, audio only). */
      @property (nonatomic, assign, readonly) unsigned long long totalSamplesReceived;
      /** @brief Gets the samples produced by concealment instead of real decode (receive only, audio only). */
      @property (nonatomic, assign, readonly) unsigned long long concealedSamples;
      /** @brief Gets the subset of concealedSamples that are silent (receive only, audio only). */
      @property (nonatomic, assign, readonly) unsigned long long silentConcealedSamples;
      /** @brief Gets the number of concealment events (receive only, audio only). */
      @property (nonatomic, assign, readonly) unsigned long long concealmentEvents;
      /** @brief Gets the samples inserted to slow down playout, i.e. deceleration (receive only, audio only). */
      @property (nonatomic, assign, readonly) unsigned long long insertedSamplesForDeceleration;
      /** @brief Gets the samples removed to speed up playout, i.e. acceleration (receive only, audio only). */
      @property (nonatomic, assign, readonly) unsigned long long removedSamplesForAcceleration;
      /** @brief Gets the total duration of all audio samples received, in seconds (receive only, audio only). */
      @property (nonatomic, assign, readonly) double totalSamplesDuration;
      /** @brief Gets the most recent audio level of the received stream, range [0.0, 1.0] (receive only, audio only). */
      @property (nonatomic, assign, readonly) double audioLevel;
      /** @brief Gets the accumulated audio energy of the received stream (receive only, audio only). */
      @property (nonatomic, assign, readonly) double totalAudioEnergy;
      

Changed

  • Support sharing a second camera while another camera is being shared.
  • Enhance and optimize the AI-friendly documentation.
  • Support resuming and pausing preprocess share.
  • Increase the command channel payload size limit to 1024.
  • Remove the xmpp_framework.framework library.

Fixed

  • Fixed an issue where the application’s main menu could not be shared when sharing an application with the capture mode set to auto.