From 5e3f876c46f29d555c686f781f879fd790fbc2b6 Mon Sep 17 00:00:00 2001 From: Amy Zhang Date: Tue, 2 Feb 2021 14:57:36 -0800 Subject: [PATCH] Connect FilterSettings between TunerFilter and FilterClient Test: make Bug: 174095851 Change-Id: I75b01a67ab0e3965c09535c12f2b893b5ba4365a --- media/jni/tuner/FilterClient.cpp | 340 ++++++++++++++++++++++++++++--- media/jni/tuner/FilterClient.h | 32 +++ 2 files changed, 343 insertions(+), 29 deletions(-) diff --git a/media/jni/tuner/FilterClient.cpp b/media/jni/tuner/FilterClient.cpp index 20b16d71b0c26..6b788170a9449 100644 --- a/media/jni/tuner/FilterClient.cpp +++ b/media/jni/tuner/FilterClient.cpp @@ -22,17 +22,24 @@ #include "FilterClient.h" -using ::aidl::android::media::tv::tuner::TunerFilterAvSettings; +using ::aidl::android::media::tv::tuner::TunerDemuxIpAddressSettings; +using ::aidl::android::media::tv::tuner::TunerFilterAlpConfiguration; +using ::aidl::android::media::tv::tuner::TunerFilterIpConfiguration; +using ::aidl::android::media::tv::tuner::TunerFilterMmtpConfiguration; using ::aidl::android::media::tv::tuner::TunerFilterMonitorEvent; using ::aidl::android::media::tv::tuner::TunerFilterScIndexMask; +using ::aidl::android::media::tv::tuner::TunerFilterSectionBits; +using ::aidl::android::media::tv::tuner::TunerFilterSectionCondition; +using ::aidl::android::media::tv::tuner::TunerFilterSectionTableInfo; using ::aidl::android::media::tv::tuner::TunerFilterSharedHandleInfo; +using ::aidl::android::media::tv::tuner::TunerFilterTlvConfiguration; using ::aidl::android::media::tv::tuner::TunerFilterTsConfiguration; -using ::android::hardware::tv::tuner::V1_0::DemuxQueueNotifyBits; using ::android::hardware::tv::tuner::V1_0::DemuxFilterMainType; using ::android::hardware::tv::tuner::V1_0::DemuxMmtpFilterType; -using ::android::hardware::tv::tuner::V1_0::DemuxTpid; +using ::android::hardware::tv::tuner::V1_0::DemuxQueueNotifyBits; using ::android::hardware::tv::tuner::V1_0::DemuxStreamId; +using ::android::hardware::tv::tuner::V1_0::DemuxTpid; using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterSettings; using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterType; using ::android::hardware::tv::tuner::V1_1::ScramblingStatus; @@ -318,42 +325,317 @@ Status TunerFilterCallback::onFilterEvent(const vector& filter TunerFilterConfiguration FilterClient::getAidlFilterSettings(DemuxFilterSettings configure) { TunerFilterConfiguration config; - // TODO: complete filter setting conversion switch (configure.getDiscriminator()) { - case DemuxFilterSettings::hidl_discriminator::ts: { - TunerFilterSettings filterSettings; - switch (configure.ts().filterSettings.getDiscriminator()) { - case DemuxTsFilterSettings::FilterSettings::hidl_discriminator::av: { - TunerFilterAvSettings av{ - .isPassthrough = configure.ts().filterSettings.av().isPassthrough, - }; - filterSettings.set(av); - break; - } - default: - break; - } - - TunerFilterTsConfiguration ts{ - .tpid = configure.ts().tpid, - .filterSettings = filterSettings, - }; - config.set(ts); - - return config; - } + case DemuxFilterSettings::hidl_discriminator::ts: + return getAidlTsSettings(configure.ts()); case DemuxFilterSettings::hidl_discriminator::mmtp: - break; + return getAidlMmtpSettings(configure.mmtp()); case DemuxFilterSettings::hidl_discriminator::ip: - break; + return getAidlIpSettings(configure.ip()); case DemuxFilterSettings::hidl_discriminator::tlv: - break; + return getAidlTlvSettings(configure.tlv()); + case DemuxFilterSettings::hidl_discriminator::alp: + return getAidlAlpSettings(configure.alp()); default: break; } + ALOGE("Wrong DemuxFilterSettings union."); return config; } +TunerFilterConfiguration FilterClient::getAidlTsSettings(DemuxTsFilterSettings ts) { + TunerFilterConfiguration config; + TunerFilterSettings filterSettings; + switch (ts.filterSettings.getDiscriminator()) { + case DemuxTsFilterSettings::FilterSettings::hidl_discriminator::av: { + filterSettings.set( + getAidlAvSettings(ts.filterSettings.av())); + break; + } + case DemuxTsFilterSettings::FilterSettings::hidl_discriminator::section: { + filterSettings.set( + getAidlSectionSettings(ts.filterSettings.section())); + break; + } + case DemuxTsFilterSettings::FilterSettings::hidl_discriminator::pesData: { + filterSettings.set( + getAidlPesDataSettings(ts.filterSettings.pesData())); + break; + } + case DemuxTsFilterSettings::FilterSettings::hidl_discriminator::record: { + filterSettings.set( + getAidlRecordSettings(ts.filterSettings.record())); + break; + } + default: + filterSettings.set(true); + break; + } + + TunerFilterTsConfiguration aidlTs{ + .tpid = static_cast(ts.tpid), + .filterSettings = filterSettings, + }; + config.set(aidlTs); + + return config; +} + +TunerFilterConfiguration FilterClient::getAidlMmtpSettings(DemuxMmtpFilterSettings mmtp) { + TunerFilterConfiguration config; + TunerFilterSettings filterSettings; + switch (mmtp.filterSettings.getDiscriminator()) { + case DemuxMmtpFilterSettings::FilterSettings::hidl_discriminator::av: { + filterSettings.set( + getAidlAvSettings(mmtp.filterSettings.av())); + break; + } + case DemuxMmtpFilterSettings::FilterSettings::hidl_discriminator::section: { + filterSettings.set( + getAidlSectionSettings(mmtp.filterSettings.section())); + break; + } + case DemuxMmtpFilterSettings::FilterSettings::hidl_discriminator::pesData: { + filterSettings.set( + getAidlPesDataSettings(mmtp.filterSettings.pesData())); + break; + } + case DemuxMmtpFilterSettings::FilterSettings::hidl_discriminator::record: { + filterSettings.set( + getAidlRecordSettings(mmtp.filterSettings.record())); + break; + } + case DemuxMmtpFilterSettings::FilterSettings::hidl_discriminator::download: { + filterSettings.set( + getAidlDownloadSettings(mmtp.filterSettings.download())); + break; + } + default: + filterSettings.set(true); + break; + } + + TunerFilterMmtpConfiguration aidlMmtp{ + .mmtpPid = static_cast(mmtp.mmtpPid), + .filterSettings = filterSettings, + }; + config.set(aidlMmtp); + + return config; +} + +TunerFilterConfiguration FilterClient::getAidlIpSettings(DemuxIpFilterSettings ip) { + TunerFilterConfiguration config; + TunerFilterSettings filterSettings; + switch (ip.filterSettings.getDiscriminator()) { + case DemuxIpFilterSettings::FilterSettings::hidl_discriminator::section: { + filterSettings.set( + getAidlSectionSettings(ip.filterSettings.section())); + break; + } + case DemuxIpFilterSettings::FilterSettings::hidl_discriminator::bPassthrough: { + filterSettings.set( + ip.filterSettings.bPassthrough()); + break; + } + default: + filterSettings.set(true); + break; + } + + TunerDemuxIpAddressSettings ipAddr{ + .srcPort = static_cast(ip.ipAddr.srcPort), + .dstPort = static_cast(ip.ipAddr.dstPort), + }; + getAidlIpAddress(ip.ipAddr, ipAddr.srcIpAddress, ipAddr.dstIpAddress); + + TunerFilterIpConfiguration aidlIp{ + .ipAddr = ipAddr, + .filterSettings = filterSettings, + }; + config.set(aidlIp); + + return config; +} + +void FilterClient::getAidlIpAddress(DemuxIpAddress ipAddr, + TunerDemuxIpAddress& srcIpAddress, TunerDemuxIpAddress& dstIpAddress) { + switch (ipAddr.srcIpAddress.getDiscriminator()) { + case DemuxIpAddress::SrcIpAddress::hidl_discriminator::v4: { + int size = ipAddr.srcIpAddress.v4().size(); + srcIpAddress.isIpV6 = false; + srcIpAddress.addr.resize(ipAddr.srcIpAddress.v4().size()); + copy(&ipAddr.srcIpAddress.v4()[0], &ipAddr.srcIpAddress.v4()[size], + srcIpAddress.addr.begin()); + break; + } + case DemuxIpAddress::SrcIpAddress::hidl_discriminator::v6: { + int size = ipAddr.srcIpAddress.v6().size(); + srcIpAddress.isIpV6 = true; + srcIpAddress.addr.resize(size); + copy(&ipAddr.srcIpAddress.v6()[0], &ipAddr.srcIpAddress.v6()[size], + srcIpAddress.addr.begin()); + break; + } + default: + break; + } + switch (ipAddr.dstIpAddress.getDiscriminator()) { + case DemuxIpAddress::DstIpAddress::hidl_discriminator::v4: { + int size = ipAddr.dstIpAddress.v4().size(); + dstIpAddress.isIpV6 = false; + dstIpAddress.addr.resize(size); + copy(&ipAddr.dstIpAddress.v4()[0], &ipAddr.dstIpAddress.v4()[size], + dstIpAddress.addr.begin()); + break; + } + case DemuxIpAddress::DstIpAddress::hidl_discriminator::v6: { + int size = ipAddr.dstIpAddress.v6().size(); + dstIpAddress.isIpV6 = true; + dstIpAddress.addr.resize(size); + copy(&ipAddr.dstIpAddress.v6()[0], &ipAddr.dstIpAddress.v6()[size], + dstIpAddress.addr.begin()); + break; + } + default: + break; + } +} + +TunerFilterConfiguration FilterClient::getAidlTlvSettings(DemuxTlvFilterSettings tlv) { + TunerFilterConfiguration config; + TunerFilterSettings filterSettings; + switch (tlv.filterSettings.getDiscriminator()) { + case DemuxTlvFilterSettings::FilterSettings::hidl_discriminator::section: { + filterSettings.set( + getAidlSectionSettings(tlv.filterSettings.section())); + break; + } + case DemuxTlvFilterSettings::FilterSettings::hidl_discriminator::bPassthrough: { + filterSettings.set( + tlv.filterSettings.bPassthrough()); + break; + } + default: + filterSettings.set(true); + break; + } + + TunerFilterTlvConfiguration aidlTlv{ + .packetType = static_cast(tlv.packetType), + .isCompressedIpPacket = tlv.isCompressedIpPacket, + .filterSettings = filterSettings, + }; + config.set(aidlTlv); + + return config; +} + +TunerFilterConfiguration FilterClient::getAidlAlpSettings(DemuxAlpFilterSettings alp) { + TunerFilterConfiguration config; + TunerFilterSettings filterSettings; + switch (alp.filterSettings.getDiscriminator()) { + case DemuxAlpFilterSettings::FilterSettings::hidl_discriminator::section: { + filterSettings.set( + getAidlSectionSettings(alp.filterSettings.section())); + break; + } + default: + filterSettings.set(true); + break; + } + + TunerFilterAlpConfiguration aidlAlp{ + .packetType = static_cast(alp.packetType), + .lengthType = static_cast(alp.lengthType), + .filterSettings = filterSettings, + }; + config.set(aidlAlp); + + return config; +} + +TunerFilterAvSettings FilterClient::getAidlAvSettings(DemuxFilterAvSettings hidlAv) { + TunerFilterAvSettings aidlAv{ + .isPassthrough = hidlAv.isPassthrough, + }; + return aidlAv; +} + +TunerFilterSectionSettings FilterClient::getAidlSectionSettings( + DemuxFilterSectionSettings hidlSection) { + TunerFilterSectionSettings aidlSection; + + switch (hidlSection.condition.getDiscriminator()) { + case DemuxFilterSectionSettings::Condition::hidl_discriminator::sectionBits: { + TunerFilterSectionBits sectionBits; + auto hidlSectionBits = hidlSection.condition.sectionBits(); + sectionBits.filter.resize(hidlSectionBits.filter.size()); + sectionBits.mask.resize(hidlSectionBits.mask.size()); + sectionBits.mode.resize(hidlSectionBits.mode.size()); + copy(hidlSectionBits.filter.begin(), hidlSectionBits.filter.end(), + hidlSectionBits.filter.begin()); + copy(hidlSectionBits.mask.begin(), hidlSectionBits.mask.end(), + hidlSectionBits.mask.begin()); + copy(hidlSectionBits.mode.begin(), hidlSectionBits.mode.end(), + hidlSectionBits.mode.begin()); + aidlSection.condition.set(sectionBits); + break; + } + case DemuxFilterSectionSettings::Condition::hidl_discriminator::tableInfo: { + TunerFilterSectionTableInfo tableInfo{ + .tableId = static_cast(hidlSection.condition.tableInfo().tableId), + .version = static_cast(hidlSection.condition.tableInfo().version), + }; + aidlSection.condition.set(tableInfo); + break; + } + } + aidlSection.isCheckCrc = hidlSection.isCheckCrc; + aidlSection.isRepeat = hidlSection.isRepeat; + aidlSection.isRaw = hidlSection.isRaw; + return aidlSection; +} + +TunerFilterPesDataSettings FilterClient::getAidlPesDataSettings( + DemuxFilterPesDataSettings hidlPesData) { + TunerFilterPesDataSettings aidlPesData{ + .streamId = static_cast(hidlPesData.streamId), + .isRaw = hidlPesData.isRaw, + }; + return aidlPesData; +} + +TunerFilterRecordSettings FilterClient::getAidlRecordSettings( + DemuxFilterRecordSettings hidlRecord) { + TunerFilterScIndexMask mask; + switch (hidlRecord.scIndexMask.getDiscriminator()) { + case DemuxFilterRecordSettings::ScIndexMask::hidl_discriminator::sc: { + mask.set(hidlRecord.scIndexMask.sc()); + break; + } + case DemuxFilterRecordSettings::ScIndexMask::hidl_discriminator::scHevc: { + mask.set(hidlRecord.scIndexMask.scHevc()); + break; + } + default: + break; + } + TunerFilterRecordSettings aidlRecord{ + .tsIndexMask = static_cast(hidlRecord.tsIndexMask), + .scIndexType = static_cast(hidlRecord.scIndexType), + .scIndexMask = mask, + }; + return aidlRecord; +} + +TunerFilterDownloadSettings FilterClient::getAidlDownloadSettings( + DemuxFilterDownloadSettings hidlDownload) { + TunerFilterDownloadSettings aidlDownload{ + .downloadId = static_cast(hidlDownload.downloadId), + }; + return aidlDownload; +} void TunerFilterCallback::getHidlFilterEvent(const vector& filterEvents, DemuxFilterEvent& event, DemuxFilterEventExt& eventExt) { diff --git a/media/jni/tuner/FilterClient.h b/media/jni/tuner/FilterClient.h index 89eee3cd36ef2..21919ac102820 100644 --- a/media/jni/tuner/FilterClient.h +++ b/media/jni/tuner/FilterClient.h @@ -33,8 +33,14 @@ using Status = ::ndk::ScopedAStatus; using ::aidl::android::media::tv::tuner::BnTunerFilterCallback; using ::aidl::android::media::tv::tuner::ITunerFilter; +using ::aidl::android::media::tv::tuner::TunerDemuxIpAddress; +using ::aidl::android::media::tv::tuner::TunerFilterAvSettings; using ::aidl::android::media::tv::tuner::TunerFilterConfiguration; +using ::aidl::android::media::tv::tuner::TunerFilterDownloadSettings; using ::aidl::android::media::tv::tuner::TunerFilterEvent; +using ::aidl::android::media::tv::tuner::TunerFilterPesDataSettings; +using ::aidl::android::media::tv::tuner::TunerFilterRecordSettings; +using ::aidl::android::media::tv::tuner::TunerFilterSectionSettings; using ::aidl::android::media::tv::tuner::TunerFilterSettings; using ::android::hardware::EventFlag; @@ -43,8 +49,19 @@ using ::android::hardware::MQDescriptorSync; using ::android::hardware::Return; using ::android::hardware::Void; using ::android::hardware::hidl_handle; +using ::android::hardware::tv::tuner::V1_0::DemuxAlpFilterSettings; +using ::android::hardware::tv::tuner::V1_0::DemuxMmtpFilterSettings; +using ::android::hardware::tv::tuner::V1_0::DemuxFilterAvSettings; +using ::android::hardware::tv::tuner::V1_0::DemuxFilterDownloadSettings; +using ::android::hardware::tv::tuner::V1_0::DemuxFilterPesDataSettings; +using ::android::hardware::tv::tuner::V1_0::DemuxFilterRecordSettings; +using ::android::hardware::tv::tuner::V1_0::DemuxFilterSectionSettings; using ::android::hardware::tv::tuner::V1_0::DemuxFilterSettings; using ::android::hardware::tv::tuner::V1_0::DemuxFilterType; +using ::android::hardware::tv::tuner::V1_0::DemuxIpAddress; +using ::android::hardware::tv::tuner::V1_0::DemuxIpFilterSettings; +using ::android::hardware::tv::tuner::V1_0::DemuxTlvFilterSettings; +using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterSettings; using ::android::hardware::tv::tuner::V1_0::IFilter; using ::android::hardware::tv::tuner::V1_0::Result; using ::android::hardware::tv::tuner::V1_1::AvStreamType; @@ -201,6 +218,21 @@ public: private: TunerFilterConfiguration getAidlFilterSettings(DemuxFilterSettings configure); + + TunerFilterConfiguration getAidlTsSettings(DemuxTsFilterSettings configure); + TunerFilterConfiguration getAidlMmtpSettings(DemuxMmtpFilterSettings mmtp); + TunerFilterConfiguration getAidlIpSettings(DemuxIpFilterSettings ip); + TunerFilterConfiguration getAidlTlvSettings(DemuxTlvFilterSettings tlv); + TunerFilterConfiguration getAidlAlpSettings(DemuxAlpFilterSettings alp); + + TunerFilterAvSettings getAidlAvSettings(DemuxFilterAvSettings hidlAv); + TunerFilterSectionSettings getAidlSectionSettings(DemuxFilterSectionSettings hidlSection); + TunerFilterPesDataSettings getAidlPesDataSettings(DemuxFilterPesDataSettings hidlPesData); + TunerFilterRecordSettings getAidlRecordSettings(DemuxFilterRecordSettings hidlRecord); + TunerFilterDownloadSettings getAidlDownloadSettings(DemuxFilterDownloadSettings hidlDownload); + + void getAidlIpAddress(DemuxIpAddress ipAddr, + TunerDemuxIpAddress& srcIpAddress, TunerDemuxIpAddress& dstIpAddress); Result getFilterMq(); int copyData(uint8_t* buffer, int size); void checkIsMediaFilter(DemuxFilterType type);