Loading media/java/android/media/tv/tuner/Tuner.java +27 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package android.media.tv.tuner; import android.annotation.Nullable; import android.media.tv.tuner.TunerConstants.DemuxPidType; import android.os.Handler; import android.os.Looper; import android.os.Message; Loading Loading @@ -83,6 +84,9 @@ public final class Tuner implements AutoCloseable { private native List<Integer> nativeGetLnbIds(); private native Lnb nativeOpenLnbById(int id); private native Descrambler nativeOpenDescrambler(); /** * Frontend Callback. */ Loading Loading @@ -294,4 +298,27 @@ public final class Tuner implements AutoCloseable { mHandler.sendMessage(mHandler.obtainMessage(MSG_ON_LNB_EVENT, eventType, 0)); } } protected class Descrambler { private long mNativeContext; private native boolean nativeAddPid(int pidType, int pid, Filter filter); private native boolean nativeRemovePid(int pidType, int pid, Filter filter); private Descrambler() {} private boolean addPid(@DemuxPidType int pidType, int pid, Filter filter) { return nativeAddPid(pidType, pid, filter); } private boolean removePid(@DemuxPidType int pidType, int pid, Filter filter) { return nativeRemovePid(pidType, pid, filter); } } private Descrambler openDescrambler() { Descrambler descrambler = nativeOpenDescrambler(); return descrambler; } } media/java/android/media/tv/tuner/TunerConstants.java +8 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,14 @@ final class TunerConstants { public static final int DATA_FORMAT_ES = Constants.DataFormat.ES; public static final int DATA_FORMAT_SHV_TLV = Constants.DataFormat.SHV_TLV; @Retention(RetentionPolicy.SOURCE) @IntDef({DEMUX_T_PID, DEMUX_MMPT_PID}) public @interface DemuxPidType {} public static final int DEMUX_T_PID = 1; public static final int DEMUX_MMPT_PID = 2; private TunerConstants() { } } media/jni/android_media_tv_Tuner.cpp +99 −6 Original line number Diff line number Diff line Loading @@ -28,19 +28,23 @@ using ::android::hardware::Void; using ::android::hardware::hidl_vec; using ::android::hardware::tv::tuner::V1_0::DemuxFilterMainType; using ::android::hardware::tv::tuner::V1_0::DemuxMmtpPid; using ::android::hardware::tv::tuner::V1_0::DemuxTpid; using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterType; using ::android::hardware::tv::tuner::V1_0::ITuner; using ::android::hardware::tv::tuner::V1_0::Result; struct fields_t { jfieldID context; jfieldID tunerContext; jfieldID filterContext; jfieldID descramblerContext; jmethodID frontendInitID; jmethodID filterInitID; jmethodID onFrontendEventID; jmethodID onFilterStatusID; jmethodID lnbInitID; jmethodID onLnbEventID; jmethodID descramblerInitID; }; static fields_t gFields; Loading Loading @@ -258,6 +262,33 @@ bool JTuner::openDemux() { return true; } jobject JTuner::openDescrambler() { ALOGD("JTuner::openDescrambler"); if (mTuner == nullptr) { return NULL; } sp<IDescrambler> descramblerSp; mTuner->openDescrambler([&](Result, const sp<IDescrambler>& descrambler) { descramblerSp = descrambler; }); if (descramblerSp == NULL) { return NULL; } JNIEnv *env = AndroidRuntime::getJNIEnv(); jobject descramblerObj = env->NewObject( env->FindClass("android/media/tv/tuner/Tuner$Descrambler"), gFields.descramblerInitID, mObject); descramblerSp->incStrong(descramblerObj); env->SetLongField(descramblerObj, gFields.descramblerContext, (jlong)descramblerSp.get()); return descramblerObj; } jobject JTuner::openFilter(DemuxFilterType type, int bufferSize) { if (mDemux == NULL) { if (!openDemux()) { Loading Loading @@ -303,7 +334,7 @@ jobject JTuner::openFilter(DemuxFilterType type, int bufferSize) { using namespace android; static sp<JTuner> setTuner(JNIEnv *env, jobject thiz, const sp<JTuner> &tuner) { sp<JTuner> old = (JTuner *)env->GetLongField(thiz, gFields.context); sp<JTuner> old = (JTuner *)env->GetLongField(thiz, gFields.tunerContext); if (tuner != NULL) { tuner->incStrong(thiz); Loading @@ -311,13 +342,27 @@ static sp<JTuner> setTuner(JNIEnv *env, jobject thiz, const sp<JTuner> &tuner) { if (old != NULL) { old->decStrong(thiz); } env->SetLongField(thiz, gFields.context, (jlong)tuner.get()); env->SetLongField(thiz, gFields.tunerContext, (jlong)tuner.get()); return old; } static sp<JTuner> getTuner(JNIEnv *env, jobject thiz) { return (JTuner *)env->GetLongField(thiz, gFields.context); return (JTuner *)env->GetLongField(thiz, gFields.tunerContext); } static sp<IDescrambler> getDescrambler(JNIEnv *env, jobject descrambler) { return (IDescrambler *)env->GetLongField(descrambler, gFields.descramblerContext); } static DemuxPid getDemuxPid(int pidType, int pid) { DemuxPid demuxPid; if ((int)pidType == 1) { demuxPid.tPid(static_cast<DemuxTpid>(pid)); } else if ((int)pidType == 2) { demuxPid.mmtpPid(static_cast<DemuxMmtpPid>(pid)); } return demuxPid; } static sp<IFilter> getFilter(JNIEnv *env, jobject filter) { Loading @@ -328,8 +373,8 @@ static void android_media_tv_Tuner_native_init(JNIEnv *env) { jclass clazz = env->FindClass("android/media/tv/tuner/Tuner"); CHECK(clazz != NULL); gFields.context = env->GetFieldID(clazz, "mNativeContext", "J"); CHECK(gFields.context != NULL); gFields.tunerContext = env->GetFieldID(clazz, "mNativeContext", "J"); CHECK(gFields.tunerContext != NULL); gFields.onFrontendEventID = env->GetMethodID(clazz, "onFrontendEvent", "(I)V"); Loading @@ -349,6 +394,11 @@ static void android_media_tv_Tuner_native_init(JNIEnv *env) { env->GetMethodID(filterClazz, "<init>", "(Landroid/media/tv/tuner/Tuner;I)V"); gFields.onFilterStatusID = env->GetMethodID(filterClazz, "onFilterStatus", "(I)V"); jclass descramblerClazz = env->FindClass("android/media/tv/tuner/Tuner$Descrambler"); gFields.descramblerContext = env->GetFieldID(descramblerClazz, "mNativeContext", "J"); gFields.descramblerInitID = env->GetMethodID(descramblerClazz, "<init>", "(Landroid/media/tv/tuner/Tuner;)V"); } static void android_media_tv_Tuner_native_setup(JNIEnv *env, jobject thiz) { Loading Loading @@ -416,6 +466,33 @@ static bool android_media_tv_Tuner_flush_filter(JNIEnv *env, jobject filter) { return filterSp->flush() == Result::SUCCESS; } static jobject android_media_tv_Tuner_open_descrambler(JNIEnv *env, jobject thiz) { sp<JTuner> tuner = getTuner(env, thiz); return tuner->openDescrambler(); } static bool android_media_tv_Tuner_add_pid( JNIEnv *env, jobject descrambler, jint pidType, jint pid, jobject filter) { sp<IDescrambler> descramblerSp = getDescrambler(env, descrambler); if (descramblerSp == NULL) { return false; } sp<IFilter> filterSp = getFilter(env, filter); Result result = descramblerSp->addPid(getDemuxPid((int)pidType, (int)pid), filterSp); return result == Result::SUCCESS; } static bool android_media_tv_Tuner_remove_pid( JNIEnv *env, jobject descrambler, jint pidType, jint pid, jobject filter) { sp<IDescrambler> descramblerSp = getDescrambler(env, descrambler); if (descramblerSp == NULL) { return false; } sp<IFilter> filterSp = getFilter(env, filter); Result result = descramblerSp->removePid(getDemuxPid((int)pidType, (int)pid), filterSp); return result == Result::SUCCESS; } static const JNINativeMethod gTunerMethods[] = { { "nativeInit", "()V", (void *)android_media_tv_Tuner_native_init }, { "nativeSetup", "()V", (void *)android_media_tv_Tuner_native_setup }, Loading @@ -429,6 +506,8 @@ static const JNINativeMethod gTunerMethods[] = { (void *)android_media_tv_Tuner_get_lnb_ids }, { "nativeOpenLnbById", "(I)Landroid/media/tv/tuner/Tuner$Lnb;", (void *)android_media_tv_Tuner_open_lnb_by_id }, { "nativeOpenDescrambler", "()Landroid/media/tv/tuner/Tuner$Descrambler;", (void *)android_media_tv_Tuner_open_descrambler }, }; static const JNINativeMethod gFilterMethods[] = { Loading @@ -437,6 +516,13 @@ static const JNINativeMethod gFilterMethods[] = { { "nativeFlushFilter", "()Z", (void *)android_media_tv_Tuner_flush_filter }, }; static const JNINativeMethod gDescramblerMethods[] = { { "nativeAddPid", "(IILandroid/media/tv/tuner/Tuner$Filter;)Z", (void *)android_media_tv_Tuner_add_pid }, { "nativeRemovePid", "(IILandroid/media/tv/tuner/Tuner$Filter;)Z", (void *)android_media_tv_Tuner_remove_pid }, }; static bool register_android_media_tv_Tuner(JNIEnv *env) { if (AndroidRuntime::registerNativeMethods( env, "android/media/tv/tuner/Tuner", gTunerMethods, NELEM(gTunerMethods)) != JNI_OK) { Loading @@ -450,6 +536,13 @@ static bool register_android_media_tv_Tuner(JNIEnv *env) { ALOGE("Failed to register filter native methods"); return false; } if (AndroidRuntime::registerNativeMethods( env, "android/media/tv/tuner/Tuner$Descrambler", gDescramblerMethods, NELEM(gDescramblerMethods)) != JNI_OK) { ALOGE("Failed to register descrambler native methods"); return false; } return true; } Loading media/jni/android_media_tv_Tuner.h +3 −0 Original line number Diff line number Diff line Loading @@ -28,11 +28,13 @@ using ::android::hardware::hidl_vec; using ::android::hardware::tv::tuner::V1_0::DemuxFilterEvent; using ::android::hardware::tv::tuner::V1_0::DemuxFilterStatus; using ::android::hardware::tv::tuner::V1_0::DemuxFilterType; using ::android::hardware::tv::tuner::V1_0::DemuxPid; using ::android::hardware::tv::tuner::V1_0::FrontendEventType; using ::android::hardware::tv::tuner::V1_0::FrontendId; using ::android::hardware::tv::tuner::V1_0::FrontendScanMessage; using ::android::hardware::tv::tuner::V1_0::FrontendScanMessageType; using ::android::hardware::tv::tuner::V1_0::IDemux; using ::android::hardware::tv::tuner::V1_0::IDescrambler; using ::android::hardware::tv::tuner::V1_0::IFilter; using ::android::hardware::tv::tuner::V1_0::IFilterCallback; using ::android::hardware::tv::tuner::V1_0::IFrontend; Loading Loading @@ -82,6 +84,7 @@ struct JTuner : public RefBase { jobject getLnbIds(); jobject openLnbById(int id); jobject openFilter(DemuxFilterType type, int bufferSize); jobject openDescrambler(); protected: bool openDemux(); Loading Loading
media/java/android/media/tv/tuner/Tuner.java +27 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package android.media.tv.tuner; import android.annotation.Nullable; import android.media.tv.tuner.TunerConstants.DemuxPidType; import android.os.Handler; import android.os.Looper; import android.os.Message; Loading Loading @@ -83,6 +84,9 @@ public final class Tuner implements AutoCloseable { private native List<Integer> nativeGetLnbIds(); private native Lnb nativeOpenLnbById(int id); private native Descrambler nativeOpenDescrambler(); /** * Frontend Callback. */ Loading Loading @@ -294,4 +298,27 @@ public final class Tuner implements AutoCloseable { mHandler.sendMessage(mHandler.obtainMessage(MSG_ON_LNB_EVENT, eventType, 0)); } } protected class Descrambler { private long mNativeContext; private native boolean nativeAddPid(int pidType, int pid, Filter filter); private native boolean nativeRemovePid(int pidType, int pid, Filter filter); private Descrambler() {} private boolean addPid(@DemuxPidType int pidType, int pid, Filter filter) { return nativeAddPid(pidType, pid, filter); } private boolean removePid(@DemuxPidType int pidType, int pid, Filter filter) { return nativeRemovePid(pidType, pid, filter); } } private Descrambler openDescrambler() { Descrambler descrambler = nativeOpenDescrambler(); return descrambler; } }
media/java/android/media/tv/tuner/TunerConstants.java +8 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,14 @@ final class TunerConstants { public static final int DATA_FORMAT_ES = Constants.DataFormat.ES; public static final int DATA_FORMAT_SHV_TLV = Constants.DataFormat.SHV_TLV; @Retention(RetentionPolicy.SOURCE) @IntDef({DEMUX_T_PID, DEMUX_MMPT_PID}) public @interface DemuxPidType {} public static final int DEMUX_T_PID = 1; public static final int DEMUX_MMPT_PID = 2; private TunerConstants() { } }
media/jni/android_media_tv_Tuner.cpp +99 −6 Original line number Diff line number Diff line Loading @@ -28,19 +28,23 @@ using ::android::hardware::Void; using ::android::hardware::hidl_vec; using ::android::hardware::tv::tuner::V1_0::DemuxFilterMainType; using ::android::hardware::tv::tuner::V1_0::DemuxMmtpPid; using ::android::hardware::tv::tuner::V1_0::DemuxTpid; using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterType; using ::android::hardware::tv::tuner::V1_0::ITuner; using ::android::hardware::tv::tuner::V1_0::Result; struct fields_t { jfieldID context; jfieldID tunerContext; jfieldID filterContext; jfieldID descramblerContext; jmethodID frontendInitID; jmethodID filterInitID; jmethodID onFrontendEventID; jmethodID onFilterStatusID; jmethodID lnbInitID; jmethodID onLnbEventID; jmethodID descramblerInitID; }; static fields_t gFields; Loading Loading @@ -258,6 +262,33 @@ bool JTuner::openDemux() { return true; } jobject JTuner::openDescrambler() { ALOGD("JTuner::openDescrambler"); if (mTuner == nullptr) { return NULL; } sp<IDescrambler> descramblerSp; mTuner->openDescrambler([&](Result, const sp<IDescrambler>& descrambler) { descramblerSp = descrambler; }); if (descramblerSp == NULL) { return NULL; } JNIEnv *env = AndroidRuntime::getJNIEnv(); jobject descramblerObj = env->NewObject( env->FindClass("android/media/tv/tuner/Tuner$Descrambler"), gFields.descramblerInitID, mObject); descramblerSp->incStrong(descramblerObj); env->SetLongField(descramblerObj, gFields.descramblerContext, (jlong)descramblerSp.get()); return descramblerObj; } jobject JTuner::openFilter(DemuxFilterType type, int bufferSize) { if (mDemux == NULL) { if (!openDemux()) { Loading Loading @@ -303,7 +334,7 @@ jobject JTuner::openFilter(DemuxFilterType type, int bufferSize) { using namespace android; static sp<JTuner> setTuner(JNIEnv *env, jobject thiz, const sp<JTuner> &tuner) { sp<JTuner> old = (JTuner *)env->GetLongField(thiz, gFields.context); sp<JTuner> old = (JTuner *)env->GetLongField(thiz, gFields.tunerContext); if (tuner != NULL) { tuner->incStrong(thiz); Loading @@ -311,13 +342,27 @@ static sp<JTuner> setTuner(JNIEnv *env, jobject thiz, const sp<JTuner> &tuner) { if (old != NULL) { old->decStrong(thiz); } env->SetLongField(thiz, gFields.context, (jlong)tuner.get()); env->SetLongField(thiz, gFields.tunerContext, (jlong)tuner.get()); return old; } static sp<JTuner> getTuner(JNIEnv *env, jobject thiz) { return (JTuner *)env->GetLongField(thiz, gFields.context); return (JTuner *)env->GetLongField(thiz, gFields.tunerContext); } static sp<IDescrambler> getDescrambler(JNIEnv *env, jobject descrambler) { return (IDescrambler *)env->GetLongField(descrambler, gFields.descramblerContext); } static DemuxPid getDemuxPid(int pidType, int pid) { DemuxPid demuxPid; if ((int)pidType == 1) { demuxPid.tPid(static_cast<DemuxTpid>(pid)); } else if ((int)pidType == 2) { demuxPid.mmtpPid(static_cast<DemuxMmtpPid>(pid)); } return demuxPid; } static sp<IFilter> getFilter(JNIEnv *env, jobject filter) { Loading @@ -328,8 +373,8 @@ static void android_media_tv_Tuner_native_init(JNIEnv *env) { jclass clazz = env->FindClass("android/media/tv/tuner/Tuner"); CHECK(clazz != NULL); gFields.context = env->GetFieldID(clazz, "mNativeContext", "J"); CHECK(gFields.context != NULL); gFields.tunerContext = env->GetFieldID(clazz, "mNativeContext", "J"); CHECK(gFields.tunerContext != NULL); gFields.onFrontendEventID = env->GetMethodID(clazz, "onFrontendEvent", "(I)V"); Loading @@ -349,6 +394,11 @@ static void android_media_tv_Tuner_native_init(JNIEnv *env) { env->GetMethodID(filterClazz, "<init>", "(Landroid/media/tv/tuner/Tuner;I)V"); gFields.onFilterStatusID = env->GetMethodID(filterClazz, "onFilterStatus", "(I)V"); jclass descramblerClazz = env->FindClass("android/media/tv/tuner/Tuner$Descrambler"); gFields.descramblerContext = env->GetFieldID(descramblerClazz, "mNativeContext", "J"); gFields.descramblerInitID = env->GetMethodID(descramblerClazz, "<init>", "(Landroid/media/tv/tuner/Tuner;)V"); } static void android_media_tv_Tuner_native_setup(JNIEnv *env, jobject thiz) { Loading Loading @@ -416,6 +466,33 @@ static bool android_media_tv_Tuner_flush_filter(JNIEnv *env, jobject filter) { return filterSp->flush() == Result::SUCCESS; } static jobject android_media_tv_Tuner_open_descrambler(JNIEnv *env, jobject thiz) { sp<JTuner> tuner = getTuner(env, thiz); return tuner->openDescrambler(); } static bool android_media_tv_Tuner_add_pid( JNIEnv *env, jobject descrambler, jint pidType, jint pid, jobject filter) { sp<IDescrambler> descramblerSp = getDescrambler(env, descrambler); if (descramblerSp == NULL) { return false; } sp<IFilter> filterSp = getFilter(env, filter); Result result = descramblerSp->addPid(getDemuxPid((int)pidType, (int)pid), filterSp); return result == Result::SUCCESS; } static bool android_media_tv_Tuner_remove_pid( JNIEnv *env, jobject descrambler, jint pidType, jint pid, jobject filter) { sp<IDescrambler> descramblerSp = getDescrambler(env, descrambler); if (descramblerSp == NULL) { return false; } sp<IFilter> filterSp = getFilter(env, filter); Result result = descramblerSp->removePid(getDemuxPid((int)pidType, (int)pid), filterSp); return result == Result::SUCCESS; } static const JNINativeMethod gTunerMethods[] = { { "nativeInit", "()V", (void *)android_media_tv_Tuner_native_init }, { "nativeSetup", "()V", (void *)android_media_tv_Tuner_native_setup }, Loading @@ -429,6 +506,8 @@ static const JNINativeMethod gTunerMethods[] = { (void *)android_media_tv_Tuner_get_lnb_ids }, { "nativeOpenLnbById", "(I)Landroid/media/tv/tuner/Tuner$Lnb;", (void *)android_media_tv_Tuner_open_lnb_by_id }, { "nativeOpenDescrambler", "()Landroid/media/tv/tuner/Tuner$Descrambler;", (void *)android_media_tv_Tuner_open_descrambler }, }; static const JNINativeMethod gFilterMethods[] = { Loading @@ -437,6 +516,13 @@ static const JNINativeMethod gFilterMethods[] = { { "nativeFlushFilter", "()Z", (void *)android_media_tv_Tuner_flush_filter }, }; static const JNINativeMethod gDescramblerMethods[] = { { "nativeAddPid", "(IILandroid/media/tv/tuner/Tuner$Filter;)Z", (void *)android_media_tv_Tuner_add_pid }, { "nativeRemovePid", "(IILandroid/media/tv/tuner/Tuner$Filter;)Z", (void *)android_media_tv_Tuner_remove_pid }, }; static bool register_android_media_tv_Tuner(JNIEnv *env) { if (AndroidRuntime::registerNativeMethods( env, "android/media/tv/tuner/Tuner", gTunerMethods, NELEM(gTunerMethods)) != JNI_OK) { Loading @@ -450,6 +536,13 @@ static bool register_android_media_tv_Tuner(JNIEnv *env) { ALOGE("Failed to register filter native methods"); return false; } if (AndroidRuntime::registerNativeMethods( env, "android/media/tv/tuner/Tuner$Descrambler", gDescramblerMethods, NELEM(gDescramblerMethods)) != JNI_OK) { ALOGE("Failed to register descrambler native methods"); return false; } return true; } Loading
media/jni/android_media_tv_Tuner.h +3 −0 Original line number Diff line number Diff line Loading @@ -28,11 +28,13 @@ using ::android::hardware::hidl_vec; using ::android::hardware::tv::tuner::V1_0::DemuxFilterEvent; using ::android::hardware::tv::tuner::V1_0::DemuxFilterStatus; using ::android::hardware::tv::tuner::V1_0::DemuxFilterType; using ::android::hardware::tv::tuner::V1_0::DemuxPid; using ::android::hardware::tv::tuner::V1_0::FrontendEventType; using ::android::hardware::tv::tuner::V1_0::FrontendId; using ::android::hardware::tv::tuner::V1_0::FrontendScanMessage; using ::android::hardware::tv::tuner::V1_0::FrontendScanMessageType; using ::android::hardware::tv::tuner::V1_0::IDemux; using ::android::hardware::tv::tuner::V1_0::IDescrambler; using ::android::hardware::tv::tuner::V1_0::IFilter; using ::android::hardware::tv::tuner::V1_0::IFilterCallback; using ::android::hardware::tv::tuner::V1_0::IFrontend; Loading Loading @@ -82,6 +84,7 @@ struct JTuner : public RefBase { jobject getLnbIds(); jobject openLnbById(int id); jobject openFilter(DemuxFilterType type, int bufferSize); jobject openDescrambler(); protected: bool openDemux(); Loading