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