1 /**
2  * Copyright 2021, The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ANDROID_MEDIA_TUNERFILTER_H
18 #define ANDROID_MEDIA_TUNERFILTER_H
19 
20 #include <aidl/android/media/tv/tuner/BnTunerFilter.h>
21 #include <aidl/android/media/tv/tuner/ITunerFilterCallback.h>
22 #include <aidlcommonsupport/NativeHandle.h>
23 #include <android/hardware/tv/tuner/1.0/ITuner.h>
24 #include <android/hardware/tv/tuner/1.1/IFilter.h>
25 #include <android/hardware/tv/tuner/1.1/IFilterCallback.h>
26 #include <android/hardware/tv/tuner/1.1/types.h>
27 #include <media/stagefright/foundation/ADebug.h>
28 #include <fmq/ConvertMQDescriptors.h>
29 #include <fmq/MessageQueue.h>
30 
31 using Status = ::ndk::ScopedAStatus;
32 using ::aidl::android::hardware::common::fmq::MQDescriptor;
33 using ::aidl::android::hardware::common::fmq::SynchronizedReadWrite;
34 using ::aidl::android::media::tv::tuner::BnTunerFilter;
35 using ::aidl::android::media::tv::tuner::ITunerFilterCallback;
36 using ::aidl::android::media::tv::tuner::TunerDemuxIpAddress;
37 using ::aidl::android::media::tv::tuner::TunerFilterConfiguration;
38 using ::aidl::android::media::tv::tuner::TunerFilterDownloadEvent;
39 using ::aidl::android::media::tv::tuner::TunerFilterIpPayloadEvent;
40 using ::aidl::android::media::tv::tuner::TunerFilterEvent;
41 using ::aidl::android::media::tv::tuner::TunerFilterMediaEvent;
42 using ::aidl::android::media::tv::tuner::TunerFilterMmtpRecordEvent;
43 using ::aidl::android::media::tv::tuner::TunerFilterMonitorEvent;
44 using ::aidl::android::media::tv::tuner::TunerFilterPesEvent;
45 using ::aidl::android::media::tv::tuner::TunerFilterScIndexMask;
46 using ::aidl::android::media::tv::tuner::TunerFilterSectionEvent;
47 using ::aidl::android::media::tv::tuner::TunerFilterSharedHandleInfo;
48 using ::aidl::android::media::tv::tuner::TunerFilterSettings;
49 using ::aidl::android::media::tv::tuner::TunerFilterTemiEvent;
50 using ::aidl::android::media::tv::tuner::TunerFilterTsRecordEvent;
51 using ::android::hardware::MQDescriptorSync;
52 using ::android::hardware::Return;
53 using ::android::hardware::Void;
54 using ::android::hardware::hidl_array;
55 using ::android::hardware::tv::tuner::V1_0::DemuxAlpFilterSettings;
56 using ::android::hardware::tv::tuner::V1_0::DemuxFilterAvSettings;
57 using ::android::hardware::tv::tuner::V1_0::DemuxFilterDownloadEvent;
58 using ::android::hardware::tv::tuner::V1_0::DemuxFilterDownloadSettings;
59 using ::android::hardware::tv::tuner::V1_0::DemuxFilterIpPayloadEvent;
60 using ::android::hardware::tv::tuner::V1_0::DemuxFilterEvent;
61 using ::android::hardware::tv::tuner::V1_0::DemuxFilterMediaEvent;
62 using ::android::hardware::tv::tuner::V1_0::DemuxFilterMmtpRecordEvent;
63 using ::android::hardware::tv::tuner::V1_0::DemuxFilterPesDataSettings;
64 using ::android::hardware::tv::tuner::V1_0::DemuxFilterPesEvent;
65 using ::android::hardware::tv::tuner::V1_0::DemuxFilterRecordSettings;
66 using ::android::hardware::tv::tuner::V1_0::DemuxFilterSectionEvent;
67 using ::android::hardware::tv::tuner::V1_0::DemuxFilterSectionSettings;
68 using ::android::hardware::tv::tuner::V1_0::DemuxFilterSettings;
69 using ::android::hardware::tv::tuner::V1_0::DemuxFilterStatus;
70 using ::android::hardware::tv::tuner::V1_0::DemuxFilterTemiEvent;
71 using ::android::hardware::tv::tuner::V1_0::DemuxFilterTsRecordEvent;
72 using ::android::hardware::tv::tuner::V1_0::DemuxIpFilterSettings;
73 using ::android::hardware::tv::tuner::V1_0::DemuxMmtpFilterSettings;
74 using ::android::hardware::tv::tuner::V1_0::DemuxTlvFilterSettings;
75 using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterSettings;
76 using ::android::hardware::tv::tuner::V1_0::DemuxPid;
77 using ::android::hardware::tv::tuner::V1_0::IFilter;
78 using ::android::hardware::tv::tuner::V1_1::AvStreamType;
79 using ::android::hardware::tv::tuner::V1_1::DemuxFilterEventExt;
80 using ::android::hardware::tv::tuner::V1_1::DemuxFilterMonitorEvent;
81 using ::android::hardware::tv::tuner::V1_1::DemuxFilterTsRecordEventExt;
82 using ::android::hardware::tv::tuner::V1_1::IFilterCallback;
83 
84 namespace android {
85 
86 using MQDesc = MQDescriptorSync<uint8_t>;
87 using AidlMQDesc = MQDescriptor<int8_t, SynchronizedReadWrite>;
88 
89 const static int IP_V4_LENGTH = 4;
90 const static int IP_V6_LENGTH = 16;
91 
92 class TunerFilter : public BnTunerFilter {
93 
94 public:
95     TunerFilter(sp<IFilter> filter, int mainType, int subTyp);
96     virtual ~TunerFilter();
97     Status getId(int32_t* _aidl_return) override;
98     Status getId64Bit(int64_t* _aidl_return) override;
99     Status getQueueDesc(AidlMQDesc* _aidl_return) override;
100     Status configure(const TunerFilterConfiguration& config) override;
101     Status configureMonitorEvent(int monitorEventType) override;
102     Status configureIpFilterContextId(int cid) override;
103     Status configureAvStreamType(int avStreamType) override;
104     Status getAvSharedHandleInfo(TunerFilterSharedHandleInfo* _aidl_return) override;
105     Status releaseAvHandle(const ::aidl::android::hardware::common::NativeHandle& handle,
106             int64_t avDataId) override;
107     Status setDataSource(const std::shared_ptr<ITunerFilter>& filter) override;
108     Status start() override;
109     Status stop() override;
110     Status flush() override;
111     Status close() override;
112     sp<IFilter> getHalFilter();
113 
114     struct FilterCallback : public IFilterCallback {
FilterCallbackFilterCallback115         FilterCallback(const std::shared_ptr<ITunerFilterCallback> tunerFilterCallback)
116                 : mTunerFilterCallback(tunerFilterCallback) {};
117 
118         virtual Return<void> onFilterEvent(const DemuxFilterEvent& filterEvent);
119         virtual Return<void> onFilterEvent_1_1(const DemuxFilterEvent& filterEvent,
120                 const DemuxFilterEventExt& filterEventExt);
121         virtual Return<void> onFilterStatus(DemuxFilterStatus status);
122 
123         void getAidlFilterEvent(std::vector<DemuxFilterEvent::Event>& events,
124                 std::vector<DemuxFilterEventExt::Event>& eventsExt,
125                 std::vector<TunerFilterEvent>& tunerEvent);
126 
127         void getMediaEvent(
128                 std::vector<DemuxFilterEvent::Event>& events, std::vector<TunerFilterEvent>& res);
129         void getSectionEvent(
130                 std::vector<DemuxFilterEvent::Event>& events, std::vector<TunerFilterEvent>& res);
131         void getPesEvent(
132                 std::vector<DemuxFilterEvent::Event>& events, std::vector<TunerFilterEvent>& res);
133         void getTsRecordEvent(
134                 std::vector<DemuxFilterEvent::Event>& events,
135                 std::vector<DemuxFilterEventExt::Event>& eventsExt,
136                 std::vector<TunerFilterEvent>& res);
137         void getMmtpRecordEvent(
138                 std::vector<DemuxFilterEvent::Event>& events,
139                 std::vector<DemuxFilterEventExt::Event>& eventsExt,
140                 std::vector<TunerFilterEvent>& res);
141         void getDownloadEvent(
142                 std::vector<DemuxFilterEvent::Event>& events, std::vector<TunerFilterEvent>& res);
143         void getIpPayloadEvent(
144                 std::vector<DemuxFilterEvent::Event>& events, std::vector<TunerFilterEvent>& res);
145         void getTemiEvent(
146                 std::vector<DemuxFilterEvent::Event>& events, std::vector<TunerFilterEvent>& res);
147         void getMonitorEvent(
148                 std::vector<DemuxFilterEventExt::Event>& eventsExt,
149                 std::vector<TunerFilterEvent>& res);
150         void getRestartEvent(
151                 std::vector<DemuxFilterEventExt::Event>& eventsExt,
152                 std::vector<TunerFilterEvent>& res);
153 
154         std::shared_ptr<ITunerFilterCallback> mTunerFilterCallback;
155     };
156 
157 private:
158     DemuxFilterAvSettings getAvSettings(const TunerFilterSettings& settings);
159     DemuxFilterSectionSettings getSectionSettings(const TunerFilterSettings& settings);
160     DemuxFilterPesDataSettings getPesDataSettings(const TunerFilterSettings& settings);
161     DemuxFilterRecordSettings getRecordSettings(const TunerFilterSettings& settings);
162     DemuxFilterDownloadSettings getDownloadSettings(const TunerFilterSettings& settings);
163 
164     bool isAudioFilter();
165     bool isVideoFilter();
166     bool getHidlAvStreamType(int avStreamType, AvStreamType& type);
167 
168     void getHidlTsSettings(
169         const TunerFilterConfiguration& config, DemuxFilterSettings& settings);
170     void getHidlMmtpSettings(
171         const TunerFilterConfiguration& config, DemuxFilterSettings& settings);
172     void getHidlIpSettings(
173         const TunerFilterConfiguration& config, DemuxFilterSettings& settings);
174     void getHidlTlvSettings(
175         const TunerFilterConfiguration& config, DemuxFilterSettings& settings);
176     void getHidlAlpSettings(
177         const TunerFilterConfiguration& config, DemuxFilterSettings& settings);
178 
179     hidl_array<uint8_t, IP_V4_LENGTH> getIpV4Address(TunerDemuxIpAddress addr);
180     hidl_array<uint8_t, IP_V6_LENGTH> getIpV6Address(TunerDemuxIpAddress addr);
181 
182     sp<IFilter> mFilter;
183     sp<::android::hardware::tv::tuner::V1_1::IFilter> mFilter_1_1;
184     int32_t mId;
185     int64_t mId64Bit;
186     int mMainType;
187     int mSubType;
188 };
189 
190 } // namespace android
191 
192 #endif // ANDROID_MEDIA_TUNERFILTER_H
193