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

Commit c481b501 authored by Jeff Tinker's avatar Jeff Tinker
Browse files

Pass crypto source data using a shared buffer

MediaCodec was using a binder transaction buffer
to pass encryption source data for protected content.
On some 4K content, the max binder transaction buffer
size was being exceeded.  This change uses a shared
buffer for the encryption source data instead of a
binder transaction buffer, which avoids the problem and
may be more efficient.

bug: 20027687
Change-Id: I36a24ebf600d7e1064b78e48b167fdc29b2c65e9
parent e41b5f31
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -25,6 +25,7 @@
namespace android {
namespace android {


struct AString;
struct AString;
struct IMemory;


struct ICrypto : public IInterface {
struct ICrypto : public IInterface {
    DECLARE_META_INTERFACE(Crypto);
    DECLARE_META_INTERFACE(Crypto);
@@ -48,7 +49,7 @@ struct ICrypto : public IInterface {
            const uint8_t key[16],
            const uint8_t key[16],
            const uint8_t iv[16],
            const uint8_t iv[16],
            CryptoPlugin::Mode mode,
            CryptoPlugin::Mode mode,
            const void *srcPtr,
            const sp<IMemory> &sharedBuffer, size_t offset,
            const CryptoPlugin::SubSample *subSamples, size_t numSubSamples,
            const CryptoPlugin::SubSample *subSamples, size_t numSubSamples,
            void *dstPtr,
            void *dstPtr,
            AString *errorDetailMsg) = 0;
            AString *errorDetailMsg) = 0;
+5 −1
Original line number Original line Diff line number Diff line
@@ -30,8 +30,10 @@ struct AMessage;
struct AReplyToken;
struct AReplyToken;
struct AString;
struct AString;
struct CodecBase;
struct CodecBase;
struct ICrypto;
struct IBatteryStats;
struct IBatteryStats;
struct ICrypto;
struct IMemory;
struct MemoryDealer;
struct SoftwareRenderer;
struct SoftwareRenderer;
struct Surface;
struct Surface;


@@ -214,6 +216,7 @@ private:
        uint32_t mBufferID;
        uint32_t mBufferID;
        sp<ABuffer> mData;
        sp<ABuffer> mData;
        sp<ABuffer> mEncryptedData;
        sp<ABuffer> mEncryptedData;
        sp<IMemory> mSharedEncryptedBuffer;
        sp<AMessage> mNotify;
        sp<AMessage> mNotify;
        sp<AMessage> mFormat;
        sp<AMessage> mFormat;
        bool mOwnedByClient;
        bool mOwnedByClient;
@@ -232,6 +235,7 @@ private:
    sp<AMessage> mOutputFormat;
    sp<AMessage> mOutputFormat;
    sp<AMessage> mInputFormat;
    sp<AMessage> mInputFormat;
    sp<AMessage> mCallback;
    sp<AMessage> mCallback;
    sp<MemoryDealer> mDealer;


    bool mBatteryStatNotified;
    bool mBatteryStatNotified;
    bool mIsVideo;
    bool mIsVideo;
+15 −9
Original line number Original line Diff line number Diff line
@@ -19,6 +19,7 @@
#include <utils/Log.h>
#include <utils/Log.h>


#include <binder/Parcel.h>
#include <binder/Parcel.h>
#include <binder/IMemory.h>
#include <media/ICrypto.h>
#include <media/ICrypto.h>
#include <media/stagefright/MediaErrors.h>
#include <media/stagefright/MediaErrors.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/ADebug.h>
@@ -97,7 +98,7 @@ struct BpCrypto : public BpInterface<ICrypto> {
            const uint8_t key[16],
            const uint8_t key[16],
            const uint8_t iv[16],
            const uint8_t iv[16],
            CryptoPlugin::Mode mode,
            CryptoPlugin::Mode mode,
            const void *srcPtr,
            const sp<IMemory> &sharedBuffer, size_t offset,
            const CryptoPlugin::SubSample *subSamples, size_t numSubSamples,
            const CryptoPlugin::SubSample *subSamples, size_t numSubSamples,
            void *dstPtr,
            void *dstPtr,
            AString *errorDetailMsg) {
            AString *errorDetailMsg) {
@@ -126,7 +127,8 @@ struct BpCrypto : public BpInterface<ICrypto> {
        }
        }


        data.writeInt32(totalSize);
        data.writeInt32(totalSize);
        data.write(srcPtr, totalSize);
        data.writeStrongBinder(IInterface::asBinder(sharedBuffer));
        data.writeInt32(offset);


        data.writeInt32(numSubSamples);
        data.writeInt32(numSubSamples);
        data.write(subSamples, sizeof(CryptoPlugin::SubSample) * numSubSamples);
        data.write(subSamples, sizeof(CryptoPlugin::SubSample) * numSubSamples);
@@ -245,8 +247,9 @@ status_t BnCrypto::onTransact(
            data.read(iv, sizeof(iv));
            data.read(iv, sizeof(iv));


            size_t totalSize = data.readInt32();
            size_t totalSize = data.readInt32();
            void *srcData = malloc(totalSize);
            sp<IMemory> sharedBuffer =
            data.read(srcData, totalSize);
                interface_cast<IMemory>(data.readStrongBinder());
            int32_t offset = data.readInt32();


            int32_t numSubSamples = data.readInt32();
            int32_t numSubSamples = data.readInt32();


@@ -265,15 +268,21 @@ status_t BnCrypto::onTransact(
            }
            }


            AString errorDetailMsg;
            AString errorDetailMsg;
            ssize_t result = decrypt(
            ssize_t result;

            if (offset + totalSize > sharedBuffer->size()) {
                result = -EINVAL;
            } else {
                result = decrypt(
                    secure,
                    secure,
                    key,
                    key,
                    iv,
                    iv,
                    mode,
                    mode,
                    srcData,
                    sharedBuffer, offset,
                    subSamples, numSubSamples,
                    subSamples, numSubSamples,
                    dstPtr,
                    dstPtr,
                    &errorDetailMsg);
                    &errorDetailMsg);
            }


            reply->writeInt32(result);
            reply->writeInt32(result);


@@ -294,9 +303,6 @@ status_t BnCrypto::onTransact(
            delete[] subSamples;
            delete[] subSamples;
            subSamples = NULL;
            subSamples = NULL;


            free(srcData);
            srcData = NULL;

            return OK;
            return OK;
        }
        }


+4 −1
Original line number Original line Diff line number Diff line
@@ -22,6 +22,7 @@


#include "Crypto.h"
#include "Crypto.h"


#include <binder/IMemory.h>
#include <media/hardware/CryptoAPI.h>
#include <media/hardware/CryptoAPI.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/AString.h>
#include <media/stagefright/foundation/AString.h>
@@ -238,7 +239,7 @@ ssize_t Crypto::decrypt(
        const uint8_t key[16],
        const uint8_t key[16],
        const uint8_t iv[16],
        const uint8_t iv[16],
        CryptoPlugin::Mode mode,
        CryptoPlugin::Mode mode,
        const void *srcPtr,
        const sp<IMemory> &sharedBuffer, size_t offset,
        const CryptoPlugin::SubSample *subSamples, size_t numSubSamples,
        const CryptoPlugin::SubSample *subSamples, size_t numSubSamples,
        void *dstPtr,
        void *dstPtr,
        AString *errorDetailMsg) {
        AString *errorDetailMsg) {
@@ -252,6 +253,8 @@ ssize_t Crypto::decrypt(
        return -EINVAL;
        return -EINVAL;
    }
    }


    const void *srcPtr = static_cast<uint8_t *>(sharedBuffer->pointer()) + offset;

    return mPlugin->decrypt(
    return mPlugin->decrypt(
            secure, key, iv, mode, srcPtr, subSamples, numSubSamples, dstPtr,
            secure, key, iv, mode, srcPtr, subSamples, numSubSamples, dstPtr,
            errorDetailMsg);
            errorDetailMsg);
+1 −1
Original line number Original line Diff line number Diff line
@@ -52,7 +52,7 @@ struct Crypto : public BnCrypto {
            const uint8_t key[16],
            const uint8_t key[16],
            const uint8_t iv[16],
            const uint8_t iv[16],
            CryptoPlugin::Mode mode,
            CryptoPlugin::Mode mode,
            const void *srcPtr,
            const sp<IMemory> &sharedBuffer, size_t offset,
            const CryptoPlugin::SubSample *subSamples, size_t numSubSamples,
            const CryptoPlugin::SubSample *subSamples, size_t numSubSamples,
            void *dstPtr,
            void *dstPtr,
            AString *errorDetailMsg);
            AString *errorDetailMsg);
Loading