IQualityIssueListener
Interface to monitor issues that affect call quality during a call. Use the ICall.setQualityIssueListener(IQualityIssueListener) API to subscribe to the following events.
Quality issues are detected only if a call is connected. If a call is reconnecting, all previously detected issues (if any) are reset, their issue level is changed to QualityIssueLevel.NONE
Methods
onCodecMismatch
void
onCodecMismatch( call, level, String
sendCodec)
Invoked if local video is encoded by a codec different from specified in ClientConfig.preferredVideoCodec or CallSettings.preferredVideoCodec
Issue level is QualityIssueLevel.CRITICAL if video is not sent, QualityIssueLevel.MAJOR in case of codec mismatch or QualityIssueLevel.NONE if the issue is not detected.
Possible reasons:
- The device does not support a selected codec. For example, if H264 is specified and the device does not support this hardware codec, the issue will be triggered
- The video is not sending for some reasons. In this case sendCodec will be null
- Different codecs are specified in the call endpoints
Parameters
call:
Call the issue belongs to
level:
Issue level
sendCodec:
String
Codec that is currently used or null if the video is not sent
Returns
type:
void
onHighMediaLatency
void
onHighMediaLatency( call, level, double
latency)
Invoked if network-based media latency is detected in the call. Network-based media latency is calculated based on rtt (round trip time) and jitter buffer. Latency refers to the time it takes a voice/video packet to reach its destination. Sufficient latency causes call participants to speak over the top of each other.
Issue level may vary during the call.
Possible reasons:
- Network congestion/delays
- Lack of bandwidth
Parameters
call:
Call the issue belongs to
level:
Issue level
latency:
double
Network-based latency measured in milliseconds at the moment the issue triggered.
Returns
type:
void
onIceDisconnected
void
onIceDisconnected( call, level)
Invoked if ICE connection is switched to the "disconnected" state during the call.
Issue level is always QualityIssueLevel.CRITICAL, because there is no media in the call until the issue is resolved.
Event may be triggered intermittently and be resolved just as spontaneously on less reliable networks, or during temporary disconnections.
Possible reasons:
- Network issues
Parameters
call:
Call the issue belongs to
level:
Issue level
Returns
type:
void
onLocalVideoDegradation
void
onLocalVideoDegradation( call, level, int
targetWidth, int
targetHeight, int
actualWidth, int
actualHeight)
Invoked if the video resolution sent to the endpoint is lower than a captured video resolution. As a result it affects remote video quality on the remote participant side, but do not affect the quality of local video preview on the android application.
The issue level may vary during the call.
Possible reasons:
- High CPU load during the video call
- Network issues such as poor internet connection or low bandwidth
Parameters
call:
Call the issue belongs to
level:
Issue level
targetWidth:
int
Captured frame width
targetHeight:
int
Captured frame height
actualWidth:
int
Sent frame width
actualHeight:
int
Sent frame height
Returns
type:
void
onLowBandwidth
void
onLowBandwidth( call, level, double
targetBitrate, double
actualBitrate)
DEPRECATED
Invoked if current bitrate is insufficient for sending video with current resolution.
Issue level may vary during the call. SDK may report QualityIssueLevel.MAJOR or QualityIssueLevel.MINOR while detecting network capabilities right after the call start.
Target bitrate depends on the sent video frame resolution. If the resolution of video frames sent is changed, target bitrate can also be changed (increased or degraded).
It is not recommended to change the resolution or other video call parameters once the issue is detected; in such case, SDK tries to adapt to the current congestion automatically. Only if the issue level is constantly QualityIssueLevel.MAJOR or QualityIssueLevel.CRITICAL, you can change the video call parameters.
Issue may be triggered and constantly report QualityIssueLevel.MAJOR or QualityIssueLevel.CRITICAL if the application is running in the background.
Possible reasons:
- Network issues
- Background state of an application
Parameters
call:
Call the issue belongs to
level:
Issue level
targetBitrate:
double
Bitrate required to send video with current resolution with a good quality. Measured in bits per second.
actualBitrate:
double
Actual bitrate. Measured in bits per second.
Returns
type:
void
onNoAudioReceive
void
onNoAudioReceive( call, level, audioStream, endpoint)
Invoked if no audio is received on the remote audio stream.
Issue level can be only QualityIssueLevel.CRITICAL if the issue is detected or QualityIssueLevel.NONE if the issue is not detected or resolved.
If no audio receive is detected on several remote audio streams, the event will be invoked for each of the remote audio streams with the issue.
If the issue level is QualityIssueLevel.CRITICAL, the event will not be invoked with the level QualityIssueLevel.NONE in cases:
- The (conference) call ended
- The endpoint left the conference call - - IEndpointListener.onEndpointRemoved(IEndpoint) is invoked
The issue is not detected for the following cases:
- The endpoint put the call on hold via ICall.hold(boolean, ICallCompletionHandler)
- The endpoint stopped sending audio during a call via ICall.sendAudio(boolean)
Possible reasons:
- Poor internet connection on the client or the endpoint
- Connection lost on the endpoint
Parameters
call:
Call the issue belongs to
level:
Issue level
audioStream:
Remote audio stream the issue occurred on
endpoint:
Endpoint the audio stream belongs to
Returns
type:
void
onNoAudioSignal
void
onNoAudioSignal( call, level)
Invoked if no audio is captured by the microphone.
Issue level can be only QualityIssueLevel.CRITICAL if the issue is detected or QualityIssueLevel.NONE if the issue is not detected or resolved.
Depending on the device manufacturer, the issue may be occasionally reported in case of pause in the conversation.
Possible reasons:
- Application or other library mutes the microphone via the setMicrophoneMute android sdk API
- Application is running in the background for more than 1 minute and foreground service was not started. Only Android 9+ applications are sensitive.
Parameters
call:
Call the issue belongs to
level:
Issue level
Returns
type:
void
onNoVideoReceive
void
onNoVideoReceive( call, level, videoStream, endpoint)
Invoked if no video is received on the remote video stream.
Issue level can be only QualityIssueLevel.CRITICAL if the issue is detected or QualityIssueLevel.NONE if the issue is not detected or resolved.
If no video receive is detected on several remote video streams, the event will be invoked for each of the remote video streams with the issue.
If the issue level is QualityIssueLevel.CRITICAL, the event will not be invoked with the level QualityIssueLevel.NONE in cases:
- The (conference) call ended
- The remote video stream was removed - IEndpointListener.onRemoteVideoStreamRemoved(IEndpoint, IRemoteVideoStream) is invoked.
- The endpoint left the conference call - IEndpointListener.onEndpointRemoved(IEndpoint) is invoked
The issue is not detected for the following cases:
- The endpoint put the call on hold via ICall.hold(boolean, ICallCompletionHandler)
- The endpoint stopped sending video during the call via ICall.sendVideo(boolean, ICallCompletionHandler)
- Video receiving was stopped on the remote video stream via IRemoteVideoStream.stopReceiving(ICallCompletionHandler).
Possible reasons:
- Poor internet connection on the client or the endpoint
- Connection lost on the endpoint
- The endpoint's application has been moved to the background state on an iOS device
Parameters
call:
Call the issue belongs to
level:
Issue level
videoStream:
Remote video stream the issue occurred on
endpoint:
Endpoint the audio stream belongs to
Returns
type:
void
onPacketLoss
void
onPacketLoss( call, level, double
packetLoss)
Invoked on packet loss detection. Packet loss can lead to missing of entire sentences, awkward pauses in the middle of a conversation or robotic voice during the call.
Issue level may vary during the call.
Possible reasons:
- Network congestion
- Bad hardware (parts of the network infrastructure)
Parameters
call:
Call the issue belongs to
level:
Issue level
packetLoss:
double
Average packet loss for 2.5 seconds.
Returns
type:
void