Merge "Tuner JNI: demux" into rvc-dev am: 0eba93a5ed

Change-Id: Ib115bd0eee7b6a09c9d7555bc2373a7fde751a11
This commit is contained in:
Automerger Merge Worker
2020-02-28 01:31:33 +00:00
4 changed files with 120 additions and 28 deletions

View File

@@ -216,8 +216,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);
@@ -463,7 +463,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;
}
/**
@@ -478,7 +479,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;
}
/**

View File

@@ -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.
*
* <p>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})

View File

@@ -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<IDemux>& demux) {
Result res;
mTuner->openDemux([&](Result r, uint32_t demuxId, const sp<IDemux>& 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> filter) {
if (mDemux == NULL) {
return NULL;
}
return true;
uint32_t avSyncHwId;
Result res;
sp<IFilter> 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, "<init>", "(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<uint32_t>(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, "<init>", "(J)V");
return env->NewObject(longClazz, longInit, static_cast<jlong>(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<uint32_t>(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<Filter> 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<Filter> filterSp = getFilter(env, filter);
if (filterSp == NULL) {
ALOGD("Failed to get sync ID. Filter not found");
return NULL;
}
sp<JTuner> 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<JTuner> 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<JTuner> 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<JTuner> 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;",

View File

@@ -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<uint8_t, kSynchronizedReadWrite>;
using DvrMQ = MessageQueue<uint8_t, kSynchronizedReadWrite>;
@@ -141,6 +142,10 @@ struct TimeFilter : public RefBase {
struct JTuner : public RefBase {
JTuner(JNIEnv *env, jobject thiz);
sp<ITuner> getTunerService();
jobject getAvSyncHwId(sp<Filter> 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: