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

Commit 1c345ebe authored by Andreas Huber's avatar Andreas Huber
Browse files

The transport stream HDCP descriptor belongs in the program_info section

instead of being included in the per-stream descriptors

Change-Id: If5251c0c02456646e2fdbb5e62acf66c356cf13e
parent 8d4c382d
Loading
Loading
Loading
Loading
+18 −10
Original line number Diff line number Diff line
@@ -41,10 +41,16 @@ MediaSender::MediaSender(
      mMode(MODE_UNDEFINED),
      mGeneration(0),
      mPrevTimeUs(-1ll),
      mInitDoneCount(0) {
      mInitDoneCount(0),
      mLogFile(NULL) {
    // mLogFile = fopen("/data/misc/log.ts", "wb");
}

MediaSender::~MediaSender() {
    if (mLogFile != NULL) {
        fclose(mLogFile);
        mLogFile = NULL;
    }
}

status_t MediaSender::setHDCP(const sp<IHDCP> &hdcp) {
@@ -89,21 +95,19 @@ status_t MediaSender::initAsync(
            return INVALID_OPERATION;
        }

        mTSPacketizer = new TSPacketizer;
        uint32_t flags = 0;
        if (mHDCP != NULL) {
            // XXX Determine proper HDCP version.
            flags |= TSPacketizer::EMIT_HDCP20_DESCRIPTOR;
        }
        mTSPacketizer = new TSPacketizer(flags);

        status_t err = OK;
        for (size_t i = 0; i < mTrackInfos.size(); ++i) {
            TrackInfo *info = &mTrackInfos.editItemAt(i);

            sp<AMessage> trackFormat = info->mFormat;
            if (mHDCP != NULL && !info->mIsAudio) {
                // HDCP2.0 _and_ HDCP 2.1 specs say to set the version
                // inside the HDCP descriptor to 0x20!!!
                trackFormat->setInt32("hdcp-version", 0x20);
            }

            ssize_t packetizerTrackIndex =
                mTSPacketizer->addTrack(trackFormat);
                mTSPacketizer->addTrack(info->mFormat);

            if (packetizerTrackIndex < 0) {
                err = packetizerTrackIndex;
@@ -244,6 +248,10 @@ status_t MediaSender::queueAccessUnit(
                    minTrackIndex, accessUnit, &tsPackets);

            if (err == OK) {
                if (mLogFile != NULL) {
                    fwrite(tsPackets->data(), 1, tsPackets->size(), mLogFile);
                }

                err = mTSSender->queueBuffer(
                        tsPackets,
                        33 /* packetType */,
+2 −0
Original line number Diff line number Diff line
@@ -107,6 +107,8 @@ private:

    size_t mInitDoneCount;

    FILE *mLogFile;

    void onSenderNotify(const sp<AMessage> &msg);

    void notifyInitDone(status_t err);
+42 −19
Original line number Diff line number Diff line
@@ -325,12 +325,31 @@ void TSPacketizer::Track::finalize() {
        mDescriptors.push_back(descriptor);
    }

    mFinalized = true;
}

////////////////////////////////////////////////////////////////////////////////

TSPacketizer::TSPacketizer(uint32_t flags)
    : mFlags(flags),
      mPATContinuityCounter(0),
      mPMTContinuityCounter(0) {
    initCrcTable();

    if (flags & (EMIT_HDCP20_DESCRIPTOR | EMIT_HDCP21_DESCRIPTOR)) {
        int32_t hdcpVersion;
    if (mFormat->findInt32("hdcp-version", &hdcpVersion)) {
        // HDCP descriptor
        if (flags & EMIT_HDCP20_DESCRIPTOR) {
            CHECK(!(flags & EMIT_HDCP21_DESCRIPTOR));
            hdcpVersion = 0x20;
        } else {
            CHECK(!(flags & EMIT_HDCP20_DESCRIPTOR));

        CHECK(hdcpVersion == 0x20 || hdcpVersion == 0x21);
            // HDCP2.0 _and_ HDCP 2.1 specs say to set the version
            // inside the HDCP descriptor to 0x20!!!
            hdcpVersion = 0x20;
        }

        // HDCP descriptor
        sp<ABuffer> descriptor = new ABuffer(7);
        uint8_t *data = descriptor->data();
        data[0] = 0x05;  // descriptor_tag
@@ -341,18 +360,8 @@ void TSPacketizer::Track::finalize() {
        data[5] = 'P';
        data[6] = hdcpVersion;

        mDescriptors.push_back(descriptor);
        mProgramInfoDescriptors.push_back(descriptor);
    }

    mFinalized = true;
}

////////////////////////////////////////////////////////////////////////////////

TSPacketizer::TSPacketizer()
    : mPATContinuityCounter(0),
      mPMTContinuityCounter(0) {
    initCrcTable();
}

TSPacketizer::~TSPacketizer() {
@@ -605,7 +614,8 @@ status_t TSPacketizer::packetize(
        // reserved = b111
        // PCR_PID = kPCR_PID (13 bits)
        // reserved = b1111
        // program_info_length = 0x000
        // program_info_length = 0x???
        //   program_info_descriptors follow
        // one or more elementary stream descriptions follow:
        //   stream_type = 0x??
        //   reserved = b111
@@ -638,8 +648,21 @@ status_t TSPacketizer::packetize(
        *ptr++ = 0x00;
        *ptr++ = 0xe0 | (kPID_PCR >> 8);
        *ptr++ = kPID_PCR & 0xff;
        *ptr++ = 0xf0;
        *ptr++ = 0x00;

        size_t program_info_length = 0;
        for (size_t i = 0; i < mProgramInfoDescriptors.size(); ++i) {
            program_info_length += mProgramInfoDescriptors.itemAt(i)->size();
        }

        CHECK_LT(program_info_length, 0x400);
        *ptr++ = 0xf0 | (program_info_length >> 8);
        *ptr++ = (program_info_length & 0xff);

        for (size_t i = 0; i < mProgramInfoDescriptors.size(); ++i) {
            const sp<ABuffer> &desc = mProgramInfoDescriptors.itemAt(i);
            memcpy(ptr, desc->data(), desc->size());
            ptr += desc->size();
        }

        for (size_t i = 0; i < mTracks.size(); ++i) {
            const sp<Track> &track = mTracks.itemAt(i);
+8 −1
Original line number Diff line number Diff line
@@ -32,7 +32,11 @@ struct AMessage;
// Emits metadata tables (PAT and PMT) and timestamp stream (PCR) based
// on flags.
struct TSPacketizer : public RefBase {
    TSPacketizer();
    enum {
        EMIT_HDCP20_DESCRIPTOR = 1,
        EMIT_HDCP21_DESCRIPTOR = 2,
    };
    TSPacketizer(uint32_t flags);

    // Returns trackIndex or error.
    ssize_t addTrack(const sp<AMessage> &format);
@@ -68,8 +72,11 @@ private:

    struct Track;

    uint32_t mFlags;
    Vector<sp<Track> > mTracks;

    Vector<sp<ABuffer> > mProgramInfoDescriptors;

    unsigned mPATContinuityCounter;
    unsigned mPMTContinuityCounter;