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( + env->GetIntField(settingsObj, env->GetFieldID(clazz, "mAudioStreamType", "I"))); + if (audioStreamType != AudioStreamType::UNDEFINED) { + type.audio(audioStreamType); + return true; + } + VideoStreamType videoStreamType = static_cast( + env->GetIntField(settingsObj, env->GetFieldID(clazz, "mVideoStreamType", "I"))); + if (videoStreamType != VideoStreamType::UNDEFINED) { + type.video(videoStreamType); + return true; + } + return false; +} + static DemuxFilterPesDataSettings getFilterPesDataSettings(JNIEnv *env, const jobject& settings) { jclass clazz = env->FindClass("android/media/tv/tuner/filter/PesSettings"); uint16_t streamId = static_cast( @@ -3810,6 +3838,16 @@ static jint copyData(JNIEnv *env, std::unique_ptr& mq, EventFlag* flag, jbyt return size; } +static bool isAvFilterSettings(DemuxFilterSettings filterSettings) { + return (filterSettings.getDiscriminator() == DemuxFilterSettings::hidl_discriminator::ts + && filterSettings.ts().filterSettings.getDiscriminator() + == DemuxTsFilterSettings::FilterSettings::hidl_discriminator::av) + || + (filterSettings.getDiscriminator() == DemuxFilterSettings::hidl_discriminator::mmtp + && filterSettings.mmtp().filterSettings.getDiscriminator() + == DemuxMmtpFilterSettings::FilterSettings::hidl_discriminator::av); +} + static jint android_media_tv_Tuner_configure_filter( JNIEnv *env, jobject filter, int type, int subtype, jobject settings) { ALOGD("configure filter type=%d, subtype=%d", type, subtype); @@ -3833,6 +3871,20 @@ static jint android_media_tv_Tuner_configure_filter( } } + AvStreamType streamType; + if (isAvFilterSettings(filterSettings) && getAvStreamType(env, settings, streamType)) { + sp<::android::hardware::tv::tuner::V1_1::IFilter> iFilterSp_1_1; + iFilterSp_1_1 = ::android::hardware::tv::tuner::V1_1::IFilter::castFrom(iFilterSp); + if (iFilterSp_1_1 != NULL) { + res = iFilterSp_1_1->configureAvStreamType(streamType); + } else { + ALOGW("configureAvStreamType is not supported with the current HAL implementation."); + } + if (res != Result::SUCCESS) { + return (jint) res; + } + } + MQDescriptorSync filterMQDesc; Result getQueueDescResult = Result::UNKNOWN_ERROR; if (filterSp->mFilterMQ == NULL) { diff --git a/non-updatable-api/system-current.txt b/non-updatable-api/system-current.txt index 93fdfba276dbd..3b6673509f36c 100644 --- a/non-updatable-api/system-current.txt +++ b/non-updatable-api/system-current.txt @@ -5150,12 +5150,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 {