blob: 33b569e9dcc5ad4c04e53610a5f1d1bc32906c28 [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;
shubang8ab43b12019-10-18 15:55:55 -070057using ::android::hardware::tv::tuner::V1_0::ITuner;
shubang760f0312019-11-12 17:11:28 -080058using ::android::hardware::tv::tuner::V1_0::LnbEventType;
59using ::android::hardware::tv::tuner::V1_0::LnbId;
shubang4a0eddf2019-11-08 17:10:18 -080060using ::android::hardware::tv::tuner::V1_0::PlaybackStatus;
61using ::android::hardware::tv::tuner::V1_0::RecordStatus;
shubang8ab43b12019-10-18 15:55:55 -070062
shubang964e6132019-11-26 15:05:22 -080063using FilterMQ = MessageQueue<uint8_t, kSynchronizedReadWrite>;
shubangba21a7f2019-12-05 16:58:55 -080064using DvrMQ = MessageQueue<uint8_t, kSynchronizedReadWrite>;
shubang964e6132019-11-26 15:05:22 -080065
shubang8ab43b12019-10-18 15:55:55 -070066namespace android {
67
shubang760f0312019-11-12 17:11:28 -080068struct LnbCallback : public ILnbCallback {
69 LnbCallback(jweak tunerObj, LnbId id);
70 virtual Return<void> onEvent(LnbEventType lnbEventType);
71 virtual Return<void> onDiseqcMessage(const hidl_vec<uint8_t>& diseqcMessage);
72 jweak mObject;
73 LnbId mId;
74};
75
shubang4a0eddf2019-11-08 17:10:18 -080076struct DvrCallback : public IDvrCallback {
77 virtual Return<void> onRecordStatus(RecordStatus status);
78 virtual Return<void> onPlaybackStatus(PlaybackStatus status);
79
80 void setDvr(const jobject dvr);
81private:
82 jweak mDvr;
83};
84
shubang9e700ff2019-12-04 16:26:51 -080085struct Dvr : public RefBase {
86 Dvr(sp<IDvr> sp, jweak obj);
shubangba21a7f2019-12-05 16:58:55 -080087 ~Dvr();
88 int close();
shubang5f4ea352019-12-09 15:12:10 -080089 DvrMQ& getDvrMQ();
shubang9e700ff2019-12-04 16:26:51 -080090 sp<IDvr> getIDvr();
91 sp<IDvr> mDvrSp;
92 jweak mDvrObj;
shubangba21a7f2019-12-05 16:58:55 -080093 std::unique_ptr<DvrMQ> mDvrMQ;
94 EventFlag* mDvrMQEventFlag;
95 std::string mFilePath;
96 int mFd;
shubang9e700ff2019-12-04 16:26:51 -080097};
98
shubang6f473d62019-11-01 15:42:21 -070099struct FilterCallback : public IFilterCallback {
100 virtual Return<void> onFilterEvent(const DemuxFilterEvent& filterEvent);
101 virtual Return<void> onFilterStatus(const DemuxFilterStatus status);
shubangcdf30de2019-11-06 17:28:38 -0800102
103 void setFilter(const jobject filter);
shubangd49681e2020-02-17 21:32:30 -0800104 jobject handleToLinearBlock(const native_handle_t* handle, uint32_t size);
shubangcdf30de2019-11-06 17:28:38 -0800105private:
106 jweak mFilter;
shubangd49681e2020-02-17 21:32:30 -0800107 jobject getMediaEvent(const DemuxFilterEvent::Event& event);
shubang6f473d62019-11-01 15:42:21 -0700108};
109
shubang4b8c5402019-10-24 17:49:53 -0700110struct FrontendCallback : public IFrontendCallback {
111 FrontendCallback(jweak tunerObj, FrontendId id);
112
113 virtual Return<void> onEvent(FrontendEventType frontendEventType);
shubang4b8c5402019-10-24 17:49:53 -0700114 virtual Return<void> onScanMessage(
115 FrontendScanMessageType type, const FrontendScanMessage& message);
116
117 jweak mObject;
118 FrontendId mId;
119};
120
shubang7648a3c2019-11-25 18:16:45 -0800121struct Filter : public RefBase {
122 Filter(sp<IFilter> sp, jweak obj);
shubang964e6132019-11-26 15:05:22 -0800123 ~Filter();
124 int close();
shubang7648a3c2019-11-25 18:16:45 -0800125 sp<IFilter> getIFilter();
126 sp<IFilter> mFilterSp;
shubang964e6132019-11-26 15:05:22 -0800127 std::unique_ptr<FilterMQ> mFilterMQ;
128 EventFlag* mFilterMQEventFlag;
shubang7648a3c2019-11-25 18:16:45 -0800129 jweak mFilterObj;
130};
131
shubang8ab43b12019-10-18 15:55:55 -0700132struct JTuner : public RefBase {
133 JTuner(JNIEnv *env, jobject thiz);
134 sp<ITuner> getTunerService();
shubang7e849b02019-10-18 19:36:25 -0700135 jobject getFrontendIds();
136 jobject openFrontendById(int id);
shubang51cc62f2020-01-28 18:00:22 -0800137 jobject getFrontendInfo(int id);
shubang74bfd482019-10-29 19:10:22 -0700138 int tune(const FrontendSettings& settings);
shubange32fb412020-01-28 14:53:05 -0800139 int stopTune();
shubangd5b845f2019-12-11 15:29:09 -0800140 int scan(const FrontendSettings& settings, FrontendScanType scanType);
shubange32fb412020-01-28 14:53:05 -0800141 int stopScan();
142 int setLnb(int id);
143 int setLna(bool enable);
shubang760f0312019-11-12 17:11:28 -0800144 jobject getLnbIds();
145 jobject openLnbById(int id);
shubang6f473d62019-11-01 15:42:21 -0700146 jobject openFilter(DemuxFilterType type, int bufferSize);
shubang13f15e02019-11-04 17:51:02 -0800147 jobject openDescrambler();
shubang4a0eddf2019-11-08 17:10:18 -0800148 jobject openDvr(DvrType type, int bufferSize);
shubang760f0312019-11-12 17:11:28 -0800149
shubang8ab43b12019-10-18 15:55:55 -0700150protected:
shubang6f473d62019-11-01 15:42:21 -0700151 bool openDemux();
shubang8ab43b12019-10-18 15:55:55 -0700152 virtual ~JTuner();
153
154private:
155 jclass mClass;
156 jweak mObject;
157 static sp<ITuner> mTuner;
shubang4b8c5402019-10-24 17:49:53 -0700158 hidl_vec<FrontendId> mFeIds;
shubang7e849b02019-10-18 19:36:25 -0700159 sp<IFrontend> mFe;
shubang760f0312019-11-12 17:11:28 -0800160 hidl_vec<LnbId> mLnbIds;
161 sp<ILnb> mLnb;
shubang6f473d62019-11-01 15:42:21 -0700162 sp<IDemux> mDemux;
shubangd49681e2020-02-17 21:32:30 -0800163 uint32_t mDemuxId;
shubang51cc62f2020-01-28 18:00:22 -0800164 static jobject getAnalogFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities caps);
165 static jobject getAtsc3FrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities caps);
166 static jobject getAtscFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities caps);
167 static jobject getDvbcFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities caps);
168 static jobject getDvbsFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities caps);
169 static jobject getDvbtFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities caps);
170 static jobject getIsdbs3FrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities caps);
171 static jobject getIsdbsFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities caps);
172 static jobject getIsdbtFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities caps);
shubang8ab43b12019-10-18 15:55:55 -0700173};
174
175} // namespace android
176
177#endif // _ANDROID_MEDIA_TV_TUNER_H_