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

Commit f69e5303 authored by Andreas Huber's avatar Andreas Huber
Browse files

Some refactoring and cleanup of now obsolete crypto fields.

codec commandline tool no longer supports decryption.

Change-Id: I7b10be6524631b20ac5d361d47949b00addf4a93
parent 97b5d0d5
Loading
Loading
Loading
Loading
+12 −122
Original line number Diff line number Diff line
@@ -39,8 +39,7 @@ static void usage(const char *me) {
    fprintf(stderr, "usage: %s [-a] use audio\n"
                    "\t\t[-v] use video\n"
                    "\t\t[-p] playback\n"
                    "\t\t[-S] allocate buffers from a surface\n"
                    "\t\t[-D] decrypt input buffers\n",
                    "\t\t[-S] allocate buffers from a surface\n",
                    me);

    exit(1);
@@ -61,33 +60,6 @@ struct CodecState {
    bool mIsAudio;
};

static sp<ICrypto> makeCrypto(
        const uint8_t uuid[16], const void *data, size_t size) {
    sp<IServiceManager> sm = defaultServiceManager();

    sp<IBinder> binder =
        sm->getService(String16("media.player"));

    sp<IMediaPlayerService> service =
        interface_cast<IMediaPlayerService>(binder);

    CHECK(service != NULL);

    sp<ICrypto> crypto = service->makeCrypto();

    if (crypto == NULL || crypto->initCheck() != OK) {
        return NULL;
    }

    status_t err = crypto->createPlugin(uuid, data, size);

    if (err != OK) {
        return NULL;
    }

    return crypto;
}

}  // namespace android

static int decode(
@@ -95,8 +67,7 @@ static int decode(
        const char *path,
        bool useAudio,
        bool useVideo,
        const android::sp<android::Surface> &surface,
        bool decryptInputBuffers) {
        const android::sp<android::Surface> &surface) {
    using namespace android;

    static int64_t kTimeout = 500ll;
@@ -107,8 +78,6 @@ static int decode(
        return 1;
    }

    sp<ICrypto> crypto;

    KeyedVector<size_t, CodecState> stateByTrack;

    bool haveAudio = false;
@@ -144,62 +113,14 @@ static int decode(
        state->mNumBuffersDecoded = 0;
        state->mIsAudio = isAudio;

        if (decryptInputBuffers && crypto == NULL) {
            sp<ABuffer> emm;
            CHECK(format->findBuffer("emm", &emm));

            sp<ABuffer> ecm;
            CHECK(format->findBuffer("ecm", &ecm));

            struct WVOpaqueInitData {
                uint8_t mEMM[16];
                uint8_t mECM[32];

            } opaque;

            CHECK_EQ(emm->size(), sizeof(opaque.mEMM));
            memcpy(opaque.mEMM, emm->data(), emm->size());

            CHECK_EQ(ecm->size(), 80u);
            // bytes 16..47 of the original ecm stream data.
            memcpy(opaque.mECM, ecm->data() + 16, 32);

            static const uint8_t kUUIDWidevine[16] = {
                0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
                0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
            };

            crypto = makeCrypto(kUUIDWidevine, &opaque, sizeof(opaque));
            CHECK(crypto != NULL);
            CHECK_EQ(crypto->initCheck(), (status_t)OK);
        }

        if (decryptInputBuffers
                && crypto->requiresSecureDecoderComponent(mime.c_str())) {
            static const MediaCodecList *list = MediaCodecList::getInstance();

            ssize_t index =
                list->findCodecByType(mime.c_str(), false /* encoder */);

            CHECK_GE(index, 0);

            const char *componentName = list->getCodecName(index);

            AString fullName = componentName;
            fullName.append(".secure");

            state->mCodec = MediaCodec::CreateByComponentName(
                    looper, fullName.c_str());
        } else {
        state->mCodec = MediaCodec::CreateByType(
                looper, mime.c_str(), false /* encoder */);
        }

        CHECK(state->mCodec != NULL);

        err = state->mCodec->configure(
                format, isVideo ? surface : NULL,
                crypto,
                NULL /* crypto */,
                0 /* flags */);

        CHECK_EQ(err, (status_t)OK);
@@ -289,35 +210,12 @@ static int decode(

                    uint32_t bufferFlags = 0;

                    uint32_t sampleFlags;
                    err = extractor->getSampleFlags(&sampleFlags);
                    CHECK_EQ(err, (status_t)OK);

                    if (sampleFlags & NuMediaExtractor::SAMPLE_FLAG_ENCRYPTED) {
                        CHECK(decryptInputBuffers);

                        CryptoPlugin::SubSample ss;
                        ss.mNumBytesOfClearData = 0;
                        ss.mNumBytesOfEncryptedData = buffer->size();

                        err = state->mCodec->queueSecureInputBuffer(
                                index,
                                0 /* offset */,
                                &ss,
                                1 /* numSubSamples */,
                                NULL /* key */,
                                NULL /* iv */,
                                CryptoPlugin::kMode_AES_WV,
                                timeUs,
                                bufferFlags);
                    } else {
                    err = state->mCodec->queueInputBuffer(
                            index,
                            0 /* offset */,
                            buffer->size(),
                            timeUs,
                            bufferFlags);
                    }

                    CHECK_EQ(err, (status_t)OK);

@@ -451,7 +349,6 @@ int main(int argc, char **argv) {
    bool useVideo = false;
    bool playback = false;
    bool useSurface = false;
    bool decryptInputBuffers = false;

    int res;
    while ((res = getopt(argc, argv, "havpSD")) >= 0) {
@@ -480,12 +377,6 @@ int main(int argc, char **argv) {
                break;
            }

            case 'D':
            {
                decryptInputBuffers = true;
                break;
            }

            case '?':
            case 'h':
            default:
@@ -557,8 +448,7 @@ int main(int argc, char **argv) {
        player->stop();
        player->reset();
    } else {
        decode(looper, argv[0],
               useAudio, useVideo, surface, decryptInputBuffers);
        decode(looper, argv[0], useAudio, useVideo, surface);
    }

    if (playback || (useSurface && useVideo)) {
+1 −4
Original line number Diff line number Diff line
@@ -129,10 +129,6 @@ enum {

    kKeyRequiresSecureBuffers = 'secu',  // bool (int32_t)

    kKeyScrambling        = 'scrm',  // int32_t
    kKeyEMM               = 'emm ',  // raw data
    kKeyECM               = 'ecm ',  // raw data

    kKeyIsADTS            = 'adts',  // bool (int32_t)

    // If a MediaBuffer's data represents (at least partially) encrypted
@@ -156,6 +152,7 @@ enum {
    kKeyPlainSizes        = 'plai',  // size_t[]
    kKeyCryptoKey         = 'cryK',  // uint8_t[16]
    kKeyCryptoIV          = 'cryI',  // uint8_t[16]
    kKeyCryptoMode        = 'cryM',  // int32_t
};

enum {
+2 −2
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ struct AMessage;
struct MediaBuffer;
struct MediaExtractor;
struct MediaSource;
struct MetaData;

struct NuMediaExtractor : public RefBase {
    enum SampleFlags {
@@ -57,7 +58,7 @@ struct NuMediaExtractor : public RefBase {
    status_t readSampleData(const sp<ABuffer> &buffer);
    status_t getSampleTrackIndex(size_t *trackIndex);
    status_t getSampleTime(int64_t *sampleTimeUs);
    status_t getSampleFlags(uint32_t *sampleFlags);
    status_t getSampleMeta(sp<MetaData> *sampleMeta);

protected:
    virtual ~NuMediaExtractor();
@@ -73,7 +74,6 @@ private:
        status_t mFinalResult;
        MediaBuffer *mSample;
        int64_t mSampleTimeUs;
        uint32_t mSampleFlags;

        uint32_t mTrackFlags;  // bitmask of "TrackFlags"
    };
+4 −33
Original line number Diff line number Diff line
@@ -289,20 +289,6 @@ status_t NuMediaExtractor::getTrackFormat(
        msg->setBuffer("csd-1", buffer);
    }

    if (meta->findData(kKeyEMM, &type, &data, &size)) {
        sp<ABuffer> emm = new ABuffer(size);
        memcpy(emm->data(), data, size);

        msg->setBuffer("emm", emm);
    }

    if (meta->findData(kKeyECM, &type, &data, &size)) {
        sp<ABuffer> ecm = new ABuffer(size);
        memcpy(ecm->data(), data, size);

        msg->setBuffer("ecm", ecm);
    }

    *format = msg;

    return OK;
@@ -338,7 +324,6 @@ status_t NuMediaExtractor::selectTrack(size_t index) {
    info->mFinalResult = OK;
    info->mSample = NULL;
    info->mSampleTimeUs = -1ll;
    info->mSampleFlags = 0;
    info->mTrackFlags = 0;

    const char *mime;
@@ -360,7 +345,6 @@ void NuMediaExtractor::releaseTrackSamples() {
            info->mSample = NULL;

            info->mSampleTimeUs = -1ll;
            info->mSampleFlags = 0;
        }
    }
}
@@ -379,7 +363,6 @@ ssize_t NuMediaExtractor::fetchTrackSamples(int64_t seekTimeUs) {
                info->mSample->release();
                info->mSample = NULL;
                info->mSampleTimeUs = -1ll;
                info->mSampleFlags = 0;
            }
        } else if (info->mFinalResult != OK) {
            continue;
@@ -397,25 +380,11 @@ ssize_t NuMediaExtractor::fetchTrackSamples(int64_t seekTimeUs) {

                info->mFinalResult = err;
                info->mSampleTimeUs = -1ll;
                info->mSampleFlags = 0;
                continue;
            } else {
                CHECK(info->mSample != NULL);
                CHECK(info->mSample->meta_data()->findInt64(
                            kKeyTime, &info->mSampleTimeUs));

                info->mSampleFlags = 0;

                int32_t val;
                if (info->mSample->meta_data()->findInt32(
                            kKeyIsSyncFrame, &val) && val != 0) {
                    info->mSampleFlags |= SAMPLE_FLAG_SYNC;
                }

                if (info->mSample->meta_data()->findInt32(
                            kKeyScrambling, &val) && val != 0) {
                    info->mSampleFlags |= SAMPLE_FLAG_ENCRYPTED;
                }
            }
        }

@@ -524,7 +493,9 @@ status_t NuMediaExtractor::getSampleTime(int64_t *sampleTimeUs) {
    return OK;
}

status_t NuMediaExtractor::getSampleFlags(uint32_t *sampleFlags) {
status_t NuMediaExtractor::getSampleMeta(sp<MetaData> *sampleMeta) {
    *sampleMeta = NULL;

    ssize_t minIndex = fetchTrackSamples();

    if (minIndex < 0) {
@@ -532,7 +503,7 @@ status_t NuMediaExtractor::getSampleFlags(uint32_t *sampleFlags) {
    }

    TrackInfo *info = &mSelectedTracks.editItemAt(minIndex);
    *sampleFlags = info->mSampleFlags;
    *sampleMeta = info->mSample->meta_data();

    return OK;
}
+0 −6
Original line number Diff line number Diff line
@@ -117,12 +117,6 @@ status_t AnotherPacketSource::read(

            mediaBuffer->meta_data()->setInt64(kKeyTime, timeUs);

            int32_t scrambling;
            if (buffer->meta()->findInt32("scrambling", &scrambling)
                    && scrambling != 0) {
                mediaBuffer->meta_data()->setInt32(kKeyScrambling, scrambling);
            }

            *out = mediaBuffer;
            return OK;
        }