summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author shubang <shubang@google.com> 2020-01-27 13:21:55 -0800
committer shubang <shubang@google.com> 2020-01-29 12:32:13 -0800
commitdeb067c2732bca8830318b85f496c4179381e9a3 (patch)
tree971adac5471c46453dd0b44e3fd1a360d652326e
parent7b1117247b791307c968b9575f57325dd5090524 (diff)
Implement tune() in JNI
Test: make; acloud create; Change-Id: I6b0f044c5b11da40085e5d0a363048f63ebba397
-rw-r--r--media/jni/android_media_tv_Tuner.cpp513
1 files changed, 483 insertions, 30 deletions
diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp
index 007d367a533a..1fbe7f42fff3 100644
--- a/media/jni/android_media_tv_Tuner.cpp
+++ b/media/jni/android_media_tv_Tuner.cpp
@@ -41,6 +41,54 @@ using ::android::hardware::tv::tuner::V1_0::DvrSettings;
using ::android::hardware::tv::tuner::V1_0::FrontendAnalogSettings;
using ::android::hardware::tv::tuner::V1_0::FrontendAnalogSifStandard;
using ::android::hardware::tv::tuner::V1_0::FrontendAnalogType;
+using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Bandwidth;
+using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3CodeRate;
+using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3DemodOutputFormat;
+using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Fec;
+using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Modulation;
+using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3PlpSettings;
+using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3Settings;
+using ::android::hardware::tv::tuner::V1_0::FrontendAtsc3TimeInterleaveMode;
+using ::android::hardware::tv::tuner::V1_0::FrontendAtscSettings;
+using ::android::hardware::tv::tuner::V1_0::FrontendAtscModulation;
+using ::android::hardware::tv::tuner::V1_0::FrontendDvbcAnnex;
+using ::android::hardware::tv::tuner::V1_0::FrontendDvbcModulation;
+using ::android::hardware::tv::tuner::V1_0::FrontendDvbcOuterFec;
+using ::android::hardware::tv::tuner::V1_0::FrontendDvbcSettings;
+using ::android::hardware::tv::tuner::V1_0::FrontendDvbcSpectralInversion;
+using ::android::hardware::tv::tuner::V1_0::FrontendDvbsCodeRate;
+using ::android::hardware::tv::tuner::V1_0::FrontendDvbsModulation;
+using ::android::hardware::tv::tuner::V1_0::FrontendDvbsPilot;
+using ::android::hardware::tv::tuner::V1_0::FrontendDvbsRolloff;
+using ::android::hardware::tv::tuner::V1_0::FrontendDvbsSettings;
+using ::android::hardware::tv::tuner::V1_0::FrontendDvbsStandard;
+using ::android::hardware::tv::tuner::V1_0::FrontendDvbsVcmMode;
+using ::android::hardware::tv::tuner::V1_0::FrontendDvbtBandwidth;
+using ::android::hardware::tv::tuner::V1_0::FrontendDvbtCoderate;
+using ::android::hardware::tv::tuner::V1_0::FrontendDvbtConstellation;
+using ::android::hardware::tv::tuner::V1_0::FrontendDvbtGuardInterval;
+using ::android::hardware::tv::tuner::V1_0::FrontendDvbtHierarchy;
+using ::android::hardware::tv::tuner::V1_0::FrontendDvbtPlpMode;
+using ::android::hardware::tv::tuner::V1_0::FrontendDvbtSettings;
+using ::android::hardware::tv::tuner::V1_0::FrontendDvbtStandard;
+using ::android::hardware::tv::tuner::V1_0::FrontendDvbtTransmissionMode;
+using ::android::hardware::tv::tuner::V1_0::FrontendInnerFec;
+using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Coderate;
+using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Modulation;
+using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Rolloff;
+using ::android::hardware::tv::tuner::V1_0::FrontendIsdbs3Settings;
+using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsCoderate;
+using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsModulation;
+using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsRolloff;
+using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsSettings;
+using ::android::hardware::tv::tuner::V1_0::FrontendIsdbsStreamIdType;
+using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtBandwidth;
+using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtCoderate;
+using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtGuardInterval;
+using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtMode;
+using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtModulation;
+using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtSettings;
+using ::android::hardware::tv::tuner::V1_0::FrontendType;
using ::android::hardware::tv::tuner::V1_0::ITuner;
using ::android::hardware::tv::tuner::V1_0::PlaybackSettings;
using ::android::hardware::tv::tuner::V1_0::RecordSettings;
@@ -493,32 +541,437 @@ static DemuxPid getDemuxPid(int pidType, int pid) {
return demuxPid;
}
-static FrontendSettings getFrontendSettings(JNIEnv *env, int type, jobject settings) {
- FrontendSettings frontendSettings;
+static uint32_t getFrontendSettingsFreq(JNIEnv *env, const jobject& settings) {
jclass clazz = env->FindClass("android/media/tv/tuner/frontend/FrontendSettings");
jfieldID freqField = env->GetFieldID(clazz, "mFrequency", "I");
- uint32_t freq = static_cast<uint32_t>(env->GetIntField(clazz, freqField));
-
- // TODO: handle the other 8 types of settings
- if (type == 1) {
- // analog
- clazz = env->FindClass("android/media/tv/tuner/frontend/AnalogFrontendSettings");
- FrontendAnalogType analogType =
- static_cast<FrontendAnalogType>(
- env->GetIntField(settings, env->GetFieldID(clazz, "mAnalogType", "I")));
- FrontendAnalogSifStandard sifStandard =
- static_cast<FrontendAnalogSifStandard>(
- env->GetIntField(settings, env->GetFieldID(clazz, "mSifStandard", "I")));
- FrontendAnalogSettings frontendAnalogSettings {
- .frequency = freq,
- .type = analogType,
- .sifStandard = sifStandard,
+ uint32_t freq = static_cast<uint32_t>(env->GetIntField(settings, freqField));
+ return freq;
+}
+
+static FrontendSettings getAnalogFrontendSettings(JNIEnv *env, const jobject& settings) {
+ FrontendSettings frontendSettings;
+ uint32_t freq = getFrontendSettingsFreq(env, settings);
+ jclass clazz = env->FindClass("android/media/tv/tuner/frontend/AnalogFrontendSettings");
+ FrontendAnalogType analogType =
+ static_cast<FrontendAnalogType>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mSignalType", "I")));
+ FrontendAnalogSifStandard sifStandard =
+ static_cast<FrontendAnalogSifStandard>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mSifStandard", "I")));
+ FrontendAnalogSettings frontendAnalogSettings {
+ .frequency = freq,
+ .type = analogType,
+ .sifStandard = sifStandard,
+ };
+ frontendSettings.analog(frontendAnalogSettings);
+ return frontendSettings;
+}
+
+static hidl_vec<FrontendAtsc3PlpSettings> getAtsc3PlpSettings(
+ JNIEnv *env, const jobject& settings) {
+ jclass clazz = env->FindClass("android/media/tv/tuner/frontend/Atsc3FrontendSettings");
+ jobjectArray plpSettings =
+ reinterpret_cast<jobjectArray>(
+ env->GetObjectField(settings,
+ env->GetFieldID(
+ clazz,
+ "mPlpSettings",
+ "[Landroid/media/tv/tuner/frontend/Atsc3PlpSettings;")));
+ int len = env->GetArrayLength(plpSettings);
+
+ jclass plpClazz = env->FindClass("android/media/tv/tuner/frontend/Atsc3PlpSettings");
+ hidl_vec<FrontendAtsc3PlpSettings> plps = hidl_vec<FrontendAtsc3PlpSettings>(len);
+ // parse PLP settings
+ for (int i = 0; i < len; i++) {
+ jobject plp = env->GetObjectArrayElement(plpSettings, i);
+ uint8_t plpId =
+ static_cast<uint8_t>(
+ env->GetIntField(plp, env->GetFieldID(plpClazz, "mPlpId", "I")));
+ FrontendAtsc3Modulation modulation =
+ static_cast<FrontendAtsc3Modulation>(
+ env->GetIntField(plp, env->GetFieldID(plpClazz, "mModulation", "I")));
+ FrontendAtsc3TimeInterleaveMode interleaveMode =
+ static_cast<FrontendAtsc3TimeInterleaveMode>(
+ env->GetIntField(
+ plp, env->GetFieldID(plpClazz, "mInterleaveMode", "I")));
+ FrontendAtsc3CodeRate codeRate =
+ static_cast<FrontendAtsc3CodeRate>(
+ env->GetIntField(plp, env->GetFieldID(plpClazz, "mCodeRate", "I")));
+ FrontendAtsc3Fec fec =
+ static_cast<FrontendAtsc3Fec>(
+ env->GetIntField(plp, env->GetFieldID(plpClazz, "mFec", "I")));
+ FrontendAtsc3PlpSettings frontendAtsc3PlpSettings {
+ .plpId = plpId,
+ .modulation = modulation,
+ .interleaveMode = interleaveMode,
+ .codeRate = codeRate,
+ .fec = fec,
};
- frontendSettings.analog(frontendAnalogSettings);
+ plps[i] = frontendAtsc3PlpSettings;
}
+ return plps;
+}
+
+static FrontendSettings getAtsc3FrontendSettings(JNIEnv *env, const jobject& settings) {
+ FrontendSettings frontendSettings;
+ uint32_t freq = getFrontendSettingsFreq(env, settings);
+ jclass clazz = env->FindClass("android/media/tv/tuner/frontend/Atsc3FrontendSettings");
+
+ FrontendAtsc3Bandwidth bandwidth =
+ static_cast<FrontendAtsc3Bandwidth>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mBandwidth", "I")));
+ FrontendAtsc3DemodOutputFormat demod =
+ static_cast<FrontendAtsc3DemodOutputFormat>(
+ env->GetIntField(
+ settings, env->GetFieldID(clazz, "mDemodOutputFormat", "I")));
+ hidl_vec<FrontendAtsc3PlpSettings> plps = getAtsc3PlpSettings(env, settings);
+ FrontendAtsc3Settings frontendAtsc3Settings {
+ .frequency = freq,
+ .bandwidth = bandwidth,
+ .demodOutputFormat = demod,
+ .plpSettings = plps,
+ };
+ frontendSettings.atsc3(frontendAtsc3Settings);
+ return frontendSettings;
+}
+
+static FrontendSettings getAtscFrontendSettings(JNIEnv *env, const jobject& settings) {
+ FrontendSettings frontendSettings;
+ uint32_t freq = getFrontendSettingsFreq(env, settings);
+ jclass clazz = env->FindClass("android/media/tv/tuner/frontend/AtscFrontendSettings");
+ FrontendAtscModulation modulation =
+ static_cast<FrontendAtscModulation>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mModulation", "I")));
+ FrontendAtscSettings frontendAtscSettings {
+ .frequency = freq,
+ .modulation = modulation,
+ };
+ frontendSettings.atsc(frontendAtscSettings);
+ return frontendSettings;
+}
+
+static FrontendSettings getDvbcFrontendSettings(JNIEnv *env, const jobject& settings) {
+ FrontendSettings frontendSettings;
+ uint32_t freq = getFrontendSettingsFreq(env, settings);
+ jclass clazz = env->FindClass("android/media/tv/tuner/frontend/DvbcFrontendSettings");
+ FrontendDvbcModulation modulation =
+ static_cast<FrontendDvbcModulation>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mModulation", "I")));
+ FrontendInnerFec innerFec =
+ static_cast<FrontendInnerFec>(
+ env->GetLongField(settings, env->GetFieldID(clazz, "mFec", "J")));
+ uint32_t symbolRate =
+ static_cast<uint32_t>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mSymbolRate", "I")));
+ FrontendDvbcOuterFec outerFec =
+ static_cast<FrontendDvbcOuterFec>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mOuterFec", "I")));
+ FrontendDvbcAnnex annex =
+ static_cast<FrontendDvbcAnnex>(
+ env->GetByteField(settings, env->GetFieldID(clazz, "mAnnex", "B")));
+ FrontendDvbcSpectralInversion spectralInversion =
+ static_cast<FrontendDvbcSpectralInversion>(
+ env->GetIntField(
+ settings, env->GetFieldID(clazz, "mSpectralInversion", "I")));
+ FrontendDvbcSettings frontendDvbcSettings {
+ .frequency = freq,
+ .modulation = modulation,
+ .fec = innerFec,
+ .symbolRate = symbolRate,
+ .outerFec = outerFec,
+ .annex = annex,
+ .spectralInversion = spectralInversion,
+ };
+ frontendSettings.dvbc(frontendDvbcSettings);
+ return frontendSettings;
+}
+
+static FrontendDvbsCodeRate getDvbsCodeRate(JNIEnv *env, const jobject& settings) {
+ jclass clazz = env->FindClass("android/media/tv/tuner/frontend/DvbsFrontendSettings");
+ jobject jcodeRate =
+ env->GetObjectField(settings,
+ env->GetFieldID(
+ clazz,
+ "mCodeRate",
+ "Landroid/media/tv/tuner/frontend/DvbsCodeRate;"));
+
+ jclass codeRateClazz = env->FindClass("android/media/tv/tuner/frontend/DvbsCodeRate");
+ FrontendInnerFec innerFec =
+ static_cast<FrontendInnerFec>(
+ env->GetLongField(
+ jcodeRate, env->GetFieldID(codeRateClazz, "mInnerFec", "J")));
+ bool isLinear =
+ static_cast<bool>(
+ env->GetBooleanField(
+ jcodeRate, env->GetFieldID(codeRateClazz, "mIsLinear", "Z")));
+ bool isShortFrames =
+ static_cast<bool>(
+ env->GetBooleanField(
+ jcodeRate, env->GetFieldID(codeRateClazz, "mIsShortFrames", "Z")));
+ uint32_t bitsPer1000Symbol =
+ static_cast<uint32_t>(
+ env->GetIntField(
+ jcodeRate, env->GetFieldID(
+ codeRateClazz, "mBitsPer1000Symbol", "I")));
+ FrontendDvbsCodeRate coderate {
+ .fec = innerFec,
+ .isLinear = isLinear,
+ .isShortFrames = isShortFrames,
+ .bitsPer1000Symbol = bitsPer1000Symbol,
+ };
+ return coderate;
+}
+
+static FrontendSettings getDvbsFrontendSettings(JNIEnv *env, const jobject& settings) {
+ FrontendSettings frontendSettings;
+ uint32_t freq = getFrontendSettingsFreq(env, settings);
+ jclass clazz = env->FindClass("android/media/tv/tuner/frontend/DvbsFrontendSettings");
+
+
+ FrontendDvbsModulation modulation =
+ static_cast<FrontendDvbsModulation>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mModulation", "I")));
+ uint32_t symbolRate =
+ static_cast<uint32_t>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mSymbolRate", "I")));
+ FrontendDvbsRolloff rolloff =
+ static_cast<FrontendDvbsRolloff>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mRolloff", "I")));
+ FrontendDvbsPilot pilot =
+ static_cast<FrontendDvbsPilot>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mPilot", "I")));
+ uint32_t inputStreamId =
+ static_cast<uint32_t>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mInputStreamId", "I")));
+ FrontendDvbsStandard standard =
+ static_cast<FrontendDvbsStandard>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mStandard", "I")));
+ FrontendDvbsVcmMode vcmMode =
+ static_cast<FrontendDvbsVcmMode>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mVcmMode", "I")));
+ FrontendDvbsCodeRate coderate = getDvbsCodeRate(env, settings);
+
+ FrontendDvbsSettings frontendDvbsSettings {
+ .frequency = freq,
+ .modulation = modulation,
+ .coderate = coderate,
+ .symbolRate = symbolRate,
+ .rolloff = rolloff,
+ .pilot = pilot,
+ .inputStreamId = inputStreamId,
+ .standard = standard,
+ .vcmMode = vcmMode,
+ };
+ frontendSettings.dvbs(frontendDvbsSettings);
+ return frontendSettings;
+}
+
+static FrontendSettings getDvbtFrontendSettings(JNIEnv *env, const jobject& settings) {
+ FrontendSettings frontendSettings;
+ uint32_t freq = getFrontendSettingsFreq(env, settings);
+ jclass clazz = env->FindClass("android/media/tv/tuner/frontend/DvbtFrontendSettings");
+ FrontendDvbtTransmissionMode transmissionMode =
+ static_cast<FrontendDvbtTransmissionMode>(
+ env->GetIntField(
+ settings, env->GetFieldID(clazz, "mTransmissionMode", "I")));
+ FrontendDvbtBandwidth bandwidth =
+ static_cast<FrontendDvbtBandwidth>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mBandwidth", "I")));
+ FrontendDvbtConstellation constellation =
+ static_cast<FrontendDvbtConstellation>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mConstellation", "I")));
+ FrontendDvbtHierarchy hierarchy =
+ static_cast<FrontendDvbtHierarchy>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mHierarchy", "I")));
+ FrontendDvbtCoderate hpCoderate =
+ static_cast<FrontendDvbtCoderate>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mHpCodeRate", "I")));
+ FrontendDvbtCoderate lpCoderate =
+ static_cast<FrontendDvbtCoderate>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mLpCodeRate", "I")));
+ FrontendDvbtGuardInterval guardInterval =
+ static_cast<FrontendDvbtGuardInterval>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mGuardInterval", "I")));
+ bool isHighPriority =
+ static_cast<bool>(
+ env->GetBooleanField(
+ settings, env->GetFieldID(clazz, "mIsHighPriority", "Z")));
+ FrontendDvbtStandard standard =
+ static_cast<FrontendDvbtStandard>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mStandard", "I")));
+ bool isMiso =
+ static_cast<bool>(
+ env->GetBooleanField(settings, env->GetFieldID(clazz, "mIsMiso", "Z")));
+ FrontendDvbtPlpMode plpMode =
+ static_cast<FrontendDvbtPlpMode>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mPlpMode", "I")));
+ uint8_t plpId =
+ static_cast<uint8_t>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mPlpId", "I")));
+ uint8_t plpGroupId =
+ static_cast<uint8_t>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mPlpGroupId", "I")));
+
+ FrontendDvbtSettings frontendDvbtSettings {
+ .frequency = freq,
+ .transmissionMode = transmissionMode,
+ .bandwidth = bandwidth,
+ .constellation = constellation,
+ .hierarchy = hierarchy,
+ .hpCoderate = hpCoderate,
+ .lpCoderate = lpCoderate,
+ .guardInterval = guardInterval,
+ .isHighPriority = isHighPriority,
+ .standard = standard,
+ .isMiso = isMiso,
+ .plpMode = plpMode,
+ .plpId = plpId,
+ .plpGroupId = plpGroupId,
+ };
+ frontendSettings.dvbt(frontendDvbtSettings);
+ return frontendSettings;
+}
+
+static FrontendSettings getIsdbsFrontendSettings(JNIEnv *env, const jobject& settings) {
+ FrontendSettings frontendSettings;
+ uint32_t freq = getFrontendSettingsFreq(env, settings);
+ jclass clazz = env->FindClass("android/media/tv/tuner/frontend/IsdbsFrontendSettings");
+ uint16_t streamId =
+ static_cast<uint16_t>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mStreamId", "I")));
+ FrontendIsdbsStreamIdType streamIdType =
+ static_cast<FrontendIsdbsStreamIdType>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mStreamIdType", "I")));
+ FrontendIsdbsModulation modulation =
+ static_cast<FrontendIsdbsModulation>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mModulation", "I")));
+ FrontendIsdbsCoderate coderate =
+ static_cast<FrontendIsdbsCoderate>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mCodeRate", "I")));
+ uint32_t symbolRate =
+ static_cast<uint32_t>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mSymbolRate", "I")));
+ FrontendIsdbsRolloff rolloff =
+ static_cast<FrontendIsdbsRolloff>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mRolloff", "I")));
+
+ FrontendIsdbsSettings frontendIsdbsSettings {
+ .frequency = freq,
+ .streamId = streamId,
+ .streamIdType = streamIdType,
+ .modulation = modulation,
+ .coderate = coderate,
+ .symbolRate = symbolRate,
+ .rolloff = rolloff,
+ };
+ frontendSettings.isdbs(frontendIsdbsSettings);
return frontendSettings;
}
+static FrontendSettings getIsdbs3FrontendSettings(JNIEnv *env, const jobject& settings) {
+ FrontendSettings frontendSettings;
+ uint32_t freq = getFrontendSettingsFreq(env, settings);
+ jclass clazz = env->FindClass("android/media/tv/tuner/frontend/Isdbs3FrontendSettings");
+ uint16_t streamId =
+ static_cast<uint16_t>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mStreamId", "I")));
+ FrontendIsdbsStreamIdType streamIdType =
+ static_cast<FrontendIsdbsStreamIdType>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mStreamIdType", "I")));
+ FrontendIsdbs3Modulation modulation =
+ static_cast<FrontendIsdbs3Modulation>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mModulation", "I")));
+ FrontendIsdbs3Coderate coderate =
+ static_cast<FrontendIsdbs3Coderate>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mCodeRate", "I")));
+ uint32_t symbolRate =
+ static_cast<uint32_t>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mSymbolRate", "I")));
+ FrontendIsdbs3Rolloff rolloff =
+ static_cast<FrontendIsdbs3Rolloff>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mRolloff", "I")));
+
+ FrontendIsdbs3Settings frontendIsdbs3Settings {
+ .frequency = freq,
+ .streamId = streamId,
+ .streamIdType = streamIdType,
+ .modulation = modulation,
+ .coderate = coderate,
+ .symbolRate = symbolRate,
+ .rolloff = rolloff,
+ };
+ frontendSettings.isdbs3(frontendIsdbs3Settings);
+ return frontendSettings;
+}
+
+static FrontendSettings getIsdbtFrontendSettings(JNIEnv *env, const jobject& settings) {
+ FrontendSettings frontendSettings;
+ uint32_t freq = getFrontendSettingsFreq(env, settings);
+ jclass clazz = env->FindClass("android/media/tv/tuner/frontend/IsdbtFrontendSettings");
+ FrontendIsdbtModulation modulation =
+ static_cast<FrontendIsdbtModulation>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mModulation", "I")));
+ FrontendIsdbtBandwidth bandwidth =
+ static_cast<FrontendIsdbtBandwidth>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mBandwidth", "I")));
+ FrontendIsdbtMode mode =
+ static_cast<FrontendIsdbtMode>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mMode", "I")));
+ FrontendIsdbtCoderate coderate =
+ static_cast<FrontendIsdbtCoderate>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mCodeRate", "I")));
+ FrontendIsdbtGuardInterval guardInterval =
+ static_cast<FrontendIsdbtGuardInterval>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mGuardInterval", "I")));
+ uint32_t serviceAreaId =
+ static_cast<uint32_t>(
+ env->GetIntField(settings, env->GetFieldID(clazz, "mServiceAreaId", "I")));
+
+ FrontendIsdbtSettings frontendIsdbtSettings {
+ .frequency = freq,
+ .modulation = modulation,
+ .bandwidth = bandwidth,
+ .mode = mode,
+ .coderate = coderate,
+ .guardInterval = guardInterval,
+ .serviceAreaId = serviceAreaId,
+ };
+ frontendSettings.isdbt(frontendIsdbtSettings);
+ return frontendSettings;
+}
+
+static FrontendSettings getFrontendSettings(JNIEnv *env, int type, jobject settings) {
+ ALOGD("getFrontendSettings %d", type);
+
+ FrontendType feType = static_cast<FrontendType>(type);
+ switch(feType) {
+ case FrontendType::ANALOG:
+ return getAnalogFrontendSettings(env, settings);
+ case FrontendType::ATSC3:
+ return getAtsc3FrontendSettings(env, settings);
+ case FrontendType::ATSC:
+ return getAtscFrontendSettings(env, settings);
+ case FrontendType::DVBC:
+ return getDvbcFrontendSettings(env, settings);
+ case FrontendType::DVBS:
+ return getDvbsFrontendSettings(env, settings);
+ case FrontendType::DVBT:
+ return getDvbtFrontendSettings(env, settings);
+ case FrontendType::ISDBS:
+ return getIsdbsFrontendSettings(env, settings);
+ case FrontendType::ISDBS3:
+ return getIsdbs3FrontendSettings(env, settings);
+ case FrontendType::ISDBT:
+ return getIsdbtFrontendSettings(env, settings);
+ default:
+ // should never happen because a type is associated with a subclass of
+ // FrontendSettings and not set by users
+ jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException",
+ "Unsupported frontend type %d", type);
+ return FrontendSettings();
+ }
+}
+
static sp<Filter> getFilter(JNIEnv *env, jobject filter) {
return (Filter *)env->GetLongField(filter, gFields.filterContext);
}
@@ -587,23 +1040,23 @@ static void android_media_tv_Tuner_native_init(JNIEnv *env) {
jclass lnbClazz = env->FindClass("android/media/tv/tuner/Lnb");
gFields.lnbInitID =
- env->GetMethodID(lnbClazz, "<init>", "(Landroid/media/tv/tuner/Tuner;I)V");
+ env->GetMethodID(lnbClazz, "<init>", "(I)V");
jclass filterClazz = env->FindClass("android/media/tv/tuner/filter/Filter");
gFields.filterContext = env->GetFieldID(filterClazz, "mNativeContext", "J");
gFields.filterInitID =
- env->GetMethodID(filterClazz, "<init>", "(Landroid/media/tv/tuner/Tuner;I)V");
+ env->GetMethodID(filterClazz, "<init>", "(I)V");
gFields.onFilterStatusID =
env->GetMethodID(filterClazz, "onFilterStatus", "(I)V");
jclass descramblerClazz = env->FindClass("android/media/tv/tuner/Descrambler");
gFields.descramblerContext = env->GetFieldID(descramblerClazz, "mNativeContext", "J");
gFields.descramblerInitID =
- env->GetMethodID(descramblerClazz, "<init>", "(Landroid/media/tv/tuner/Tuner;)V");
+ env->GetMethodID(descramblerClazz, "<init>", "()V");
jclass dvrClazz = env->FindClass("android/media/tv/tuner/dvr/Dvr");
gFields.dvrContext = env->GetFieldID(dvrClazz, "mNativeContext", "J");
- gFields.dvrInitID = env->GetMethodID(dvrClazz, "<init>", "(Landroid/media/tv/tuner/Tuner;)V");
+ gFields.dvrInitID = env->GetMethodID(dvrClazz, "<init>", "()V");
}
static void android_media_tv_Tuner_native_setup(JNIEnv *env, jobject thiz) {
@@ -1141,16 +1594,16 @@ static const JNINativeMethod gTunerMethods[] = {
{ "nativeSetLna", "(Z)I", (void *)android_media_tv_Tuner_set_lna },
{ "nativeGetFrontendStatus", "([I)Landroid/media/tv/tuner/frontend/FrontendStatus;",
(void *)android_media_tv_Tuner_get_frontend_status },
- { "nativeGetAvSyncHwId", "(Landroid/media/tv/tuner/Tuner/filter/Filter;)I",
+ { "nativeGetAvSyncHwId", "(Landroid/media/tv/tuner/filter/Filter;)I",
(void *)android_media_tv_Tuner_gat_av_sync_hw_id },
{ "nativeGetAvSyncTime", "(I)J", (void *)android_media_tv_Tuner_gat_av_sync_time },
{ "nativeConnectCiCam", "(I)I", (void *)android_media_tv_Tuner_connect_cicam },
{ "nativeDisconnectCiCam", "()I", (void *)android_media_tv_Tuner_disconnect_cicam },
- { "nativeGetFrontendInfo", "(I)Landroid/media/tv/tuner/FrontendInfo;",
+ { "nativeGetFrontendInfo", "(I)Landroid/media/tv/tuner/frontend/FrontendInfo;",
(void *)android_media_tv_Tuner_get_frontend_info },
- { "nativeOpenFilter", "(IIJ)Landroid/media/tv/tuner/Tuner/filter/Filter;",
+ { "nativeOpenFilter", "(IIJ)Landroid/media/tv/tuner/filter/Filter;",
(void *)android_media_tv_Tuner_open_filter },
- { "nativeOpenTimeFilter", "()Landroid/media/tv/tuner/Tuner/filter/TimeFilter;",
+ { "nativeOpenTimeFilter", "()Landroid/media/tv/tuner/filter/TimeFilter;",
(void *)android_media_tv_Tuner_open_time_filter },
{ "nativeGetLnbIds", "()Ljava/util/List;",
(void *)android_media_tv_Tuner_get_lnb_ids },
@@ -1180,9 +1633,9 @@ static const JNINativeMethod gFilterMethods[] = {
};
static const JNINativeMethod gTimeFilterMethods[] = {
- { "nativeSetTimeStamp", "(J)I", (void *)android_media_tv_Tuner_time_filter_set_timestamp },
- { "nativeClearTimeStamp", "()I", (void *)android_media_tv_Tuner_time_filter_clear_timestamp },
- { "nativeGetTimeStamp", "()Ljava/lang/Long;",
+ { "nativeSetTimestamp", "(J)I", (void *)android_media_tv_Tuner_time_filter_set_timestamp },
+ { "nativeClearTimestamp", "()I", (void *)android_media_tv_Tuner_time_filter_clear_timestamp },
+ { "nativeGetTimestamp", "()Ljava/lang/Long;",
(void *)android_media_tv_Tuner_time_filter_get_timestamp },
{ "nativeGetSourceTime", "()Ljava/lang/Long;",
(void *)android_media_tv_Tuner_time_filter_get_source_time },