diff options
| -rw-r--r-- | media/java/android/media/tv/tuner/FrontendSettings.java | 274 | ||||
| -rw-r--r-- | media/java/android/media/tv/tuner/Tuner.java | 9 | ||||
| -rw-r--r-- | media/java/android/media/tv/tuner/TunerConstants.java | 15 | ||||
| -rw-r--r-- | media/jni/android_media_tv_Tuner.cpp | 45 | ||||
| -rw-r--r-- | media/jni/android_media_tv_Tuner.h | 2 |
5 files changed, 345 insertions, 0 deletions
diff --git a/media/java/android/media/tv/tuner/FrontendSettings.java b/media/java/android/media/tv/tuner/FrontendSettings.java new file mode 100644 index 000000000000..3782cc6c6ec3 --- /dev/null +++ b/media/java/android/media/tv/tuner/FrontendSettings.java @@ -0,0 +1,274 @@ +/* + * Copyright 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.media.tv.tuner; + +import android.media.tv.tuner.TunerConstants.FrontendSettingsType; + +import java.util.List; + +/** + * @hide + */ +public abstract class FrontendSettings { + protected int mFrequency; + + /** + * Returns the frontend type. + */ + @FrontendSettingsType + public abstract int getType(); + + public int getFrequency() { + return mFrequency; + } + + // TODO: use hal constants for enum fields + // TODO: javaDoc + // TODO: add builders and getters for other settings type + + /** + * Frontend settings for analog. + */ + public static class FrontendAnalogSettings extends FrontendSettings { + private int mAnalogType; + private int mSifStandard; + + @Override + public int getType() { + return TunerConstants.FRONTEND_TYPE_ANALOG; + } + + public int getAnalogType() { + return mAnalogType; + } + + public int getSifStandard() { + return mSifStandard; + } + + /** + * Creates a new builder object. + */ + public static Builder newBuilder() { + return new Builder(); + } + + private FrontendAnalogSettings(int frequency, int analogType, int sifStandard) { + mFrequency = frequency; + mAnalogType = analogType; + mSifStandard = sifStandard; + } + + /** + * Builder for FrontendAnalogSettings. + */ + public static class Builder { + private int mFrequency; + private int mAnalogType; + private int mSifStandard; + + private Builder() {} + + /** + * Sets frequency. + */ + public Builder setFrequency(int frequency) { + mFrequency = frequency; + return this; + } + + /** + * Sets analog type. + */ + public Builder setAnalogType(int analogType) { + mAnalogType = analogType; + return this; + } + + /** + * Sets sif standard. + */ + public Builder setSifStandard(int sifStandard) { + mSifStandard = sifStandard; + return this; + } + + /** + * Builds a FrontendAnalogSettings instance. + */ + public FrontendAnalogSettings build() { + return new FrontendAnalogSettings(mFrequency, mAnalogType, mSifStandard); + } + } + } + + /** + * Frontend settings for ATSC. + */ + public static class FrontendAtscSettings extends FrontendSettings { + public int modulation; + + @Override + public int getType() { + return TunerConstants.FRONTEND_TYPE_ATSC; + } + } + + /** + * Frontend settings for ATSC-3. + */ + public static class FrontendAtsc3Settings extends FrontendSettings { + public int bandwidth; + public byte demodOutputFormat; + public List<FrontendAtsc3PlpSettings> plpSettings; + + @Override + public int getType() { + return TunerConstants.FRONTEND_TYPE_ATSC3; + } + } + + /** + * Frontend settings for DVBS. + */ + public static class FrontendDvbsSettings extends FrontendSettings { + public int modulation; + public FrontendDvbsCodeRate coderate; + public int symbolRate; + public int rolloff; + public int pilot; + public int inputStreamId; + public byte standard; + + @Override + public int getType() { + return TunerConstants.FRONTEND_TYPE_DVBS; + } + } + + /** + * Frontend settings for DVBC. + */ + public static class FrontendDvbcSettings extends FrontendSettings { + public int modulation; + public long fec; + public int symbolRate; + public int outerFec; + public byte annex; + public int spectralInversion; + + @Override + public int getType() { + return TunerConstants.FRONTEND_TYPE_DVBC; + } + } + + /** + * Frontend settings for DVBT. + */ + public static class FrontendDvbtSettings extends FrontendSettings { + public int transmissionMode; + public int bandwidth; + public int constellation; + public int hierarchy; + public int hpCoderate; + public int lpCoderate; + public int guardInterval; + public boolean isHighPriority; + public byte standard; + public boolean isMiso; + public int plpMode; + public byte plpId; + public byte plpGroupId; + + @Override + public int getType() { + return TunerConstants.FRONTEND_TYPE_DVBT; + } + } + + /** + * Frontend settings for ISDBS. + */ + public static class FrontendIsdbsSettings extends FrontendSettings { + public int streamId; + public int streamIdType; + public int modulation; + public int coderate; + public int symbolRate; + public int rolloff; + + @Override + public int getType() { + return TunerConstants.FRONTEND_TYPE_ISDBS; + } + } + + /** + * Frontend settings for ISDBS-3. + */ + public static class FrontendIsdbs3Settings extends FrontendSettings { + public int streamId; + public int streamIdType; + public int modulation; + public int coderate; + public int symbolRate; + public int rolloff; + + @Override + public int getType() { + return TunerConstants.FRONTEND_TYPE_ISDBS3; + } + } + + /** + * Frontend settings for ISDBT. + */ + public static class FrontendIsdbtSettings extends FrontendSettings { + public int modulation; + public int bandwidth; + public int coderate; + public int guardInterval; + public int serviceAreaId; + + @Override + public int getType() { + return TunerConstants.FRONTEND_TYPE_ISDBT; + } + } + + /** + * PLP settings for ATSC-3. + */ + public static class FrontendAtsc3PlpSettings { + public byte plpId; + public int modulation; + public int interleaveMode; + public int codeRate; + public int fec; + } + + /** + * Code rate for DVBS. + */ + public static class FrontendDvbsCodeRate { + public long fec; + public boolean isLinear; + public boolean isShortFrames; + public int bitsPer1000Symbol; + } +} diff --git a/media/java/android/media/tv/tuner/Tuner.java b/media/java/android/media/tv/tuner/Tuner.java index c91325aa9a09..82cef2e43307 100644 --- a/media/java/android/media/tv/tuner/Tuner.java +++ b/media/java/android/media/tv/tuner/Tuner.java @@ -16,6 +16,7 @@ package android.media.tv.tuner; +import android.annotation.NonNull; import android.annotation.Nullable; import android.media.tv.tuner.TunerConstants.DemuxPidType; import android.os.Handler; @@ -78,6 +79,7 @@ public final class Tuner implements AutoCloseable { * Native method to open frontend of the given ID. */ private native Frontend nativeOpenFrontendById(int id); + private native int nativeTune(int type, FrontendSettings settings); private native Filter nativeOpenFilter(int type, int subType, int bufferSize); @@ -207,6 +209,13 @@ public final class Tuner implements AutoCloseable { } } + /** + * Tunes the frontend to using the settings given. + */ + public int tune(@NonNull FrontendSettings settings) { + return nativeTune(settings.getType(), settings); + } + private List<Integer> getFrontendIds() { mFrontendIds = nativeGetFrontendIds(); return mFrontendIds; diff --git a/media/java/android/media/tv/tuner/TunerConstants.java b/media/java/android/media/tv/tuner/TunerConstants.java index 01f9367dd4f3..458cb1678ded 100644 --- a/media/java/android/media/tv/tuner/TunerConstants.java +++ b/media/java/android/media/tv/tuner/TunerConstants.java @@ -75,6 +75,21 @@ final class TunerConstants { public static final int DEMUX_T_PID = 1; public static final int DEMUX_MMPT_PID = 2; + @IntDef({FRONTEND_SETTINGS_ANALOG, FRONTEND_SETTINGS_ATSC, FRONTEND_SETTINGS_ATSC3, + FRONTEND_SETTINGS_DVBS, FRONTEND_SETTINGS_DVBC, FRONTEND_SETTINGS_DVBT, + FRONTEND_SETTINGS_ISDBS, FRONTEND_SETTINGS_ISDBS3, FRONTEND_SETTINGS_ISDBT}) + public @interface FrontendSettingsType {} + + public static final int FRONTEND_SETTINGS_ANALOG = 1; + public static final int FRONTEND_SETTINGS_ATSC = 2; + public static final int FRONTEND_SETTINGS_ATSC3 = 3; + public static final int FRONTEND_SETTINGS_DVBS = 4; + public static final int FRONTEND_SETTINGS_DVBC = 5; + public static final int FRONTEND_SETTINGS_DVBT = 6; + public static final int FRONTEND_SETTINGS_ISDBS = 7; + public static final int FRONTEND_SETTINGS_ISDBS3 = 8; + public static final int FRONTEND_SETTINGS_ISDBT = 9; + private TunerConstants() { } } diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index f5202fc17f71..5216906d5ec5 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -31,6 +31,9 @@ using ::android::hardware::tv::tuner::V1_0::DemuxFilterMainType; using ::android::hardware::tv::tuner::V1_0::DemuxMmtpPid; using ::android::hardware::tv::tuner::V1_0::DemuxTpid; using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterType; +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::ITuner; using ::android::hardware::tv::tuner::V1_0::Result; @@ -263,6 +266,15 @@ jobject JTuner::openLnbById(int id) { id); } +int JTuner::tune(const FrontendSettings& settings) { + if (mFe == NULL) { + ALOGE("frontend is not initialized"); + return (int)Result::INVALID_STATE; + } + Result result = mFe->tune(settings); + return (int)result; +} + bool JTuner::openDemux() { if (mTuner == nullptr) { return false; @@ -417,6 +429,32 @@ static DemuxPid getDemuxPid(int pidType, int pid) { return demuxPid; } +static FrontendSettings getFrontendSettings(JNIEnv *env, int type, jobject settings) { + FrontendSettings frontendSettings; + jclass clazz = env->FindClass("android/media/tv/tuner/FrontendSettings"); + jfieldID freqField = env->GetFieldID(clazz, "frequency", "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/FrontendSettings$FrontendAnalogSettings"); + 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, + }; + frontendSettings.analog(frontendAnalogSettings); + } + return frontendSettings; +} + static sp<IFilter> getFilter(JNIEnv *env, jobject filter) { return (IFilter *)env->GetLongField(filter, gFields.filterContext); } @@ -476,6 +514,11 @@ static jobject android_media_tv_Tuner_open_frontend_by_id(JNIEnv *env, jobject t return tuner->openFrontendById(id); } +static int android_media_tv_Tuner_tune(JNIEnv *env, jobject thiz, jint type, jobject settings) { + sp<JTuner> tuner = getTuner(env, thiz); + return tuner->tune(getFrontendSettings(env, type, settings)); +} + static jobject android_media_tv_Tuner_get_lnb_ids(JNIEnv *env, jobject thiz) { sp<JTuner> tuner = getTuner(env, thiz); return tuner->getLnbIds(); @@ -612,6 +655,8 @@ static const JNINativeMethod gTunerMethods[] = { (void *)android_media_tv_Tuner_get_frontend_ids }, { "nativeOpenFrontendById", "(I)Landroid/media/tv/tuner/Tuner$Frontend;", (void *)android_media_tv_Tuner_open_frontend_by_id }, + { "nativeTune", "(ILandroid/media/tv/tuner/FrontendSettings;)I", + (void *)android_media_tv_Tuner_tune }, { "nativeOpenFilter", "(III)Landroid/media/tv/tuner/Tuner$Filter;", (void *)android_media_tv_Tuner_open_filter }, { "nativeGetLnbIds", "()Ljava/util/List;", diff --git a/media/jni/android_media_tv_Tuner.h b/media/jni/android_media_tv_Tuner.h index 3bf6ec84c8f7..f856791e2618 100644 --- a/media/jni/android_media_tv_Tuner.h +++ b/media/jni/android_media_tv_Tuner.h @@ -34,6 +34,7 @@ using ::android::hardware::tv::tuner::V1_0::FrontendEventType; using ::android::hardware::tv::tuner::V1_0::FrontendId; using ::android::hardware::tv::tuner::V1_0::FrontendScanMessage; using ::android::hardware::tv::tuner::V1_0::FrontendScanMessageType; +using ::android::hardware::tv::tuner::V1_0::FrontendSettings; using ::android::hardware::tv::tuner::V1_0::IDemux; using ::android::hardware::tv::tuner::V1_0::IDescrambler; using ::android::hardware::tv::tuner::V1_0::IDvr; @@ -95,6 +96,7 @@ struct JTuner : public RefBase { sp<ITuner> getTunerService(); jobject getFrontendIds(); jobject openFrontendById(int id); + int tune(const FrontendSettings& settings); jobject getLnbIds(); jobject openLnbById(int id); jobject openFilter(DemuxFilterType type, int bufferSize); |