# How to programmatically detect video track qualities

This article describes how you can use the API to detect video track qualities.

The VideoTrack API, which is a sub-API of the MediaTrack API, can be used to implement this functionality. Implementing this functionality is a common use-case for developers who want to build their own UI to visualize the available video track qualities.

## SDKs

| Web SDK | Android SDK | iOS SDK | tvOS SDK | Android TV SDK | Chromecast SDK |
| ------- | ----------- | ------- | -------- | -------------- | -------------- |
| Yes     | Yes         | Yes     | Yes      | Yes            | Yes            |

## Code examples

The code examples below how to implement the detection of video track qualities across SDK.

##### Web SDK

The Web SDK leverages the [MediaTrack API](https://docs-preview.optiview.dolby.com/pr-863/theoplayer/v10/api-reference/web/interfaces/MediaTrack).

```js
function handleAddTrackEvent(addTrackEvent) {
  var videoTrackQualities = addTrackEvent.track.qualities;
}
player.videoTracks.addEventListener('addtrack', handleAddTrackEvent);
```

##### Android (TV) SDK

The Android SDK leverages the [MediaTrack API](https://docs-preview.optiview.dolby.com/pr-863/theoplayer/v10/api-reference/android/com/theoplayer/android/api/player/track/mediatrack/MediaTrackList).

```java
EventListener<AddTrackEvent> handleAddTrackEvent = new EventListener<AddTrackEvent>() {
    @Override
    public void handleEvent(AddTrackEvent addTrackEvent) {
        QualityList videoTrackQualities = addTrackEvent.getTrack().getQualities();
    }
};
tpv.getPlayer().getVideoTracks().addEventListener(VideoTrackListEventTypes.ADDTRACK, handleAddTrackEvent);
```

##### iOS (/tvOS) SDK

```swift
player.videoTracks.addEventListener(type: VideoTrackListEventTypes.ADD_TRACK, listener: { addTrackEvent in
    guard let videoTrack = addTrackEvent.track as? VideoTrack else { return }
    for i in 0..<videoTrack.qualities.count {
        let quality = videoTrack.qualities[i]
        var msg = "Quality added: bandwidth = \(quality.bandwidth)"
        if let videoQuality = quality as? VideoQuality {
            msg.append(", width = \(videoQuality.width), height = \(videoQuality.height)")
        }
        print(msg)
    }
})
```

## Remarks

* A related article on building a Chromeless UI is located at [How to build a Chromeless UI](https://docs-preview.optiview.dolby.com/pr-863/theoplayer/v10/how-to-guides/ui/how-to-build-chromeless-ui.md).

## Related articles

* [How to programmatically detect audio tracks](https://docs-preview.optiview.dolby.com/pr-863/theoplayer/v10/how-to-guides/mediatrack/how-to-detect-audio-tracks.md)
* [How to programmatically detect video track quality changes](https://docs-preview.optiview.dolby.com/pr-863/theoplayer/v10/how-to-guides/mediatrack/how-to-detect-video-track-quality-changes.md)
* [How to programmatically enable or disable audio tracks](https://docs-preview.optiview.dolby.com/pr-863/theoplayer/v10/how-to-guides/mediatrack/how-to-enable-disable-audio-tracks.md)
* [How to programmatically select a video track quality](https://docs-preview.optiview.dolby.com/pr-863/theoplayer/v10/how-to-guides/mediatrack/how-to-select-video-track-quality.md)
