shubang | 8ab43b1 | 2019-10-18 15:55:55 -0700 | [diff] [blame] | 1 | /* |
| 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> |
shubang | 964e613 | 2019-11-26 15:05:22 -0800 | [diff] [blame] | 21 | #include <fmq/MessageQueue.h> |
shubang | ba21a7f | 2019-12-05 16:58:55 -0800 | [diff] [blame] | 22 | #include <fstream> |
| 23 | #include <string> |
shubang | 6f473d6 | 2019-11-01 15:42:21 -0700 | [diff] [blame] | 24 | #include <unordered_map> |
shubang | 8ab43b1 | 2019-10-18 15:55:55 -0700 | [diff] [blame] | 25 | #include <utils/RefBase.h> |
| 26 | |
| 27 | #include "jni.h" |
| 28 | |
shubang | 964e613 | 2019-11-26 15:05:22 -0800 | [diff] [blame] | 29 | using ::android::hardware::EventFlag; |
| 30 | using ::android::hardware::MQDescriptorSync; |
| 31 | using ::android::hardware::MessageQueue; |
shubang | 6f473d6 | 2019-11-01 15:42:21 -0700 | [diff] [blame] | 32 | using ::android::hardware::Return; |
shubang | 4b8c540 | 2019-10-24 17:49:53 -0700 | [diff] [blame] | 33 | using ::android::hardware::hidl_vec; |
shubang | 964e613 | 2019-11-26 15:05:22 -0800 | [diff] [blame] | 34 | using ::android::hardware::kSynchronizedReadWrite; |
shubang | 6f473d6 | 2019-11-01 15:42:21 -0700 | [diff] [blame] | 35 | using ::android::hardware::tv::tuner::V1_0::DemuxFilterEvent; |
| 36 | using ::android::hardware::tv::tuner::V1_0::DemuxFilterStatus; |
| 37 | using ::android::hardware::tv::tuner::V1_0::DemuxFilterType; |
shubang | 13f15e0 | 2019-11-04 17:51:02 -0800 | [diff] [blame] | 38 | using ::android::hardware::tv::tuner::V1_0::DemuxPid; |
shubang | 4a0eddf | 2019-11-08 17:10:18 -0800 | [diff] [blame] | 39 | using ::android::hardware::tv::tuner::V1_0::DvrType; |
shubang | 4b8c540 | 2019-10-24 17:49:53 -0700 | [diff] [blame] | 40 | using ::android::hardware::tv::tuner::V1_0::FrontendEventType; |
shubang | 7e849b0 | 2019-10-18 19:36:25 -0700 | [diff] [blame] | 41 | using ::android::hardware::tv::tuner::V1_0::FrontendId; |
shubang | 51cc62f | 2020-01-28 18:00:22 -0800 | [diff] [blame] | 42 | using ::android::hardware::tv::tuner::V1_0::FrontendInfo; |
shubang | 4b8c540 | 2019-10-24 17:49:53 -0700 | [diff] [blame] | 43 | using ::android::hardware::tv::tuner::V1_0::FrontendScanMessage; |
| 44 | using ::android::hardware::tv::tuner::V1_0::FrontendScanMessageType; |
shubang | d5b845f | 2019-12-11 15:29:09 -0800 | [diff] [blame] | 45 | using ::android::hardware::tv::tuner::V1_0::FrontendScanType; |
shubang | 74bfd48 | 2019-10-29 19:10:22 -0700 | [diff] [blame] | 46 | using ::android::hardware::tv::tuner::V1_0::FrontendSettings; |
shubang | 6f473d6 | 2019-11-01 15:42:21 -0700 | [diff] [blame] | 47 | using ::android::hardware::tv::tuner::V1_0::IDemux; |
shubang | 13f15e0 | 2019-11-04 17:51:02 -0800 | [diff] [blame] | 48 | using ::android::hardware::tv::tuner::V1_0::IDescrambler; |
shubang | 4a0eddf | 2019-11-08 17:10:18 -0800 | [diff] [blame] | 49 | using ::android::hardware::tv::tuner::V1_0::IDvr; |
| 50 | using ::android::hardware::tv::tuner::V1_0::IDvrCallback; |
shubang | 6f473d6 | 2019-11-01 15:42:21 -0700 | [diff] [blame] | 51 | using ::android::hardware::tv::tuner::V1_0::IFilter; |
| 52 | using ::android::hardware::tv::tuner::V1_0::IFilterCallback; |
shubang | 7e849b0 | 2019-10-18 19:36:25 -0700 | [diff] [blame] | 53 | using ::android::hardware::tv::tuner::V1_0::IFrontend; |
shubang | 4b8c540 | 2019-10-24 17:49:53 -0700 | [diff] [blame] | 54 | using ::android::hardware::tv::tuner::V1_0::IFrontendCallback; |
shubang | 760f031 | 2019-11-12 17:11:28 -0800 | [diff] [blame] | 55 | using ::android::hardware::tv::tuner::V1_0::ILnb; |
| 56 | using ::android::hardware::tv::tuner::V1_0::ILnbCallback; |
shubang | f657da2 | 2020-02-05 16:27:06 -0800 | [diff] [blame] | 57 | using ::android::hardware::tv::tuner::V1_0::ITimeFilter; |
shubang | 8ab43b1 | 2019-10-18 15:55:55 -0700 | [diff] [blame] | 58 | using ::android::hardware::tv::tuner::V1_0::ITuner; |
shubang | 760f031 | 2019-11-12 17:11:28 -0800 | [diff] [blame] | 59 | using ::android::hardware::tv::tuner::V1_0::LnbEventType; |
| 60 | using ::android::hardware::tv::tuner::V1_0::LnbId; |
shubang | 4a0eddf | 2019-11-08 17:10:18 -0800 | [diff] [blame] | 61 | using ::android::hardware::tv::tuner::V1_0::PlaybackStatus; |
| 62 | using ::android::hardware::tv::tuner::V1_0::RecordStatus; |
shubang | bee7346 | 2020-02-07 17:48:02 -0800 | [diff] [blame] | 63 | using ::android::hardware::tv::tuner::V1_0::Result; |
shubang | 8ab43b1 | 2019-10-18 15:55:55 -0700 | [diff] [blame] | 64 | |
shubang | 431e561 | 2020-03-30 21:24:56 -0700 | [diff] [blame] | 65 | using MQ = MessageQueue<uint8_t, kSynchronizedReadWrite>; |
shubang | 964e613 | 2019-11-26 15:05:22 -0800 | [diff] [blame] | 66 | |
shubang | 8ab43b1 | 2019-10-18 15:55:55 -0700 | [diff] [blame] | 67 | namespace android { |
| 68 | |
shubang | 760f031 | 2019-11-12 17:11:28 -0800 | [diff] [blame] | 69 | struct 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); |
shubang | d295be0 | 2020-03-27 17:08:11 -0700 | [diff] [blame] | 73 | jweak mLnb; |
shubang | 760f031 | 2019-11-12 17:11:28 -0800 | [diff] [blame] | 74 | LnbId mId; |
| 75 | }; |
| 76 | |
shubang | 1c1144e | 2020-03-03 18:00:17 -0800 | [diff] [blame] | 77 | struct 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 | |
shubang | 4a0eddf | 2019-11-08 17:10:18 -0800 | [diff] [blame] | 85 | struct DvrCallback : public IDvrCallback { |
shubang | 431e561 | 2020-03-30 21:24:56 -0700 | [diff] [blame] | 86 | ~DvrCallback(); |
shubang | 4a0eddf | 2019-11-08 17:10:18 -0800 | [diff] [blame] | 87 | virtual Return<void> onRecordStatus(RecordStatus status); |
| 88 | virtual Return<void> onPlaybackStatus(PlaybackStatus status); |
| 89 | |
| 90 | void setDvr(const jobject dvr); |
| 91 | private: |
| 92 | jweak mDvr; |
| 93 | }; |
| 94 | |
shubang | 9e700ff | 2019-12-04 16:26:51 -0800 | [diff] [blame] | 95 | struct Dvr : public RefBase { |
| 96 | Dvr(sp<IDvr> sp, jweak obj); |
shubang | ba21a7f | 2019-12-05 16:58:55 -0800 | [diff] [blame] | 97 | ~Dvr(); |
shubang | 431e561 | 2020-03-30 21:24:56 -0700 | [diff] [blame] | 98 | jint close(); |
| 99 | MQ& getDvrMQ(); |
shubang | 9e700ff | 2019-12-04 16:26:51 -0800 | [diff] [blame] | 100 | sp<IDvr> getIDvr(); |
| 101 | sp<IDvr> mDvrSp; |
| 102 | jweak mDvrObj; |
shubang | 431e561 | 2020-03-30 21:24:56 -0700 | [diff] [blame] | 103 | std::unique_ptr<MQ> mDvrMQ; |
shubang | ba21a7f | 2019-12-05 16:58:55 -0800 | [diff] [blame] | 104 | EventFlag* mDvrMQEventFlag; |
| 105 | std::string mFilePath; |
| 106 | int mFd; |
shubang | 9e700ff | 2019-12-04 16:26:51 -0800 | [diff] [blame] | 107 | }; |
| 108 | |
shubang | 6f473d6 | 2019-11-01 15:42:21 -0700 | [diff] [blame] | 109 | struct FilterCallback : public IFilterCallback { |
shubang | 431e561 | 2020-03-30 21:24:56 -0700 | [diff] [blame] | 110 | ~FilterCallback(); |
shubang | 6f473d6 | 2019-11-01 15:42:21 -0700 | [diff] [blame] | 111 | virtual Return<void> onFilterEvent(const DemuxFilterEvent& filterEvent); |
| 112 | virtual Return<void> onFilterStatus(const DemuxFilterStatus status); |
shubang | cdf30de | 2019-11-06 17:28:38 -0800 | [diff] [blame] | 113 | |
| 114 | void setFilter(const jobject filter); |
shubang | d49681e | 2020-02-17 21:32:30 -0800 | [diff] [blame] | 115 | jobject handleToLinearBlock(const native_handle_t* handle, uint32_t size); |
shubang | cdf30de | 2019-11-06 17:28:38 -0800 | [diff] [blame] | 116 | private: |
| 117 | jweak mFilter; |
shubang | 3e0c37b | 2020-02-19 19:09:10 -0800 | [diff] [blame] | 118 | 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); |
shubang | 6f473d6 | 2019-11-01 15:42:21 -0700 | [diff] [blame] | 134 | }; |
| 135 | |
shubang | 4b8c540 | 2019-10-24 17:49:53 -0700 | [diff] [blame] | 136 | struct FrontendCallback : public IFrontendCallback { |
| 137 | FrontendCallback(jweak tunerObj, FrontendId id); |
| 138 | |
| 139 | virtual Return<void> onEvent(FrontendEventType frontendEventType); |
shubang | 4b8c540 | 2019-10-24 17:49:53 -0700 | [diff] [blame] | 140 | virtual Return<void> onScanMessage( |
| 141 | FrontendScanMessageType type, const FrontendScanMessage& message); |
| 142 | |
| 143 | jweak mObject; |
| 144 | FrontendId mId; |
| 145 | }; |
| 146 | |
shubang | 7648a3c | 2019-11-25 18:16:45 -0800 | [diff] [blame] | 147 | struct Filter : public RefBase { |
shubang | 3e0c37b | 2020-02-19 19:09:10 -0800 | [diff] [blame] | 148 | Filter(sp<IFilter> sp, jobject obj); |
shubang | 964e613 | 2019-11-26 15:05:22 -0800 | [diff] [blame] | 149 | ~Filter(); |
| 150 | int close(); |
shubang | 7648a3c | 2019-11-25 18:16:45 -0800 | [diff] [blame] | 151 | sp<IFilter> getIFilter(); |
| 152 | sp<IFilter> mFilterSp; |
shubang | 431e561 | 2020-03-30 21:24:56 -0700 | [diff] [blame] | 153 | std::unique_ptr<MQ> mFilterMQ; |
shubang | 964e613 | 2019-11-26 15:05:22 -0800 | [diff] [blame] | 154 | EventFlag* mFilterMQEventFlag; |
shubang | 7648a3c | 2019-11-25 18:16:45 -0800 | [diff] [blame] | 155 | jweak mFilterObj; |
| 156 | }; |
| 157 | |
shubang | f657da2 | 2020-02-05 16:27:06 -0800 | [diff] [blame] | 158 | struct 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 | |
shubang | 8ab43b1 | 2019-10-18 15:55:55 -0700 | [diff] [blame] | 166 | struct JTuner : public RefBase { |
| 167 | JTuner(JNIEnv *env, jobject thiz); |
| 168 | sp<ITuner> getTunerService(); |
shubang | bee7346 | 2020-02-07 17:48:02 -0800 | [diff] [blame] | 169 | jobject getAvSyncHwId(sp<Filter> filter); |
| 170 | jobject getAvSyncTime(jint id); |
| 171 | int connectCiCam(jint id); |
| 172 | int disconnectCiCam(); |
shubang | 7e849b0 | 2019-10-18 19:36:25 -0700 | [diff] [blame] | 173 | jobject getFrontendIds(); |
| 174 | jobject openFrontendById(int id); |
shubang | 51cc62f | 2020-01-28 18:00:22 -0800 | [diff] [blame] | 175 | jobject getFrontendInfo(int id); |
shubang | 74bfd48 | 2019-10-29 19:10:22 -0700 | [diff] [blame] | 176 | int tune(const FrontendSettings& settings); |
shubang | e32fb41 | 2020-01-28 14:53:05 -0800 | [diff] [blame] | 177 | int stopTune(); |
shubang | d5b845f | 2019-12-11 15:29:09 -0800 | [diff] [blame] | 178 | int scan(const FrontendSettings& settings, FrontendScanType scanType); |
shubang | e32fb41 | 2020-01-28 14:53:05 -0800 | [diff] [blame] | 179 | int stopScan(); |
| 180 | int setLnb(int id); |
| 181 | int setLna(bool enable); |
shubang | 0dc8394 | 2020-04-02 17:19:31 -0700 | [diff] [blame] | 182 | jintArray getLnbIds(); |
shubang | 760f031 | 2019-11-12 17:11:28 -0800 | [diff] [blame] | 183 | jobject openLnbById(int id); |
shubang | 757602f | 2020-03-06 15:23:41 -0800 | [diff] [blame] | 184 | jobject openLnbByName(jstring name); |
shubang | 6f473d6 | 2019-11-01 15:42:21 -0700 | [diff] [blame] | 185 | jobject openFilter(DemuxFilterType type, int bufferSize); |
shubang | f657da2 | 2020-02-05 16:27:06 -0800 | [diff] [blame] | 186 | jobject openTimeFilter(); |
shubang | 13f15e0 | 2019-11-04 17:51:02 -0800 | [diff] [blame] | 187 | jobject openDescrambler(); |
shubang | 5637a66 | 2020-02-27 18:06:21 -0800 | [diff] [blame] | 188 | jobject openDvr(DvrType type, jlong bufferSize); |
shubang | c4b4570 | 2020-03-23 18:48:12 -0700 | [diff] [blame] | 189 | jobject getDemuxCaps(); |
shubang | b83f823 | 2020-03-24 18:04:35 -0700 | [diff] [blame] | 190 | jobject getFrontendStatus(jintArray types); |
shubang | 66cc3aa | 2020-04-06 17:10:01 -0700 | [diff] [blame] | 191 | Result openDemux(); |
shubang | 760f031 | 2019-11-12 17:11:28 -0800 | [diff] [blame] | 192 | |
shubang | 8ab43b1 | 2019-10-18 15:55:55 -0700 | [diff] [blame] | 193 | protected: |
| 194 | virtual ~JTuner(); |
| 195 | |
| 196 | private: |
| 197 | jclass mClass; |
| 198 | jweak mObject; |
| 199 | static sp<ITuner> mTuner; |
shubang | 4b8c540 | 2019-10-24 17:49:53 -0700 | [diff] [blame] | 200 | hidl_vec<FrontendId> mFeIds; |
shubang | 7e849b0 | 2019-10-18 19:36:25 -0700 | [diff] [blame] | 201 | sp<IFrontend> mFe; |
shubang | d295be0 | 2020-03-27 17:08:11 -0700 | [diff] [blame] | 202 | int mFeId; |
shubang | 760f031 | 2019-11-12 17:11:28 -0800 | [diff] [blame] | 203 | hidl_vec<LnbId> mLnbIds; |
| 204 | sp<ILnb> mLnb; |
shubang | 6f473d6 | 2019-11-01 15:42:21 -0700 | [diff] [blame] | 205 | sp<IDemux> mDemux; |
shubang | d49681e | 2020-02-17 21:32:30 -0800 | [diff] [blame] | 206 | uint32_t mDemuxId; |
shubang | 66cc3aa | 2020-04-06 17:10:01 -0700 | [diff] [blame] | 207 | 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); |
shubang | 8ab43b1 | 2019-10-18 15:55:55 -0700 | [diff] [blame] | 216 | }; |
| 217 | |
| 218 | } // namespace android |
| 219 | |
| 220 | #endif // _ANDROID_MEDIA_TV_TUNER_H_ |