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

Commit fb60f4e1 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Tuner JNI: split dvr to DvrRecord & DvrPlayback" into rvc-dev

parents b687bc21 5637a663
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -69,7 +69,7 @@ public class DvrPlayback implements AutoCloseable {
     */
     */
    public static final int PLAYBACK_STATUS_FULL = Constants.PlaybackStatus.SPACE_FULL;
    public static final int PLAYBACK_STATUS_FULL = Constants.PlaybackStatus.SPACE_FULL;


    long mNativeContext;
    private long mNativeContext;


    private native int nativeAttachFilter(Filter filter);
    private native int nativeAttachFilter(Filter filter);
    private native int nativeDetachFilter(Filter filter);
    private native int nativeDetachFilter(Filter filter);
+1 −1
Original line number Original line Diff line number Diff line
@@ -30,7 +30,7 @@ import android.os.ParcelFileDescriptor;
 */
 */
@SystemApi
@SystemApi
public class DvrRecorder implements AutoCloseable {
public class DvrRecorder implements AutoCloseable {
    long mNativeContext;
    private long mNativeContext;


    private native int nativeAttachFilter(Filter filter);
    private native int nativeAttachFilter(Filter filter);
    private native int nativeDetachFilter(Filter filter);
    private native int nativeDetachFilter(Filter filter);
+62 −33
Original line number Original line Diff line number Diff line
@@ -138,11 +138,13 @@ struct fields_t {
    jfieldID filterContext;
    jfieldID filterContext;
    jfieldID timeFilterContext;
    jfieldID timeFilterContext;
    jfieldID descramblerContext;
    jfieldID descramblerContext;
    jfieldID dvrContext;
    jfieldID dvrRecorderContext;
    jfieldID dvrPlaybackContext;
    jmethodID frontendInitID;
    jmethodID frontendInitID;
    jmethodID filterInitID;
    jmethodID filterInitID;
    jmethodID timeFilterInitID;
    jmethodID timeFilterInitID;
    jmethodID dvrInitID;
    jmethodID dvrRecorderInitID;
    jmethodID dvrPlaybackInitID;
    jmethodID onFrontendEventID;
    jmethodID onFrontendEventID;
    jmethodID onFilterStatusID;
    jmethodID onFilterStatusID;
    jmethodID onFilterEventID;
    jmethodID onFilterEventID;
@@ -1333,7 +1335,7 @@ jobject JTuner::openTimeFilter() {
    return timeFilterObj;
    return timeFilterObj;
}
}


jobject JTuner::openDvr(DvrType type, int bufferSize) {
jobject JTuner::openDvr(DvrType type, jlong bufferSize) {
    ALOGD("JTuner::openDvr");
    ALOGD("JTuner::openDvr");
    if (mDemux == NULL) {
    if (mDemux == NULL) {
        if (openDemux() != Result::SUCCESS) {
        if (openDemux() != Result::SUCCESS) {
@@ -1342,24 +1344,38 @@ jobject JTuner::openDvr(DvrType type, int bufferSize) {
    }
    }
    sp<IDvr> iDvrSp;
    sp<IDvr> iDvrSp;
    sp<DvrCallback> callback = new DvrCallback();
    sp<DvrCallback> callback = new DvrCallback();
    mDemux->openDvr(type, bufferSize, callback,
    Result res;
            [&](Result, const sp<IDvr>& dvr) {
    mDemux->openDvr(type, (uint32_t) bufferSize, callback,
            [&](Result r, const sp<IDvr>& dvr) {
                res = r;
                iDvrSp = dvr;
                iDvrSp = dvr;
            });
            });


    if (iDvrSp == NULL) {
    if (res != Result::SUCCESS || iDvrSp == NULL) {
        return NULL;
        return NULL;
    }
    }


    JNIEnv *env = AndroidRuntime::getJNIEnv();
    JNIEnv *env = AndroidRuntime::getJNIEnv();
    jobject dvrObj =
    jobject dvrObj;
    if (type == DvrType::RECORD) {
        dvrObj =
                env->NewObject(
                env->NewObject(
                    env->FindClass("android/media/tv/tuner/dvr/Dvr"),
                        env->FindClass("android/media/tv/tuner/dvr/DvrRecorder"),
                    gFields.dvrInitID,
                        gFields.dvrRecorderInitID,
                        mObject);
                        mObject);
        sp<Dvr> dvrSp = new Dvr(iDvrSp, dvrObj);
        sp<Dvr> dvrSp = new Dvr(iDvrSp, dvrObj);
        dvrSp->incStrong(dvrObj);
        dvrSp->incStrong(dvrObj);
    env->SetLongField(dvrObj, gFields.dvrContext, (jlong)dvrSp.get());
        env->SetLongField(dvrObj, gFields.dvrRecorderContext, (jlong)dvrSp.get());
    } else {
        dvrObj =
                env->NewObject(
                        env->FindClass("android/media/tv/tuner/dvr/DvrPlayback"),
                        gFields.dvrPlaybackInitID,
                        mObject);
        sp<Dvr> dvrSp = new Dvr(iDvrSp, dvrObj);
        dvrSp->incStrong(dvrObj);
        env->SetLongField(dvrObj, gFields.dvrPlaybackContext, (jlong)dvrSp.get());
    }


    callback->setDvr(dvrObj);
    callback->setDvr(dvrObj);


@@ -1883,7 +1899,11 @@ static DvrSettings getDvrSettings(JNIEnv *env, jobject settings) {
}
}


static sp<Dvr> getDvr(JNIEnv *env, jobject dvr) {
static sp<Dvr> getDvr(JNIEnv *env, jobject dvr) {
    return (Dvr *)env->GetLongField(dvr, gFields.dvrContext);
    bool isRecorder =
            env->IsInstanceOf(dvr, env->FindClass("android/media/tv/tuner/dvr/DvrRecorder"));
    jfieldID fieldId =
            isRecorder ? gFields.dvrRecorderContext : gFields.dvrPlaybackContext;
    return (Dvr *)env->GetLongField(dvr, fieldId);
}
}


static void android_media_tv_Tuner_native_init(JNIEnv *env) {
static void android_media_tv_Tuner_native_init(JNIEnv *env) {
@@ -1924,9 +1944,13 @@ static void android_media_tv_Tuner_native_init(JNIEnv *env) {
    gFields.descramblerInitID =
    gFields.descramblerInitID =
            env->GetMethodID(descramblerClazz, "<init>", "()V");
            env->GetMethodID(descramblerClazz, "<init>", "()V");


    jclass dvrClazz = env->FindClass("android/media/tv/tuner/dvr/Dvr");
    jclass dvrRecorderClazz = env->FindClass("android/media/tv/tuner/dvr/DvrRecorder");
    gFields.dvrContext = env->GetFieldID(dvrClazz, "mNativeContext", "J");
    gFields.dvrRecorderContext = env->GetFieldID(dvrRecorderClazz, "mNativeContext", "J");
    gFields.dvrInitID = env->GetMethodID(dvrClazz, "<init>", "()V");
    gFields.dvrRecorderInitID = env->GetMethodID(dvrRecorderClazz, "<init>", "()V");

    jclass dvrPlaybackClazz = env->FindClass("android/media/tv/tuner/dvr/DvrPlayback");
    gFields.dvrPlaybackContext = env->GetFieldID(dvrPlaybackClazz, "mNativeContext", "J");
    gFields.dvrPlaybackInitID = env->GetMethodID(dvrPlaybackClazz, "<init>", "()V");


    jclass linearBlockClazz = env->FindClass("android/media/MediaCodec$LinearBlock");
    jclass linearBlockClazz = env->FindClass("android/media/MediaCodec$LinearBlock");
    gFields.linearBlockInitID = env->GetMethodID(linearBlockClazz, "<init>", "()V");
    gFields.linearBlockInitID = env->GetMethodID(linearBlockClazz, "<init>", "()V");
@@ -2654,13 +2678,15 @@ static int android_media_tv_Tuner_close_descrambler(JNIEnv, jobject) {
}
}


static jobject android_media_tv_Tuner_open_dvr_recorder(
static jobject android_media_tv_Tuner_open_dvr_recorder(
        JNIEnv* /* env */, jobject /* thiz */, jlong /* bufferSize */) {
        JNIEnv* env, jobject thiz, jlong bufferSize) {
    return NULL;
    sp<JTuner> tuner = getTuner(env, thiz);
    return tuner->openDvr(DvrType::RECORD, bufferSize);
}
}


static jobject android_media_tv_Tuner_open_dvr_playback(
static jobject android_media_tv_Tuner_open_dvr_playback(
        JNIEnv* /* env */, jobject /* thiz */, jlong /* bufferSize */) {
        JNIEnv* env, jobject thiz, jlong bufferSize) {
    return NULL;
    sp<JTuner> tuner = getTuner(env, thiz);
    return tuner->openDvr(DvrType::PLAYBACK, bufferSize);
}
}


static jobject android_media_tv_Tuner_get_demux_caps(JNIEnv*, jobject) {
static jobject android_media_tv_Tuner_get_demux_caps(JNIEnv*, jobject) {
@@ -2714,11 +2740,13 @@ static int android_media_tv_Tuner_configure_dvr(JNIEnv *env, jobject dvr, jobjec
}
}


static int android_media_tv_Tuner_start_dvr(JNIEnv *env, jobject dvr) {
static int android_media_tv_Tuner_start_dvr(JNIEnv *env, jobject dvr) {

    sp<IDvr> dvrSp = getDvr(env, dvr)->getIDvr();
    sp<IDvr> dvrSp = getDvr(env, dvr)->getIDvr();
    if (dvrSp == NULL) {
    if (dvrSp == NULL) {
        ALOGD("Failed to start dvr: dvr not found");
        ALOGD("Failed to start dvr: dvr not found");
        return false;
        return false;
    }
    }

    Result result = dvrSp->start();
    Result result = dvrSp->start();
    return (int) result;
    return (int) result;
}
}
@@ -2968,7 +2996,7 @@ static const JNINativeMethod gDescramblerMethods[] = {
    { "nativeClose", "()I", (void *)android_media_tv_Tuner_close_descrambler },
    { "nativeClose", "()I", (void *)android_media_tv_Tuner_close_descrambler },
};
};


static const JNINativeMethod gDvrMethods[] = {
static const JNINativeMethod gDvrRecorderMethods[] = {
    { "nativeAttachFilter", "(Landroid/media/tv/tuner/filter/Filter;)I",
    { "nativeAttachFilter", "(Landroid/media/tv/tuner/filter/Filter;)I",
            (void *)android_media_tv_Tuner_attach_filter },
            (void *)android_media_tv_Tuner_attach_filter },
    { "nativeDetachFilter", "(Landroid/media/tv/tuner/filter/Filter;)I",
    { "nativeDetachFilter", "(Landroid/media/tv/tuner/filter/Filter;)I",
@@ -2980,14 +3008,22 @@ static const JNINativeMethod gDvrMethods[] = {
    { "nativeFlushDvr", "()I", (void *)android_media_tv_Tuner_flush_dvr },
    { "nativeFlushDvr", "()I", (void *)android_media_tv_Tuner_flush_dvr },
    { "nativeClose", "()I", (void *)android_media_tv_Tuner_close_dvr },
    { "nativeClose", "()I", (void *)android_media_tv_Tuner_close_dvr },
    { "nativeSetFileDescriptor", "(I)V", (void *)android_media_tv_Tuner_dvr_set_fd },
    { "nativeSetFileDescriptor", "(I)V", (void *)android_media_tv_Tuner_dvr_set_fd },
};

static const JNINativeMethod gDvrRecorderMethods[] = {
    { "nativeWrite", "(J)J", (void *)android_media_tv_Tuner_write_dvr },
    { "nativeWrite", "(J)J", (void *)android_media_tv_Tuner_write_dvr },
    { "nativeWrite", "([BJJ)J", (void *)android_media_tv_Tuner_write_dvr_to_array },
    { "nativeWrite", "([BJJ)J", (void *)android_media_tv_Tuner_write_dvr_to_array },
};
};


static const JNINativeMethod gDvrPlaybackMethods[] = {
static const JNINativeMethod gDvrPlaybackMethods[] = {
    { "nativeAttachFilter", "(Landroid/media/tv/tuner/filter/Filter;)I",
            (void *)android_media_tv_Tuner_attach_filter },
    { "nativeDetachFilter", "(Landroid/media/tv/tuner/filter/Filter;)I",
            (void *)android_media_tv_Tuner_detach_filter },
    { "nativeConfigureDvr", "(Landroid/media/tv/tuner/dvr/DvrSettings;)I",
            (void *)android_media_tv_Tuner_configure_dvr },
    { "nativeStartDvr", "()I", (void *)android_media_tv_Tuner_start_dvr },
    { "nativeStopDvr", "()I", (void *)android_media_tv_Tuner_stop_dvr },
    { "nativeFlushDvr", "()I", (void *)android_media_tv_Tuner_flush_dvr },
    { "nativeClose", "()I", (void *)android_media_tv_Tuner_close_dvr },
    { "nativeSetFileDescriptor", "(I)V", (void *)android_media_tv_Tuner_dvr_set_fd },
    { "nativeRead", "(J)J", (void *)android_media_tv_Tuner_read_dvr },
    { "nativeRead", "(J)J", (void *)android_media_tv_Tuner_read_dvr },
    { "nativeRead", "([BJJ)J", (void *)android_media_tv_Tuner_read_dvr_from_array },
    { "nativeRead", "([BJJ)J", (void *)android_media_tv_Tuner_read_dvr_from_array },
};
};
@@ -3027,13 +3063,6 @@ static bool register_android_media_tv_Tuner(JNIEnv *env) {
        ALOGE("Failed to register descrambler native methods");
        ALOGE("Failed to register descrambler native methods");
        return false;
        return false;
    }
    }
    if (AndroidRuntime::registerNativeMethods(
            env, "android/media/tv/tuner/dvr/Dvr",
            gDvrMethods,
            NELEM(gDvrMethods)) != JNI_OK) {
        ALOGE("Failed to register dvr native methods");
        return false;
    }
    if (AndroidRuntime::registerNativeMethods(
    if (AndroidRuntime::registerNativeMethods(
            env, "android/media/tv/tuner/dvr/DvrRecorder",
            env, "android/media/tv/tuner/dvr/DvrRecorder",
            gDvrRecorderMethods,
            gDvrRecorderMethods,
+1 −1
Original line number Original line Diff line number Diff line
@@ -184,7 +184,7 @@ struct JTuner : public RefBase {
    jobject openFilter(DemuxFilterType type, int bufferSize);
    jobject openFilter(DemuxFilterType type, int bufferSize);
    jobject openTimeFilter();
    jobject openTimeFilter();
    jobject openDescrambler();
    jobject openDescrambler();
    jobject openDvr(DvrType type, int bufferSize);
    jobject openDvr(DvrType type, jlong bufferSize);


protected:
protected:
    Result openDemux();
    Result openDemux();