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

Commit dcac96de authored by Lucas Gates's avatar Lucas Gates Committed by Android (Google) Code Review
Browse files

Merge "SampleTunerTIS HAL Process TS for SectionEvents"

parents 43aa5a60 37e50971
Loading
Loading
Loading
Loading
+54 −14
Original line number Diff line number Diff line
@@ -961,24 +961,64 @@ void Filter::updateRecordOutput(vector<int8_t>& data) {
    return ::ndk::ScopedAStatus::ok();
}

// Read PSI (Program Specific Information) Sections from TransportStreams
// as defined in ISO/IEC 13818-1 Section 2.4.4
bool Filter::writeSectionsAndCreateEvent(vector<int8_t>& data) {
    // TODO check how many sections has been read
    ALOGD("[Filter] section handler");
    if (!writeDataToFilterMQ(data)) {

    // Transport Stream Packets are 188 bytes long, as defined in the
    // Introduction of ISO/IEC 13818-1
    for (int i = 0; i < data.size(); i += 188) {
        if (mSectionSizeLeft == 0) {
            // Location for sectionSize as defined by Section 2.4.4
            // Note that the first 4 bytes skipped are the TsHeader
            mSectionSizeLeft = ((data[i + 5] & 0x0f) << 8) | (data[i + 6] & 0xff);
            mSectionSizeLeft += 3;
            if (DEBUG_FILTER) {
                ALOGD("[Filter] section data length %d", mSectionSizeLeft);
            }
        }

        // 184 bytes per packet is derived by subtracting the 4 byte length of
        // the TsHeader from its 188 byte packet size
        uint32_t endPoint = min(184u, mSectionSizeLeft);
        // append data and check size
        vector<int8_t>::const_iterator first = data.begin() + i + 4;
        vector<int8_t>::const_iterator last = data.begin() + i + 4 + endPoint;
        mSectionOutput.insert(mSectionOutput.end(), first, last);
        // size does not match then continue
        mSectionSizeLeft -= endPoint;
        if (DEBUG_FILTER) {
            ALOGD("[Filter] section data left %d", mSectionSizeLeft);
        }
        if (mSectionSizeLeft > 0) {
            continue;
        }

        if (!writeDataToFilterMQ(mSectionOutput)) {
            mSectionOutput.clear();
            return false;
        }

        DemuxFilterSectionEvent secEvent;
        secEvent = {
                // temp dump meta data
                .tableId = 0,
                .version = 1,
                .sectionNum = 1,
            .dataLength = static_cast<int32_t>(data.size()),
                .dataLength = static_cast<int32_t>(mSectionOutput.size()),
        };
        if (DEBUG_FILTER) {
            ALOGD("[Filter] assembled section data length %" PRIu64, secEvent.dataLength);
        }

        {
            std::lock_guard<std::mutex> lock(mFilterEventsLock);
        mFilterEvents.push_back(DemuxFilterEvent::make<DemuxFilterEvent::Tag::section>(secEvent));
            mFilterEvents.push_back(
                    DemuxFilterEvent::make<DemuxFilterEvent::Tag::section>(secEvent));
        }
        mSectionOutput.clear();
    }

    return true;
+4 −0
Original line number Diff line number Diff line
@@ -258,6 +258,10 @@ class Filter : public BnFilter {
    std::mutex mFilterOutputLock;
    std::mutex mRecordFilterOutputLock;

    // handle single Section filter
    uint32_t mSectionSizeLeft = 0;
    vector<int8_t> mSectionOutput;

    // temp handle single PES filter
    // TODO handle mulptiple Pes filters
    uint32_t mPesSizeLeft = 0;