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

Commit 37e50971 authored by Lucas Gates's avatar Lucas Gates
Browse files

SampleTunerTIS HAL Process TS for SectionEvents

Currently, the HAL simply sends raw TS data when
SectionEvents are created from a TS file. This CL
will have the HAL process the TS packets and construct
sections to be sent to the SectionFilter. A slight-modified
TS protocol is used that mirrors the current implementation
for PES filters.

This CL is a replication of reverted CL 19121691.

Bug: 237323181
Test: Manually using cuttlefish and the SampleTunerTvInput.
SectionEvents should be received without the 4-byte
TsHeader or any trailing data.

Change-Id: I48de90c9674fb69ecf877359f89f6b4f7f3eaca7
parent 2b55903f
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
    int mPesSizeLeft = 0;