Loading tv/tuner/1.1/default/Demux.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -340,6 +340,10 @@ void* Demux::__threadLoopFrontend(void* user) { } void Demux::frontendInputThreadLoop() { if (!mFrontendInputThreadRunning) { return; } std::lock_guard<std::mutex> lock(mFrontendInputThreadLock); if (!mDvrPlayback) { ALOGW("[Demux] No software Frontend input configured. Ending Frontend thread loop."); Loading tv/tuner/1.1/default/Filter.cpp +201 −2 Original line number Diff line number Diff line Loading @@ -72,9 +72,8 @@ Filter::Filter(DemuxFilterType type, uint64_t filterId, uint32_t bufferSize, sp<V1_1::IFilterCallback> filterCallback_v1_1 = V1_1::IFilterCallback::castFrom(cb); if (filterCallback_v1_1 != NULL) { mCallback_1_1 = filterCallback_v1_1; } else { mCallback = cb; } mCallback = cb; } Filter::~Filter() { Loading Loading @@ -141,6 +140,36 @@ Return<Result> Filter::configure(const DemuxFilterSettings& settings) { Return<Result> Filter::start() { ALOGV("%s", __FUNCTION__); mFilterThreadRunning = true; // All the filter event callbacks in start are for testing purpose. switch (mType.mainType) { case DemuxFilterMainType::TS: mCallback->onFilterEvent(createMediaEvent()); mCallback->onFilterEvent(createTsRecordEvent()); mCallback_1_1->onFilterEvent_1_1(createTsRecordEvent(), createTsRecordEventExt()); mCallback->onFilterEvent(createTemiEvent()); break; case DemuxFilterMainType::MMTP: mCallback->onFilterEvent(createDownloadEvent()); mCallback->onFilterEvent(createMmtpRecordEvent()); mCallback_1_1->onFilterEvent_1_1(createMmtpRecordEvent(), createMmtpRecordEventExt()); break; case DemuxFilterMainType::IP: mCallback->onFilterEvent(createSectionEvent()); mCallback->onFilterEvent(createIpPayloadEvent()); break; case DemuxFilterMainType::TLV: { DemuxFilterEvent emptyFilterEvent; mCallback_1_1->onFilterEvent_1_1(emptyFilterEvent, createMonitorEvent()); break; } case DemuxFilterMainType::ALP: { DemuxFilterEvent emptyFilterEvent; mCallback_1_1->onFilterEvent_1_1(emptyFilterEvent, createRestartEvent()); break; } default: break; } return startFilterLoop(); } Loading Loading @@ -926,6 +955,176 @@ bool Filter::sameFile(int fd1, int fd2) { } return (stat1.st_dev == stat2.st_dev) && (stat1.st_ino == stat2.st_ino); } DemuxFilterEvent Filter::createMediaEvent() { DemuxFilterEvent event; event.events.resize(1); event.events[0].media({ .streamId = 1, .isPtsPresent = true, .pts = 2, .dataLength = 3, .offset = 4, .isSecureMemory = true, .avDataId = 5, .mpuSequenceNumber = 6, .isPesPrivateData = true, }); event.events[0].media().extraMetaData.audio({ .adFade = 1, .adPan = 2, .versionTextTag = 3, .adGainCenter = 4, .adGainFront = 5, .adGainSurround = 6, }); int av_fd = createAvIonFd(BUFFER_SIZE_16M); if (av_fd == -1) { return event; } native_handle_t* nativeHandle = createNativeHandle(av_fd); if (nativeHandle == NULL) { return event; } hidl_handle handle; handle.setTo(nativeHandle, /*shouldOwn=*/true); event.events[0].media().avMemory = std::move(handle); ::close(av_fd); return event; } DemuxFilterEvent Filter::createTsRecordEvent() { DemuxFilterEvent event; event.events.resize(1); DemuxPid pid; pid.tPid(1); DemuxFilterTsRecordEvent::ScIndexMask mask; mask.sc(1); event.events[0].tsRecord({ .pid = pid, .tsIndexMask = 1, .scIndexMask = mask, .byteNumber = 2, }); return event; } V1_1::DemuxFilterEventExt Filter::createTsRecordEventExt() { V1_1::DemuxFilterEventExt event; event.events.resize(1); event.events[0].tsRecord({ .pts = 1, .firstMbInSlice = 2, // random address }); return event; } DemuxFilterEvent Filter::createMmtpRecordEvent() { DemuxFilterEvent event; event.events.resize(1); event.events[0].mmtpRecord({ .scHevcIndexMask = 1, .byteNumber = 2, }); return event; } V1_1::DemuxFilterEventExt Filter::createMmtpRecordEventExt() { V1_1::DemuxFilterEventExt event; event.events.resize(1); event.events[0].mmtpRecord({ .pts = 1, .mpuSequenceNumber = 2, .firstMbInSlice = 3, .tsIndexMask = 4, }); return event; } DemuxFilterEvent Filter::createSectionEvent() { DemuxFilterEvent event; event.events.resize(1); event.events[0].section({ .tableId = 1, .version = 2, .sectionNum = 3, .dataLength = 0, }); return event; } DemuxFilterEvent Filter::createPesEvent() { DemuxFilterEvent event; event.events.resize(1); event.events[0].pes({ .streamId = static_cast<DemuxStreamId>(1), .dataLength = 1, .mpuSequenceNumber = 2, }); return event; } DemuxFilterEvent Filter::createDownloadEvent() { DemuxFilterEvent event; event.events.resize(1); event.events[0].download({ .itemId = 1, .mpuSequenceNumber = 2, .itemFragmentIndex = 3, .lastItemFragmentIndex = 4, .dataLength = 0, }); return event; } DemuxFilterEvent Filter::createIpPayloadEvent() { DemuxFilterEvent event; event.events.resize(1); event.events[0].ipPayload({ .dataLength = 0, }); return event; } DemuxFilterEvent Filter::createTemiEvent() { DemuxFilterEvent event; event.events.resize(1); event.events[0].temi({.pts = 1, .descrTag = 2, .descrData = {3}}); return event; } V1_1::DemuxFilterEventExt Filter::createMonitorEvent() { V1_1::DemuxFilterEventExt event; event.events.resize(1); V1_1::DemuxFilterMonitorEvent monitor; monitor.scramblingStatus(V1_1::ScramblingStatus::SCRAMBLED); event.events[0].monitorEvent(monitor); return event; } V1_1::DemuxFilterEventExt Filter::createRestartEvent() { V1_1::DemuxFilterEventExt event; event.events.resize(1); event.events[0].startId(1); return event; } } // namespace implementation } // namespace V1_0 } // namespace tuner Loading tv/tuner/1.1/default/Filter.h +12 −0 Original line number Diff line number Diff line Loading @@ -198,6 +198,18 @@ class Filter : public V1_1::IFilter { Result createShareMemMediaEvents(vector<uint8_t> output); bool sameFile(int fd1, int fd2); DemuxFilterEvent createMediaEvent(); DemuxFilterEvent createTsRecordEvent(); V1_1::DemuxFilterEventExt createTsRecordEventExt(); DemuxFilterEvent createMmtpRecordEvent(); V1_1::DemuxFilterEventExt createMmtpRecordEventExt(); DemuxFilterEvent createSectionEvent(); DemuxFilterEvent createPesEvent(); DemuxFilterEvent createDownloadEvent(); DemuxFilterEvent createIpPayloadEvent(); DemuxFilterEvent createTemiEvent(); V1_1::DemuxFilterEventExt createMonitorEvent(); V1_1::DemuxFilterEventExt createRestartEvent(); /** * Lock to protect writes to the FMQs */ Loading Loading
tv/tuner/1.1/default/Demux.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -340,6 +340,10 @@ void* Demux::__threadLoopFrontend(void* user) { } void Demux::frontendInputThreadLoop() { if (!mFrontendInputThreadRunning) { return; } std::lock_guard<std::mutex> lock(mFrontendInputThreadLock); if (!mDvrPlayback) { ALOGW("[Demux] No software Frontend input configured. Ending Frontend thread loop."); Loading
tv/tuner/1.1/default/Filter.cpp +201 −2 Original line number Diff line number Diff line Loading @@ -72,9 +72,8 @@ Filter::Filter(DemuxFilterType type, uint64_t filterId, uint32_t bufferSize, sp<V1_1::IFilterCallback> filterCallback_v1_1 = V1_1::IFilterCallback::castFrom(cb); if (filterCallback_v1_1 != NULL) { mCallback_1_1 = filterCallback_v1_1; } else { mCallback = cb; } mCallback = cb; } Filter::~Filter() { Loading Loading @@ -141,6 +140,36 @@ Return<Result> Filter::configure(const DemuxFilterSettings& settings) { Return<Result> Filter::start() { ALOGV("%s", __FUNCTION__); mFilterThreadRunning = true; // All the filter event callbacks in start are for testing purpose. switch (mType.mainType) { case DemuxFilterMainType::TS: mCallback->onFilterEvent(createMediaEvent()); mCallback->onFilterEvent(createTsRecordEvent()); mCallback_1_1->onFilterEvent_1_1(createTsRecordEvent(), createTsRecordEventExt()); mCallback->onFilterEvent(createTemiEvent()); break; case DemuxFilterMainType::MMTP: mCallback->onFilterEvent(createDownloadEvent()); mCallback->onFilterEvent(createMmtpRecordEvent()); mCallback_1_1->onFilterEvent_1_1(createMmtpRecordEvent(), createMmtpRecordEventExt()); break; case DemuxFilterMainType::IP: mCallback->onFilterEvent(createSectionEvent()); mCallback->onFilterEvent(createIpPayloadEvent()); break; case DemuxFilterMainType::TLV: { DemuxFilterEvent emptyFilterEvent; mCallback_1_1->onFilterEvent_1_1(emptyFilterEvent, createMonitorEvent()); break; } case DemuxFilterMainType::ALP: { DemuxFilterEvent emptyFilterEvent; mCallback_1_1->onFilterEvent_1_1(emptyFilterEvent, createRestartEvent()); break; } default: break; } return startFilterLoop(); } Loading Loading @@ -926,6 +955,176 @@ bool Filter::sameFile(int fd1, int fd2) { } return (stat1.st_dev == stat2.st_dev) && (stat1.st_ino == stat2.st_ino); } DemuxFilterEvent Filter::createMediaEvent() { DemuxFilterEvent event; event.events.resize(1); event.events[0].media({ .streamId = 1, .isPtsPresent = true, .pts = 2, .dataLength = 3, .offset = 4, .isSecureMemory = true, .avDataId = 5, .mpuSequenceNumber = 6, .isPesPrivateData = true, }); event.events[0].media().extraMetaData.audio({ .adFade = 1, .adPan = 2, .versionTextTag = 3, .adGainCenter = 4, .adGainFront = 5, .adGainSurround = 6, }); int av_fd = createAvIonFd(BUFFER_SIZE_16M); if (av_fd == -1) { return event; } native_handle_t* nativeHandle = createNativeHandle(av_fd); if (nativeHandle == NULL) { return event; } hidl_handle handle; handle.setTo(nativeHandle, /*shouldOwn=*/true); event.events[0].media().avMemory = std::move(handle); ::close(av_fd); return event; } DemuxFilterEvent Filter::createTsRecordEvent() { DemuxFilterEvent event; event.events.resize(1); DemuxPid pid; pid.tPid(1); DemuxFilterTsRecordEvent::ScIndexMask mask; mask.sc(1); event.events[0].tsRecord({ .pid = pid, .tsIndexMask = 1, .scIndexMask = mask, .byteNumber = 2, }); return event; } V1_1::DemuxFilterEventExt Filter::createTsRecordEventExt() { V1_1::DemuxFilterEventExt event; event.events.resize(1); event.events[0].tsRecord({ .pts = 1, .firstMbInSlice = 2, // random address }); return event; } DemuxFilterEvent Filter::createMmtpRecordEvent() { DemuxFilterEvent event; event.events.resize(1); event.events[0].mmtpRecord({ .scHevcIndexMask = 1, .byteNumber = 2, }); return event; } V1_1::DemuxFilterEventExt Filter::createMmtpRecordEventExt() { V1_1::DemuxFilterEventExt event; event.events.resize(1); event.events[0].mmtpRecord({ .pts = 1, .mpuSequenceNumber = 2, .firstMbInSlice = 3, .tsIndexMask = 4, }); return event; } DemuxFilterEvent Filter::createSectionEvent() { DemuxFilterEvent event; event.events.resize(1); event.events[0].section({ .tableId = 1, .version = 2, .sectionNum = 3, .dataLength = 0, }); return event; } DemuxFilterEvent Filter::createPesEvent() { DemuxFilterEvent event; event.events.resize(1); event.events[0].pes({ .streamId = static_cast<DemuxStreamId>(1), .dataLength = 1, .mpuSequenceNumber = 2, }); return event; } DemuxFilterEvent Filter::createDownloadEvent() { DemuxFilterEvent event; event.events.resize(1); event.events[0].download({ .itemId = 1, .mpuSequenceNumber = 2, .itemFragmentIndex = 3, .lastItemFragmentIndex = 4, .dataLength = 0, }); return event; } DemuxFilterEvent Filter::createIpPayloadEvent() { DemuxFilterEvent event; event.events.resize(1); event.events[0].ipPayload({ .dataLength = 0, }); return event; } DemuxFilterEvent Filter::createTemiEvent() { DemuxFilterEvent event; event.events.resize(1); event.events[0].temi({.pts = 1, .descrTag = 2, .descrData = {3}}); return event; } V1_1::DemuxFilterEventExt Filter::createMonitorEvent() { V1_1::DemuxFilterEventExt event; event.events.resize(1); V1_1::DemuxFilterMonitorEvent monitor; monitor.scramblingStatus(V1_1::ScramblingStatus::SCRAMBLED); event.events[0].monitorEvent(monitor); return event; } V1_1::DemuxFilterEventExt Filter::createRestartEvent() { V1_1::DemuxFilterEventExt event; event.events.resize(1); event.events[0].startId(1); return event; } } // namespace implementation } // namespace V1_0 } // namespace tuner Loading
tv/tuner/1.1/default/Filter.h +12 −0 Original line number Diff line number Diff line Loading @@ -198,6 +198,18 @@ class Filter : public V1_1::IFilter { Result createShareMemMediaEvents(vector<uint8_t> output); bool sameFile(int fd1, int fd2); DemuxFilterEvent createMediaEvent(); DemuxFilterEvent createTsRecordEvent(); V1_1::DemuxFilterEventExt createTsRecordEventExt(); DemuxFilterEvent createMmtpRecordEvent(); V1_1::DemuxFilterEventExt createMmtpRecordEventExt(); DemuxFilterEvent createSectionEvent(); DemuxFilterEvent createPesEvent(); DemuxFilterEvent createDownloadEvent(); DemuxFilterEvent createIpPayloadEvent(); DemuxFilterEvent createTemiEvent(); V1_1::DemuxFilterEventExt createMonitorEvent(); V1_1::DemuxFilterEventExt createRestartEvent(); /** * Lock to protect writes to the FMQs */ Loading