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

Commit 9791c752 authored by Patrick Rohr's avatar Patrick Rohr Committed by Android (Google) Code Review
Browse files

Merge "Add FilterDelayHint to Tuner JNI"

parents cbd1703d aa9fd18b
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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();
+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[] = {