blob: 6749ba085739d5a6b15080d6805fca4bb455ea4d [file] [log] [blame]
shubang8ab43b12019-10-18 15:55:55 -07001/*
2 * Copyright 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_MEDIA_TV_TUNER_H_
18#define _ANDROID_MEDIA_TV_TUNER_H_
19
20#include <android/hardware/tv/tuner/1.0/ITuner.h>
shubang964e6132019-11-26 15:05:22 -080021#include <fmq/MessageQueue.h>
shubangba21a7f2019-12-05 16:58:55 -080022#include <fstream>
23#include <string>
shubang6f473d62019-11-01 15:42:21 -070024#include <unordered_map>
shubang8ab43b12019-10-18 15:55:55 -070025#include <utils/RefBase.h>
26
27#include "jni.h"
28
shubang964e6132019-11-26 15:05:22 -080029using ::android::hardware::EventFlag;
30using ::android::hardware::MQDescriptorSync;
31using ::android::hardware::MessageQueue;
shubang6f473d62019-11-01 15:42:21 -070032using ::android::hardware::Return;
shubang4b8c5402019-10-24 17:49:53 -070033using ::android::hardware::hidl_vec;
shubang964e6132019-11-26 15:05:22 -080034using ::android::hardware::kSynchronizedReadWrite;
shubang6f473d62019-11-01 15:42:21 -070035using ::android::hardware::tv::tuner::V1_0::DemuxFilterEvent;
36using ::android::hardware::tv::tuner::V1_0::DemuxFilterStatus;
37using ::android::hardware::tv::tuner::V1_0::DemuxFilterType;
shubang13f15e02019-11-04 17:51:02 -080038using ::android::hardware::tv::tuner::V1_0::DemuxPid;
shubang4a0eddf2019-11-08 17:10:18 -080039using ::android::hardware::tv::tuner::V1_0::DvrType;
shubang4b8c5402019-10-24 17:49:53 -070040using ::android::hardware::tv::tuner::V1_0::FrontendEventType;
shubang7e849b02019-10-18 19:36:25 -070041using ::android::hardware::tv::tuner::V1_0::FrontendId;
shubang51cc62f2020-01-28 18:00:22 -080042using ::android::hardware::tv::tuner::V1_0::FrontendInfo;
shubang4b8c5402019-10-24 17:49:53 -070043using ::android::hardware::tv::tuner::V1_0::FrontendScanMessage;
44using ::android::hardware::tv::tuner::V1_0::FrontendScanMessageType;
shubangd5b845f2019-12-11 15:29:09 -080045using ::android::hardware::tv::tuner::V1_0::FrontendScanType;
shubang74bfd482019-10-29 19:10:22 -070046using ::android::hardware::tv::tuner::V1_0::FrontendSettings;
shubang6f473d62019-11-01 15:42:21 -070047using ::android::hardware::tv::tuner::V1_0::IDemux;
shubang13f15e02019-11-04 17:51:02 -080048using ::android::hardware::tv::tuner::V1_0::IDescrambler;
shubang4a0eddf2019-11-08 17:10:18 -080049using ::android::hardware::tv::tuner::V1_0::IDvr;
50using ::android::hardware::tv::tuner::V1_0::IDvrCallback;
shubang6f473d62019-11-01 15:42:21 -070051using ::android::hardware::tv::tuner::V1_0::IFilter;
52using ::android::hardware::tv::tuner::V1_0::IFilterCallback;
shubang7e849b02019-10-18 19:36:25 -070053using ::android::hardware::tv::tuner::V1_0::IFrontend;
shubang4b8c5402019-10-24 17:49:53 -070054using ::android::hardware::tv::tuner::V1_0::IFrontendCallback;
shubang760f0312019-11-12 17:11:28 -080055using ::android::hardware::tv::tuner::V1_0::ILnb;
56using ::android::hardware::tv::tuner::V1_0::ILnbCallback;
shubangf657da22020-02-05 16:27:06 -080057using ::android::hardware::tv::tuner::V1_0::ITimeFilter;
shubang8ab43b12019-10-18 15:55:55 -070058using ::android::hardware::tv::tuner::V1_0::ITuner;
shubang760f0312019-11-12 17:11:28 -080059using ::android::hardware::tv::tuner::V1_0::LnbEventType;
60using ::android::hardware::tv::tuner::V1_0::LnbId;
shubang4a0eddf2019-11-08 17:10:18 -080061using ::android::hardware::tv::tuner::V1_0::PlaybackStatus;
62using ::android::hardware::tv::tuner::V1_0::RecordStatus;
shubangbee73462020-02-07 17:48:02 -080063using ::android::hardware::tv::tuner::V1_0::Result;
shubang8ab43b12019-10-18 15:55:55 -070064
shubang431e5612020-03-30 21:24:56 -070065using MQ = MessageQueue<uint8_t, kSynchronizedReadWrite>;
shubang964e6132019-11-26 15:05:22 -080066
shubang8ab43b12019-10-18 15:55:55 -070067namespace android {
68
shubang760f0312019-11-12 17:11:28 -080069struct LnbCallback : public ILnbCallback {
70 LnbCallback(jweak tunerObj, LnbId id);
71 virtual Return<void> onEvent(LnbEventType lnbEventType);
72 virtual Return<void> onDiseqcMessage(const hidl_vec<uint8_t>& diseqcMessage);
shubangd295be02020-03-27 17:08:11 -070073 jweak mLnb;
shubang760f0312019-11-12 17:11:28 -080074 LnbId mId;
75};
76
shubang1c1144e2020-03-03 18:00:17 -080077struct Lnb : public RefBase {
78 Lnb(sp<ILnb> sp, jobject obj);
79 ~Lnb();
80 sp<ILnb> getILnb();
81 sp<ILnb> mLnbSp;
82 jweak mLnbObj;
83};
84
shubang4a0eddf2019-11-08 17:10:18 -080085struct DvrCallback : public IDvrCallback {
shubang431e5612020-03-30 21:24:56 -070086 ~DvrCallback();
shubang4a0eddf2019-11-08 17:10:18 -080087 virtual Return<void> onRecordStatus(RecordStatus status);
88 virtual Return<void> onPlaybackStatus(PlaybackStatus status);
89
90 void setDvr(const jobject dvr);
91private:
92 jweak mDvr;
93};
94
shubang9e700ff2019-12-04 16:26:51 -080095struct Dvr : public RefBase {
96 Dvr(sp<IDvr> sp, jweak obj);
shubangba21a7f2019-12-05 16:58:55 -080097 ~Dvr();
shubang431e5612020-03-30 21:24:56 -070098 jint close();
99 MQ& getDvrMQ();
shubang9e700ff2019-12-04 16:26:51 -0800100 sp<IDvr> getIDvr();
101 sp<IDvr> mDvrSp;
102 jweak mDvrObj;
shubang431e5612020-03-30 21:24:56 -0700103 std::unique_ptr<MQ> mDvrMQ;
shubangba21a7f2019-12-05 16:58:55 -0800104 EventFlag* mDvrMQEventFlag;
105 std::string mFilePath;
106 int mFd;
shubang9e700ff2019-12-04 16:26:51 -0800107};
108
shubang6f473d62019-11-01 15:42:21 -0700109struct FilterCallback : public IFilterCallback {
shubang431e5612020-03-30 21:24:56 -0700110 ~FilterCallback();
shubang6f473d62019-11-01 15:42:21 -0700111 virtual Return<void> onFilterEvent(const DemuxFilterEvent& filterEvent);
112 virtual Return<void> onFilterStatus(const DemuxFilterStatus status);
shubangcdf30de2019-11-06 17:28:38 -0800113
114 void setFilter(const jobject filter);
shubangd49681e2020-02-17 21:32:30 -0800115 jobject handleToLinearBlock(const native_handle_t* handle, uint32_t size);
shubangcdf30de2019-11-06 17:28:38 -0800116private:
117 jweak mFilter;
shubang3e0c37b2020-02-19 19:09:10 -0800118 jobjectArray getSectionEvent(
119 jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events);
120 jobjectArray getMediaEvent(
121 jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events);
122 jobjectArray getPesEvent(
123 jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events);
124 jobjectArray getTsRecordEvent(
125 jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events);
126 jobjectArray getMmtpRecordEvent(
127 jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events);
128 jobjectArray getDownloadEvent(
129 jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events);
130 jobjectArray getIpPayloadEvent(
131 jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events);
132 jobjectArray getTemiEvent(
133 jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events);
shubang6f473d62019-11-01 15:42:21 -0700134};
135
shubang4b8c5402019-10-24 17:49:53 -0700136struct FrontendCallback : public IFrontendCallback {
137 FrontendCallback(jweak tunerObj, FrontendId id);
138
139 virtual Return<void> onEvent(FrontendEventType frontendEventType);
shubang4b8c5402019-10-24 17:49:53 -0700140 virtual Return<void> onScanMessage(
141 FrontendScanMessageType type, const FrontendScanMessage& message);
142
143 jweak mObject;
144 FrontendId mId;
145};
146
shubang7648a3c2019-11-25 18:16:45 -0800147struct Filter : public RefBase {
shubang3e0c37b2020-02-19 19:09:10 -0800148 Filter(sp<IFilter> sp, jobject obj);
shubang964e6132019-11-26 15:05:22 -0800149 ~Filter();
150 int close();
shubang7648a3c2019-11-25 18:16:45 -0800151 sp<IFilter> getIFilter();
152 sp<IFilter> mFilterSp;
shubang431e5612020-03-30 21:24:56 -0700153 std::unique_ptr<MQ> mFilterMQ;
shubang964e6132019-11-26 15:05:22 -0800154 EventFlag* mFilterMQEventFlag;
shubang7648a3c2019-11-25 18:16:45 -0800155 jweak mFilterObj;
156};
157
shubangf657da22020-02-05 16:27:06 -0800158struct TimeFilter : public RefBase {
159 TimeFilter(sp<ITimeFilter> sp, jweak obj);
160 ~TimeFilter();
161 sp<ITimeFilter> getITimeFilter();
162 sp<ITimeFilter> mTimeFilterSp;
163 jweak mTimeFilterObj;
164};
165
shubang8ab43b12019-10-18 15:55:55 -0700166struct JTuner : public RefBase {
167 JTuner(JNIEnv *env, jobject thiz);
168 sp<ITuner> getTunerService();
shubangbee73462020-02-07 17:48:02 -0800169 jobject getAvSyncHwId(sp<Filter> filter);
170 jobject getAvSyncTime(jint id);
171 int connectCiCam(jint id);
172 int disconnectCiCam();
shubang7e849b02019-10-18 19:36:25 -0700173 jobject getFrontendIds();
174 jobject openFrontendById(int id);
shubang51cc62f2020-01-28 18:00:22 -0800175 jobject getFrontendInfo(int id);
shubang74bfd482019-10-29 19:10:22 -0700176 int tune(const FrontendSettings& settings);
shubange32fb412020-01-28 14:53:05 -0800177 int stopTune();
shubangd5b845f2019-12-11 15:29:09 -0800178 int scan(const FrontendSettings& settings, FrontendScanType scanType);
shubange32fb412020-01-28 14:53:05 -0800179 int stopScan();
180 int setLnb(int id);
181 int setLna(bool enable);
shubang0dc83942020-04-02 17:19:31 -0700182 jintArray getLnbIds();
shubang760f0312019-11-12 17:11:28 -0800183 jobject openLnbById(int id);
shubang757602f2020-03-06 15:23:41 -0800184 jobject openLnbByName(jstring name);
shubang6f473d62019-11-01 15:42:21 -0700185 jobject openFilter(DemuxFilterType type, int bufferSize);
shubangf657da22020-02-05 16:27:06 -0800186 jobject openTimeFilter();
shubang13f15e02019-11-04 17:51:02 -0800187 jobject openDescrambler();
shubang5637a662020-02-27 18:06:21 -0800188 jobject openDvr(DvrType type, jlong bufferSize);
shubangc4b45702020-03-23 18:48:12 -0700189 jobject getDemuxCaps();
shubangb83f8232020-03-24 18:04:35 -0700190 jobject getFrontendStatus(jintArray types);
shubang66cc3aa2020-04-06 17:10:01 -0700191 Result openDemux();
shubang760f0312019-11-12 17:11:28 -0800192
shubang8ab43b12019-10-18 15:55:55 -0700193protected:
194 virtual ~JTuner();
195
196private:
197 jclass mClass;
198 jweak mObject;
199 static sp<ITuner> mTuner;
shubang4b8c5402019-10-24 17:49:53 -0700200 hidl_vec<FrontendId> mFeIds;
shubang7e849b02019-10-18 19:36:25 -0700201 sp<IFrontend> mFe;
shubangd295be02020-03-27 17:08:11 -0700202 int mFeId;
shubang760f0312019-11-12 17:11:28 -0800203 hidl_vec<LnbId> mLnbIds;
204 sp<ILnb> mLnb;
shubang6f473d62019-11-01 15:42:21 -0700205 sp<IDemux> mDemux;
shubangd49681e2020-02-17 21:32:30 -0800206 uint32_t mDemuxId;
shubang66cc3aa2020-04-06 17:10:01 -0700207 static jobject getAnalogFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps);
208 static jobject getAtsc3FrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps);
209 static jobject getAtscFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps);
210 static jobject getDvbcFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps);
211 static jobject getDvbsFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps);
212 static jobject getDvbtFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps);
213 static jobject getIsdbs3FrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps);
214 static jobject getIsdbsFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps);
215 static jobject getIsdbtFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps);
shubang8ab43b12019-10-18 15:55:55 -0700216};
217
218} // namespace android
219
220#endif // _ANDROID_MEDIA_TV_TUNER_H_