Add context id setter in the IpFilterConfiguration

Test: make dist
Bug: 153595125
Change-Id: Ie949ea0c108cb020f028cf0ce24020235762d0cb
This commit is contained in:
Amy Zhang
2020-09-02 21:24:22 -07:00
parent 4a11c4408f
commit de5715ea6f
4 changed files with 73 additions and 3 deletions

View File

@@ -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[]);

View File

@@ -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}.
*
* <p>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}.
*
* <p>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);
}
}
}

View File

@@ -3041,6 +3041,29 @@ static DemuxFilterSettings getFilterConfiguration(
return filterSettings;
}
static Result configureIpFilterContextId(
JNIEnv *env, sp<IFilter> 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<uint32_t>(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>& 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<DemuxFilterMainType>(type) == DemuxFilterMainType::IP) {
res = configureIpFilterContextId(env, iFilterSp, settings);
if (res != Result::SUCCESS) {
return (jint) res;
}
}
MQDescriptorSync<uint8_t> filterMQDesc;
Result getQueueDescResult = Result::UNKNOWN_ERROR;
if (filterSp->mFilterMQ == NULL) {

View File

@@ -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[]);