Merge "Add ISDB-T Multi-Layer Support."

This commit is contained in:
Hongguang Chen
2021-11-04 21:29:24 +00:00
committed by Android (Google) Code Review
6 changed files with 587 additions and 36 deletions

View File

@@ -7260,6 +7260,8 @@ package android.media.tv.tuner.frontend {
method public int getHierarchy();
method public long getInnerFec();
method @NonNull public int[] getInterleaving();
method public int getIsdbtMode();
method public int getIsdbtPartialReceptionFlag();
method @IntRange(from=0, to=255) @NonNull public int[] getIsdbtSegment();
method @NonNull public boolean[] getLayerErrors();
method public int getLnbVoltage();
@@ -7298,6 +7300,8 @@ package android.media.tv.tuner.frontend {
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_MODE = 37; // 0x25
field public static final int FRONTEND_STATUS_TYPE_ISDBT_PARTIAL_RECEPTION_FLAG = 38; // 0x26
field public static final int FRONTEND_STATUS_TYPE_ISDBT_SEGMENTS = 31; // 0x1f
field public static final int FRONTEND_STATUS_TYPE_IS_LINEAR = 35; // 0x23
field public static final int FRONTEND_STATUS_TYPE_IS_MISO_ENABLED = 34; // 0x22
@@ -7430,15 +7434,20 @@ package android.media.tv.tuner.frontend {
method public int getGuardIntervalCapability();
method public int getModeCapability();
method public int getModulationCapability();
method public int getTimeInterleaveModeCapability();
method public boolean isFullSegmentSupported();
method public boolean isSegmentAutoSupported();
}
public class IsdbtFrontendSettings extends android.media.tv.tuner.frontend.FrontendSettings {
method @NonNull public static android.media.tv.tuner.frontend.IsdbtFrontendSettings.Builder builder();
method public int getBandwidth();
method public int getCodeRate();
method @Deprecated public int getCodeRate();
method public int getGuardInterval();
method @NonNull public android.media.tv.tuner.frontend.IsdbtFrontendSettings.IsdbtLayerSettings[] getLayerSettings();
method public int getMode();
method public int getModulation();
method @Deprecated public int getModulation();
method public int getPartialReceptionFlag();
method public int getServiceAreaId();
method public int getType();
field public static final int BANDWIDTH_6MHZ = 8; // 0x8
@@ -7457,20 +7466,55 @@ package android.media.tv.tuner.frontend {
field public static final int MODULATION_MOD_DQPSK = 2; // 0x2
field public static final int MODULATION_MOD_QPSK = 4; // 0x4
field public static final int MODULATION_UNDEFINED = 0; // 0x0
field public static final int PARTIAL_RECEPTION_FLAG_FALSE = 2; // 0x2
field public static final int PARTIAL_RECEPTION_FLAG_TRUE = 4; // 0x4
field public static final int PARTIAL_RECEPTION_FLAG_UNDEFINED = 0; // 0x0
field public static final int TIME_INTERLEAVE_MODE_1_0 = 2; // 0x2
field public static final int TIME_INTERLEAVE_MODE_1_16 = 16; // 0x10
field public static final int TIME_INTERLEAVE_MODE_1_4 = 4; // 0x4
field public static final int TIME_INTERLEAVE_MODE_1_8 = 8; // 0x8
field public static final int TIME_INTERLEAVE_MODE_2_0 = 32; // 0x20
field public static final int TIME_INTERLEAVE_MODE_2_2 = 64; // 0x40
field public static final int TIME_INTERLEAVE_MODE_2_4 = 128; // 0x80
field public static final int TIME_INTERLEAVE_MODE_2_8 = 256; // 0x100
field public static final int TIME_INTERLEAVE_MODE_3_0 = 512; // 0x200
field public static final int TIME_INTERLEAVE_MODE_3_1 = 1024; // 0x400
field public static final int TIME_INTERLEAVE_MODE_3_2 = 2048; // 0x800
field public static final int TIME_INTERLEAVE_MODE_3_4 = 4096; // 0x1000
field public static final int TIME_INTERLEAVE_MODE_AUTO = 1; // 0x1
field public static final int TIME_INTERLEAVE_MODE_UNDEFINED = 0; // 0x0
}
public static class IsdbtFrontendSettings.Builder {
method @NonNull public android.media.tv.tuner.frontend.IsdbtFrontendSettings build();
method @NonNull public android.media.tv.tuner.frontend.IsdbtFrontendSettings.Builder setBandwidth(int);
method @NonNull public android.media.tv.tuner.frontend.IsdbtFrontendSettings.Builder setCodeRate(int);
method @Deprecated @NonNull public android.media.tv.tuner.frontend.IsdbtFrontendSettings.Builder setCodeRate(int);
method @Deprecated @IntRange(from=1) @NonNull public android.media.tv.tuner.frontend.IsdbtFrontendSettings.Builder setFrequency(int);
method @IntRange(from=1) @NonNull public android.media.tv.tuner.frontend.IsdbtFrontendSettings.Builder setFrequencyLong(long);
method @NonNull public android.media.tv.tuner.frontend.IsdbtFrontendSettings.Builder setGuardInterval(int);
method @NonNull public android.media.tv.tuner.frontend.IsdbtFrontendSettings.Builder setLayerSettings(@NonNull android.media.tv.tuner.frontend.IsdbtFrontendSettings.IsdbtLayerSettings[]);
method @NonNull public android.media.tv.tuner.frontend.IsdbtFrontendSettings.Builder setMode(int);
method @NonNull public android.media.tv.tuner.frontend.IsdbtFrontendSettings.Builder setModulation(int);
method @Deprecated @NonNull public android.media.tv.tuner.frontend.IsdbtFrontendSettings.Builder setModulation(int);
method @NonNull public android.media.tv.tuner.frontend.IsdbtFrontendSettings.Builder setPartialReceptionFlag(int);
method @NonNull public android.media.tv.tuner.frontend.IsdbtFrontendSettings.Builder setServiceAreaId(int);
}
public static final class IsdbtFrontendSettings.IsdbtLayerSettings {
method @NonNull public static android.media.tv.tuner.frontend.IsdbtFrontendSettings.IsdbtLayerSettings.Builder builder();
method public int getCodeRate();
method public int getModulation();
method @IntRange(from=0, to=255) public int getNumOfSegment();
method public int getTimeInterleaveMode();
}
public static final class IsdbtFrontendSettings.IsdbtLayerSettings.Builder {
method @NonNull public android.media.tv.tuner.frontend.IsdbtFrontendSettings.IsdbtLayerSettings build();
method @NonNull public android.media.tv.tuner.frontend.IsdbtFrontendSettings.IsdbtLayerSettings.Builder setCodeRate(int);
method @NonNull public android.media.tv.tuner.frontend.IsdbtFrontendSettings.IsdbtLayerSettings.Builder setModulation(int);
method @IntRange(from=0, to=255) @NonNull public android.media.tv.tuner.frontend.IsdbtFrontendSettings.IsdbtLayerSettings.Builder setNumOfSegment(int);
method @NonNull public android.media.tv.tuner.frontend.IsdbtFrontendSettings.IsdbtLayerSettings.Builder setTimeInterleaveMode(int);
}
public interface OnTuneEventListener {
method public void onTuneEvent(int);
field public static final int SIGNAL_LOCKED = 0; // 0x0

View File

@@ -749,6 +749,12 @@ public class Tuner implements AutoCloseable {
* supported in Tuner 1.1 or higher version. Unsupported version will cause no-op. Use {@link
* TunerVersionChecker#getTunerVersion()} to get the version information.
*
* <p>Tuning with {@link
* android.media.tv.tuner.frontend.IsdbtFrontendSettings.PartialReceptionFlag} or {@link
* android.media.tv.tuner.frontend.IsdbtFrontendSettings.IsdbtLayerSettings} is only supported
* in Tuner 2.0 or higher version. Unsupported version will cause no-op. Use {@link
* TunerVersionChecker#getTunerVersion()} to get the version information.
*
* @param settings Signal delivery information the frontend uses to
* search and lock the signal.
* @return result status of tune operation.
@@ -803,6 +809,12 @@ public class Tuner implements AutoCloseable {
* supported in Tuner 1.1 or higher version. Unsupported version will cause no-op. Use {@link
* TunerVersionChecker#getTunerVersion()} to get the version information.
*
* * <p>Scanning with {@link
* android.media.tv.tuner.frontend.IsdbtFrontendSettings.PartialReceptionFlag} or {@link
* android.media.tv.tuner.frontend.IsdbtFrontendSettings.IsdbtLayerSettings} is only supported
* in Tuner 2.0 or higher version. Unsupported version will cause no-op. Use {@link
* TunerVersionChecker#getTunerVersion()} to get the version information.
*
* @param settings A {@link FrontendSettings} to configure the frontend.
* @param scanType The scan type.
* @throws SecurityException if the caller does not have appropriate permissions.

View File

@@ -52,7 +52,8 @@ public class FrontendStatus {
FRONTEND_STATUS_TYPE_ISDBT_SEGMENTS, FRONTEND_STATUS_TYPE_TS_DATA_RATES,
FRONTEND_STATUS_TYPE_MODULATIONS_EXT, FRONTEND_STATUS_TYPE_ROLL_OFF,
FRONTEND_STATUS_TYPE_IS_MISO_ENABLED, FRONTEND_STATUS_TYPE_IS_LINEAR,
FRONTEND_STATUS_TYPE_IS_SHORT_FRAMES_ENABLED})
FRONTEND_STATUS_TYPE_IS_SHORT_FRAMES_ENABLED, FRONTEND_STATUS_TYPE_ISDBT_MODE,
FRONTEND_STATUS_TYPE_ISDBT_PARTIAL_RECEPTION_FLAG})
@Retention(RetentionPolicy.SOURCE)
public @interface FrontendStatusType {}
@@ -242,6 +243,16 @@ public class FrontendStatus {
*/
public static final int FRONTEND_STATUS_TYPE_IS_SHORT_FRAMES_ENABLED =
android.hardware.tv.tuner.FrontendStatusType.IS_SHORT_FRAMES;
/**
* ISDB-T mode. Only supported in Tuner HAL 2.0 or higher.
*/
public static final int FRONTEND_STATUS_TYPE_ISDBT_MODE =
android.hardware.tv.tuner.FrontendStatusType.ISDBT_MODE;
/**
* ISDB-T partial reception flag. Only supported in Tuner HAL 2.0 or higher.
*/
public static final int FRONTEND_STATUS_TYPE_ISDBT_PARTIAL_RECEPTION_FLAG =
android.hardware.tv.tuner.FrontendStatusType.ISDBT_PARTIAL_RECEPTION_FLAG;
/** @hide */
@IntDef(value = {
@@ -337,7 +348,21 @@ public class FrontendStatus {
DvbcFrontendSettings.TIME_INTERLEAVE_MODE_8_16,
DvbcFrontendSettings.TIME_INTERLEAVE_MODE_128_2,
DvbcFrontendSettings.TIME_INTERLEAVE_MODE_128_3,
DvbcFrontendSettings.TIME_INTERLEAVE_MODE_128_4})
DvbcFrontendSettings.TIME_INTERLEAVE_MODE_128_4,
IsdbtFrontendSettings.TIME_INTERLEAVE_MODE_UNDEFINED,
IsdbtFrontendSettings.TIME_INTERLEAVE_MODE_AUTO,
IsdbtFrontendSettings.TIME_INTERLEAVE_MODE_1_0,
IsdbtFrontendSettings.TIME_INTERLEAVE_MODE_1_4,
IsdbtFrontendSettings.TIME_INTERLEAVE_MODE_1_8,
IsdbtFrontendSettings.TIME_INTERLEAVE_MODE_1_16,
IsdbtFrontendSettings.TIME_INTERLEAVE_MODE_2_0,
IsdbtFrontendSettings.TIME_INTERLEAVE_MODE_2_2,
IsdbtFrontendSettings.TIME_INTERLEAVE_MODE_2_4,
IsdbtFrontendSettings.TIME_INTERLEAVE_MODE_2_8,
IsdbtFrontendSettings.TIME_INTERLEAVE_MODE_3_0,
IsdbtFrontendSettings.TIME_INTERLEAVE_MODE_3_1,
IsdbtFrontendSettings.TIME_INTERLEAVE_MODE_3_2,
IsdbtFrontendSettings.TIME_INTERLEAVE_MODE_3_4})
@Retention(RetentionPolicy.SOURCE)
public @interface FrontendInterleaveMode {}
@@ -466,7 +491,8 @@ public class FrontendStatus {
private Boolean mIsMisoEnabled;
private Boolean mIsLinear;
private Boolean mIsShortFrames;
private Integer mIsdbtMode;
private Integer mIsdbtPartialReceptionFlag;
// Constructed and fields set by JNI code.
private FrontendStatus() {
@@ -940,6 +966,40 @@ public class FrontendStatus {
return mIsShortFrames;
}
/**
* Gets ISDB-T mode.
*
* <p>This query is only supported by Tuner HAL 2.0 or higher. Unsupported version or if HAL
* doesn't return ISDB-T mode status will throw IllegalStateException. Use
* {@link TunerVersionChecker#getTunerVersion()} to check the version.
*/
@IsdbtFrontendSettings.Mode
public int getIsdbtMode() {
TunerVersionChecker.checkHigherOrEqualVersionTo(
TunerVersionChecker.TUNER_VERSION_2_0, "IsdbtMode status");
if (mIsdbtMode == null) {
throw new IllegalStateException("IsdbtMode status is empty");
}
return mIsdbtMode;
}
/**
* Gets ISDB-T partial reception flag.
*
* <p>This query is only supported by Tuner HAL 2.0 or higher. Unsupported version or if HAL
* doesn't return partial reception flag status will throw IllegalStateException. Use
* {@link TunerVersionChecker#getTunerVersion()} to check the version.
*/
@IsdbtFrontendSettings.PartialReceptionFlag
public int getIsdbtPartialReceptionFlag() {
TunerVersionChecker.checkHigherOrEqualVersionTo(
TunerVersionChecker.TUNER_VERSION_2_0, "IsdbtPartialReceptionFlag status");
if (mIsdbtPartialReceptionFlag == null) {
throw new IllegalStateException("IsdbtPartialReceptionFlag status is empty");
}
return mIsdbtPartialReceptionFlag;
}
/**
* Information of each tuning Physical Layer Pipes.
*/

View File

@@ -17,6 +17,7 @@
package android.media.tv.tuner.frontend;
import android.annotation.SystemApi;
import android.media.tv.tuner.TunerVersionChecker;
/**
* ISDBT Capabilities.
@@ -30,14 +31,21 @@ public class IsdbtFrontendCapabilities extends FrontendCapabilities {
private final int mModulationCap;
private final int mCodeRateCap;
private final int mGuardIntervalCap;
private final int mTimeInterleaveCap;
private final boolean mIsSegmentAutoSupported;
private final boolean mIsFullSegmentSupported;
private IsdbtFrontendCapabilities(int modeCap, int bandwidthCap, int modulationCap,
int codeRateCap, int guardIntervalCap) {
int codeRateCap, int guardIntervalCap, int timeInterleaveCap,
boolean isSegmentAutoSupported, boolean isFullSegmentSupported) {
mModeCap = modeCap;
mBandwidthCap = bandwidthCap;
mModulationCap = modulationCap;
mCodeRateCap = codeRateCap;
mGuardIntervalCap = guardIntervalCap;
mTimeInterleaveCap = timeInterleaveCap;
mIsSegmentAutoSupported = isSegmentAutoSupported;
mIsFullSegmentSupported = isFullSegmentSupported;
}
/**
@@ -75,4 +83,35 @@ public class IsdbtFrontendCapabilities extends FrontendCapabilities {
public int getGuardIntervalCapability() {
return mGuardIntervalCap;
}
/**
* Gets time interleave mode capability.
*
* <p>This query is only supported by Tuner HAL 2.0 or higher. Unsupported version will
* return {@link IsdbtFrontendSettings#TIME_INTERLEAVE_MODE_UNDEFINED}.
* Use {@link TunerVersionChecker#getTunerVersion()} to check the version.
*/
@IsdbtFrontendSettings.TimeInterleaveMode
public int getTimeInterleaveModeCapability() {
return mTimeInterleaveCap;
}
/**
* If auto segment is supported or not.
*
* <p>This query is only supported by Tuner HAL 2.0 or higher. Unsupported version will
* return false.
* Use {@link TunerVersionChecker#getTunerVersion()} to check the version.
*/
public boolean isSegmentAutoSupported() {
return mIsSegmentAutoSupported;
}
/**
* If full segment is supported or not.
*
* <p>This query is only supported by Tuner HAL 2.0 or higher. Unsupported version will
* return false.
* Use {@link TunerVersionChecker#getTunerVersion()} to check the version.
*/
public boolean isFullSegmentSupported() {
return mIsFullSegmentSupported;
}
}

View File

@@ -19,12 +19,16 @@ package android.media.tv.tuner.frontend;
import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.hardware.tv.tuner.FrontendIsdbtBandwidth;
import android.hardware.tv.tuner.FrontendIsdbtMode;
import android.hardware.tv.tuner.FrontendIsdbtModulation;
import android.hardware.tv.tuner.FrontendIsdbtPartialReceptionFlag;
import android.hardware.tv.tuner.FrontendIsdbtTimeInterleaveMode;
import android.media.tv.tuner.TunerVersionChecker;
import android.media.tv.tuner.frontend.DvbtFrontendSettings.CodeRate;
import android.util.Log;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -127,30 +131,145 @@ public class IsdbtFrontendSettings extends FrontendSettings {
*/
public static final int BANDWIDTH_6MHZ = FrontendIsdbtBandwidth.BANDWIDTH_6MHZ;
private final int mModulation;
/** @hide */
@IntDef(flag = true, prefix = "PARTIAL_RECEPTION_FLAG_",
value = {PARTIAL_RECEPTION_FLAG_UNDEFINED, PARTIAL_RECEPTION_FLAG_FALSE,
PARTIAL_RECEPTION_FLAG_TRUE})
@Retention(RetentionPolicy.SOURCE)
public @interface PartialReceptionFlag {}
/**
* Partial Reception Flag undefined.
*/
public static final int PARTIAL_RECEPTION_FLAG_UNDEFINED =
FrontendIsdbtPartialReceptionFlag.UNDEFINED;
/**
* Partial Reception Flag false.
*/
public static final int PARTIAL_RECEPTION_FLAG_FALSE = FrontendIsdbtPartialReceptionFlag.FALSE;
/**
* Partial Reception Flag true.
*/
public static final int PARTIAL_RECEPTION_FLAG_TRUE = FrontendIsdbtPartialReceptionFlag.TRUE;
/** @hide */
@IntDef(flag = true, prefix = "TIME_INTERLEAVE_MODE_",
value = {TIME_INTERLEAVE_MODE_UNDEFINED, TIME_INTERLEAVE_MODE_AUTO,
TIME_INTERLEAVE_MODE_1_0, TIME_INTERLEAVE_MODE_1_4, TIME_INTERLEAVE_MODE_1_8,
TIME_INTERLEAVE_MODE_1_16, TIME_INTERLEAVE_MODE_2_0, TIME_INTERLEAVE_MODE_2_2,
TIME_INTERLEAVE_MODE_2_4, TIME_INTERLEAVE_MODE_2_8, TIME_INTERLEAVE_MODE_3_0,
TIME_INTERLEAVE_MODE_3_1, TIME_INTERLEAVE_MODE_3_2, TIME_INTERLEAVE_MODE_3_4})
@Retention(RetentionPolicy.SOURCE)
public @interface TimeInterleaveMode {}
/**
* Time Interleave Mode undefined.
*/
public static final int TIME_INTERLEAVE_MODE_UNDEFINED =
FrontendIsdbtTimeInterleaveMode.UNDEFINED;
/**
* Hardware is able to detect and set time interleave mode automatically
*/
public static final int TIME_INTERLEAVE_MODE_AUTO = FrontendIsdbtTimeInterleaveMode.AUTO;
/**
* Time Interleave Mode 1: 0.
*/
public static final int TIME_INTERLEAVE_MODE_1_0 =
FrontendIsdbtTimeInterleaveMode.INTERLEAVE_1_0;
/**
* Time Interleave Mode 1: 4.
*/
public static final int TIME_INTERLEAVE_MODE_1_4 =
FrontendIsdbtTimeInterleaveMode.INTERLEAVE_1_4;
/**
* Time Interleave Mode 1: 8.
*/
public static final int TIME_INTERLEAVE_MODE_1_8 =
FrontendIsdbtTimeInterleaveMode.INTERLEAVE_1_8;
/**
* Time Interleave Mode 1: 16.
*/
public static final int TIME_INTERLEAVE_MODE_1_16 =
FrontendIsdbtTimeInterleaveMode.INTERLEAVE_1_16;
/**
* Time Interleave Mode 2: 0.
*/
public static final int TIME_INTERLEAVE_MODE_2_0 =
FrontendIsdbtTimeInterleaveMode.INTERLEAVE_2_0;
/**
* Time Interleave Mode 2: 2.
*/
public static final int TIME_INTERLEAVE_MODE_2_2 =
FrontendIsdbtTimeInterleaveMode.INTERLEAVE_2_2;
/**
* Time Interleave Mode 2: 4.
*/
public static final int TIME_INTERLEAVE_MODE_2_4 =
FrontendIsdbtTimeInterleaveMode.INTERLEAVE_2_4;
/**
* Time Interleave Mode 2: 8.
*/
public static final int TIME_INTERLEAVE_MODE_2_8 =
FrontendIsdbtTimeInterleaveMode.INTERLEAVE_2_8;
/**
* Time Interleave Mode 3: 0.
*/
public static final int TIME_INTERLEAVE_MODE_3_0 =
FrontendIsdbtTimeInterleaveMode.INTERLEAVE_3_0;
/**
* Time Interleave Mode 3: 1.
*/
public static final int TIME_INTERLEAVE_MODE_3_1 =
FrontendIsdbtTimeInterleaveMode.INTERLEAVE_3_1;
/**
* Time Interleave Mode 3: 2.
*/
public static final int TIME_INTERLEAVE_MODE_3_2 =
FrontendIsdbtTimeInterleaveMode.INTERLEAVE_3_2;
/**
* Time Interleave Mode 3: 4.
*/
public static final int TIME_INTERLEAVE_MODE_3_4 =
FrontendIsdbtTimeInterleaveMode.INTERLEAVE_3_4;
private final int mBandwidth;
private final int mMode;
private final int mCodeRate;
private final int mGuardInterval;
private final int mServiceAreaId;
private final IsdbtLayerSettings[] mLayerSettings;
private final int mPartialReceptionFlag;
private static final String TAG = "IsdbtFrontendSettings";
private IsdbtFrontendSettings(long frequency, int modulation, int bandwidth, int mode,
int codeRate, int guardInterval, int serviceAreaId) {
private IsdbtFrontendSettings(long frequency, int bandwidth, int mode, int guardInterval,
int serviceAreaId, IsdbtLayerSettings[] layerSettings, int partialReceptionFlag) {
super(frequency);
mModulation = modulation;
mBandwidth = bandwidth;
mMode = mode;
mCodeRate = codeRate;
mGuardInterval = guardInterval;
mServiceAreaId = serviceAreaId;
mLayerSettings = new IsdbtLayerSettings[layerSettings.length];
for (int i = 0; i < layerSettings.length; i++) {
mLayerSettings[i] = layerSettings[i];
}
mPartialReceptionFlag = partialReceptionFlag;
}
/**
* Gets Modulation.
*
* <p>This query is only supported in Tuner 1.1 or lowner version. Unsupported version will
* return {@link MODULATION_UNDEFINED}.
* Use {@link TunerVersionChecker#getTunerVersion()} to get the version information.
* @deprecated Use {@link #getLayerSettings()} and {@link IsdbtLayerSettings#getModulation()}
* instead.
*/
@Deprecated
@Modulation
public int getModulation() {
return mModulation;
if (TunerVersionChecker.isHigherOrEqualVersionTo(TunerVersionChecker.TUNER_VERSION_2_0)) {
return MODULATION_UNDEFINED;
}
return mLayerSettings.length > 0 ? mLayerSettings[0].getModulation() : MODULATION_UNDEFINED;
}
/**
* Gets Bandwidth.
@@ -168,10 +287,21 @@ public class IsdbtFrontendSettings extends FrontendSettings {
}
/**
* Gets Code rate.
*
* <p>This query is only supported in Tuner 1.1 or lowner version. Unsupported version will
* return {@link DvbtFrontendSettings#CODERATE_UNDEFINED}.
* Use {@link TunerVersionChecker#getTunerVersion()} to get the version information.
* @deprecated Use {@link #getLayerSettings()} and {@link IsdbtLayerSettings#getCodeRate()}
* instead.
*/
@Deprecated
@CodeRate
public int getCodeRate() {
return mCodeRate;
if (TunerVersionChecker.isHigherOrEqualVersionTo(TunerVersionChecker.TUNER_VERSION_2_0)) {
return DvbtFrontendSettings.CODERATE_UNDEFINED;
}
return mLayerSettings.length > 0 ? mLayerSettings[0].getCodeRate()
: DvbtFrontendSettings.CODERATE_UNDEFINED;
}
/**
* Gets Guard Interval.
@@ -186,6 +316,29 @@ public class IsdbtFrontendSettings extends FrontendSettings {
public int getServiceAreaId() {
return mServiceAreaId;
}
/**
* Gets ISDB-T Layer Settings.
*
* <p>This query is only supported in Tuner 2.0 or higher version. Unsupported version will
* return an empty array.
* Use {@link TunerVersionChecker#getTunerVersion()} to get the version information.
*/
@SuppressLint("ArrayReturn")
@NonNull
public IsdbtLayerSettings[] getLayerSettings() {
return mLayerSettings;
}
/**
* Gets ISDB-T Partial Reception Flag.
*
* <p>This query is only supported in Tuner 2.0 or higher version. Unsupported version will
* return {@link PARTIALRECEPTIONFLAG_UNDEFINED}.
* Use {@link TunerVersionChecker#getTunerVersion()} to get the version information.
*/
@PartialReceptionFlag
public int getPartialReceptionFlag() {
return mPartialReceptionFlag;
}
/**
* Creates a builder for {@link IsdbtFrontendSettings}.
@@ -200,12 +353,12 @@ public class IsdbtFrontendSettings extends FrontendSettings {
*/
public static class Builder {
private long mFrequency = 0;
private int mModulation = MODULATION_UNDEFINED;
private int mBandwidth = BANDWIDTH_UNDEFINED;
private int mMode = MODE_UNDEFINED;
private int mCodeRate = DvbtFrontendSettings.CODERATE_UNDEFINED;
private int mGuardInterval = DvbtFrontendSettings.GUARD_INTERVAL_UNDEFINED;
private int mServiceAreaId = 0;
private IsdbtLayerSettings[] mLayerSettings = {};
private int mPartialReceptionFlag = PARTIAL_RECEPTION_FLAG_UNDEFINED;
private Builder() {
}
@@ -238,11 +391,28 @@ public class IsdbtFrontendSettings extends FrontendSettings {
/**
* Sets Modulation.
*
* <p>This configuration is only supported in Tuner 1.1 or lowner version. Unsupported
* version will cause no-op. Use {@link TunerVersionChecker#getTunerVersion()} to get the
* version information.
*
* <p>Default value is {@link #MODULATION_UNDEFINED}.
*/
@Deprecated
@NonNull
public Builder setModulation(@Modulation int modulation) {
mModulation = modulation;
if (TunerVersionChecker.checkHigherOrEqualVersionTo(
TunerVersionChecker.TUNER_VERSION_2_0, "setModulation")) {
Log.d(TAG, "Use IsdbtLayerSettings on HAL 2.0 or higher");
} else {
IsdbtLayerSettings.Builder layerBuilder = IsdbtLayerSettings.builder();
layerBuilder.setModulation(modulation);
if (mLayerSettings.length == 0) {
mLayerSettings = new IsdbtLayerSettings[1];
} else {
layerBuilder.setCodeRate(mLayerSettings[0].getCodeRate());
}
mLayerSettings[0] = layerBuilder.build();
}
return this;
}
/**
@@ -268,11 +438,28 @@ public class IsdbtFrontendSettings extends FrontendSettings {
/**
* Sets Code rate.
*
* <p>This configuration is only supported in Tuner 1.1 or lowner version. Unsupported
* version will cause no-op. Use {@link TunerVersionChecker#getTunerVersion()} to get the
* version information.
*
* <p>Default value is {@link DvbtFrontendSettings#CODERATE_UNDEFINED}.
*/
@Deprecated
@NonNull
public Builder setCodeRate(@DvbtFrontendSettings.CodeRate int codeRate) {
mCodeRate = codeRate;
if (TunerVersionChecker.checkHigherOrEqualVersionTo(
TunerVersionChecker.TUNER_VERSION_2_0, "setModulation")) {
Log.d(TAG, "Use IsdbtLayerSettings on HAL 2.0 or higher");
} else {
IsdbtLayerSettings.Builder layerBuilder = IsdbtLayerSettings.builder();
layerBuilder.setCodeRate(codeRate);
if (mLayerSettings.length == 0) {
mLayerSettings = new IsdbtLayerSettings[1];
} else {
layerBuilder.setModulation(mLayerSettings[0].getModulation());
}
mLayerSettings[0] = layerBuilder.build();
}
return this;
}
/**
@@ -295,14 +482,52 @@ public class IsdbtFrontendSettings extends FrontendSettings {
mServiceAreaId = serviceAreaId;
return this;
}
/**
* Sets ISDB-T Layer Settings.
*
* <p>This configuration is only supported in Tuner 2.0 or higher version. Unsupported
* version will cause no-op. Use {@link TunerVersionChecker#getTunerVersion()} to get the
* version information.
*
* <p>Default value is an empty array.
*/
@NonNull
public Builder setLayerSettings(
@SuppressLint("ArrayReturn") @NonNull IsdbtLayerSettings[] layerSettings) {
if (TunerVersionChecker.checkHigherOrEqualVersionTo(
TunerVersionChecker.TUNER_VERSION_2_0, "setLayerSettings")) {
mLayerSettings = new IsdbtLayerSettings[layerSettings.length];
for (int i = 0; i < layerSettings.length; i++) {
mLayerSettings[i] = layerSettings[i];
}
}
return this;
}
/**
* Sets ISDB-T Partial Reception Flag.
*
* <p>This configuration is only supported in Tuner 2.0 or higher version. Unsupported
* version will cause no-op. Use {@link TunerVersionChecker#getTunerVersion()} to get the
* version information.
*
* <p>Default value is {@link PARTIALRECEPTIONFLAG_UNDEFINED}.
*/
@NonNull
public Builder setPartialReceptionFlag(@PartialReceptionFlag int flag) {
if (TunerVersionChecker.checkHigherOrEqualVersionTo(
TunerVersionChecker.TUNER_VERSION_2_0, "setPartialReceptionFlag")) {
mPartialReceptionFlag = flag;
}
return this;
}
/**
* Builds a {@link IsdbtFrontendSettings} object.
*/
@NonNull
public IsdbtFrontendSettings build() {
return new IsdbtFrontendSettings(mFrequency, mModulation, mBandwidth, mMode, mCodeRate,
mGuardInterval, mServiceAreaId);
return new IsdbtFrontendSettings(mFrequency, mBandwidth, mMode, mGuardInterval,
mServiceAreaId, mLayerSettings, mPartialReceptionFlag);
}
}
@@ -310,4 +535,123 @@ public class IsdbtFrontendSettings extends FrontendSettings {
public int getType() {
return FrontendSettings.TYPE_ISDBT;
}
/**
* Layer Settings for ISDB-T Frontend.
*
* <p>Layer Settings is only supported in Tuner 2.0 or higher version. Use
* {@link TunerVersionChecker#getTunerVersion()} to get the version information.
*/
public static final class IsdbtLayerSettings {
private final int mModulation;
private final int mTimeInterleaveMode;
private final int mCodeRate;
private final int mNumOfSegment;
private IsdbtLayerSettings(
int modulation, int timeInterleaveMode, int codeRate, int numOfSegment) {
mModulation = modulation;
mTimeInterleaveMode = timeInterleaveMode;
mCodeRate = codeRate;
mNumOfSegment = numOfSegment;
}
/**
* Gets Modulation.
*/
@Modulation
public int getModulation() {
return mModulation;
}
/**
* Gets Time Interleave Mode.
*/
@TimeInterleaveMode
public int getTimeInterleaveMode() {
return mTimeInterleaveMode;
}
/**
* Gets Code rate.
*/
@CodeRate
public int getCodeRate() {
return mCodeRate;
}
/**
* Gets Number of Segment.
*/
@IntRange(from = 0, to = 0xff)
public int getNumOfSegment() {
return mNumOfSegment;
}
/**
* Creates a builder for {@link IsdbtLayerSettings}.
*/
@NonNull
public static Builder builder() {
return new Builder();
}
/**
* Builder for {@link IsdbtLayerSettings}.
*/
public static final class Builder {
private int mModulation = MODULATION_UNDEFINED;
private int mTimeInterleaveMode = TIME_INTERLEAVE_MODE_UNDEFINED;
private int mCodeRate = DvbtFrontendSettings.CODERATE_UNDEFINED;
private int mNumOfSegment = 0;
private Builder() {}
/**
* Sets modulation.
*
* <p>Default value is {@link #MODULATION_UNDEFINED}.
*/
@NonNull
public Builder setModulation(@Modulation int modulation) {
mModulation = modulation;
return this;
}
/**
* Sets time interleave mode.
*
* <p>Default value is {@link #TIME_INTERLEAVE_MODE_UNDEFINED}.
*/
@NonNull
public Builder setTimeInterleaveMode(@TimeInterleaveMode int mode) {
mTimeInterleaveMode = mode;
return this;
}
/**
* Sets code rate.
*/
@NonNull
public Builder setCodeRate(@DvbtFrontendSettings.CodeRate int codeRate) {
mCodeRate = codeRate;
return this;
}
/**
* Sets number of segment.
*
* <p>Default value is 0.
*/
@NonNull
@IntRange(from = 0, to = 0xff)
public Builder setNumOfSegment(int numOfSegment) {
mNumOfSegment = numOfSegment;
return this;
}
/**
* Builds a {@link IsdbtLayerSettings} object.
*/
@NonNull
public IsdbtLayerSettings build() {
return new IsdbtLayerSettings(
mModulation, mTimeInterleaveMode, mCodeRate, mNumOfSegment);
}
}
}
}

View File

@@ -123,9 +123,12 @@
#include <aidl/android/hardware/tv/tuner/FrontendIsdbtBandwidth.h>
#include <aidl/android/hardware/tv/tuner/FrontendIsdbtCoderate.h>
#include <aidl/android/hardware/tv/tuner/FrontendIsdbtGuardInterval.h>
#include <aidl/android/hardware/tv/tuner/FrontendIsdbtLayerSettings.h>
#include <aidl/android/hardware/tv/tuner/FrontendIsdbtMode.h>
#include <aidl/android/hardware/tv/tuner/FrontendIsdbtModulation.h>
#include <aidl/android/hardware/tv/tuner/FrontendIsdbtPartialReceptionFlag.h>
#include <aidl/android/hardware/tv/tuner/FrontendIsdbtSettings.h>
#include <aidl/android/hardware/tv/tuner/FrontendIsdbtTimeInterleaveMode.h>
#include <aidl/android/hardware/tv/tuner/FrontendModulation.h>
#include <aidl/android/hardware/tv/tuner/FrontendModulationStatus.h>
#include <aidl/android/hardware/tv/tuner/FrontendRollOff.h>
@@ -268,9 +271,12 @@ using ::aidl::android::hardware::tv::tuner::FrontendIsdbsStreamIdType;
using ::aidl::android::hardware::tv::tuner::FrontendIsdbtBandwidth;
using ::aidl::android::hardware::tv::tuner::FrontendIsdbtCoderate;
using ::aidl::android::hardware::tv::tuner::FrontendIsdbtGuardInterval;
using ::aidl::android::hardware::tv::tuner::FrontendIsdbtLayerSettings;
using ::aidl::android::hardware::tv::tuner::FrontendIsdbtMode;
using ::aidl::android::hardware::tv::tuner::FrontendIsdbtModulation;
using ::aidl::android::hardware::tv::tuner::FrontendIsdbtPartialReceptionFlag;
using ::aidl::android::hardware::tv::tuner::FrontendIsdbtSettings;
using ::aidl::android::hardware::tv::tuner::FrontendIsdbtTimeInterleaveMode;
using ::aidl::android::hardware::tv::tuner::FrontendModulation;
using ::aidl::android::hardware::tv::tuner::FrontendModulationStatus;
using ::aidl::android::hardware::tv::tuner::FrontendRollOff;
@@ -1355,16 +1361,19 @@ jobject JTuner::getIsdbsFrontendCaps(JNIEnv *env, FrontendCapabilities &caps) {
jobject JTuner::getIsdbtFrontendCaps(JNIEnv *env, FrontendCapabilities &caps) {
jclass clazz = env->FindClass("android/media/tv/tuner/frontend/IsdbtFrontendCapabilities");
jmethodID capsInit = env->GetMethodID(clazz, "<init>", "(IIIII)V");
jmethodID capsInit = env->GetMethodID(clazz, "<init>", "(IIIIIIZZ)V");
jint modeCap = caps.get<FrontendCapabilities::Tag::isdbtCaps>().modeCap;
jint bandwidthCap = caps.get<FrontendCapabilities::Tag::isdbtCaps>().bandwidthCap;
jint modulationCap = caps.get<FrontendCapabilities::Tag::isdbtCaps>().modulationCap;
jint coderateCap = caps.get<FrontendCapabilities::Tag::isdbtCaps>().coderateCap;
jint guardIntervalCap = caps.get<FrontendCapabilities::Tag::isdbtCaps>().guardIntervalCap;
jint timeInterleaveCap = caps.get<FrontendCapabilities::Tag::isdbtCaps>().timeInterleaveCap;
jboolean isSegmentAuto = caps.get<FrontendCapabilities::Tag::isdbtCaps>().isSegmentAuto;
jboolean isFullSegment = caps.get<FrontendCapabilities::Tag::isdbtCaps>().isFullSegment;
return env->NewObject(clazz, capsInit, modeCap, bandwidthCap, modulationCap, coderateCap,
guardIntervalCap);
guardIntervalCap, timeInterleaveCap, isSegmentAuto, isFullSegment);
}
jobject JTuner::getDtmbFrontendCaps(JNIEnv *env, FrontendCapabilities &caps) {
@@ -2336,6 +2345,13 @@ jobject JTuner::getFrontendStatus(jintArray types) {
valid = true;
break;
}
case FrontendInterleaveMode::Tag::isdbt: {
in[0] = static_cast<jint>(
interleaving.get<FrontendInterleaveMode::Tag::isdbt>());
env->SetIntArrayRegion(valObj, i, 1, in);
valid = true;
break;
}
default:
break;
}
@@ -2414,6 +2430,22 @@ jobject JTuner::getFrontendStatus(jintArray types) {
env->SetObjectField(statusObj, field, newBooleanObj);
break;
}
case FrontendStatus::Tag::isdbtMode: {
jfieldID field = env->GetFieldID(clazz, "mIsdbtMode", "Ljava/lang/Integer;");
jobject newIntegerObj =
env->NewObject(intClazz, initInt, s.get<FrontendStatus::Tag::isdbtMode>());
env->SetObjectField(statusObj, field, newIntegerObj);
break;
}
case FrontendStatus::Tag::partialReceptionFlag: {
jfieldID field =
env->GetFieldID(clazz, "mIsdbtPartialReceptionFlag", "Ljava/lang/Integer;");
jobject newIntegerObj =
env->NewObject(intClazz, initInt,
s.get<FrontendStatus::Tag::partialReceptionFlag>());
env->SetObjectField(statusObj, field, newIntegerObj);
break;
}
default: {
break;
}
@@ -2879,35 +2911,55 @@ static FrontendSettings getIsdbtFrontendSettings(JNIEnv *env, const jobject& set
int64_t endFreq = getFrontendSettingsEndFreq(env, settings);
FrontendSpectralInversion inversion = getFrontendSettingsSpectralInversion(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")));
FrontendIsdbtMode mode = static_cast<FrontendIsdbtMode>(
env->GetIntField(settings, env->GetFieldID(clazz, "mMode", "I")));
FrontendIsdbtGuardInterval guardInterval =
static_cast<FrontendIsdbtGuardInterval>(
env->GetIntField(settings, env->GetFieldID(clazz, "mGuardInterval", "I")));
int32_t serviceAreaId =
env->GetIntField(settings, env->GetFieldID(clazz, "mServiceAreaId", "I"));
FrontendIsdbtPartialReceptionFlag partialReceptionFlag =
static_cast<FrontendIsdbtPartialReceptionFlag>(
env->GetIntField(settings,
env->GetFieldID(clazz, "mPartialReceptionFlag", "I")));
FrontendIsdbtSettings frontendIsdbtSettings{
.frequency = freq,
.endFrequency = endFreq,
.modulation = modulation,
.bandwidth = bandwidth,
.mode = mode,
.coderate = coderate,
.guardInterval = guardInterval,
.serviceAreaId = serviceAreaId,
.inversion = inversion,
.partialReceptionFlag = partialReceptionFlag,
};
jobjectArray layerSettings = reinterpret_cast<jobjectArray>(
env->GetObjectField(settings,
env->GetFieldID(clazz, "mLayerSettings",
"[Landroid/media/tv/tuner/frontend/"
"IsdbtFrontendSettings$IsdbtLayerSettings;")));
int len = env->GetArrayLength(layerSettings);
jclass layerClazz = env->FindClass(
"android/media/tv/tuner/frontend/IsdbtFrontendSettings$IsdbtLayerSettings");
frontendIsdbtSettings.layerSettings.resize(len);
for (int i = 0; i < len; i++) {
jobject layer = env->GetObjectArrayElement(layerSettings, i);
frontendIsdbtSettings.layerSettings[i].modulation = static_cast<FrontendIsdbtModulation>(
env->GetIntField(layer, env->GetFieldID(layerClazz, "mModulation", "I")));
frontendIsdbtSettings.layerSettings[i].timeInterleave =
static_cast<FrontendIsdbtTimeInterleaveMode>(
env->GetIntField(layer,
env->GetFieldID(layerClazz, "mTimeInterleaveMode", "I")));
frontendIsdbtSettings.layerSettings[i].coderate = static_cast<FrontendIsdbtCoderate>(
env->GetIntField(layer, env->GetFieldID(layerClazz, "mCodeRate", "I")));
frontendIsdbtSettings.layerSettings[i].numOfSegment =
env->GetIntField(layer, env->GetFieldID(layerClazz, "mNumOfSegment", "I"));
}
frontendSettings.set<FrontendSettings::Tag::isdbt>(frontendIsdbtSettings);
return frontendSettings;
}