Skip to content

Commit

Permalink
Merge pull request #4 from bcc-code/feat/quality-selection
Browse files Browse the repository at this point in the history
Feat/quality selection
  • Loading branch information
andreasgangso authored Aug 3, 2023
2 parents e366e2c + 802b38d commit 8b45a42
Show file tree
Hide file tree
Showing 18 changed files with 493 additions and 150 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Autogenerated from Pigeon (v9.2.4), do not edit directly.
// Autogenerated from Pigeon (v9.2.5), do not edit directly.
// See also: https://pub.dev/packages/pigeon

package media.bcc.bccm_player.pigeon;
Expand Down Expand Up @@ -85,7 +85,8 @@ private CastConnectionState(final int index) {

public enum TrackType {
AUDIO(0),
TEXT(1);
TEXT(1),
VIDEO(2);

final int index;

Expand Down Expand Up @@ -921,6 +922,19 @@ public void setTextTracks(@NonNull List<Track> setterArg) {
this.textTracks = setterArg;
}

private @NonNull List<Track> videoTracks;

public @NonNull List<Track> getVideoTracks() {
return videoTracks;
}

public void setVideoTracks(@NonNull List<Track> setterArg) {
if (setterArg == null) {
throw new IllegalStateException("Nonnull field \"videoTracks\" is null.");
}
this.videoTracks = setterArg;
}

/** Constructor is non-public to enforce null safety; use Builder. */
PlayerTracksSnapshot() {}

Expand All @@ -947,21 +961,30 @@ public static final class Builder {
return this;
}

private @Nullable List<Track> videoTracks;

public @NonNull Builder setVideoTracks(@NonNull List<Track> setterArg) {
this.videoTracks = setterArg;
return this;
}

public @NonNull PlayerTracksSnapshot build() {
PlayerTracksSnapshot pigeonReturn = new PlayerTracksSnapshot();
pigeonReturn.setPlayerId(playerId);
pigeonReturn.setAudioTracks(audioTracks);
pigeonReturn.setTextTracks(textTracks);
pigeonReturn.setVideoTracks(videoTracks);
return pigeonReturn;
}
}

@NonNull
ArrayList<Object> toList() {
ArrayList<Object> toListResult = new ArrayList<Object>(3);
ArrayList<Object> toListResult = new ArrayList<Object>(4);
toListResult.add(playerId);
toListResult.add(audioTracks);
toListResult.add(textTracks);
toListResult.add(videoTracks);
return toListResult;
}

Expand All @@ -973,6 +996,8 @@ ArrayList<Object> toList() {
pigeonResult.setAudioTracks((List<Track>) audioTracks);
Object textTracks = list.get(2);
pigeonResult.setTextTracks((List<Track>) textTracks);
Object videoTracks = list.get(3);
pigeonResult.setVideoTracks((List<Track>) videoTracks);
return pigeonResult;
}
}
Expand Down Expand Up @@ -1012,6 +1037,46 @@ public void setLanguage(@Nullable String setterArg) {
this.language = setterArg;
}

private @Nullable Double frameRate;

public @Nullable Double getFrameRate() {
return frameRate;
}

public void setFrameRate(@Nullable Double setterArg) {
this.frameRate = setterArg;
}

private @Nullable Long bitrate;

public @Nullable Long getBitrate() {
return bitrate;
}

public void setBitrate(@Nullable Long setterArg) {
this.bitrate = setterArg;
}

private @Nullable Long width;

public @Nullable Long getWidth() {
return width;
}

public void setWidth(@Nullable Long setterArg) {
this.width = setterArg;
}

private @Nullable Long height;

public @Nullable Long getHeight() {
return height;
}

public void setHeight(@Nullable Long setterArg) {
this.height = setterArg;
}

private @NonNull Boolean isSelected;

public @NonNull Boolean getIsSelected() {
Expand Down Expand Up @@ -1051,6 +1116,34 @@ public static final class Builder {
return this;
}

private @Nullable Double frameRate;

public @NonNull Builder setFrameRate(@Nullable Double setterArg) {
this.frameRate = setterArg;
return this;
}

private @Nullable Long bitrate;

public @NonNull Builder setBitrate(@Nullable Long setterArg) {
this.bitrate = setterArg;
return this;
}

private @Nullable Long width;

public @NonNull Builder setWidth(@Nullable Long setterArg) {
this.width = setterArg;
return this;
}

private @Nullable Long height;

public @NonNull Builder setHeight(@Nullable Long setterArg) {
this.height = setterArg;
return this;
}

private @Nullable Boolean isSelected;

public @NonNull Builder setIsSelected(@NonNull Boolean setterArg) {
Expand All @@ -1063,17 +1156,25 @@ public static final class Builder {
pigeonReturn.setId(id);
pigeonReturn.setLabel(label);
pigeonReturn.setLanguage(language);
pigeonReturn.setFrameRate(frameRate);
pigeonReturn.setBitrate(bitrate);
pigeonReturn.setWidth(width);
pigeonReturn.setHeight(height);
pigeonReturn.setIsSelected(isSelected);
return pigeonReturn;
}
}

@NonNull
ArrayList<Object> toList() {
ArrayList<Object> toListResult = new ArrayList<Object>(4);
ArrayList<Object> toListResult = new ArrayList<Object>(8);
toListResult.add(id);
toListResult.add(label);
toListResult.add(language);
toListResult.add(frameRate);
toListResult.add(bitrate);
toListResult.add(width);
toListResult.add(height);
toListResult.add(isSelected);
return toListResult;
}
Expand All @@ -1086,7 +1187,15 @@ ArrayList<Object> toList() {
pigeonResult.setLabel((String) label);
Object language = list.get(2);
pigeonResult.setLanguage((String) language);
Object isSelected = list.get(3);
Object frameRate = list.get(3);
pigeonResult.setFrameRate((Double) frameRate);
Object bitrate = list.get(4);
pigeonResult.setBitrate((bitrate == null) ? null : ((bitrate instanceof Integer) ? (Integer) bitrate : (Long) bitrate));
Object width = list.get(5);
pigeonResult.setWidth((width == null) ? null : ((width instanceof Integer) ? (Integer) width : (Long) width));
Object height = list.get(6);
pigeonResult.setHeight((height == null) ? null : ((height instanceof Integer) ? (Integer) height : (Long) height));
Object isSelected = list.get(7);
pigeonResult.setIsSelected((Boolean) isSelected);
return pigeonResult;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import android.net.Uri
import android.os.Bundle
import androidx.annotation.CallSuper
import androidx.media3.common.C
import androidx.media3.common.Format
import androidx.media3.common.MediaItem
import androidx.media3.common.MediaMetadata
import androidx.media3.common.Player
Expand Down Expand Up @@ -183,9 +184,14 @@ abstract class PlayerController : Player.Listener {
val currentTextTrack =
currentTracks.groups.firstOrNull { it.isSelected && it.type == C.TRACK_TYPE_TEXT }
?.getTrackFormat(0)
val videoOverride =
player.trackSelectionParameters.overrides.filter { i -> i.value.type == C.TRACK_TYPE_VIDEO }.values.firstOrNull()
val currentExplicitlySelectedVideoTrackFormat =
videoOverride?.mediaTrackGroup?.getFormat(videoOverride.trackIndices.first())

val audioTracks = mutableListOf<PlaybackPlatformApi.Track>()
val textTracks = mutableListOf<PlaybackPlatformApi.Track>()
val videoTracks = mutableListOf<PlaybackPlatformApi.Track>()
for (trackGroup in currentTracks.groups) {
if (trackGroup.type == C.TRACK_TYPE_AUDIO) {
val track = trackGroup.getTrackFormat(0)
Expand All @@ -195,6 +201,7 @@ abstract class PlayerController : Player.Listener {
.setId(id)
.setLanguage(track.language)
.setLabel(track.label)
.setBitrate(track.averageBitrate.toLong())
.setIsSelected(track == currentAudioTrack)
.build()
)
Expand All @@ -206,15 +213,38 @@ abstract class PlayerController : Player.Listener {
.setId(id)
.setLanguage(track.language)
.setLabel(track.label)
.setBitrate(track.averageBitrate.toLong())
.setIsSelected(track == currentTextTrack)
.build()
)
} else if (trackGroup.type == C.TRACK_TYPE_VIDEO) {
for (trackIndex in 0 until trackGroup.length) {
val trackFormat = trackGroup.getTrackFormat(trackIndex)
if (trackGroup.isTrackSupported(trackIndex)) {
val trackId = trackFormat.id ?: continue;
videoTracks.add(
PlaybackPlatformApi.Track.Builder()
.setId(trackId)
.setLanguage(null)
.setLabel("${trackFormat.width} x ${trackFormat.height}")
.setWidth(trackFormat.width.toLong())
.setHeight(trackFormat.height.toLong())
.setFrameRate(if (trackFormat.frameRate.toInt() == Format.NO_VALUE) null else trackFormat.frameRate.toDouble())
.setBitrate(trackFormat.averageBitrate.toLong())
.setIsSelected(trackFormat == currentExplicitlySelectedVideoTrackFormat)
.build()
)

}
}
}
}

return PlaybackPlatformApi.PlayerTracksSnapshot.Builder()
.setPlayerId(id)
.setAudioTracks(audioTracks)
.setTextTracks(textTracks)
.setVideoTracks(videoTracks.apply { this.sortByDescending { t -> t.height } })
.build()
}

Expand All @@ -231,17 +261,32 @@ abstract class PlayerController : Player.Listener {
return;
}
setTrackTypeDisabled(type, false);

if (trackId == "auto") {
player.trackSelectionParameters = player.trackSelectionParameters
.buildUpon()
.clearOverridesOfType(type)
.build()
return
}

val tracks = tracksOverride ?: player.currentTracks
val trackGroup = tracks.groups.firstOrNull {
it.type == type
&& it.mediaTrackGroup.length > 0
&& it.mediaTrackGroup.getFormat(0).id == trackId
var trackGroup: Tracks.Group? = null
var trackIndex: Int? = null
for (group in tracks.groups.filter { it.type == type && it.length > 0 }) {
for (i in 0 until group.length) {
val format = group.getTrackFormat(i);
if (format.id == trackId) {
trackGroup = group
trackIndex = i
}
}
}
if (trackGroup != null) {
if (trackGroup != null && trackIndex != null) {
player.trackSelectionParameters = player.trackSelectionParameters
.buildUpon()
.clearOverridesOfType(type)
.setOverrideForType(TrackSelectionOverride(trackGroup.mediaTrackGroup, 0))
.setOverrideForType(TrackSelectionOverride(trackGroup.mediaTrackGroup, trackIndex))
.build()
}
}
Expand Down
Loading

0 comments on commit 8b45a42

Please sign in to comment.