diff --git a/api/system-current.txt b/api/system-current.txt index 6ce471adcb462..1da8c29996f92 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -5210,12 +5210,45 @@ package android.media.tv.tuner.filter { public class AvSettings extends android.media.tv.tuner.filter.Settings { method @NonNull public static android.media.tv.tuner.filter.AvSettings.Builder builder(int, boolean); + method public int getAudioStreamType(); + method public int getVideoStreamType(); method public boolean isPassthrough(); + field public static final int AUDIO_STREAM_TYPE_AAC = 6; // 0x6 + field public static final int AUDIO_STREAM_TYPE_AC3 = 7; // 0x7 + field public static final int AUDIO_STREAM_TYPE_AC4 = 9; // 0x9 + field public static final int AUDIO_STREAM_TYPE_DRA = 15; // 0xf + field public static final int AUDIO_STREAM_TYPE_DTS = 10; // 0xa + field public static final int AUDIO_STREAM_TYPE_DTS_HD = 11; // 0xb + field public static final int AUDIO_STREAM_TYPE_EAC3 = 8; // 0x8 + field public static final int AUDIO_STREAM_TYPE_MP3 = 2; // 0x2 + field public static final int AUDIO_STREAM_TYPE_MPEG1 = 3; // 0x3 + field public static final int AUDIO_STREAM_TYPE_MPEG2 = 4; // 0x4 + field public static final int AUDIO_STREAM_TYPE_MPEGH = 5; // 0x5 + field public static final int AUDIO_STREAM_TYPE_OPUS = 13; // 0xd + field public static final int AUDIO_STREAM_TYPE_PCM = 1; // 0x1 + field public static final int AUDIO_STREAM_TYPE_UNDEFINED = 0; // 0x0 + field public static final int AUDIO_STREAM_TYPE_VORBIS = 14; // 0xe + field public static final int AUDIO_STREAM_TYPE_WMA = 12; // 0xc + field public static final int VIDEO_STREAM_TYPE_AV1 = 10; // 0xa + field public static final int VIDEO_STREAM_TYPE_AVC = 5; // 0x5 + field public static final int VIDEO_STREAM_TYPE_AVS = 11; // 0xb + field public static final int VIDEO_STREAM_TYPE_AVS2 = 12; // 0xc + field public static final int VIDEO_STREAM_TYPE_HEVC = 6; // 0x6 + field public static final int VIDEO_STREAM_TYPE_MPEG1 = 2; // 0x2 + field public static final int VIDEO_STREAM_TYPE_MPEG2 = 3; // 0x3 + field public static final int VIDEO_STREAM_TYPE_MPEG4P2 = 4; // 0x4 + field public static final int VIDEO_STREAM_TYPE_RESERVED = 1; // 0x1 + field public static final int VIDEO_STREAM_TYPE_UNDEFINED = 0; // 0x0 + field public static final int VIDEO_STREAM_TYPE_VC1 = 7; // 0x7 + field public static final int VIDEO_STREAM_TYPE_VP8 = 8; // 0x8 + field public static final int VIDEO_STREAM_TYPE_VP9 = 9; // 0x9 } public static class AvSettings.Builder { method @NonNull public android.media.tv.tuner.filter.AvSettings build(); + method @NonNull public android.media.tv.tuner.filter.AvSettings.Builder setAudioStreamType(int); method @NonNull public android.media.tv.tuner.filter.AvSettings.Builder setPassthrough(boolean); + method @NonNull public android.media.tv.tuner.filter.AvSettings.Builder setVideoStreamType(int); } public class DownloadEvent extends android.media.tv.tuner.filter.FilterEvent { diff --git a/media/java/android/media/tv/tuner/filter/AvSettings.java b/media/java/android/media/tv/tuner/filter/AvSettings.java index e9b3660ab12f5..5d9d53174b3ee 100644 --- a/media/java/android/media/tv/tuner/filter/AvSettings.java +++ b/media/java/android/media/tv/tuner/filter/AvSettings.java @@ -16,9 +16,15 @@ package android.media.tv.tuner.filter; +import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.SystemApi; +import android.hardware.tv.tuner.V1_1.Constants; import android.media.tv.tuner.TunerUtils; +import android.media.tv.tuner.TunerVersionChecker; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; /** * Filter Settings for a Video and Audio. @@ -27,15 +33,160 @@ import android.media.tv.tuner.TunerUtils; */ @SystemApi public class AvSettings extends Settings { - private final boolean mIsPassthrough; + /** @hide */ + @IntDef(prefix = "VIDEO_STREAM_TYPE_", + value = {VIDEO_STREAM_TYPE_UNDEFINED, VIDEO_STREAM_TYPE_RESERVED, + VIDEO_STREAM_TYPE_MPEG1, VIDEO_STREAM_TYPE_MPEG2, + VIDEO_STREAM_TYPE_MPEG4P2, VIDEO_STREAM_TYPE_AVC, VIDEO_STREAM_TYPE_HEVC, + VIDEO_STREAM_TYPE_VC1, VIDEO_STREAM_TYPE_VP8, VIDEO_STREAM_TYPE_VP9, + VIDEO_STREAM_TYPE_AV1, VIDEO_STREAM_TYPE_AVS, VIDEO_STREAM_TYPE_AVS2}) + @Retention(RetentionPolicy.SOURCE) + public @interface VideoStreamType {} - private AvSettings(int mainType, boolean isAudio, boolean isPassthrough) { + /* + * Undefined Video stream type + */ + public static final int VIDEO_STREAM_TYPE_UNDEFINED = Constants.VideoStreamType.UNDEFINED; + /* + * ITU-T | ISO/IEC Reserved + */ + public static final int VIDEO_STREAM_TYPE_RESERVED = Constants.VideoStreamType.RESERVED; + /* + * ISO/IEC 11172 + */ + public static final int VIDEO_STREAM_TYPE_MPEG1 = Constants.VideoStreamType.MPEG1; + /* + * ITU-T Rec.H.262 and ISO/IEC 13818-2 + */ + public static final int VIDEO_STREAM_TYPE_MPEG2 = Constants.VideoStreamType.MPEG2; + /* + * ISO/IEC 14496-2 (MPEG-4 H.263 based video) + */ + public static final int VIDEO_STREAM_TYPE_MPEG4P2 = Constants.VideoStreamType.MPEG4P2; + /* + * ITU-T Rec.H.264 and ISO/IEC 14496-10 + */ + public static final int VIDEO_STREAM_TYPE_AVC = Constants.VideoStreamType.AVC; + /* + * ITU-T Rec. H.265 and ISO/IEC 23008-2 + */ + public static final int VIDEO_STREAM_TYPE_HEVC = Constants.VideoStreamType.HEVC; + /* + * Microsoft VC.1 + */ + public static final int VIDEO_STREAM_TYPE_VC1 = Constants.VideoStreamType.VC1; + /* + * Google VP8 + */ + public static final int VIDEO_STREAM_TYPE_VP8 = Constants.VideoStreamType.VP8; + /* + * Google VP9 + */ + public static final int VIDEO_STREAM_TYPE_VP9 = Constants.VideoStreamType.VP9; + /* + * AOMedia Video 1 + */ + public static final int VIDEO_STREAM_TYPE_AV1 = Constants.VideoStreamType.AV1; + /* + * Chinese Standard + */ + public static final int VIDEO_STREAM_TYPE_AVS = Constants.VideoStreamType.AVS; + /* + * New Chinese Standard + */ + public static final int VIDEO_STREAM_TYPE_AVS2 = Constants.VideoStreamType.AVS2; + + /** @hide */ + @IntDef(prefix = "AUDIO_STREAM_TYPE_", + value = {AUDIO_STREAM_TYPE_UNDEFINED, AUDIO_STREAM_TYPE_PCM, AUDIO_STREAM_TYPE_MP3, + AUDIO_STREAM_TYPE_MPEG1, AUDIO_STREAM_TYPE_MPEG2, AUDIO_STREAM_TYPE_MPEGH, + AUDIO_STREAM_TYPE_AAC, AUDIO_STREAM_TYPE_AC3, AUDIO_STREAM_TYPE_EAC3, + AUDIO_STREAM_TYPE_AC4, AUDIO_STREAM_TYPE_DTS, AUDIO_STREAM_TYPE_DTS_HD, + AUDIO_STREAM_TYPE_WMA, AUDIO_STREAM_TYPE_OPUS, AUDIO_STREAM_TYPE_VORBIS, + AUDIO_STREAM_TYPE_DRA}) + @Retention(RetentionPolicy.SOURCE) + public @interface AudioStreamType {} + + /* + * Undefined Audio stream type + */ + public static final int AUDIO_STREAM_TYPE_UNDEFINED = Constants.AudioStreamType.UNDEFINED; + /* + * Uncompressed Audio + */ + public static final int AUDIO_STREAM_TYPE_PCM = Constants.AudioStreamType.PCM; + /* + * MPEG Audio Layer III versions + */ + public static final int AUDIO_STREAM_TYPE_MP3 = Constants.AudioStreamType.MP3; + /* + * ISO/IEC 11172 Audio + */ + public static final int AUDIO_STREAM_TYPE_MPEG1 = Constants.AudioStreamType.MPEG1; + /* + * ISO/IEC 13818-3 + */ + public static final int AUDIO_STREAM_TYPE_MPEG2 = Constants.AudioStreamType.MPEG2; + /* + * ISO/IEC 23008-3 (MPEG-H Part 3) + */ + public static final int AUDIO_STREAM_TYPE_MPEGH = Constants.AudioStreamType.MPEGH; + /* + * ISO/IEC 14496-3 + */ + public static final int AUDIO_STREAM_TYPE_AAC = Constants.AudioStreamType.AAC; + /* + * Dolby Digital + */ + public static final int AUDIO_STREAM_TYPE_AC3 = Constants.AudioStreamType.AC3; + /* + * Dolby Digital Plus + */ + public static final int AUDIO_STREAM_TYPE_EAC3 = Constants.AudioStreamType.EAC3; + /* + * Dolby AC-4 + */ + public static final int AUDIO_STREAM_TYPE_AC4 = Constants.AudioStreamType.AC4; + /* + * Basic DTS + */ + public static final int AUDIO_STREAM_TYPE_DTS = Constants.AudioStreamType.DTS; + /* + * High Resolution DTS + */ + public static final int AUDIO_STREAM_TYPE_DTS_HD = Constants.AudioStreamType.DTS_HD; + /* + * Windows Media Audio + */ + public static final int AUDIO_STREAM_TYPE_WMA = Constants.AudioStreamType.WMA; + /* + * Opus Interactive Audio Codec + */ + public static final int AUDIO_STREAM_TYPE_OPUS = Constants.AudioStreamType.OPUS; + /* + * VORBIS Interactive Audio Codec + */ + public static final int AUDIO_STREAM_TYPE_VORBIS = Constants.AudioStreamType.VORBIS; + /* + * SJ/T 11368-2006 + */ + public static final int AUDIO_STREAM_TYPE_DRA = Constants.AudioStreamType.DRA; + + + private final boolean mIsPassthrough; + private int mAudioStreamType = AUDIO_STREAM_TYPE_UNDEFINED; + private int mVideoStreamType = VIDEO_STREAM_TYPE_UNDEFINED; + + private AvSettings(int mainType, boolean isAudio, boolean isPassthrough, + int audioStreamType, int videoStreamType) { super(TunerUtils.getFilterSubtype( mainType, isAudio ? Filter.SUBTYPE_AUDIO : Filter.SUBTYPE_VIDEO)); mIsPassthrough = isPassthrough; + mAudioStreamType = audioStreamType; + mVideoStreamType = videoStreamType; } /** @@ -45,6 +196,20 @@ public class AvSettings extends Settings { return mIsPassthrough; } + /** + * Get the Audio Stream Type. + */ + public int getAudioStreamType() { + return mAudioStreamType; + } + + /** + * Get the Video Stream Type. + */ + public int getVideoStreamType() { + return mVideoStreamType; + } + /** * Creates a builder for {@link AvSettings}. * @@ -63,6 +228,8 @@ public class AvSettings extends Settings { private final int mMainType; private final boolean mIsAudio; private boolean mIsPassthrough; + private int mAudioStreamType = AUDIO_STREAM_TYPE_UNDEFINED; + private int mVideoStreamType = VIDEO_STREAM_TYPE_UNDEFINED; private Builder(int mainType, boolean isAudio) { mMainType = mainType; @@ -78,12 +245,49 @@ public class AvSettings extends Settings { return this; } + /** + * Sets the Audio Stream Type. + * + *
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. + * + * @param audioStreamType the {@link AudioStreamType} to set. + */ + @NonNull + public Builder setAudioStreamType(@AudioStreamType int audioStreamType) { + if (TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_1_1, "setAudioStreamType") && mIsAudio) { + mAudioStreamType = audioStreamType; + mVideoStreamType = VIDEO_STREAM_TYPE_UNDEFINED; + } + return this; + } + + /** + * Sets the Video Stream Type. + * + *
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.
+ *
+ * @param videoStreamType the {@link VideoStreamType} to set.
+ */
+ @NonNull
+ public Builder setVideoStreamType(@VideoStreamType int videoStreamType) {
+ if (TunerVersionChecker.checkHigherOrEqualVersionTo(
+ TunerVersionChecker.TUNER_VERSION_1_1, "setVideoStreamType") && !mIsAudio) {
+ mVideoStreamType = videoStreamType;
+ mAudioStreamType = AUDIO_STREAM_TYPE_UNDEFINED;
+ }
+ return this;
+ }
+
/**
* Builds a {@link AvSettings} object.
*/
@NonNull
public AvSettings build() {
- return new AvSettings(mMainType, mIsAudio, mIsPassthrough);
+ return new AvSettings(mMainType, mIsAudio, mIsPassthrough,
+ mAudioStreamType, mVideoStreamType);
}
}
}
diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp
index 29e19ea406f06..1be0d4439e693 100644
--- a/media/jni/android_media_tv_Tuner.cpp
+++ b/media/jni/android_media_tv_Tuner.cpp
@@ -132,6 +132,8 @@ using ::android::hardware::tv::tuner::V1_0::LnbTone;
using ::android::hardware::tv::tuner::V1_0::LnbVoltage;
using ::android::hardware::tv::tuner::V1_0::PlaybackSettings;
using ::android::hardware::tv::tuner::V1_0::RecordSettings;
+using ::android::hardware::tv::tuner::V1_1::AudioStreamType;
+using ::android::hardware::tv::tuner::V1_1::AvStreamType;
using ::android::hardware::tv::tuner::V1_1::Constant;
using ::android::hardware::tv::tuner::V1_1::Constant64Bit;
using ::android::hardware::tv::tuner::V1_1::FrontendAnalogAftFlag;
@@ -157,6 +159,7 @@ 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;
+using ::android::hardware::tv::tuner::V1_1::VideoStreamType;
struct fields_t {
jfieldID tunerContext;
@@ -3488,6 +3491,31 @@ static DemuxFilterAvSettings getFilterAvSettings(JNIEnv *env, const jobject& set
return filterAvSettings;
}
+static bool getAvStreamType(JNIEnv *env, jobject filterConfigObj, AvStreamType& type) {
+ jobject settingsObj =
+ env->GetObjectField(
+ filterConfigObj,
+ env->GetFieldID(
+ env->FindClass("android/media/tv/tuner/filter/FilterConfiguration"),
+ "mSettings",
+ "Landroid/media/tv/tuner/filter/Settings;"));
+ jclass clazz = env->FindClass("android/media/tv/tuner/filter/AvSettings");
+ AvStreamType streamType;
+ AudioStreamType audioStreamType = static_cast