blob: f38f006aaea78cbbe9d91c40a4c58a9b6b25bc58 [file] [log] [blame]
Amy Zhangbb94eeb2020-07-09 22:48:04 -07001/*
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#ifndef ANDROID_HARDWARE_TV_TUNER_V1_1_DEMUX_H_
18#define ANDROID_HARDWARE_TV_TUNER_V1_1_DEMUX_H_
19
Amy Zhang80cb9602020-07-15 13:06:39 -070020#include <android/hardware/tv/tuner/1.1/IDemux.h>
Amy Zhangbb94eeb2020-07-09 22:48:04 -070021#include <fmq/MessageQueue.h>
22#include <math.h>
23#include <set>
24#include "Dvr.h"
25#include "Filter.h"
26#include "Frontend.h"
27#include "TimeFilter.h"
28#include "Tuner.h"
29
30using namespace std;
31
32namespace android {
33namespace hardware {
34namespace tv {
35namespace tuner {
36namespace V1_0 {
37namespace implementation {
38
39using ::android::hardware::EventFlag;
40using ::android::hardware::kSynchronizedReadWrite;
41using ::android::hardware::MessageQueue;
42using ::android::hardware::MQDescriptorSync;
43
44using FilterMQ = MessageQueue<uint8_t, kSynchronizedReadWrite>;
45
46class Dvr;
47class Filter;
48class Frontend;
49class TimeFilter;
50class Tuner;
51
Amy Zhang80cb9602020-07-15 13:06:39 -070052class Demux : public V1_1::IDemux {
Amy Zhangbb94eeb2020-07-09 22:48:04 -070053 public:
54 Demux(uint32_t demuxId, sp<Tuner> tuner);
55
56 ~Demux();
57
Amy Zhang80cb9602020-07-15 13:06:39 -070058 virtual Return<void> getAvSyncHwId64Bit(const sp<IFilter>& filter,
59 getAvSyncHwId64Bit_cb _hidl_cb) override;
60
Amy Zhangbb94eeb2020-07-09 22:48:04 -070061 virtual Return<Result> setFrontendDataSource(uint32_t frontendId) override;
62
63 virtual Return<void> openFilter(const DemuxFilterType& type, uint32_t bufferSize,
64 const sp<IFilterCallback>& cb, openFilter_cb _hidl_cb) override;
65
66 virtual Return<void> openTimeFilter(openTimeFilter_cb _hidl_cb) override;
67
68 virtual Return<void> getAvSyncHwId(const sp<IFilter>& filter,
69 getAvSyncHwId_cb _hidl_cb) override;
70
71 virtual Return<void> getAvSyncTime(AvSyncHwId avSyncHwId, getAvSyncTime_cb _hidl_cb) override;
72
73 virtual Return<Result> close() override;
74
75 virtual Return<void> openDvr(DvrType type, uint32_t bufferSize, const sp<IDvrCallback>& cb,
76 openDvr_cb _hidl_cb) override;
77
78 virtual Return<Result> connectCiCam(uint32_t ciCamId) override;
79
80 virtual Return<Result> disconnectCiCam() override;
81
82 // Functions interacts with Tuner Service
83 void stopFrontendInput();
84 Result removeFilter(uint64_t filterId);
85 bool attachRecordFilter(uint64_t filterId);
86 bool detachRecordFilter(uint64_t filterId);
87 Result startFilterHandler(uint64_t filterId);
88 void updateFilterOutput(uint64_t filterId, vector<uint8_t> data);
89 void updateMediaFilterOutput(uint64_t filterId, vector<uint8_t> data, uint64_t pts);
90 uint16_t getFilterTpid(uint64_t filterId);
91 void setIsRecording(bool isRecording);
92 void startFrontendInputLoop();
93
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
105 private:
106 // Tuner service
107 sp<Tuner> mTunerService;
108
109 // Frontend source
110 sp<Frontend> mFrontend;
111
112 // A struct that passes the arguments to a newly created filter thread
113 struct ThreadArgs {
114 Demux* user;
115 uint64_t filterId;
116 };
117
118 static void* __threadLoopFrontend(void* user);
119 void frontendInputThreadLoop();
120
121 /**
122 * To create a FilterMQ with 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 */
128 void deleteEventFlag();
129 bool readDataFromMQ();
130
131 uint32_t mDemuxId = -1;
132 uint32_t mCiCamId;
133 set<uint64_t> mPcrFilterIds;
134 /**
135 * Record the last used filter id. Initial value is -1.
136 * Filter Id starts with 0.
137 */
138 uint64_t mLastUsedFilterId = -1;
139 /**
140 * Record all the used playback filter Ids.
141 * Any removed filter id should be removed from this set.
142 */
143 set<uint64_t> mPlaybackFilterIds;
144 /**
145 * Record all the attached record filter Ids.
146 * Any removed filter id should be removed from this set.
147 */
148 set<uint64_t> mRecordFilterIds;
149 /**
150 * A list of created Filter sp.
151 * The array number is the filter ID.
152 */
153 std::map<uint64_t, sp<Filter>> mFilters;
154
155 /**
156 * Local reference to the opened Timer Filter instance.
157 */
158 sp<TimeFilter> mTimeFilter;
159
160 /**
161 * Local reference to the opened DVR object.
162 */
163 sp<Dvr> mDvrPlayback;
164 sp<Dvr> mDvrRecord;
165
166 // Thread handlers
167 pthread_t mFrontendInputThread;
168 /**
169 * If a specific filter's writing loop is still running
170 */
171 bool mFrontendInputThreadRunning;
172 bool mKeepFetchingDataFromFrontend;
173 /**
174 * If the dvr recording is running.
175 */
176 bool mIsRecording = false;
177 /**
178 * Lock to protect writes to the FMQs
179 */
180 std::mutex mWriteLock;
181 /**
182 * Lock to protect writes to the input status
183 */
184 std::mutex mFrontendInputThreadLock;
185
186 // temp handle single PES filter
187 // TODO handle mulptiple Pes filters
188 int mPesSizeLeft = 0;
189 vector<uint8_t> mPesOutput;
190
191 const bool DEBUG_DEMUX = false;
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_1_DEMUX_H_