Merge "Add FilterDelayHint to Tuner JNI"

This commit is contained in:
Patrick Rohr
2021-12-28 19:37:39 +00:00
committed by Android (Google) Code Review
3 changed files with 90 additions and 0 deletions

View File

@@ -6701,6 +6701,8 @@ package android.media.tv.tuner.filter {
method @Nullable public String acquireSharedFilterToken();
method public void close();
method public int configure(@NonNull android.media.tv.tuner.filter.FilterConfiguration);
method public int delayCallbackUntilBufferFilled(int);
method public int delayCallbackUntilTimeMillis(long);
method public int flush();
method public void freeSharedFilterToken(@NonNull String);
method @Deprecated public int getId();

View File

@@ -254,6 +254,8 @@ public class Filter implements AutoCloseable {
private native int nativeClose();
private native String nativeAcquireSharedFilterToken();
private native void nativeFreeSharedFilterToken(String token);
private native int nativeSetTimeDelayHint(int timeDelayInMs);
private native int nativeSetDataSizeDelayHint(int dataSizeDelayInBytes);
// Called by JNI
private Filter(long id) {
@@ -599,4 +601,52 @@ public class Filter implements AutoCloseable {
mIsShared = false;
}
}
/**
* Set filter time delay.
*
* <p> Setting a time delay instructs the filter to delay its event callback invocation until
* the specified amount of time has passed. The default value (delay disabled) is {@code 0}.
*
* <p>This functionality is only available in Tuner version 2.0 and higher and will otherwise
* be a no-op. Use {@link TunerVersionChecker#getTunerVersion()} to get the version information.
*
* @param delayInMs specifies the duration of the delay in milliseconds.
*/
public int delayCallbackUntilTimeMillis(long delayInMs) {
if (!TunerVersionChecker.checkHigherOrEqualVersionTo(
TunerVersionChecker.TUNER_VERSION_2_0, "setTimeDelayHint")) {
return Tuner.RESULT_UNAVAILABLE;
}
if (delayInMs >= 0 && delayInMs <= Integer.MAX_VALUE) {
synchronized (mLock) {
return nativeSetTimeDelayHint((int) delayInMs);
}
}
return Tuner.RESULT_INVALID_ARGUMENT;
}
/**
* Set filter data size delay.
*
* <p> Setting a data size delay instructs the filter to delay its event callback invocation
* until a specified amount of data has accumulated. The default value (delay disabled) is
* {@code 0}.
*
* <p>This functionality is only available in Tuner version 2.0 and higher and will otherwise
* be a no-op. Use {@link TunerVersionChecker#getTunerVersion()} to get the version information.
*
* @param delayInBytes specifies the duration of the delay in bytes.
*/
public int delayCallbackUntilBufferFilled(int delayInBytes) {
if (!TunerVersionChecker.checkHigherOrEqualVersionTo(
TunerVersionChecker.TUNER_VERSION_2_0, "setTimeDelayHint")) {
return Tuner.RESULT_UNAVAILABLE;
}
synchronized (mLock) {
return nativeSetDataSizeDelayHint(delayInBytes);
}
}
}

View File

@@ -62,6 +62,8 @@
#include <aidl/android/hardware/tv/tuner/DemuxTsFilterType.h>
#include <aidl/android/hardware/tv/tuner/DemuxTsIndex.h>
#include <aidl/android/hardware/tv/tuner/DvrSettings.h>
#include <aidl/android/hardware/tv/tuner/FilterDelayHint.h>
#include <aidl/android/hardware/tv/tuner/FilterDelayHintType.h>
#include <aidl/android/hardware/tv/tuner/FrontendAnalogAftFlag.h>
#include <aidl/android/hardware/tv/tuner/FrontendAnalogSettings.h>
#include <aidl/android/hardware/tv/tuner/FrontendAnalogSifStandard.h>
@@ -210,6 +212,8 @@ using ::aidl::android::hardware::tv::tuner::DemuxTsFilterSettingsFilterSettings;
using ::aidl::android::hardware::tv::tuner::DemuxTsFilterType;
using ::aidl::android::hardware::tv::tuner::DemuxTsIndex;
using ::aidl::android::hardware::tv::tuner::DvrSettings;
using ::aidl::android::hardware::tv::tuner::FilterDelayHint;
using ::aidl::android::hardware::tv::tuner::FilterDelayHintType;
using ::aidl::android::hardware::tv::tuner::FrontendAnalogAftFlag;
using ::aidl::android::hardware::tv::tuner::FrontendAnalogSettings;
using ::aidl::android::hardware::tv::tuner::FrontendAnalogSifStandard;
@@ -4058,6 +4062,36 @@ static void android_media_tv_Tuner_free_shared_filter_token(
filterClient->freeSharedFilterToken(filterToken);
}
static jint android_media_tv_Tuner_set_filter_time_delay_hint(
JNIEnv *env, jobject filter, int timeDelayInMs) {
sp<FilterClient> filterClient = getFilterClient(env, filter);
if (filterClient == nullptr) {
jniThrowException(env, "java/lang/IllegalStateException",
"Failed to set filter delay: filter client not found");
}
FilterDelayHint delayHint {
.hintType = FilterDelayHintType::TIME_DELAY_IN_MS,
.hintValue = timeDelayInMs,
};
return static_cast<jint>(filterClient->setDelayHint(delayHint));
}
static jint android_media_tv_Tuner_set_filter_data_size_delay_hint(
JNIEnv *env, jobject filter, int dataSizeDelayInBytes) {
sp<FilterClient> filterClient = getFilterClient(env, filter);
if (filterClient == nullptr) {
jniThrowException(env, "java/lang/IllegalStateException",
"Failed to set filter delay: filter client not found");
}
FilterDelayHint delayHint {
.hintType = FilterDelayHintType::DATA_SIZE_DELAY_IN_BYTES,
.hintValue = dataSizeDelayInBytes,
};
return static_cast<jint>(filterClient->setDelayHint(delayHint));
}
static sp<TimeFilterClient> getTimeFilterClient(JNIEnv *env, jobject filter) {
return (TimeFilterClient *)env->GetLongField(filter, gFields.timeFilterContext);
}
@@ -4578,6 +4612,10 @@ static const JNINativeMethod gFilterMethods[] = {
(void *)android_media_tv_Tuner_acquire_shared_filter_token},
{ "nativeFreeSharedFilterToken", "(Ljava/lang/String;)V",
(void *)android_media_tv_Tuner_free_shared_filter_token},
{"nativeSetTimeDelayHint", "(I)I",
(void *)android_media_tv_Tuner_set_filter_time_delay_hint},
{"nativeSetDataSizeDelayHint", "(I)I",
(void *)android_media_tv_Tuner_set_filter_data_size_delay_hint},
};
static const JNINativeMethod gSharedFilterMethods[] = {