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

Commit 8d4206f3 authored by Ray Chin's avatar Ray Chin
Browse files

Cache event jclass in Tuner framework jni for performance

Test: atest android.media.tv.tuner.cts.TunerTest
Bug: 271400404
Change-Id: Ie483939c799dda2163dca974e1c1015717db512a
parent cc10548a
Loading
Loading
Loading
Loading
+100 −65
Original line number Diff line number Diff line
@@ -617,8 +617,6 @@ int64_t MediaEvent::getAudioHandle() {
void FilterClientCallbackImpl::getSectionEvent(jobjectArray &arr, const int size,
                                               const DemuxFilterEvent &event) {
    JNIEnv *env = AndroidRuntime::getJNIEnv();
    jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/SectionEvent");
    jmethodID eventInit = env->GetMethodID(eventClazz, "<init>", "(IIIJ)V");

    const DemuxFilterSectionEvent &sectionEvent = event.get<DemuxFilterEvent::Tag::section>();
    jint tableId = sectionEvent.tableId;
@@ -626,23 +624,15 @@ void FilterClientCallbackImpl::getSectionEvent(jobjectArray &arr, const int size
    jint sectionNum = sectionEvent.sectionNum;
    jlong dataLength = sectionEvent.dataLength;

    jobject obj = env->NewObject(eventClazz, eventInit, tableId, version, sectionNum, dataLength);
    jobject obj = env->NewObject(mSectionEventClass, mSectionEventInitID, tableId, version,
                                 sectionNum, dataLength);
    env->SetObjectArrayElement(arr, size, obj);
    env->DeleteLocalRef(obj);
    env->DeleteLocalRef(eventClazz);
}

void FilterClientCallbackImpl::getMediaEvent(jobjectArray &arr, const int size,
                                             const DemuxFilterEvent &event) {
    JNIEnv *env = AndroidRuntime::getJNIEnv();
    jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/MediaEvent");
    jmethodID eventInit = env->GetMethodID(
            eventClazz,
            "<init>",
            "(IZJZJJJLandroid/media/MediaCodec$LinearBlock;"
            "ZJIZILandroid/media/tv/tuner/filter/AudioDescriptor;"
            "Ljava/util/List;)V");
    jfieldID eventContext = env->GetFieldID(eventClazz, "mNativeContext", "J");

    const DemuxFilterMediaEvent &mediaEvent = event.get<DemuxFilterEvent::Tag::media>();
    jobject audioDescriptor = nullptr;
@@ -650,8 +640,6 @@ void FilterClientCallbackImpl::getMediaEvent(jobjectArray &arr, const int size,
    jobject presentationsJObj = JAudioPresentationInfo::asJobject(env, gAudioPresentationFields);
    switch (mediaEvent.extraMetaData.getTag()) {
        case DemuxFilterMediaEventExtraMetaData::Tag::audio: {
            jclass adClazz = env->FindClass("android/media/tv/tuner/filter/AudioDescriptor");
            jmethodID adInit = env->GetMethodID(adClazz, "<init>", "(BBCBBB)V");

            const AudioExtraMetaData &ad =
                    mediaEvent.extraMetaData.get<DemuxFilterMediaEventExtraMetaData::Tag::audio>();
@@ -662,9 +650,9 @@ void FilterClientCallbackImpl::getMediaEvent(jobjectArray &arr, const int size,
            jbyte adGainFront = ad.adGainFront;
            jbyte adGainSurround = ad.adGainSurround;

            audioDescriptor = env->NewObject(adClazz, adInit, adFade, adPan, versionTextTag,
                                             adGainCenter, adGainFront, adGainSurround);
            env->DeleteLocalRef(adClazz);
            audioDescriptor = env->NewObject(mAudioDescriptorClass, mAudioDescriptorInitID, adFade,
                                             adPan, versionTextTag, adGainCenter, adGainFront,
                                             adGainSurround);
            break;
        }
        case DemuxFilterMediaEventExtraMetaData::Tag::audioPresentations: {
@@ -705,10 +693,10 @@ void FilterClientCallbackImpl::getMediaEvent(jobjectArray &arr, const int size,
        sc = mediaEvent.scIndexMask.get<DemuxFilterScIndexMask::Tag::scVvc>();
    }

    jobject obj = env->NewObject(eventClazz, eventInit, streamId, isPtsPresent, pts, isDtsPresent,
                                 dts, dataLength, offset, nullptr, isSecureMemory, avDataId,
                                 mpuSequenceNumber, isPesPrivateData, sc, audioDescriptor,
                                 presentationsJObj);
    jobject obj = env->NewObject(mMediaEventClass, mMediaEventInitID, streamId, isPtsPresent, pts,
                                 isDtsPresent, dts, dataLength, offset, nullptr, isSecureMemory,
                                 avDataId, mpuSequenceNumber, isPesPrivateData, sc,
                                 audioDescriptor, presentationsJObj);

    uint64_t avSharedMemSize = mFilterClient->getAvSharedHandleInfo().size;
    if (mediaEvent.avMemory.fds.size() > 0 || mediaEvent.avDataId != 0 ||
@@ -717,7 +705,7 @@ void FilterClientCallbackImpl::getMediaEvent(jobjectArray &arr, const int size,
                new MediaEvent(mFilterClient, dupFromAidl(mediaEvent.avMemory),
                               mediaEvent.avDataId, dataLength + offset, obj);
        mediaEventSp->mAvHandleRefCnt++;
        env->SetLongField(obj, eventContext, (jlong)mediaEventSp.get());
        env->SetLongField(obj, mMediaEventFieldContextID, (jlong)mediaEventSp.get());
        mediaEventSp->incStrong(obj);
    }

@@ -726,32 +714,27 @@ void FilterClientCallbackImpl::getMediaEvent(jobjectArray &arr, const int size,
        env->DeleteLocalRef(audioDescriptor);
    }
    env->DeleteLocalRef(obj);
    env->DeleteLocalRef(eventClazz);
    env->DeleteLocalRef(presentationsJObj);
}

void FilterClientCallbackImpl::getPesEvent(jobjectArray &arr, const int size,
                                           const DemuxFilterEvent &event) {
    JNIEnv *env = AndroidRuntime::getJNIEnv();
    jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/PesEvent");
    jmethodID eventInit = env->GetMethodID(eventClazz, "<init>", "(III)V");

    const DemuxFilterPesEvent &pesEvent = event.get<DemuxFilterEvent::Tag::pes>();
    jint streamId = pesEvent.streamId;
    jint dataLength = pesEvent.dataLength;
    jint mpuSequenceNumber = pesEvent.mpuSequenceNumber;

    jobject obj = env->NewObject(eventClazz, eventInit, streamId, dataLength, mpuSequenceNumber);
    jobject obj = env->NewObject(mPesEventClass, mPesEventInitID, streamId, dataLength,
                                 mpuSequenceNumber);
    env->SetObjectArrayElement(arr, size, obj);
    env->DeleteLocalRef(obj);
    env->DeleteLocalRef(eventClazz);
}

void FilterClientCallbackImpl::getTsRecordEvent(jobjectArray &arr, const int size,
                                                const DemuxFilterEvent &event) {
    JNIEnv *env = AndroidRuntime::getJNIEnv();
    jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/TsRecordEvent");
    jmethodID eventInit = env->GetMethodID(eventClazz, "<init>", "(IIIJJI)V");

    const DemuxFilterTsRecordEvent &tsRecordEvent = event.get<DemuxFilterEvent::Tag::tsRecord>();
    DemuxPid pid = tsRecordEvent.pid;
@@ -781,18 +764,15 @@ void FilterClientCallbackImpl::getTsRecordEvent(jobjectArray &arr, const int siz
    jlong pts = tsRecordEvent.pts;
    jint firstMbInSlice = tsRecordEvent.firstMbInSlice;

    jobject obj =
            env->NewObject(eventClazz, eventInit, jpid, ts, sc, byteNumber, pts, firstMbInSlice);
    jobject obj = env->NewObject(mTsRecordEventClass, mTsRecordEventInitID, jpid, ts, sc,
                                 byteNumber, pts, firstMbInSlice);
    env->SetObjectArrayElement(arr, size, obj);
    env->DeleteLocalRef(obj);
    env->DeleteLocalRef(eventClazz);
}

void FilterClientCallbackImpl::getMmtpRecordEvent(jobjectArray &arr, const int size,
                                                  const DemuxFilterEvent &event) {
    JNIEnv *env = AndroidRuntime::getJNIEnv();
    jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/MmtpRecordEvent");
    jmethodID eventInit = env->GetMethodID(eventClazz, "<init>", "(IJIJII)V");

    const DemuxFilterMmtpRecordEvent &mmtpRecordEvent =
            event.get<DemuxFilterEvent::Tag::mmtpRecord>();
@@ -803,18 +783,15 @@ void FilterClientCallbackImpl::getMmtpRecordEvent(jobjectArray &arr, const int s
    jint firstMbInSlice = mmtpRecordEvent.firstMbInSlice;
    jlong tsIndexMask = mmtpRecordEvent.tsIndexMask;

    jobject obj = env->NewObject(eventClazz, eventInit, scHevcIndexMask, byteNumber,
                                 mpuSequenceNumber, pts, firstMbInSlice, tsIndexMask);
    jobject obj = env->NewObject(mMmtpRecordEventClass, mMmtpRecordEventInitID, scHevcIndexMask,
                                 byteNumber, mpuSequenceNumber, pts, firstMbInSlice, tsIndexMask);
    env->SetObjectArrayElement(arr, size, obj);
    env->DeleteLocalRef(obj);
    env->DeleteLocalRef(eventClazz);
}

void FilterClientCallbackImpl::getDownloadEvent(jobjectArray &arr, const int size,
                                                const DemuxFilterEvent &event) {
    JNIEnv *env = AndroidRuntime::getJNIEnv();
    jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/DownloadEvent");
    jmethodID eventInit = env->GetMethodID(eventClazz, "<init>", "(IIIIII)V");

    const DemuxFilterDownloadEvent &downloadEvent = event.get<DemuxFilterEvent::Tag::download>();
    jint itemId = downloadEvent.itemId;
@@ -824,32 +801,27 @@ void FilterClientCallbackImpl::getDownloadEvent(jobjectArray &arr, const int siz
    jint lastItemFragmentIndex = downloadEvent.lastItemFragmentIndex;
    jint dataLength = downloadEvent.dataLength;

    jobject obj = env->NewObject(eventClazz, eventInit, itemId, downloadId, mpuSequenceNumber,
                                 itemFragmentIndex, lastItemFragmentIndex, dataLength);
    jobject obj = env->NewObject(mDownloadEventClass, mDownloadEventInitID, itemId, downloadId,
                                 mpuSequenceNumber, itemFragmentIndex, lastItemFragmentIndex,
                                 dataLength);
    env->SetObjectArrayElement(arr, size, obj);
    env->DeleteLocalRef(obj);
    env->DeleteLocalRef(eventClazz);
}

void FilterClientCallbackImpl::getIpPayloadEvent(jobjectArray &arr, const int size,
                                                 const DemuxFilterEvent &event) {
    JNIEnv *env = AndroidRuntime::getJNIEnv();
    jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/IpPayloadEvent");
    jmethodID eventInit = env->GetMethodID(eventClazz, "<init>", "(I)V");

    const DemuxFilterIpPayloadEvent &ipPayloadEvent = event.get<DemuxFilterEvent::Tag::ipPayload>();
    jint dataLength = ipPayloadEvent.dataLength;
    jobject obj = env->NewObject(eventClazz, eventInit, dataLength);
    jobject obj = env->NewObject(mIpPayloadEventClass, mIpPayloadEventInitID, dataLength);
    env->SetObjectArrayElement(arr, size, obj);
    env->DeleteLocalRef(obj);
    env->DeleteLocalRef(eventClazz);
}

void FilterClientCallbackImpl::getTemiEvent(jobjectArray &arr, const int size,
                                            const DemuxFilterEvent &event) {
    JNIEnv *env = AndroidRuntime::getJNIEnv();
    jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/TemiEvent");
    jmethodID eventInit = env->GetMethodID(eventClazz, "<init>", "(JB[B)V");

    const DemuxFilterTemiEvent &temiEvent = event.get<DemuxFilterEvent::Tag::temi>();
    jlong pts = temiEvent.pts;
@@ -859,63 +831,53 @@ void FilterClientCallbackImpl::getTemiEvent(jobjectArray &arr, const int size,
    jbyteArray array = env->NewByteArray(descrData.size());
    env->SetByteArrayRegion(array, 0, descrData.size(), reinterpret_cast<jbyte *>(&descrData[0]));

    jobject obj = env->NewObject(eventClazz, eventInit, pts, descrTag, array);
    jobject obj = env->NewObject(mTemiEventClass, mTemiEventInitID, pts, descrTag, array);
    env->SetObjectArrayElement(arr, size, obj);
    env->DeleteLocalRef(array);
    env->DeleteLocalRef(obj);
    env->DeleteLocalRef(eventClazz);
}

void FilterClientCallbackImpl::getScramblingStatusEvent(jobjectArray &arr, const int size,
                                                        const DemuxFilterEvent &event) {
    JNIEnv *env = AndroidRuntime::getJNIEnv();
    jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/ScramblingStatusEvent");
    jmethodID eventInit = env->GetMethodID(eventClazz, "<init>", "(I)V");

    const DemuxFilterMonitorEvent &scramblingStatus =
            event.get<DemuxFilterEvent::Tag::monitorEvent>()
                    .get<DemuxFilterMonitorEvent::Tag::scramblingStatus>();
    jobject obj = env->NewObject(eventClazz, eventInit, scramblingStatus);
    jobject obj = env->NewObject(mScramblingStatusEventClass, mScramblingStatusEventInitID,
                                 scramblingStatus);
    env->SetObjectArrayElement(arr, size, obj);
    env->DeleteLocalRef(obj);
    env->DeleteLocalRef(eventClazz);
}

void FilterClientCallbackImpl::getIpCidChangeEvent(jobjectArray &arr, const int size,
                                                   const DemuxFilterEvent &event) {
    JNIEnv *env = AndroidRuntime::getJNIEnv();
    jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/IpCidChangeEvent");
    jmethodID eventInit = env->GetMethodID(eventClazz, "<init>", "(I)V");

    const DemuxFilterMonitorEvent &cid = event.get<DemuxFilterEvent::Tag::monitorEvent>()
                                                 .get<DemuxFilterMonitorEvent::Tag::cid>();
    jobject obj = env->NewObject(eventClazz, eventInit, cid);
    jobject obj = env->NewObject(mIpCidChangeEventClass, mIpCidChangeEventInitID, cid);
    env->SetObjectArrayElement(arr, size, obj);
    env->DeleteLocalRef(obj);
    env->DeleteLocalRef(eventClazz);
}

void FilterClientCallbackImpl::getRestartEvent(jobjectArray &arr, const int size,
                                               const DemuxFilterEvent &event) {
    JNIEnv *env = AndroidRuntime::getJNIEnv();
    jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/RestartEvent");
    jmethodID eventInit = env->GetMethodID(eventClazz, "<init>", "(I)V");

    const int32_t &startId = event.get<DemuxFilterEvent::Tag::startId>();
    jobject obj = env->NewObject(eventClazz, eventInit, startId);
    jobject obj = env->NewObject(mRestartEventClass, mRestartEventInitID, startId);
    env->SetObjectArrayElement(arr, size, obj);
    env->DeleteLocalRef(obj);
    env->DeleteLocalRef(eventClazz);
}

void FilterClientCallbackImpl::onFilterEvent(const vector<DemuxFilterEvent> &events) {
    ALOGV("FilterClientCallbackImpl::onFilterEvent");
    JNIEnv *env = AndroidRuntime::getJNIEnv();
    jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/FilterEvent");
    jobjectArray array;

    if (!events.empty()) {
        array = env->NewObjectArray(events.size(), eventClazz, nullptr);
        array = env->NewObjectArray(events.size(), mEventClass, nullptr);
    }

    for (int i = 0, arraySize = 0; i < events.size(); i++) {
@@ -1004,7 +966,6 @@ void FilterClientCallbackImpl::onFilterEvent(const vector<DemuxFilterEvent> &eve
              "Filter object has been freed. Ignoring callback.");
    }
    env->DeleteLocalRef(array);
    env->DeleteLocalRef(eventClazz);
}

void FilterClientCallbackImpl::onFilterStatus(const DemuxFilterStatus status) {
@@ -1040,6 +1001,67 @@ void FilterClientCallbackImpl::setSharedFilter(jweak filterObj, sp<FilterClient>
    mSharedFilter = true;
}

FilterClientCallbackImpl::FilterClientCallbackImpl() {
    JNIEnv *env = AndroidRuntime::getJNIEnv();
    ScopedLocalRef eventClass =
        ScopedLocalRef(env, env->FindClass("android/media/tv/tuner/filter/FilterEvent"));
    ScopedLocalRef sectionEventClass =
        ScopedLocalRef(env, env->FindClass("android/media/tv/tuner/filter/SectionEvent"));
    ScopedLocalRef mediaEventClass =
        ScopedLocalRef(env, env->FindClass("android/media/tv/tuner/filter/MediaEvent"));
    ScopedLocalRef audioDescriptorClass =
        ScopedLocalRef(env, env->FindClass("android/media/tv/tuner/filter/AudioDescriptor"));
    ScopedLocalRef pesEventClass =
        ScopedLocalRef(env, env->FindClass("android/media/tv/tuner/filter/PesEvent"));
    ScopedLocalRef tsRecordEventClass =
        ScopedLocalRef(env, env->FindClass("android/media/tv/tuner/filter/TsRecordEvent"));
    ScopedLocalRef mmtpRecordEventClass =
        ScopedLocalRef(env, env->FindClass("android/media/tv/tuner/filter/MmtpRecordEvent"));
    ScopedLocalRef downloadEventClass =
        ScopedLocalRef(env, env->FindClass("android/media/tv/tuner/filter/DownloadEvent"));
    ScopedLocalRef ipPayloadEventClass =
        ScopedLocalRef(env, env->FindClass("android/media/tv/tuner/filter/IpPayloadEvent"));
    ScopedLocalRef temiEventClass =
        ScopedLocalRef(env, env->FindClass("android/media/tv/tuner/filter/TemiEvent"));
    ScopedLocalRef scramblingStatusEventClass =
        ScopedLocalRef(env, env->FindClass("android/media/tv/tuner/filter/ScramblingStatusEvent"));
    ScopedLocalRef ipCidChangeEventClass =
        ScopedLocalRef(env, env->FindClass("android/media/tv/tuner/filter/IpCidChangeEvent"));
    ScopedLocalRef restartEventClass =
        ScopedLocalRef(env, env->FindClass("android/media/tv/tuner/filter/RestartEvent"));
    mEventClass = (jclass) env->NewGlobalRef(eventClass.get());
    mSectionEventClass = (jclass) env->NewGlobalRef(sectionEventClass.get());
    mMediaEventClass = (jclass) env->NewGlobalRef(mediaEventClass.get());
    mAudioDescriptorClass = (jclass) env->NewGlobalRef(audioDescriptorClass.get());
    mPesEventClass = (jclass) env->NewGlobalRef(pesEventClass.get());
    mTsRecordEventClass = (jclass) env->NewGlobalRef(tsRecordEventClass.get());
    mMmtpRecordEventClass = (jclass) env->NewGlobalRef(mmtpRecordEventClass.get());
    mDownloadEventClass = (jclass) env->NewGlobalRef(downloadEventClass.get());
    mIpPayloadEventClass = (jclass) env->NewGlobalRef(ipPayloadEventClass.get());
    mTemiEventClass = (jclass) env->NewGlobalRef(temiEventClass.get());
    mScramblingStatusEventClass = (jclass) env->NewGlobalRef(scramblingStatusEventClass.get());
    mIpCidChangeEventClass = (jclass) env->NewGlobalRef(ipCidChangeEventClass.get());
    mRestartEventClass = (jclass) env->NewGlobalRef(restartEventClass.get());
    mSectionEventInitID = env->GetMethodID(mSectionEventClass, "<init>", "(IIIJ)V");
    mMediaEventInitID = env->GetMethodID(
            mMediaEventClass,
            "<init>",
            "(IZJZJJJLandroid/media/MediaCodec$LinearBlock;"
            "ZJIZILandroid/media/tv/tuner/filter/AudioDescriptor;"
            "Ljava/util/List;)V");
    mAudioDescriptorInitID = env->GetMethodID(mAudioDescriptorClass, "<init>", "(BBCBBB)V");
    mPesEventInitID = env->GetMethodID(mPesEventClass, "<init>", "(III)V");
    mTsRecordEventInitID = env->GetMethodID(mTsRecordEventClass, "<init>", "(IIIJJI)V");
    mMmtpRecordEventInitID = env->GetMethodID(mMmtpRecordEventClass, "<init>", "(IJIJII)V");
    mDownloadEventInitID = env->GetMethodID(mDownloadEventClass, "<init>", "(IIIIII)V");
    mIpPayloadEventInitID = env->GetMethodID(mIpPayloadEventClass, "<init>", "(I)V");
    mTemiEventInitID = env->GetMethodID(mTemiEventClass, "<init>", "(JB[B)V");
    mScramblingStatusEventInitID = env->GetMethodID(mScramblingStatusEventClass, "<init>", "(I)V");
    mIpCidChangeEventInitID = env->GetMethodID(mIpCidChangeEventClass, "<init>", "(I)V");
    mRestartEventInitID = env->GetMethodID(mRestartEventClass, "<init>", "(I)V");
    mMediaEventFieldContextID = env->GetFieldID(mMediaEventClass, "mNativeContext", "J");
}

FilterClientCallbackImpl::~FilterClientCallbackImpl() {
    JNIEnv *env = AndroidRuntime::getJNIEnv();
    if (mFilterObj != nullptr) {
@@ -1047,6 +1069,19 @@ FilterClientCallbackImpl::~FilterClientCallbackImpl() {
        mFilterObj = nullptr;
    }
    mFilterClient = nullptr;
    env->DeleteGlobalRef(mEventClass);
    env->DeleteGlobalRef(mSectionEventClass);
    env->DeleteGlobalRef(mMediaEventClass);
    env->DeleteGlobalRef(mAudioDescriptorClass);
    env->DeleteGlobalRef(mPesEventClass);
    env->DeleteGlobalRef(mTsRecordEventClass);
    env->DeleteGlobalRef(mMmtpRecordEventClass);
    env->DeleteGlobalRef(mDownloadEventClass);
    env->DeleteGlobalRef(mIpPayloadEventClass);
    env->DeleteGlobalRef(mTemiEventClass);
    env->DeleteGlobalRef(mScramblingStatusEventClass);
    env->DeleteGlobalRef(mIpCidChangeEventClass);
    env->DeleteGlobalRef(mRestartEventClass);
}

/////////////// FrontendClientCallbackImpl ///////////////////////
+27 −0
Original line number Diff line number Diff line
@@ -125,6 +125,7 @@ struct MediaEvent : public RefBase {
};

struct FilterClientCallbackImpl : public FilterClientCallback {
    FilterClientCallbackImpl();
    ~FilterClientCallbackImpl();
    virtual void onFilterEvent(const vector<DemuxFilterEvent>& events);
    virtual void onFilterStatus(const DemuxFilterStatus status);
@@ -135,6 +136,32 @@ struct FilterClientCallbackImpl : public FilterClientCallback {
private:
    jweak mFilterObj;
    sp<FilterClient> mFilterClient;
    jclass mEventClass;
    jclass mSectionEventClass;
    jclass mMediaEventClass;
    jclass mAudioDescriptorClass;
    jclass mPesEventClass;
    jclass mTsRecordEventClass;
    jclass mMmtpRecordEventClass;
    jclass mDownloadEventClass;
    jclass mIpPayloadEventClass;
    jclass mTemiEventClass;
    jclass mScramblingStatusEventClass;
    jclass mIpCidChangeEventClass;
    jclass mRestartEventClass;
    jmethodID mSectionEventInitID;
    jmethodID mMediaEventInitID;
    jmethodID mAudioDescriptorInitID;
    jmethodID mPesEventInitID;
    jmethodID mTsRecordEventInitID;
    jmethodID mMmtpRecordEventInitID;
    jmethodID mDownloadEventInitID;
    jmethodID mIpPayloadEventInitID;
    jmethodID mTemiEventInitID;
    jmethodID mScramblingStatusEventInitID;
    jmethodID mIpCidChangeEventInitID;
    jmethodID mRestartEventInitID;
    jfieldID mMediaEventFieldContextID;
    bool mSharedFilter;
    void getSectionEvent(jobjectArray& arr, const int size, const DemuxFilterEvent& event);
    void getMediaEvent(jobjectArray& arr, const int size, const DemuxFilterEvent& event);