Changelog: Video SDK - Linux - 2.5.5

Released: 2026-03-26 Updated: 2026-08-26

Visit Changelog

Summary: Adds detailed QoS statistics for Web SDK consistency, multi-language telephony “welcome” messages, and AI-friendly API documentation. It establishes Ubuntu 20 as the new minimum for Linux support. Additionally, a breaking change ensures that the cleanup function returns a specific error code when called during an active session.

Important notes

  • Starting from version 2.5.5, the Linux SDK only supports Ubuntu 20 (u20) and later.
  • AI-Friendly Documentation
    • This SDK release ships AI-friendly API documentation in a structured, machine-readable format to help developers and AI-assisted workflows discover and understand the Zoom Video SDK public APIs faster. For more information, see Using AI assistants with the Video SDK.

Breaking Changes

  • Add new error code for the cleanup function to return ZoomVideoSDKErrors_Cannot_Call_Cleanup_In_Session when it’s called during a session.
    • New enum in ZoomVideoSDKErrors.
    typedef enum
    {
      ......
      ZoomVideoSDKErrors_Cannot_Call_Cleanup_In_Session = 7700,
    }ZoomVideoSDKErrors;
    

Added

  • New user QoS statistics data to be consistent with web SDK.

    • Add new enum ZoomVideoSDKStatisticsDirection.
    typedef enum
    {
    	ZoomVideoSDKStatisticsDirection_Send = 0,
    	ZoomVideoSDKStatisticsDirection_Receive = 1,
    } ZoomVideoSDKStatisticsDirection;
    
    • Add new struct ZoomVideoSDKQOSStatistics.
    struct ZoomVideoSDKQOSStatistics
    {
    	/**
    	 * @brief Direction of statistics (send or receive).
    	 */
    	ZoomVideoSDKStatisticsDirection direction;
    	/**
    	 * @brief Timestamp of the statistics.
    	 */
    	unsigned int timestamp;
    	/**
    	 * @brief Name of the codec. Valid only during callback. For video/share: "h264", "av1". For audio: "silk", "opus", "pcm", "G722", "G729".
    	 */
    	const zchar_t* codecName;
    	/**
    	 * @brief Round-trip time in milliseconds.
    	 */
    	unsigned int rtt;
    	/**
    	 * @brief Jitter in milliseconds.
    	 */
    	unsigned int jitter;
    	/**
    	 * @brief Frame width (sent or received per direction).
    	 */
    	unsigned int width;
    	/**
    	 * @brief Frame height (sent or received per direction).
    	 */
    	unsigned int height;
    	/**
    	 * @brief Frame rate in FPS (sent or received per direction).
    	 */
    	unsigned int fps;
    	/**
    	 * @brief Bits per second.
    	 */
    	unsigned int bps;
    	/**
    	 * @brief Bits per frame. Same as bps for backward compatibility.
    	 * @deprecated Use ZoomVideoSDKQOSStatistics::bps instead.
    	 */
    	int bpf;
    	/**
    	 * @brief Total bytes transferred (sent or received per direction).
    	 */
    	unsigned int bytesTransferred;
    	/**
    	 * @brief Number of packets lost during transmission.
    	 */
    	unsigned int packetsLost;
    	/**
    	 * @brief Total number of packets transferred (sent or received per direction).
    	 */
    	unsigned int packetsTransferred;
    	/**
    	 * @brief Network quality level.
    	 */
    	ZoomVideoSDKNetworkStatus networkLevel;
    	/**
    	 * @brief Statistics type (Audio, Video, or Share).
    	 */
    	ZoomVideoSDKDataType statisticsType;
    	/**
    	 * @brief Average packet loss ratio in per thousand (e.g. 100 means 10%).
    	 */
    	unsigned int avg_loss;
    	/**
    	 * @brief Maximum packet loss ratio in per thousand (e.g. 100 means 10%).
    	 */
    	unsigned int max_loss;
    	/**
    	 * @brief Estimated bandwidth in bps.
    	 */
    	unsigned int bandwidth;
    
    	ZoomVideoSDKQOSStatistics()
    	{
    		reset();
    	}
    
    	void reset()
    	{
    		direction = ZoomVideoSDKStatisticsDirection_Send;
    		timestamp = 0;
    		codecName = nullptr;
    		rtt = 0;
    		jitter = 0;
    		width = 0;
    		height = 0;
    		fps = 0;
    		bps = 0;
    		bpf = 0;
    		bytesTransferred = 0;
    		packetsLost = 0;
    		packetsTransferred = 0;
    		networkLevel = ZoomVideoSDKNetwork_None;
    		statisticsType = ZoomVideoSDKDataType_Unknown;
    		avg_loss = 0;
    		max_loss = 0;
    		bandwidth = 0;
    	}
    };
    
    • Add new struct ZoomVideoSDKQOSSendStatistics.
    struct ZoomVideoSDKQOSSendStatistics : ZoomVideoSDKQOSStatistics
    {
    	/**
    	 * @brief Width of the input frame (send only).
    	 */
    	unsigned int frameWidthInput;
    	/**
    	 * @brief Height of the input frame (send only).
    	 */
    	unsigned int frameHeightInput;
    	/**
    	 * @brief Frame rate of input (send only).
    	 */
    	unsigned int frameRateInput;
    	/**
    	 * @brief Total bytes sent.
    	 */
    	unsigned int bytesSent;
    	/**
    	 * @brief Total number of packets sent.
    	 */
    	unsigned int packetsSent;
    	/**
    	 * @brief Total packet send delay in milliseconds (send only).
    	 */
    	unsigned int totalPacketSendDelay;
    	/**
    	 * @brief Total time spent encoding in milliseconds (send only).
    	 */
    	unsigned int totalEncodeTime;
    	/**
    	 * @brief Total number of frames encoded (send only).
    	 */
    	unsigned int framesEncoded;
    
    	ZoomVideoSDKQOSSendStatistics()
    	{
    		ZoomVideoSDKQOSStatistics::direction = ZoomVideoSDKStatisticsDirection_Send;
    		reset();
    	}
    
    	void reset()
    	{
    		ZoomVideoSDKQOSStatistics::reset();
    		direction = ZoomVideoSDKStatisticsDirection_Send;
    		frameWidthInput = 0;
    		frameHeightInput = 0;
    		frameRateInput = 0;
    		bytesSent = 0;
    		packetsSent = 0;
    		totalPacketSendDelay = 0;
    		totalEncodeTime = 0;
    		framesEncoded = 0;
    	}
    };
    
    • Add new struct ZoomVideoSDKQOSRecvStatistics.
    struct ZoomVideoSDKQOSRecvStatistics : ZoomVideoSDKQOSStatistics
    {
    	/**
    	 * @brief Total bytes received (receive only).
    	 */
    	unsigned int bytesReceived;
    	/**
    	 * @brief Total number of packets received (receive only).
    	 */
    	unsigned int packetsReceived;
    	/**
    	 * @brief Estimated playout timestamp (receive only).
    	 */
    	unsigned int estimatedPlayoutTimestamp;
    	/**
    	 * @brief Total time spent decoding in milliseconds (receive only).
    	 */
    	unsigned int totalDecodeTime;
    	/**
    	 * @brief Total number of frames decoded (receive only).
    	 */
    	unsigned int framesDecoded;
    	/**
    	 * @brief Jitter buffer delay in milliseconds (receive only).
    	 */
    	unsigned int jitterBufferDelay;
    	/**
    	 * @brief Number of samples emitted from jitter buffer (receive only).
    	 */
    	unsigned int jitterBufferEmittedCount;
    
    	ZoomVideoSDKQOSRecvStatistics()
    	{
    		ZoomVideoSDKQOSStatistics::direction = ZoomVideoSDKStatisticsDirection_Receive;
    		reset();
    	}
    
    	void reset()
    	{
    		ZoomVideoSDKQOSStatistics::reset();
    		direction = ZoomVideoSDKStatisticsDirection_Receive;
    		bytesReceived = 0;
    		packetsReceived = 0;
    		estimatedPlayoutTimestamp = 0;
    		totalDecodeTime = 0;
    		framesDecoded = 0;
    		jitterBufferDelay = 0;
    		jitterBufferEmittedCount = 0;
    	}
    };
    
    • Add new struct ZoomVideoSDKVideoStatisticInfo.
    struct ZoomVideoSDKVideoStatisticInfo : ZoomVideoSDKQOSStatistics
    {
    	/** @brief Gets the video network status. Same as \link ZoomVideoSDKQOSStatistics::networkLevel \endlink.
    	 *  @deprecated Use ZoomVideoSDKQOSStatistics::networkLevel instead. */
    	ZoomVideoSDKNetworkStatus videoNetworkStatus;
    
    	ZoomVideoSDKVideoStatisticInfo()
    	{
    		reset();
    	}
    
    	void reset()
    	{
    		ZoomVideoSDKQOSStatistics::reset();
    		videoNetworkStatus = ZoomVideoSDKNetwork_None;
    	}
    };
    
    • Add new struct ZoomVideoSDKShareStatisticInfo.
    struct ZoomVideoSDKShareStatisticInfo : ZoomVideoSDKQOSStatistics
    {
    	/** @brief Gets the share network status. Same as \link ZoomVideoSDKQOSStatistics::networkLevel \endlink.
    	 *  @deprecated Use ZoomVideoSDKQOSStatistics::networkLevel instead. */
    	ZoomVideoSDKNetworkStatus shareNetworkStatus;
    
    	ZoomVideoSDKShareStatisticInfo()
    	{
    		reset();
    	}
    
    	void reset()
    	{
            ZoomVideoSDKQOSStatistics::reset();
    		shareNetworkStatus = ZoomVideoSDKNetwork_None;
    	}
    };
    
    • Add new callback in IZoomVideoSDKDelegate.
    virtual void onQOSStatisticsReceived(const ZoomVideoSDKQOSStatistics& statistics, IZoomVideoSDKUser* pUser) = 0;
    
  • Add support for multiple languages versions of telephony “welcome” message.

    • Add new class IZoomVideoSDKPhoneWelcomeMessageInfo.

      class IZoomVideoSDKPhoneWelcomeMessageInfo
      {
      public:
          virtual ~IZoomVideoSDKPhoneWelcomeMessageInfo() {}
      
          virtual const zchar_t* getLanguageCode() = 0;
          virtual const zchar_t* getLanguageName() = 0;
          virtual const zchar_t* getVariantId() = 0;
      };
      
    • Add new value in struct InvitePhoneUserInfo.

      struct InvitePhoneUser
      {
      public:
          ...
          /** Optional: The welcome message's language code, such as "en-US", "zh-CN". */
          const zchar_t* languageCode;
          /** Optional: The welcome message's variant ID (e.g., "variant_001"). */
          const zchar_t* variantId;
      };
      
    • Add new interface in class IZoomVideoSDKPhoneHelper.

      virtual IVideoSDKVector* getPhoneWelcomeMessageInfoList() = 0;