Amy | fd4243a | 2019-08-16 16:01:27 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2019 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_HARDWARE_TV_TUNER_V1_0_DEMUX_H_ |
| 18 | #define ANDROID_HARDWARE_TV_TUNER_V1_0_DEMUX_H_ |
| 19 | |
| 20 | #include <android/hardware/tv/tuner/1.0/IDemux.h> |
Amy | a609d5a | 2019-08-23 14:38:31 -0700 | [diff] [blame] | 21 | #include <fmq/MessageQueue.h> |
Amy | 7912502 | 2019-10-10 15:30:17 -0700 | [diff] [blame] | 22 | #include <math.h> |
Amy | a488529 | 2019-09-06 10:30:53 -0700 | [diff] [blame] | 23 | #include <set> |
Amy | b4b6801 | 2019-10-15 17:38:19 -0700 | [diff] [blame] | 24 | #include "Dvr.h" |
| 25 | #include "Filter.h" |
Amy | 5094ae1 | 2019-10-04 18:43:21 -0700 | [diff] [blame] | 26 | #include "Frontend.h" |
Amy | b4b6801 | 2019-10-15 17:38:19 -0700 | [diff] [blame] | 27 | #include "TimeFilter.h" |
Amy | 5094ae1 | 2019-10-04 18:43:21 -0700 | [diff] [blame] | 28 | #include "Tuner.h" |
Amy | fd4243a | 2019-08-16 16:01:27 -0700 | [diff] [blame] | 29 | |
| 30 | using namespace std; |
| 31 | |
| 32 | namespace android { |
| 33 | namespace hardware { |
| 34 | namespace tv { |
| 35 | namespace tuner { |
| 36 | namespace V1_0 { |
| 37 | namespace implementation { |
| 38 | |
Amy | a609d5a | 2019-08-23 14:38:31 -0700 | [diff] [blame] | 39 | using ::android::hardware::EventFlag; |
| 40 | using ::android::hardware::kSynchronizedReadWrite; |
| 41 | using ::android::hardware::MessageQueue; |
| 42 | using ::android::hardware::MQDescriptorSync; |
Amy | fd4243a | 2019-08-16 16:01:27 -0700 | [diff] [blame] | 43 | using ::android::hardware::tv::tuner::V1_0::IDemux; |
Amy | b4b6801 | 2019-10-15 17:38:19 -0700 | [diff] [blame] | 44 | using ::android::hardware::tv::tuner::V1_0::IDvrCallback; |
| 45 | using ::android::hardware::tv::tuner::V1_0::IFilterCallback; |
Amy | fd4243a | 2019-08-16 16:01:27 -0700 | [diff] [blame] | 46 | using ::android::hardware::tv::tuner::V1_0::Result; |
| 47 | |
Amy | a609d5a | 2019-08-23 14:38:31 -0700 | [diff] [blame] | 48 | using FilterMQ = MessageQueue<uint8_t, kSynchronizedReadWrite>; |
| 49 | |
Amy | b4b6801 | 2019-10-15 17:38:19 -0700 | [diff] [blame] | 50 | class Dvr; |
| 51 | class Filter; |
Amy | 5094ae1 | 2019-10-04 18:43:21 -0700 | [diff] [blame] | 52 | class Frontend; |
Amy | b4b6801 | 2019-10-15 17:38:19 -0700 | [diff] [blame] | 53 | class TimeFilter; |
| 54 | class Tuner; |
Amy | 5094ae1 | 2019-10-04 18:43:21 -0700 | [diff] [blame] | 55 | |
Amy | fd4243a | 2019-08-16 16:01:27 -0700 | [diff] [blame] | 56 | class Demux : public IDemux { |
| 57 | public: |
Amy | 5094ae1 | 2019-10-04 18:43:21 -0700 | [diff] [blame] | 58 | Demux(uint32_t demuxId, sp<Tuner> tuner); |
Amy | fd4243a | 2019-08-16 16:01:27 -0700 | [diff] [blame] | 59 | |
Amy | a488529 | 2019-09-06 10:30:53 -0700 | [diff] [blame] | 60 | ~Demux(); |
| 61 | |
Amy | fd4243a | 2019-08-16 16:01:27 -0700 | [diff] [blame] | 62 | virtual Return<Result> setFrontendDataSource(uint32_t frontendId) override; |
| 63 | |
Amy | b4b6801 | 2019-10-15 17:38:19 -0700 | [diff] [blame] | 64 | virtual Return<void> openFilter(const DemuxFilterType& type, uint32_t bufferSize, |
| 65 | const sp<IFilterCallback>& cb, openFilter_cb _hidl_cb) override; |
Amy | fd4243a | 2019-08-16 16:01:27 -0700 | [diff] [blame] | 66 | |
Amy | b4b6801 | 2019-10-15 17:38:19 -0700 | [diff] [blame] | 67 | virtual Return<void> openTimeFilter(openTimeFilter_cb _hidl_cb) override; |
Amy | a609d5a | 2019-08-23 14:38:31 -0700 | [diff] [blame] | 68 | |
Amy | b4b6801 | 2019-10-15 17:38:19 -0700 | [diff] [blame] | 69 | virtual Return<void> getAvSyncHwId(const sp<IFilter>& filter, |
| 70 | getAvSyncHwId_cb _hidl_cb) override; |
Amy | a609d5a | 2019-08-23 14:38:31 -0700 | [diff] [blame] | 71 | |
| 72 | virtual Return<void> getAvSyncTime(AvSyncHwId avSyncHwId, getAvSyncTime_cb _hidl_cb) override; |
| 73 | |
Amy | b4b6801 | 2019-10-15 17:38:19 -0700 | [diff] [blame] | 74 | virtual Return<Result> close() override; |
Amy | a488529 | 2019-09-06 10:30:53 -0700 | [diff] [blame] | 75 | |
Amy | b4b6801 | 2019-10-15 17:38:19 -0700 | [diff] [blame] | 76 | virtual Return<void> openDvr(DvrType type, uint32_t bufferSize, const sp<IDvrCallback>& cb, |
| 77 | openDvr_cb _hidl_cb) override; |
Amy | a488529 | 2019-09-06 10:30:53 -0700 | [diff] [blame] | 78 | |
Henry Fang | 89f12f5 | 2019-11-05 13:48:59 -0800 | [diff] [blame] | 79 | virtual Return<Result> connectCiCam(uint32_t ciCamId) override; |
| 80 | |
| 81 | virtual Return<Result> disconnectCiCam() override; |
| 82 | |
Amy | 5094ae1 | 2019-10-04 18:43:21 -0700 | [diff] [blame] | 83 | // Functions interacts with Tuner Service |
Amy | 5ed1357 | 2019-12-11 15:33:51 -0800 | [diff] [blame] | 84 | void stopFrontendInput(); |
Amy | b4b6801 | 2019-10-15 17:38:19 -0700 | [diff] [blame] | 85 | Result removeFilter(uint32_t filterId); |
Amy | 5ed1357 | 2019-12-11 15:33:51 -0800 | [diff] [blame] | 86 | bool attachRecordFilter(int filterId); |
| 87 | bool detachRecordFilter(int filterId); |
Amy | b4b6801 | 2019-10-15 17:38:19 -0700 | [diff] [blame] | 88 | Result startFilterHandler(uint32_t filterId); |
| 89 | void updateFilterOutput(uint16_t filterId, vector<uint8_t> data); |
| 90 | uint16_t getFilterTpid(uint32_t filterId); |
Amy | 5ed1357 | 2019-12-11 15:33:51 -0800 | [diff] [blame] | 91 | void setIsRecording(bool isRecording); |
Amy Zhang | 0fe25be | 2020-04-08 17:30:52 -0700 | [diff] [blame] | 92 | void startFrontendInputLoop(); |
Amy | 5094ae1 | 2019-10-04 18:43:21 -0700 | [diff] [blame] | 93 | |
Amy Zhang | 6bda639 | 2020-05-26 19:00:46 -0700 | [diff] [blame] | 94 | /** |
| 95 | * A dispatcher to read and dispatch input data to all the started filters. |
| 96 | * Each filter handler handles the data filtering/output writing/filterEvent updating. |
| 97 | * Note that recording filters are not included. |
| 98 | */ |
| 99 | bool startBroadcastFilterDispatcher(); |
| 100 | void startBroadcastTsFilter(vector<uint8_t> data); |
| 101 | |
| 102 | void sendFrontendInputToRecord(vector<uint8_t> data); |
| 103 | bool startRecordFilterDispatcher(); |
| 104 | |
Amy | fd4243a | 2019-08-16 16:01:27 -0700 | [diff] [blame] | 105 | private: |
Amy | 5094ae1 | 2019-10-04 18:43:21 -0700 | [diff] [blame] | 106 | // Tuner service |
| 107 | sp<Tuner> mTunerService; |
| 108 | |
| 109 | // Frontend source |
| 110 | sp<Frontend> mFrontend; |
Amy | 5094ae1 | 2019-10-04 18:43:21 -0700 | [diff] [blame] | 111 | |
Amy | a488529 | 2019-09-06 10:30:53 -0700 | [diff] [blame] | 112 | // A struct that passes the arguments to a newly created filter thread |
| 113 | struct ThreadArgs { |
| 114 | Demux* user; |
| 115 | uint32_t filterId; |
| 116 | }; |
| 117 | |
Amy | 5ed1357 | 2019-12-11 15:33:51 -0800 | [diff] [blame] | 118 | static void* __threadLoopFrontend(void* user); |
| 119 | void frontendInputThreadLoop(); |
Amy | a488529 | 2019-09-06 10:30:53 -0700 | [diff] [blame] | 120 | |
Amy | a609d5a | 2019-08-23 14:38:31 -0700 | [diff] [blame] | 121 | /** |
| 122 | * To create a FilterMQ with the the next available Filter ID. |
| 123 | * Creating Event Flag at the same time. |
| 124 | * Add the successfully created/saved FilterMQ into the local list. |
| 125 | * |
| 126 | * Return false is any of the above processes fails. |
| 127 | */ |
Amy | a609d5a | 2019-08-23 14:38:31 -0700 | [diff] [blame] | 128 | void deleteEventFlag(); |
Amy | a488529 | 2019-09-06 10:30:53 -0700 | [diff] [blame] | 129 | bool readDataFromMQ(); |
Amy | a609d5a | 2019-08-23 14:38:31 -0700 | [diff] [blame] | 130 | |
Amy | fd4243a | 2019-08-16 16:01:27 -0700 | [diff] [blame] | 131 | uint32_t mDemuxId; |
Henry Fang | 89f12f5 | 2019-11-05 13:48:59 -0800 | [diff] [blame] | 132 | uint32_t mCiCamId; |
Amy Zhang | b717eb5 | 2020-05-15 18:35:42 -0700 | [diff] [blame] | 133 | set<uint32_t> mPcrFilterIds; |
Amy | a609d5a | 2019-08-23 14:38:31 -0700 | [diff] [blame] | 134 | /** |
Amy | a488529 | 2019-09-06 10:30:53 -0700 | [diff] [blame] | 135 | * Record the last used filter id. Initial value is -1. |
Amy | a609d5a | 2019-08-23 14:38:31 -0700 | [diff] [blame] | 136 | * Filter Id starts with 0. |
| 137 | */ |
| 138 | uint32_t mLastUsedFilterId = -1; |
| 139 | /** |
Amy Zhang | 6bda639 | 2020-05-26 19:00:46 -0700 | [diff] [blame] | 140 | * Record all the used playback filter Ids. |
Amy | a488529 | 2019-09-06 10:30:53 -0700 | [diff] [blame] | 141 | * Any removed filter id should be removed from this set. |
| 142 | */ |
Amy Zhang | 6bda639 | 2020-05-26 19:00:46 -0700 | [diff] [blame] | 143 | set<uint32_t> mPlaybackFilterIds; |
Amy | a488529 | 2019-09-06 10:30:53 -0700 | [diff] [blame] | 144 | /** |
Amy | 5ed1357 | 2019-12-11 15:33:51 -0800 | [diff] [blame] | 145 | * Record all the attached record filter Ids. |
| 146 | * Any removed filter id should be removed from this set. |
| 147 | */ |
| 148 | set<uint32_t> mRecordFilterIds; |
| 149 | /** |
Amy Zhang | 6bda639 | 2020-05-26 19:00:46 -0700 | [diff] [blame] | 150 | * A list of created Filter sp. |
Amy | a609d5a | 2019-08-23 14:38:31 -0700 | [diff] [blame] | 151 | * The array number is the filter ID. |
| 152 | */ |
Amy | b4b6801 | 2019-10-15 17:38:19 -0700 | [diff] [blame] | 153 | std::map<uint32_t, sp<Filter>> mFilters; |
Amy | 42a5b4b | 2019-10-03 16:49:48 -0700 | [diff] [blame] | 154 | |
Amy | 5ed1357 | 2019-12-11 15:33:51 -0800 | [diff] [blame] | 155 | /** |
Amy Zhang | 7e4859c | 2020-06-08 15:10:48 -0700 | [diff] [blame] | 156 | * Local reference to the opened Timer Filter instance. |
| 157 | */ |
| 158 | sp<TimeFilter> mTimeFilter; |
| 159 | |
| 160 | /** |
Amy | 5ed1357 | 2019-12-11 15:33:51 -0800 | [diff] [blame] | 161 | * Local reference to the opened DVR object. |
| 162 | */ |
Amy Zhang | 6bda639 | 2020-05-26 19:00:46 -0700 | [diff] [blame] | 163 | sp<Dvr> mDvrPlayback; |
| 164 | sp<Dvr> mDvrRecord; |
Amy | 5ed1357 | 2019-12-11 15:33:51 -0800 | [diff] [blame] | 165 | |
Amy | a488529 | 2019-09-06 10:30:53 -0700 | [diff] [blame] | 166 | // Thread handlers |
Amy | 5ed1357 | 2019-12-11 15:33:51 -0800 | [diff] [blame] | 167 | pthread_t mFrontendInputThread; |
Amy | a609d5a | 2019-08-23 14:38:31 -0700 | [diff] [blame] | 168 | /** |
| 169 | * If a specific filter's writing loop is still running |
| 170 | */ |
Amy | 5ed1357 | 2019-12-11 15:33:51 -0800 | [diff] [blame] | 171 | bool mFrontendInputThreadRunning; |
Amy | 5094ae1 | 2019-10-04 18:43:21 -0700 | [diff] [blame] | 172 | bool mKeepFetchingDataFromFrontend; |
Amy | a609d5a | 2019-08-23 14:38:31 -0700 | [diff] [blame] | 173 | /** |
Amy | 5ed1357 | 2019-12-11 15:33:51 -0800 | [diff] [blame] | 174 | * If the dvr recording is running. |
| 175 | */ |
| 176 | bool mIsRecording = false; |
| 177 | /** |
Amy | a609d5a | 2019-08-23 14:38:31 -0700 | [diff] [blame] | 178 | * Lock to protect writes to the FMQs |
| 179 | */ |
| 180 | std::mutex mWriteLock; |
| 181 | /** |
Amy | 42a5b4b | 2019-10-03 16:49:48 -0700 | [diff] [blame] | 182 | * Lock to protect writes to the input status |
| 183 | */ |
Amy | 5ed1357 | 2019-12-11 15:33:51 -0800 | [diff] [blame] | 184 | std::mutex mFrontendInputThreadLock; |
Amy | 1109e9f | 2019-10-10 18:30:28 -0700 | [diff] [blame] | 185 | |
| 186 | // temp handle single PES filter |
| 187 | // TODO handle mulptiple Pes filters |
| 188 | int mPesSizeLeft = 0; |
| 189 | vector<uint8_t> mPesOutput; |
Amy | b4b6801 | 2019-10-15 17:38:19 -0700 | [diff] [blame] | 190 | |
Amy Zhang | 6e8163a | 2020-04-24 15:41:21 -0700 | [diff] [blame] | 191 | const bool DEBUG_DEMUX = false; |
Amy | fd4243a | 2019-08-16 16:01:27 -0700 | [diff] [blame] | 192 | }; |
| 193 | |
| 194 | } // namespace implementation |
| 195 | } // namespace V1_0 |
| 196 | } // namespace tuner |
| 197 | } // namespace tv |
| 198 | } // namespace hardware |
| 199 | } // namespace android |
| 200 | |
| 201 | #endif // ANDROID_HARDWARE_TV_TUNER_V1_0_DEMUX_H_ |