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

Commit 3bd5b183 authored by Ray Chin's avatar Ray Chin
Browse files

Fix Tuner memory leak problem in jni

Bug: 254803449
Test: atest android.media.tv.tuner.cts with cf_x86_tv-userdebug
Change-Id: Ib5d3caf93a4e2773328b7a2463afb0fc41a611b3
parent 8e0df7ed
Loading
Loading
Loading
Loading
+81 −0
Original line number Diff line number Diff line
@@ -360,6 +360,7 @@ void LnbClientCallbackImpl::onEvent(const LnbEventType lnbEventType) {
                lnb,
                gFields.onLnbEventID,
                (jint)lnbEventType);
        env->DeleteLocalRef(lnb);
    } else {
        ALOGE("LnbClientCallbackImpl::onEvent:"
                "Lnb object has been freed. Ignoring callback.");
@@ -378,6 +379,7 @@ void LnbClientCallbackImpl::onDiseqcMessage(const vector<uint8_t> &diseqcMessage
                lnb,
                gFields.onLnbDiseqcMessageID,
                array);
        env->DeleteLocalRef(lnb);
    } else {
        ALOGE("LnbClientCallbackImpl::onDiseqcMessage:"
                "Lnb object has been freed. Ignoring callback.");
@@ -404,6 +406,7 @@ void DvrClientCallbackImpl::onRecordStatus(RecordStatus status) {
    jobject dvr(env->NewLocalRef(mDvrObj));
    if (!env->IsSameObject(dvr, nullptr)) {
        env->CallVoidMethod(dvr, gFields.onDvrRecordStatusID, (jint)status);
        env->DeleteLocalRef(dvr);
    } else {
        ALOGE("DvrClientCallbackImpl::onRecordStatus:"
                "Dvr object has been freed. Ignoring callback.");
@@ -416,6 +419,7 @@ void DvrClientCallbackImpl::onPlaybackStatus(PlaybackStatus status) {
    jobject dvr(env->NewLocalRef(mDvrObj));
    if (!env->IsSameObject(dvr, nullptr)) {
        env->CallVoidMethod(dvr, gFields.onDvrPlaybackStatusID, (jint)status);
        env->DeleteLocalRef(dvr);
    } else {
        ALOGE("DvrClientCallbackImpl::onPlaybackStatus:"
                "Dvr object has been freed. Ignoring callback.");
@@ -603,6 +607,7 @@ void FilterClientCallbackImpl::getSectionEvent(jobjectArray &arr, const int size

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

void FilterClientCallbackImpl::getMediaEvent(jobjectArray &arr, const int size,
@@ -673,6 +678,10 @@ void FilterClientCallbackImpl::getMediaEvent(jobjectArray &arr, const int size,
    }

    env->SetObjectArrayElement(arr, size, obj);
    if(audioDescriptor != nullptr) {
        env->DeleteLocalRef(audioDescriptor);
    }
    env->DeleteLocalRef(obj);
}

void FilterClientCallbackImpl::getPesEvent(jobjectArray &arr, const int size,
@@ -688,6 +697,7 @@ void FilterClientCallbackImpl::getPesEvent(jobjectArray &arr, const int size,

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

void FilterClientCallbackImpl::getTsRecordEvent(jobjectArray &arr, const int size,
@@ -725,6 +735,7 @@ void FilterClientCallbackImpl::getTsRecordEvent(jobjectArray &arr, const int siz
    jobject obj =
            env->NewObject(eventClazz, eventInit, jpid, ts, sc, byteNumber, pts, firstMbInSlice);
    env->SetObjectArrayElement(arr, size, obj);
    env->DeleteLocalRef(obj);
}

void FilterClientCallbackImpl::getMmtpRecordEvent(jobjectArray &arr, const int size,
@@ -745,6 +756,7 @@ void FilterClientCallbackImpl::getMmtpRecordEvent(jobjectArray &arr, const int s
    jobject obj = env->NewObject(eventClazz, eventInit, scHevcIndexMask, byteNumber,
                                 mpuSequenceNumber, pts, firstMbInSlice, tsIndexMask);
    env->SetObjectArrayElement(arr, size, obj);
    env->DeleteLocalRef(obj);
}

void FilterClientCallbackImpl::getDownloadEvent(jobjectArray &arr, const int size,
@@ -764,6 +776,7 @@ void FilterClientCallbackImpl::getDownloadEvent(jobjectArray &arr, const int siz
    jobject obj = env->NewObject(eventClazz, eventInit, itemId, downloadId, mpuSequenceNumber,
                                 itemFragmentIndex, lastItemFragmentIndex, dataLength);
    env->SetObjectArrayElement(arr, size, obj);
    env->DeleteLocalRef(obj);
}

void FilterClientCallbackImpl::getIpPayloadEvent(jobjectArray &arr, const int size,
@@ -776,6 +789,7 @@ void FilterClientCallbackImpl::getIpPayloadEvent(jobjectArray &arr, const int si
    jint dataLength = ipPayloadEvent.dataLength;
    jobject obj = env->NewObject(eventClazz, eventInit, dataLength);
    env->SetObjectArrayElement(arr, size, obj);
    env->DeleteLocalRef(obj);
}

void FilterClientCallbackImpl::getTemiEvent(jobjectArray &arr, const int size,
@@ -794,6 +808,8 @@ void FilterClientCallbackImpl::getTemiEvent(jobjectArray &arr, const int size,

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

void FilterClientCallbackImpl::getScramblingStatusEvent(jobjectArray &arr, const int size,
@@ -807,6 +823,7 @@ void FilterClientCallbackImpl::getScramblingStatusEvent(jobjectArray &arr, const
                    .get<DemuxFilterMonitorEvent::Tag::scramblingStatus>();
    jobject obj = env->NewObject(eventClazz, eventInit, scramblingStatus);
    env->SetObjectArrayElement(arr, size, obj);
    env->DeleteLocalRef(obj);
}

void FilterClientCallbackImpl::getIpCidChangeEvent(jobjectArray &arr, const int size,
@@ -819,6 +836,7 @@ void FilterClientCallbackImpl::getIpCidChangeEvent(jobjectArray &arr, const int
                                                 .get<DemuxFilterMonitorEvent::Tag::cid>();
    jobject obj = env->NewObject(eventClazz, eventInit, cid);
    env->SetObjectArrayElement(arr, size, obj);
    env->DeleteLocalRef(obj);
}

void FilterClientCallbackImpl::getRestartEvent(jobjectArray &arr, const int size,
@@ -922,10 +940,12 @@ void FilterClientCallbackImpl::onFilterEvent(const vector<DemuxFilterEvent> &eve
            methodID = gFields.onSharedFilterEventID;
        }
        env->CallVoidMethod(filter, methodID, array);
        env->DeleteLocalRef(filter);
    } else {
        ALOGE("FilterClientCallbackImpl::onFilterEvent:"
              "Filter object has been freed. Ignoring callback.");
    }
    env->DeleteLocalRef(array);
}

void FilterClientCallbackImpl::onFilterStatus(const DemuxFilterStatus status) {
@@ -938,6 +958,7 @@ void FilterClientCallbackImpl::onFilterStatus(const DemuxFilterStatus status) {
            methodID = gFields.onSharedFilterStatusID;
        }
        env->CallVoidMethod(filter, methodID, (jint)static_cast<uint8_t>(status));
        env->DeleteLocalRef(filter);
    } else {
        ALOGE("FilterClientCallbackImpl::onFilterStatus:"
              "Filter object has been freed. Ignoring callback.");
@@ -1006,6 +1027,7 @@ void FrontendClientCallbackImpl::onEvent(FrontendEventType frontendEventType) {
                    frontend,
                    gFields.onFrontendEventID,
                    (jint)frontendEventType);
            env->DeleteLocalRef(frontend);
        } else {
            ALOGW("FrontendClientCallbackImpl::onEvent:"
                    "Frontend object has been freed. Ignoring callback.");
@@ -1028,6 +1050,7 @@ void FrontendClientCallbackImpl::onScanMessage(
            continue;
        }
        executeOnScanMessage(env, clazz, frontend, type, message);
        env->DeleteLocalRef(frontend);
    }
}

@@ -1069,6 +1092,7 @@ void FrontendClientCallbackImpl::executeOnScanMessage(
            env->SetLongArrayRegion(freqs, 0, v.size(), reinterpret_cast<jlong *>(&v[0]));
            env->CallVoidMethod(frontend, env->GetMethodID(clazz, "onFrequenciesReport", "([J)V"),
                                freqs);
            env->DeleteLocalRef(freqs);
            break;
        }
        case FrontendScanMessageType::SYMBOL_RATE: {
@@ -1077,6 +1101,7 @@ void FrontendClientCallbackImpl::executeOnScanMessage(
            env->SetIntArrayRegion(symbolRates, 0, v.size(), reinterpret_cast<jint *>(&v[0]));
            env->CallVoidMethod(frontend, env->GetMethodID(clazz, "onSymbolRates", "([I)V"),
                                symbolRates);
            env->DeleteLocalRef(symbolRates);
            break;
        }
        case FrontendScanMessageType::HIERARCHY: {
@@ -1094,6 +1119,7 @@ void FrontendClientCallbackImpl::executeOnScanMessage(
            jintArray plpIds = env->NewIntArray(jintV.size());
            env->SetIntArrayRegion(plpIds, 0, jintV.size(), reinterpret_cast<jint *>(&jintV[0]));
            env->CallVoidMethod(frontend, env->GetMethodID(clazz, "onPlpIds", "([I)V"), plpIds);
            env->DeleteLocalRef(plpIds);
            break;
        }
        case FrontendScanMessageType::GROUP_IDS: {
@@ -1101,6 +1127,7 @@ void FrontendClientCallbackImpl::executeOnScanMessage(
            jintArray groupIds = env->NewIntArray(jintV.size());
            env->SetIntArrayRegion(groupIds, 0, jintV.size(), reinterpret_cast<jint *>(&jintV[0]));
            env->CallVoidMethod(frontend, env->GetMethodID(clazz, "onGroupIds", "([I)V"), groupIds);
            env->DeleteLocalRef(groupIds);
            break;
        }
        case FrontendScanMessageType::INPUT_STREAM_IDS: {
@@ -1109,6 +1136,7 @@ void FrontendClientCallbackImpl::executeOnScanMessage(
            env->SetIntArrayRegion(streamIds, 0, jintV.size(), reinterpret_cast<jint *>(&jintV[0]));
            env->CallVoidMethod(frontend, env->GetMethodID(clazz, "onInputStreamIds", "([I)V"),
                                streamIds);
            env->DeleteLocalRef(streamIds);
            break;
        }
        case FrontendScanMessageType::STANDARD: {
@@ -1142,12 +1170,14 @@ void FrontendClientCallbackImpl::executeOnScanMessage(
                jboolean lls = info.bLlsFlag;
                jobject obj = env->NewObject(plpClazz, init, plpId, lls);
                env->SetObjectArrayElement(array, i, obj);
                env->DeleteLocalRef(obj);
            }
            env->CallVoidMethod(frontend,
                                env->GetMethodID(clazz, "onAtsc3PlpInfos",
                                                 "([Landroid/media/tv/tuner/frontend/"
                                                 "Atsc3PlpInfo;)V"),
                                array);
            env->DeleteLocalRef(array);
            break;
        }
        case FrontendScanMessageType::MODULATION: {
@@ -1219,6 +1249,7 @@ void FrontendClientCallbackImpl::executeOnScanMessage(
            env->SetIntArrayRegion(cellIds, 0, jintV.size(), reinterpret_cast<jint *>(&jintV[0]));
            env->CallVoidMethod(frontend, env->GetMethodID(clazz, "onDvbtCellIdsReported", "([I)V"),
                                cellIds);
            env->DeleteLocalRef(cellIds);
            break;
        }
        default:
@@ -1673,6 +1704,7 @@ jobjectArray JTuner::getFrontendStatusReadiness(jintArray types) {
    for (int i = 0; i < size; i++) {
        jobject readinessObj = env->NewObject(clazz, init, intTypes[i], readiness[i]);
        env->SetObjectArrayElement(valObj, i, readinessObj);
        env->DeleteLocalRef(readinessObj);
    }
    return valObj;
}
@@ -2081,6 +2113,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                jobject newBooleanObj = env->NewObject(booleanClazz, initBoolean,
                                                       s.get<FrontendStatus::Tag::isDemodLocked>());
                env->SetObjectField(statusObj, field, newBooleanObj);
                env->DeleteLocalRef(newBooleanObj);
                break;
            }
            case FrontendStatus::Tag::snr: {
@@ -2088,6 +2121,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                jobject newIntegerObj =
                        env->NewObject(intClazz, initInt, s.get<FrontendStatus::Tag::snr>());
                env->SetObjectField(statusObj, field, newIntegerObj);
                env->DeleteLocalRef(newIntegerObj);
                break;
            }
            case FrontendStatus::Tag::ber: {
@@ -2095,6 +2129,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                jobject newIntegerObj =
                        env->NewObject(intClazz, initInt, s.get<FrontendStatus::Tag::ber>());
                env->SetObjectField(statusObj, field, newIntegerObj);
                env->DeleteLocalRef(newIntegerObj);
                break;
            }
            case FrontendStatus::Tag::per: {
@@ -2102,6 +2137,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                jobject newIntegerObj =
                        env->NewObject(intClazz, initInt, s.get<FrontendStatus::Tag::per>());
                env->SetObjectField(statusObj, field, newIntegerObj);
                env->DeleteLocalRef(newIntegerObj);
                break;
            }
            case FrontendStatus::Tag::preBer: {
@@ -2109,6 +2145,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                jobject newIntegerObj =
                        env->NewObject(intClazz, initInt, s.get<FrontendStatus::Tag::preBer>());
                env->SetObjectField(statusObj, field, newIntegerObj);
                env->DeleteLocalRef(newIntegerObj);
                break;
            }
            case FrontendStatus::Tag::signalQuality: {
@@ -2116,6 +2153,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                jobject newIntegerObj = env->NewObject(intClazz, initInt,
                                                       s.get<FrontendStatus::Tag::signalQuality>());
                env->SetObjectField(statusObj, field, newIntegerObj);
                env->DeleteLocalRef(newIntegerObj);
                break;
            }
            case FrontendStatus::Tag::signalStrength: {
@@ -2124,6 +2162,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                        env->NewObject(intClazz, initInt,
                                       s.get<FrontendStatus::Tag::signalStrength>());
                env->SetObjectField(statusObj, field, newIntegerObj);
                env->DeleteLocalRef(newIntegerObj);
                break;
            }
            case FrontendStatus::Tag::symbolRate: {
@@ -2131,6 +2170,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                jobject newIntegerObj =
                        env->NewObject(intClazz, initInt, s.get<FrontendStatus::Tag::symbolRate>());
                env->SetObjectField(statusObj, field, newIntegerObj);
                env->DeleteLocalRef(newIntegerObj);
                break;
            }
            case FrontendStatus::Tag::innerFec: {
@@ -2141,6 +2181,8 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                        env->NewObject(longClazz, initLong,
                                       static_cast<long>(s.get<FrontendStatus::Tag::innerFec>()));
                env->SetObjectField(statusObj, field, newLongObj);
                env->DeleteLocalRef(longClazz);
                env->DeleteLocalRef(newLongObj);
                break;
            }
            case FrontendStatus::Tag::modulationStatus: {
@@ -2183,6 +2225,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                if (valid) {
                    jobject newIntegerObj = env->NewObject(intClazz, initInt, intModulation);
                    env->SetObjectField(statusObj, field, newIntegerObj);
                    env->DeleteLocalRef(newIntegerObj);
                }
                break;
            }
@@ -2192,6 +2235,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                        env->NewObject(intClazz, initInt,
                                       static_cast<jint>(s.get<FrontendStatus::Tag::inversion>()));
                env->SetObjectField(statusObj, field, newIntegerObj);
                env->DeleteLocalRef(newIntegerObj);
                break;
            }
            case FrontendStatus::Tag::lnbVoltage: {
@@ -2200,6 +2244,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                        env->NewObject(intClazz, initInt,
                                       static_cast<jint>(s.get<FrontendStatus::Tag::lnbVoltage>()));
                env->SetObjectField(statusObj, field, newIntegerObj);
                env->DeleteLocalRef(newIntegerObj);
                break;
            }
            case FrontendStatus::Tag::plpId: {
@@ -2207,6 +2252,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                jobject newIntegerObj =
                        env->NewObject(intClazz, initInt, s.get<FrontendStatus::Tag::plpId>());
                env->SetObjectField(statusObj, field, newIntegerObj);
                env->DeleteLocalRef(newIntegerObj);
                break;
            }
            case FrontendStatus::Tag::isEWBS: {
@@ -2214,6 +2260,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                jobject newBooleanObj = env->NewObject(booleanClazz, initBoolean,
                                                       s.get<FrontendStatus::Tag::isEWBS>());
                env->SetObjectField(statusObj, field, newBooleanObj);
                env->DeleteLocalRef(newBooleanObj);
                break;
            }
            case FrontendStatus::Tag::agc: {
@@ -2221,6 +2268,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                jobject newIntegerObj =
                        env->NewObject(intClazz, initInt, s.get<FrontendStatus::Tag::agc>());
                env->SetObjectField(statusObj, field, newIntegerObj);
                env->DeleteLocalRef(newIntegerObj);
                break;
            }
            case FrontendStatus::Tag::isLnaOn: {
@@ -2228,6 +2276,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                jobject newBooleanObj = env->NewObject(booleanClazz, initBoolean,
                                                       s.get<FrontendStatus::Tag::isLnaOn>());
                env->SetObjectField(statusObj, field, newBooleanObj);
                env->DeleteLocalRef(newBooleanObj);
                break;
            }
            case FrontendStatus::Tag::isLayerError: {
@@ -2241,6 +2290,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                    env->SetBooleanArrayRegion(valObj, i, 1, &x);
                }
                env->SetObjectField(statusObj, field, valObj);
                env->DeleteLocalRef(valObj);
                break;
            }
            case FrontendStatus::Tag::mer: {
@@ -2248,6 +2298,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                jobject newIntegerObj =
                        env->NewObject(intClazz, initInt, s.get<FrontendStatus::Tag::mer>());
                env->SetObjectField(statusObj, field, newIntegerObj);
                env->DeleteLocalRef(newIntegerObj);
                break;
            }
            case FrontendStatus::Tag::freqOffset: {
@@ -2255,6 +2306,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                jobject newLongObj = env->NewObject(longClazz, initLong,
                                                    s.get<FrontendStatus::Tag::freqOffset>());
                env->SetObjectField(statusObj, field, newLongObj);
                env->DeleteLocalRef(newLongObj);
                break;
            }
            case FrontendStatus::Tag::hierarchy: {
@@ -2263,6 +2315,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                        env->NewObject(intClazz, initInt,
                                       static_cast<jint>(s.get<FrontendStatus::Tag::hierarchy>()));
                env->SetObjectField(statusObj, field, newIntegerObj);
                env->DeleteLocalRef(newIntegerObj);
                break;
            }
            case FrontendStatus::Tag::isRfLocked: {
@@ -2270,6 +2323,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                jobject newBooleanObj = env->NewObject(booleanClazz, initBoolean,
                                                       s.get<FrontendStatus::Tag::isRfLocked>());
                env->SetObjectField(statusObj, field, newBooleanObj);
                env->DeleteLocalRef(newBooleanObj);
                break;
            }
            case FrontendStatus::Tag::plpInfo: {
@@ -2289,9 +2343,12 @@ jobject JTuner::getFrontendStatus(jintArray types) {

                    jobject plpObj = env->NewObject(plpClazz, initPlp, plpId, isLocked, uec);
                    env->SetObjectArrayElement(valObj, i, plpObj);
                    env->DeleteLocalRef(plpObj);
                }

                env->SetObjectField(statusObj, field, valObj);
                env->DeleteLocalRef(plpClazz);
                env->DeleteLocalRef(valObj);
                break;
            }
            case FrontendStatus::Tag::modulations: {
@@ -2374,6 +2431,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                if (valid) {
                    env->SetObjectField(statusObj, field, valObj);
                }
                env->DeleteLocalRef(valObj);
                break;
            }
            case FrontendStatus::Tag::bers: {
@@ -2384,6 +2442,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                env->SetIntArrayRegion(valObj, 0, v.size(), reinterpret_cast<jint *>(&v[0]));

                env->SetObjectField(statusObj, field, valObj);
                env->DeleteLocalRef(valObj);
                break;
            }
            case FrontendStatus::Tag::codeRates: {
@@ -2394,6 +2453,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                env->SetIntArrayRegion(valObj, 0, v.size(), reinterpret_cast<jint *>(&v[0]));

                env->SetObjectField(statusObj, field, valObj);
                env->DeleteLocalRef(valObj);
                break;
            }
            case FrontendStatus::Tag::bandwidth: {
@@ -2434,6 +2494,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                if (valid) {
                    jobject newIntegerObj = env->NewObject(intClazz, initInt, intBandwidth);
                    env->SetObjectField(statusObj, field, newIntegerObj);
                    env->DeleteLocalRef(newIntegerObj);
                }
                break;
            }
@@ -2465,6 +2526,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                if (valid) {
                    jobject newIntegerObj = env->NewObject(intClazz, initInt, intInterval);
                    env->SetObjectField(statusObj, field, newIntegerObj);
                    env->DeleteLocalRef(newIntegerObj);
                }
                break;
            }
@@ -2497,6 +2559,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                if (valid) {
                    jobject newIntegerObj = env->NewObject(intClazz, initInt, intTransmissionMode);
                    env->SetObjectField(statusObj, field, newIntegerObj);
                    env->DeleteLocalRef(newIntegerObj);
                }
                break;
            }
@@ -2505,6 +2568,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                jobject newIntegerObj =
                        env->NewObject(intClazz, initInt, s.get<FrontendStatus::Tag::uec>());
                env->SetObjectField(statusObj, field, newIntegerObj);
                env->DeleteLocalRef(newIntegerObj);
                break;
            }
            case FrontendStatus::Tag::systemId: {
@@ -2512,6 +2576,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                jobject newIntegerObj =
                        env->NewObject(intClazz, initInt, s.get<FrontendStatus::Tag::systemId>());
                env->SetObjectField(statusObj, field, newIntegerObj);
                env->DeleteLocalRef(newIntegerObj);
                break;
            }
            case FrontendStatus::Tag::interleaving: {
@@ -2558,6 +2623,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                if (valid) {
                    env->SetObjectField(statusObj, field, valObj);
                }
                env->DeleteLocalRef(valObj);
                break;
            }
            case FrontendStatus::Tag::isdbtSegment: {
@@ -2568,6 +2634,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                env->SetIntArrayRegion(valObj, 0, v.size(), reinterpret_cast<jint*>(&v[0]));

                env->SetObjectField(statusObj, field, valObj);
                env->DeleteLocalRef(valObj);
                break;
            }
            case FrontendStatus::Tag::tsDataRate: {
@@ -2578,6 +2645,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                env->SetIntArrayRegion(valObj, 0, v.size(), reinterpret_cast<jint *>(&v[0]));

                env->SetObjectField(statusObj, field, valObj);
                env->DeleteLocalRef(valObj);
                break;
            }
            case FrontendStatus::Tag::rollOff: {
@@ -2605,6 +2673,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                if (valid) {
                    jobject newIntegerObj = env->NewObject(intClazz, initInt, intRollOff);
                    env->SetObjectField(statusObj, field, newIntegerObj);
                    env->DeleteLocalRef(newIntegerObj);
                }
                break;
            }
@@ -2613,6 +2682,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                jobject newBooleanObj = env->NewObject(booleanClazz, initBoolean,
                                                       s.get<FrontendStatus::Tag::isMiso>());
                env->SetObjectField(statusObj, field, newBooleanObj);
                env->DeleteLocalRef(newBooleanObj);
                break;
            }
            case FrontendStatus::Tag::isLinear: {
@@ -2620,6 +2690,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                jobject newBooleanObj = env->NewObject(booleanClazz, initBoolean,
                                                       s.get<FrontendStatus::Tag::isLinear>());
                env->SetObjectField(statusObj, field, newBooleanObj);
                env->DeleteLocalRef(newBooleanObj);
                break;
            }
            case FrontendStatus::Tag::isShortFrames: {
@@ -2627,6 +2698,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                jobject newBooleanObj = env->NewObject(booleanClazz, initBoolean,
                                                       s.get<FrontendStatus::Tag::isShortFrames>());
                env->SetObjectField(statusObj, field, newBooleanObj);
                env->DeleteLocalRef(newBooleanObj);
                break;
            }
            case FrontendStatus::Tag::isdbtMode: {
@@ -2634,6 +2706,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                jobject newIntegerObj =
                        env->NewObject(intClazz, initInt, s.get<FrontendStatus::Tag::isdbtMode>());
                env->SetObjectField(statusObj, field, newIntegerObj);
                env->DeleteLocalRef(newIntegerObj);
                break;
            }
            case FrontendStatus::Tag::partialReceptionFlag: {
@@ -2643,6 +2716,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                        env->NewObject(intClazz, initInt,
                                       s.get<FrontendStatus::Tag::partialReceptionFlag>());
                env->SetObjectField(statusObj, field, newIntegerObj);
                env->DeleteLocalRef(newIntegerObj);
                break;
            }
            case FrontendStatus::Tag::streamIdList: {
@@ -2653,6 +2727,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                env->SetIntArrayRegion(valObj, 0, v.size(), reinterpret_cast<jint *>(&ids[0]));

                env->SetObjectField(statusObj, field, valObj);
                env->DeleteLocalRef(valObj);
                break;
            }
            case FrontendStatus::Tag::dvbtCellIds: {
@@ -2663,6 +2738,7 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                env->SetIntArrayRegion(valObj, 0, v.size(), reinterpret_cast<jint *>(&ids[0]));

                env->SetObjectField(statusObj, field, valObj);
                env->DeleteLocalRef(valObj);
                break;
            }
            case FrontendStatus::Tag::allPlpInfo: {
@@ -2678,9 +2754,12 @@ jobject JTuner::getFrontendStatus(jintArray types) {
                    jobject plpObj = env->NewObject(plpClazz, initPlp, plpInfos[i].plpId,
                                                    plpInfos[i].bLlsFlag);
                    env->SetObjectArrayElement(valObj, i, plpObj);
                    env->DeleteLocalRef(plpObj);
                }

                env->SetObjectField(statusObj, field, valObj);
                env->DeleteLocalRef(plpClazz);
                env->DeleteLocalRef(valObj);
                break;
            }
        }
@@ -2837,6 +2916,7 @@ static vector<FrontendAtsc3PlpSettings> getAtsc3PlpSettings(JNIEnv *env, const j
                .fec = fec,
        };
        plps[i] = frontendAtsc3PlpSettings;
        env->DeleteLocalRef(plp);
    }
    return plps;
}
@@ -3192,6 +3272,7 @@ static FrontendSettings getIsdbtFrontendSettings(JNIEnv *env, const jobject& set
                env->GetIntField(layer, env->GetFieldID(layerClazz, "mCodeRate", "I")));
        frontendIsdbtSettings.layerSettings[i].numOfSegment =
                env->GetIntField(layer, env->GetFieldID(layerClazz, "mNumOfSegments", "I"));
        env->DeleteLocalRef(layer);
    }

    frontendSettings.set<FrontendSettings::Tag::isdbt>(frontendIsdbtSettings);