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

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

Merge "Fix for 4084554. DRM framework support for enabling/disabling copy...

Merge "Fix for 4084554. DRM framework support for enabling/disabling copy control settings from a DRM plugin"
parents 7a4b8bd5 3bbeaacf
Loading
Loading
Loading
Loading
+88 −188
Original line number Original line Diff line number Diff line
@@ -37,6 +37,63 @@


using namespace android;
using namespace android;


static void writeDecrptHandleToParcelData(
        const DecryptHandle* handle, Parcel* data) {
    data->writeInt32(handle->decryptId);
    data->writeString8(handle->mimeType);
    data->writeInt32(handle->decryptApiType);
    data->writeInt32(handle->status);

    int size = handle->copyControlVector.size();
    data->writeInt32(size);
    for(int i = 0; i < size; i++) {
        data->writeInt32(handle->copyControlVector.keyAt(i));
        data->writeInt32(handle->copyControlVector.valueAt(i));
    }

    if (NULL != handle->decryptInfo) {
        data->writeInt32(handle->decryptInfo->decryptBufferLength);
    } else {
        data->writeInt32(INVALID_BUFFER_LENGTH);
    }
}

static void readDecryptHandleFromParcelData(
        DecryptHandle* handle, const Parcel& data) {
    if (0 == data.dataAvail()) {
        return;
    }

    handle->decryptId = data.readInt32();
    handle->mimeType = data.readString8();
    handle->decryptApiType = data.readInt32();
    handle->status = data.readInt32();

    int size = data.readInt32();
    for (int i = 0; i < size; i ++) {
        handle->copyControlVector.add(
                (DrmCopyControl)data.readInt32(), data.readInt32());
    }

    handle->decryptInfo = NULL;
    const int bufferLen = data.readInt32();
    if (INVALID_BUFFER_LENGTH != bufferLen) {
        handle->decryptInfo = new DecryptInfo();
        handle->decryptInfo->decryptBufferLength = bufferLen;
    }
}

static void clearDecryptHandle(DecryptHandle* handle) {
    if (handle == NULL) {
        return;
    }
    if (handle->decryptInfo) {
        delete handle->decryptInfo;
        handle->decryptInfo = NULL;
    }
    handle->copyControlVector.clear();
}

int BpDrmManagerService::addUniqueId(int uniqueId) {
int BpDrmManagerService::addUniqueId(int uniqueId) {
    LOGV("add uniqueid");
    LOGV("add uniqueid");
    Parcel data, reply;
    Parcel data, reply;
@@ -344,16 +401,7 @@ status_t BpDrmManagerService::consumeRights(
    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
    data.writeInt32(uniqueId);
    data.writeInt32(uniqueId);


    data.writeInt32(decryptHandle->decryptId);
    writeDecrptHandleToParcelData(decryptHandle, &data);
    data.writeString8(decryptHandle->mimeType);
    data.writeInt32(decryptHandle->decryptApiType);
    data.writeInt32(decryptHandle->status);

    if (NULL != decryptHandle->decryptInfo) {
        data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength);
    } else {
        data.writeInt32(INVALID_BUFFER_LENGTH);
    }


    data.writeInt32(action);
    data.writeInt32(action);
    data.writeInt32(static_cast< int>(reserve));
    data.writeInt32(static_cast< int>(reserve));
@@ -370,16 +418,7 @@ status_t BpDrmManagerService::setPlaybackStatus(
    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
    data.writeInt32(uniqueId);
    data.writeInt32(uniqueId);


    data.writeInt32(decryptHandle->decryptId);
    writeDecrptHandleToParcelData(decryptHandle, &data);
    data.writeString8(decryptHandle->mimeType);
    data.writeInt32(decryptHandle->decryptApiType);
    data.writeInt32(decryptHandle->status);

    if (NULL != decryptHandle->decryptInfo) {
        data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength);
    } else {
        data.writeInt32(INVALID_BUFFER_LENGTH);
    }


    data.writeInt32(playbackStatus);
    data.writeInt32(playbackStatus);
    data.writeInt64(position);
    data.writeInt64(position);
@@ -560,15 +599,7 @@ DecryptHandle* BpDrmManagerService::openDecryptSession(
    DecryptHandle* handle = NULL;
    DecryptHandle* handle = NULL;
    if (0 != reply.dataAvail()) {
    if (0 != reply.dataAvail()) {
        handle = new DecryptHandle();
        handle = new DecryptHandle();
        handle->decryptId = reply.readInt32();
        readDecryptHandleFromParcelData(handle, reply);
        handle->mimeType = reply.readString8();
        handle->decryptApiType = reply.readInt32();
        handle->status = reply.readInt32();
        handle->decryptInfo = NULL;
        if (0 != reply.dataAvail()) {
            handle->decryptInfo = new DecryptInfo();
            handle->decryptInfo->decryptBufferLength = reply.readInt32();
        }
    }
    }
    return handle;
    return handle;
}
}
@@ -586,15 +617,7 @@ DecryptHandle* BpDrmManagerService::openDecryptSession(int uniqueId, const char*
    DecryptHandle* handle = NULL;
    DecryptHandle* handle = NULL;
    if (0 != reply.dataAvail()) {
    if (0 != reply.dataAvail()) {
        handle = new DecryptHandle();
        handle = new DecryptHandle();
        handle->decryptId = reply.readInt32();
        readDecryptHandleFromParcelData(handle, reply);
        handle->mimeType = reply.readString8();
        handle->decryptApiType = reply.readInt32();
        handle->status = reply.readInt32();
        handle->decryptInfo = NULL;
        if (0 != reply.dataAvail()) {
            handle->decryptInfo = new DecryptInfo();
            handle->decryptInfo->decryptBufferLength = reply.readInt32();
        }
    } else {
    } else {
        LOGV("no decryptHandle is generated in service side");
        LOGV("no decryptHandle is generated in service side");
    }
    }
@@ -608,16 +631,7 @@ status_t BpDrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* d
    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
    data.writeInt32(uniqueId);
    data.writeInt32(uniqueId);


    data.writeInt32(decryptHandle->decryptId);
    writeDecrptHandleToParcelData(decryptHandle, &data);
    data.writeString8(decryptHandle->mimeType);
    data.writeInt32(decryptHandle->decryptApiType);
    data.writeInt32(decryptHandle->status);

    if (NULL != decryptHandle->decryptInfo) {
        data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength);
    } else {
        data.writeInt32(INVALID_BUFFER_LENGTH);
    }


    remote()->transact(CLOSE_DECRYPT_SESSION, data, &reply);
    remote()->transact(CLOSE_DECRYPT_SESSION, data, &reply);


@@ -633,16 +647,8 @@ status_t BpDrmManagerService::initializeDecryptUnit(
    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
    data.writeInt32(uniqueId);
    data.writeInt32(uniqueId);


    data.writeInt32(decryptHandle->decryptId);
    writeDecrptHandleToParcelData(decryptHandle, &data);
    data.writeString8(decryptHandle->mimeType);
    data.writeInt32(decryptHandle->decryptApiType);
    data.writeInt32(decryptHandle->status);


    if (NULL != decryptHandle->decryptInfo) {
        data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength);
    } else {
        data.writeInt32(INVALID_BUFFER_LENGTH);
    }
    data.writeInt32(decryptUnitId);
    data.writeInt32(decryptUnitId);


    data.writeInt32(headerInfo->length);
    data.writeInt32(headerInfo->length);
@@ -661,16 +667,7 @@ status_t BpDrmManagerService::decrypt(
    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
    data.writeInt32(uniqueId);
    data.writeInt32(uniqueId);


    data.writeInt32(decryptHandle->decryptId);
    writeDecrptHandleToParcelData(decryptHandle, &data);
    data.writeString8(decryptHandle->mimeType);
    data.writeInt32(decryptHandle->decryptApiType);
    data.writeInt32(decryptHandle->status);

    if (NULL != decryptHandle->decryptInfo) {
        data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength);
    } else {
        data.writeInt32(INVALID_BUFFER_LENGTH);
    }


    data.writeInt32(decryptUnitId);
    data.writeInt32(decryptUnitId);
    data.writeInt32((*decBuffer)->length);
    data.writeInt32((*decBuffer)->length);
@@ -703,16 +700,7 @@ status_t BpDrmManagerService::finalizeDecryptUnit(
    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
    data.writeInt32(uniqueId);
    data.writeInt32(uniqueId);


    data.writeInt32(decryptHandle->decryptId);
    writeDecrptHandleToParcelData(decryptHandle, &data);
    data.writeString8(decryptHandle->mimeType);
    data.writeInt32(decryptHandle->decryptApiType);
    data.writeInt32(decryptHandle->status);

    if (NULL != decryptHandle->decryptInfo) {
        data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength);
    } else {
        data.writeInt32(INVALID_BUFFER_LENGTH);
    }


    data.writeInt32(decryptUnitId);
    data.writeInt32(decryptUnitId);


@@ -730,16 +718,7 @@ ssize_t BpDrmManagerService::pread(
    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
    data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());
    data.writeInt32(uniqueId);
    data.writeInt32(uniqueId);


    data.writeInt32(decryptHandle->decryptId);
    writeDecrptHandleToParcelData(decryptHandle, &data);
    data.writeString8(decryptHandle->mimeType);
    data.writeInt32(decryptHandle->decryptApiType);
    data.writeInt32(decryptHandle->status);

    if (NULL != decryptHandle->decryptInfo) {
        data.writeInt32(decryptHandle->decryptInfo->decryptBufferLength);
    } else {
        data.writeInt32(INVALID_BUFFER_LENGTH);
    }


    data.writeInt32(numBytes);
    data.writeInt32(numBytes);
    data.writeInt64(offset);
    data.writeInt64(offset);
@@ -1064,24 +1043,14 @@ status_t BnDrmManagerService::onTransact(
        const int uniqueId = data.readInt32();
        const int uniqueId = data.readInt32();


        DecryptHandle handle;
        DecryptHandle handle;
        handle.decryptId = data.readInt32();
        readDecryptHandleFromParcelData(&handle, data);
        handle.mimeType = data.readString8();
        handle.decryptApiType = data.readInt32();
        handle.status = data.readInt32();
        handle.decryptInfo = NULL;

        const int bufferLength = data.readInt32();
        if (INVALID_BUFFER_LENGTH != bufferLength) {
            handle.decryptInfo = new DecryptInfo();
            handle.decryptInfo->decryptBufferLength = bufferLength;
        }


        const status_t status
        const status_t status
            = consumeRights(uniqueId, &handle, data.readInt32(),
            = consumeRights(uniqueId, &handle, data.readInt32(),
                static_cast<bool>(data.readInt32()));
                static_cast<bool>(data.readInt32()));
        reply->writeInt32(status);
        reply->writeInt32(status);


        delete handle.decryptInfo; handle.decryptInfo = NULL;
        clearDecryptHandle(&handle);
        return DRM_NO_ERROR;
        return DRM_NO_ERROR;
    }
    }


@@ -1093,23 +1062,13 @@ status_t BnDrmManagerService::onTransact(
        const int uniqueId = data.readInt32();
        const int uniqueId = data.readInt32();


        DecryptHandle handle;
        DecryptHandle handle;
        handle.decryptId = data.readInt32();
        readDecryptHandleFromParcelData(&handle, data);
        handle.mimeType = data.readString8();
        handle.decryptApiType = data.readInt32();
        handle.status = data.readInt32();
        handle.decryptInfo = NULL;

        const int bufferLength = data.readInt32();
        if (INVALID_BUFFER_LENGTH != bufferLength) {
            handle.decryptInfo = new DecryptInfo();
            handle.decryptInfo->decryptBufferLength = bufferLength;
        }


        const status_t status
        const status_t status
            = setPlaybackStatus(uniqueId, &handle, data.readInt32(), data.readInt64());
            = setPlaybackStatus(uniqueId, &handle, data.readInt32(), data.readInt64());
        reply->writeInt32(status);
        reply->writeInt32(status);


        delete handle.decryptInfo; handle.decryptInfo = NULL;
        clearDecryptHandle(&handle);
        return DRM_NO_ERROR;
        return DRM_NO_ERROR;
    }
    }


@@ -1270,16 +1229,10 @@ status_t BnDrmManagerService::onTransact(
            = openDecryptSession(uniqueId, fd, data.readInt64(), data.readInt64());
            = openDecryptSession(uniqueId, fd, data.readInt64(), data.readInt64());


        if (NULL != handle) {
        if (NULL != handle) {
            reply->writeInt32(handle->decryptId);
            writeDecrptHandleToParcelData(handle, reply);
            reply->writeString8(handle->mimeType);
            clearDecryptHandle(handle);
            reply->writeInt32(handle->decryptApiType);
            reply->writeInt32(handle->status);
            if (NULL != handle->decryptInfo) {
                reply->writeInt32(handle->decryptInfo->decryptBufferLength);
                delete handle->decryptInfo; handle->decryptInfo = NULL;
            }
        }
            delete handle; handle = NULL;
            delete handle; handle = NULL;
        }
        return DRM_NO_ERROR;
        return DRM_NO_ERROR;
    }
    }


@@ -1294,18 +1247,13 @@ status_t BnDrmManagerService::onTransact(
        DecryptHandle* handle = openDecryptSession(uniqueId, uri.string());
        DecryptHandle* handle = openDecryptSession(uniqueId, uri.string());


        if (NULL != handle) {
        if (NULL != handle) {
            reply->writeInt32(handle->decryptId);
            writeDecrptHandleToParcelData(handle, reply);
            reply->writeString8(handle->mimeType);

            reply->writeInt32(handle->decryptApiType);
            clearDecryptHandle(handle);
            reply->writeInt32(handle->status);
            delete handle; handle = NULL;
            if (NULL != handle->decryptInfo) {
                reply->writeInt32(handle->decryptInfo->decryptBufferLength);
                delete handle->decryptInfo; handle->decryptInfo = NULL;
            }
        } else {
        } else {
            LOGV("NULL decryptHandle is returned");
            LOGV("NULL decryptHandle is returned");
        }
        }
        delete handle; handle = NULL;
        return DRM_NO_ERROR;
        return DRM_NO_ERROR;
    }
    }


@@ -1317,17 +1265,7 @@ status_t BnDrmManagerService::onTransact(
        const int uniqueId = data.readInt32();
        const int uniqueId = data.readInt32();


        DecryptHandle* handle = new DecryptHandle();
        DecryptHandle* handle = new DecryptHandle();
        handle->decryptId = data.readInt32();
        readDecryptHandleFromParcelData(handle, data);
        handle->mimeType = data.readString8();
        handle->decryptApiType = data.readInt32();
        handle->status = data.readInt32();
        handle->decryptInfo = NULL;

        const int bufferLength = data.readInt32();
        if (INVALID_BUFFER_LENGTH != bufferLength) {
            handle->decryptInfo = new DecryptInfo();
            handle->decryptInfo->decryptBufferLength = bufferLength;
        }


        const status_t status = closeDecryptSession(uniqueId, handle);
        const status_t status = closeDecryptSession(uniqueId, handle);
        reply->writeInt32(status);
        reply->writeInt32(status);
@@ -1342,17 +1280,8 @@ status_t BnDrmManagerService::onTransact(
        const int uniqueId = data.readInt32();
        const int uniqueId = data.readInt32();


        DecryptHandle handle;
        DecryptHandle handle;
        handle.decryptId = data.readInt32();
        readDecryptHandleFromParcelData(&handle, data);
        handle.mimeType = data.readString8();
        handle.decryptApiType = data.readInt32();
        handle.status = data.readInt32();
        handle.decryptInfo = NULL;


        const int bufferLength = data.readInt32();
        if (INVALID_BUFFER_LENGTH != bufferLength) {
            handle.decryptInfo = new DecryptInfo();
            handle.decryptInfo->decryptBufferLength = bufferLength;
        }
        const int decryptUnitId = data.readInt32();
        const int decryptUnitId = data.readInt32();


        //Filling Header info
        //Filling Header info
@@ -1364,7 +1293,7 @@ status_t BnDrmManagerService::onTransact(
            = initializeDecryptUnit(uniqueId, &handle, decryptUnitId, headerInfo);
            = initializeDecryptUnit(uniqueId, &handle, decryptUnitId, headerInfo);
        reply->writeInt32(status);
        reply->writeInt32(status);


        delete handle.decryptInfo; handle.decryptInfo = NULL;
        clearDecryptHandle(&handle);
        delete headerInfo; headerInfo = NULL;
        delete headerInfo; headerInfo = NULL;
        return DRM_NO_ERROR;
        return DRM_NO_ERROR;
    }
    }
@@ -1377,17 +1306,8 @@ status_t BnDrmManagerService::onTransact(
        const int uniqueId = data.readInt32();
        const int uniqueId = data.readInt32();


        DecryptHandle handle;
        DecryptHandle handle;
        handle.decryptId = data.readInt32();
        readDecryptHandleFromParcelData(&handle, data);
        handle.mimeType = data.readString8();
        handle.decryptApiType = data.readInt32();
        handle.status = data.readInt32();
        handle.decryptInfo = NULL;


        const int bufferLength = data.readInt32();
        if (INVALID_BUFFER_LENGTH != bufferLength) {
            handle.decryptInfo = new DecryptInfo();
            handle.decryptInfo->decryptBufferLength = bufferLength;
        }
        const int decryptUnitId = data.readInt32();
        const int decryptUnitId = data.readInt32();
        const int decBufferSize = data.readInt32();
        const int decBufferSize = data.readInt32();


@@ -1414,7 +1334,7 @@ status_t BnDrmManagerService::onTransact(
        reply->writeInt32(size);
        reply->writeInt32(size);
        reply->write(decBuffer->data, size);
        reply->write(decBuffer->data, size);


        delete handle.decryptInfo; handle.decryptInfo = NULL;
        clearDecryptHandle(&handle);
        delete encBuffer; encBuffer = NULL;
        delete encBuffer; encBuffer = NULL;
        delete decBuffer; decBuffer = NULL;
        delete decBuffer; decBuffer = NULL;
        delete [] buffer; buffer = NULL;
        delete [] buffer; buffer = NULL;
@@ -1430,22 +1350,12 @@ status_t BnDrmManagerService::onTransact(
        const int uniqueId = data.readInt32();
        const int uniqueId = data.readInt32();


        DecryptHandle handle;
        DecryptHandle handle;
        handle.decryptId = data.readInt32();
        readDecryptHandleFromParcelData(&handle, data);
        handle.mimeType = data.readString8();
        handle.decryptApiType = data.readInt32();
        handle.status = data.readInt32();
        handle.decryptInfo = NULL;

        const int bufferLength = data.readInt32();
        if (INVALID_BUFFER_LENGTH != bufferLength) {
            handle.decryptInfo = new DecryptInfo();
            handle.decryptInfo->decryptBufferLength = bufferLength;
        }


        const status_t status = finalizeDecryptUnit(uniqueId, &handle, data.readInt32());
        const status_t status = finalizeDecryptUnit(uniqueId, &handle, data.readInt32());
        reply->writeInt32(status);
        reply->writeInt32(status);


        delete handle.decryptInfo; handle.decryptInfo = NULL;
        clearDecryptHandle(&handle);
        return DRM_NO_ERROR;
        return DRM_NO_ERROR;
    }
    }


@@ -1457,17 +1367,7 @@ status_t BnDrmManagerService::onTransact(
        const int uniqueId = data.readInt32();
        const int uniqueId = data.readInt32();


        DecryptHandle handle;
        DecryptHandle handle;
        handle.decryptId = data.readInt32();
        readDecryptHandleFromParcelData(&handle, data);
        handle.mimeType = data.readString8();
        handle.decryptApiType = data.readInt32();
        handle.status = data.readInt32();
        handle.decryptInfo = NULL;

        const int bufferLength = data.readInt32();
        if (INVALID_BUFFER_LENGTH != bufferLength) {
            handle.decryptInfo = new DecryptInfo();
            handle.decryptInfo->decryptBufferLength = bufferLength;
        }


        const int numBytes = data.readInt32();
        const int numBytes = data.readInt32();
        char* buffer = new char[numBytes];
        char* buffer = new char[numBytes];
@@ -1480,7 +1380,7 @@ status_t BnDrmManagerService::onTransact(
            reply->write(buffer, result);
            reply->write(buffer, result);
        }
        }


        delete handle.decryptInfo; handle.decryptInfo = NULL;
        clearDecryptHandle(&handle);
        delete [] buffer, buffer = NULL;
        delete [] buffer, buffer = NULL;
        return DRM_NO_ERROR;
        return DRM_NO_ERROR;
    }
    }
+16 −0
Original line number Original line Diff line number Diff line
@@ -43,6 +43,17 @@ enum {
    DRM_NO_ERROR                            = NO_ERROR
    DRM_NO_ERROR                            = NO_ERROR
};
};


/**
 * copy control settings used in DecryptHandle::copyControlVector
 */
enum DrmCopyControl {
    DRM_COPY_CONTROL_BASE = 1000,
    // the key used to set the value for HDCP
    // if the associated value is 1, then HDCP is required
    // otherwise, HDCP is not required
    DRM_COPY_CONTROL_HDCP = DRM_COPY_CONTROL_BASE
};

/**
/**
 * Defines DRM Buffer
 * Defines DRM Buffer
 */
 */
@@ -280,6 +291,11 @@ public:
     * e.g. size of memory to be allocated to get the decrypted content.
     * e.g. size of memory to be allocated to get the decrypted content.
     */
     */
    DecryptInfo* decryptInfo;
    DecryptInfo* decryptInfo;
    /**
     * Defines a vector for the copy control settings sent from the DRM plugin
     * to the player
     */
    KeyedVector<DrmCopyControl, int> copyControlVector;


public:
public:
    DecryptHandle():
    DecryptHandle():