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

Commit 80276879 authored by Ronghua Wu's avatar Ronghua Wu
Browse files

GenericSource: set DRM playback status.

Bug: 17307158
Change-Id: I36b801a9b67831b618930cf1241756bb9644b4fd
parent d42173a4
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ LOCAL_SHARED_LIBRARIES := \
    libcamera_client            \
    libcrypto                   \
    libcutils                   \
    libdrmframework             \
    liblog                      \
    libdl                       \
    libgui                      \
+73 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@
#include <media/stagefright/MediaExtractor.h>
#include <media/stagefright/MediaSource.h>
#include <media/stagefright/MetaData.h>
#include "../../libstagefright/include/DRMExtractor.h"
#include "../../libstagefright/include/NuCachedSource2.h"
#include "../../libstagefright/include/WVMExtractor.h"

@@ -49,6 +50,7 @@ NuPlayer::GenericSource::GenericSource(
      mIsWidevine(false),
      mUIDValid(uidValid),
      mUID(uid),
      mDrmManagerClient(NULL),
      mMetaDataSize(-1ll),
      mBitrate(-1ll),
      mPollBufferingGeneration(0) {
@@ -57,12 +59,18 @@ NuPlayer::GenericSource::GenericSource(
}

void NuPlayer::GenericSource::resetDataSource() {
    mAudioTimeUs = 0;
    mVideoTimeUs = 0;
    mHTTPService.clear();
    mUri.clear();
    mUriHeaders.clear();
    mFd = -1;
    mOffset = 0;
    mLength = 0;
    setDrmPlaybackStatusIfNeeded(Playback::STOP, 0);
    mDecryptHandle = NULL;
    mDrmManagerClient = NULL;
    mStarted = false;
}

status_t NuPlayer::GenericSource::setDataSource(
@@ -130,6 +138,10 @@ status_t NuPlayer::GenericSource::initFromDataSource() {
        return UNKNOWN_ERROR;
    }

    if (extractor->getDrmFlag()) {
        checkDrmStatus(mDataSource);
    }

    sp<MetaData> fileMeta = extractor->getMetaData();
    if (fileMeta != NULL) {
        int64_t duration;
@@ -199,6 +211,28 @@ status_t NuPlayer::GenericSource::initFromDataSource() {
    return OK;
}

void NuPlayer::GenericSource::checkDrmStatus(const sp<DataSource>& dataSource) {
    dataSource->getDrmInfo(mDecryptHandle, &mDrmManagerClient);
    if (mDecryptHandle != NULL) {
        CHECK(mDrmManagerClient);
        if (RightsStatus::RIGHTS_VALID != mDecryptHandle->status) {
            sp<AMessage> msg = dupNotify();
            msg->setInt32("what", kWhatDrmNoLicense);
            msg->post();
        }
    }
}

int64_t NuPlayer::GenericSource::getLastReadPosition() {
    if (mAudioTrack.mSource != NULL) {
        return mAudioTimeUs;
    } else if (mVideoTrack.mSource != NULL) {
        return mVideoTimeUs;
    } else {
        return 0;
    }
}

status_t NuPlayer::GenericSource::setBuffers(
        bool audio, Vector<MediaBuffer *> &buffers) {
    if (mIsWidevine && !audio) {
@@ -394,6 +428,33 @@ void NuPlayer::GenericSource::start() {

        readBuffer(MEDIA_TRACK_TYPE_VIDEO);
    }

    setDrmPlaybackStatusIfNeeded(Playback::START, getLastReadPosition() / 1000);
    mStarted = true;
}

void NuPlayer::GenericSource::stop() {
    // nothing to do, just account for DRM playback status
    setDrmPlaybackStatusIfNeeded(Playback::STOP, 0);
    mStarted = false;
}

void NuPlayer::GenericSource::pause() {
    // nothing to do, just account for DRM playback status
    setDrmPlaybackStatusIfNeeded(Playback::PAUSE, 0);
    mStarted = false;
}

void NuPlayer::GenericSource::resume() {
    // nothing to do, just account for DRM playback status
    setDrmPlaybackStatusIfNeeded(Playback::START, getLastReadPosition() / 1000);
    mStarted = true;
}

void NuPlayer::GenericSource::setDrmPlaybackStatusIfNeeded(int playbackStatus, int64_t position) {
    if (mDecryptHandle != NULL) {
        mDrmManagerClient->setPlaybackStatus(mDecryptHandle, playbackStatus, position);
    }
}

status_t NuPlayer::GenericSource::feedMoreTSData() {
@@ -868,6 +929,10 @@ status_t NuPlayer::GenericSource::seekTo(int64_t seekTimeUs) {
        readBuffer(MEDIA_TRACK_TYPE_AUDIO, seekTimeUs);
    }

    setDrmPlaybackStatusIfNeeded(Playback::START, seekTimeUs / 1000);
    if (!mStarted) {
        setDrmPlaybackStatusIfNeeded(Playback::PAUSE, 0);
    }
    return OK;
}

@@ -985,6 +1050,14 @@ void NuPlayer::GenericSource::readBuffer(
        options.clearSeekTo();

        if (err == OK) {
            int64_t timeUs;
            CHECK(mbuf->meta_data()->findInt64(kKeyTime, &timeUs));
            if (trackType == MEDIA_TRACK_TYPE_AUDIO) {
                mAudioTimeUs = timeUs;
            } else if (trackType == MEDIA_TRACK_TYPE_VIDEO) {
                mVideoTimeUs = timeUs;
            }

            // formatChange && seeking: track whose source is changed during selection
            // formatChange && !seeking: track whose source is not changed during selection
            // !formatChange: normal seek
+13 −0
Original line number Diff line number Diff line
@@ -27,6 +27,8 @@

namespace android {

class DecryptHandle;
class DrmManagerClient;
struct AnotherPacketSource;
struct ARTSPController;
struct DataSource;
@@ -49,6 +51,9 @@ struct NuPlayer::GenericSource : public NuPlayer::Source {
    virtual void prepareAsync();

    virtual void start();
    virtual void stop();
    virtual void pause();
    virtual void resume();

    virtual status_t feedMoreTSData();

@@ -90,7 +95,9 @@ private:
    };

    Track mAudioTrack;
    int64_t mAudioTimeUs;
    Track mVideoTrack;
    int64_t mVideoTimeUs;
    Track mSubtitleTrack;
    Track mTimedTextTrack;

@@ -111,6 +118,9 @@ private:
    sp<DataSource> mDataSource;
    sp<NuCachedSource2> mCachedSource;
    sp<WVMExtractor> mWVMExtractor;
    DrmManagerClient *mDrmManagerClient;
    sp<DecryptHandle> mDecryptHandle;
    bool mStarted;
    String8 mContentType;
    AString mSniffedMIME;
    off64_t mMetaDataSize;
@@ -122,6 +132,9 @@ private:
    void resetDataSource();

    status_t initFromDataSource();
    void checkDrmStatus(const sp<DataSource>& dataSource);
    int64_t getLastReadPosition();
    void setDrmPlaybackStatusIfNeeded(int playbackStatus, int64_t position);

    status_t prefillCacheIfNecessary();

+6 −0
Original line number Diff line number Diff line
@@ -1915,6 +1915,12 @@ void NuPlayer::onSourceNotify(const sp<AMessage> &msg) {
            break;
        }

        case Source::kWhatDrmNoLicense:
        {
            notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_DRM_NO_LICENSE);
            break;
        }

        default:
            TRESPASS();
    }
+1 −0
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@ struct NuPlayer::Source : public AHandler {
        kWhatSubtitleData,
        kWhatTimedTextData,
        kWhatQueueDecoderShutdown,
        kWhatDrmNoLicense,
    };

    // The provides message is used to notify the player about various