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