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