Connect FilterSettings between TunerFilter and FilterClient

Test: make
Bug: 174095851
Change-Id: I75b01a67ab0e3965c09535c12f2b893b5ba4365a
diff --git a/media/jni/tuner/FilterClient.cpp b/media/jni/tuner/FilterClient.cpp
index 20b16d7..6b78817 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 @@
 
 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<TunerFilterSettings::av>(av);
-                    break;
-                }
-                default:
-                    break;
-            }
-
-            TunerFilterTsConfiguration ts{
-                .tpid = configure.ts().tpid,
-                .filterSettings = filterSettings,
-            };
-            config.set<TunerFilterConfiguration::ts>(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<TunerFilterSettings::av>(
+                    getAidlAvSettings(ts.filterSettings.av()));
+            break;
+        }
+        case DemuxTsFilterSettings::FilterSettings::hidl_discriminator::section: {
+            filterSettings.set<TunerFilterSettings::section>(
+                    getAidlSectionSettings(ts.filterSettings.section()));
+            break;
+        }
+        case DemuxTsFilterSettings::FilterSettings::hidl_discriminator::pesData: {
+            filterSettings.set<TunerFilterSettings::pesData>(
+                    getAidlPesDataSettings(ts.filterSettings.pesData()));
+            break;
+        }
+        case DemuxTsFilterSettings::FilterSettings::hidl_discriminator::record: {
+            filterSettings.set<TunerFilterSettings::record>(
+                    getAidlRecordSettings(ts.filterSettings.record()));
+            break;
+        }
+        default:
+            filterSettings.set<TunerFilterSettings::nothing>(true);
+            break;
+    }
+
+    TunerFilterTsConfiguration aidlTs{
+        .tpid = static_cast<char16_t>(ts.tpid),
+        .filterSettings = filterSettings,
+    };
+    config.set<TunerFilterConfiguration::ts>(aidlTs);
+
+    return config;
+}
+
+TunerFilterConfiguration FilterClient::getAidlMmtpSettings(DemuxMmtpFilterSettings mmtp) {
+    TunerFilterConfiguration config;
+    TunerFilterSettings filterSettings;
+    switch (mmtp.filterSettings.getDiscriminator()) {
+        case DemuxMmtpFilterSettings::FilterSettings::hidl_discriminator::av: {
+            filterSettings.set<TunerFilterSettings::av>(
+                    getAidlAvSettings(mmtp.filterSettings.av()));
+            break;
+        }
+        case DemuxMmtpFilterSettings::FilterSettings::hidl_discriminator::section: {
+            filterSettings.set<TunerFilterSettings::section>(
+                    getAidlSectionSettings(mmtp.filterSettings.section()));
+            break;
+        }
+        case DemuxMmtpFilterSettings::FilterSettings::hidl_discriminator::pesData: {
+            filterSettings.set<TunerFilterSettings::pesData>(
+                    getAidlPesDataSettings(mmtp.filterSettings.pesData()));
+            break;
+        }
+        case DemuxMmtpFilterSettings::FilterSettings::hidl_discriminator::record: {
+            filterSettings.set<TunerFilterSettings::record>(
+                    getAidlRecordSettings(mmtp.filterSettings.record()));
+            break;
+        }
+        case DemuxMmtpFilterSettings::FilterSettings::hidl_discriminator::download: {
+            filterSettings.set<TunerFilterSettings::download>(
+                    getAidlDownloadSettings(mmtp.filterSettings.download()));
+            break;
+        }
+        default:
+            filterSettings.set<TunerFilterSettings::nothing>(true);
+            break;
+    }
+
+    TunerFilterMmtpConfiguration aidlMmtp{
+        .mmtpPid = static_cast<char16_t>(mmtp.mmtpPid),
+        .filterSettings = filterSettings,
+    };
+    config.set<TunerFilterConfiguration::mmtp>(aidlMmtp);
+
+    return config;
+}
+
+TunerFilterConfiguration FilterClient::getAidlIpSettings(DemuxIpFilterSettings ip) {
+    TunerFilterConfiguration config;
+    TunerFilterSettings filterSettings;
+    switch (ip.filterSettings.getDiscriminator()) {
+        case DemuxIpFilterSettings::FilterSettings::hidl_discriminator::section: {
+            filterSettings.set<TunerFilterSettings::section>(
+                    getAidlSectionSettings(ip.filterSettings.section()));
+            break;
+        }
+        case DemuxIpFilterSettings::FilterSettings::hidl_discriminator::bPassthrough: {
+            filterSettings.set<TunerFilterSettings::isPassthrough>(
+                    ip.filterSettings.bPassthrough());
+            break;
+        }
+        default:
+            filterSettings.set<TunerFilterSettings::nothing>(true);
+            break;
+    }
+
+    TunerDemuxIpAddressSettings ipAddr{
+        .srcPort = static_cast<char16_t>(ip.ipAddr.srcPort),
+        .dstPort = static_cast<char16_t>(ip.ipAddr.dstPort),
+    };
+    getAidlIpAddress(ip.ipAddr, ipAddr.srcIpAddress, ipAddr.dstIpAddress);
+
+    TunerFilterIpConfiguration aidlIp{
+        .ipAddr = ipAddr,
+        .filterSettings = filterSettings,
+    };
+    config.set<TunerFilterConfiguration::ip>(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<TunerFilterSettings::section>(
+                    getAidlSectionSettings(tlv.filterSettings.section()));
+            break;
+        }
+        case DemuxTlvFilterSettings::FilterSettings::hidl_discriminator::bPassthrough: {
+            filterSettings.set<TunerFilterSettings::isPassthrough>(
+                    tlv.filterSettings.bPassthrough());
+            break;
+        }
+        default:
+            filterSettings.set<TunerFilterSettings::nothing>(true);
+            break;
+    }
+
+    TunerFilterTlvConfiguration aidlTlv{
+        .packetType = static_cast<int8_t>(tlv.packetType),
+        .isCompressedIpPacket = tlv.isCompressedIpPacket,
+        .filterSettings = filterSettings,
+    };
+    config.set<TunerFilterConfiguration::tlv>(aidlTlv);
+
+    return config;
+}
+
+TunerFilterConfiguration FilterClient::getAidlAlpSettings(DemuxAlpFilterSettings alp) {
+    TunerFilterConfiguration config;
+    TunerFilterSettings filterSettings;
+    switch (alp.filterSettings.getDiscriminator()) {
+        case DemuxAlpFilterSettings::FilterSettings::hidl_discriminator::section: {
+            filterSettings.set<TunerFilterSettings::section>(
+                    getAidlSectionSettings(alp.filterSettings.section()));
+            break;
+        }
+        default:
+            filterSettings.set<TunerFilterSettings::nothing>(true);
+            break;
+    }
+
+    TunerFilterAlpConfiguration aidlAlp{
+        .packetType = static_cast<int8_t>(alp.packetType),
+        .lengthType = static_cast<int8_t>(alp.lengthType),
+        .filterSettings = filterSettings,
+    };
+    config.set<TunerFilterConfiguration::alp>(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<TunerFilterSectionCondition::sectionBits>(sectionBits);
+            break;
+        }
+        case DemuxFilterSectionSettings::Condition::hidl_discriminator::tableInfo: {
+            TunerFilterSectionTableInfo tableInfo{
+                .tableId = static_cast<char16_t>(hidlSection.condition.tableInfo().tableId),
+                .version = static_cast<char16_t>(hidlSection.condition.tableInfo().version),
+            };
+            aidlSection.condition.set<TunerFilterSectionCondition::tableInfo>(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<char16_t>(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<TunerFilterScIndexMask::sc>(hidlRecord.scIndexMask.sc());
+            break;
+        }
+        case DemuxFilterRecordSettings::ScIndexMask::hidl_discriminator::scHevc: {
+            mask.set<TunerFilterScIndexMask::scHevc>(hidlRecord.scIndexMask.scHevc());
+            break;
+        }
+        default:
+            break;
+    }
+    TunerFilterRecordSettings aidlRecord{
+        .tsIndexMask = static_cast<int32_t>(hidlRecord.tsIndexMask),
+        .scIndexType = static_cast<int32_t>(hidlRecord.scIndexType),
+        .scIndexMask = mask,
+    };
+    return aidlRecord;
+}
+
+TunerFilterDownloadSettings FilterClient::getAidlDownloadSettings(
+        DemuxFilterDownloadSettings hidlDownload) {
+    TunerFilterDownloadSettings aidlDownload{
+        .downloadId = static_cast<int32_t>(hidlDownload.downloadId),
+    };
+    return aidlDownload;
+}
 
 void TunerFilterCallback::getHidlFilterEvent(const vector<TunerFilterEvent>& filterEvents,
         DemuxFilterEvent& event, DemuxFilterEventExt& eventExt) {
diff --git a/media/jni/tuner/FilterClient.h b/media/jni/tuner/FilterClient.h
index 89eee3c..21919ac 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::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 @@
 
 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);