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

Commit 80d8badd authored by Amy's avatar Amy Committed by Amy Zhang
Browse files

Adding PES filter functionality to assemble PES data

Test: manual
Bug: 135709325
Change-Id: I9bbbae88918004201e6d7d5389473b4fd3a0a969
Merged-In: I9bbbae88918004201e6d7d5389473b4fd3a0a969
(cherry picked from commit 1109e9fe)
parent 7e4ca874
Loading
Loading
Loading
Loading
+41 −20
Original line number Original line Diff line number Diff line
@@ -466,33 +466,54 @@ Result Demux::startSectionFilterHandler(uint32_t filterId) {


Result Demux::startPesFilterHandler(uint32_t filterId) {
Result Demux::startPesFilterHandler(uint32_t filterId) {
    std::lock_guard<std::mutex> lock(mFilterEventLock);
    std::lock_guard<std::mutex> lock(mFilterEventLock);
    DemuxFilterPesEvent pesEvent;
    if (mFilterOutputs[filterId].empty()) {
    if (mFilterOutputs[filterId].empty()) {
        return Result::SUCCESS;
        return Result::SUCCESS;
    }
    }


    for (int i = 0; i < mFilterOutputs[filterId].size(); i += 188) {
    for (int i = 0; i < mFilterOutputs[filterId].size(); i += 188) {
        uint8_t pusi = mFilterOutputs[filterId][i + 1] & 0x40;
        if (mPesSizeLeft == 0) {
        uint8_t adaptFieldControl = (mFilterOutputs[filterId][i + 3] & 0x30) >> 4;
            uint32_t prefix = (mFilterOutputs[filterId][i + 4] << 16) |
        ALOGD("[Demux] pusi %d, adaptFieldControl %d", pusi, adaptFieldControl);
                              (mFilterOutputs[filterId][i + 5] << 8) |
        if (pusi && (adaptFieldControl == 0x01)) {
                              mFilterOutputs[filterId][i + 6];
            ALOGD("[Demux] prefix %d", prefix);
            if (prefix == 0x000001) {
                // TODO handle mulptiple Pes filters
                mPesSizeLeft =
                        (mFilterOutputs[filterId][i + 7] << 8) | mFilterOutputs[filterId][i + 8];
                ALOGD("[Demux] pes data length %d", mPesSizeLeft);
            } else {
                continue;
            }
        }

        int endPoint = min(184, mPesSizeLeft);
        // append data and check size
        vector<uint8_t>::const_iterator first = mFilterOutputs[filterId].begin() + i + 4;
        vector<uint8_t>::const_iterator first = mFilterOutputs[filterId].begin() + i + 4;
            vector<uint8_t>::const_iterator last = mFilterOutputs[filterId].begin() + i + 187;
        vector<uint8_t>::const_iterator last = mFilterOutputs[filterId].begin() + i + 3 + endPoint;
            vector<uint8_t> filterOutData(first, last);
        mPesOutput.insert(mPesOutput.end(), first, last);
            if (!writeDataToFilterMQ(filterOutData, filterId)) {
        // size does not match then continue
        mPesSizeLeft -= endPoint;
        if (mPesSizeLeft > 0) {
            continue;
        }
        // size match then create event
        if (!writeDataToFilterMQ(mPesOutput, filterId)) {
            mFilterOutputs[filterId].clear();
            mFilterOutputs[filterId].clear();
            return Result::INVALID_STATE;
            return Result::INVALID_STATE;
        }
        }
        maySendFilterStatusCallback(filterId);
        maySendFilterStatusCallback(filterId);
        DemuxFilterPesEvent pesEvent;
        pesEvent = {
        pesEvent = {
                // temp dump meta data
                // temp dump meta data
                    .streamId = filterOutData[3],
                .streamId = mPesOutput[3],
                    .dataLength = static_cast<uint16_t>(filterOutData.size()),
                .dataLength = static_cast<uint16_t>(mPesOutput.size()),
        };
        };
        ALOGD("[Demux] assembled pes data length %d", pesEvent.dataLength);

        int size = mFilterEvents[filterId].events.size();
        int size = mFilterEvents[filterId].events.size();
        mFilterEvents[filterId].events.resize(size + 1);
        mFilterEvents[filterId].events.resize(size + 1);
        mFilterEvents[filterId].events[size].pes(pesEvent);
        mFilterEvents[filterId].events[size].pes(pesEvent);
        }
        mPesOutput.clear();
    }
    }


    mFilterOutputs[filterId].clear();
    mFilterOutputs[filterId].clear();
+5 −0
Original line number Original line Diff line number Diff line
@@ -254,6 +254,11 @@ class Demux : public IDemux {
     * TODO make this dynamic/random/can take as a parameter
     * TODO make this dynamic/random/can take as a parameter
     */
     */
    const uint16_t SECTION_WRITE_COUNT = 10;
    const uint16_t SECTION_WRITE_COUNT = 10;

    // temp handle single PES filter
    // TODO handle mulptiple Pes filters
    int mPesSizeLeft = 0;
    vector<uint8_t> mPesOutput;
};
};


}  // namespace implementation
}  // namespace implementation