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

Commit 8f291bc9 authored by Ronghua Wu's avatar Ronghua Wu
Browse files

libmediaplayerservice: queue discontinuity when seek to eos.

Bug: 19063416
Change-Id: I23d1a3788006a0d68effa01fe9ee1d92fe06739c
parent 9ba21b94
Loading
Loading
Loading
Loading
+17 −11
Original line number Original line Diff line number Diff line
@@ -1510,17 +1510,7 @@ void NuPlayer::GenericSource::readBuffer(
                mVideoTimeUs = timeUs;
                mVideoTimeUs = timeUs;
            }
            }


            // formatChange && seeking: track whose source is changed during selection
            queueDiscontinuityIfNeeded(seeking, formatChange, trackType, track);
            // formatChange && !seeking: track whose source is not changed during selection
            // !formatChange: normal seek
            if ((seeking || formatChange)
                    && (trackType == MEDIA_TRACK_TYPE_AUDIO
                    || trackType == MEDIA_TRACK_TYPE_VIDEO)) {
                ATSParser::DiscontinuityType type = (formatChange && seeking)
                        ? ATSParser::DISCONTINUITY_FORMATCHANGE
                        : ATSParser::DISCONTINUITY_NONE;
                track->mPackets->queueDiscontinuity( type, NULL, true /* discard */);
            }


            sp<ABuffer> buffer = mediaBufferToABuffer(
            sp<ABuffer> buffer = mediaBufferToABuffer(
                    mbuf, trackType, seekTimeUs, actualTimeUs);
                    mbuf, trackType, seekTimeUs, actualTimeUs);
@@ -1538,10 +1528,26 @@ void NuPlayer::GenericSource::readBuffer(
                    false /* discard */);
                    false /* discard */);
#endif
#endif
        } else {
        } else {
            queueDiscontinuityIfNeeded(seeking, formatChange, trackType, track);
            track->mPackets->signalEOS(err);
            track->mPackets->signalEOS(err);
            break;
            break;
        }
        }
    }
    }
}
}


void NuPlayer::GenericSource::queueDiscontinuityIfNeeded(
        bool seeking, bool formatChange, media_track_type trackType, Track *track) {
    // formatChange && seeking: track whose source is changed during selection
    // formatChange && !seeking: track whose source is not changed during selection
    // !formatChange: normal seek
    if ((seeking || formatChange)
            && (trackType == MEDIA_TRACK_TYPE_AUDIO
            || trackType == MEDIA_TRACK_TYPE_VIDEO)) {
        ATSParser::DiscontinuityType type = (formatChange && seeking)
                ? ATSParser::DISCONTINUITY_FORMATCHANGE
                : ATSParser::DISCONTINUITY_NONE;
        track->mPackets->queueDiscontinuity(type, NULL /* extra */, true /* discard */);
    }
}

}  // namespace android
}  // namespace android
+3 −0
Original line number Original line Diff line number Diff line
@@ -200,6 +200,9 @@ private:
            media_track_type trackType,
            media_track_type trackType,
            int64_t seekTimeUs = -1ll, int64_t *actualTimeUs = NULL, bool formatChange = false);
            int64_t seekTimeUs = -1ll, int64_t *actualTimeUs = NULL, bool formatChange = false);


    void queueDiscontinuityIfNeeded(
            bool seeking, bool formatChange, media_track_type trackType, Track *track);

    void schedulePollBuffering();
    void schedulePollBuffering();
    void cancelPollBuffering();
    void cancelPollBuffering();
    void restartPollBuffering();
    void restartPollBuffering();