From de5715ea6f7c9e1e1492d76e9aedd87f124c2a7a Mon Sep 17 00:00:00 2001 From: Amy Zhang Date: Wed, 2 Sep 2020 21:24:22 -0700 Subject: [PATCH] Add context id setter in the IpFilterConfiguration Test: make dist Bug: 153595125 Change-Id: Ie949ea0c108cb020f028cf0ce24020235762d0cb --- api/system-current.txt | 3 ++ .../tuner/filter/IpFilterConfiguration.java | 40 +++++++++++++++++-- media/jni/android_media_tv_Tuner.cpp | 30 ++++++++++++++ non-updatable-api/system-current.txt | 3 ++ 4 files changed, 73 insertions(+), 3 deletions(-) diff --git a/api/system-current.txt b/api/system-current.txt index 2e53058f96d25..5e10e74deedd8 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -5265,16 +5265,19 @@ package android.media.tv.tuner.filter { method @NonNull public static android.media.tv.tuner.filter.IpFilterConfiguration.Builder builder(); method @NonNull @Size(min=4, max=16) public byte[] getDstIpAddress(); method public int getDstPort(); + method public int getIpFilterContextId(); method @NonNull @Size(min=4, max=16) public byte[] getSrcIpAddress(); method public int getSrcPort(); method public int getType(); method public boolean isPassthrough(); + field public static final int INVALID_IP_FILTER_CONTEXT_ID = -1; // 0xffffffff } public static final class IpFilterConfiguration.Builder { method @NonNull public android.media.tv.tuner.filter.IpFilterConfiguration build(); method @NonNull public android.media.tv.tuner.filter.IpFilterConfiguration.Builder setDstIpAddress(@NonNull byte[]); method @NonNull public android.media.tv.tuner.filter.IpFilterConfiguration.Builder setDstPort(int); + method @NonNull public android.media.tv.tuner.filter.IpFilterConfiguration.Builder setIpFilterContextId(int); method @NonNull public android.media.tv.tuner.filter.IpFilterConfiguration.Builder setPassthrough(boolean); method @NonNull public android.media.tv.tuner.filter.IpFilterConfiguration.Builder setSettings(@Nullable android.media.tv.tuner.filter.Settings); method @NonNull public android.media.tv.tuner.filter.IpFilterConfiguration.Builder setSrcIpAddress(@NonNull byte[]); diff --git a/media/java/android/media/tv/tuner/filter/IpFilterConfiguration.java b/media/java/android/media/tv/tuner/filter/IpFilterConfiguration.java index f54b686304c10..2649fcf5a6423 100644 --- a/media/java/android/media/tv/tuner/filter/IpFilterConfiguration.java +++ b/media/java/android/media/tv/tuner/filter/IpFilterConfiguration.java @@ -20,6 +20,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Size; import android.annotation.SystemApi; +import android.media.tv.tuner.TunerVersionChecker; /** * Filter configuration for a IP filter. @@ -28,20 +29,28 @@ import android.annotation.SystemApi; */ @SystemApi public final class IpFilterConfiguration extends FilterConfiguration { + /** + * Undefined filter type. + */ + public static final int INVALID_IP_FILTER_CONTEXT_ID = + android.hardware.tv.tuner.V1_1.Constants.Constant.INVALID_IP_FILTER_CONTEXT_ID; + private final byte[] mSrcIpAddress; private final byte[] mDstIpAddress; private final int mSrcPort; private final int mDstPort; private final boolean mPassthrough; + private final int mIpFilterContextId; private IpFilterConfiguration(Settings settings, byte[] srcAddr, byte[] dstAddr, int srcPort, - int dstPort, boolean passthrough) { + int dstPort, boolean passthrough, int ipCid) { super(settings); mSrcIpAddress = srcAddr; mDstIpAddress = dstAddr; mSrcPort = srcPort; mDstPort = dstPort; mPassthrough = passthrough; + mIpFilterContextId = ipCid; } @Override @@ -86,6 +95,15 @@ public final class IpFilterConfiguration extends FilterConfiguration { public boolean isPassthrough() { return mPassthrough; } + /** + * Gets the ip filter context id. Default value is {@link #INVALID_IP_FILTER_CONTEXT_ID}. + * + *

This API is only supported by Tuner HAL 1.1 or higher. Unsupported version would return + * default value. Use {@link TunerVersionChecker.getTunerVersion()} to check the version. + */ + public int getIpFilterContextId() { + return mIpFilterContextId; + } /** * Creates a builder for {@link IpFilterConfiguration}. @@ -105,6 +123,7 @@ public final class IpFilterConfiguration extends FilterConfiguration { private int mDstPort = 0; private boolean mPassthrough = false; private Settings mSettings; + private int mIpCid = INVALID_IP_FILTER_CONTEXT_ID; private Builder() { } @@ -169,6 +188,21 @@ public final class IpFilterConfiguration extends FilterConfiguration { return this; } + /** + * Sets the ip filter context id. Default value is {@link #INVALID_IP_FILTER_CONTEXT_ID}. + * + *

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 setIpFilterContextId(int ipContextId) { + if (TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_1_1, "setIpFilterContextId")) { + mIpCid = ipContextId; + } + return this; + } + /** * Builds a {@link IpFilterConfiguration} object. */ @@ -180,8 +214,8 @@ public final class IpFilterConfiguration extends FilterConfiguration { "The lengths of src and dst IP address must be 4 or 16 and must be the same." + "srcLength=" + ipAddrLength + ", dstLength=" + mDstIpAddress.length); } - return new IpFilterConfiguration( - mSettings, mSrcIpAddress, mDstIpAddress, mSrcPort, mDstPort, mPassthrough); + return new IpFilterConfiguration(mSettings, mSrcIpAddress, mDstIpAddress, mSrcPort, + mDstPort, mPassthrough, mIpCid); } } } diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index e0afe29de7e69..5e4cc7a52f111 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -3041,6 +3041,29 @@ static DemuxFilterSettings getFilterConfiguration( return filterSettings; } +static Result configureIpFilterContextId( + JNIEnv *env, sp iFilterSp, jobject ipFilterConfigObj) { + jclass clazz = env->FindClass( + "android/media/tv/tuner/filter/IpFilterConfiguration"); + uint32_t cid = env->GetIntField(ipFilterConfigObj, env->GetFieldID( + clazz, "mIpFilterContextId", "I")); + Result res = Result::SUCCESS; + if (cid != static_cast(Constant::INVALID_IP_FILTER_CONTEXT_ID)) { + 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->configureIpCid(cid); + if (res != Result::SUCCESS) { + return res; + } + } else { + ALOGW("configureIpCid is not supported with the current HAL implementation."); + } + } + return res; +} + static jint copyData(JNIEnv *env, std::unique_ptr& mq, EventFlag* flag, jbyteArray buffer, jlong offset, jlong size) { ALOGD("copyData, size=%ld, offset=%ld", (long) size, (long) offset); @@ -3084,6 +3107,13 @@ static jint android_media_tv_Tuner_configure_filter( return (jint) res; } + if (static_cast(type) == DemuxFilterMainType::IP) { + res = configureIpFilterContextId(env, iFilterSp, settings); + 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 75e038be1a2b9..8ce3bbfedf0a9 100644 --- a/non-updatable-api/system-current.txt +++ b/non-updatable-api/system-current.txt @@ -5205,16 +5205,19 @@ package android.media.tv.tuner.filter { method @NonNull public static android.media.tv.tuner.filter.IpFilterConfiguration.Builder builder(); method @NonNull @Size(min=4, max=16) public byte[] getDstIpAddress(); method public int getDstPort(); + method public int getIpFilterContextId(); method @NonNull @Size(min=4, max=16) public byte[] getSrcIpAddress(); method public int getSrcPort(); method public int getType(); method public boolean isPassthrough(); + field public static final int INVALID_IP_FILTER_CONTEXT_ID = -1; // 0xffffffff } public static final class IpFilterConfiguration.Builder { method @NonNull public android.media.tv.tuner.filter.IpFilterConfiguration build(); method @NonNull public android.media.tv.tuner.filter.IpFilterConfiguration.Builder setDstIpAddress(@NonNull byte[]); method @NonNull public android.media.tv.tuner.filter.IpFilterConfiguration.Builder setDstPort(int); + method @NonNull public android.media.tv.tuner.filter.IpFilterConfiguration.Builder setIpFilterContextId(int); method @NonNull public android.media.tv.tuner.filter.IpFilterConfiguration.Builder setPassthrough(boolean); method @NonNull public android.media.tv.tuner.filter.IpFilterConfiguration.Builder setSettings(@Nullable android.media.tv.tuner.filter.Settings); method @NonNull public android.media.tv.tuner.filter.IpFilterConfiguration.Builder setSrcIpAddress(@NonNull byte[]);