Add new features to tuner.
*) Support scan unlock event
*) Support get frontend hardware info.
*) Add scIndexMask to MediaEvent.
*) Support more AAC formats.
*) Move Lna to ITuner.
Bug: 203389496
Bug: 184017033
Bug: 202978951
Bug: 205265630
Bug: 203623028
Test: atest android.media.tv.tuner.cts on AIDL and HILD HALs.
Change-Id: Id1bf4f13e7afb5f4264bfc67ca7d822848c6e803
diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp
index e91e238..a8e3288 100644
--- a/media/jni/android_media_tv_Tuner.cpp
+++ b/media/jni/android_media_tv_Tuner.cpp
@@ -604,9 +604,11 @@
const DemuxFilterEvent &event) {
JNIEnv *env = AndroidRuntime::getJNIEnv();
jclass eventClazz = env->FindClass("android/media/tv/tuner/filter/MediaEvent");
- jmethodID eventInit = env->GetMethodID(eventClazz, "<init>",
- "(IZJZJJJLandroid/media/MediaCodec$LinearBlock;"
- "ZJIZLandroid/media/tv/tuner/filter/AudioDescriptor;)V");
+ jmethodID eventInit = env->GetMethodID(
+ eventClazz,
+ "<init>",
+ "(IZJZJJJLandroid/media/MediaCodec$LinearBlock;"
+ "ZJIZILandroid/media/tv/tuner/filter/AudioDescriptor;)V");
jfieldID eventContext = env->GetFieldID(eventClazz, "mNativeContext", "J");
const DemuxFilterMediaEvent &mediaEvent = event.get<DemuxFilterEvent::Tag::media>();
@@ -639,10 +641,20 @@
jlong avDataId = mediaEvent.avDataId;
jint mpuSequenceNumber = mediaEvent.mpuSequenceNumber;
jboolean isPesPrivateData = mediaEvent.isPesPrivateData;
+ jint sc = 0;
+ if (mediaEvent.scIndexMask.getTag() == DemuxFilterScIndexMask::Tag::scIndex) {
+ sc = mediaEvent.scIndexMask.get<DemuxFilterScIndexMask::Tag::scIndex>();
+ } else if (mediaEvent.scIndexMask.getTag() == DemuxFilterScIndexMask::Tag::scHevc) {
+ sc = mediaEvent.scIndexMask.get<DemuxFilterScIndexMask::Tag::scHevc>();
+ } else if (mediaEvent.scIndexMask.getTag() == DemuxFilterScIndexMask::Tag::scAvc) {
+ sc = mediaEvent.scIndexMask.get<DemuxFilterScIndexMask::Tag::scAvc>();
+ // Java uses the values defined by HIDL HAL. Left shift 4 bits.
+ sc = sc << 4;
+ }
jobject obj = env->NewObject(eventClazz, eventInit, streamId, isPtsPresent, pts, isDtsPresent,
dts, dataLength, offset, nullptr, isSecureMemory, avDataId,
- mpuSequenceNumber, isPesPrivateData, audioDescriptor);
+ mpuSequenceNumber, isPesPrivateData, sc, audioDescriptor);
uint64_t avSharedMemSize = mFilterClient->getAvSharedHandleInfo().size;
if (mediaEvent.avMemory.fds.size() > 0 || mediaEvent.avDataId != 0 ||
@@ -1025,6 +1037,10 @@
env->CallVoidMethod(
frontend,
env->GetMethodID(clazz, "onLocked", "()V"));
+ } else {
+ env->CallVoidMethod(
+ frontend,
+ env->GetMethodID(clazz, "onUnLocked", "()V"));
}
break;
}
@@ -1540,6 +1556,15 @@
maxSymbolRate, acquireRange, exclusiveGroupId, statusCaps, jcaps);
}
+Result JTuner::getFrontendHardwareInfo(string &info) {
+ if (mFeClient == nullptr) {
+ ALOGE("frontend is not initialized");
+ return Result::INVALID_STATE;
+ }
+
+ return mFeClient->getHardwareInfo(info);
+}
+
jobject JTuner::openLnbByHandle(int handle) {
if (mTunerClient == nullptr) {
return nullptr;
@@ -1649,11 +1674,10 @@
}
int JTuner::setLna(bool enable) {
- if (mFeClient == nullptr) {
- ALOGE("frontend client is not initialized");
- return (int)Result::INVALID_STATE;
+ if (mTunerClient == nullptr) {
+ return (int)Result::NOT_INITIALIZED;
}
- Result result = mFeClient->setLna(enable);
+ Result result = mTunerClient->setLna(enable);
return (int)result;
}
@@ -4195,6 +4219,16 @@
return filterObj;
}
+static jstring android_media_tv_Tuner_get_frontend_hardware_info(JNIEnv *env, jobject thiz) {
+ sp<JTuner> tuner = getTuner(env, thiz);
+ string info;
+ Result r = tuner->getFrontendHardwareInfo(info);
+ if (r != Result::SUCCESS) {
+ return nullptr;
+ }
+ return env->NewStringUTF(info.data());
+}
+
static jint android_media_tv_Tuner_close_frontend(JNIEnv* env, jobject thiz, jint /* handle */) {
sp<JTuner> tuner = getTuner(env, thiz);
return tuner->closeFrontend();
@@ -4504,6 +4538,8 @@
{ "nativeOpenSharedFilter",
"(Ljava/lang/String;)Landroid/media/tv/tuner/filter/SharedFilter;",
(void *)android_media_tv_Tuner_open_shared_filter},
+ { "nativeGetFrontendHardwareInfo","()Ljava/lang/String;",
+ (void *)android_media_tv_Tuner_get_frontend_hardware_info },
};
static const JNINativeMethod gFilterMethods[] = {
diff --git a/media/jni/android_media_tv_Tuner.h b/media/jni/android_media_tv_Tuner.h
index 06e2492..4cad92b 100644
--- a/media/jni/android_media_tv_Tuner.h
+++ b/media/jni/android_media_tv_Tuner.h
@@ -200,6 +200,7 @@
jint close();
jint closeFrontend();
jint closeDemux();
+ Result getFrontendHardwareInfo(string& info);
jweak getObject();
diff --git a/media/jni/tuner/FrontendClient.cpp b/media/jni/tuner/FrontendClient.cpp
index 70309a0..0fdd8d8 100644
--- a/media/jni/tuner/FrontendClient.cpp
+++ b/media/jni/tuner/FrontendClient.cpp
@@ -102,15 +102,6 @@
return Result::INVALID_STATE;
}
-Result FrontendClient::setLna(bool bEnable) {
- if (mTunerFrontend != nullptr) {
- Status s = mTunerFrontend->setLna(bEnable);
- return ClientHelper::getServiceSpecificErrorCode(s);
- }
-
- return Result::INVALID_STATE;
-}
-
int32_t FrontendClient::linkCiCamToFrontend(int32_t ciCamId) {
int32_t ltsId = static_cast<int32_t>(Constant::INVALID_LTS_ID);
@@ -143,6 +134,15 @@
return Result::INVALID_STATE;
}
+Result FrontendClient::getHardwareInfo(string& info) {
+ if (mTunerFrontend != nullptr) {
+ Status s = mTunerFrontend->getHardwareInfo(&info);
+ return ClientHelper::getServiceSpecificErrorCode(s);
+ }
+
+ return Result::INVALID_STATE;
+}
+
shared_ptr<ITunerFrontend> FrontendClient::getAidlFrontend() {
return mTunerFrontend;
}
diff --git a/media/jni/tuner/FrontendClient.h b/media/jni/tuner/FrontendClient.h
index 08c0b20..77d9098 100644
--- a/media/jni/tuner/FrontendClient.h
+++ b/media/jni/tuner/FrontendClient.h
@@ -99,11 +99,6 @@
Result setLnb(sp<LnbClient> lnbClient);
/**
- * Enable or Disable Low Noise Amplifier (LNA).
- */
- Result setLna(bool bEnable);
-
- /**
* Link Frontend to the cicam with given id.
*
* @return lts id
@@ -120,7 +115,13 @@
*/
Result close();
+ /**
+ * Get Frontend hardware info.
+ */
+ Result getHardwareInfo(string& info);
+
int32_t getId();
+
shared_ptr<ITunerFrontend> getAidlFrontend();
private:
/**
diff --git a/media/jni/tuner/TunerClient.cpp b/media/jni/tuner/TunerClient.cpp
index 861d78d..f917f01 100644
--- a/media/jni/tuner/TunerClient.cpp
+++ b/media/jni/tuner/TunerClient.cpp
@@ -185,4 +185,13 @@
return nullptr;
}
+Result TunerClient::setLna(bool bEnable) {
+ if (mTunerService != nullptr) {
+ Status s = mTunerService->setLna(bEnable);
+ return ClientHelper::getServiceSpecificErrorCode(s);
+ }
+
+ return Result::INVALID_STATE;
+}
+
} // namespace android
diff --git a/media/jni/tuner/TunerClient.h b/media/jni/tuner/TunerClient.h
index 3e59e26..37b8ee1 100644
--- a/media/jni/tuner/TunerClient.h
+++ b/media/jni/tuner/TunerClient.h
@@ -127,6 +127,11 @@
*/
sp<FilterClient> openSharedFilter(const string& filterToken, sp<FilterClientCallback> cb);
+ /**
+ * Enable or Disable Low Noise Amplifier (LNA).
+ */
+ Result setLna(bool bEnable);
+
private:
/**
* An AIDL Tuner Service Singleton assigned at the first time the Tuner Client