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)Triggered if the local video is encoded by a codec different from the one 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 is triggered
- The video is not sending for some reasons. In this case sendCodec is 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)Triggered if a network-based media latency is detected in a call. The network-based media latency is calculated based on rtt (round trip time) and jitter buffer. The latency refers to the time it takes a voice/video packet to reach its destination. A 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)Triggered if ICE connection is switched to the "disconnected" state during a 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)Triggered if the video resolution sent to an endpoint is lower than a captured video resolution. As a result it affects the remote video quality on the remote participant side, but does not affect the quality of the 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 
onNoAudioReceive
void
 onNoAudioReceive( call,  level,  audioStream,  endpoint)Triggered if no audio is received on a 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 receiving is detected on several remote audio streams, the event is triggered for each of the remote audio streams with the issue.
If the issue level is QualityIssueLevel.CRITICAL, the event is not triggered with the level QualityIssueLevel.NONE in cases:
- A (conference) call ended
- The endpoint left a conference call - - IEndpointListener.onEndpointRemoved(IEndpoint) is triggered
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)Triggered 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 has not been 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)Triggered if no video is received on a 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 receiving is detected on several remote video streams, the event is triggered for each of the remote video streams with the issue.
If the issue level is QualityIssueLevel.CRITICAL, the event is not triggered with the level QualityIssueLevel.NONE in cases:
- A (conference) call ended
- The remote video stream has been removed - IEndpointListener.onRemoteVideoStreamRemoved(IEndpoint, IRemoteVideoStream) is triggered.
- The endpoint left the conference call - IEndpointListener.onEndpointRemoved(IEndpoint) is triggered
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 has been 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)Triggered on packet loss detection. Packet loss can lead to missing of entire sentences, pauses in the middle of a conversation or robotic voice during a 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