• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_TUNERHIDLFILTER_H
18 #define ANDROID_MEDIA_TUNERHIDLFILTER_H
19 
20 #include <aidl/android/hardware/tv/tuner/AvStreamType.h>
21 #include <aidl/android/hardware/tv/tuner/DemuxFilterAvSettings.h>
22 #include <aidl/android/hardware/tv/tuner/DemuxFilterDownloadSettings.h>
23 #include <aidl/android/hardware/tv/tuner/DemuxFilterEvent.h>
24 #include <aidl/android/hardware/tv/tuner/DemuxFilterPesDataSettings.h>
25 #include <aidl/android/hardware/tv/tuner/DemuxFilterRecordSettings.h>
26 #include <aidl/android/hardware/tv/tuner/DemuxFilterSectionSettings.h>
27 #include <aidl/android/hardware/tv/tuner/DemuxFilterSettings.h>
28 #include <aidl/android/hardware/tv/tuner/DemuxFilterStatus.h>
29 #include <aidl/android/hardware/tv/tuner/DemuxFilterType.h>
30 #include <aidl/android/media/tv/tuner/BnTunerFilter.h>
31 #include <aidl/android/media/tv/tuner/ITunerFilterCallback.h>
32 #include <android/hardware/tv/tuner/1.0/ITuner.h>
33 #include <android/hardware/tv/tuner/1.1/IFilter.h>
34 #include <android/hardware/tv/tuner/1.1/IFilterCallback.h>
35 #include <android/hardware/tv/tuner/1.1/types.h>
36 #include <fmq/MessageQueue.h>
37 #include <utils/Mutex.h>
38 
39 #include <map>
40 
41 using ::aidl::android::hardware::common::NativeHandle;
42 using ::aidl::android::hardware::common::fmq::MQDescriptor;
43 using ::aidl::android::hardware::common::fmq::SynchronizedReadWrite;
44 using ::aidl::android::hardware::tv::tuner::AvStreamType;
45 using ::aidl::android::hardware::tv::tuner::DemuxFilterAvSettings;
46 using ::aidl::android::hardware::tv::tuner::DemuxFilterDownloadSettings;
47 using ::aidl::android::hardware::tv::tuner::DemuxFilterEvent;
48 using ::aidl::android::hardware::tv::tuner::DemuxFilterPesDataSettings;
49 using ::aidl::android::hardware::tv::tuner::DemuxFilterRecordSettings;
50 using ::aidl::android::hardware::tv::tuner::DemuxFilterSectionSettings;
51 using ::aidl::android::hardware::tv::tuner::DemuxFilterSettings;
52 using ::aidl::android::hardware::tv::tuner::DemuxFilterStatus;
53 using ::aidl::android::hardware::tv::tuner::DemuxFilterType;
54 using ::aidl::android::hardware::tv::tuner::DemuxIpAddressIpAddress;
55 using ::aidl::android::hardware::tv::tuner::FilterDelayHint;
56 using ::aidl::android::media::tv::tuner::BnTunerFilter;
57 using ::aidl::android::media::tv::tuner::ITunerFilterCallback;
58 using ::android::Mutex;
59 using ::android::sp;
60 using ::android::hardware::hidl_array;
61 using ::android::hardware::MQDescriptorSync;
62 using ::android::hardware::Return;
63 using ::android::hardware::Void;
64 using ::std::shared_ptr;
65 using ::std::string;
66 using ::std::vector;
67 
68 using HidlAvStreamType = ::android::hardware::tv::tuner::V1_1::AvStreamType;
69 using HidlDemuxAlpFilterSettings = ::android::hardware::tv::tuner::V1_0::DemuxAlpFilterSettings;
70 using HidlDemuxFilterAvSettings = ::android::hardware::tv::tuner::V1_0::DemuxFilterAvSettings;
71 using HidlDemuxFilterDownloadEvent = ::android::hardware::tv::tuner::V1_0::DemuxFilterDownloadEvent;
72 using HidlDemuxFilterDownloadSettings =
73         ::android::hardware::tv::tuner::V1_0::DemuxFilterDownloadSettings;
74 using HidlDemuxFilterIpPayloadEvent =
75         ::android::hardware::tv::tuner::V1_0::DemuxFilterIpPayloadEvent;
76 using HidlDemuxFilterEvent = ::android::hardware::tv::tuner::V1_0::DemuxFilterEvent;
77 using HidlDemuxFilterMediaEvent = ::android::hardware::tv::tuner::V1_0::DemuxFilterMediaEvent;
78 using HidlDemuxFilterMmtpRecordEvent =
79         ::android::hardware::tv::tuner::V1_0::DemuxFilterMmtpRecordEvent;
80 using HidlDemuxFilterPesDataSettings =
81         ::android::hardware::tv::tuner::V1_0::DemuxFilterPesDataSettings;
82 using HidlDemuxFilterPesEvent = ::android::hardware::tv::tuner::V1_0::DemuxFilterPesEvent;
83 using HidlDemuxFilterRecordSettings =
84         ::android::hardware::tv::tuner::V1_0::DemuxFilterRecordSettings;
85 using HidlDemuxFilterSectionEvent = ::android::hardware::tv::tuner::V1_0::DemuxFilterSectionEvent;
86 using HidlDemuxFilterSectionSettings =
87         ::android::hardware::tv::tuner::V1_0::DemuxFilterSectionSettings;
88 using HidlDemuxFilterSettings = ::android::hardware::tv::tuner::V1_0::DemuxFilterSettings;
89 using HidlDemuxFilterStatus = ::android::hardware::tv::tuner::V1_0::DemuxFilterStatus;
90 using HidlDemuxFilterTemiEvent = ::android::hardware::tv::tuner::V1_0::DemuxFilterTemiEvent;
91 using HidlDemuxFilterTsRecordEvent = ::android::hardware::tv::tuner::V1_0::DemuxFilterTsRecordEvent;
92 using HidlDemuxIpFilterSettings = ::android::hardware::tv::tuner::V1_0::DemuxIpFilterSettings;
93 using HidlDemuxMmtpFilterSettings = ::android::hardware::tv::tuner::V1_0::DemuxMmtpFilterSettings;
94 using HidlDemuxTlvFilterSettings = ::android::hardware::tv::tuner::V1_0::DemuxTlvFilterSettings;
95 using HidlDemuxTsFilterSettings = ::android::hardware::tv::tuner::V1_0::DemuxTsFilterSettings;
96 using HidlDemuxPid = ::android::hardware::tv::tuner::V1_0::DemuxPid;
97 using HidlIFilter = ::android::hardware::tv::tuner::V1_0::IFilter;
98 using HidlDvStreamType = ::android::hardware::tv::tuner::V1_1::AvStreamType;
99 using HidlDemuxFilterEventExt = ::android::hardware::tv::tuner::V1_1::DemuxFilterEventExt;
100 using HidlDemuxFilterMonitorEvent = ::android::hardware::tv::tuner::V1_1::DemuxFilterMonitorEvent;
101 using HidlDemuxFilterTsRecordEventExt =
102         ::android::hardware::tv::tuner::V1_1::DemuxFilterTsRecordEventExt;
103 using HidlIFilterCallback = ::android::hardware::tv::tuner::V1_1::IFilterCallback;
104 
105 namespace aidl {
106 namespace android {
107 namespace media {
108 namespace tv {
109 namespace tuner {
110 
111 using MQDesc = MQDescriptorSync<uint8_t>;
112 using AidlMQDesc = MQDescriptor<int8_t, SynchronizedReadWrite>;
113 
114 const static int IP_V4_LENGTH = 4;
115 const static int IP_V6_LENGTH = 16;
116 
117 class TunerHidlFilter : public BnTunerFilter {
118 public:
119     class FilterCallback : public HidlIFilterCallback {
120     public:
FilterCallback(const shared_ptr<ITunerFilterCallback> tunerFilterCallback)121         FilterCallback(const shared_ptr<ITunerFilterCallback> tunerFilterCallback)
122               : mTunerFilterCallback(tunerFilterCallback){};
123 
124         virtual Return<void> onFilterEvent(const HidlDemuxFilterEvent& filterEvent);
125         virtual Return<void> onFilterEvent_1_1(const HidlDemuxFilterEvent& filterEvent,
126                                                const HidlDemuxFilterEventExt& filterEventExt);
127         virtual Return<void> onFilterStatus(HidlDemuxFilterStatus status);
128 
129         void sendSharedFilterStatus(int32_t status);
130         void attachSharedFilterCallback(const shared_ptr<ITunerFilterCallback>& in_cb);
131         void detachSharedFilterCallback();
132         void detachCallbacks();
133 
134     private:
135         void getAidlFilterEvent(const vector<HidlDemuxFilterEvent::Event>& events,
136                                 const vector<HidlDemuxFilterEventExt::Event>& eventsExt,
137                                 vector<DemuxFilterEvent>& aidlEvents);
138 
139         void getMediaEvent(const vector<HidlDemuxFilterEvent::Event>& events,
140                            vector<DemuxFilterEvent>& res);
141         void getSectionEvent(const vector<HidlDemuxFilterEvent::Event>& events,
142                              vector<DemuxFilterEvent>& res);
143         void getPesEvent(const vector<HidlDemuxFilterEvent::Event>& events,
144                          vector<DemuxFilterEvent>& res);
145         void getTsRecordEvent(const vector<HidlDemuxFilterEvent::Event>& events,
146                               const vector<HidlDemuxFilterEventExt::Event>& eventsExt,
147                               vector<DemuxFilterEvent>& res);
148         void getMmtpRecordEvent(const vector<HidlDemuxFilterEvent::Event>& events,
149                                 const vector<HidlDemuxFilterEventExt::Event>& eventsExt,
150                                 vector<DemuxFilterEvent>& res);
151         void getDownloadEvent(const vector<HidlDemuxFilterEvent::Event>& events,
152                               vector<DemuxFilterEvent>& res);
153         void getIpPayloadEvent(const vector<HidlDemuxFilterEvent::Event>& events,
154                                vector<DemuxFilterEvent>& res);
155         void getTemiEvent(const vector<HidlDemuxFilterEvent::Event>& events,
156                           vector<DemuxFilterEvent>& res);
157         void getMonitorEvent(const vector<HidlDemuxFilterEventExt::Event>& eventsExt,
158                              vector<DemuxFilterEvent>& res);
159         void getRestartEvent(const vector<HidlDemuxFilterEventExt::Event>& eventsExt,
160                              vector<DemuxFilterEvent>& res);
161 
162     private:
163         shared_ptr<ITunerFilterCallback> mTunerFilterCallback;
164         shared_ptr<ITunerFilterCallback> mOriginalCallback;
165         Mutex mCallbackLock;
166     };
167 
168     TunerHidlFilter(sp<HidlIFilter> filter, sp<FilterCallback> cb, DemuxFilterType type);
169     virtual ~TunerHidlFilter();
170 
171     ::ndk::ScopedAStatus getId(int32_t* _aidl_return) override;
172     ::ndk::ScopedAStatus getId64Bit(int64_t* _aidl_return) override;
173     ::ndk::ScopedAStatus getQueueDesc(AidlMQDesc* _aidl_return) override;
174     ::ndk::ScopedAStatus configure(const DemuxFilterSettings& in_settings) override;
175     ::ndk::ScopedAStatus configureMonitorEvent(int32_t in_monitorEventTypes) override;
176     ::ndk::ScopedAStatus configureIpFilterContextId(int32_t in_cid) override;
177     ::ndk::ScopedAStatus configureAvStreamType(const AvStreamType& in_avStreamType) override;
178     ::ndk::ScopedAStatus getAvSharedHandle(NativeHandle* out_avMemory,
179                                            int64_t* _aidl_return) override;
180     ::ndk::ScopedAStatus releaseAvHandle(const NativeHandle& in_handle,
181                                          int64_t in_avDataId) override;
182     ::ndk::ScopedAStatus setDataSource(const shared_ptr<ITunerFilter>& in_filter) override;
183     ::ndk::ScopedAStatus start() override;
184     ::ndk::ScopedAStatus stop() override;
185     ::ndk::ScopedAStatus flush() override;
186     ::ndk::ScopedAStatus close() override;
187     ::ndk::ScopedAStatus acquireSharedFilterToken(string* _aidl_return) override;
188     ::ndk::ScopedAStatus freeSharedFilterToken(const string& in_filterToken) override;
189     ::ndk::ScopedAStatus getFilterType(DemuxFilterType* _aidl_return) override;
190     ::ndk::ScopedAStatus setDelayHint(const FilterDelayHint& in_hint) override;
191 
192     bool isSharedFilterAllowed(int32_t pid);
193     void attachSharedFilterCallback(const shared_ptr<ITunerFilterCallback>& in_cb);
194     sp<HidlIFilter> getHalFilter();
195 
196 private:
197     bool isAudioFilter();
198     bool isVideoFilter();
199 
200     HidlDemuxFilterAvSettings getHidlAvSettings(const DemuxFilterAvSettings& settings);
201     HidlDemuxFilterSectionSettings getHidlSectionSettings(
202             const DemuxFilterSectionSettings& settings);
203     HidlDemuxFilterPesDataSettings getHidlPesDataSettings(
204             const DemuxFilterPesDataSettings& settings);
205     HidlDemuxFilterRecordSettings getHidlRecordSettings(const DemuxFilterRecordSettings& settings);
206     HidlDemuxFilterDownloadSettings getHidlDownloadSettings(
207             const DemuxFilterDownloadSettings& settings);
208     bool getHidlAvStreamType(const AvStreamType avStreamType, HidlAvStreamType& type);
209     void getHidlTsSettings(const DemuxFilterSettings& settings,
210                            HidlDemuxFilterSettings& hidlSettings);
211     void getHidlMmtpSettings(const DemuxFilterSettings& settings,
212                              HidlDemuxFilterSettings& hidlSettings);
213     void getHidlIpSettings(const DemuxFilterSettings& settings,
214                            HidlDemuxFilterSettings& hidlSettings);
215     void getHidlTlvSettings(const DemuxFilterSettings& settings,
216                             HidlDemuxFilterSettings& hidlSettings);
217     void getHidlAlpSettings(const DemuxFilterSettings& settings,
218                             HidlDemuxFilterSettings& hidlSettings);
219 
220     hidl_array<uint8_t, IP_V4_LENGTH> getIpV4Address(const DemuxIpAddressIpAddress& addr);
221     hidl_array<uint8_t, IP_V6_LENGTH> getIpV6Address(const DemuxIpAddressIpAddress& addr);
222 
223     sp<HidlIFilter> mFilter;
224     sp<::android::hardware::tv::tuner::V1_1::IFilter> mFilter_1_1;
225     int32_t mId;
226     int64_t mId64Bit;
227     DemuxFilterType mType;
228     bool mStarted;
229     bool mShared;
230     int32_t mClientPid;
231     sp<FilterCallback> mFilterCallback;
232     Mutex mLock;
233 };
234 
235 }  // namespace tuner
236 }  // namespace tv
237 }  // namespace media
238 }  // namespace android
239 }  // namespace aidl
240 
241 #endif  // ANDROID_MEDIA_TUNERHIDLFILTER_H
242