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

Commit dc7785c5 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Retrieve CA_Descriptor private data for scrambled stream"

parents 2a6038e5 7e986a89
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -179,6 +179,7 @@ enum {
    kKeyPssh              = 'pssh',  // raw data
    kKeyCASystemID        = 'caid',  // int32_t
    kKeyCASessionID       = 'seid',  // raw data
    kKeyCAPrivateData     = 'cadc',  // raw data

    kKeyEncryptedByteBlock = 'cblk',  // uint8_t
    kKeySkipByteBlock     = 'sblk',  // uint8_t
+23 −0
Original line number Diff line number Diff line
@@ -724,6 +724,16 @@ status_t convertMetaDataToMessage(
        memcpy(buffer->data(), data, size);
    }

    if (meta->findData(kKeyCAPrivateData, &type, &data, &size)) {
        sp<ABuffer> buffer = new (std::nothrow) ABuffer(size);
        if (buffer.get() == NULL || buffer->base() == NULL) {
            return NO_MEMORY;
        }

        msg->setBuffer("ca-private-data", buffer);
        memcpy(buffer->data(), data, size);
    }

    int32_t systemId;
    if (meta->findInt32(kKeyCASystemID, &systemId)) {
        msg->setInt32("ca-system-id", systemId);
@@ -1478,6 +1488,19 @@ void convertMessageToMetaData(const sp<AMessage> &msg, sp<MetaData> &meta) {

    convertMessageToMetaDataFromMappings(msg, meta);

    int32_t systemId;
    if (msg->findInt32("ca-system-id", &systemId)) {
        meta->setInt32(kKeyCASystemID, systemId);

        sp<ABuffer> caSessionId, caPvtData;
        if (msg->findBuffer("ca-session-id", &caSessionId)) {
            meta->setData(kKeyCASessionID, 0, caSessionId->data(), caSessionId->size());
        }
        if (msg->findBuffer("ca-private-data", &caPvtData)) {
            meta->setData(kKeyCAPrivateData, 0, caPvtData->data(), caPvtData->size());
        }
    }

    int64_t durationUs;
    if (msg->findInt64("durationUs", &durationUs)) {
        meta->setInt64(kKeyDuration, durationUs);
+1 −0
Original line number Diff line number Diff line
@@ -327,6 +327,7 @@ constexpr char KEY_BIT_RATE[] = "bitrate";
constexpr char KEY_BITRATE_MODE[] = "bitrate-mode";
constexpr char KEY_CA_SESSION_ID[] = "ca-session-id";
constexpr char KEY_CA_SYSTEM_ID[] = "ca-system-id";
constexpr char KEY_CA_PRIVATE_DATA[] = "ca-private-data";
constexpr char KEY_CAPTURE_RATE[] = "capture-rate";
constexpr char KEY_CHANNEL_COUNT[] = "channel-count";
constexpr char KEY_CHANNEL_MASK[] = "channel-mask";
+23 −31
Original line number Diff line number Diff line
@@ -117,12 +117,6 @@ struct ATSParser::Program : public RefBase {
    void signalNewSampleAesKey(const sp<AMessage> &keyItem);

private:
    struct StreamInfo {
        unsigned mType;
        unsigned mTypeExt;
        unsigned mPID;
        int32_t mCASystemId;
    };

    ATSParser *mParser;
    unsigned mProgramNumber;
@@ -143,12 +137,7 @@ private:
};

struct ATSParser::Stream : public RefBase {
    Stream(Program *program,
           unsigned elementaryPID,
           unsigned streamType,
           unsigned streamTypeExt,
           unsigned PCR_PID,
           int32_t CA_system_ID);
    Stream(Program *program, unsigned PCR_PID, const StreamInfo &info);

    unsigned type() const { return mStreamType; }
    unsigned typeExt() const { return mStreamTypeExt; }
@@ -575,8 +564,12 @@ status_t ATSParser::Program::parseProgramMap(ABitReader *br) {
                mProgramNumber, info.mPID, streamCA)) {
            return ERROR_MALFORMED;
        }
        info.mCASystemId = hasProgramCA ? programCA.mSystemID :
                           hasStreamCA ? streamCA.mSystemID  : -1;
        if (hasProgramCA) {
            info.mCADescriptor = programCA;
        } else if (hasStreamCA) {
            info.mCADescriptor = streamCA;
        }

        infos.push(info);
    }

@@ -635,14 +628,13 @@ status_t ATSParser::Program::parseProgramMap(ABitReader *br) {
        ssize_t index = mStreams.indexOfKey(info.mPID);

        if (index < 0) {
            sp<Stream> stream = new Stream(
                    this, info.mPID, info.mType, info.mTypeExt, PCR_PID, info.mCASystemId);
            sp<Stream> stream = new Stream(this, PCR_PID, info);

            if (mSampleAesKeyItem != NULL) {
                stream->signalNewSampleAesKey(mSampleAesKeyItem);
            }

            isAddingScrambledStream |= info.mCASystemId >= 0;
            isAddingScrambledStream |= info.mCADescriptor.mSystemID >= 0;
            mStreams.add(info.mPID, stream);
        }
    }
@@ -751,31 +743,25 @@ void ATSParser::Program::updateCasSessions() {
static const size_t kInitialStreamBufferSize = 192 * 1024;

ATSParser::Stream::Stream(
        Program *program,
        unsigned elementaryPID,
        unsigned streamType,
        unsigned streamTypeExt,
        unsigned PCR_PID,
        int32_t CA_system_ID)
        Program *program, unsigned PCR_PID, const StreamInfo &info)
    : mProgram(program),
      mElementaryPID(elementaryPID),
      mStreamType(streamType),
      mStreamTypeExt(streamTypeExt),
      mElementaryPID(info.mPID),
      mStreamType(info.mType),
      mStreamTypeExt(info.mTypeExt),
      mPCR_PID(PCR_PID),
      mExpectedContinuityCounter(-1),
      mPayloadStarted(false),
      mEOSReached(false),
      mPrevPTS(0),
      mQueue(NULL),
      mScrambled(CA_system_ID >= 0) {

      mScrambled(info.mCADescriptor.mSystemID >= 0) {
    mSampleEncrypted =
            mStreamType == STREAMTYPE_H264_ENCRYPTED ||
            mStreamType == STREAMTYPE_AAC_ENCRYPTED  ||
            mStreamType == STREAMTYPE_AC3_ENCRYPTED;

    ALOGV("new stream PID 0x%02x, type 0x%02x, scrambled %d, SampleEncrypted: %d",
            elementaryPID, streamType, mScrambled, mSampleEncrypted);
            info.mPID, info.mType, mScrambled, mSampleEncrypted);

    uint32_t flags = 0;
    if (((isVideo() || isAudio()) && mScrambled)) {
@@ -835,7 +821,7 @@ ATSParser::Stream::Stream(

        default:
            ALOGE("stream PID 0x%02x has invalid stream type 0x%02x",
                    elementaryPID, streamType);
                    info.mPID, info.mType);
            return;
    }

@@ -855,7 +841,13 @@ ATSParser::Stream::Stream(
                    isAudio() ? MEDIA_MIMETYPE_AUDIO_SCRAMBLED
                              : MEDIA_MIMETYPE_VIDEO_SCRAMBLED);
            // for MediaExtractor.CasInfo
            meta->setInt32(kKeyCASystemID, CA_system_ID);
            const CADescriptor &descriptor = info.mCADescriptor;
            meta->setInt32(kKeyCASystemID, descriptor.mSystemID);

            meta->setData(kKeyCAPrivateData, 0,
                    descriptor.mPrivateData.data(),
                    descriptor.mPrivateData.size());

            mSource = new AnotherPacketSource(meta);
        }
    }
+9 −1
Original line number Diff line number Diff line
@@ -185,11 +185,19 @@ private:
    struct PSISection;
    struct CasManager;
    struct CADescriptor {
        int32_t mSystemID;
        CADescriptor() : mPID(0), mSystemID(-1) {}
        unsigned mPID;
        int32_t mSystemID;
        std::vector<uint8_t> mPrivateData;
    };

    struct StreamInfo {
        unsigned mType;
        unsigned mTypeExt;
        unsigned mPID;
        CADescriptor mCADescriptor;
    };

    sp<CasManager> mCasManager;

    uint32_t mFlags;