From 80d8badd1c19cccfa0723e53bc0af9f26009bbfd Mon Sep 17 00:00:00 2001 From: Amy Date: Thu, 10 Oct 2019 18:30:28 -0700 Subject: [PATCH] Adding PES filter functionality to assemble PES data Test: manual Bug: 135709325 Change-Id: I9bbbae88918004201e6d7d5389473b4fd3a0a969 Merged-In: I9bbbae88918004201e6d7d5389473b4fd3a0a969 (cherry picked from commit 1109e9fee22d5c24e6004f8a9d249f505856237e) --- tv/tuner/1.0/default/Demux.cpp | 61 +++++++++++++++++++++++----------- tv/tuner/1.0/default/Demux.h | 5 +++ 2 files changed, 46 insertions(+), 20 deletions(-) diff --git a/tv/tuner/1.0/default/Demux.cpp b/tv/tuner/1.0/default/Demux.cpp index 02d570d512..15e8aaf669 100644 --- a/tv/tuner/1.0/default/Demux.cpp +++ b/tv/tuner/1.0/default/Demux.cpp @@ -466,33 +466,54 @@ Result Demux::startSectionFilterHandler(uint32_t filterId) { Result Demux::startPesFilterHandler(uint32_t filterId) { std::lock_guard lock(mFilterEventLock); - DemuxFilterPesEvent pesEvent; if (mFilterOutputs[filterId].empty()) { return Result::SUCCESS; } for (int i = 0; i < mFilterOutputs[filterId].size(); i += 188) { - uint8_t pusi = mFilterOutputs[filterId][i + 1] & 0x40; - uint8_t adaptFieldControl = (mFilterOutputs[filterId][i + 3] & 0x30) >> 4; - ALOGD("[Demux] pusi %d, adaptFieldControl %d", pusi, adaptFieldControl); - if (pusi && (adaptFieldControl == 0x01)) { - vector::const_iterator first = mFilterOutputs[filterId].begin() + i + 4; - vector::const_iterator last = mFilterOutputs[filterId].begin() + i + 187; - vector filterOutData(first, last); - if (!writeDataToFilterMQ(filterOutData, filterId)) { - mFilterOutputs[filterId].clear(); - return Result::INVALID_STATE; + if (mPesSizeLeft == 0) { + uint32_t prefix = (mFilterOutputs[filterId][i + 4] << 16) | + (mFilterOutputs[filterId][i + 5] << 8) | + 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; } - maySendFilterStatusCallback(filterId); - pesEvent = { - // temp dump meta data - .streamId = filterOutData[3], - .dataLength = static_cast(filterOutData.size()), - }; - int size = mFilterEvents[filterId].events.size(); - mFilterEvents[filterId].events.resize(size + 1); - mFilterEvents[filterId].events[size].pes(pesEvent); } + + int endPoint = min(184, mPesSizeLeft); + // append data and check size + vector::const_iterator first = mFilterOutputs[filterId].begin() + i + 4; + vector::const_iterator last = mFilterOutputs[filterId].begin() + i + 3 + endPoint; + mPesOutput.insert(mPesOutput.end(), first, last); + // size does not match then continue + mPesSizeLeft -= endPoint; + if (mPesSizeLeft > 0) { + continue; + } + // size match then create event + if (!writeDataToFilterMQ(mPesOutput, filterId)) { + mFilterOutputs[filterId].clear(); + return Result::INVALID_STATE; + } + maySendFilterStatusCallback(filterId); + DemuxFilterPesEvent pesEvent; + pesEvent = { + // temp dump meta data + .streamId = mPesOutput[3], + .dataLength = static_cast(mPesOutput.size()), + }; + ALOGD("[Demux] assembled pes data length %d", pesEvent.dataLength); + + int size = mFilterEvents[filterId].events.size(); + mFilterEvents[filterId].events.resize(size + 1); + mFilterEvents[filterId].events[size].pes(pesEvent); + mPesOutput.clear(); } mFilterOutputs[filterId].clear(); diff --git a/tv/tuner/1.0/default/Demux.h b/tv/tuner/1.0/default/Demux.h index 5a89e92eeb..ba0b9b099a 100644 --- a/tv/tuner/1.0/default/Demux.h +++ b/tv/tuner/1.0/default/Demux.h @@ -254,6 +254,11 @@ class Demux : public IDemux { * TODO make this dynamic/random/can take as a parameter */ const uint16_t SECTION_WRITE_COUNT = 10; + + // temp handle single PES filter + // TODO handle mulptiple Pes filters + int mPesSizeLeft = 0; + vector mPesOutput; }; } // namespace implementation