From 72bb14b072712d847db89dfe63a9e1182c595654 Mon Sep 17 00:00:00 2001 From: sheershtehri7 Date: Sun, 22 Mar 2026 13:42:05 +0530 Subject: [PATCH] Add setBandwidthLimit to VideoPlayerPlatform Adds a new setBandwidthLimit(int playerId, int maxBandwidthBps) method to VideoPlayerPlatform for adaptive bitrate streaming control. This method allows platform implementations to limit the maximum video bitrate the player selects during HLS/DASH playback. Part of flutter/flutter#183941 --- .../CHANGELOG.md | 3 +- .../lib/video_player_platform_interface.dart | 39 +++++++++++++++++++ .../pubspec.yaml | 2 +- .../video_player_platform_interface_test.dart | 17 ++++++++ 4 files changed, 59 insertions(+), 2 deletions(-) diff --git a/packages/video_player/video_player_platform_interface/CHANGELOG.md b/packages/video_player/video_player_platform_interface/CHANGELOG.md index 4b44b050047a..19cab4d95813 100644 --- a/packages/video_player/video_player_platform_interface/CHANGELOG.md +++ b/packages/video_player/video_player_platform_interface/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 6.7.0 +* Adds `setBandwidthLimit` and `isBandwidthLimitSupportAvailable` methods for adaptive bitrate streaming control. * Updates minimum supported SDK version to Flutter 3.35/Dart 3.9. ## 6.6.0 diff --git a/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart b/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart index 1cec5f42c218..6ff574d72037 100644 --- a/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart +++ b/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart @@ -153,6 +153,45 @@ abstract class VideoPlayerPlatform extends PlatformInterface { bool isAudioTrackSupportAvailable() { return false; } + + /// Sets the maximum bandwidth limit for adaptive bitrate streaming. + /// + /// This method controls which HLS/DASH variant streams are selected by + /// limiting the maximum video bitrate the player will choose. + /// + /// [playerId] identifies the video player instance. + /// [maxBandwidthBps] is the maximum bandwidth in bits per second. + /// Pass 0 or a negative value to remove the limit and allow the player + /// to select quality freely. + /// + /// Common bandwidth values: + /// - 360p: 500000 bps (500 kbps) + /// - 480p: 800000 bps (800 kbps) + /// - 720p: 1200000 bps (1.2 Mbps) + /// - 1080p: 2500000 bps (2.5 Mbps) + /// + /// Platform-specific behavior: + /// - **Android**: Uses ExoPlayer's `DefaultTrackSelector.setMaxVideoBitrate()`. + /// - **iOS/macOS**: Sets `AVPlayerItem.preferredPeakBitRate`. + /// - **Web**: Not implemented (throws [UnimplementedError]). + Future setBandwidthLimit(int playerId, int maxBandwidthBps) { + throw UnimplementedError('setBandwidthLimit() has not been implemented.'); + } + + /// Returns whether bandwidth limit setting is supported on this platform. + /// + /// This method allows developers to query at runtime whether the current + /// platform supports setting a bandwidth limit for adaptive bitrate + /// streaming. This follows the same pattern as + /// [isAudioTrackSupportAvailable]. + /// + /// Returns `true` if [setBandwidthLimit] is supported, `false` otherwise. + /// + /// The default implementation returns `false`. Platform implementations + /// should override this to return `true` if they support bandwidth limiting. + bool isBandwidthLimitSupportAvailable() { + return false; + } } class _PlaceholderImplementation extends VideoPlayerPlatform {} diff --git a/packages/video_player/video_player_platform_interface/pubspec.yaml b/packages/video_player/video_player_platform_interface/pubspec.yaml index b39acce19665..373ddb91f1fb 100644 --- a/packages/video_player/video_player_platform_interface/pubspec.yaml +++ b/packages/video_player/video_player_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/video_player/ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+video_player%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 6.6.0 +version: 6.7.0 environment: sdk: ^3.9.0 diff --git a/packages/video_player/video_player_platform_interface/test/video_player_platform_interface_test.dart b/packages/video_player/video_player_platform_interface/test/video_player_platform_interface_test.dart index 2d920161ec9e..4e5105a43333 100644 --- a/packages/video_player/video_player_platform_interface/test/video_player_platform_interface_test.dart +++ b/packages/video_player/video_player_platform_interface/test/video_player_platform_interface_test.dart @@ -40,4 +40,21 @@ void main() { test('default implementation isAudioTrackSupportAvailable returns false', () { expect(initialInstance.isAudioTrackSupportAvailable(), false); }); + + test( + 'default implementation setBandwidthLimit throws unimplemented', + () async { + await expectLater( + () => initialInstance.setBandwidthLimit(1, 5000000), + throwsUnimplementedError, + ); + }, + ); + + test( + 'default implementation isBandwidthLimitSupportAvailable returns false', + () { + expect(initialInstance.isBandwidthLimitSupportAvailable(), false); + }, + ); }