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

Commit 4a4bf221 authored by Gloria Wang's avatar Gloria Wang Committed by Android (Google) Code Review
Browse files

Merge "- Do not use global DrmManagerClient - Release the DrmManagerClient and...

Merge "- Do not use global DrmManagerClient - Release the DrmManagerClient and DecryptHandle in DataSource Fix for bug 3429811"
parents ab3e04c0 c2dc4729
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -75,7 +75,7 @@ public:
    static void RegisterDefaultSniffers();

    // for DRM
    virtual DecryptHandle* DrmInitialization(DrmManagerClient *client) {
    virtual DecryptHandle* DrmInitialization() {
        return NULL;
    }
    virtual void getDrmInfo(DecryptHandle **handle, DrmManagerClient **client) {};
+1 −1
Original line number Diff line number Diff line
@@ -38,7 +38,7 @@ public:

    virtual status_t getSize(off64_t *size);

    virtual DecryptHandle* DrmInitialization(DrmManagerClient *client);
    virtual DecryptHandle* DrmInitialization();

    virtual void getDrmInfo(DecryptHandle **handle, DrmManagerClient **client);

+0 −1
Original line number Diff line number Diff line
@@ -392,7 +392,6 @@ void AwesomePlayer::reset_l() {
    if (mDecryptHandle != NULL) {
            mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
                    Playback::STOP, 0);
            mDrmManagerClient->closeDecryptSession(mDecryptHandle);
            mDecryptHandle = NULL;
            mDrmManagerClient = NULL;
    }
+17 −24
Original line number Diff line number Diff line
@@ -38,12 +38,12 @@

namespace android {

DrmManagerClient* gDrmManagerClient = NULL;

class DRMSource : public MediaSource {
public:
    DRMSource(const sp<MediaSource> &mediaSource,
            DecryptHandle* decryptHandle, int32_t trackId, DrmBuffer* ipmpBox);
            DecryptHandle *decryptHandle,
            DrmManagerClient *managerClient,
            int32_t trackId, DrmBuffer *ipmpBox);

    virtual status_t start(MetaData *params = NULL);
    virtual status_t stop();
@@ -57,6 +57,7 @@ protected:
private:
    sp<MediaSource> mOriginalMediaSource;
    DecryptHandle* mDecryptHandle;
    DrmManagerClient* mDrmManagerClient;
    size_t mTrackId;
    mutable Mutex mDRMLock;
    size_t mNALLengthSize;
@@ -69,13 +70,16 @@ private:
////////////////////////////////////////////////////////////////////////////////

DRMSource::DRMSource(const sp<MediaSource> &mediaSource,
        DecryptHandle* decryptHandle, int32_t trackId, DrmBuffer* ipmpBox)
        DecryptHandle *decryptHandle,
        DrmManagerClient *managerClient,
        int32_t trackId, DrmBuffer *ipmpBox)
    : mOriginalMediaSource(mediaSource),
      mDecryptHandle(decryptHandle),
      mDrmManagerClient(managerClient),
      mTrackId(trackId),
      mNALLengthSize(0),
      mWantsNALFragments(false) {
    gDrmManagerClient->initializeDecryptUnit(
    mDrmManagerClient->initializeDecryptUnit(
            mDecryptHandle, trackId, ipmpBox);

    const char *mime;
@@ -100,7 +104,7 @@ DRMSource::DRMSource(const sp<MediaSource> &mediaSource,

DRMSource::~DRMSource() {
    Mutex::Autolock autoLock(mDRMLock);
    gDrmManagerClient->finalizeDecryptUnit(mDecryptHandle, mTrackId);
    mDrmManagerClient->finalizeDecryptUnit(mDecryptHandle, mTrackId);
}

status_t DRMSource::start(MetaData *params) {
@@ -140,7 +144,7 @@ status_t DRMSource::read(MediaBuffer **buffer, const ReadOptions *options) {
    decryptedDrmBuffer.data = new char[len];
    DrmBuffer *pDecryptedDrmBuffer = &decryptedDrmBuffer;

    if ((err = gDrmManagerClient->decrypt(mDecryptHandle, mTrackId,
    if ((err = mDrmManagerClient->decrypt(mDecryptHandle, mTrackId,
            &encryptedDrmBuffer, &pDecryptedDrmBuffer)) != DRM_NO_ERROR) {

        if (decryptedDrmBuffer.data) {
@@ -234,12 +238,12 @@ status_t DRMSource::read(MediaBuffer **buffer, const ReadOptions *options) {

DRMExtractor::DRMExtractor(const sp<DataSource> &source, const char* mime)
    : mDataSource(source),
      mDecryptHandle(NULL) {
      mDecryptHandle(NULL),
      mDrmManagerClient(NULL) {
    mOriginalExtractor = MediaExtractor::Create(source, mime);
    mOriginalExtractor->setDrmFlag(true);

    DrmManagerClient *client;
    source->getDrmInfo(&mDecryptHandle, &client);
    source->getDrmInfo(&mDecryptHandle, &mDrmManagerClient);
}

DRMExtractor::~DRMExtractor() {
@@ -260,7 +264,8 @@ sp<MediaSource> DRMExtractor::getTrack(size_t index) {
    ipmpBox.data = mOriginalExtractor->getDrmTrackInfo(trackID, &(ipmpBox.length));
    CHECK(ipmpBox.length > 0);

    return new DRMSource(originalMediaSource, mDecryptHandle, trackID, &ipmpBox);
    return new DRMSource(originalMediaSource, mDecryptHandle, mDrmManagerClient,
            trackID, &ipmpBox);
}

sp<MetaData> DRMExtractor::getTrackMetaData(size_t index, uint32_t flags) {
@@ -271,22 +276,10 @@ sp<MetaData> DRMExtractor::getMetaData() {
    return mOriginalExtractor->getMetaData();
}

static Mutex gDRMSnifferMutex;
bool SniffDRM(
    const sp<DataSource> &source, String8 *mimeType, float *confidence,
        sp<AMessage> *) {
    {
        Mutex::Autolock autoLock(gDRMSnifferMutex);
        if (gDrmManagerClient == NULL) {
            gDrmManagerClient = new DrmManagerClient();
        }

        if (gDrmManagerClient == NULL) {
            return false;
        }
    }

    DecryptHandle *decryptHandle = source->DrmInitialization(gDrmManagerClient);
    DecryptHandle *decryptHandle = source->DrmInitialization();

    if (decryptHandle != NULL) {
        if (decryptHandle->decryptApiType == DecryptApiType::CONTAINER_BASED) {
+18 −3
Original line number Diff line number Diff line
@@ -60,6 +60,17 @@ FileSource::~FileSource() {
        delete[] mDrmBuf;
        mDrmBuf = NULL;
    }

    if (mDecryptHandle != NULL) {
        // To release mDecryptHandle
        mDrmManagerClient->closeDecryptSession(mDecryptHandle);
        mDecryptHandle = NULL;
    }

    if (mDrmManagerClient != NULL) {
        delete mDrmManagerClient;
        mDrmManagerClient = NULL;
    }
}

status_t FileSource::initCheck() const {
@@ -113,11 +124,14 @@ status_t FileSource::getSize(off64_t *size) {
    return OK;
}

DecryptHandle* FileSource::DrmInitialization(DrmManagerClient* client) {
    if (client == NULL) {
DecryptHandle* FileSource::DrmInitialization() {
    if (mDrmManagerClient == NULL) {
        mDrmManagerClient = new DrmManagerClient();
    }

    if (mDrmManagerClient == NULL) {
        return NULL;
    }
    mDrmManagerClient = client;

    if (mDecryptHandle == NULL) {
        mDecryptHandle = mDrmManagerClient->openDecryptSession(
@@ -125,6 +139,7 @@ DecryptHandle* FileSource::DrmInitialization(DrmManagerClient* client) {
    }

    if (mDecryptHandle == NULL) {
        delete mDrmManagerClient;
        mDrmManagerClient = NULL;
    }

Loading