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

Commit 58ccd681 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add Ip Cid Change Event for Filter"

parents 08cea833 a6c094be
Loading
Loading
Loading
Loading
+7 −1
Original line number Original line Diff line number Diff line
@@ -5253,7 +5253,7 @@ package android.media.tv.tuner.filter {
  public class Filter implements java.lang.AutoCloseable {
  public class Filter implements java.lang.AutoCloseable {
    method public void close();
    method public void close();
    method public int configure(@NonNull android.media.tv.tuner.filter.FilterConfiguration);
    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 flush();
    method public int getId();
    method public int getId();
    method public long getId64Bit();
    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 setDataSource(@Nullable android.media.tv.tuner.filter.Filter);
    method public int start();
    method public int start();
    method public int stop();
    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_NOT_SCRAMBLED = 2; // 0x2
    field public static final int SCRAMBLING_STATUS_SCRAMBLED = 4; // 0x4
    field public static final int SCRAMBLING_STATUS_SCRAMBLED = 4; // 0x4
    field public static final int SCRAMBLING_STATUS_UNKNOWN = 1; // 0x1
    field public static final int SCRAMBLING_STATUS_UNKNOWN = 1; // 0x1
@@ -5307,6 +5309,10 @@ package android.media.tv.tuner.filter {
    ctor public FilterEvent();
    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 {
  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 public static android.media.tv.tuner.filter.IpFilterConfiguration.Builder builder();
    method @NonNull @Size(min=4, max=16) public byte[] getDstIpAddress();
    method @NonNull @Size(min=4, max=16) public byte[] getDstIpAddress();
+35 −12
Original line number Original line Diff line number Diff line
@@ -186,7 +186,7 @@ public class Filter implements AutoCloseable {
            value = {SCRAMBLING_STATUS_UNKNOWN, SCRAMBLING_STATUS_NOT_SCRAMBLED,
            value = {SCRAMBLING_STATUS_UNKNOWN, SCRAMBLING_STATUS_NOT_SCRAMBLED,
                    SCRAMBLING_STATUS_SCRAMBLED})
                    SCRAMBLING_STATUS_SCRAMBLED})
    @Retention(RetentionPolicy.SOURCE)
    @Retention(RetentionPolicy.SOURCE)
    public @interface ScramblingStatusMask {}
    public @interface ScramblingStatus {}


    /**
    /**
     * Content’s scrambling status is unknown
     * Content’s scrambling status is unknown
@@ -204,6 +204,23 @@ public class Filter implements AutoCloseable {
    public static final int SCRAMBLING_STATUS_SCRAMBLED =
    public static final int SCRAMBLING_STATUS_SCRAMBLED =
            android.hardware.tv.tuner.V1_1.Constants.ScramblingStatus.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";
    private static final String TAG = "Filter";


@@ -222,7 +239,7 @@ public class Filter implements AutoCloseable {
            int type, int subType, FilterConfiguration settings);
            int type, int subType, FilterConfiguration settings);
    private native int nativeGetId();
    private native int nativeGetId();
    private native long nativeGetId64Bit();
    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 nativeSetDataSource(Filter source);
    private native int nativeStartFilter();
    private native int nativeStartFilter();
    private native int nativeStopFilter();
    private native int nativeStopFilter();
@@ -306,34 +323,40 @@ public class Filter implements AutoCloseable {
    }
    }


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


+46 −0
Original line number Original line 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 Original line Diff line number Diff line
@@ -30,18 +30,17 @@ import android.annotation.SystemApi;
public final class ScramblingStatusEvent extends FilterEvent {
public final class ScramblingStatusEvent extends FilterEvent {
    private final int mScramblingStatus;
    private final int mScramblingStatus;


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


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


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


        jlong pts = (eventsExt.size() > i) ? static_cast<jlong>(eventsExt[i].tsRecord().pts)
        jlong pts;
                : static_cast<jlong>(Constant64Bit::INVALID_PRESENTATION_TIME_STAMP);
        jlong firstMbInSlice;
        jlong firstMbInSlice = (eventsExt.size() > i)
        if (eventsExt.size() > i && eventsExt[i].getDiscriminator() ==
                ? static_cast<jint>(eventsExt[i].tsRecord().firstMbInSlice)
                    DemuxFilterEventExt::Event::hidl_discriminator::tsRecord) {
                : static_cast<jint>(Constant::INVALID_FIRST_MACROBLOCK_IN_SLICE);
            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 =
        jobject obj =
                env->NewObject(eventClazz, eventInit, jpid, ts, sc, byteNumber,
                env->NewObject(eventClazz, eventInit, jpid, ts, sc, byteNumber,
@@ -632,16 +637,25 @@ jobjectArray FilterCallback::getMmtpRecordEvent(


        jint scHevcIndexMask = static_cast<jint>(mmtpRecordEvent.scHevcIndexMask);
        jint scHevcIndexMask = static_cast<jint>(mmtpRecordEvent.scHevcIndexMask);
        jlong byteNumber = static_cast<jlong>(mmtpRecordEvent.byteNumber);
        jlong byteNumber = static_cast<jlong>(mmtpRecordEvent.byteNumber);
        jint mpuSequenceNumber = (eventsExt.size() > i)

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

                ? static_cast<jint>(eventsExt[i].mmtpRecord().firstMbInSlice)
        if (eventsExt.size() > i && eventsExt[i].getDiscriminator() ==
                : static_cast<jint>(Constant::INVALID_FIRST_MACROBLOCK_IN_SLICE);
                    DemuxFilterEventExt::Event::hidl_discriminator::mmtpRecord) {
        jlong tsIndexMask = (eventsExt.size() > i)
            mpuSequenceNumber = static_cast<jint>(eventsExt[i].mmtpRecord().mpuSequenceNumber);
                ? static_cast<jint>(eventsExt[i].mmtpRecord().tsIndexMask) : 0;
            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 =
        jobject obj =
                env->NewObject(eventClazz, eventInit, scHevcIndexMask, byteNumber,
                env->NewObject(eventClazz, eventInit, scHevcIndexMask, byteNumber,
@@ -720,11 +734,21 @@ jobjectArray FilterCallback::getScramblingStatusEvent(
    jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/ScramblingStatusEvent");
    jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/ScramblingStatusEvent");
    jmethodID eventInit = env->GetMethodID(eventClazz, "<init>", "(I)V");
    jmethodID eventInit = env->GetMethodID(eventClazz, "<init>", "(I)V");


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


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


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


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


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


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


    if (events.empty() && !eventsExt.empty()) {
    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];
        auto eventExt = eventsExt[0];
        switch (eventExt.getDiscriminator()) {
        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);
                        array = getScramblingStatusEvent(array, eventsExt);
                        break;
                        break;
                    }
                    }
                    case DemuxFilterMonitorEvent::hidl_discriminator::cid: {
                        array = getIpCidChangeEvent(array, eventsExt);
                        break;
                    }
                    default: {
                        break;
                    }
                }
                break;
            }
            case DemuxFilterEventExt::Event::hidl_discriminator::startId: {
            case DemuxFilterEventExt::Event::hidl_discriminator::startId: {
                array = getRestartEvent(array, eventsExt);
                array = getRestartEvent(array, eventsExt);
                break;
                break;
@@ -771,6 +807,7 @@ Return<void> FilterCallback::onFilterEvent_1_1(const DemuxFilterEvent& filterEve
    }
    }


    if (!events.empty()) {
    if (!events.empty()) {
        array = env->NewObjectArray(events.size(), eventClazz, NULL);
        auto event = events[0];
        auto event = events[0];
        switch (event.getDiscriminator()) {
        switch (event.getDiscriminator()) {
            case DemuxFilterEvent::Event::hidl_discriminator::media: {
            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);
                    ::android::hardware::tv::tuner::V1_1::Constant64Bit::INVALID_FILTER_ID_64BIT);
}
}


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


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