blob: 037429dd9718c7d2428fb4810cc3c5c2aacc9d7e [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
Henry Fang89f12f52019-11-05 13:48:59 -080079 virtual Return<Result> connectCiCam(uint32_t ciCamId) override;
80
81 virtual Return<Result> disconnectCiCam() override;
82
Amy5094ae12019-10-04 18:43:21 -070083 // Functions interacts with Tuner Service
84 void stopBroadcastInput();
Amyb4b68012019-10-15 17:38:19 -070085 Result removeFilter(uint32_t filterId);
86 Result startFilterHandler(uint32_t filterId);
87 void updateFilterOutput(uint16_t filterId, vector<uint8_t> data);
88 uint16_t getFilterTpid(uint32_t filterId);
Amy5094ae12019-10-04 18:43:21 -070089
Amyfd4243a2019-08-16 16:01:27 -070090 private:
Amy5094ae12019-10-04 18:43:21 -070091 // Tuner service
92 sp<Tuner> mTunerService;
93
94 // Frontend source
95 sp<Frontend> mFrontend;
96 string mFrontendSourceFile;
97
Amya4885292019-09-06 10:30:53 -070098 // A struct that passes the arguments to a newly created filter thread
99 struct ThreadArgs {
100 Demux* user;
101 uint32_t filterId;
102 };
103
Amy5094ae12019-10-04 18:43:21 -0700104 Result startBroadcastInputLoop();
Amyb4b68012019-10-15 17:38:19 -0700105 static void* __threadLoopBroadcast(void* user);
106 void broadcastInputThreadLoop();
Amya4885292019-09-06 10:30:53 -0700107
Amya609d5a2019-08-23 14:38:31 -0700108 /**
109 * To create a FilterMQ with the the next available Filter ID.
110 * Creating Event Flag at the same time.
111 * Add the successfully created/saved FilterMQ into the local list.
112 *
113 * Return false is any of the above processes fails.
114 */
Amya609d5a2019-08-23 14:38:31 -0700115 void deleteEventFlag();
Amya4885292019-09-06 10:30:53 -0700116 bool readDataFromMQ();
Amya4885292019-09-06 10:30:53 -0700117 /**
118 * A dispatcher to read and dispatch input data to all the started filters.
119 * Each filter handler handles the data filtering/output writing/filterEvent updating.
120 */
Amy5094ae12019-10-04 18:43:21 -0700121 bool startFilterDispatcher();
Amyb4b68012019-10-15 17:38:19 -0700122 void startTsFilter(vector<uint8_t> data);
Amya609d5a2019-08-23 14:38:31 -0700123
Amyfd4243a2019-08-16 16:01:27 -0700124 uint32_t mDemuxId;
Henry Fang89f12f52019-11-05 13:48:59 -0800125 uint32_t mCiCamId;
Amya609d5a2019-08-23 14:38:31 -0700126 /**
Amya4885292019-09-06 10:30:53 -0700127 * Record the last used filter id. Initial value is -1.
Amya609d5a2019-08-23 14:38:31 -0700128 * Filter Id starts with 0.
129 */
130 uint32_t mLastUsedFilterId = -1;
131 /**
Amya4885292019-09-06 10:30:53 -0700132 * Record all the used filter Ids.
133 * Any removed filter id should be removed from this set.
134 */
135 set<uint32_t> mUsedFilterIds;
136 /**
137 * Record all the unused filter Ids within mLastUsedFilterId.
138 * Removed filter Id should be added into this set.
139 * When this set is not empty, ids here should be allocated first
140 * and added into usedFilterIds.
141 */
142 set<uint32_t> mUnusedFilterIds;
143 /**
Amya609d5a2019-08-23 14:38:31 -0700144 * A list of created FilterMQ ptrs.
145 * The array number is the filter ID.
146 */
Amyb4b68012019-10-15 17:38:19 -0700147 std::map<uint32_t, sp<Filter>> mFilters;
Amy42a5b4b2019-10-03 16:49:48 -0700148
Amya4885292019-09-06 10:30:53 -0700149 // Thread handlers
Amy5094ae12019-10-04 18:43:21 -0700150 pthread_t mBroadcastInputThread;
Amya609d5a2019-08-23 14:38:31 -0700151 /**
152 * If a specific filter's writing loop is still running
153 */
Amy5094ae12019-10-04 18:43:21 -0700154 bool mBroadcastInputThreadRunning;
155 bool mKeepFetchingDataFromFrontend;
Amya609d5a2019-08-23 14:38:31 -0700156 /**
157 * Lock to protect writes to the FMQs
158 */
159 std::mutex mWriteLock;
160 /**
Amy42a5b4b2019-10-03 16:49:48 -0700161 * Lock to protect writes to the input status
162 */
Amy5094ae12019-10-04 18:43:21 -0700163 std::mutex mBroadcastInputThreadLock;
Amy1109e9f2019-10-10 18:30:28 -0700164
165 // temp handle single PES filter
166 // TODO handle mulptiple Pes filters
167 int mPesSizeLeft = 0;
168 vector<uint8_t> mPesOutput;
Amyb4b68012019-10-15 17:38:19 -0700169
170 const bool DEBUG_FILTER = false;
Amyfd4243a2019-08-16 16:01:27 -0700171};
172
173} // namespace implementation
174} // namespace V1_0
175} // namespace tuner
176} // namespace tv
177} // namespace hardware
178} // namespace android
179
180#endif // ANDROID_HARDWARE_TV_TUNER_V1_0_DEMUX_H_