Connect Filter Event Callback between the TunerService and TunerClient

Test: make libmedia_tv_tuner
Bug: 174095851
Change-Id: I11b372050428c3e600cea9f3d5cc6fee2d82399c
diff --git a/media/jni/tuner/FilterClient.cpp b/media/jni/tuner/FilterClient.cpp
index bdc8a4f..20b16d7 100644
--- a/media/jni/tuner/FilterClient.cpp
+++ b/media/jni/tuner/FilterClient.cpp
@@ -23,15 +23,19 @@
 #include "FilterClient.h"
 
 using ::aidl::android::media::tv::tuner::TunerFilterAvSettings;
+using ::aidl::android::media::tv::tuner::TunerFilterMonitorEvent;
+using ::aidl::android::media::tv::tuner::TunerFilterScIndexMask;
 using ::aidl::android::media::tv::tuner::TunerFilterSharedHandleInfo;
 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::DemuxStreamId;
 using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterSettings;
 using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterType;
+using ::android::hardware::tv::tuner::V1_1::ScramblingStatus;
 
 namespace android {
 
@@ -294,6 +298,10 @@
         return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
     }
 
+    if (filterEvents.size() == 0) {
+        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_ARGUMENT));
+    }
+
     DemuxFilterEvent event;
     DemuxFilterEventExt eventExt;
     getHidlFilterEvent(filterEvents, event, eventExt);
@@ -348,37 +356,46 @@
 
 
 void TunerFilterCallback::getHidlFilterEvent(const vector<TunerFilterEvent>& filterEvents,
-        DemuxFilterEvent& event, DemuxFilterEventExt& /*eventExt*/) {
-    // TODO: finish handling extended evets and other filter event types
+        DemuxFilterEvent& event, DemuxFilterEventExt& eventExt) {
     switch (filterEvents[0].getTag()) {
         case  TunerFilterEvent::media: {
-            for (int i = 0; i < filterEvents.size(); i++) {
-                hidl_handle handle = hidl_handle(
-                        makeFromAidl(filterEvents[i].get<TunerFilterEvent::media>().avMemory));
-                int size = event.events.size();
-                event.events.resize(size + 1);
-                event.events[size].media({
-                    .avMemory = handle,
-                    .streamId = static_cast<DemuxStreamId>(
-                            filterEvents[i].get<TunerFilterEvent::media>().streamId),
-                    .isPtsPresent =
-                            filterEvents[i].get<TunerFilterEvent::media>().isPtsPresent,
-                    .pts = static_cast<uint64_t>(
-                            filterEvents[i].get<TunerFilterEvent::media>().pts),
-                    .dataLength = static_cast<uint32_t>(
-                            filterEvents[i].get<TunerFilterEvent::media>().dataLength),
-                    .offset = static_cast<uint32_t>(
-                            filterEvents[i].get<TunerFilterEvent::media>().offset),
-                    .isSecureMemory =
-                            filterEvents[i].get<TunerFilterEvent::media>().isSecureMemory,
-                    .avDataId = static_cast<uint64_t>(
-                            filterEvents[i].get<TunerFilterEvent::media>().avDataId),
-                    .mpuSequenceNumber = static_cast<uint32_t>(
-                            filterEvents[i].get<TunerFilterEvent::media>().offset),
-                    .isPesPrivateData =
-                            filterEvents[i].get<TunerFilterEvent::media>().isPesPrivateData,
-                });
-            }
+            getHidlMediaEvent(filterEvents, event);
+            break;
+        }
+        case  TunerFilterEvent::section: {
+            getHidlSectionEvent(filterEvents, event);
+            break;
+        }
+        case  TunerFilterEvent::pes: {
+            getHidlPesEvent(filterEvents, event);
+            break;
+        }
+        case  TunerFilterEvent::tsRecord: {
+            getHidlTsRecordEvent(filterEvents, event, eventExt);
+            break;
+        }
+        case  TunerFilterEvent::mmtpRecord: {
+            getHidlMmtpRecordEvent(filterEvents, event, eventExt);
+            break;
+        }
+        case  TunerFilterEvent::download: {
+            getHidlDownloadEvent(filterEvents, event);
+            break;
+        }
+        case  TunerFilterEvent::ipPayload: {
+            getHidlIpPayloadEvent(filterEvents, event);
+            break;
+        }
+        case  TunerFilterEvent::temi: {
+            getHidlTemiEvent(filterEvents, event);
+            break;
+        }
+        case  TunerFilterEvent::monitor: {
+            getHidlMonitorEvent(filterEvents, eventExt);
+            break;
+        }
+        case  TunerFilterEvent::startId: {
+            getHidlRestartEvent(filterEvents, eventExt);
             break;
         }
         default:
@@ -386,6 +403,211 @@
     }
 }
 
+void TunerFilterCallback::getHidlMediaEvent(
+        const vector<TunerFilterEvent>& filterEvents, DemuxFilterEvent& event) {
+    for (int i = 0; i < filterEvents.size(); i++) {
+        hidl_handle handle = hidl_handle(makeFromAidl(filterEvents[i]
+                .get<TunerFilterEvent::media>().avMemory));
+        event.events.resize(i + 1);
+        event.events[i].media({
+            .avMemory = handle,
+            .streamId = static_cast<DemuxStreamId>(filterEvents[i]
+                    .get<TunerFilterEvent::media>().streamId),
+            .isPtsPresent = filterEvents[i]
+                    .get<TunerFilterEvent::media>().isPtsPresent,
+            .pts = static_cast<uint64_t>(filterEvents[i]
+                    .get<TunerFilterEvent::media>().pts),
+            .dataLength = static_cast<uint32_t>(filterEvents[i]
+                    .get<TunerFilterEvent::media>().dataLength),
+            .offset = static_cast<uint32_t>(filterEvents[i]
+                    .get<TunerFilterEvent::media>().offset),
+            .isSecureMemory = filterEvents[i]
+                    .get<TunerFilterEvent::media>().isSecureMemory,
+            .avDataId = static_cast<uint64_t>(filterEvents[i]
+                    .get<TunerFilterEvent::media>().avDataId),
+            .mpuSequenceNumber = static_cast<uint32_t>(filterEvents[i]
+                    .get<TunerFilterEvent::media>().offset),
+            .isPesPrivateData = filterEvents[i]
+                    .get<TunerFilterEvent::media>().isPesPrivateData,
+        });
+
+        if (filterEvents[i].get<TunerFilterEvent::media>().isAudioExtraMetaData) {
+            event.events[i].media().extraMetaData.audio({
+                .adFade = static_cast<uint8_t>(filterEvents[i]
+                        .get<TunerFilterEvent::media>().audio.adFade),
+                .adPan = static_cast<uint8_t>(filterEvents[i]
+                        .get<TunerFilterEvent::media>().audio.adPan),
+                .versionTextTag = static_cast<uint8_t>(filterEvents[i]
+                        .get<TunerFilterEvent::media>().audio.versionTextTag),
+                .adGainCenter = static_cast<uint8_t>(filterEvents[i]
+                        .get<TunerFilterEvent::media>().audio.adGainCenter),
+                .adGainFront = static_cast<uint8_t>(filterEvents[i]
+                        .get<TunerFilterEvent::media>().audio.adGainFront),
+                .adGainSurround = static_cast<uint8_t>(filterEvents[i]
+                        .get<TunerFilterEvent::media>().audio.adGainSurround),
+            });
+        } else {
+            event.events[i].media().extraMetaData.noinit();
+        }
+    }
+}
+
+void TunerFilterCallback::getHidlSectionEvent(
+        const vector<TunerFilterEvent>& filterEvents, DemuxFilterEvent& event) {
+    for (int i = 0; i < filterEvents.size(); i++) {
+        auto section = filterEvents[i].get<TunerFilterEvent::section>();
+        event.events.resize(i + 1);
+        event.events[i].section({
+            .tableId = static_cast<uint16_t>(section.tableId),
+            .version = static_cast<uint16_t>(section.version),
+            .sectionNum = static_cast<uint16_t>(section.sectionNum),
+            .dataLength = static_cast<uint16_t>(section.dataLength),
+        });
+    }
+}
+
+void TunerFilterCallback::getHidlPesEvent(
+        const vector<TunerFilterEvent>& filterEvents, DemuxFilterEvent& event) {
+    for (int i = 0; i < filterEvents.size(); i++) {
+        auto pes = filterEvents[i].get<TunerFilterEvent::pes>();
+        event.events.resize(i + 1);
+        event.events[i].pes({
+            .streamId = static_cast<DemuxStreamId>(pes.streamId),
+            .dataLength = static_cast<uint16_t>(pes.dataLength),
+            .mpuSequenceNumber = static_cast<uint32_t>(pes.mpuSequenceNumber),
+        });
+    }
+}
+
+void TunerFilterCallback::getHidlTsRecordEvent(const vector<TunerFilterEvent>& filterEvents,
+        DemuxFilterEvent& event, DemuxFilterEventExt& eventExt) {
+    for (int i = 0; i < filterEvents.size(); i++) {
+        auto ts = filterEvents[i].get<TunerFilterEvent::tsRecord>();
+        event.events.resize(i + 1);
+        event.events[i].tsRecord({
+            .tsIndexMask = static_cast<uint32_t>(ts.tsIndexMask),
+            .byteNumber = static_cast<uint64_t>(ts.byteNumber),
+        });
+        event.events[i].tsRecord().pid.tPid(static_cast<DemuxTpid>(ts.pid));
+
+        switch (ts.scIndexMask.getTag()) {
+            case TunerFilterScIndexMask::sc: {
+                event.events[i].tsRecord().scIndexMask.sc(
+                        ts.scIndexMask.get<TunerFilterScIndexMask::sc>());
+                break;
+            }
+            case TunerFilterScIndexMask::scHevc: {
+                event.events[i].tsRecord().scIndexMask.scHevc(
+                        ts.scIndexMask.get<TunerFilterScIndexMask::scHevc>());
+                break;
+            }
+            default:
+                break;
+        }
+
+        eventExt.events.resize(i + 1);
+        if (ts.isExtended) {
+            eventExt.events[i].tsRecord({
+                .pts = static_cast<uint64_t>(ts.pts),
+                .firstMbInSlice = static_cast<uint32_t>(ts.firstMbInSlice),
+            });
+        } else {
+            eventExt.events[i].noinit();
+        }
+    }
+}
+
+void TunerFilterCallback::getHidlMmtpRecordEvent(const vector<TunerFilterEvent>& filterEvents,
+        DemuxFilterEvent& event, DemuxFilterEventExt& eventExt) {
+    for (int i = 0; i < filterEvents.size(); i++) {
+        auto mmtp = filterEvents[i].get<TunerFilterEvent::mmtpRecord>();
+        event.events.resize(i + 1);
+        event.events[i].mmtpRecord({
+            .scHevcIndexMask = static_cast<uint32_t>(mmtp.scHevcIndexMask),
+            .byteNumber = static_cast<uint64_t>(mmtp.byteNumber),
+        });
+
+        eventExt.events.resize(i + 1);
+        if (mmtp.isExtended) {
+            eventExt.events[i].mmtpRecord({
+                .pts = static_cast<uint64_t>(mmtp.pts),
+                .mpuSequenceNumber = static_cast<uint32_t>(mmtp.mpuSequenceNumber),
+                .firstMbInSlice = static_cast<uint32_t>(mmtp.firstMbInSlice),
+                .tsIndexMask = static_cast<uint32_t>(mmtp.tsIndexMask),
+            });
+        } else {
+            eventExt.events[i].noinit();
+        }
+    }
+}
+
+void TunerFilterCallback::getHidlDownloadEvent(const vector<TunerFilterEvent>& filterEvents,
+        DemuxFilterEvent& event) {
+    for (int i = 0; i < filterEvents.size(); i++) {
+        auto download = filterEvents[i].get<TunerFilterEvent::download>();
+        event.events.resize(i + 1);
+        event.events[i].download({
+            .itemId = static_cast<uint32_t>(download.itemId),
+            .mpuSequenceNumber = static_cast<uint32_t>(download.mpuSequenceNumber),
+            .itemFragmentIndex = static_cast<uint32_t>(download.itemFragmentIndex),
+            .lastItemFragmentIndex = static_cast<uint32_t>(download.lastItemFragmentIndex),
+            .dataLength = static_cast<uint16_t>(download.dataLength),
+        });
+    }
+}
+
+void TunerFilterCallback::getHidlIpPayloadEvent(const vector<TunerFilterEvent>& filterEvents,
+        DemuxFilterEvent& event) {
+    for (int i = 0; i < filterEvents.size(); i++) {
+        auto ip = filterEvents[i].get<TunerFilterEvent::ipPayload>();
+        event.events.resize(i + 1);
+        event.events[i].ipPayload({
+            .dataLength = static_cast<uint16_t>(ip.dataLength),
+        });
+    }
+}
+
+void TunerFilterCallback::getHidlTemiEvent(const vector<TunerFilterEvent>& filterEvents,
+        DemuxFilterEvent& event) {
+    for (int i = 0; i < filterEvents.size(); i++) {
+        auto temi = filterEvents[i].get<TunerFilterEvent::temi>();
+        event.events.resize(i + 1);
+        event.events[i].temi({
+            .pts = static_cast<uint64_t>(temi.pts),
+            .descrTag = static_cast<uint8_t>(temi.descrTag),
+        });
+        vector<uint8_t> descrData(temi.descrData.size());
+        copy(temi.descrData.begin(), temi.descrData.end(), descrData.begin());
+    }
+}
+
+void TunerFilterCallback::getHidlMonitorEvent(const vector<TunerFilterEvent>& filterEvents,
+        DemuxFilterEventExt& eventExt) {
+    auto monitor = filterEvents[0].get<TunerFilterEvent::monitor>();
+    eventExt.events.resize(1);
+    switch (monitor.getTag()) {
+        case TunerFilterMonitorEvent::scramblingStatus: {
+            eventExt.events[0].monitorEvent().scramblingStatus(
+                    static_cast<ScramblingStatus>(monitor.scramblingStatus));
+            break;
+        }
+        case TunerFilterMonitorEvent::cid: {
+            eventExt.events[0].monitorEvent().cid(static_cast<uint32_t>(monitor.cid));
+            break;
+        }
+        default:
+            eventExt.events[0].noinit();
+            break;
+    }
+}
+
+void TunerFilterCallback::getHidlRestartEvent(const vector<TunerFilterEvent>& filterEvents,
+        DemuxFilterEventExt& eventExt) {
+    uint32_t startId = filterEvents[0].get<TunerFilterEvent::startId>();
+    eventExt.events.resize(1);
+    eventExt.events[0].startId(static_cast<uint32_t>(startId));
+}
+
 Result FilterClient::getFilterMq() {
     if (mFilter == NULL) {
         return Result::INVALID_STATE;
diff --git a/media/jni/tuner/FilterClient.h b/media/jni/tuner/FilterClient.h
index f5539e0..89eee3c 100644
--- a/media/jni/tuner/FilterClient.h
+++ b/media/jni/tuner/FilterClient.h
@@ -71,6 +71,26 @@
 private:
     void getHidlFilterEvent(const vector<TunerFilterEvent>& filterEvents,
             DemuxFilterEvent& event, DemuxFilterEventExt& eventExt);
+    void getHidlMediaEvent(
+            const vector<TunerFilterEvent>& filterEvents, DemuxFilterEvent& event);
+    void getHidlSectionEvent(
+            const vector<TunerFilterEvent>& filterEvents, DemuxFilterEvent& event);
+    void getHidlPesEvent(
+            const vector<TunerFilterEvent>& filterEvents, DemuxFilterEvent& event);
+    void getHidlTsRecordEvent(const vector<TunerFilterEvent>& filterEvents,
+            DemuxFilterEvent& event, DemuxFilterEventExt& eventExt);
+    void getHidlMmtpRecordEvent(const vector<TunerFilterEvent>& filterEvents,
+            DemuxFilterEvent& event, DemuxFilterEventExt& eventExt);
+    void getHidlDownloadEvent(
+            const vector<TunerFilterEvent>& filterEvents, DemuxFilterEvent& event);
+    void getHidlIpPayloadEvent(
+            const vector<TunerFilterEvent>& filterEvents, DemuxFilterEvent& event);
+    void getHidlTemiEvent(
+            const vector<TunerFilterEvent>& filterEvents, DemuxFilterEvent& event);
+    void getHidlMonitorEvent(
+            const vector<TunerFilterEvent>& filterEvents, DemuxFilterEventExt& eventExt);
+    void getHidlRestartEvent(
+            const vector<TunerFilterEvent>& filterEvents, DemuxFilterEventExt& eventExt);
 
     sp<FilterClientCallback> mFilterClientCallback;
 };