Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8c4d53c3 authored by Robert Shih's avatar Robert Shih
Browse files

MediaPlayer/SubtitleController:fix add/select timed text on start

 - scan internal tracks when necessary
 - fix overflow in addTimedTextSource
 - do not hide timed text track in doSelectDefaultTrack; i.e. apply
   hiding logic to subtitle tracks only
 - do not notify stop in scheduleUpdate; it will be fired in onStopped
   if necessary

Bug: 17323221
Change-Id: I485f7d9197d10562fbd58d0afe5e9aa4cf610f1a
parent cd7955f6
Loading
Loading
Loading
Loading
+29 −16
Original line number Diff line number Diff line
@@ -1929,6 +1929,7 @@ public class MediaPlayer implements SubtitleController.Listener
        mSubtitleController.setAnchor(anchor);
    }

    private final Object mInbandSubtitleLock = new Object();
    private SubtitleTrack[] mInbandSubtitleTracks;
    private int mSelectedSubtitleTrackIndex = -1;
    private Vector<SubtitleTrack> mOutOfBandSubtitleTracks;
@@ -2036,6 +2037,7 @@ public class MediaPlayer implements SubtitleController.Listener
        }

        TrackInfo[] tracks = getInbandTrackInfo();
        synchronized (mInbandSubtitleLock) {
            SubtitleTrack[] inbandTracks = new SubtitleTrack[tracks.length];
            for (int i=0; i < tracks.length; i++) {
                if (tracks[i].getTrackType() == TrackInfo.MEDIA_TRACK_TYPE_SUBTITLE) {
@@ -2049,6 +2051,7 @@ public class MediaPlayer implements SubtitleController.Listener
                }
            }
            mInbandSubtitleTracks = inbandTracks;
        }
        mSubtitleController.selectDefaultTrack();
    }

@@ -2224,9 +2227,9 @@ public class MediaPlayer implements SubtitleController.Listener
                try {
                    Libcore.os.lseek(fd3, offset2, OsConstants.SEEK_SET);
                    byte[] buffer = new byte[4096];
                    for (int total = 0; total < length2;) {
                        int remain = (int)length2 - total;
                        int bytes = IoBridge.read(fd3, buffer, 0, Math.min(buffer.length, remain));
                    for (long total = 0; total < length2;) {
                        int bytesToRead = (int) Math.min(buffer.length, length2 - total);
                        int bytes = IoBridge.read(fd3, buffer, 0, bytesToRead);
                        if (bytes < 0) {
                            break;
                        } else {
@@ -2358,6 +2361,18 @@ public class MediaPlayer implements SubtitleController.Listener
            throws IllegalStateException {
        // handle subtitle track through subtitle controller
        SubtitleTrack track = null;
        synchronized (mInbandSubtitleLock) {
            if (mInbandSubtitleTracks.length == 0) {
                TrackInfo[] tracks = getInbandTrackInfo();
                mInbandSubtitleTracks = new SubtitleTrack[tracks.length];
                for (int i=0; i < tracks.length; i++) {
                    if (tracks[i].getTrackType() == TrackInfo.MEDIA_TRACK_TYPE_SUBTITLE) {
                        mInbandSubtitleTracks[i] = mSubtitleController.addTrack(tracks[i].getFormat());
                    }
                }
            }
        }

        if (index < mInbandSubtitleTracks.length) {
            track = mInbandSubtitleTracks[index];
        } else if (index < mInbandSubtitleTracks.length + mOutOfBandSubtitleTracks.size()) {
@@ -3256,9 +3271,7 @@ public class MediaPlayer implements SubtitleController.Listener
                if (DEBUG) Log.d(TAG, "scheduleUpdate");
                int i = registerListener(listener);

                if (mStopped) {
                    scheduleNotification(NOTIFY_STOP, 0 /* delay */);
                } else {
                if (!mStopped) {
                    mTimes[i] = 0;
                    scheduleNotification(NOTIFY_TIME, 0 /* delay */);
                }
+1 −1
Original line number Diff line number Diff line
@@ -275,7 +275,7 @@ public class SubtitleController {
                     mSelectedTrack.getFormat().getInteger(
                            MediaFormat.KEY_IS_FORCED_SUBTITLE, 0) != 0)) {
                    show();
                } else {
                } else if (mSelectedTrack != null && !mSelectedTrack.isTimedText()) {
                    hide();
                }
                mVisibilityIsExplicit = false;