From 5d597ef88e201369daf976fcabcd6e68e09ea76e Mon Sep 17 00:00:00 2001 From: Amy Zhang Date: Mon, 14 Sep 2020 19:10:43 -0700 Subject: [PATCH 1/2] Add Frontend Status Extended types and getter APIs In Tuner 1.1, more extended frontend status types are added for the OEMs to get frontend status more flexible Call Tuner.getFrontendStatus would build up the FrontendStatus object Extended type value getter APIs are added in the FrontendStatus class to access the value returned from HAL. Any query with extended type on unsupported HAL version would be ignored Test: make -j44 dist Bug: 158818695 Change-Id: Id8cb8b669962a1b4cbed481e91563b944d1f3837 --- api/system-current.txt | 24 ++ media/java/android/media/tv/tuner/Tuner.java | 3 +- .../tuner/frontend/DvbsFrontendSettings.java | 33 +- .../tv/tuner/frontend/FrontendStatus.java | 379 +++++++++++++++++- non-updatable-api/system-current.txt | 24 ++ 5 files changed, 457 insertions(+), 6 deletions(-) diff --git a/api/system-current.txt b/api/system-current.txt index d6fc9af892db6..b3819cd14cdf1 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -5835,6 +5835,7 @@ package android.media.tv.tuner.frontend { method public int getSymbolRate(); method public int getType(); method public int getVcmMode(); + method public boolean isDiseqcRxMessage(); field public static final int MODULATION_AUTO = 1; // 0x1 field public static final int MODULATION_MOD_128APSK = 2048; // 0x800 field public static final int MODULATION_MOD_16APSK = 256; // 0x100 @@ -5878,6 +5879,7 @@ package android.media.tv.tuner.frontend { public static class DvbsFrontendSettings.Builder { method @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings build(); method @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings.Builder setCodeRate(@Nullable android.media.tv.tuner.frontend.DvbsCodeRate); + method @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings.Builder setDiseqcRxMessage(boolean); method @IntRange(from=1) @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings.Builder setFrequency(int); method @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings.Builder setInputStreamId(int); method @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings.Builder setModulation(int); @@ -6079,14 +6081,21 @@ package android.media.tv.tuner.frontend { public class FrontendStatus { method public int getAgc(); method @NonNull public android.media.tv.tuner.frontend.FrontendStatus.Atsc3PlpTuningInfo[] getAtsc3PlpTuningInfo(); + method public int getBandwidth(); method public int getBer(); + method @NonNull public int[] getBers(); + method @NonNull public int[] getCodeRates(); method public int getFreqOffset(); + method public int getGuardInterval(); method public int getHierarchy(); method public long getInnerFec(); + method @NonNull public int[] getInterleaving(); + method @NonNull public int[] getIsdbtSegment(); method @NonNull public boolean[] getLayerErrors(); method public int getLnbVoltage(); method public int getMer(); method public int getModulation(); + method @NonNull public int[] getModulationsExt(); method public int getPer(); method public int getPerBer(); method public int getPlpId(); @@ -6095,23 +6104,34 @@ package android.media.tv.tuner.frontend { method public int getSnr(); method public int getSpectralInversion(); method public int getSymbolRate(); + method public int getSystemId(); + method public int getTransmissionMode(); + method @NonNull public int[] getTsDataRate(); + method public int getUec(); method public boolean isDemodLocked(); method public boolean isEwbs(); method public boolean isLnaOn(); method public boolean isRfLocked(); field public static final int FRONTEND_STATUS_TYPE_AGC = 14; // 0xe field public static final int FRONTEND_STATUS_TYPE_ATSC3_PLP_INFO = 21; // 0x15 + field public static final int FRONTEND_STATUS_TYPE_BANDWIDTH = 25; // 0x19 field public static final int FRONTEND_STATUS_TYPE_BER = 2; // 0x2 + field public static final int FRONTEND_STATUS_TYPE_BERS = 23; // 0x17 + field public static final int FRONTEND_STATUS_TYPE_CODERATES = 24; // 0x18 field public static final int FRONTEND_STATUS_TYPE_DEMOD_LOCK = 0; // 0x0 field public static final int FRONTEND_STATUS_TYPE_EWBS = 13; // 0xd field public static final int FRONTEND_STATUS_TYPE_FEC = 8; // 0x8 field public static final int FRONTEND_STATUS_TYPE_FREQ_OFFSET = 18; // 0x12 + field public static final int FRONTEND_STATUS_TYPE_GUARD_INTERVAL = 26; // 0x1a field public static final int FRONTEND_STATUS_TYPE_HIERARCHY = 19; // 0x13 + field public static final int FRONTEND_STATUS_TYPE_INTERLEAVINGS = 30; // 0x1e + field public static final int FRONTEND_STATUS_TYPE_ISDBT_SEGMENTS = 31; // 0x1f field public static final int FRONTEND_STATUS_TYPE_LAYER_ERROR = 16; // 0x10 field public static final int FRONTEND_STATUS_TYPE_LNA = 15; // 0xf field public static final int FRONTEND_STATUS_TYPE_LNB_VOLTAGE = 11; // 0xb field public static final int FRONTEND_STATUS_TYPE_MER = 17; // 0x11 field public static final int FRONTEND_STATUS_TYPE_MODULATION = 9; // 0x9 + field public static final int FRONTEND_STATUS_TYPE_MODULATIONS_EXT = 22; // 0x16 field public static final int FRONTEND_STATUS_TYPE_PER = 3; // 0x3 field public static final int FRONTEND_STATUS_TYPE_PLP_ID = 12; // 0xc field public static final int FRONTEND_STATUS_TYPE_PRE_BER = 4; // 0x4 @@ -6121,6 +6141,10 @@ package android.media.tv.tuner.frontend { field public static final int FRONTEND_STATUS_TYPE_SNR = 1; // 0x1 field public static final int FRONTEND_STATUS_TYPE_SPECTRAL = 10; // 0xa field public static final int FRONTEND_STATUS_TYPE_SYMBOL_RATE = 7; // 0x7 + field public static final int FRONTEND_STATUS_TYPE_T2_SYSTEM_ID = 29; // 0x1d + field public static final int FRONTEND_STATUS_TYPE_TRANSMISSION_MODE = 27; // 0x1b + field public static final int FRONTEND_STATUS_TYPE_TS_DATA_RATES = 32; // 0x20 + field public static final int FRONTEND_STATUS_TYPE_UEC = 28; // 0x1c } public static class FrontendStatus.Atsc3PlpTuningInfo { diff --git a/media/java/android/media/tv/tuner/Tuner.java b/media/java/android/media/tv/tuner/Tuner.java index 56499e26bafe2..aedf5d5ae0bb5 100644 --- a/media/java/android/media/tv/tuner/Tuner.java +++ b/media/java/android/media/tv/tuner/Tuner.java @@ -775,7 +775,8 @@ public class Tuner implements AutoCloseable { * *

This retrieve the statuses of the frontend for given status types. * - * @param statusTypes an array of status types which the caller requests. + * @param statusTypes an array of status types which the caller requests. Any types that are not + * in {@link FrontendInfo.getStatusCapabilities()} would be ignored. * @return statuses which response the caller's requests. {@code null} if the operation failed. */ @Nullable diff --git a/media/java/android/media/tv/tuner/frontend/DvbsFrontendSettings.java b/media/java/android/media/tv/tuner/frontend/DvbsFrontendSettings.java index 343dbb137dd6f..fadc004759304 100644 --- a/media/java/android/media/tv/tuner/frontend/DvbsFrontendSettings.java +++ b/media/java/android/media/tv/tuner/frontend/DvbsFrontendSettings.java @@ -260,10 +260,12 @@ public class DvbsFrontendSettings extends FrontendSettings { private final int mVcmMode; // Dvbs scan type is only supported in Tuner 1.1 or higher. private final int mScanType; + // isDiseqcRxMessage is only supported in Tuner 1.1 or higher. + private final boolean mIsDiseqcRxMessage; private DvbsFrontendSettings(int frequency, int modulation, DvbsCodeRate codeRate, int symbolRate, int rolloff, int pilot, int inputStreamId, int standard, int vcm, - int scanType) { + int scanType, boolean isDiseqcRxMessage) { super(frequency); mModulation = modulation; mCodeRate = codeRate; @@ -274,6 +276,7 @@ public class DvbsFrontendSettings extends FrontendSettings { mStandard = standard; mVcmMode = vcm; mScanType = scanType; + mIsDiseqcRxMessage = isDiseqcRxMessage; } /** @@ -337,6 +340,15 @@ public class DvbsFrontendSettings extends FrontendSettings { public int getScanType() { return mScanType; } + /** + * To receive Diseqc Message or not. Default value is false. + * + * The setter {@link Builder#setDiseqcRxMessage(boolean)} is only supported with Tuner HAL 1.1 + * or higher. + */ + public boolean isDiseqcRxMessage() { + return mIsDiseqcRxMessage; + } /** * Creates a builder for {@link DvbsFrontendSettings}. @@ -360,6 +372,7 @@ public class DvbsFrontendSettings extends FrontendSettings { private int mStandard = STANDARD_AUTO; private int mVcmMode = VCM_MODE_UNDEFINED; private int mScanType = SCAN_TYPE_UNDEFINED; + private boolean mIsDiseqcRxMessage = false; private Builder() { } @@ -394,6 +407,21 @@ public class DvbsFrontendSettings extends FrontendSettings { return this; } + /** + * Set true to receive Diseqc Message. + * + *

This API is only supported by Tuner HAL 1.1 or higher. Unsupported version would cause + * no-op. Use {@link TunerVersionChecker.getTunerVersion()} to check the version. + */ + @NonNull + public Builder setDiseqcRxMessage(boolean isDiseqcRxMessage) { + if (TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_1_1, "setDiseqcRxMessage")) { + mIsDiseqcRxMessage = isDiseqcRxMessage; + } + return this; + } + /** * Sets Modulation. * @@ -481,7 +509,8 @@ public class DvbsFrontendSettings extends FrontendSettings { @NonNull public DvbsFrontendSettings build() { return new DvbsFrontendSettings(mFrequency, mModulation, mCodeRate, mSymbolRate, - mRolloff, mPilot, mInputStreamId, mStandard, mVcmMode, mScanType); + mRolloff, mPilot, mInputStreamId, mStandard, mVcmMode, mScanType, + mIsDiseqcRxMessage); } } diff --git a/media/java/android/media/tv/tuner/frontend/FrontendStatus.java b/media/java/android/media/tv/tuner/frontend/FrontendStatus.java index c265bb9e6050b..dd9347cd6e5de 100644 --- a/media/java/android/media/tv/tuner/frontend/FrontendStatus.java +++ b/media/java/android/media/tv/tuner/frontend/FrontendStatus.java @@ -21,6 +21,7 @@ import android.annotation.NonNull; import android.annotation.SystemApi; import android.hardware.tv.tuner.V1_0.Constants; import android.media.tv.tuner.Lnb; +import android.media.tv.tuner.TunerVersionChecker; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -43,7 +44,13 @@ public class FrontendStatus { FRONTEND_STATUS_TYPE_EWBS, FRONTEND_STATUS_TYPE_AGC, FRONTEND_STATUS_TYPE_LNA, FRONTEND_STATUS_TYPE_LAYER_ERROR, FRONTEND_STATUS_TYPE_MER, FRONTEND_STATUS_TYPE_FREQ_OFFSET, FRONTEND_STATUS_TYPE_HIERARCHY, - FRONTEND_STATUS_TYPE_RF_LOCK, FRONTEND_STATUS_TYPE_ATSC3_PLP_INFO}) + FRONTEND_STATUS_TYPE_RF_LOCK, FRONTEND_STATUS_TYPE_ATSC3_PLP_INFO, + FRONTEND_STATUS_TYPE_BERS, FRONTEND_STATUS_TYPE_CODERATES, + FRONTEND_STATUS_TYPE_BANDWIDTH, FRONTEND_STATUS_TYPE_GUARD_INTERVAL, + FRONTEND_STATUS_TYPE_TRANSMISSION_MODE, FRONTEND_STATUS_TYPE_UEC, + FRONTEND_STATUS_TYPE_T2_SYSTEM_ID, FRONTEND_STATUS_TYPE_INTERLEAVINGS, + FRONTEND_STATUS_TYPE_ISDBT_SEGMENTS, FRONTEND_STATUS_TYPE_TS_DATA_RATES, + FRONTEND_STATUS_TYPE_MODULATIONS_EXT}) @Retention(RetentionPolicy.SOURCE) public @interface FrontendStatusType {} @@ -145,10 +152,83 @@ public class FrontendStatus { */ public static final int FRONTEND_STATUS_TYPE_ATSC3_PLP_INFO = Constants.FrontendStatusType.ATSC3_PLP_INFO; - + /** + * BERS Type. Only supported in Tuner HAL 1.1 or higher. + */ + public static final int FRONTEND_STATUS_TYPE_BERS = + android.hardware.tv.tuner.V1_1.Constants.FrontendStatusTypeExt1_1.BERS; + /** + * Coderate Type. Only supported in Tuner HAL 1.1 or higher. + */ + public static final int FRONTEND_STATUS_TYPE_CODERATES = + android.hardware.tv.tuner.V1_1.Constants.FrontendStatusTypeExt1_1.CODERATES; + /** + * Bandwidth Type. Only supported in Tuner HAL 1.1 or higher. + */ + public static final int FRONTEND_STATUS_TYPE_BANDWIDTH = + android.hardware.tv.tuner.V1_1.Constants.FrontendStatusTypeExt1_1.BANDWIDTH; + /** + * Guard Interval Type. Only supported in Tuner HAL 1.1 or higher. + */ + public static final int FRONTEND_STATUS_TYPE_GUARD_INTERVAL = + android.hardware.tv.tuner.V1_1.Constants.FrontendStatusTypeExt1_1.GUARD_INTERVAL; + /** + * Transmission Mode Type. Only supported in Tuner HAL 1.1 or higher. + */ + public static final int FRONTEND_STATUS_TYPE_TRANSMISSION_MODE = + android.hardware.tv.tuner.V1_1.Constants.FrontendStatusTypeExt1_1.TRANSMISSION_MODE; + /** + * UEC Type. Only supported in Tuner HAL 1.1 or higher. + */ + public static final int FRONTEND_STATUS_TYPE_UEC = + android.hardware.tv.tuner.V1_1.Constants.FrontendStatusTypeExt1_1.UEC; + /** + * T2 System Id Type. Only supported in Tuner HAL 1.1 or higher. + */ + public static final int FRONTEND_STATUS_TYPE_T2_SYSTEM_ID = + android.hardware.tv.tuner.V1_1.Constants.FrontendStatusTypeExt1_1.T2_SYSTEM_ID; + /** + * Interleavings Type. Only supported in Tuner HAL 1.1 or higher. + */ + public static final int FRONTEND_STATUS_TYPE_INTERLEAVINGS = + android.hardware.tv.tuner.V1_1.Constants.FrontendStatusTypeExt1_1.INTERLEAVINGS; + /** + * ISDBT Segments Type. Only supported in Tuner HAL 1.1 or higher. + */ + public static final int FRONTEND_STATUS_TYPE_ISDBT_SEGMENTS = + android.hardware.tv.tuner.V1_1.Constants.FrontendStatusTypeExt1_1.ISDBT_SEGMENTS; + /** + * TS Data Rates Type. Only supported in Tuner HAL 1.1 or higher. + */ + public static final int FRONTEND_STATUS_TYPE_TS_DATA_RATES = + android.hardware.tv.tuner.V1_1.Constants.FrontendStatusTypeExt1_1.TS_DATA_RATES; + /** + * Extended Modulations Type. Only supported in Tuner HAL 1.1 or higher. + */ + public static final int FRONTEND_STATUS_TYPE_MODULATIONS_EXT = + android.hardware.tv.tuner.V1_1.Constants.FrontendStatusTypeExt1_1.MODULATIONS; /** @hide */ @IntDef(value = { + AtscFrontendSettings.MODULATION_UNDEFINED, + AtscFrontendSettings.MODULATION_AUTO, + AtscFrontendSettings.MODULATION_MOD_8VSB, + AtscFrontendSettings.MODULATION_MOD_16VSB, + Atsc3FrontendSettings.MODULATION_UNDEFINED, + Atsc3FrontendSettings.MODULATION_AUTO, + Atsc3FrontendSettings.MODULATION_MOD_QPSK, + Atsc3FrontendSettings.MODULATION_MOD_16QAM, + Atsc3FrontendSettings.MODULATION_MOD_64QAM, + Atsc3FrontendSettings.MODULATION_MOD_256QAM, + Atsc3FrontendSettings.MODULATION_MOD_1024QAM, + Atsc3FrontendSettings.MODULATION_MOD_4096QAM, + DtmbFrontendSettings.MODULATION_CONSTELLATION_UNDEFINED, + DtmbFrontendSettings.MODULATION_CONSTELLATION_AUTO, + DtmbFrontendSettings.MODULATION_CONSTELLATION_4QAM, + DtmbFrontendSettings.MODULATION_CONSTELLATION_4QAM_NR, + DtmbFrontendSettings.MODULATION_CONSTELLATION_16QAM, + DtmbFrontendSettings.MODULATION_CONSTELLATION_32QAM, + DtmbFrontendSettings.MODULATION_CONSTELLATION_64QAM, DvbcFrontendSettings.MODULATION_UNDEFINED, DvbcFrontendSettings.MODULATION_AUTO, DvbcFrontendSettings.MODULATION_MOD_16QAM, @@ -171,6 +251,16 @@ public class FrontendStatus { DvbsFrontendSettings.MODULATION_MOD_128APSK, DvbsFrontendSettings.MODULATION_MOD_256APSK, DvbsFrontendSettings.MODULATION_MOD_RESERVED, + DvbtFrontendSettings.CONSTELLATION_UNDEFINED, + DvbtFrontendSettings.CONSTELLATION_AUTO, + DvbtFrontendSettings.CONSTELLATION_QPSK, + DvbtFrontendSettings.CONSTELLATION_16QAM, + DvbtFrontendSettings.CONSTELLATION_64QAM, + DvbtFrontendSettings.CONSTELLATION_256QAM, + DvbtFrontendSettings.CONSTELLATION_QPSK_R, + DvbtFrontendSettings.CONSTELLATION_16QAM_R, + DvbtFrontendSettings.CONSTELLATION_64QAM_R, + DvbtFrontendSettings.CONSTELLATION_256QAM_R, IsdbsFrontendSettings.MODULATION_UNDEFINED, IsdbsFrontendSettings.MODULATION_AUTO, IsdbsFrontendSettings.MODULATION_MOD_BPSK, @@ -192,6 +282,101 @@ public class FrontendStatus { @Retention(RetentionPolicy.SOURCE) public @interface FrontendModulation {} + /** @hide */ + @IntDef(value = { + Atsc3FrontendSettings.TIME_INTERLEAVE_MODE_UNDEFINED, + Atsc3FrontendSettings.TIME_INTERLEAVE_MODE_AUTO, + Atsc3FrontendSettings.TIME_INTERLEAVE_MODE_CTI, + Atsc3FrontendSettings.TIME_INTERLEAVE_MODE_HTI, + DtmbFrontendSettings.TIME_INTERLEAVE_MODE_UNDEFINED, + DtmbFrontendSettings.TIME_INTERLEAVE_MODE_AUTO, + DtmbFrontendSettings.TIME_INTERLEAVE_MODE_TIMER_INT_240, + DtmbFrontendSettings.TIME_INTERLEAVE_MODE_TIMER_INT_720, + DvbcFrontendSettings.TIME_INTERLEAVE_MODE_UNDEFINED, + DvbcFrontendSettings.TIME_INTERLEAVE_MODE_AUTO, + DvbcFrontendSettings.TIME_INTERLEAVE_MODE_128_1_0, + DvbcFrontendSettings.TIME_INTERLEAVE_MODE_128_1_1, + DvbcFrontendSettings.TIME_INTERLEAVE_MODE_64_2, + DvbcFrontendSettings.TIME_INTERLEAVE_MODE_32_4, + DvbcFrontendSettings.TIME_INTERLEAVE_MODE_16_8, + DvbcFrontendSettings.TIME_INTERLEAVE_MODE_8_16, + DvbcFrontendSettings.TIME_INTERLEAVE_MODE_128_2, + DvbcFrontendSettings.TIME_INTERLEAVE_MODE_128_3, + DvbcFrontendSettings.TIME_INTERLEAVE_MODE_128_4}) + @Retention(RetentionPolicy.SOURCE) + public @interface FrontendInterleaveMode {} + + /** @hide */ + @IntDef(value = { + Atsc3FrontendSettings.BANDWIDTH_UNDEFINED, + Atsc3FrontendSettings.BANDWIDTH_AUTO, + Atsc3FrontendSettings.BANDWIDTH_BANDWIDTH_6MHZ, + Atsc3FrontendSettings.BANDWIDTH_BANDWIDTH_7MHZ, + Atsc3FrontendSettings.BANDWIDTH_BANDWIDTH_8MHZ, + DtmbFrontendSettings.BANDWIDTH_UNDEFINED, + DtmbFrontendSettings.BANDWIDTH_AUTO, + DtmbFrontendSettings.BANDWIDTH_6MHZ, + DtmbFrontendSettings.BANDWIDTH_8MHZ, + DvbtFrontendSettings.BANDWIDTH_UNDEFINED, + DvbtFrontendSettings.BANDWIDTH_AUTO, + DvbtFrontendSettings.BANDWIDTH_8MHZ, + DvbtFrontendSettings.BANDWIDTH_7MHZ, + DvbtFrontendSettings.BANDWIDTH_6MHZ, + DvbtFrontendSettings.BANDWIDTH_5MHZ, + DvbtFrontendSettings.BANDWIDTH_1_7MHZ, + DvbtFrontendSettings.BANDWIDTH_10MHZ, + IsdbtFrontendSettings.BANDWIDTH_UNDEFINED, + IsdbtFrontendSettings.BANDWIDTH_AUTO, + IsdbtFrontendSettings.BANDWIDTH_8MHZ, + IsdbtFrontendSettings.BANDWIDTH_7MHZ, + IsdbtFrontendSettings.BANDWIDTH_6MHZ}) + @Retention(RetentionPolicy.SOURCE) + public @interface FrontendBandwidth {} + + /** @hide */ + @IntDef(value = { + DtmbFrontendSettings.TRANSMISSION_MODE_UNDEFINED, + DtmbFrontendSettings.TRANSMISSION_MODE_AUTO, + DtmbFrontendSettings.TRANSMISSION_MODE_C1, + DtmbFrontendSettings.TRANSMISSION_MODE_C3780, + DvbtFrontendSettings.TRANSMISSION_MODE_UNDEFINED, + DvbtFrontendSettings.TRANSMISSION_MODE_AUTO, + DvbtFrontendSettings.TRANSMISSION_MODE_2K, + DvbtFrontendSettings.TRANSMISSION_MODE_8K, + DvbtFrontendSettings.TRANSMISSION_MODE_4K, + DvbtFrontendSettings.TRANSMISSION_MODE_1K, + DvbtFrontendSettings.TRANSMISSION_MODE_16K, + DvbtFrontendSettings.TRANSMISSION_MODE_32K, + IsdbtFrontendSettings.MODE_UNDEFINED, + IsdbtFrontendSettings.MODE_AUTO, + IsdbtFrontendSettings.MODE_1, + IsdbtFrontendSettings.MODE_2, + IsdbtFrontendSettings.MODE_3}) + @Retention(RetentionPolicy.SOURCE) + public @interface FrontendTransmissionMode {} + + /** @hide */ + @IntDef(value = { + DtmbFrontendSettings.GUARD_INTERVAL_UNDEFINED, + DtmbFrontendSettings.GUARD_INTERVAL_AUTO, + DtmbFrontendSettings.GUARD_INTERVAL_PN_420_VARIOUS, + DtmbFrontendSettings.GUARD_INTERVAL_PN_595_CONST, + DtmbFrontendSettings.GUARD_INTERVAL_PN_945_VARIOUS, + DtmbFrontendSettings.GUARD_INTERVAL_PN_420_CONST, + DtmbFrontendSettings.GUARD_INTERVAL_PN_945_CONST, + DtmbFrontendSettings.GUARD_INTERVAL_PN_RESERVED, + DvbtFrontendSettings.GUARD_INTERVAL_UNDEFINED, + DvbtFrontendSettings.GUARD_INTERVAL_AUTO, + DvbtFrontendSettings.GUARD_INTERVAL_1_32, + DvbtFrontendSettings.GUARD_INTERVAL_1_16, + DvbtFrontendSettings.GUARD_INTERVAL_1_8, + DvbtFrontendSettings.GUARD_INTERVAL_1_4, + DvbtFrontendSettings.GUARD_INTERVAL_1_128, + DvbtFrontendSettings.GUARD_INTERVAL_19_128, + DvbtFrontendSettings.GUARD_INTERVAL_19_256, + DvbtFrontendSettings.GUARD_INTERVAL_19_128}) + @Retention(RetentionPolicy.SOURCE) + public @interface FrontendGuardInterval {} private Boolean mIsDemodLocked; private Integer mSnr; @@ -215,6 +400,18 @@ public class FrontendStatus { private Integer mHierarchy; private Boolean mIsRfLocked; private Atsc3PlpTuningInfo[] mPlpInfo; + private int[] mBers; + private int[] mCodeRates; + private Integer mBandwidth; + private Integer mGuardInterval; + private Integer mTransmissionMode; + private Integer mUec; + private Integer mSystemId; + private int[] mInterleaving; + private int[] mTsDataRate; + private int[] mIsdbtSegment; + private int[] mModulationsExt; + // Constructed and fields set by JNI code. private FrontendStatus() { @@ -323,7 +520,7 @@ public class FrontendStatus { /** * Gets Spectral Inversion for DVBC. */ - @DvbcFrontendSettings.SpectralInversion + @FrontendSettings.FrontendSpectralInversion public int getSpectralInversion() { if (mInversion == null) { throw new IllegalStateException(); @@ -436,6 +633,182 @@ public class FrontendStatus { return mPlpInfo; } + /** + * Gets an array of BERS status. + * + *

This status query is only supported by Tuner HAL 1.1 or higher. Use + * {@link TunerVersionChecker.getTunerVersion()} to check the version. + */ + @NonNull + public int[] getBers() { + TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_1_1, "getBers status"); + if (mBers == null) { + throw new IllegalStateException(); + } + return mBers; + } + + /** + * Gets an array of code rates status. + * + *

This status query is only supported by Tuner HAL 1.1 or higher. Use + * {@link TunerVersionChecker.getTunerVersion()} to check the version. + */ + @NonNull + public int[] getCodeRates() { + TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_1_1, "getCodeRates status"); + if (mCodeRates == null) { + throw new IllegalStateException(); + } + return mCodeRates; + } + + /** + * Gets bandwidth status. + * + *

This status query is only supported by Tuner HAL 1.1 or higher. Use + * {@link TunerVersionChecker.getTunerVersion()} to check the version. + */ + @FrontendBandwidth + public int getBandwidth() { + TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_1_1, "getBandwidth status"); + if (mBandwidth == null) { + throw new IllegalStateException(); + } + return mBandwidth; + } + + /** + * Gets guard interval status. + * + *

This status query is only supported by Tuner HAL 1.1 or higher. Use + * {@link TunerVersionChecker.getTunerVersion()} to check the version. + */ + @FrontendGuardInterval + public int getGuardInterval() { + TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_1_1, "getGuardInterval status"); + if (mGuardInterval == null) { + throw new IllegalStateException(); + } + return mGuardInterval; + } + + /** + * Gets tansmission mode status. + * + *

This status query is only supported by Tuner HAL 1.1 or higher. Use + * {@link TunerVersionChecker.getTunerVersion()} to check the version. + */ + @FrontendTransmissionMode + public int getTransmissionMode() { + TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_1_1, "getTransmissionMode status"); + if (mTransmissionMode == null) { + throw new IllegalStateException(); + } + return mTransmissionMode; + } + + /** + * Gets UEC status. + * + *

This status query is only supported by Tuner HAL 1.1 or higher. Use + * {@link TunerVersionChecker.getTunerVersion()} to check the version. + */ + public int getUec() { + TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_1_1, "getUec status"); + if (mUec == null) { + throw new IllegalStateException(); + } + return mUec; + } + + /** + * Gets system id status. + * + *

This status query is only supported by Tuner HAL 1.1 or higher. Use + * {@link TunerVersionChecker.getTunerVersion()} to check the version. + */ + public int getSystemId() { + TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_1_1, "getSystemId status"); + if (mSystemId == null) { + throw new IllegalStateException(); + } + return mSystemId; + } + + /** + * Gets an array of interleaving status. Array value should be withink {@link + * FrontendInterleaveMode}. + * + *

This status query is only supported by Tuner HAL 1.1 or higher. Use + * {@link TunerVersionChecker.getTunerVersion()} to check the version. + */ + @NonNull + public int[] getInterleaving() { + TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_1_1, "getInterleaving status"); + if (mInterleaving == null) { + throw new IllegalStateException(); + } + return mInterleaving; + } + + /** + * Gets an array of isdbt segment status. + * + *

This status query is only supported by Tuner HAL 1.1 or higher. Use + * {@link TunerVersionChecker.getTunerVersion()} to check the version. + */ + @NonNull + public int[] getIsdbtSegment() { + TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_1_1, "getIsdbtSegment status"); + if (mIsdbtSegment == null) { + throw new IllegalStateException(); + } + return mIsdbtSegment; + } + + /** + * Gets an array of TS data rate status. + * + *

This status query is only supported by Tuner HAL 1.1 or higher. Use + * {@link TunerVersionChecker.getTunerVersion()} to check the version. + */ + @NonNull + public int[] getTsDataRate() { + TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_1_1, "getTsDataRate status"); + if (mTsDataRate == null) { + throw new IllegalStateException(); + } + return mTsDataRate; + } + + /** + * Gets an array of the extended modulations status. Array value should be withink {@link + * FrontendModulation}. + * + *

This status query is only supported by Tuner HAL 1.1 or higher. Use + * {@link TunerVersionChecker.getTunerVersion()} to check the version. + */ + @NonNull + public int[] getModulationsExt() { + TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_1_1, "getModulationsExt status"); + if (mModulationsExt == null) { + throw new IllegalStateException(); + } + return mModulationsExt; + } + /** * Status for each tuning Physical Layer Pipes. */ diff --git a/non-updatable-api/system-current.txt b/non-updatable-api/system-current.txt index 2f0f4c3ab68e4..7ce851285be94 100644 --- a/non-updatable-api/system-current.txt +++ b/non-updatable-api/system-current.txt @@ -5775,6 +5775,7 @@ package android.media.tv.tuner.frontend { method public int getSymbolRate(); method public int getType(); method public int getVcmMode(); + method public boolean isDiseqcRxMessage(); field public static final int MODULATION_AUTO = 1; // 0x1 field public static final int MODULATION_MOD_128APSK = 2048; // 0x800 field public static final int MODULATION_MOD_16APSK = 256; // 0x100 @@ -5818,6 +5819,7 @@ package android.media.tv.tuner.frontend { public static class DvbsFrontendSettings.Builder { method @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings build(); method @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings.Builder setCodeRate(@Nullable android.media.tv.tuner.frontend.DvbsCodeRate); + method @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings.Builder setDiseqcRxMessage(boolean); method @IntRange(from=1) @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings.Builder setFrequency(int); method @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings.Builder setInputStreamId(int); method @NonNull public android.media.tv.tuner.frontend.DvbsFrontendSettings.Builder setModulation(int); @@ -6019,14 +6021,21 @@ package android.media.tv.tuner.frontend { public class FrontendStatus { method public int getAgc(); method @NonNull public android.media.tv.tuner.frontend.FrontendStatus.Atsc3PlpTuningInfo[] getAtsc3PlpTuningInfo(); + method public int getBandwidth(); method public int getBer(); + method @NonNull public int[] getBers(); + method @NonNull public int[] getCodeRates(); method public int getFreqOffset(); + method public int getGuardInterval(); method public int getHierarchy(); method public long getInnerFec(); + method @NonNull public int[] getInterleaving(); + method @NonNull public int[] getIsdbtSegment(); method @NonNull public boolean[] getLayerErrors(); method public int getLnbVoltage(); method public int getMer(); method public int getModulation(); + method @NonNull public int[] getModulationsExt(); method public int getPer(); method public int getPerBer(); method public int getPlpId(); @@ -6035,23 +6044,34 @@ package android.media.tv.tuner.frontend { method public int getSnr(); method public int getSpectralInversion(); method public int getSymbolRate(); + method public int getSystemId(); + method public int getTransmissionMode(); + method @NonNull public int[] getTsDataRate(); + method public int getUec(); method public boolean isDemodLocked(); method public boolean isEwbs(); method public boolean isLnaOn(); method public boolean isRfLocked(); field public static final int FRONTEND_STATUS_TYPE_AGC = 14; // 0xe field public static final int FRONTEND_STATUS_TYPE_ATSC3_PLP_INFO = 21; // 0x15 + field public static final int FRONTEND_STATUS_TYPE_BANDWIDTH = 25; // 0x19 field public static final int FRONTEND_STATUS_TYPE_BER = 2; // 0x2 + field public static final int FRONTEND_STATUS_TYPE_BERS = 23; // 0x17 + field public static final int FRONTEND_STATUS_TYPE_CODERATES = 24; // 0x18 field public static final int FRONTEND_STATUS_TYPE_DEMOD_LOCK = 0; // 0x0 field public static final int FRONTEND_STATUS_TYPE_EWBS = 13; // 0xd field public static final int FRONTEND_STATUS_TYPE_FEC = 8; // 0x8 field public static final int FRONTEND_STATUS_TYPE_FREQ_OFFSET = 18; // 0x12 + field public static final int FRONTEND_STATUS_TYPE_GUARD_INTERVAL = 26; // 0x1a field public static final int FRONTEND_STATUS_TYPE_HIERARCHY = 19; // 0x13 + field public static final int FRONTEND_STATUS_TYPE_INTERLEAVINGS = 30; // 0x1e + field public static final int FRONTEND_STATUS_TYPE_ISDBT_SEGMENTS = 31; // 0x1f field public static final int FRONTEND_STATUS_TYPE_LAYER_ERROR = 16; // 0x10 field public static final int FRONTEND_STATUS_TYPE_LNA = 15; // 0xf field public static final int FRONTEND_STATUS_TYPE_LNB_VOLTAGE = 11; // 0xb field public static final int FRONTEND_STATUS_TYPE_MER = 17; // 0x11 field public static final int FRONTEND_STATUS_TYPE_MODULATION = 9; // 0x9 + field public static final int FRONTEND_STATUS_TYPE_MODULATIONS_EXT = 22; // 0x16 field public static final int FRONTEND_STATUS_TYPE_PER = 3; // 0x3 field public static final int FRONTEND_STATUS_TYPE_PLP_ID = 12; // 0xc field public static final int FRONTEND_STATUS_TYPE_PRE_BER = 4; // 0x4 @@ -6061,6 +6081,10 @@ package android.media.tv.tuner.frontend { field public static final int FRONTEND_STATUS_TYPE_SNR = 1; // 0x1 field public static final int FRONTEND_STATUS_TYPE_SPECTRAL = 10; // 0xa field public static final int FRONTEND_STATUS_TYPE_SYMBOL_RATE = 7; // 0x7 + field public static final int FRONTEND_STATUS_TYPE_T2_SYSTEM_ID = 29; // 0x1d + field public static final int FRONTEND_STATUS_TYPE_TRANSMISSION_MODE = 27; // 0x1b + field public static final int FRONTEND_STATUS_TYPE_TS_DATA_RATES = 32; // 0x20 + field public static final int FRONTEND_STATUS_TYPE_UEC = 28; // 0x1c } public static class FrontendStatus.Atsc3PlpTuningInfo { From 07a2704af9d3fb57f34240c9426ab1f53a28f567 Mon Sep 17 00:00:00 2001 From: Amy Zhang Date: Wed, 16 Sep 2020 17:46:03 -0700 Subject: [PATCH 2/2] Tuner JNI to use the extended frontend status types and build up extended status struct Test: make -j44 dist Bug: 158818695 Change-Id: Ic8e34ec4cf024c4d55ead3dca2d37dd84a19c7d5 --- media/jni/android_media_tv_Tuner.cpp | 303 ++++++++++++++++++++++++++- media/jni/android_media_tv_Tuner.h | 2 + 2 files changed, 296 insertions(+), 9 deletions(-) diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index 6a1acede029f8..cd2fa636c0f69 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -136,6 +136,7 @@ using ::android::hardware::tv::tuner::V1_1::Constant; using ::android::hardware::tv::tuner::V1_1::Constant64Bit; using ::android::hardware::tv::tuner::V1_1::FrontendAnalogAftFlag; using ::android::hardware::tv::tuner::V1_1::FrontendAnalogSettingsExt1_1; +using ::android::hardware::tv::tuner::V1_1::FrontendBandwidth; using ::android::hardware::tv::tuner::V1_1::FrontendCableTimeInterleaveMode; using ::android::hardware::tv::tuner::V1_1::FrontendDvbsScanType; using ::android::hardware::tv::tuner::V1_1::FrontendDvbcSettingsExt1_1; @@ -149,7 +150,13 @@ using ::android::hardware::tv::tuner::V1_1::FrontendDtmbModulation; using ::android::hardware::tv::tuner::V1_1::FrontendDtmbSettings; using ::android::hardware::tv::tuner::V1_1::FrontendDtmbTimeInterleaveMode; using ::android::hardware::tv::tuner::V1_1::FrontendDtmbTransmissionMode; +using ::android::hardware::tv::tuner::V1_1::FrontendGuardInterval; +using ::android::hardware::tv::tuner::V1_1::FrontendInterleaveMode; +using ::android::hardware::tv::tuner::V1_1::FrontendModulation; using ::android::hardware::tv::tuner::V1_1::FrontendSpectralInversion; +using ::android::hardware::tv::tuner::V1_1::FrontendStatusExt1_1; +using ::android::hardware::tv::tuner::V1_1::FrontendStatusTypeExt1_1; +using ::android::hardware::tv::tuner::V1_1::FrontendTransmissionMode; struct fields_t { jfieldID tunerContext; @@ -1862,18 +1869,49 @@ jobject JTuner::getFrontendStatus(jintArray types) { } JNIEnv *env = AndroidRuntime::getJNIEnv(); jsize size = env->GetArrayLength(types); - std::vector v(size); - env->GetIntArrayRegion(types, 0, size, reinterpret_cast(&v[0])); + jint intTypes[size]; + env->GetIntArrayRegion(types, 0, size, intTypes); + std::vector v; + std::vector v_1_1; + for (int i = 0; i < size; i++) { + if (isV1_1ExtendedStatusType(intTypes[i])) { + v_1_1.push_back(static_cast(intTypes[i])); + } else { + v.push_back(static_cast(intTypes[i])); + } + } Result res; hidl_vec status; - mFe->getStatus(v, - [&](Result r, const hidl_vec& s) { - res = r; - status = s; - }); - if (res != Result::SUCCESS) { - return NULL; + hidl_vec status_1_1; + + if (v.size() > 0) { + mFe->getStatus(v, + [&](Result r, const hidl_vec& s) { + res = r; + status = s; + }); + if (res != Result::SUCCESS) { + return NULL; + } + } + + if (v_1_1.size() > 0) { + sp<::android::hardware::tv::tuner::V1_1::IFrontend> iFeSp_1_1; + iFeSp_1_1 = ::android::hardware::tv::tuner::V1_1::IFrontend::castFrom(mFe); + + if (iFeSp_1_1 != NULL) { + iFeSp_1_1->getStatusExt1_1(v_1_1, + [&](Result r, const hidl_vec& s) { + res = r; + status_1_1 = s; + }); + if (res != Result::SUCCESS) { + return NULL; + } + } else { + ALOGW("getStatusExt1_1 is not supported with the current HAL implementation."); + } } jclass clazz = env->FindClass("android/media/tv/tuner/frontend/FrontendStatus"); @@ -2101,9 +2139,256 @@ jobject JTuner::getFrontendStatus(jintArray types) { } } + for (auto s : status_1_1) { + switch(s.getDiscriminator()) { + case FrontendStatusExt1_1::hidl_discriminator::modulations: { + jfieldID field = env->GetFieldID(clazz, "mModulationsExt", "[I"); + std::vector v = s.modulations(); + + jintArray valObj = env->NewIntArray(v.size()); + bool valid = false; + jint m[1]; + for (int i = 0; i < v.size(); i++) { + auto modulation = v[i]; + switch(modulation.getDiscriminator()) { + case FrontendModulation::hidl_discriminator::dvbc: { + m[0] = static_cast(modulation.dvbc()); + env->SetIntArrayRegion(valObj, i, 1, m); + valid = true; + break; + } + case FrontendModulation::hidl_discriminator::dvbs: { + m[0] = static_cast(modulation.dvbs()); + env->SetIntArrayRegion(valObj, i, 1, m); + valid = true; + break; + } + case FrontendModulation::hidl_discriminator::dvbt: { + m[0] = static_cast(modulation.dvbt()); + env->SetIntArrayRegion(valObj, i, 1, m); + valid = true; + break; + } + case FrontendModulation::hidl_discriminator::isdbs: { + m[0] = static_cast(modulation.isdbs()); + env->SetIntArrayRegion(valObj, i, 1, m); + valid = true; + break; + } + case FrontendModulation::hidl_discriminator::isdbs3: { + m[0] = static_cast(modulation.isdbs3()); + env->SetIntArrayRegion(valObj, i, 1, m); + valid = true; + break; + } + case FrontendModulation::hidl_discriminator::isdbt: { + m[0] = static_cast(modulation.isdbt()); + env->SetIntArrayRegion(valObj, i, 1, m); + valid = true; + break; + } + case FrontendModulation::hidl_discriminator::atsc: { + m[0] = static_cast(modulation.atsc()); + env->SetIntArrayRegion(valObj, i, 1, m); + valid = true; + break; + } + case FrontendModulation::hidl_discriminator::atsc3: { + m[0] = static_cast(modulation.atsc3()); + env->SetIntArrayRegion(valObj, i, 1, m); + valid = true; + break; + } + default: + break; + } + } + if (valid) { + env->SetObjectField(statusObj, field, valObj); + } + break; + } + case FrontendStatusExt1_1::hidl_discriminator::bers: { + jfieldID field = env->GetFieldID(clazz, "mBers", "[I"); + std::vector v = s.bers(); + + jintArray valObj = env->NewIntArray(v.size()); + env->SetIntArrayRegion(valObj, 0, v.size(), reinterpret_cast(&v[0])); + + env->SetObjectField(statusObj, field, valObj); + break; + } + case FrontendStatusExt1_1::hidl_discriminator::codeRates: { + jfieldID field = env->GetFieldID(clazz, "mCodeRates", "[I"); + std::vector<::android::hardware::tv::tuner::V1_1::FrontendInnerFec> v + = s.codeRates(); + + jintArray valObj = env->NewIntArray(v.size()); + env->SetIntArrayRegion(valObj, 0, v.size(), reinterpret_cast(&v[0])); + + env->SetObjectField(statusObj, field, valObj); + break; + } + case FrontendStatusExt1_1::hidl_discriminator::bandwidth: { + jfieldID field = env->GetFieldID(clazz, "mBandwidth", "Ljava/lang/Integer;"); + auto bandwidth = s.bandwidth(); + jint intBandwidth; + bool valid = true; + switch(bandwidth.getDiscriminator()) { + case FrontendBandwidth::hidl_discriminator::atsc3: { + intBandwidth = static_cast(bandwidth.atsc3()); + break; + } + case FrontendBandwidth::hidl_discriminator::dvbt: { + intBandwidth = static_cast(bandwidth.dvbt()); + break; + } + case FrontendBandwidth::hidl_discriminator::isdbt: { + intBandwidth = static_cast(bandwidth.isdbt()); + break; + } + default: + valid = false; + break; + } + if (valid) { + jobject newIntegerObj = env->NewObject(intClazz, initInt, intBandwidth); + env->SetObjectField(statusObj, field, newIntegerObj); + } + break; + } + case FrontendStatusExt1_1::hidl_discriminator::interval: { + jfieldID field = env->GetFieldID(clazz, "mGuardInterval", "Ljava/lang/Integer;"); + auto interval = s.interval(); + jint intInterval; + bool valid = true; + switch(interval.getDiscriminator()) { + case FrontendGuardInterval::hidl_discriminator::dvbt: { + intInterval = static_cast(interval.dvbt()); + break; + } + case FrontendGuardInterval::hidl_discriminator::isdbt: { + intInterval = static_cast(interval.isdbt()); + break; + } + default: + valid = false; + break; + } + if (valid) { + jobject newIntegerObj = env->NewObject(intClazz, initInt, intInterval); + env->SetObjectField(statusObj, field, newIntegerObj); + } + break; + } + case FrontendStatusExt1_1::hidl_discriminator::transmissionMode: { + jfieldID field = env->GetFieldID(clazz, "mTransmissionMode", "Ljava/lang/Integer;"); + auto transmissionMode = s.transmissionMode(); + jint intTransmissionMode; + bool valid = true; + switch(transmissionMode.getDiscriminator()) { + case FrontendTransmissionMode::hidl_discriminator::dvbt: { + intTransmissionMode = static_cast(transmissionMode.dvbt()); + break; + } + case FrontendTransmissionMode::hidl_discriminator::isdbt: { + intTransmissionMode = static_cast(transmissionMode.isdbt()); + break; + } + default: + valid = false; + break; + } + if (valid) { + jobject newIntegerObj = env->NewObject(intClazz, initInt, intTransmissionMode); + env->SetObjectField(statusObj, field, newIntegerObj); + } + break; + } + case FrontendStatusExt1_1::hidl_discriminator::uec: { + jfieldID field = env->GetFieldID(clazz, "mUec", "Ljava/lang/Integer;"); + jobject newIntegerObj = env->NewObject( + intClazz, initInt, static_cast(s.uec())); + env->SetObjectField(statusObj, field, newIntegerObj); + break; + } + case FrontendStatusExt1_1::hidl_discriminator::systemId: { + jfieldID field = env->GetFieldID(clazz, "mSystemId", "Ljava/lang/Integer;"); + jobject newIntegerObj = env->NewObject( + intClazz, initInt, static_cast(s.systemId())); + env->SetObjectField(statusObj, field, newIntegerObj); + break; + } + case FrontendStatusExt1_1::hidl_discriminator::interleaving: { + jfieldID field = env->GetFieldID(clazz, "mInterleaving", "[I"); + + std::vector v = s.interleaving(); + jintArray valObj = env->NewIntArray(v.size()); + bool valid = false; + jint in[1]; + for (int i = 0; i < v.size(); i++) { + auto interleaving = v[i]; + switch(interleaving.getDiscriminator()) { + case FrontendInterleaveMode::hidl_discriminator::atsc3: { + in[0] = static_cast(interleaving.atsc3()); + env->SetIntArrayRegion(valObj, i, 1, in); + valid = true; + break; + } + case FrontendInterleaveMode::hidl_discriminator::dvbc: { + in[0] = static_cast(interleaving.dvbc()); + env->SetIntArrayRegion(valObj, i, 1, in); + valid = true; + break; + } + case FrontendInterleaveMode::hidl_discriminator::dtmb: { + in[0] = static_cast(interleaving.dtmb()); + env->SetIntArrayRegion(valObj, i, 1, in); + valid = true; + break; + } + default: + break; + } + } + if (valid) { + env->SetObjectField(statusObj, field, valObj); + } + break; + } + case FrontendStatusExt1_1::hidl_discriminator::isdbtSegment: { + jfieldID field = env->GetFieldID(clazz, "mIsdbtSegment", "[I"); + std::vector v = s.isdbtSegment(); + + jintArray valObj = env->NewIntArray(v.size()); + env->SetIntArrayRegion(valObj, 0, v.size(), reinterpret_cast(&v[0])); + + env->SetObjectField(statusObj, field, valObj); + break; + } + case FrontendStatusExt1_1::hidl_discriminator::tsDataRate: { + jfieldID field = env->GetFieldID(clazz, "mTsDataRate", "[I"); + std::vector v = s.tsDataRate(); + + jintArray valObj = env->NewIntArray(v.size()); + env->SetIntArrayRegion(valObj, 0, v.size(), reinterpret_cast(&v[0])); + + env->SetObjectField(statusObj, field, valObj); + break; + } + default: { + break; + } + } + } return statusObj; } +bool JTuner::isV1_1ExtendedStatusType(int type) { + return (type > static_cast(FrontendStatusType::ATSC3_PLP_INFO) + && type <= static_cast(FrontendStatusTypeExt1_1::TS_DATA_RATES)); +} + jint JTuner::closeFrontend() { Result r = Result::SUCCESS; if (mFe != NULL) { diff --git a/media/jni/android_media_tv_Tuner.h b/media/jni/android_media_tv_Tuner.h index 2b73f312be054..3f74d24b29c5c 100644 --- a/media/jni/android_media_tv_Tuner.h +++ b/media/jni/android_media_tv_Tuner.h @@ -268,6 +268,8 @@ private: static jobject getIsdbsFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps); static jobject getIsdbtFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps); static jobject getDtmbFrontendCaps(JNIEnv *env, int id); + + bool isV1_1ExtendedStatusType(jint type); }; class C2DataIdInfo : public C2Param {