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
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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, 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_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 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
|
||||
* monitor it. Reset to stop monitoring.
|
||||
* @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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
jobject obj = env->NewObject(eventClazz, eventInit, static_cast<jint>(scramblingStatus));
|
||||
env->SetObjectArrayElement(arr, i, obj);
|
||||
}
|
||||
auto scramblingStatus = eventsExt[0].monitorEvent().scramblingStatus();
|
||||
jobject obj = env->NewObject(eventClazz, eventInit, static_cast<jint>(scramblingStatus));
|
||||
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();
|
||||
jobject obj = env->NewObject(eventClazz, eventInit, static_cast<jint>(startId));
|
||||
env->SetObjectArrayElement(arr, i, obj);
|
||||
}
|
||||
auto startId = eventsExt[0].startId();
|
||||
jobject obj = env->NewObject(eventClazz, eventInit, static_cast<jint>(startId));
|
||||
env->SetObjectArrayElement(arr, 0, obj);
|
||||
return arr;
|
||||
}
|
||||
|
||||
@@ -747,17 +769,31 @@ 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: {
|
||||
array = getScramblingStatusEvent(array, eventsExt);
|
||||
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: {
|
||||
@@ -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 },
|
||||
|
||||
@@ -44,7 +44,6 @@ using ::android::hardware::hidl_handle;
|
||||
using ::android::hardware::hidl_vec;
|
||||
using ::android::hardware::kSynchronizedReadWrite;
|
||||
using ::android::hardware::tv::tuner::V1_0::DemuxFilterEvent;
|
||||
using ::android::hardware::tv::tuner::V1_1::DemuxFilterEventExt;
|
||||
using ::android::hardware::tv::tuner::V1_0::DemuxFilterStatus;
|
||||
using ::android::hardware::tv::tuner::V1_0::DemuxFilterType;
|
||||
using ::android::hardware::tv::tuner::V1_0::DemuxPid;
|
||||
@@ -73,6 +72,8 @@ using ::android::hardware::tv::tuner::V1_0::LnbId;
|
||||
using ::android::hardware::tv::tuner::V1_0::PlaybackStatus;
|
||||
using ::android::hardware::tv::tuner::V1_0::RecordStatus;
|
||||
using ::android::hardware::tv::tuner::V1_0::Result;
|
||||
using ::android::hardware::tv::tuner::V1_1::DemuxFilterEventExt;
|
||||
using ::android::hardware::tv::tuner::V1_1::DemuxFilterMonitorEvent;
|
||||
using ::android::hardware::tv::tuner::V1_1::FrontendScanMessageExt1_1;
|
||||
using ::android::hardware::tv::tuner::V1_1::FrontendScanMessageTypeExt1_1;
|
||||
using ::android::hardware::tv::tuner::V1_1::IFrontendCallback;
|
||||
@@ -188,6 +189,8 @@ private:
|
||||
jobjectArray& arr, const std::vector<DemuxFilterEvent::Event>& events);
|
||||
jobjectArray getScramblingStatusEvent(
|
||||
jobjectArray& arr, const std::vector<DemuxFilterEventExt::Event>& eventsExt);
|
||||
jobjectArray getIpCidChangeEvent(
|
||||
jobjectArray& arr, const std::vector<DemuxFilterEventExt::Event>& eventsExt);
|
||||
jobjectArray getRestartEvent(
|
||||
jobjectArray& arr, const std::vector<DemuxFilterEventExt::Event>& eventsExt);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user