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

Commit 284ad271 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "CCodec: handle attaching 0-sized encrypted buffer" into tm-dev am: 8236387d am: a9d9d201

parents 070ab057 a9d9d201
Loading
Loading
Loading
Loading
+15 −11
Original line number Original line Diff line number Diff line
@@ -432,6 +432,10 @@ status_t CCodecBufferChannel::attachEncryptedBuffer(
    for (size_t i = 0; i < numSubSamples; ++i) {
    for (size_t i = 0; i < numSubSamples; ++i) {
        size += subSamples[i].mNumBytesOfClearData + subSamples[i].mNumBytesOfEncryptedData;
        size += subSamples[i].mNumBytesOfClearData + subSamples[i].mNumBytesOfEncryptedData;
    }
    }
    if (size == 0) {
        buffer->setRange(0, 0);
        return OK;
    }
    std::shared_ptr<C2BlockPool> pool = mBlockPools.lock()->inputPool;
    std::shared_ptr<C2BlockPool> pool = mBlockPools.lock()->inputPool;
    std::shared_ptr<C2LinearBlock> block;
    std::shared_ptr<C2LinearBlock> block;
    c2_status_t err = pool->fetchLinearBlock(
    c2_status_t err = pool->fetchLinearBlock(
@@ -439,6 +443,8 @@ status_t CCodecBufferChannel::attachEncryptedBuffer(
            secure ? kSecureUsage : kDefaultReadWriteUsage,
            secure ? kSecureUsage : kDefaultReadWriteUsage,
            &block);
            &block);
    if (err != C2_OK) {
    if (err != C2_OK) {
        ALOGI("[%s] attachEncryptedBuffer: fetchLinearBlock failed: size = %zu (%s) err = %d",
              mName, size, secure ? "secure" : "non-secure", err);
        return NO_MEMORY;
        return NO_MEMORY;
    }
    }
    if (!secure) {
    if (!secure) {
@@ -463,18 +469,9 @@ status_t CCodecBufferChannel::attachEncryptedBuffer(
                key, iv, mode, pattern, src, 0, subSamples, numSubSamples,
                key, iv, mode, pattern, src, 0, subSamples, numSubSamples,
                dst, &errorDetailMsg);
                dst, &errorDetailMsg);
        if (result < 0) {
        if (result < 0) {
            ALOGI("[%s] attachEncryptedBuffer: decrypt failed: result = %zd", mName, result);
            return result;
            return result;
        }
        }
        if (dst.type == DrmBufferType::SHARED_MEMORY) {
            C2WriteView view = block->map().get();
            if (view.error() != C2_OK) {
                return false;
            }
            if (view.size() < result) {
                return false;
            }
            memcpy(view.data(), mDecryptDestination->unsecurePointer(), result);
        }
    } else {
    } else {
        // Here we cast CryptoPlugin::SubSample to hardware::cas::native::V1_0::SubSample
        // Here we cast CryptoPlugin::SubSample to hardware::cas::native::V1_0::SubSample
        // directly, the structure definitions should match as checked in DescramblerImpl.cpp.
        // directly, the structure definitions should match as checked in DescramblerImpl.cpp.
@@ -523,16 +520,22 @@ status_t CCodecBufferChannel::attachEncryptedBuffer(
        }
        }


        if (result < codecDataOffset) {
        if (result < codecDataOffset) {
            ALOGD("invalid codec data offset: %zd, result %zd", codecDataOffset, result);
            ALOGD("[%s] invalid codec data offset: %zd, result %zd",
                  mName, codecDataOffset, result);
            return BAD_VALUE;
            return BAD_VALUE;
        }
        }
    }
    }
    if (!secure) {
    if (!secure) {
        C2WriteView view = block->map().get();
        C2WriteView view = block->map().get();
        if (view.error() != C2_OK) {
        if (view.error() != C2_OK) {
            ALOGI("[%s] attachEncryptedBuffer: block map error: %d (non-secure)",
                  mName, view.error());
            return UNKNOWN_ERROR;
            return UNKNOWN_ERROR;
        }
        }
        if (view.size() < result) {
        if (view.size() < result) {
            ALOGI("[%s] attachEncryptedBuffer: block size too small: size=%u result=%zd "
                  "(non-secure)",
                  mName, view.size(), result);
            return UNKNOWN_ERROR;
            return UNKNOWN_ERROR;
        }
        }
        memcpy(view.data(), mDecryptDestination->unsecurePointer(), result);
        memcpy(view.data(), mDecryptDestination->unsecurePointer(), result);
@@ -540,6 +543,7 @@ status_t CCodecBufferChannel::attachEncryptedBuffer(
    std::shared_ptr<C2Buffer> c2Buffer{C2Buffer::CreateLinearBuffer(
    std::shared_ptr<C2Buffer> c2Buffer{C2Buffer::CreateLinearBuffer(
            block->share(codecDataOffset, result - codecDataOffset, C2Fence{}))};
            block->share(codecDataOffset, result - codecDataOffset, C2Fence{}))};
    if (!buffer->copy(c2Buffer)) {
    if (!buffer->copy(c2Buffer)) {
        ALOGI("[%s] attachEncryptedBuffer: buffer copy failed", mName);
        return -ENOSYS;
        return -ENOSYS;
    }
    }
    return OK;
    return OK;
+2 −0
Original line number Original line Diff line number Diff line
@@ -5061,6 +5061,8 @@ status_t MediaCodec::onQueueInputBuffer(const sp<AMessage> &msg) {
        offset = buffer->offset();
        offset = buffer->offset();
        size = buffer->size();
        size = buffer->size();
        if (err != OK) {
        if (err != OK) {
            ALOGI("block model buffer attach failed: err = %s (%d)",
                  StrMediaError(err).c_str(), err);
            return err;
            return err;
        }
        }
    }
    }