Skip to content

Commit

Permalink
Add subtitle support
Browse files Browse the repository at this point in the history
  • Loading branch information
bennettpeter committed Dec 8, 2019
1 parent 8ccdbd7 commit 6966cfd
Show file tree
Hide file tree
Showing 4 changed files with 135 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ public interface OnActionClickedListener {
void onPlayCompleted();
void onZoom();
void onAspect();
void onCaption();
}

private final OnActionClickedListener mActionListener;
Expand Down Expand Up @@ -97,7 +98,6 @@ public VideoPlayerGlue(
mRewindAction = new PlaybackControlsRow.RewindAction(context);
mZoomAction = new ZoomAction(context);
mAspectAction = new AspectAction(context);

mClosedCaptioningAction = new PlaybackControlsRow.ClosedCaptioningAction(context);
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
try {
Expand Down Expand Up @@ -125,7 +125,7 @@ protected void onCreatePrimaryActions(ArrayObjectAdapter adapter) {
@Override
protected void onCreateSecondaryActions(ArrayObjectAdapter adapter) {
super.onCreateSecondaryActions(adapter);
// adapter.add(mClosedCaptioningAction);
adapter.add(mClosedCaptioningAction);
adapter.add(mZoomAction);
adapter.add(mAspectAction);
}
Expand All @@ -144,7 +144,7 @@ public void onActionClicked(Action action) {
private boolean shouldDispatchAction(Action action) {
return action == mRewindAction
|| action == mFastForwardAction
// || action == mClosedCaptioningAction
|| action == mClosedCaptioningAction
|| action == mZoomAction
|| action == mAspectAction;
}
Expand All @@ -159,6 +159,8 @@ private void dispatchAction(Action action) {
mActionListener.onZoom();
} else if (action == mAspectAction) {
mActionListener.onAspect();
} else if (action == mClosedCaptioningAction) {
mActionListener.onCaption();
} else if (action instanceof PlaybackControlsRow.MultiAction) {
PlaybackControlsRow.MultiAction multiAction = (PlaybackControlsRow.MultiAction) action;
multiAction.nextIndex();
Expand Down
104 changes: 92 additions & 12 deletions app/src/main/java/org/mythtv/leanfront/ui/PlaybackFragment.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,21 +52,24 @@
import org.mythtv.leanfront.player.VideoPlayerGlue;
import org.mythtv.leanfront.presenter.CardPresenter;

import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlayerFactory;
import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.ext.leanback.LeanbackPlayerAdapter;
import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.source.ProgressiveMediaSource;
import com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection;
import com.google.android.exoplayer2.source.TrackGroup;
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.TrackSelector;
import com.google.android.exoplayer2.upstream.BandwidthMeter;
import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter;
import com.google.android.exoplayer2.trackselection.MappingTrackSelector;
import com.google.android.exoplayer2.ui.SubtitleView;
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
import com.google.android.exoplayer2.util.Util;

import java.util.ArrayList;

/**
* Plays selected video, loads playlist and related videos, and delegates playback to {@link
Expand All @@ -79,7 +82,7 @@ public class PlaybackFragment extends VideoSupportFragment {
private VideoPlayerGlue mPlayerGlue;
private LeanbackPlayerAdapter mPlayerAdapter;
private SimpleExoPlayer mPlayer;
private TrackSelector mTrackSelector;
private DefaultTrackSelector mTrackSelector;
private PlaylistActionListener mPlaylistActionListener;

private Video mVideo;
Expand All @@ -96,6 +99,8 @@ public class PlaybackFragment extends VideoSupportFragment {
private float mScaleX = 1.0f;
private float mScaleY = 1.0f;
private Toast mToast = null;
private SubtitleView mSubtitles;
private int mSubtitleIndex = -1;

@Override
public void onCreate(Bundle savedInstanceState) {
Expand Down Expand Up @@ -176,12 +181,21 @@ public void onStop() {
}

private void initializePlayer() {
BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
TrackSelection.Factory videoTrackSelectionFactory =
new AdaptiveTrackSelection.Factory(bandwidthMeter);
mTrackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);

mTrackSelector = new DefaultTrackSelector();
int xy = R.layout.lb_playback_fragment;
mPlayer = ExoPlayerFactory.newSimpleInstance(getActivity(), mTrackSelector);
// disable subtitles at the start
mTrackSelector.setParameters(
mTrackSelector
.buildUponParameters()
.setRendererDisabled(2, true)
);
mSubtitleIndex = -1;
mSubtitles = getActivity().findViewById(R.id.leanback_subtitles);
Player.TextComponent textComponent = mPlayer.getTextComponent();
if (textComponent != null && mSubtitles != null)
textComponent.addTextOutput(mSubtitles);

mPlayerAdapter = new LeanbackPlayerAdapter(getActivity(), mPlayer, UPDATE_DELAY);
mPlaylistActionListener = new PlaylistActionListener(mPlaylist);
mPlayerGlue = new VideoPlayerGlue(getActivity(), mPlayerAdapter, mPlaylistActionListener);
Expand Down Expand Up @@ -210,10 +224,12 @@ private void play(Video video) {

StringBuilder subtitle = new StringBuilder();
int progflags = Integer.parseInt(video.progflags);
// This is to marl unwatched when play starts - does not seem a good idea.

// This is to mark unwatched when play starts - does not seem a good idea.
// possible characters for watched - "👁" "⏿" "👀"
// if ((progflags & video.FL_WATCHED) != 0)
// markWatched(false);

if (video.season != null && video.season.compareTo("0") > 0) {
subtitle.append('S').append(video.season).append('E').append(video.episode)
.append(' ');
Expand Down Expand Up @@ -291,6 +307,65 @@ public void fastForward() {
mPlayerGlue.fastForward();
}

public void setupSubtitles() {

}


public void toggleSubtitles() {
MappingTrackSelector.MappedTrackInfo mti = mTrackSelector.getCurrentMappedTrackInfo();
TrackGroupArray tga = mti.getTrackGroups(2); // 2 is the index for text tracks
ArrayList<String> langList = new ArrayList<>();
int ix = -1;
int iy = -1;
for (ix=0; ix < tga.length; ix++) {
TrackGroup tg = tga.get(ix);
for (iy = 0; iy < tg.length; iy++) {
Format fmt = tg.getFormat(iy);
langList.add(fmt.language);
}
}
StringBuilder msg = new StringBuilder();
if (++mSubtitleIndex < langList.size()) {

// This would be the preferred method but for some reason it is not working
// DefaultTrackSelector.SelectionOverride ovr
// = new DefaultTrackSelector.SelectionOverride(ix,mSubtitleIndex);
// mTrackSelector.setParameters(
// mTrackSelector
// .buildUponParameters()
// .setSelectionOverride(2,tga,ovr));

String lang = langList.get(mSubtitleIndex);
mTrackSelector.setParameters(
mTrackSelector
.buildUponParameters()
.setPreferredTextLanguage(lang)
.setSelectUndeterminedTextLanguage(true)
.setDisabledTextTrackSelectionFlags(C.SELECTION_FLAG_FORCED)
.setRendererDisabled(2, false)
);
msg.append(getActivity().getString(R.string.msg_subtitle_on));
if (langList.size() > 1)
msg.append(" (").append(mSubtitleIndex+1).append(")");
}
else {
mSubtitleIndex = -1;
mTrackSelector.setParameters(
mTrackSelector
.buildUponParameters()
.setRendererDisabled(2, true)
);
msg.append(getActivity().getString(R.string.msg_subtitle_off));
}

if (mToast != null)
mToast.cancel();
mToast = Toast.makeText(getActivity(),
msg, Toast.LENGTH_LONG);
mToast.show();
}

public void jumpForward() {
mPlayerGlue.jumpForward();
}
Expand Down Expand Up @@ -499,6 +574,11 @@ public void onAspect() {
mToast.show();
}

@Override
public void onCaption() {
toggleSubtitles();
}

private void setScale() {
SurfaceView view = getSurfaceView();
view.setScaleX(mScaleX * mAspect);
Expand Down
36 changes: 36 additions & 0 deletions app/src/main/res/layout/lb_playback_fragment.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copied from android source so that we can add the subtitle view
-->
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/playback_fragment_root"
android:layout_width="match_parent"
android:transitionGroup="false"
android:layout_height="match_parent">

<androidx.leanback.widget.NonOverlappingFrameLayout
android:id="@+id/playback_fragment_background"
android:transitionGroup="false"
android:layout_width="match_parent"
android:layout_height="match_parent" />

<androidx.leanback.widget.NonOverlappingFrameLayout
android:id="@+id/playback_controls_dock"
android:transitionGroup="true"
android:layout_height="match_parent"
android:layout_width="match_parent"/>

<com.google.android.exoplayer2.ui.AspectRatioFrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center">

<com.google.android.exoplayer2.ui.SubtitleView
android:id="@+id/leanback_subtitles"
android:layout_width="match_parent"
android:layout_height="match_parent" />

</com.google.android.exoplayer2.ui.AspectRatioFrameLayout>

</FrameLayout>
2 changes: 2 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -113,4 +113,6 @@
<string name="pref_sort_order">Sort Sequence</string>
<string name="pref_title_backend_mac">Wakeup MAC Address</string>
<string name="msg_wake_backend">No backend connection, sent wake-up message.</string>
<string name="msg_subtitle_on">Subtitle enabled.</string>
<string name="msg_subtitle_off">Subtitle disabled.</string>
</resources>

0 comments on commit 6966cfd

Please sign in to comment.