Show / Hide Table of Contents

    Class VideoSocket

    Provides Send and Receive I/O access to a video stream.

    Inheritance
    Object
    VideoSocket
    Implements
    IVideoSocket
    IDisposable
    Inherited Members
    Object.ToString()
    Object.Equals(Object)
    Object.Equals(Object, Object)
    Object.ReferenceEquals(Object, Object)
    Object.GetHashCode()
    Object.GetType()
    Object.MemberwiseClone()
    Namespace: Microsoft.Skype.Bots.Media
    Assembly: Microsoft.Skype.Bots.Media.dll
    Syntax
    public sealed class VideoSocket : IVideoSocket, IDisposable, IInternalVideoSocket, IInternalSocket

    Constructors

    VideoSocket(VideoSocketSettings)

    Initializes a new VideoSocket object.

    Declaration
    public VideoSocket(VideoSocketSettings settings)
    Parameters
    Type Name Description
    VideoSocketSettings settings

    Configuration settings for the VideoSocket

    Properties

    MediaType

    MediaType of the video socket. This could be Video or Vbss. The MediaType is set after the socket is passed to the CreateMediaConfiguration API. It may also be set via the VideoSocketSettings during socket creation.

    Declaration
    public MediaType MediaType { get; }
    Property Value
    Type Description
    MediaType

    ReceiveColorFormat

    VideoColorFormat to receive

    Declaration
    public VideoColorFormat ReceiveColorFormat { get; }
    Property Value
    Type Description
    VideoColorFormat

    SocketId

    The 0-based ID of the socket. This socket ID is useful to identify a socket in a multiview (ie. more than 1 video socket) call. The same ID is used in the event args of the VideoMediaReceived and VideoSendStatusChanged events that this class may raise. The socket ID property will be present in both single view and multiview cases. The ID maps to the order in which the video sockets are provided to the CreateMediaConfiguration API. Eg., if the collection of IVideoSocket objects in the CreateMediaConfiguration API contains {socketA, socketB, socketC}, the sockets will have the ID mapping of: 0 for socketA, 1 for socketB and 2 for socketC. Before the call to CreateMediaConfiguration, the SocketId has a value of -1.

    Declaration
    public int SocketId { get; }
    Property Value
    Type Description
    Int32

    Methods

    Dispose()

    Disposes the object.

    Declaration
    public void Dispose()

    GetQualityOfExperienceData()

    Get the Quality of Experience (QoE) data for the audio socket.

    Declaration
    public VideoQualityOfExperienceData GetQualityOfExperienceData()
    Returns
    Type Description
    VideoQualityOfExperienceData
    Remarks

    The bot should fetch the QoE data no more than once every 30 seconds. To get accurate metrics, the bot should let media flow for at least 30 seconds before fetching the QoE data.

    RequestKeyFrame()

    Allows the application to request for key frame. Only valid for sockets with the ReceiveColorFormat as H264

    Declaration
    public void RequestKeyFrame()

    Send(VideoMediaBuffer)

    Sends a frame of video media.

    Declaration
    public void Send(VideoMediaBuffer buffer)
    Parameters
    Type Name Description
    VideoMediaBuffer buffer

    VideoMediaBuffer containing the frame of video media to send.

    Remarks

    The application must create a concrete class which derives from the VideoMediaBuffer abstract class. The buffer object passed to the Send method is still potentially in-use after the method returns to the caller. The application must not free the buffer's data until the the buffer object's Dispose() method is invoked by the Media Platform.

    The application should be sending up to 30 video frames per second.

    The VideoSocket must be enabled to send media via the VideoSocketSettings.StreamDirections property.

    SetReceiveBandwidthLimit(UInt32)

    Sets the bandwidth limit on the receive stream of the VideoSocket. This is only supported if the socket supports receiving H264 video format. It is recommended to wait for the VideoReceiveStatusChanged event with MediaReceiveStatus Active state during the initial call setup before applying the receive bandwidth limit on the socket. Bandwidth range (in bits per second) for various resolutions and frame rates per media type:

    Media type: Video

    1000000 - 4000000 1080p at 30 fps

    550000 - 2500000 720p at 30 fps

    375000 - 1500000 540p at 30 fps

    200000 - 800000 360p at 30 fps

    150000 - 250000 360p at 15 fps

    120000 - 220000 240p at 15 fps

    60000 - 200000 180p at 15 fps

    20000 - 100000 180p at 7.5 fps

    10000 - 25000 180p at 3.75 fps

    1000 - 12500 180p at 1.875 fps

    Media type: Vbss

    Resolution: 1080p

    2000000 - 4000000 at 30 fps

    600000 - 3000000 at 15 fps

    300000 - 700000 at 7.5 fps

    150000 - 350000 at 3.75 fps

    70000 - 200000 at 1.875 fps

    Declaration
    public void SetReceiveBandwidthLimit(uint bitsPerSecond)
    Parameters
    Type Name Description
    UInt32 bitsPerSecond

    The receive bitrate

    SetSendBandwidthLimit(UInt32)

    Sets the bandwidth limit on the send stream of the VideoSocket. This is only supported if the socket supports sending H264 video formats. It is recommended to wait for the VideoSendStatusChanged event with MediaSendStatus Active state during the initial call setup before applying the send bandwidth limit on the socket.

    Bandwidth range (in bits per second) for various resolutions and frame rates per media type:

    Media type: Video

    1000000 - 4000000 1080p at 30 fps

    550000 - 2500000 720p at 30 fps

    375000 - 1500000 540p at 30 fps

    200000 - 800000 360p at 30 fps

    150000 - 250000 360p at 15 fps

    120000 - 220000 240p at 15 fps

    60000 - 200000 180p at 15 fps

    20000 - 100000 180p at 7.5 fps

    10000 - 25000 180p at 3.75 fps

    1000 - 12500 180p at 1.875 fps

    Media type: Vbss

    Resolution: 1080p

    2000000 - 4000000 at 30 fps

    600000 - 3000000 at 15 fps

    300000 - 700000 at 7.5 fps

    150000 - 350000 at 3.75 fps

    70000 - 200000 at 1.875 fps

    Declaration
    public void SetSendBandwidthLimit(uint bitsPerSecond)
    Parameters
    Type Name Description
    UInt32 bitsPerSecond

    The send bitrate

    Subscribe(VideoResolution)

    Request to receive the video of the peer in a 1:1 call. No need to specify a MediaSourceId. The bot cannot subscribe to a video source unless the VideoReceiveStatusChanged event is raised indicating the VideoSocket's MediaReceiveStatus is Active.

    Declaration
    public void Subscribe(VideoResolution preferredVideoResolution)
    Parameters
    Type Name Description
    VideoResolution preferredVideoResolution

    The requested video resolution. The received video frames should have this resolution if the bandwidth constraints and sender capabilities allow, however the bot may receive video frames at a resolution lower than requested.

    Subscribe(VideoResolution, UInt32)

    Request to receive the video source of a participant in a meeting or group call. The video source must be identified by its MediaSourceId available from the roster. The bot cannot subscribe to a video source unless the VideoReceiveStatusChanged event is raised indicating the VideoSocket's MediaReceiveStatus is Active.

    Declaration
    public void Subscribe(VideoResolution preferredVideoResolution, uint MediaSourceId)
    Parameters
    Type Name Description
    VideoResolution preferredVideoResolution

    The requested video resolution. The received video frames should have this resolution if the bandwidth constraints and sender capabilities allow, however the bot may receive video frames at a resolution lower than requested.

    UInt32 MediaSourceId

    Media source identifier of the video source to be received

    Exceptions
    Type Condition
    ObjectDisposedException

    Thrown if the VideoSocket is disposed.

    InvalidOperationException

    Thrown if the subscription is invalid.

    SkypeMediaException

    Thrown if an internal media failure occurs.

    Unsubscribe()

    Stops the current video subscription on the VideoSocket. The VideoMediaReceived events will stop raising video buffers.

    Declaration
    public void Unsubscribe()

    UpdateVideoSendCapability(VideoSendCapability)

    Allows the application to update dynamically the send capability (such as SupportedSendVideoFormats or MaxConcurrentSendStreams) of the video socket. The purpose of this API is to allow the application to communicate changes in VideoSocket's send capability to the platform during the call.

    Declaration
    public void UpdateVideoSendCapability(VideoSendCapability capability)
    Parameters
    Type Name Description
    VideoSendCapability capability

    Events

    MediaStreamFailure

    This event is raised if there is a network connection failure with the peer. To recover, the bot will need to start a new call or rejoin the meeting.

    Declaration
    public event EventHandler<MediaStreamFailureEventArgs> MediaStreamFailure
    Event Type
    Type Description
    EventHandler<MediaStreamFailureEventArgs>
    Remarks

    Note: this event can be raised even if there is no active video subscription; i.e., the VideoSocket is "idle" and not receiving media.

    MediaStreamQualityChanged

    The event is raised if a media stream quality change was detected

    Declaration
    public event EventHandler<VideoMediaStreamQualityChangedEventArgs> MediaStreamQualityChanged
    Event Type
    Type Description
    EventHandler<VideoMediaStreamQualityChangedEventArgs>

    VideoKeyFrameNeeded

    If the application has configured the VideoSocket to receive encoded media, this event is raised each time a key frame is needed. Events are serialized, so only one event at a time is raised to the app.

    Declaration
    public event EventHandler<VideoKeyFrameNeededEventArgs> VideoKeyFrameNeeded
    Event Type
    Type Description
    EventHandler<VideoKeyFrameNeededEventArgs>

    VideoMediaReceived

    If the application has configured the VideoSocket to receive media, this event is raised each time a frame of video media is received. Once the application has consumed the buffer, it must call the buffer's Dispose() method.

    Declaration
    public event EventHandler<VideoMediaReceivedEventArgs> VideoMediaReceived
    Event Type
    Type Description
    EventHandler<VideoMediaReceivedEventArgs>
    Remarks

    The incoming video frame rate is variable. The frame rate can vary between 1.875 frames per second (fps) up to 30 fps. The application must be able to receive up to 30 video buffers per second. Events are serialized, so only one event at a time is raised to the app. The event handler should return as quickly as possible; any time-consuming per-frame processing should be performed asynchronously from the event handler.

    VideoReceiveStatusChanged

    If the application has configured the VideoSocket to receive media, this event is raised to inform the application when it is ready to receive media. When the status is active the application can subscribe to a video source, when inactive video subscription won't be allowed

    Declaration
    public event EventHandler<VideoReceiveStatusChangedEventArgs> VideoReceiveStatusChanged
    Event Type
    Type Description
    EventHandler<VideoReceiveStatusChangedEventArgs>

    VideoSendStatusChanged

    If the application has configured the VideoSocket to send media, this event is raised to inform the application when it may begin sending media and when it should stop. The application cannot send media before receiving a VideoMediaSendStatusChanged event indicating the SendStatus is Active, such media will be discarded.

    Declaration
    public event EventHandler<VideoSendStatusChangedEventArgs> VideoSendStatusChanged
    Event Type
    Type Description
    EventHandler<VideoSendStatusChangedEventArgs>

    Implements

    IVideoSocket
    System.IDisposable
    Back to top Copyright (c) Microsoft Corporation. All rights reserved.