• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2019 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.media.tv.tuner.frontend;
18 
19 import android.annotation.IntDef;
20 import android.annotation.IntRange;
21 import android.annotation.NonNull;
22 import android.annotation.SystemApi;
23 import android.hardware.tv.tuner.V1_0.Constants;
24 import android.media.tv.tuner.TunerVersionChecker;
25 import android.media.tv.tuner.frontend.FrontendSettings.FrontendSpectralInversion;
26 
27 import java.lang.annotation.Retention;
28 import java.lang.annotation.RetentionPolicy;
29 
30 /**
31  * Frontend settings for DVBC.
32  *
33  * @hide
34  */
35 @SystemApi
36 public class DvbcFrontendSettings extends FrontendSettings {
37 
38     /** @hide */
39     @IntDef(flag = true,
40             prefix = "MODULATION_",
41             value = {MODULATION_UNDEFINED, MODULATION_AUTO, MODULATION_MOD_16QAM,
42                     MODULATION_MOD_32QAM, MODULATION_MOD_64QAM, MODULATION_MOD_128QAM,
43                     MODULATION_MOD_256QAM})
44     @Retention(RetentionPolicy.SOURCE)
45     public @interface Modulation {}
46 
47     /**
48      * Modulation undefined.
49      */
50     public static final int MODULATION_UNDEFINED = Constants.FrontendDvbcModulation.UNDEFINED;
51     /**
52      * Hardware is able to detect and set modulation automatically
53      */
54     public static final int MODULATION_AUTO = Constants.FrontendDvbcModulation.AUTO;
55     /**
56      * 16QAM Modulation.
57      */
58     public static final int MODULATION_MOD_16QAM = Constants.FrontendDvbcModulation.MOD_16QAM;
59     /**
60      * 32QAM Modulation.
61      */
62     public static final int MODULATION_MOD_32QAM = Constants.FrontendDvbcModulation.MOD_32QAM;
63     /**
64      * 64QAM Modulation.
65      */
66     public static final int MODULATION_MOD_64QAM = Constants.FrontendDvbcModulation.MOD_64QAM;
67     /**
68      * 128QAM Modulation.
69      */
70     public static final int MODULATION_MOD_128QAM = Constants.FrontendDvbcModulation.MOD_128QAM;
71     /**
72      * 256QAM Modulation.
73      */
74     public static final int MODULATION_MOD_256QAM = Constants.FrontendDvbcModulation.MOD_256QAM;
75 
76     /** @hide */
77     @Retention(RetentionPolicy.SOURCE)
78     @IntDef(prefix = "OUTER_FEC_",
79             value = {OUTER_FEC_UNDEFINED, OUTER_FEC_OUTER_FEC_NONE, OUTER_FEC_OUTER_FEC_RS})
80     public @interface OuterFec {}
81 
82     /**
83      * Outer Forward Error Correction (FEC) Type undefined.
84      */
85     public static final int OUTER_FEC_UNDEFINED = Constants.FrontendDvbcOuterFec.UNDEFINED;
86     /**
87      * None Outer Forward Error Correction (FEC) Type.
88      */
89     public static final int OUTER_FEC_OUTER_FEC_NONE =
90             Constants.FrontendDvbcOuterFec.OUTER_FEC_NONE;
91     /**
92      * RS Outer Forward Error Correction (FEC) Type.
93      */
94     public static final int OUTER_FEC_OUTER_FEC_RS = Constants.FrontendDvbcOuterFec.OUTER_FEC_RS;
95 
96 
97     /** @hide */
98     @IntDef(flag = true,
99             prefix = "ANNEX_",
100             value = {ANNEX_UNDEFINED, ANNEX_A, ANNEX_B, ANNEX_C})
101     @Retention(RetentionPolicy.SOURCE)
102     public @interface Annex {}
103 
104     /**
105      * Annex Type undefined.
106      */
107     public static final int ANNEX_UNDEFINED = Constants.FrontendDvbcAnnex.UNDEFINED;
108     /**
109      * Annex Type A.
110      */
111     public static final int ANNEX_A = Constants.FrontendDvbcAnnex.A;
112     /**
113      * Annex Type B.
114      */
115     public static final int ANNEX_B = Constants.FrontendDvbcAnnex.B;
116     /**
117      * Annex Type C.
118      */
119     public static final int ANNEX_C = Constants.FrontendDvbcAnnex.C;
120 
121 
122     /**
123      * @deprecated Use the {@code FrontendSpectralInversion} instead.
124      * @hide
125      */
126     @Deprecated
127     @IntDef(prefix = "SPECTRAL_INVERSION_",
128             value = {SPECTRAL_INVERSION_UNDEFINED, SPECTRAL_INVERSION_NORMAL,
129                     SPECTRAL_INVERSION_INVERTED})
130     @Retention(RetentionPolicy.SOURCE)
131     public @interface SpectralInversion {}
132 
133     /**
134      * Spectral Inversion Type undefined.
135      *
136      * @deprecated Use the {@link FrontendSettings#FRONTEND_SPECTRAL_INVERSION_UNDEFINED} instead.
137      */
138     @Deprecated
139     public static final int SPECTRAL_INVERSION_UNDEFINED =
140             Constants.FrontendDvbcSpectralInversion.UNDEFINED;
141     /**
142      * Normal Spectral Inversion.
143      *
144      * @deprecated Use the {@link FrontendSettings#FRONTEND_SPECTRAL_INVERSION_NORMAL} instead.
145      */
146     @Deprecated
147     public static final int SPECTRAL_INVERSION_NORMAL =
148             Constants.FrontendDvbcSpectralInversion.NORMAL;
149     /**
150      * Inverted Spectral Inversion.
151      *
152      * @deprecated Use the {@link FrontendSettings#FRONTEND_SPECTRAL_INVERSION_INVERTED} instead.
153      */
154     @Deprecated
155     public static final int SPECTRAL_INVERSION_INVERTED =
156             Constants.FrontendDvbcSpectralInversion.INVERTED;
157 
158     /** @hide */
159     @IntDef(flag = true,
160             prefix = "TIME_INTERLEAVE_MODE_",
161             value = {TIME_INTERLEAVE_MODE_UNDEFINED, TIME_INTERLEAVE_MODE_AUTO,
162                     TIME_INTERLEAVE_MODE_128_1_0, TIME_INTERLEAVE_MODE_128_1_1,
163                     TIME_INTERLEAVE_MODE_64_2, TIME_INTERLEAVE_MODE_32_4,
164                     TIME_INTERLEAVE_MODE_16_8, TIME_INTERLEAVE_MODE_8_16,
165                     TIME_INTERLEAVE_MODE_128_2, TIME_INTERLEAVE_MODE_128_3,
166                     TIME_INTERLEAVE_MODE_128_4})
167     @Retention(RetentionPolicy.SOURCE)
168     public @interface TimeInterleaveMode {}
169 
170     /**
171      * Time interleave mode undefined.
172      */
173     public static final int TIME_INTERLEAVE_MODE_UNDEFINED =
174             android.hardware.tv.tuner.V1_1.Constants.FrontendCableTimeInterleaveMode.UNDEFINED;
175     /**
176      * Hardware is able to detect and set Time Interleave Mode automatically.
177      */
178     public static final int TIME_INTERLEAVE_MODE_AUTO =
179             android.hardware.tv.tuner.V1_1.Constants.FrontendCableTimeInterleaveMode.AUTO;
180     /**
181      * 128/1/0 Time Interleave Mode.
182      */
183     public static final int TIME_INTERLEAVE_MODE_128_1_0 = android.hardware.tv.tuner.V1_1.Constants
184             .FrontendCableTimeInterleaveMode.INTERLEAVING_128_1_0;
185     /**
186      * 128/1/1 Time Interleave Mode.
187      */
188     public static final int TIME_INTERLEAVE_MODE_128_1_1 = android.hardware.tv.tuner.V1_1.Constants
189             .FrontendCableTimeInterleaveMode.INTERLEAVING_128_1_1;
190     /**
191      * 64/2 Time Interleave Mode.
192      */
193     public static final int TIME_INTERLEAVE_MODE_64_2 = android.hardware.tv.tuner.V1_1.Constants
194             .FrontendCableTimeInterleaveMode.INTERLEAVING_64_2;
195     /**
196      * 32/4 Time Interleave Mode.
197      */
198     public static final int TIME_INTERLEAVE_MODE_32_4 = android.hardware.tv.tuner.V1_1.Constants
199             .FrontendCableTimeInterleaveMode.INTERLEAVING_32_4;
200     /**
201      * 16/8 Time Interleave Mode.
202      */
203     public static final int TIME_INTERLEAVE_MODE_16_8 = android.hardware.tv.tuner.V1_1.Constants
204             .FrontendCableTimeInterleaveMode.INTERLEAVING_16_8;
205     /**
206      * 8/16 Time Interleave Mode.
207      */
208     public static final int TIME_INTERLEAVE_MODE_8_16 = android.hardware.tv.tuner.V1_1.Constants
209             .FrontendCableTimeInterleaveMode.INTERLEAVING_8_16;
210     /**
211      * 128/2 Time Interleave Mode.
212      */
213     public static final int TIME_INTERLEAVE_MODE_128_2 = android.hardware.tv.tuner.V1_1.Constants
214             .FrontendCableTimeInterleaveMode.INTERLEAVING_128_2;
215     /**
216      * 128/3 Time Interleave Mode.
217      */
218     public static final int TIME_INTERLEAVE_MODE_128_3 = android.hardware.tv.tuner.V1_1.Constants
219             .FrontendCableTimeInterleaveMode.INTERLEAVING_128_3;
220     /**
221      * 128/4 Time Interleave Mode.
222      */
223     public static final int TIME_INTERLEAVE_MODE_128_4 = android.hardware.tv.tuner.V1_1.Constants
224             .FrontendCableTimeInterleaveMode.INTERLEAVING_128_4;
225 
226     /** @hide */
227     @IntDef(flag = true,
228             prefix = "BANDWIDTH_",
229             value = {BANDWIDTH_UNDEFINED, BANDWIDTH_5MHZ, BANDWIDTH_6MHZ, BANDWIDTH_7MHZ,
230                     BANDWIDTH_8MHZ})
231     @Retention(RetentionPolicy.SOURCE)
232     public @interface Bandwidth {}
233 
234     /**
235      * Bandwidth undefined.
236      */
237     public static final int BANDWIDTH_UNDEFINED =
238             android.hardware.tv.tuner.V1_1.Constants.FrontendDvbcBandwidth.UNDEFINED;
239     /**
240      * 5 MHz bandwidth.
241      */
242     public static final int BANDWIDTH_5MHZ =
243             android.hardware.tv.tuner.V1_1.Constants.FrontendDvbcBandwidth.BANDWIDTH_5MHZ;
244     /**
245      * 6 MHz bandwidth.
246      */
247     public static final int BANDWIDTH_6MHZ =
248             android.hardware.tv.tuner.V1_1.Constants.FrontendDvbcBandwidth.BANDWIDTH_6MHZ;
249     /**
250      * 7 MHz bandwidth.
251      */
252     public static final int BANDWIDTH_7MHZ =
253             android.hardware.tv.tuner.V1_1.Constants.FrontendDvbcBandwidth.BANDWIDTH_7MHZ;
254     /**
255      * 8 MHz bandwidth.
256      */
257     public static final int BANDWIDTH_8MHZ =
258             android.hardware.tv.tuner.V1_1.Constants.FrontendDvbcBandwidth.BANDWIDTH_8MHZ;
259 
260 
261     private final int mModulation;
262     private final long mInnerFec;
263     private final int mSymbolRate;
264     private final int mOuterFec;
265     private final int mAnnex;
266     private final int mSpectralInversion;
267     // Dvbc time interleave mode is only supported in Tuner 1.1 or higher.
268     private final int mInterleaveMode;
269     // Dvbc bandwidth is only supported in Tuner 1.1 or higher.
270     private final int mBandwidth;
271 
DvbcFrontendSettings(int frequency, int modulation, long innerFec, int symbolRate, int outerFec, int annex, int spectralInversion, int interleaveMode, int bandwidth)272     private DvbcFrontendSettings(int frequency, int modulation, long innerFec, int symbolRate,
273             int outerFec, int annex, int spectralInversion, int interleaveMode, int bandwidth) {
274         super(frequency);
275         mModulation = modulation;
276         mInnerFec = innerFec;
277         mSymbolRate = symbolRate;
278         mOuterFec = outerFec;
279         mAnnex = annex;
280         mSpectralInversion = spectralInversion;
281         mInterleaveMode = interleaveMode;
282         mBandwidth = bandwidth;
283     }
284 
285     /**
286      * Gets Modulation.
287      */
288     @Modulation
getModulation()289     public int getModulation() {
290         return mModulation;
291     }
292     /**
293      * Gets Inner Forward Error Correction.
294      */
295     @InnerFec
getInnerFec()296     public long getInnerFec() {
297         return mInnerFec;
298     }
299     /**
300      * Gets Symbol Rate in symbols per second.
301      */
getSymbolRate()302     public int getSymbolRate() {
303         return mSymbolRate;
304     }
305     /**
306      * Gets Outer Forward Error Correction.
307      */
308     @OuterFec
getOuterFec()309     public int getOuterFec() {
310         return mOuterFec;
311     }
312     /**
313      * Gets Annex.
314      */
315     @Annex
getAnnex()316     public int getAnnex() {
317         return mAnnex;
318     }
319     /**
320      * Gets Spectral Inversion.
321      */
322     @FrontendSpectralInversion
getSpectralInversion()323     public int getSpectralInversion() {
324         return mSpectralInversion;
325     }
326     /**
327      * Gets Time Interleave Mode.
328      */
329     @TimeInterleaveMode
getTimeInterleaveMode()330     public int getTimeInterleaveMode() {
331         return mInterleaveMode;
332     }
333     /**
334      * Gets Bandwidth.
335      */
336     @Bandwidth
getBandwidth()337     public int getBandwidth() {
338         return mBandwidth;
339     }
340 
341     /**
342      * Creates a builder for {@link DvbcFrontendSettings}.
343      */
344     @NonNull
builder()345     public static Builder builder() {
346         return new Builder();
347     }
348 
349     /**
350      * Builder for {@link DvbcFrontendSettings}.
351      */
352     public static class Builder {
353         private int mFrequency = 0;
354         private int mModulation = MODULATION_UNDEFINED;
355         private long mInnerFec = FEC_UNDEFINED;
356         private int mSymbolRate = 0;
357         private int mOuterFec = OUTER_FEC_UNDEFINED;
358         private int mAnnex = ANNEX_UNDEFINED;
359         private int mSpectralInversion = FrontendSettings.FRONTEND_SPECTRAL_INVERSION_UNDEFINED;
360         private int mInterleaveMode = TIME_INTERLEAVE_MODE_UNDEFINED;
361         private int mBandwidth = BANDWIDTH_UNDEFINED;
362 
Builder()363         private Builder() {
364         }
365 
366         /**
367          * Sets frequency in Hz.
368          *
369          * <p>Default value is 0.
370          */
371         @NonNull
372         @IntRange(from = 1)
setFrequency(int frequency)373         public Builder setFrequency(int frequency) {
374             mFrequency = frequency;
375             return this;
376         }
377 
378         /**
379          * Sets Modulation.
380          *
381          * <p>Default value is {@link #MODULATION_UNDEFINED}.
382          */
383         @NonNull
setModulation(@odulation int modulation)384         public Builder setModulation(@Modulation int modulation) {
385             mModulation = modulation;
386             return this;
387         }
388         /**
389          * Sets Inner Forward Error Correction.
390          *
391          * <p>Default value is {@link #FEC_UNDEFINED}.
392          */
393         @NonNull
setInnerFec(@nnerFec long fec)394         public Builder setInnerFec(@InnerFec long fec) {
395             mInnerFec = fec;
396             return this;
397         }
398         /**
399          * Sets Symbol Rate in symbols per second.
400          *
401          * <p>Default value is 0.
402          */
403         @NonNull
setSymbolRate(int symbolRate)404         public Builder setSymbolRate(int symbolRate) {
405             mSymbolRate = symbolRate;
406             return this;
407         }
408         /**
409          * Sets Outer Forward Error Correction.
410          *
411          * <p>Default value is {@link #OUTER_FEC_UNDEFINED}.
412          */
413         @NonNull
setOuterFec(@uterFec int outerFec)414         public Builder setOuterFec(@OuterFec int outerFec) {
415             mOuterFec = outerFec;
416             return this;
417         }
418         /**
419          * Sets Annex.
420          *
421          * <p>Default value is {@link #ANNEX_UNDEFINED}.
422          */
423         @NonNull
setAnnex(@nnex int annex)424         public Builder setAnnex(@Annex int annex) {
425             mAnnex = annex;
426             return this;
427         }
428         /**
429          * Sets Spectral Inversion.
430          *
431          * <p>Default value is {@link FrontendSettings#FRONTEND_SPECTRAL_INVERSION_UNDEFINED}.
432          */
433         @NonNull
setSpectralInversion(@rontendSpectralInversion int spectralInversion)434         public Builder setSpectralInversion(@FrontendSpectralInversion int spectralInversion) {
435             mSpectralInversion = spectralInversion;
436             return this;
437         }
438         /**
439          * Set the time interleave mode.
440          *
441          * <p>This API is only supported by Tuner HAL 1.1 or higher. Unsupported version would cause
442          * no-op. Use {@link TunerVersionChecker#getTunerVersion()} to check the version.
443          *
444          * @param interleaveMode the value to set as the time interleave mode. Default value is
445          * {@link #TIME_INTERLEAVE_MODE_UNDEFINED}.
446          */
447         @NonNull
setTimeInterleaveMode(@imeInterleaveMode int interleaveMode)448         public Builder setTimeInterleaveMode(@TimeInterleaveMode int interleaveMode) {
449             if (TunerVersionChecker.checkHigherOrEqualVersionTo(
450                         TunerVersionChecker.TUNER_VERSION_1_1, "setTimeInterleaveMode")) {
451                 mInterleaveMode = interleaveMode;
452             }
453             return this;
454         }
455         /**
456          * Set the Bandwidth.
457          *
458          * <p>This API is only supported by Tuner HAL 1.1 or higher. Unsupported version would cause
459          * no-op. Use {@link TunerVersionChecker#getTunerVersion()} to check the version.
460          *
461          * @param bandwidth the value to set as the bandwidth. Default value is
462          * {@link #BANDWIDTH_UNDEFINED}.
463          */
464         @NonNull
setBandwidth(@andwidth int bandwidth)465         public Builder setBandwidth(@Bandwidth int bandwidth) {
466             if (TunerVersionChecker.checkHigherOrEqualVersionTo(
467                         TunerVersionChecker.TUNER_VERSION_1_1, "setBandwidth")) {
468                 mBandwidth = bandwidth;
469             }
470             return this;
471         }
472 
473         /**
474          * Builds a {@link DvbcFrontendSettings} object.
475          */
476         @NonNull
build()477         public DvbcFrontendSettings build() {
478             return new DvbcFrontendSettings(mFrequency, mModulation, mInnerFec, mSymbolRate,
479                 mOuterFec, mAnnex, mSpectralInversion, mInterleaveMode, mBandwidth);
480         }
481     }
482 
483     @Override
getType()484     public int getType() {
485         return FrontendSettings.TYPE_DVBC;
486     }
487 }
488