1 /* 2 * Copyright 2020 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 #include <android-base/logging.h> 18 #include <android/hardware/tv/tuner/1.0/IDemux.h> 19 #include <android/hardware/tv/tuner/1.0/IFilter.h> 20 #include <android/hardware/tv/tuner/1.0/types.h> 21 #include <android/hardware/tv/tuner/1.1/IFilter.h> 22 #include <android/hardware/tv/tuner/1.1/IFilterCallback.h> 23 #include <android/hardware/tv/tuner/1.1/ITuner.h> 24 #include <android/hardware/tv/tuner/1.1/types.h> 25 #include <fmq/MessageQueue.h> 26 #include <gtest/gtest.h> 27 #include <hidl/HidlSupport.h> 28 #include <hidl/HidlTransportSupport.h> 29 #include <hidl/Status.h> 30 #include <inttypes.h> 31 #include <utils/Condition.h> 32 #include <utils/Mutex.h> 33 #include <map> 34 35 using android::Condition; 36 using android::Mutex; 37 using android::sp; 38 using android::hardware::EventFlag; 39 using android::hardware::hidl_handle; 40 using android::hardware::hidl_string; 41 using android::hardware::hidl_vec; 42 using android::hardware::kSynchronizedReadWrite; 43 using android::hardware::MessageQueue; 44 using android::hardware::MQDescriptorSync; 45 using android::hardware::Return; 46 using android::hardware::Void; 47 using android::hardware::tv::tuner::V1_0::DemuxFilterEvent; 48 using android::hardware::tv::tuner::V1_0::DemuxFilterMainType; 49 using android::hardware::tv::tuner::V1_0::DemuxFilterMediaEvent; 50 using android::hardware::tv::tuner::V1_0::DemuxFilterSettings; 51 using android::hardware::tv::tuner::V1_0::DemuxFilterStatus; 52 using android::hardware::tv::tuner::V1_0::DemuxFilterType; 53 using android::hardware::tv::tuner::V1_0::DemuxTsFilterType; 54 using android::hardware::tv::tuner::V1_0::IDemux; 55 using android::hardware::tv::tuner::V1_0::IFilter; 56 using android::hardware::tv::tuner::V1_0::Result; 57 using android::hardware::tv::tuner::V1_1::AvStreamType; 58 using android::hardware::tv::tuner::V1_1::DemuxFilterEventExt; 59 using android::hardware::tv::tuner::V1_1::DemuxFilterMonitorEvent; 60 using android::hardware::tv::tuner::V1_1::DemuxFilterMonitorEventType; 61 using android::hardware::tv::tuner::V1_1::IFilterCallback; 62 using android::hardware::tv::tuner::V1_1::ITuner; 63 64 using ::testing::AssertionResult; 65 66 using namespace std; 67 68 enum FilterEventType : uint8_t { 69 UNDEFINED, 70 SECTION, 71 MEDIA, 72 PES, 73 RECORD, 74 MMTPRECORD, 75 DOWNLOAD, 76 TEMI, 77 }; 78 79 using FilterMQ = MessageQueue<uint8_t, kSynchronizedReadWrite>; 80 using MQDesc = MQDescriptorSync<uint8_t>; 81 82 #define WAIT_TIMEOUT 3000000000 83 84 class FilterCallback : public IFilterCallback { 85 public: onFilterEvent_1_1(const DemuxFilterEvent & filterEvent,const DemuxFilterEventExt & filterEventExt)86 virtual Return<void> onFilterEvent_1_1(const DemuxFilterEvent& filterEvent, 87 const DemuxFilterEventExt& filterEventExt) override { 88 android::Mutex::Autolock autoLock(mMsgLock); 89 // Temprarily we treat the first coming back filter data on the matching pid a success 90 // once all of the MQ are cleared, means we got all the expected output 91 mFilterEvent = filterEvent; 92 mFilterEventExt = filterEventExt; 93 readFilterEventData(); 94 mPidFilterOutputCount++; 95 mMsgCondition.signal(); 96 return Void(); 97 } 98 onFilterEvent(const android::hardware::tv::tuner::V1_0::DemuxFilterEvent & filterEvent)99 virtual Return<void> onFilterEvent( 100 const android::hardware::tv::tuner::V1_0::DemuxFilterEvent& filterEvent) override { 101 android::Mutex::Autolock autoLock(mMsgLock); 102 // Temprarily we treat the first coming back filter data on the matching pid a success 103 // once all of the MQ are cleared, means we got all the expected output 104 mFilterEvent = filterEvent; 105 readFilterEventData(); 106 mPidFilterOutputCount++; 107 mMsgCondition.signal(); 108 return Void(); 109 } 110 onFilterStatus(const DemuxFilterStatus)111 virtual Return<void> onFilterStatus(const DemuxFilterStatus /*status*/) override { 112 return Void(); 113 } 114 setFilterId(uint32_t filterId)115 void setFilterId(uint32_t filterId) { mFilterId = filterId; } setFilterInterface(sp<IFilter> filter)116 void setFilterInterface(sp<IFilter> filter) { mFilter = filter; } setFilterEventType(FilterEventType type)117 void setFilterEventType(FilterEventType type) { mFilterEventType = type; } setSharedHandle(hidl_handle sharedHandle)118 void setSharedHandle(hidl_handle sharedHandle) { mAvSharedHandle = sharedHandle; } setMemSize(uint64_t size)119 void setMemSize(uint64_t size) { mAvSharedMemSize = size; } 120 121 void testFilterDataOutput(); 122 void testFilterScramblingEvent(); 123 void testFilterIpCidEvent(); 124 void testStartIdAfterReconfigure(); 125 126 void readFilterEventData(); 127 bool dumpAvData(DemuxFilterMediaEvent event); 128 129 private: 130 uint32_t mFilterId; 131 sp<IFilter> mFilter; 132 FilterEventType mFilterEventType; 133 DemuxFilterEvent mFilterEvent; 134 DemuxFilterEventExt mFilterEventExt; 135 136 hidl_handle mAvSharedHandle = NULL; 137 uint64_t mAvSharedMemSize = -1; 138 139 android::Mutex mMsgLock; 140 android::Mutex mFilterOutputLock; 141 android::Condition mMsgCondition; 142 143 int mPidFilterOutputCount = 0; 144 int mScramblingStatusEvent = 0; 145 int mIpCidEvent = 0; 146 bool mStartIdReceived = false; 147 }; 148 149 class FilterTests { 150 public: setService(sp<ITuner> tuner)151 void setService(sp<ITuner> tuner) { mService = tuner; } setDemux(sp<IDemux> demux)152 void setDemux(sp<IDemux> demux) { mDemux = demux; } getFilterById(uint64_t filterId)153 sp<IFilter> getFilterById(uint64_t filterId) { return mFilters[filterId]; } 154 getFilterCallbacks()155 map<uint64_t, sp<FilterCallback>> getFilterCallbacks() { return mFilterCallbacks; } 156 157 AssertionResult openFilterInDemux(DemuxFilterType type, uint32_t bufferSize); 158 AssertionResult getNewlyOpenedFilterId_64bit(uint64_t& filterId); 159 AssertionResult getSharedAvMemoryHandle(uint64_t filterId); 160 AssertionResult releaseShareAvHandle(uint64_t filterId); 161 AssertionResult configFilter(DemuxFilterSettings setting, uint64_t filterId); 162 AssertionResult configAvFilterStreamType(AvStreamType type, uint64_t filterId); 163 AssertionResult configIpFilterCid(uint32_t ipCid, uint64_t filterId); 164 AssertionResult configureMonitorEvent(uint64_t filterId, uint32_t monitorEventTypes); 165 AssertionResult getFilterMQDescriptor(uint64_t filterId, bool getMqDesc); 166 AssertionResult startFilter(uint64_t filterId); 167 AssertionResult stopFilter(uint64_t filterId); 168 AssertionResult closeFilter(uint64_t filterId); 169 AssertionResult startIdTest(uint64_t filterId); 170 getFilterEventType(DemuxFilterType type)171 FilterEventType getFilterEventType(DemuxFilterType type) { 172 FilterEventType eventType = FilterEventType::UNDEFINED; 173 switch (type.mainType) { 174 case DemuxFilterMainType::TS: 175 switch (type.subType.tsFilterType()) { 176 case DemuxTsFilterType::UNDEFINED: 177 break; 178 case DemuxTsFilterType::SECTION: 179 eventType = FilterEventType::SECTION; 180 break; 181 case DemuxTsFilterType::PES: 182 eventType = FilterEventType::PES; 183 break; 184 case DemuxTsFilterType::TS: 185 break; 186 case DemuxTsFilterType::AUDIO: 187 case DemuxTsFilterType::VIDEO: 188 eventType = FilterEventType::MEDIA; 189 break; 190 case DemuxTsFilterType::PCR: 191 break; 192 case DemuxTsFilterType::RECORD: 193 eventType = FilterEventType::RECORD; 194 break; 195 case DemuxTsFilterType::TEMI: 196 eventType = FilterEventType::TEMI; 197 break; 198 } 199 break; 200 case DemuxFilterMainType::MMTP: 201 /*mmtpSettings*/ 202 break; 203 case DemuxFilterMainType::IP: 204 /*ipSettings*/ 205 break; 206 case DemuxFilterMainType::TLV: 207 /*tlvSettings*/ 208 break; 209 case DemuxFilterMainType::ALP: 210 /*alpSettings*/ 211 break; 212 default: 213 break; 214 } 215 return eventType; 216 } 217 218 protected: failure()219 static AssertionResult failure() { return ::testing::AssertionFailure(); } 220 success()221 static AssertionResult success() { return ::testing::AssertionSuccess(); } 222 223 sp<ITuner> mService; 224 sp<IFilter> mFilter; 225 sp<IDemux> mDemux; 226 map<uint64_t, sp<IFilter>> mFilters; 227 map<uint64_t, sp<FilterCallback>> mFilterCallbacks; 228 229 sp<FilterCallback> mFilterCallback; 230 MQDesc mFilterMQDescriptor; 231 vector<uint64_t> mUsedFilterIds; 232 233 hidl_handle mAvSharedHandle = NULL; 234 235 uint64_t mFilterId = -1; 236 }; 237