Tuner HAL Filter APIs default implementation

Bug: 135709325
Test: manual
Change-Id: If10acac560d3130105079121602be576eb0b225a
diff --git a/tv/tuner/1.0/default/Demux.h b/tv/tuner/1.0/default/Demux.h
index 52f3933..8b00266 100644
--- a/tv/tuner/1.0/default/Demux.h
+++ b/tv/tuner/1.0/default/Demux.h
@@ -18,6 +18,7 @@
 #define ANDROID_HARDWARE_TV_TUNER_V1_0_DEMUX_H_
 
 #include <android/hardware/tv/tuner/1.0/IDemux.h>
+#include <fmq/MessageQueue.h>
 
 using namespace std;
 
@@ -28,9 +29,16 @@
 namespace V1_0 {
 namespace implementation {
 
+using ::android::hardware::EventFlag;
+using ::android::hardware::kSynchronizedReadWrite;
+using ::android::hardware::MessageQueue;
+using ::android::hardware::MQDescriptorSync;
 using ::android::hardware::tv::tuner::V1_0::IDemux;
+using ::android::hardware::tv::tuner::V1_0::IDemuxCallback;
 using ::android::hardware::tv::tuner::V1_0::Result;
 
+using FilterMQ = MessageQueue<uint8_t, kSynchronizedReadWrite>;
+
 class Demux : public IDemux {
   public:
     Demux(uint32_t demuxId);
@@ -39,10 +47,90 @@
 
     virtual Return<Result> close() override;
 
+    virtual Return<void> addFilter(DemuxFilterType type, uint32_t bufferSize,
+                                   const sp<IDemuxCallback>& cb, addFilter_cb _hidl_cb) override;
+
+    virtual Return<void> getFilterQueueDesc(uint32_t filterId,
+                                            getFilterQueueDesc_cb _hidl_cb) override;
+
+    virtual Return<Result> configureFilter(uint32_t filterId,
+                                           const DemuxFilterSettings& settings) override;
+
+    virtual Return<Result> startFilter(uint32_t filterId) override;
+
+    virtual Return<Result> stopFilter(uint32_t filterId) override;
+
+    virtual Return<Result> flushFilter(uint32_t filterId) override;
+
+    virtual Return<Result> removeFilter(uint32_t filterId) override;
+
+    virtual Return<void> getAvSyncHwId(uint32_t filterId, getAvSyncHwId_cb _hidl_cb) override;
+
+    virtual Return<void> getAvSyncTime(AvSyncHwId avSyncHwId, getAvSyncTime_cb _hidl_cb) override;
+
   private:
     virtual ~Demux();
+    /**
+     * To create a FilterMQ with the the next available Filter ID.
+     * Creating Event Flag at the same time.
+     * Add the successfully created/saved FilterMQ into the local list.
+     *
+     * Return false is any of the above processes fails.
+     */
+    bool createAndSaveMQ(uint32_t bufferSize, uint32_t filterId);
+    void deleteEventFlag();
+    bool writeDataToFilterMQ(const std::vector<uint8_t>& data, uint32_t filterId);
+    Result startSectionFilterHandler(DemuxFilterEvent event);
+    Result startPesFilterHandler(DemuxFilterEvent& event);
+    Result startTsFilterHandler();
+    Result startMediaFilterHandler(DemuxFilterEvent& event);
+    Result startRecordFilterHandler(DemuxFilterEvent& event);
+    Result startPcrFilterHandler();
+    bool writeSectionsAndCreateEvent(DemuxFilterEvent& event, uint32_t sectionNum);
+    void filterThreadLoop(DemuxFilterEvent* event);
+    static void* __threadLoop(void* data);
+
     uint32_t mDemuxId;
     uint32_t mSourceFrontendId;
+    /**
+     * Record the last used filer id. Initial value is -1.
+     * Filter Id starts with 0.
+     */
+    uint32_t mLastUsedFilterId = -1;
+    /**
+     * A list of created FilterMQ ptrs.
+     * The array number is the filter ID.
+     */
+    vector<unique_ptr<FilterMQ>> mFilterMQs;
+    vector<DemuxFilterType> mFilterTypes;
+    vector<EventFlag*> mFilterEventFlags;
+    /**
+     * Demux callbacks used on filter events or IO buffer status
+     */
+    vector<sp<IDemuxCallback>> mDemuxCallbacks;
+    /**
+     * How many times a specific filter has written since started
+     */
+    vector<uint16_t> mFilterWriteCount;
+    pthread_t mThreadId = 0;
+    /**
+     * If a specific filter's writing loop is still running
+     */
+    vector<bool> mThreadRunning;
+    /**
+     * Lock to protect writes to the FMQs
+     */
+    std::mutex mWriteLock;
+    /**
+     * How many times a filter should write
+     * TODO make this dynamic/random/can take as a parameter
+     */
+    const uint16_t SECTION_WRITE_COUNT = 10;
+    // A struct that passes the arguments to a newly created filter thread
+    struct ThreadArgs {
+        Demux* user;
+        DemuxFilterEvent* event;
+    };
 };
 
 }  // namespace implementation