-Moved caption extraction and menu building into exoplayer track changing callback.
-Updated extractor dependency.
This commit is contained in:
parent
880676d670
commit
f506fc0478
|
@ -676,7 +676,7 @@ public final class PopupVideoPlayer extends Service {
|
||||||
|
|
||||||
/*package-private*/ void enableVideoRenderer(final boolean enable) {
|
/*package-private*/ void enableVideoRenderer(final boolean enable) {
|
||||||
final int videoRendererIndex = getRendererIndex(C.TRACK_TYPE_VIDEO);
|
final int videoRendererIndex = getRendererIndex(C.TRACK_TYPE_VIDEO);
|
||||||
if (trackSelector != null && videoRendererIndex != -1) {
|
if (trackSelector != null && videoRendererIndex != RENDERER_UNAVAILABLE) {
|
||||||
trackSelector.setRendererDisabled(videoRendererIndex, !enable);
|
trackSelector.setRendererDisabled(videoRendererIndex, !enable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,6 +53,7 @@ import com.google.android.exoplayer2.SimpleExoPlayer;
|
||||||
import com.google.android.exoplayer2.source.MediaSource;
|
import com.google.android.exoplayer2.source.MediaSource;
|
||||||
import com.google.android.exoplayer2.source.MergingMediaSource;
|
import com.google.android.exoplayer2.source.MergingMediaSource;
|
||||||
import com.google.android.exoplayer2.source.SingleSampleMediaSource;
|
import com.google.android.exoplayer2.source.SingleSampleMediaSource;
|
||||||
|
import com.google.android.exoplayer2.source.TrackGroup;
|
||||||
import com.google.android.exoplayer2.source.TrackGroupArray;
|
import com.google.android.exoplayer2.source.TrackGroupArray;
|
||||||
import com.google.android.exoplayer2.trackselection.TrackSelectionArray;
|
import com.google.android.exoplayer2.trackselection.TrackSelectionArray;
|
||||||
import com.google.android.exoplayer2.ui.AspectRatioFrameLayout;
|
import com.google.android.exoplayer2.ui.AspectRatioFrameLayout;
|
||||||
|
@ -98,6 +99,7 @@ public abstract class VideoPlayer extends BasePlayer
|
||||||
// Player
|
// Player
|
||||||
//////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
protected static final int RENDERER_UNAVAILABLE = -1;
|
||||||
public static final int DEFAULT_CONTROLS_HIDE_TIME = 2000; // 2 Seconds
|
public static final int DEFAULT_CONTROLS_HIDE_TIME = 2000; // 2 Seconds
|
||||||
|
|
||||||
private ArrayList<VideoStream> availableStreams;
|
private ArrayList<VideoStream> availableStreams;
|
||||||
|
@ -105,8 +107,6 @@ public abstract class VideoPlayer extends BasePlayer
|
||||||
|
|
||||||
protected String playbackQuality;
|
protected String playbackQuality;
|
||||||
|
|
||||||
private List<Subtitles> availableCaptions;
|
|
||||||
|
|
||||||
protected boolean wasPlaying = false;
|
protected boolean wasPlaying = false;
|
||||||
|
|
||||||
/*//////////////////////////////////////////////////////////////////////////
|
/*//////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -271,35 +271,32 @@ public abstract class VideoPlayer extends BasePlayer
|
||||||
playbackSpeedPopupMenu.setOnDismissListener(this);
|
playbackSpeedPopupMenu.setOnDismissListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void buildCaptionMenu() {
|
private void buildCaptionMenu(final List<String> availableLanguages) {
|
||||||
if (captionPopupMenu == null) return;
|
if (captionPopupMenu == null) return;
|
||||||
captionPopupMenu.getMenu().removeGroup(captionPopupMenuGroupId);
|
captionPopupMenu.getMenu().removeGroup(captionPopupMenuGroupId);
|
||||||
|
|
||||||
if (availableCaptions == null || trackSelector == null) return;
|
|
||||||
|
|
||||||
// Add option for turning off caption
|
// Add option for turning off caption
|
||||||
MenuItem captionOffItem = captionPopupMenu.getMenu().add(captionPopupMenuGroupId,
|
MenuItem captionOffItem = captionPopupMenu.getMenu().add(captionPopupMenuGroupId,
|
||||||
0, Menu.NONE, R.string.caption_none);
|
0, Menu.NONE, R.string.caption_none);
|
||||||
captionOffItem.setOnMenuItemClickListener(menuItem -> {
|
captionOffItem.setOnMenuItemClickListener(menuItem -> {
|
||||||
final int textRendererIndex = getRendererIndex(C.TRACK_TYPE_TEXT);
|
final int textRendererIndex = getRendererIndex(C.TRACK_TYPE_TEXT);
|
||||||
if (trackSelector != null && textRendererIndex != -1) {
|
if (trackSelector != null && textRendererIndex != RENDERER_UNAVAILABLE) {
|
||||||
trackSelector.setRendererDisabled(textRendererIndex, true);
|
trackSelector.setRendererDisabled(textRendererIndex, true);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
// Add all available captions
|
// Add all available captions
|
||||||
for (int i = 0; i < availableCaptions.size(); i++) {
|
for (int i = 0; i < availableLanguages.size(); i++) {
|
||||||
final Subtitles subtitles = availableCaptions.get(i);
|
final String captionLanguage = availableLanguages.get(i);
|
||||||
final String captionLanguage = PlayerHelper.captionLanguageOf(subtitles);
|
|
||||||
MenuItem captionItem = captionPopupMenu.getMenu().add(captionPopupMenuGroupId,
|
MenuItem captionItem = captionPopupMenu.getMenu().add(captionPopupMenuGroupId,
|
||||||
i + 1, Menu.NONE, captionLanguage);
|
i + 1, Menu.NONE, captionLanguage);
|
||||||
captionItem.setOnMenuItemClickListener(menuItem -> {
|
captionItem.setOnMenuItemClickListener(menuItem -> {
|
||||||
final int textRendererIndex = getRendererIndex(C.TRACK_TYPE_TEXT);
|
final int textRendererIndex = getRendererIndex(C.TRACK_TYPE_TEXT);
|
||||||
if (trackSelector != null && textRendererIndex != -1) {
|
if (trackSelector != null && textRendererIndex != RENDERER_UNAVAILABLE) {
|
||||||
trackSelector.setRendererDisabled(textRendererIndex, false);
|
|
||||||
trackSelector.setParameters(trackSelector.getParameters()
|
trackSelector.setParameters(trackSelector.getParameters()
|
||||||
.withPreferredTextLanguage(captionLanguage));
|
.withPreferredTextLanguage(captionLanguage));
|
||||||
|
trackSelector.setRendererDisabled(textRendererIndex, false);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
@ -319,7 +316,6 @@ public abstract class VideoPlayer extends BasePlayer
|
||||||
super.sync(item, info);
|
super.sync(item, info);
|
||||||
qualityTextView.setVisibility(View.GONE);
|
qualityTextView.setVisibility(View.GONE);
|
||||||
playbackSpeedTextView.setVisibility(View.GONE);
|
playbackSpeedTextView.setVisibility(View.GONE);
|
||||||
captionTextView.setVisibility(View.GONE);
|
|
||||||
|
|
||||||
if (info != null) {
|
if (info != null) {
|
||||||
final List<VideoStream> videos = ListHelper.getSortedStreamVideosList(context,
|
final List<VideoStream> videos = ListHelper.getSortedStreamVideosList(context,
|
||||||
|
@ -331,14 +327,10 @@ public abstract class VideoPlayer extends BasePlayer
|
||||||
selectedStreamIndex = getOverrideResolutionIndex(videos, getPlaybackQuality());
|
selectedStreamIndex = getOverrideResolutionIndex(videos, getPlaybackQuality());
|
||||||
}
|
}
|
||||||
|
|
||||||
availableCaptions = info.getSubtitles();
|
|
||||||
|
|
||||||
buildQualityMenu();
|
buildQualityMenu();
|
||||||
buildPlaybackSpeedMenu();
|
buildPlaybackSpeedMenu();
|
||||||
buildCaptionMenu();
|
|
||||||
qualityTextView.setVisibility(View.VISIBLE);
|
qualityTextView.setVisibility(View.VISIBLE);
|
||||||
playbackSpeedTextView.setVisibility(View.VISIBLE);
|
playbackSpeedTextView.setVisibility(View.VISIBLE);
|
||||||
captionTextView.setVisibility(availableCaptions.isEmpty() ? View.GONE : View.VISIBLE);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -469,17 +461,7 @@ public abstract class VideoPlayer extends BasePlayer
|
||||||
@Override
|
@Override
|
||||||
public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
|
public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
|
||||||
super.onTracksChanged(trackGroups, trackSelections);
|
super.onTracksChanged(trackGroups, trackSelections);
|
||||||
if (captionTextView == null) return;
|
onTextTrackUpdate();
|
||||||
|
|
||||||
if (trackSelector == null) {
|
|
||||||
captionTextView.setVisibility(View.GONE);
|
|
||||||
} else if (trackSelector.getRendererDisabled(getRendererIndex(C.TRACK_TYPE_TEXT)) ||
|
|
||||||
trackSelector.getParameters().preferredTextLanguage == null) {
|
|
||||||
captionTextView.setText(R.string.caption_none);
|
|
||||||
} else {
|
|
||||||
final String preferredLanguage = trackSelector.getParameters().preferredTextLanguage;
|
|
||||||
captionTextView.setText(preferredLanguage);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -495,6 +477,55 @@ public abstract class VideoPlayer extends BasePlayer
|
||||||
animateView(surfaceForeground, false, 100);
|
animateView(surfaceForeground, false, 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*//////////////////////////////////////////////////////////////////////////
|
||||||
|
// ExoPlayer Track Updates
|
||||||
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
|
private void onTextTrackUpdate() {
|
||||||
|
final int textRenderer = getRendererIndex(C.TRACK_TYPE_TEXT);
|
||||||
|
|
||||||
|
if (captionTextView == null) return;
|
||||||
|
if (trackSelector == null || trackSelector.getCurrentMappedTrackInfo() == null ||
|
||||||
|
textRenderer == RENDERER_UNAVAILABLE) {
|
||||||
|
captionTextView.setVisibility(View.GONE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final TrackGroupArray textTracks = trackSelector.getCurrentMappedTrackInfo()
|
||||||
|
.getTrackGroups(textRenderer);
|
||||||
|
|
||||||
|
// Extract all loaded languages
|
||||||
|
List<String> availableLanguages = new ArrayList<>(textTracks.length);
|
||||||
|
for (int i = 0; i < textTracks.length; i++) {
|
||||||
|
final TrackGroup textTrack = textTracks.get(i);
|
||||||
|
if (textTrack.length > 0 && textTrack.getFormat(0) != null) {
|
||||||
|
availableLanguages.add(textTrack.getFormat(0).language);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Normalize mismatching language strings
|
||||||
|
final String preferredLanguage = trackSelector.getParameters().preferredTextLanguage;
|
||||||
|
// Because ExoPlayer normalizes the preferred language string but not the text track
|
||||||
|
// language strings, some preferred language string will have the language name in lowercase
|
||||||
|
String formattedPreferredLanguage = null;
|
||||||
|
if (preferredLanguage != null) {
|
||||||
|
for (final String language : availableLanguages) {
|
||||||
|
if (language.compareToIgnoreCase(preferredLanguage) == 0)
|
||||||
|
formattedPreferredLanguage = language;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build UI
|
||||||
|
buildCaptionMenu(availableLanguages);
|
||||||
|
if (trackSelector.getRendererDisabled(textRenderer) || formattedPreferredLanguage == null ||
|
||||||
|
!availableLanguages.contains(formattedPreferredLanguage)) {
|
||||||
|
captionTextView.setText(R.string.caption_none);
|
||||||
|
} else {
|
||||||
|
captionTextView.setText(formattedPreferredLanguage);
|
||||||
|
}
|
||||||
|
captionTextView.setVisibility(availableLanguages.isEmpty() ? View.GONE : View.VISIBLE);
|
||||||
|
}
|
||||||
|
|
||||||
/*//////////////////////////////////////////////////////////////////////////
|
/*//////////////////////////////////////////////////////////////////////////
|
||||||
// General Player
|
// General Player
|
||||||
//////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
|
@ -688,7 +719,7 @@ public abstract class VideoPlayer extends BasePlayer
|
||||||
//////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
||||||
public int getRendererIndex(final int trackIndex) {
|
public int getRendererIndex(final int trackIndex) {
|
||||||
if (simpleExoPlayer == null) return -1;
|
if (simpleExoPlayer == null) return RENDERER_UNAVAILABLE;
|
||||||
|
|
||||||
for (int t = 0; t < simpleExoPlayer.getRendererCount(); t++) {
|
for (int t = 0; t < simpleExoPlayer.getRendererCount(); t++) {
|
||||||
if (simpleExoPlayer.getRendererType(t) == trackIndex) {
|
if (simpleExoPlayer.getRendererType(t) == trackIndex) {
|
||||||
|
@ -696,7 +727,7 @@ public abstract class VideoPlayer extends BasePlayer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return RENDERER_UNAVAILABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isControlsVisible() {
|
public boolean isControlsVisible() {
|
||||||
|
|
Loading…
Reference in New Issue