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

Commit 056ebb7d authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Tuner JNI: fix filter.read and DvrSettings" into rvc-dev am: 7b42f2d3 am: 31798957

Change-Id: I284d65ce19de97ea91197e43afb847333973946f
parents ce11e492 31798957
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -139,6 +139,10 @@ public class DvrSettings {

        /**
         * Sets status mask.
         *
         * <p>Use Filter.STATUS_ for {@link DvrRecorder} and DvrPlayback.STATUS_ for
         * {@link DvrPlayback}.
         * <p>If status mask is not set, no status is send to the listener.
         */
        @NonNull
        public Builder setStatusMask(@Filter.Status int statusMask) {
+1 −1
Original line number Diff line number Diff line
@@ -100,7 +100,7 @@ public final class IpFilterConfiguration extends FilterConfiguration {
     */
    public static final class Builder {
        private byte[] mSrcIpAddress = {0, 0, 0, 0};
        private byte[] mDstIpAddress = {0, 0, 0, 0};;
        private byte[] mDstIpAddress = {0, 0, 0, 0};
        private int mSrcPort = 0;
        private int mDstPort = 0;
        private boolean mPassthrough = false;
+2 −2
Original line number Diff line number Diff line
@@ -50,7 +50,7 @@ public final class MmtpFilterConfiguration extends FilterConfiguration {
    }

    /**
     * Creates a builder for {@link IpFilterConfiguration}.
     * Creates a builder for {@link MmtpFilterConfiguration}.
     */
    @NonNull
    public static Builder builder() {
@@ -58,7 +58,7 @@ public final class MmtpFilterConfiguration extends FilterConfiguration {
    }

    /**
     * Builder for {@link IpFilterConfiguration}.
     * Builder for {@link MmtpFilterConfiguration}.
     */
    public static final class Builder {
        private int mMmtpPid = Tuner.INVALID_TS_PID;
+38 −20
Original line number Diff line number Diff line
@@ -2362,28 +2362,25 @@ static sp<Filter> getFilter(JNIEnv *env, jobject filter) {
    return (Filter *)env->GetLongField(filter, gFields.filterContext);
}

static DvrSettings getDvrSettings(JNIEnv *env, jobject settings) {
static DvrSettings getDvrSettings(JNIEnv *env, jobject settings, bool isRecorder) {
    DvrSettings dvrSettings;
    jclass clazz = env->FindClass("android/media/tv/tuner/dvr/DvrSettings");
    uint32_t statusMask =
            static_cast<uint32_t>(env->GetIntField(
                    settings, env->GetFieldID(clazz, "mStatusMask", "I")));
    uint32_t lowThreshold =
            static_cast<uint32_t>(env->GetIntField(
                    settings, env->GetFieldID(clazz, "mLowThreshold", "I")));
            static_cast<uint32_t>(env->GetLongField(
                    settings, env->GetFieldID(clazz, "mLowThreshold", "J")));
    uint32_t highThreshold =
            static_cast<uint32_t>(env->GetIntField(
                    settings, env->GetFieldID(clazz, "mHighThreshold", "I")));
            static_cast<uint32_t>(env->GetLongField(
                    settings, env->GetFieldID(clazz, "mHighThreshold", "J")));
    uint8_t packetSize =
            static_cast<uint8_t>(env->GetIntField(
                    settings, env->GetFieldID(clazz, "mPacketSize", "I")));
            static_cast<uint8_t>(env->GetLongField(
                    settings, env->GetFieldID(clazz, "mPacketSize", "J")));
    DataFormat dataFormat =
            static_cast<DataFormat>(env->GetIntField(
                    settings, env->GetFieldID(clazz, "mDataFormat", "I")));
    DvrType type =
            static_cast<DvrType>(env->GetIntField(
                    settings, env->GetFieldID(clazz, "mType", "I")));
    if (type == DvrType::RECORD) {
    if (isRecorder) {
        RecordSettings recordSettings {
                .statusMask = static_cast<unsigned char>(statusMask),
                .lowThreshold = lowThreshold,
@@ -2392,7 +2389,7 @@ static DvrSettings getDvrSettings(JNIEnv *env, jobject settings) {
                .packetSize = packetSize,
        };
        dvrSettings.record(recordSettings);
    } else if (type == DvrType::PLAYBACK) {
    } else {
        PlaybackSettings PlaybackSettings {
                .statusMask = statusMask,
                .lowThreshold = lowThreshold,
@@ -3101,8 +3098,9 @@ static jint android_media_tv_Tuner_read_filter_fmq(
        JNIEnv *env, jobject filter, jbyteArray buffer, jlong offset, jlong size) {
    sp<Filter> filterSp = getFilter(env, filter);
    if (filterSp == NULL) {
        ALOGD("Failed to read filter FMQ: filter not found");
        return (jint) Result::INVALID_STATE;
        jniThrowException(env, "java/lang/IllegalStateException",
                "Failed to read filter FMQ: filter not found");
        return 0;
    }
    return copyData(env, filterSp->mFilterMQ, filterSp->mFilterMQEventFlag, buffer, offset, size);
}
@@ -3337,7 +3335,9 @@ static jint android_media_tv_Tuner_configure_dvr(JNIEnv *env, jobject dvr, jobje
        return (int)Result::NOT_INITIALIZED;
    }
    sp<IDvr> iDvrSp = dvrSp->getIDvr();
    Result result = iDvrSp->configure(getDvrSettings(env, settings));
    bool isRecorder =
            env->IsInstanceOf(dvr, env->FindClass("android/media/tv/tuner/dvr/DvrRecorder"));
    Result result = iDvrSp->configure(getDvrSettings(env, settings, isRecorder));
    if (result != Result::SUCCESS) {
        return (jint) result;
    }
@@ -3440,19 +3440,21 @@ static int android_media_tv_Tuner_close_lnb(JNIEnv* env, jobject lnb) {
    return (jint) r;
}

static void android_media_tv_Tuner_dvr_set_fd(JNIEnv *env, jobject dvr, jobject jfd) {
static void android_media_tv_Tuner_dvr_set_fd(JNIEnv *env, jobject dvr, jint fd) {
    sp<Dvr> dvrSp = getDvr(env, dvr);
    if (dvrSp == NULL) {
        ALOGD("Failed to set FD for dvr: dvr not found");
    }
    dvrSp->mFd = jniGetFDFromFileDescriptor(env, jfd);
    dvrSp->mFd = (int) fd;
    ALOGD("set fd = %d", dvrSp->mFd);
}

static jlong android_media_tv_Tuner_read_dvr(JNIEnv *env, jobject dvr, jlong size) {
    sp<Dvr> dvrSp = getDvr(env, dvr);
    if (dvrSp == NULL) {
        ALOGD("Failed to read dvr: dvr not found");
        jniThrowException(env, "java/lang/IllegalStateException",
                "Failed to read dvr: dvr not found");
        return 0;
    }

    long available = dvrSp->mDvrMQ->availableToWrite();
@@ -3466,6 +3468,12 @@ static jlong android_media_tv_Tuner_read_dvr(JNIEnv *env, jobject dvr, jlong siz
        long length = first.getLength();
        long firstToWrite = std::min(length, write);
        ret = read(dvrSp->mFd, data, firstToWrite);

        if (ret < 0) {
            ALOGE("[DVR] Failed to read from FD: %s", strerror(errno));
            jniThrowRuntimeException(env, strerror(errno));
            return 0;
        }
        if (ret < firstToWrite) {
            ALOGW("[DVR] file to MQ, first region: %ld bytes to write, but %ld bytes written",
                    firstToWrite, ret);
@@ -3480,6 +3488,7 @@ static jlong android_media_tv_Tuner_read_dvr(JNIEnv *env, jobject dvr, jlong siz
        ALOGD("[DVR] file to MQ: %ld bytes need to be written, %ld bytes written", write, ret);
        if (!dvrSp->mDvrMQ->commitWrite(ret)) {
            ALOGE("[DVR] Error: failed to commit write!");
            return 0;
        }

    } else {
@@ -3524,12 +3533,14 @@ static jlong android_media_tv_Tuner_read_dvr_from_array(
static jlong android_media_tv_Tuner_write_dvr(JNIEnv *env, jobject dvr, jlong size) {
    sp<Dvr> dvrSp = getDvr(env, dvr);
    if (dvrSp == NULL) {
        ALOGW("Failed to write dvr: dvr not found");
        jniThrowException(env, "java/lang/IllegalStateException",
                "Failed to write dvr: dvr not found");
        return 0;
    }

    if (dvrSp->mDvrMQ == NULL) {
        ALOGW("Failed to write dvr: dvr not configured");
        jniThrowException(env, "java/lang/IllegalStateException",
                "Failed to write dvr: dvr not configured");
        return 0;
    }

@@ -3546,6 +3557,12 @@ static jlong android_media_tv_Tuner_write_dvr(JNIEnv *env, jobject dvr, jlong si
        long length = first.getLength();
        long firstToRead = std::min(length, toRead);
        ret = write(dvrSp->mFd, data, firstToRead);

        if (ret < 0) {
            ALOGE("[DVR] Failed to write to FD: %s", strerror(errno));
            jniThrowRuntimeException(env, strerror(errno));
            return 0;
        }
        if (ret < firstToRead) {
            ALOGW("[DVR] MQ to file: %ld bytes read, but %ld bytes written", firstToRead, ret);
        } else if (firstToRead < toRead) {
@@ -3559,6 +3576,7 @@ static jlong android_media_tv_Tuner_write_dvr(JNIEnv *env, jobject dvr, jlong si
        ALOGD("[DVR] MQ to file: %ld bytes to be read, %ld bytes written", toRead, ret);
        if (!dvrMq.commitRead(ret)) {
            ALOGE("[DVR] Error: failed to commit read!");
            return 0;
        }

    } else {