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

Commit a6c094be authored by Amy Zhang's avatar Amy Zhang
Browse files

Add Ip Cid Change Event for Filter

Merge the configuration of scrambling status change and ip cid change
into one API - configureMonitorEvent

Previously we only report scrambling status change on configured status,
now we change it to report any status change along with the initial
status

Test: atest TunerTets
Bug: 153595125
Change-Id: Ie6e26774dd3f3ab5753746795188a258e1a55393
parent 6b4c503a
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -5253,7 +5253,7 @@ package android.media.tv.tuner.filter {
  public class Filter implements java.lang.AutoCloseable {
    method public void close();
    method public int configure(@NonNull android.media.tv.tuner.filter.FilterConfiguration);
    method public int configureScramblingStatusEvent(int);
    method public int configureMonitorEvent(int);
    method public int flush();
    method public int getId();
    method public long getId64Bit();
@@ -5261,6 +5261,8 @@ package android.media.tv.tuner.filter {
    method public int setDataSource(@Nullable android.media.tv.tuner.filter.Filter);
    method public int start();
    method public int stop();
    field public static final int MONITOR_EVENT_IP_CID_CHANGE = 2; // 0x2
    field public static final int MONITOR_EVENT_SCRAMBLING_STATUS = 1; // 0x1
    field public static final int SCRAMBLING_STATUS_NOT_SCRAMBLED = 2; // 0x2
    field public static final int SCRAMBLING_STATUS_SCRAMBLED = 4; // 0x4
    field public static final int SCRAMBLING_STATUS_UNKNOWN = 1; // 0x1
@@ -5307,6 +5309,10 @@ package android.media.tv.tuner.filter {
    ctor public FilterEvent();
  }
  public final class IpCidChangeEvent extends android.media.tv.tuner.filter.FilterEvent {
    method public int getIpCid();
  }
  public final class IpFilterConfiguration extends android.media.tv.tuner.filter.FilterConfiguration {
    method @NonNull public static android.media.tv.tuner.filter.IpFilterConfiguration.Builder builder();
    method @NonNull @Size(min=4, max=16) public byte[] getDstIpAddress();
+35 −12
Original line number Diff line number Diff line
@@ -186,7 +186,7 @@ public class Filter implements AutoCloseable {
            value = {SCRAMBLING_STATUS_UNKNOWN, SCRAMBLING_STATUS_NOT_SCRAMBLED,
                    SCRAMBLING_STATUS_SCRAMBLED})
    @Retention(RetentionPolicy.SOURCE)
    public @interface ScramblingStatusMask {}
    public @interface ScramblingStatus {}

    /**
     * Content’s scrambling status is unknown
@@ -204,6 +204,23 @@ public class Filter implements AutoCloseable {
    public static final int SCRAMBLING_STATUS_SCRAMBLED =
            android.hardware.tv.tuner.V1_1.Constants.ScramblingStatus.SCRAMBLED;

    /** @hide */
    @IntDef(flag = true,
            prefix = "MONITOR_EVENT_",
            value = {MONITOR_EVENT_SCRAMBLING_STATUS, MONITOR_EVENT_IP_CID_CHANGE})
    @Retention(RetentionPolicy.SOURCE)
    public @interface MonitorEventTypeMask {}

    /**
     * Monitor scrambling status change.
     */
    public static final int MONITOR_EVENT_SCRAMBLING_STATUS =
            android.hardware.tv.tuner.V1_1.Constants.DemuxFilterMonitorEventType.SCRAMBLING_STATUS;
    /**
     * Monitor ip cid change.
     */
    public static final int MONITOR_EVENT_IP_CID_CHANGE =
            android.hardware.tv.tuner.V1_1.Constants.DemuxFilterMonitorEventType.IP_CID_CHANGE;

    private static final String TAG = "Filter";

@@ -222,7 +239,7 @@ public class Filter implements AutoCloseable {
            int type, int subType, FilterConfiguration settings);
    private native int nativeGetId();
    private native long nativeGetId64Bit();
    private native int nativeconfigureScramblingEvent(int scramblingStatusMask);
    private native int nativeConfigureMonitorEvent(int monitorEventTypesMask);
    private native int nativeSetDataSource(Filter source);
    private native int nativeStartFilter();
    private native int nativeStopFilter();
@@ -306,34 +323,40 @@ public class Filter implements AutoCloseable {
    }

    /**
     * Configure the Filter to monitor specific Scrambling Status through
     * {@link ScramblingStatusEvent}.
     * Configure the Filter to monitor scrambling status and ip cid change. Set corresponding bit of
     * {@link MonitorEventTypeMask} to monitor the change. Reset to stop monitoring.
     *
     * <p>{@link ScramblingStatusEvent} should be sent at the following two scenarios:
     * <ul>
     *   <li>When this method is called with {@link MONITOR_EVENT_SCRAMBLING_STATUS}, the first
     *       detected scrambling status should be sent.
     *   <li>When the Scrambling status transits into different status, event should be sent.
     *     <ul/>
     *
     * <p>{@link IpCidChangeEvent} should be sent at the following two scenarios:
     * <ul>
     *   <li>When this method is called, the first detected scrambling status should be sent.
     *   <li>When the filter transits into the monitored statuses configured in
     *       {@code scramblingStatusMask}, event should be sent.
     *   <li>When this method is called with {@link MONITOR_EVENT_IP_CID_CHANGE}, the first detected
     *       CID for the IP should be sent.
     *   <li>When the CID is changed to different value for the IP filter, event should be sent.
     *     <ul/>
     *
     * <p>This configuration is only supported in Tuner 1.1 or higher version. Unsupported version
     * will cause no-op. Use {@link TunerVersionChecker.getTunerVersion()} to get the version
     * information.
     *
     * @param scramblingStatusMask Scrambling Statuses to be monitored. Set corresponding bit to
     * @param monitorEventTypesMask Types of event to be monitored. Set corresponding bit to
     *                              monitor it. Reset to stop monitoring.
     * @return result status of the operation.
     */
    @Result
    public int configureScramblingStatusEvent(@ScramblingStatusMask int scramblingStatusMask) {
    public int configureMonitorEvent(@MonitorEventTypeMask int monitorEventTypesMask) {
        synchronized (mLock) {
            TunerUtils.checkResourceState(TAG, mIsClosed);
            if (!TunerVersionChecker.checkHigherOrEqualVersionTo(
                    TunerVersionChecker.TUNER_VERSION_1_1, "configureScramblingStatusEvent")) {
                    TunerVersionChecker.TUNER_VERSION_1_1, "configureMonitorEvent")) {
                return Tuner.RESULT_UNAVAILABLE;
            }
            return nativeconfigureScramblingEvent(scramblingStatusMask);
            return nativeConfigureMonitorEvent(monitorEventTypesMask);
        }
    }

+46 −0
Original line number Diff line number Diff line
/*
 * Copyright 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.media.tv.tuner.filter;

import android.annotation.SystemApi;

/**
 * Ip Cid Change event sent from {@link Filter} objects new ip cid.
 *
 * <p>This event is only sent in Tuner 1.1 or higher version. Use
 * {@link TunerVersionChecker.getTunerVersion()} to get the version information.
 *
 * @hide
 */
@SystemApi
public final class IpCidChangeEvent extends FilterEvent {
    private final int mCid;

    private IpCidChangeEvent(int cid) {
        mCid = cid;
    }

    /**
     * Gets ip cid.
     *
     * <p>This event is only sent in Tuner 1.1 or higher version. Use
     * {@link TunerVersionChecker.getTunerVersion()} to get the version information.
     */
    public int getIpCid() {
        return mCid;
    }
}
+4 −5
Original line number Diff line number Diff line
@@ -30,18 +30,17 @@ import android.annotation.SystemApi;
public final class ScramblingStatusEvent extends FilterEvent {
    private final int mScramblingStatus;

    private ScramblingStatusEvent(@Filter.ScramblingStatusMask int scramblingStatus) {
    private ScramblingStatusEvent(@Filter.ScramblingStatus int scramblingStatus) {
        mScramblingStatus = scramblingStatus;
    }

    /**
     * Gets Scrambling Status Type.
     *
     * <p>This event field is only sent in Tuner 1.1 or higher version. Unsupported version returns
     * default value 0. Use {@link TunerVersionChecker.getTunerVersion()} to get the version
     * information.
     * <p>This event field is only sent in Tuner 1.1 or higher version. Use
     * {@link TunerVersionChecker.getTunerVersion()} to get the version information.
     */
    @Filter.ScramblingStatusMask
    @Filter.ScramblingStatus
    public int getScramblingStatus() {
        return mScramblingStatus;
    }
+70 −33
Original line number Diff line number Diff line
@@ -604,11 +604,16 @@ jobjectArray FilterCallback::getTsRecordEvent(

        jlong byteNumber = static_cast<jlong>(tsRecordEvent.byteNumber);

        jlong pts = (eventsExt.size() > i) ? static_cast<jlong>(eventsExt[i].tsRecord().pts)
                : static_cast<jlong>(Constant64Bit::INVALID_PRESENTATION_TIME_STAMP);
        jlong firstMbInSlice = (eventsExt.size() > i)
                ? static_cast<jint>(eventsExt[i].tsRecord().firstMbInSlice)
                : static_cast<jint>(Constant::INVALID_FIRST_MACROBLOCK_IN_SLICE);
        jlong pts;
        jlong firstMbInSlice;
        if (eventsExt.size() > i && eventsExt[i].getDiscriminator() ==
                    DemuxFilterEventExt::Event::hidl_discriminator::tsRecord) {
            pts = static_cast<jlong>(eventsExt[i].tsRecord().pts);
            firstMbInSlice = static_cast<jint>(eventsExt[i].tsRecord().firstMbInSlice);
        } else {
            pts = static_cast<jlong>(Constant64Bit::INVALID_PRESENTATION_TIME_STAMP);
            firstMbInSlice = static_cast<jint>(Constant::INVALID_FIRST_MACROBLOCK_IN_SLICE);
        }

        jobject obj =
                env->NewObject(eventClazz, eventInit, jpid, ts, sc, byteNumber,
@@ -632,16 +637,25 @@ jobjectArray FilterCallback::getMmtpRecordEvent(

        jint scHevcIndexMask = static_cast<jint>(mmtpRecordEvent.scHevcIndexMask);
        jlong byteNumber = static_cast<jlong>(mmtpRecordEvent.byteNumber);
        jint mpuSequenceNumber = (eventsExt.size() > i)
                ? static_cast<jint>(eventsExt[i].mmtpRecord().mpuSequenceNumber)
                : static_cast<jint>(Constant::INVALID_MMTP_RECORD_EVENT_MPT_SEQUENCE_NUM);
        jlong pts = (eventsExt.size() > i) ? static_cast<jlong>(eventsExt[i].mmtpRecord().pts)
                : static_cast<jlong>(Constant64Bit::INVALID_PRESENTATION_TIME_STAMP);
        jlong firstMbInSlice = (eventsExt.size() > i)
                ? static_cast<jint>(eventsExt[i].mmtpRecord().firstMbInSlice)
                : static_cast<jint>(Constant::INVALID_FIRST_MACROBLOCK_IN_SLICE);
        jlong tsIndexMask = (eventsExt.size() > i)
                ? static_cast<jint>(eventsExt[i].mmtpRecord().tsIndexMask) : 0;

        jint mpuSequenceNumber;
        jlong pts;
        jlong firstMbInSlice;
        jlong tsIndexMask;

        if (eventsExt.size() > i && eventsExt[i].getDiscriminator() ==
                    DemuxFilterEventExt::Event::hidl_discriminator::mmtpRecord) {
            mpuSequenceNumber = static_cast<jint>(eventsExt[i].mmtpRecord().mpuSequenceNumber);
            pts = static_cast<jlong>(eventsExt[i].mmtpRecord().pts);
            firstMbInSlice = static_cast<jint>(eventsExt[i].mmtpRecord().firstMbInSlice);
            tsIndexMask = static_cast<jint>(eventsExt[i].mmtpRecord().tsIndexMask);
        } else {
            mpuSequenceNumber =
                    static_cast<jint>(Constant::INVALID_MMTP_RECORD_EVENT_MPT_SEQUENCE_NUM);
            pts = static_cast<jlong>(Constant64Bit::INVALID_PRESENTATION_TIME_STAMP);
            firstMbInSlice = static_cast<jint>(Constant::INVALID_FIRST_MACROBLOCK_IN_SLICE);
            tsIndexMask = 0;
        }

        jobject obj =
                env->NewObject(eventClazz, eventInit, scHevcIndexMask, byteNumber,
@@ -720,11 +734,21 @@ jobjectArray FilterCallback::getScramblingStatusEvent(
    jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/ScramblingStatusEvent");
    jmethodID eventInit = env->GetMethodID(eventClazz, "<init>", "(I)V");

    for (int i = 0; i < eventsExt.size(); i++) {
        auto scramblingStatus = eventsExt[i].scramblingStatus();
    auto scramblingStatus = eventsExt[0].monitorEvent().scramblingStatus();
    jobject obj = env->NewObject(eventClazz, eventInit, static_cast<jint>(scramblingStatus));
        env->SetObjectArrayElement(arr, i, obj);
    env->SetObjectArrayElement(arr, 0, obj);
    return arr;
}

jobjectArray FilterCallback::getIpCidChangeEvent(
        jobjectArray& arr, const std::vector<DemuxFilterEventExt::Event>& eventsExt) {
    JNIEnv *env = AndroidRuntime::getJNIEnv();
    jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/IpCidChangeEvent");
    jmethodID eventInit = env->GetMethodID(eventClazz, "<init>", "(I)V");

    auto cid = eventsExt[0].monitorEvent().cid();
    jobject obj = env->NewObject(eventClazz, eventInit, static_cast<jint>(cid));
    env->SetObjectArrayElement(arr, 0, obj);
    return arr;
}

@@ -734,11 +758,9 @@ jobjectArray FilterCallback::getRestartEvent(
    jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/RestartEvent");
    jmethodID eventInit = env->GetMethodID(eventClazz, "<init>", "(I)V");

    for (int i = 0; i < eventsExt.size(); i++) {
        auto startId = eventsExt[i].startId();
    auto startId = eventsExt[0].startId();
    jobject obj = env->NewObject(eventClazz, eventInit, static_cast<jint>(startId));
        env->SetObjectArrayElement(arr, i, obj);
    }
    env->SetObjectArrayElement(arr, 0, obj);
    return arr;
}

@@ -747,19 +769,33 @@ Return<void> FilterCallback::onFilterEvent_1_1(const DemuxFilterEvent& filterEve
    ALOGD("FilterCallback::onFilterEvent_1_1");

    JNIEnv *env = AndroidRuntime::getJNIEnv();
    jobjectArray array;

    std::vector<DemuxFilterEvent::Event> events = filterEvent.events;
    std::vector<DemuxFilterEventExt::Event> eventsExt = filterEventExt.events;
    jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/FilterEvent");
    jobjectArray array = env->NewObjectArray(events.size(), eventClazz, NULL);

    if (events.empty() && !eventsExt.empty()) {
        // Monitor event should be sent with one DemuxFilterMonitorEvent in DemuxFilterEventExt.
        array = env->NewObjectArray(1, eventClazz, NULL);
        auto eventExt = eventsExt[0];
        switch (eventExt.getDiscriminator()) {
            case DemuxFilterEventExt::Event::hidl_discriminator::scramblingStatus: {
            case DemuxFilterEventExt::Event::hidl_discriminator::monitorEvent: {
                switch (eventExt.monitorEvent().getDiscriminator()) {
                    case DemuxFilterMonitorEvent::hidl_discriminator::scramblingStatus: {
                        array = getScramblingStatusEvent(array, eventsExt);
                        break;
                    }
                    case DemuxFilterMonitorEvent::hidl_discriminator::cid: {
                        array = getIpCidChangeEvent(array, eventsExt);
                        break;
                    }
                    default: {
                        break;
                    }
                }
                break;
            }
            case DemuxFilterEventExt::Event::hidl_discriminator::startId: {
                array = getRestartEvent(array, eventsExt);
                break;
@@ -771,6 +807,7 @@ Return<void> FilterCallback::onFilterEvent_1_1(const DemuxFilterEvent& filterEve
    }

    if (!events.empty()) {
        array = env->NewObjectArray(events.size(), eventClazz, NULL);
        auto event = events[0];
        switch (event.getDiscriminator()) {
            case DemuxFilterEvent::Event::hidl_discriminator::media: {
@@ -4069,8 +4106,8 @@ static jlong android_media_tv_Tuner_get_filter_64bit_id(JNIEnv* env, jobject fil
                    ::android::hardware::tv::tuner::V1_1::Constant64Bit::INVALID_FILTER_ID_64BIT);
}

static jint android_media_tv_Tuner_configure_scrambling_status_event(
        JNIEnv* env, jobject filter, int scramblingStatusMask) {
static jint android_media_tv_Tuner_configure_monitor_event(
        JNIEnv* env, jobject filter, int monitorEventType) {
    sp<IFilter> iFilterSp = getFilter(env, filter)->getIFilter();
    if (iFilterSp == NULL) {
        ALOGD("Failed to configure scrambling event: filter not found");
@@ -4082,7 +4119,7 @@ static jint android_media_tv_Tuner_configure_scrambling_status_event(
    Result res;

    if (iFilterSp_1_1 != NULL) {
        res = iFilterSp_1_1->configureScramblingEvent(scramblingStatusMask);
        res = iFilterSp_1_1->configureMonitorEvent(monitorEventType);
    } else {
        ALOGW("configureScramblingEvent is not supported with the current HAL implementation.");
        return (jint) Result::INVALID_STATE;
@@ -4762,8 +4799,8 @@ static const JNINativeMethod gFilterMethods[] = {
    { "nativeGetId", "()I", (void *)android_media_tv_Tuner_get_filter_id },
    { "nativeGetId64Bit", "()J",
            (void *)android_media_tv_Tuner_get_filter_64bit_id },
    { "nativeconfigureScramblingEvent", "(I)I",
            (void *)android_media_tv_Tuner_configure_scrambling_status_event },
    { "nativeConfigureMonitorEvent", "(I)I",
            (void *)android_media_tv_Tuner_configure_monitor_event },
    { "nativeSetDataSource", "(Landroid/media/tv/tuner/filter/Filter;)I",
            (void *)android_media_tv_Tuner_set_filter_data_source },
    { "nativeStartFilter", "()I", (void *)android_media_tv_Tuner_start_filter },
Loading