From 5637a6636ce5d0c614195fb39506b3fa20e8c5e7 Mon Sep 17 00:00:00 2001 From: shubang Date: Thu, 27 Feb 2020 18:06:21 -0800 Subject: [PATCH] Tuner JNI: split dvr to DvrRecord & DvrPlayback Bug: 139308734 Test: make; acloud; Change-Id: Iac1d131663bf1e6b859cd37f629d9ef7c0170184 --- .../media/tv/tuner/dvr/DvrPlayback.java | 2 +- .../media/tv/tuner/dvr/DvrRecorder.java | 2 +- media/jni/android_media_tv_Tuner.cpp | 95 ++++++++++++------- media/jni/android_media_tv_Tuner.h | 2 +- 4 files changed, 65 insertions(+), 36 deletions(-) diff --git a/media/java/android/media/tv/tuner/dvr/DvrPlayback.java b/media/java/android/media/tv/tuner/dvr/DvrPlayback.java index dbd9db4b6a454..37a016ecb4ce2 100644 --- a/media/java/android/media/tv/tuner/dvr/DvrPlayback.java +++ b/media/java/android/media/tv/tuner/dvr/DvrPlayback.java @@ -69,7 +69,7 @@ public class DvrPlayback implements AutoCloseable { */ 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 nativeDetachFilter(Filter filter); diff --git a/media/java/android/media/tv/tuner/dvr/DvrRecorder.java b/media/java/android/media/tv/tuner/dvr/DvrRecorder.java index c1c6c624454e5..d06356cfb6dec 100644 --- a/media/java/android/media/tv/tuner/dvr/DvrRecorder.java +++ b/media/java/android/media/tv/tuner/dvr/DvrRecorder.java @@ -30,7 +30,7 @@ import android.os.ParcelFileDescriptor; */ @SystemApi public class DvrRecorder implements AutoCloseable { - long mNativeContext; + private long mNativeContext; private native int nativeAttachFilter(Filter filter); private native int nativeDetachFilter(Filter filter); diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index 273c77684635f..441dcc127000a 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -129,11 +129,13 @@ struct fields_t { jfieldID filterContext; jfieldID timeFilterContext; jfieldID descramblerContext; - jfieldID dvrContext; + jfieldID dvrRecorderContext; + jfieldID dvrPlaybackContext; jmethodID frontendInitID; jmethodID filterInitID; jmethodID timeFilterInitID; - jmethodID dvrInitID; + jmethodID dvrRecorderInitID; + jmethodID dvrPlaybackInitID; jmethodID onFrontendEventID; jmethodID onFilterStatusID; jmethodID lnbInitID; @@ -1046,7 +1048,7 @@ jobject JTuner::openTimeFilter() { return timeFilterObj; } -jobject JTuner::openDvr(DvrType type, int bufferSize) { +jobject JTuner::openDvr(DvrType type, jlong bufferSize) { ALOGD("JTuner::openDvr"); if (mDemux == NULL) { if (openDemux() != Result::SUCCESS) { @@ -1055,24 +1057,38 @@ jobject JTuner::openDvr(DvrType type, int bufferSize) { } sp iDvrSp; sp callback = new DvrCallback(); - mDemux->openDvr(type, bufferSize, callback, - [&](Result, const sp& dvr) { + Result res; + mDemux->openDvr(type, (uint32_t) bufferSize, callback, + [&](Result r, const sp& dvr) { + res = r; iDvrSp = dvr; }); - if (iDvrSp == NULL) { + if (res != Result::SUCCESS || iDvrSp == NULL) { return NULL; } JNIEnv *env = AndroidRuntime::getJNIEnv(); - jobject dvrObj = - env->NewObject( - env->FindClass("android/media/tv/tuner/dvr/Dvr"), - gFields.dvrInitID, - mObject); - sp dvrSp = new Dvr(iDvrSp, dvrObj); - dvrSp->incStrong(dvrObj); - env->SetLongField(dvrObj, gFields.dvrContext, (jlong)dvrSp.get()); + jobject dvrObj; + if (type == DvrType::RECORD) { + dvrObj = + env->NewObject( + env->FindClass("android/media/tv/tuner/dvr/DvrRecorder"), + gFields.dvrRecorderInitID, + mObject); + sp dvrSp = new Dvr(iDvrSp, dvrObj); + dvrSp->incStrong(dvrObj); + env->SetLongField(dvrObj, gFields.dvrRecorderContext, (jlong)dvrSp.get()); + } else { + dvrObj = + env->NewObject( + env->FindClass("android/media/tv/tuner/dvr/DvrPlayback"), + gFields.dvrPlaybackInitID, + mObject); + sp dvrSp = new Dvr(iDvrSp, dvrObj); + dvrSp->incStrong(dvrObj); + env->SetLongField(dvrObj, gFields.dvrPlaybackContext, (jlong)dvrSp.get()); + } callback->setDvr(dvrObj); @@ -1596,7 +1612,11 @@ static DvrSettings getDvrSettings(JNIEnv *env, jobject settings) { } static sp 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) { @@ -1635,9 +1655,13 @@ static void android_media_tv_Tuner_native_init(JNIEnv *env) { gFields.descramblerInitID = env->GetMethodID(descramblerClazz, "", "()V"); - jclass dvrClazz = env->FindClass("android/media/tv/tuner/dvr/Dvr"); - gFields.dvrContext = env->GetFieldID(dvrClazz, "mNativeContext", "J"); - gFields.dvrInitID = env->GetMethodID(dvrClazz, "", "()V"); + jclass dvrRecorderClazz = env->FindClass("android/media/tv/tuner/dvr/DvrRecorder"); + gFields.dvrRecorderContext = env->GetFieldID(dvrRecorderClazz, "mNativeContext", "J"); + gFields.dvrRecorderInitID = env->GetMethodID(dvrRecorderClazz, "", "()V"); + + jclass dvrPlaybackClazz = env->FindClass("android/media/tv/tuner/dvr/DvrPlayback"); + gFields.dvrPlaybackContext = env->GetFieldID(dvrPlaybackClazz, "mNativeContext", "J"); + gFields.dvrPlaybackInitID = env->GetMethodID(dvrPlaybackClazz, "", "()V"); jclass linearBlockClazz = env->FindClass("android/media/MediaCodec$LinearBlock"); gFields.linearBlockInitID = env->GetMethodID(linearBlockClazz, "", "()V"); @@ -2359,13 +2383,15 @@ static int android_media_tv_Tuner_close_descrambler(JNIEnv, jobject) { } static jobject android_media_tv_Tuner_open_dvr_recorder( - JNIEnv* /* env */, jobject /* thiz */, jlong /* bufferSize */) { - return NULL; + JNIEnv* env, jobject thiz, jlong bufferSize) { + sp tuner = getTuner(env, thiz); + return tuner->openDvr(DvrType::RECORD, bufferSize); } static jobject android_media_tv_Tuner_open_dvr_playback( - JNIEnv* /* env */, jobject /* thiz */, jlong /* bufferSize */) { - return NULL; + JNIEnv* env, jobject thiz, jlong bufferSize) { + sp tuner = getTuner(env, thiz); + return tuner->openDvr(DvrType::PLAYBACK, bufferSize); } static jobject android_media_tv_Tuner_get_demux_caps(JNIEnv*, jobject) { @@ -2419,11 +2445,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) { + sp dvrSp = getDvr(env, dvr)->getIDvr(); if (dvrSp == NULL) { ALOGD("Failed to start dvr: dvr not found"); return false; } + Result result = dvrSp->start(); return (int) result; } @@ -2671,7 +2699,7 @@ static const JNINativeMethod gDescramblerMethods[] = { { "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", (void *)android_media_tv_Tuner_attach_filter }, { "nativeDetachFilter", "(Landroid/media/tv/tuner/filter/Filter;)I", @@ -2683,14 +2711,22 @@ static const JNINativeMethod gDvrMethods[] = { { "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 }, -}; - -static const JNINativeMethod gDvrRecorderMethods[] = { { "nativeWrite", "(J)J", (void *)android_media_tv_Tuner_write_dvr }, { "nativeWrite", "([BJJ)J", (void *)android_media_tv_Tuner_write_dvr_to_array }, }; 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", "([BJJ)J", (void *)android_media_tv_Tuner_read_dvr_from_array }, }; @@ -2730,13 +2766,6 @@ static bool register_android_media_tv_Tuner(JNIEnv *env) { ALOGE("Failed to register descrambler native methods"); 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( env, "android/media/tv/tuner/dvr/DvrRecorder", gDvrRecorderMethods, diff --git a/media/jni/android_media_tv_Tuner.h b/media/jni/android_media_tv_Tuner.h index fec4cd8d50026..08df2431e9701 100644 --- a/media/jni/android_media_tv_Tuner.h +++ b/media/jni/android_media_tv_Tuner.h @@ -168,7 +168,7 @@ struct JTuner : public RefBase { jobject openFilter(DemuxFilterType type, int bufferSize); jobject openTimeFilter(); jobject openDescrambler(); - jobject openDvr(DvrType type, int bufferSize); + jobject openDvr(DvrType type, jlong bufferSize); protected: Result openDemux();