Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/quality selection #4

Merged
merged 2 commits into from
Aug 3, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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