This commit is contained in:
Yuriy Liskov
2020-10-02 04:16:59 +03:00
parent 1be129453e
commit 21c93deee2
9 changed files with 102 additions and 97 deletions

View File

@@ -1,23 +0,0 @@
package com.liskovsoft.smartyoutubetv2.common.exoplayer.comparator;
import com.liskovsoft.sharedutils.helpers.Helpers;
import com.liskovsoft.smartyoutubetv2.common.exoplayer.selector.TrackSelectorManager.MediaTrack;
public class SubtitleTrackComparator extends TrackComparator {
@Override
public int compare(MediaTrack track1, MediaTrack track2) {
if (track1 == null || track1.format == null) {
return -1;
}
int result = 1;
if (Helpers.equals(track1.format.id, track2.format.id)) {
result = 0;
} else if (Helpers.equals(track1.format.language, track2.format.language)) {
return 0;
}
return result;
}
}

View File

@@ -1,19 +0,0 @@
package com.liskovsoft.smartyoutubetv2.common.exoplayer.comparator;
import com.liskovsoft.smartyoutubetv2.common.exoplayer.selector.TrackSelectorManager;
import com.liskovsoft.smartyoutubetv2.common.exoplayer.selector.TrackSelectorManager.MediaTrack;
public abstract class TrackComparator {
public static TrackComparator forRenderer(int rendererIndex) {
if (rendererIndex == TrackSelectorManager.RENDERER_INDEX_VIDEO) {
return new VideoTrackComparator();
} else if (rendererIndex == TrackSelectorManager.RENDERER_INDEX_AUDIO) {
return new AudioTrackComparator();
} else if (rendererIndex == TrackSelectorManager.RENDERER_INDEX_SUBTITLE) {
return new SubtitleTrackComparator();
}
return null;
}
public abstract int compare(MediaTrack track1, MediaTrack track2);
}

View File

@@ -1,12 +1,11 @@
package com.liskovsoft.smartyoutubetv2.common.exoplayer.selector;
import android.content.Intent;
import androidx.annotation.NonNull;
import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.util.MimeTypes;
import com.liskovsoft.sharedutils.helpers.Helpers;
import com.liskovsoft.smartyoutubetv2.common.autoframerate.FormatItem;
import com.liskovsoft.smartyoutubetv2.common.exoplayer.selector.TrackSelectorManager.MediaTrack;
import com.liskovsoft.smartyoutubetv2.common.exoplayer.selector.track.MediaTrack;
import java.util.ArrayList;
import java.util.List;
@@ -129,8 +128,6 @@ public class ExoFormatItem implements FormatItem {
}
ExoFormatItem formatItem = new ExoFormatItem();
MediaTrack mediaTrack = new MediaTrack();
formatItem.mTrack = mediaTrack;
String[] split = spec.split(",");
@@ -140,7 +137,11 @@ public class ExoFormatItem implements FormatItem {
int type = Helpers.parseInt(split[0]);
formatItem.mType = type;
mediaTrack.rendererIndex = Helpers.parseInt(split[1]);
int rendererIndex = Helpers.parseInt(split[1]);
MediaTrack mediaTrack = MediaTrack.forRendererIndex(rendererIndex);
formatItem.mTrack = mediaTrack;
String id = split[2];
String codecs = split[3];
int width = Helpers.parseInt(split[4]);
@@ -171,12 +172,10 @@ public class ExoFormatItem implements FormatItem {
public static FormatItem createFakeVideoFormat(int resolution, int format, int frameRate) {
ExoFormatItem formatItem = new ExoFormatItem();
MediaTrack mediaTrack = new MediaTrack();
MediaTrack mediaTrack = MediaTrack.forRendererIndex(TrackSelectorManager.RENDERER_INDEX_VIDEO);
formatItem.mTrack = mediaTrack;
formatItem.mType = TYPE_VIDEO;
mediaTrack.rendererIndex = TrackSelectorManager.RENDERER_INDEX_VIDEO;
int width = -1;
int height = -1;
String codec = null;
@@ -222,12 +221,10 @@ public class ExoFormatItem implements FormatItem {
public static FormatItem createFakeAudioFormat(int format) {
ExoFormatItem formatItem = new ExoFormatItem();
MediaTrack mediaTrack = new MediaTrack();
MediaTrack mediaTrack = MediaTrack.forRendererIndex(TrackSelectorManager.RENDERER_INDEX_AUDIO);
formatItem.mTrack = mediaTrack;
formatItem.mType = TYPE_AUDIO;
mediaTrack.rendererIndex = TrackSelectorManager.RENDERER_INDEX_AUDIO;
String codec = null;
switch (format) {

View File

@@ -6,11 +6,10 @@ import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.RendererCapabilities;
import com.google.android.exoplayer2.source.TrackGroupArray;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.trackselection.TrackSelection;
import com.google.android.exoplayer2.trackselection.TrackSelection.Definition;
import com.google.android.exoplayer2.trackselection.TrackSelection.Factory;
import com.liskovsoft.sharedutils.mylogger.Log;
import com.liskovsoft.smartyoutubetv2.common.exoplayer.selector.TrackSelectorManager.MediaTrack;
import com.liskovsoft.smartyoutubetv2.common.exoplayer.selector.track.MediaTrack;
public class RestoreTrackSelector extends DefaultTrackSelector {
private static final String TAG = RestoreTrackSelector.class.getSimpleName();

View File

@@ -14,7 +14,7 @@ import com.google.android.exoplayer2.trackselection.TrackSelection;
import com.google.android.exoplayer2.trackselection.TrackSelection.Definition;
import com.liskovsoft.sharedutils.mylogger.Log;
import com.liskovsoft.smartyoutubetv2.common.exoplayer.selector.RestoreTrackSelector.TrackSelectorCallback;
import com.liskovsoft.smartyoutubetv2.common.exoplayer.comparator.TrackComparator;
import com.liskovsoft.smartyoutubetv2.common.exoplayer.selector.track.MediaTrack;
import java.util.Arrays;
import java.util.Comparator;
@@ -49,15 +49,6 @@ public class TrackSelectorManager implements TrackSelectorCallback {
public MediaTrack selectedTrack;
}
public static class MediaTrack {
public Format format;
public int groupIndex = -1;
public int trackIndex = -1;
public boolean isSelected;
public int rendererIndex;
}
private static class MediaTrackFormatComparator implements Comparator<MediaTrack> {
@Override
public int compare(MediaTrack mediaTrack1, MediaTrack mediaTrack2) {
@@ -211,8 +202,7 @@ public class TrackSelectorManager implements TrackSelectorCallback {
renderer.sortedTracks = new TreeSet<>(new MediaTrackFormatComparator());
// AUTO OPTION: add disable subs option
MediaTrack autoTrack = new MediaTrack();
autoTrack.rendererIndex = rendererIndex;
MediaTrack autoTrack = MediaTrack.forRendererIndex(rendererIndex);
if (rendererIndex == RENDERER_INDEX_SUBTITLE) {
renderer.sortedTracks.add(autoTrack);
}
@@ -229,11 +219,10 @@ public class TrackSelectorManager implements TrackSelectorCallback {
haveSupportedTracks = true;
Format format = group.getFormat(trackIndex);
MediaTrack mediaTrack = new MediaTrack();
MediaTrack mediaTrack = MediaTrack.forRendererIndex(rendererIndex);
mediaTrack.format = format;
mediaTrack.groupIndex = groupIndex;
mediaTrack.trackIndex = trackIndex;
mediaTrack.rendererIndex = rendererIndex;
mediaTrack.isSelected =
renderer.override != null && renderer.override.groupIndex == groupIndex && renderer.override.containsTrack(trackIndex);
@@ -410,19 +399,17 @@ public class TrackSelectorManager implements TrackSelectorCallback {
MediaTrack result = createAutoSelection(track.rendererIndex);
TrackComparator mComparator = TrackComparator.forRenderer(track.rendererIndex);
if (track.format != null) { // not auto selection
for (int groupIndex = 0; groupIndex < renderer.mediaTracks.length; groupIndex++) {
for (int trackIndex = 0; trackIndex < renderer.mediaTracks[groupIndex].length; trackIndex++) {
MediaTrack mediaTrack = renderer.mediaTracks[groupIndex][trackIndex];
int compare = mComparator.compare(mediaTrack, track);
int compare = track.compare(mediaTrack);
if (compare == 0) {
result = mediaTrack;
break;
} else if (compare < 0 && mComparator.compare(result, mediaTrack) < 0) {
Log.d(TAG, "findBestMatch: Found exact match: " + mediaTrack.format);
return mediaTrack;
} else if (compare > 0 && mediaTrack.compare(result) > 0) { // select track with higher possible quality
result = mediaTrack;
}
}
@@ -446,9 +433,7 @@ public class TrackSelectorManager implements TrackSelectorCallback {
}
private MediaTrack createAutoSelection(int rendererIndex) {
MediaTrack result = new MediaTrack();
result.rendererIndex = rendererIndex;
return result;
return MediaTrack.forRendererIndex(rendererIndex);
}
private void clearOverride(int rendererIndex) {

View File

@@ -1,10 +1,13 @@
package com.liskovsoft.smartyoutubetv2.common.exoplayer.comparator;
package com.liskovsoft.smartyoutubetv2.common.exoplayer.selector.track;
import com.liskovsoft.sharedutils.helpers.Helpers;
import com.liskovsoft.smartyoutubetv2.common.exoplayer.selector.TrackSelectorManager.MediaTrack;
import com.liskovsoft.smartyoutubetv2.common.exoplayer.selector.TrackSelectorUtil;
public class AudioTrackComparator extends TrackComparator {
public class AudioTrack extends MediaTrack {
public AudioTrack(int rendererIndex) {
super(rendererIndex);
}
private static boolean codecEquals(String codecs1, String codecs2) {
if (codecs1 == null || codecs2 == null) {
return false;
@@ -13,16 +16,17 @@ public class AudioTrackComparator extends TrackComparator {
return Helpers.equals(TrackSelectorUtil.codecNameShort(codecs1), TrackSelectorUtil.codecNameShort(codecs2));
}
public int compare(MediaTrack track1, MediaTrack track2) {
if (track1 == null || track1.format == null) {
return -1;
@Override
public int compare(MediaTrack track2) {
if (track2.format == null) {
return 1;
}
int result = 1;
if (Helpers.equals(track1.format.id, track2.format.id)) {
if (Helpers.equals(format.id, track2.format.id)) {
result = 0;
} else if (codecEquals(track1.format.codecs, track2.format.codecs)) {
} else if (codecEquals(format.codecs, track2.format.codecs)) {
return 0;
}

View File

@@ -0,0 +1,32 @@
package com.liskovsoft.smartyoutubetv2.common.exoplayer.selector.track;
import com.google.android.exoplayer2.Format;
import com.liskovsoft.smartyoutubetv2.common.exoplayer.selector.TrackSelectorManager;
public abstract class MediaTrack {
public MediaTrack(int rendererIndex) {
this.rendererIndex = rendererIndex;
}
public Format format;
public int groupIndex = -1;
public int trackIndex = -1;
public boolean isSelected;
public int rendererIndex;
public abstract int compare(MediaTrack track2);
public static MediaTrack forRendererIndex(int rendererIndex) {
switch (rendererIndex) {
case TrackSelectorManager.RENDERER_INDEX_VIDEO:
return new VideoTrack(rendererIndex);
case TrackSelectorManager.RENDERER_INDEX_AUDIO:
return new AudioTrack(rendererIndex);
case TrackSelectorManager.RENDERER_INDEX_SUBTITLE:
return new SubtitleTrack(rendererIndex);
}
return null;
}
}

View File

@@ -0,0 +1,26 @@
package com.liskovsoft.smartyoutubetv2.common.exoplayer.selector.track;
import com.liskovsoft.sharedutils.helpers.Helpers;
public class SubtitleTrack extends MediaTrack {
public SubtitleTrack(int rendererIndex) {
super(rendererIndex);
}
@Override
public int compare(MediaTrack track2) {
if (track2.format == null) {
return 1;
}
int result = 1;
if (Helpers.equals(format.id, track2.format.id)) {
result = 0;
} else if (Helpers.equals(format.language, track2.format.language)) {
return 0;
}
return result;
}
}

View File

@@ -1,12 +1,15 @@
package com.liskovsoft.smartyoutubetv2.common.exoplayer.comparator;
package com.liskovsoft.smartyoutubetv2.common.exoplayer.selector.track;
import com.liskovsoft.sharedutils.helpers.Helpers;
import com.liskovsoft.smartyoutubetv2.common.exoplayer.selector.TrackSelectorManager.MediaTrack;
import com.liskovsoft.smartyoutubetv2.common.exoplayer.selector.TrackSelectorUtil;
public class VideoTrackComparator extends TrackComparator {
public class VideoTrack extends MediaTrack {
private static final int HEIGHT_EQUITY_THRESHOLD_PX = 80;
public VideoTrack(int rendererIndex) {
super(rendererIndex);
}
private static boolean codecEquals(String codecs1, String codecs2) {
if (codecs1 == null || codecs2 == null) {
return false;
@@ -47,20 +50,21 @@ public class VideoTrackComparator extends TrackComparator {
return fps1 <= fps2 || fpsEquals(fps1, fps2);
}
public int compare(MediaTrack track1, MediaTrack track2) {
if (track1 == null || track1.format == null) {
return -1;
@Override
public int compare(MediaTrack track2) {
if (track2.format == null) {
return 1;
}
int result = 1;
if (Helpers.equals(track1.format.id, track2.format.id)) {
if (Helpers.equals(format.id, track2.format.id)) {
result = 0;
} else if (VideoTrackComparator.codecEquals(track1.format.codecs, track2.format.codecs)) {
if (VideoTrackComparator.fpsLessOrEquals(track1.format.frameRate, track2.format.frameRate)) {
if (VideoTrackComparator.heightEquals(track1.format.height, track2.format.height)) {
} else if (codecEquals(format.codecs, track2.format.codecs)) {
if (fpsLessOrEquals(format.frameRate, track2.format.frameRate)) {
if (heightEquals(format.height, track2.format.height)) {
result = 0;
} else if (VideoTrackComparator.heightLessOrEquals(track1.format.height, track2.format.height)) {
} else if (heightLessOrEquals(format.height, track2.format.height)) {
result = -1;
}
}