Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aa9fd18b authored by Patrick Rohr's avatar Patrick Rohr
Browse files

Add FilterDelayHint to Tuner JNI

Test: android.media.tv.tuner.cts.TunerTest
Bug: 183057734
Change-Id: Ib18f3f56d0ad0534844a2bfaa4fd51441178cfc7
parent fca5e3a1
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -6699,6 +6699,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();
+50 −0
Original line number Diff line number Diff line
@@ -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);
        }
    }
}
+38 −0
Original line number Diff line number Diff line
@@ -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[] = {