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

Commit 64a385d5 authored by Ronghua Wu's avatar Ronghua Wu Committed by Android (Google) Code Review
Browse files

Merge "GenericSource: set DRM playback status." into lmp-dev

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


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


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


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


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

    sp<MetaData> fileMeta = extractor->getMetaData();
    sp<MetaData> fileMeta = extractor->getMetaData();
    if (fileMeta != NULL) {
    if (fileMeta != NULL) {
        int64_t duration;
        int64_t duration;
@@ -203,6 +215,28 @@ status_t NuPlayer::GenericSource::initFromDataSource() {
    return OK;
    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(
status_t NuPlayer::GenericSource::setBuffers(
        bool audio, Vector<MediaBuffer *> &buffers) {
        bool audio, Vector<MediaBuffer *> &buffers) {
    if (mIsWidevine && !audio) {
    if (mIsWidevine && !audio) {
@@ -398,6 +432,33 @@ void NuPlayer::GenericSource::start() {


        readBuffer(MEDIA_TRACK_TYPE_VIDEO);
        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() {
status_t NuPlayer::GenericSource::feedMoreTSData() {
@@ -872,6 +933,10 @@ status_t NuPlayer::GenericSource::seekTo(int64_t seekTimeUs) {
        readBuffer(MEDIA_TRACK_TYPE_AUDIO, seekTimeUs);
        readBuffer(MEDIA_TRACK_TYPE_AUDIO, seekTimeUs);
    }
    }


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


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


        if (err == OK) {
        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 changed during selection
            // formatChange && !seeking: track whose source is not changed during selection
            // formatChange && !seeking: track whose source is not changed during selection
            // !formatChange: normal seek
            // !formatChange: normal seek
+13 −0
Original line number Original line Diff line number Diff line
@@ -27,6 +27,8 @@


namespace android {
namespace android {


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


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


    virtual status_t feedMoreTSData();
    virtual status_t feedMoreTSData();


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


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


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


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


    status_t prefillCacheIfNecessary();
    status_t prefillCacheIfNecessary();


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


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

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


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