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_DVR_H_ 18 #define ANDROID_HARDWARE_TV_TUNER_V1_0_DVR_H_ 19 20 #include <android/hardware/tv/tuner/1.0/IDvr.h> 21 #include <fmq/MessageQueue.h> 22 #include <math.h> 23 #include <set> 24 #include "Demux.h" 25 #include "Frontend.h" 26 #include "Tuner.h" 27 28 using namespace std; 29 30 namespace android { 31 namespace hardware { 32 namespace tv { 33 namespace tuner { 34 namespace V1_0 { 35 namespace implementation { 36 37 using ::android::hardware::EventFlag; 38 using ::android::hardware::kSynchronizedReadWrite; 39 using ::android::hardware::MessageQueue; 40 using ::android::hardware::MQDescriptorSync; 41 using ::android::hardware::tv::tuner::V1_0::IDemux; 42 using ::android::hardware::tv::tuner::V1_0::IDvrCallback; 43 using ::android::hardware::tv::tuner::V1_0::Result; 44 45 using DvrMQ = MessageQueue<uint8_t, kSynchronizedReadWrite>; 46 47 class Demux; 48 class Filter; 49 class Frontend; 50 class Tuner; 51 52 class Dvr : public IDvr { 53 public: 54 Dvr(); 55 56 Dvr(DvrType type, uint32_t bufferSize, const sp<IDvrCallback>& cb, sp<Demux> demux); 57 58 ~Dvr(); 59 60 virtual Return<void> getQueueDesc(getQueueDesc_cb _hidl_cb) override; 61 62 virtual Return<Result> configure(const DvrSettings& settings) override; 63 64 virtual Return<Result> attachFilter(const sp<IFilter>& filter) override; 65 66 virtual Return<Result> detachFilter(const sp<IFilter>& filter) override; 67 68 virtual Return<Result> start() override; 69 70 virtual Return<Result> stop() override; 71 72 virtual Return<Result> flush() override; 73 74 virtual Return<Result> close() override; 75 76 /** 77 * To create a DvrMQ and its Event Flag. 78 * 79 * Return false is any of the above processes fails. 80 */ 81 bool createDvrMQ(); 82 void sendBroadcastInputToDvrRecord(vector<uint8_t> byteBuffer); 83 bool writeRecordFMQ(const std::vector<uint8_t>& data); 84 85 private: 86 // Demux service 87 sp<Demux> mDemux; 88 89 DvrType mType; 90 uint32_t mBufferSize; 91 sp<IDvrCallback> mCallback; 92 std::map<uint32_t, sp<IFilter>> mFilters; 93 94 void deleteEventFlag(); 95 bool readDataFromMQ(); 96 void maySendPlaybackStatusCallback(); 97 void maySendRecordStatusCallback(); 98 PlaybackStatus checkPlaybackStatusChange(uint32_t availableToWrite, uint32_t availableToRead, 99 uint32_t highThreshold, uint32_t lowThreshold); 100 RecordStatus checkRecordStatusChange(uint32_t availableToWrite, uint32_t availableToRead, 101 uint32_t highThreshold, uint32_t lowThreshold); 102 /** 103 * A dispatcher to read and dispatch input data to all the started filters. 104 * Each filter handler handles the data filtering/output writing/filterEvent updating. 105 */ 106 bool readPlaybackFMQ(); 107 void startTpidFilter(vector<uint8_t> data); 108 bool startFilterDispatcher(); 109 static void* __threadLoopPlayback(void* user); 110 static void* __threadLoopRecord(void* user); 111 void playbackThreadLoop(); 112 void recordThreadLoop(); 113 114 unique_ptr<DvrMQ> mDvrMQ; 115 EventFlag* mDvrEventFlag; 116 /** 117 * Demux callbacks used on filter events or IO buffer status 118 */ 119 bool mDvrConfigured = false; 120 DvrSettings mDvrSettings; 121 122 // Thread handlers 123 pthread_t mDvrThread; 124 pthread_t mBroadcastInputThread; 125 126 // FMQ status local records 127 PlaybackStatus mPlaybackStatus; 128 RecordStatus mRecordStatus; 129 /** 130 * If a specific filter's writing loop is still running 131 */ 132 bool mDvrThreadRunning; 133 bool mBroadcastInputThreadRunning; 134 bool mKeepFetchingDataFromFrontend; 135 /** 136 * Lock to protect writes to the FMQs 137 */ 138 std::mutex mWriteLock; 139 /** 140 * Lock to protect writes to the input status 141 */ 142 std::mutex mPlaybackStatusLock; 143 std::mutex mRecordStatusLock; 144 std::mutex mBroadcastInputThreadLock; 145 std::mutex mDvrThreadLock; 146 147 const bool DEBUG_DVR = false; 148 149 // Booleans to check if recording is running. 150 // Recording is ready when both of the following are set to true. 151 bool mIsRecordStarted = false; 152 bool mIsRecordFilterAttached = false; 153 }; 154 155 } // namespace implementation 156 } // namespace V1_0 157 } // namespace tuner 158 } // namespace tv 159 } // namespace hardware 160 } // namespace android 161 162 #endif // ANDROID_HARDWARE_TV_TUNER_V1_0_DVR_H_