From bee73460b84329d03693ff212e1dac86053cc722 Mon Sep 17 00:00:00 2001 From: shubang Date: Fri, 7 Feb 2020 17:48:02 -0800 Subject: [PATCH] Tuner JNI: demux Bug: 139308734 Test: make; acloud create; Change-Id: I4e821ea24eb109cca54087ea6163d42b6e8f5639 (cherry picked from commit 551d3282f7f59a536574b8004198079c383bc1e2) --- media/java/android/media/tv/tuner/Tuner.java | 10 +- .../media/tv/tuner/TunerConstants.java | 13 ++ media/jni/android_media_tv_Tuner.cpp | 118 ++++++++++++++---- media/jni/android_media_tv_Tuner.h | 7 +- 4 files changed, 120 insertions(+), 28 deletions(-) diff --git a/media/java/android/media/tv/tuner/Tuner.java b/media/java/android/media/tv/tuner/Tuner.java index 73769be3d6ad0..6f00ca05ce7f3 100644 --- a/media/java/android/media/tv/tuner/Tuner.java +++ b/media/java/android/media/tv/tuner/Tuner.java @@ -196,8 +196,8 @@ public class Tuner implements AutoCloseable { private native int nativeSetLnb(int lnbId); private native int nativeSetLna(boolean enable); private native FrontendStatus nativeGetFrontendStatus(int[] statusTypes); - private native int nativeGetAvSyncHwId(Filter filter); - private native long nativeGetAvSyncTime(int avSyncId); + private native Integer nativeGetAvSyncHwId(Filter filter); + private native Long nativeGetAvSyncTime(int avSyncId); private native int nativeConnectCiCam(int ciCamId); private native int nativeDisconnectCiCam(); private native FrontendInfo nativeGetFrontendInfo(int id); @@ -443,7 +443,8 @@ public class Tuner implements AutoCloseable { @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public int getAvSyncHwId(@NonNull Filter filter) { TunerUtils.checkTunerPermission(mContext); - return nativeGetAvSyncHwId(filter); + Integer id = nativeGetAvSyncHwId(filter); + return id == null ? TunerConstants.INVALID_AV_SYNC_ID : id; } /** @@ -458,7 +459,8 @@ public class Tuner implements AutoCloseable { @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public long getAvSyncTime(int avSyncHwId) { TunerUtils.checkTunerPermission(mContext); - return nativeGetAvSyncTime(avSyncHwId); + Long time = nativeGetAvSyncTime(avSyncHwId); + return time == null ? TunerConstants.TIMESTAMP_UNAVAILABLE : time; } /** diff --git a/media/java/android/media/tv/tuner/TunerConstants.java b/media/java/android/media/tv/tuner/TunerConstants.java index 82af658af2ca9..6d89962d190f8 100644 --- a/media/java/android/media/tv/tuner/TunerConstants.java +++ b/media/java/android/media/tv/tuner/TunerConstants.java @@ -46,6 +46,19 @@ public final class TunerConstants { * Invalid AV Sync ID. */ public static final int INVALID_AV_SYNC_ID = Constants.Constant.INVALID_AV_SYNC_ID; + /** + * Timestamp is unavailable. + * + *

Returned by {@link android.media.tv.tuner.filter.TimeFilter#getSourceTime()}, + * {@link android.media.tv.tuner.filter.TimeFilter#getTimeStamp()}, or + * {@link Tuner#getAvSyncTime(int)} when the requested timestamp is not available. + * + * @see android.media.tv.tuner.filter.TimeFilter#getSourceTime() + * @see android.media.tv.tuner.filter.TimeFilter#getTimeStamp() + * @see Tuner#getAvSyncTime(int) + * @hide + */ + public static final long TIMESTAMP_UNAVAILABLE = -1L; /** @hide */ @IntDef(prefix = "SCAN_TYPE_", value = {SCAN_TYPE_UNDEFINED, SCAN_TYPE_AUTO, SCAN_TYPE_BLIND}) diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index 5c39f296501ca..e68ccfaa08122 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -119,7 +119,6 @@ using ::android::hardware::tv::tuner::V1_0::FrontendType; using ::android::hardware::tv::tuner::V1_0::ITuner; using ::android::hardware::tv::tuner::V1_0::PlaybackSettings; using ::android::hardware::tv::tuner::V1_0::RecordSettings; -using ::android::hardware::tv::tuner::V1_0::Result; struct fields_t { jfieldID tunerContext; @@ -845,22 +844,85 @@ int JTuner::setLna(bool enable) { return (int)result; } -bool JTuner::openDemux() { +Result JTuner::openDemux() { if (mTuner == nullptr) { - return false; + return Result::NOT_INITIALIZED; } if (mDemux != nullptr) { - return true; + return Result::SUCCESS; } - mTuner->openDemux([&](Result, uint32_t demuxId, const sp& demux) { + Result res; + mTuner->openDemux([&](Result r, uint32_t demuxId, const sp& demux) { mDemux = demux; mDemuxId = demuxId; + res = r; ALOGD("open demux, id = %d", demuxId); }); - if (mDemux == nullptr) { - return false; + return res; +} + +jobject JTuner::getAvSyncHwId(sp filter) { + if (mDemux == NULL) { + return NULL; } - return true; + + uint32_t avSyncHwId; + Result res; + sp iFilterSp = filter->getIFilter(); + mDemux->getAvSyncHwId(iFilterSp, + [&](Result r, uint32_t id) { + res = r; + avSyncHwId = id; + }); + if (res == Result::SUCCESS) { + JNIEnv *env = AndroidRuntime::getJNIEnv(); + jclass integerClazz = env->FindClass("java/lang/Integer"); + jmethodID intInit = env->GetMethodID(integerClazz, "", "(I)V"); + return env->NewObject(integerClazz, intInit, avSyncHwId); + } + return NULL; +} + +jobject JTuner::getAvSyncTime(jint id) { + if (mDemux == NULL) { + return NULL; + } + uint64_t time; + Result res; + mDemux->getAvSyncTime(static_cast(id), + [&](Result r, uint64_t ts) { + res = r; + time = ts; + }); + if (res == Result::SUCCESS) { + JNIEnv *env = AndroidRuntime::getJNIEnv(); + jclass longClazz = env->FindClass("java/lang/Long"); + jmethodID longInit = env->GetMethodID(longClazz, "", "(J)V"); + return env->NewObject(longClazz, longInit, static_cast(time)); + } + return NULL; +} + +int JTuner::connectCiCam(jint id) { + if (mDemux == NULL) { + Result r = openDemux(); + if (r != Result::SUCCESS) { + return (int) r; + } + } + Result r = mDemux->connectCiCam(static_cast(id)); + return (int) r; +} + +int JTuner::disconnectCiCam() { + if (mDemux == NULL) { + Result r = openDemux(); + if (r != Result::SUCCESS) { + return (int) r; + } + } + Result r = mDemux->disconnectCiCam(); + return (int) r; } jobject JTuner::openDescrambler() { @@ -892,7 +954,7 @@ jobject JTuner::openDescrambler() { jobject JTuner::openFilter(DemuxFilterType type, int bufferSize) { if (mDemux == NULL) { - if (!openDemux()) { + if (openDemux() != Result::SUCCESS) { return NULL; } } @@ -917,7 +979,6 @@ jobject JTuner::openFilter(DemuxFilterType type, int bufferSize) { env->NewObject( env->FindClass("android/media/tv/tuner/filter/Filter"), gFields.filterInitID, - mObject, (jint) fId); sp filterSp = new Filter(iFilterSp, filterObj); @@ -931,7 +992,7 @@ jobject JTuner::openFilter(DemuxFilterType type, int bufferSize) { jobject JTuner::openTimeFilter() { if (mDemux == NULL) { - if (!openDemux()) { + if (openDemux() != Result::SUCCESS) { return NULL; } } @@ -962,7 +1023,7 @@ jobject JTuner::openTimeFilter() { jobject JTuner::openDvr(DvrType type, int bufferSize) { ALOGD("JTuner::openDvr"); if (mDemux == NULL) { - if (!openDemux()) { + if (openDemux() != Result::SUCCESS) { return NULL; } } @@ -1608,20 +1669,30 @@ static jobject android_media_tv_Tuner_get_frontend_status(JNIEnv, jobject, jintA return NULL; } -static int android_media_tv_Tuner_gat_av_sync_hw_id(JNIEnv*, jobject, jobject) { - return 0; +static jobject android_media_tv_Tuner_get_av_sync_hw_id( + JNIEnv *env, jobject thiz, jobject filter) { + sp filterSp = getFilter(env, filter); + if (filterSp == NULL) { + ALOGD("Failed to get sync ID. Filter not found"); + return NULL; + } + sp tuner = getTuner(env, thiz); + return tuner->getAvSyncHwId(filterSp); } -static jlong android_media_tv_Tuner_gat_av_sync_time(JNIEnv*, jobject, jint) { - return 0; +static jobject android_media_tv_Tuner_get_av_sync_time(JNIEnv *env, jobject thiz, jint id) { + sp tuner = getTuner(env, thiz); + return tuner->getAvSyncTime(id); } -static int android_media_tv_Tuner_connect_cicam(JNIEnv*, jobject, jint) { - return 0; +static int android_media_tv_Tuner_connect_cicam(JNIEnv *env, jobject thiz, jint id) { + sp tuner = getTuner(env, thiz); + return tuner->connectCiCam(id); } -static int android_media_tv_Tuner_disconnect_cicam(JNIEnv*, jobject) { - return 0; +static int android_media_tv_Tuner_disconnect_cicam(JNIEnv *env, jobject thiz) { + sp tuner = getTuner(env, thiz); + return tuner->disconnectCiCam(); } static jobject android_media_tv_Tuner_get_frontend_info(JNIEnv *env, jobject thiz, jint id) { @@ -2500,9 +2571,10 @@ static const JNINativeMethod gTunerMethods[] = { { "nativeSetLna", "(Z)I", (void *)android_media_tv_Tuner_set_lna }, { "nativeGetFrontendStatus", "([I)Landroid/media/tv/tuner/frontend/FrontendStatus;", (void *)android_media_tv_Tuner_get_frontend_status }, - { "nativeGetAvSyncHwId", "(Landroid/media/tv/tuner/filter/Filter;)I", - (void *)android_media_tv_Tuner_gat_av_sync_hw_id }, - { "nativeGetAvSyncTime", "(I)J", (void *)android_media_tv_Tuner_gat_av_sync_time }, + { "nativeGetAvSyncHwId", "(Landroid/media/tv/tuner/filter/Filter;)Ljava/lang/Integer;", + (void *)android_media_tv_Tuner_get_av_sync_hw_id }, + { "nativeGetAvSyncTime", "(I)Ljava/lang/Long;", + (void *)android_media_tv_Tuner_get_av_sync_time }, { "nativeConnectCiCam", "(I)I", (void *)android_media_tv_Tuner_connect_cicam }, { "nativeDisconnectCiCam", "()I", (void *)android_media_tv_Tuner_disconnect_cicam }, { "nativeGetFrontendInfo", "(I)Landroid/media/tv/tuner/frontend/FrontendInfo;", diff --git a/media/jni/android_media_tv_Tuner.h b/media/jni/android_media_tv_Tuner.h index 32d489979d2b0..b786fc4e76b79 100644 --- a/media/jni/android_media_tv_Tuner.h +++ b/media/jni/android_media_tv_Tuner.h @@ -60,6 +60,7 @@ using ::android::hardware::tv::tuner::V1_0::LnbEventType; using ::android::hardware::tv::tuner::V1_0::LnbId; using ::android::hardware::tv::tuner::V1_0::PlaybackStatus; using ::android::hardware::tv::tuner::V1_0::RecordStatus; +using ::android::hardware::tv::tuner::V1_0::Result; using FilterMQ = MessageQueue; using DvrMQ = MessageQueue; @@ -141,6 +142,10 @@ struct TimeFilter : public RefBase { struct JTuner : public RefBase { JTuner(JNIEnv *env, jobject thiz); sp getTunerService(); + jobject getAvSyncHwId(sp filter); + jobject getAvSyncTime(jint id); + int connectCiCam(jint id); + int disconnectCiCam(); jobject getFrontendIds(); jobject openFrontendById(int id); jobject getFrontendInfo(int id); @@ -158,7 +163,7 @@ struct JTuner : public RefBase { jobject openDvr(DvrType type, int bufferSize); protected: - bool openDemux(); + Result openDemux(); virtual ~JTuner(); private: