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

Commit c5de0912 authored by Wei Jia's avatar Wei Jia
Browse files

mediaplayer: support same seek mode as MediaMetadataRetriever.

Test: manually force 4 seek modes in mediaplayer.
Bug: 32557491
Change-Id: Iea4f6dbfc224fc6da39624300c6d872b79142f07
parent b59c2fb1
Loading
Loading
Loading
Loading
+7 −8
Original line number Diff line number Diff line
@@ -23,6 +23,8 @@
#include <utils/KeyedVector.h>
#include <system/audio.h>

#include <media/IMediaSource.h>

// Fwd decl to make sure everyone agrees that the scope of struct sockaddr_in is
// global, and not in android::
struct sockaddr_in;
@@ -38,6 +40,8 @@ struct IMediaHTTPService;
struct AudioPlaybackRate;
struct AVSyncSettings;

typedef IMediaSource::ReadOptions::SeekMode MediaPlayerSeekMode;

class IMediaPlayer: public IInterface
{
public:
@@ -65,14 +69,9 @@ public:
    virtual status_t        setSyncSettings(const AVSyncSettings& sync, float videoFpsHint) = 0;
    virtual status_t        getSyncSettings(AVSyncSettings* sync /* nonnull */,
                                            float* videoFps /* nonnull */) = 0;
    // When |precise| is true, it's required that the first rendered media position after seekTo
    // is precisely at |msec|, up to rounding error of granuality, e.g., video frame interval or
    // audio length of decoding buffer. In this case, it might take a little long time to finish
    // seekTo.
    // When |precise| is false, |msec| is a hint to the mediaplayer which will try its best to
    // fulfill the request, but it's not guaranteed. This option could result in fast finish of
    // seekTo.
    virtual status_t        seekTo(int msec, bool precise = false) = 0;
    virtual status_t        seekTo(
            int msec,
            MediaPlayerSeekMode mode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC) = 0;
    virtual status_t        getCurrentPosition(int* msec) = 0;
    virtual status_t        getDuration(int* msec) = 0;
    virtual status_t        reset() = 0;
+2 −1
Original line number Diff line number Diff line
@@ -205,7 +205,8 @@ public:
        *videoFps = -1.f;
        return OK;
    }
    virtual status_t    seekTo(int msec, bool precise = false) = 0;
    virtual status_t    seekTo(
            int msec, MediaPlayerSeekMode mode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC) = 0;
    virtual status_t    getCurrentPosition(int *msec) = 0;
    virtual status_t    getDuration(int *msec) = 0;
    virtual status_t    reset() = 0;
+6 −4
Original line number Diff line number Diff line
@@ -233,7 +233,9 @@ public:
                                    float* videoFps /* nonnull */);
            status_t        getVideoWidth(int *w);
            status_t        getVideoHeight(int *h);
            status_t        seekTo(int msec, bool precise = false);
            status_t        seekTo(
                    int msec,
                    MediaPlayerSeekMode mode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC);
            status_t        getCurrentPosition(int *msec);
            status_t        getDuration(int *msec);
            status_t        reset();
@@ -257,7 +259,7 @@ public:

private:
            void            clear_l();
            status_t        seekTo_l(int msec, bool precise);
            status_t        seekTo_l(int msec, MediaPlayerSeekMode mode);
            status_t        prepareAsync_l();
            status_t        getDuration_l(int *msec);
            status_t        attachNewPlayer(const sp<IMediaPlayer>& player);
@@ -274,9 +276,9 @@ private:
    void*                       mCookie;
    media_player_states         mCurrentState;
    int                         mCurrentPosition;
    bool                        mCurrentSeekPrecise;
    MediaPlayerSeekMode         mCurrentSeekMode;
    int                         mSeekPosition;
    int                         mSeekPrecise;
    MediaPlayerSeekMode         mSeekMode;
    bool                        mPrepareSync;
    status_t                    mPrepareStatus;
    audio_stream_type_t         mStreamType;
+4 −4
Original line number Diff line number Diff line
@@ -246,12 +246,12 @@ public:
        return reply.readInt32();
    }

    status_t seekTo(int msec, bool precise)
    status_t seekTo(int msec, MediaPlayerSeekMode mode)
    {
        Parcel data, reply;
        data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
        data.writeInt32(msec);
        data.writeBool(precise);
        data.writeInt32(mode);
        remote()->transact(SEEK_TO, data, &reply);
        return reply.readInt32();
    }
@@ -575,8 +575,8 @@ status_t BnMediaPlayer::onTransact(
        case SEEK_TO: {
            CHECK_INTERFACE(IMediaPlayer, data, reply);
            int msec = data.readInt32();
            bool precise = data.readBool();
            reply->writeInt32(seekTo(msec, precise));
            MediaPlayerSeekMode mode = (MediaPlayerSeekMode)data.readInt32();
            reply->writeInt32(seekTo(msec, mode));
            return NO_ERROR;
        } break;
        case GET_CURRENT_POSITION: {
+17 −17
Original line number Diff line number Diff line
@@ -55,9 +55,9 @@ MediaPlayer::MediaPlayer()
    mStreamType = AUDIO_STREAM_MUSIC;
    mAudioAttributesParcel = NULL;
    mCurrentPosition = -1;
    mCurrentSeekPrecise = false;
    mCurrentSeekMode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC;
    mSeekPosition = -1;
    mSeekPrecise = false;
    mSeekMode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC;
    mCurrentState = MEDIA_PLAYER_IDLE;
    mPrepareSync = false;
    mPrepareStatus = NO_ERROR;
@@ -102,9 +102,9 @@ void MediaPlayer::disconnect()
void MediaPlayer::clear_l()
{
    mCurrentPosition = -1;
    mCurrentSeekPrecise = false;
    mCurrentSeekMode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC;
    mSeekPosition = -1;
    mSeekPrecise = false;
    mSeekMode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC;
    mVideoWidth = mVideoHeight = 0;
    mRetransmitEndpointValid = false;
}
@@ -512,9 +512,9 @@ status_t MediaPlayer::getDuration(int *msec)
    return getDuration_l(msec);
}

status_t MediaPlayer::seekTo_l(int msec, bool precise)
status_t MediaPlayer::seekTo_l(int msec, MediaPlayerSeekMode mode)
{
    ALOGV("seekTo (%d, %d)", msec, precise);
    ALOGV("seekTo (%d, %d)", msec, mode);
    if ((mPlayer != 0) && ( mCurrentState & ( MEDIA_PLAYER_STARTED | MEDIA_PLAYER_PREPARED |
            MEDIA_PLAYER_PAUSED |  MEDIA_PLAYER_PLAYBACK_COMPLETE) ) ) {
        if ( msec < 0 ) {
@@ -541,14 +541,14 @@ status_t MediaPlayer::seekTo_l(int msec, bool precise)

        // cache duration
        mCurrentPosition = msec;
        mCurrentSeekPrecise = precise;
        mCurrentSeekMode = mode;
        if (mSeekPosition < 0) {
            mSeekPosition = msec;
            mSeekPrecise = precise;
            return mPlayer->seekTo(msec, precise);
            mSeekMode = mode;
            return mPlayer->seekTo(msec, mode);
        }
        else {
            ALOGV("Seek in progress - queue up seekTo[%d, %d]", msec, precise);
            ALOGV("Seek in progress - queue up seekTo[%d, %d]", msec, mode);
            return NO_ERROR;
        }
    }
@@ -557,11 +557,11 @@ status_t MediaPlayer::seekTo_l(int msec, bool precise)
    return INVALID_OPERATION;
}

status_t MediaPlayer::seekTo(int msec, bool precise)
status_t MediaPlayer::seekTo(int msec, MediaPlayerSeekMode mode)
{
    mLockThreadId = getThreadId();
    Mutex::Autolock _l(mLock);
    status_t result = seekTo_l(msec, precise);
    status_t result = seekTo_l(msec, mode);
    mLockThreadId = 0;

    return result;
@@ -875,16 +875,16 @@ void MediaPlayer::notify(int msg, int ext1, int ext2, const Parcel *obj)
        break;
    case MEDIA_SEEK_COMPLETE:
        ALOGV("Received seek complete");
        if (mSeekPosition != mCurrentPosition || (!mSeekPrecise && mCurrentSeekPrecise)) {
            ALOGV("Executing queued seekTo(%d, %d)", mCurrentPosition, mCurrentSeekPrecise);
        if (mSeekPosition != mCurrentPosition || (mSeekMode != mCurrentSeekMode)) {
            ALOGV("Executing queued seekTo(%d, %d)", mCurrentPosition, mCurrentSeekMode);
            mSeekPosition = -1;
            mSeekPrecise = false;
            seekTo_l(mCurrentPosition, mCurrentSeekPrecise);
            mSeekMode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC;
            seekTo_l(mCurrentPosition, mCurrentSeekMode);
        }
        else {
            ALOGV("All seeks complete - return to regularly scheduled program");
            mCurrentPosition = mSeekPosition = -1;
            mCurrentSeekPrecise = mSeekPrecise = false;
            mCurrentSeekMode = mSeekMode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC;
        }
        break;
    case MEDIA_BUFFERING_UPDATE:
Loading