Loading core/api/system-current.txt +7 −1 Original line number Original line Diff line number Diff line Loading @@ -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(); Loading @@ -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 Loading Loading @@ -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(); Loading media/java/android/media/tv/tuner/filter/Filter.java +35 −12 Original line number Original line Diff line number Diff line Loading @@ -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 Loading @@ -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"; Loading @@ -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(); Loading Loading @@ -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); } } } } Loading media/java/android/media/tv/tuner/filter/IpCidChangeEvent.java 0 → 100644 +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; } } media/java/android/media/tv/tuner/filter/ScramblingStatusEvent.java +4 −5 Original line number Original line Diff line number Diff line Loading @@ -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; } } Loading media/jni/android_media_tv_Tuner.cpp +70 −33 Original line number Original line Diff line number Diff line Loading @@ -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, Loading @@ -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, Loading Loading @@ -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; } } Loading @@ -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; } } Loading @@ -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; Loading @@ -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: { Loading Loading @@ -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"); Loading @@ -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; Loading Loading @@ -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 Loading
core/api/system-current.txt +7 −1 Original line number Original line Diff line number Diff line Loading @@ -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(); Loading @@ -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 Loading Loading @@ -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(); Loading
media/java/android/media/tv/tuner/filter/Filter.java +35 −12 Original line number Original line Diff line number Diff line Loading @@ -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 Loading @@ -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"; Loading @@ -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(); Loading Loading @@ -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); } } } } Loading
media/java/android/media/tv/tuner/filter/IpCidChangeEvent.java 0 → 100644 +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; } }
media/java/android/media/tv/tuner/filter/ScramblingStatusEvent.java +4 −5 Original line number Original line Diff line number Diff line Loading @@ -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; } } Loading
media/jni/android_media_tv_Tuner.cpp +70 −33 Original line number Original line Diff line number Diff line Loading @@ -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, Loading @@ -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, Loading Loading @@ -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; } } Loading @@ -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; } } Loading @@ -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; Loading @@ -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: { Loading Loading @@ -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"); Loading @@ -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; Loading Loading @@ -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