blob: a9756cc248cf6e391fac98e7d41b3bd953da4e26 [file] [log] [blame]
Amyfd4243a2019-08-16 16:01:27 -07001/*
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>
Amya609d5a2019-08-23 14:38:31 -070021#include <fmq/MessageQueue.h>
Amy79125022019-10-10 15:30:17 -070022#include <math.h>
Amya4885292019-09-06 10:30:53 -070023#include <set>
Amyb4b68012019-10-15 17:38:19 -070024#include "Dvr.h"
25#include "Filter.h"
Amy5094ae12019-10-04 18:43:21 -070026#include "Frontend.h"
Amyb4b68012019-10-15 17:38:19 -070027#include "TimeFilter.h"
Amy5094ae12019-10-04 18:43:21 -070028#include "Tuner.h"
Amyfd4243a2019-08-16 16:01:27 -070029
30using namespace std;
31
32namespace android {
33namespace hardware {
34namespace tv {
35namespace tuner {
36namespace V1_0 {
37namespace implementation {
38
Amya609d5a2019-08-23 14:38:31 -070039using ::android::hardware::EventFlag;
40using ::android::hardware::kSynchronizedReadWrite;
41using ::android::hardware::MessageQueue;
42using ::android::hardware::MQDescriptorSync;
Amyfd4243a2019-08-16 16:01:27 -070043using ::android::hardware::tv::tuner::V1_0::IDemux;
Amyb4b68012019-10-15 17:38:19 -070044using ::android::hardware::tv::tuner::V1_0::IDvrCallback;
45using ::android::hardware::tv::tuner::V1_0::IFilterCallback;
Amyfd4243a2019-08-16 16:01:27 -070046using ::android::hardware::tv::tuner::V1_0::Result;
47
Amya609d5a2019-08-23 14:38:31 -070048using FilterMQ = MessageQueue<uint8_t, kSynchronizedReadWrite>;
49
Amyb4b68012019-10-15 17:38:19 -070050class Dvr;
51class Filter;
Amy5094ae12019-10-04 18:43:21 -070052class Frontend;
Amyb4b68012019-10-15 17:38:19 -070053class TimeFilter;
54class Tuner;
Amy5094ae12019-10-04 18:43:21 -070055
Amyfd4243a2019-08-16 16:01:27 -070056class Demux : public IDemux {
57 public:
Amy5094ae12019-10-04 18:43:21 -070058 Demux(uint32_t demuxId, sp<Tuner> tuner);
Amyfd4243a2019-08-16 16:01:27 -070059
Amya4885292019-09-06 10:30:53 -070060 ~Demux();
61
Amyfd4243a2019-08-16 16:01:27 -070062 virtual Return<Result> setFrontendDataSource(uint32_t frontendId) override;
63
Amyb4b68012019-10-15 17:38:19 -070064 virtual Return<void> openFilter(const DemuxFilterType& type, uint32_t bufferSize,
65 const sp<IFilterCallback>& cb, openFilter_cb _hidl_cb) override;
Amyfd4243a2019-08-16 16:01:27 -070066
Amyb4b68012019-10-15 17:38:19 -070067 virtual Return<void> openTimeFilter(openTimeFilter_cb _hidl_cb) override;
Amya609d5a2019-08-23 14:38:31 -070068
Amyb4b68012019-10-15 17:38:19 -070069 virtual Return<void> getAvSyncHwId(const sp<IFilter>& filter,
70 getAvSyncHwId_cb _hidl_cb) override;
Amya609d5a2019-08-23 14:38:31 -070071
72 virtual Return<void> getAvSyncTime(AvSyncHwId avSyncHwId, getAvSyncTime_cb _hidl_cb) override;
73
Amyb4b68012019-10-15 17:38:19 -070074 virtual Return<Result> close() override;
Amya4885292019-09-06 10:30:53 -070075
Amyb4b68012019-10-15 17:38:19 -070076 virtual Return<void> openDvr(DvrType type, uint32_t bufferSize, const sp<IDvrCallback>& cb,
77 openDvr_cb _hidl_cb) override;
Amya4885292019-09-06 10:30:53 -070078
Amy5094ae12019-10-04 18:43:21 -070079 // Functions interacts with Tuner Service
80 void stopBroadcastInput();
Amyb4b68012019-10-15 17:38:19 -070081 Result removeFilter(uint32_t filterId);
82 Result startFilterHandler(uint32_t filterId);
83 void updateFilterOutput(uint16_t filterId, vector<uint8_t> data);
84 uint16_t getFilterTpid(uint32_t filterId);
Amy5094ae12019-10-04 18:43:21 -070085
Amyfd4243a2019-08-16 16:01:27 -070086 private:
Amy5094ae12019-10-04 18:43:21 -070087 // Tuner service
88 sp<Tuner> mTunerService;
89
90 // Frontend source
91 sp<Frontend> mFrontend;
92 string mFrontendSourceFile;
93
Amya4885292019-09-06 10:30:53 -070094 // A struct that passes the arguments to a newly created filter thread
95 struct ThreadArgs {
96 Demux* user;
97 uint32_t filterId;
98 };
99
Amy5094ae12019-10-04 18:43:21 -0700100 Result startBroadcastInputLoop();
Amyb4b68012019-10-15 17:38:19 -0700101 static void* __threadLoopBroadcast(void* user);
102 void broadcastInputThreadLoop();
Amya4885292019-09-06 10:30:53 -0700103
Amya609d5a2019-08-23 14:38:31 -0700104 /**
105 * To create a FilterMQ with the the next available Filter ID.
106 * Creating Event Flag at the same time.
107 * Add the successfully created/saved FilterMQ into the local list.
108 *
109 * Return false is any of the above processes fails.
110 */
Amya609d5a2019-08-23 14:38:31 -0700111 void deleteEventFlag();
Amya4885292019-09-06 10:30:53 -0700112 bool readDataFromMQ();
Amya4885292019-09-06 10:30:53 -0700113 /**
114 * A dispatcher to read and dispatch input data to all the started filters.
115 * Each filter handler handles the data filtering/output writing/filterEvent updating.
116 */
Amy5094ae12019-10-04 18:43:21 -0700117 bool startFilterDispatcher();
Amyb4b68012019-10-15 17:38:19 -0700118 void startTsFilter(vector<uint8_t> data);
Amya609d5a2019-08-23 14:38:31 -0700119
Amyfd4243a2019-08-16 16:01:27 -0700120 uint32_t mDemuxId;
Amya609d5a2019-08-23 14:38:31 -0700121 /**
Amya4885292019-09-06 10:30:53 -0700122 * Record the last used filter id. Initial value is -1.
Amya609d5a2019-08-23 14:38:31 -0700123 * Filter Id starts with 0.
124 */
125 uint32_t mLastUsedFilterId = -1;
126 /**
Amya4885292019-09-06 10:30:53 -0700127 * Record all the used filter Ids.
128 * Any removed filter id should be removed from this set.
129 */
130 set<uint32_t> mUsedFilterIds;
131 /**
132 * Record all the unused filter Ids within mLastUsedFilterId.
133 * Removed filter Id should be added into this set.
134 * When this set is not empty, ids here should be allocated first
135 * and added into usedFilterIds.
136 */
137 set<uint32_t> mUnusedFilterIds;
138 /**
Amya609d5a2019-08-23 14:38:31 -0700139 * A list of created FilterMQ ptrs.
140 * The array number is the filter ID.
141 */
Amyb4b68012019-10-15 17:38:19 -0700142 std::map<uint32_t, sp<Filter>> mFilters;
Amy42a5b4b2019-10-03 16:49:48 -0700143
Amya4885292019-09-06 10:30:53 -0700144 // Thread handlers
Amy5094ae12019-10-04 18:43:21 -0700145 pthread_t mBroadcastInputThread;
Amya609d5a2019-08-23 14:38:31 -0700146 /**
147 * If a specific filter's writing loop is still running
148 */
Amy5094ae12019-10-04 18:43:21 -0700149 bool mBroadcastInputThreadRunning;
150 bool mKeepFetchingDataFromFrontend;
Amya609d5a2019-08-23 14:38:31 -0700151 /**
152 * Lock to protect writes to the FMQs
153 */
154 std::mutex mWriteLock;
155 /**
Amy42a5b4b2019-10-03 16:49:48 -0700156 * Lock to protect writes to the input status
157 */
Amy5094ae12019-10-04 18:43:21 -0700158 std::mutex mBroadcastInputThreadLock;
Amy1109e9f2019-10-10 18:30:28 -0700159
160 // temp handle single PES filter
161 // TODO handle mulptiple Pes filters
162 int mPesSizeLeft = 0;
163 vector<uint8_t> mPesOutput;
Amyb4b68012019-10-15 17:38:19 -0700164
165 const bool DEBUG_FILTER = false;
Amyfd4243a2019-08-16 16:01:27 -0700166};
167
168} // namespace implementation
169} // namespace V1_0
170} // namespace tuner
171} // namespace tv
172} // namespace hardware
173} // namespace android
174
175#endif // ANDROID_HARDWARE_TV_TUNER_V1_0_DEMUX_H_