Enable support for capability based demux management
Bug: 239211919
Bug: 239227510
Test: atest TunerTest TunerResourceManagerServiceTest VtsHalTvTunerTargetTest
Change-Id: I75574f4aeecd730f8d8678667d13a72b41260faa
diff --git a/services/tuner/TunerHelper.cpp b/services/tuner/TunerHelper.cpp
index dc67110..a03386f 100644
--- a/services/tuner/TunerHelper.cpp
+++ b/services/tuner/TunerHelper.cpp
@@ -83,6 +83,22 @@
tunerRM->setFrontendInfoList(feInfos);
tunerRM->setLnbInfoList(lnbHandles);
}
+void TunerHelper::updateTunerResources(const vector<TunerFrontendInfo>& feInfos,
+ const vector<TunerDemuxInfo>& demuxInfos,
+ const vector<int32_t>& lnbHandles) {
+ ::ndk::SpAIBinder binder(AServiceManager_waitForService("tv_tuner_resource_mgr"));
+ shared_ptr<ITunerResourceManager> tunerRM = ITunerResourceManager::fromBinder(binder);
+ if (tunerRM == nullptr) {
+ return;
+ }
+
+ updateTunerResources(feInfos, lnbHandles);
+
+ // for Tuner 2.0 and below, Demux resource is not really managed under TRM
+ if (demuxInfos.size() > 0) {
+ tunerRM->setDemuxInfoList(demuxInfos);
+ }
+}
// TODO: create a map between resource id and handles.
int TunerHelper::getResourceIdFromHandle(int resourceHandle, int /*type*/) {
diff --git a/services/tuner/TunerHelper.h b/services/tuner/TunerHelper.h
index 755df57..65a9b0b 100644
--- a/services/tuner/TunerHelper.h
+++ b/services/tuner/TunerHelper.h
@@ -17,9 +17,11 @@
#ifndef ANDROID_MEDIA_TUNERDVRHELPER_H
#define ANDROID_MEDIA_TUNERDVRHELPER_H
+#include <aidl/android/media/tv/tunerresourcemanager/TunerDemuxInfo.h>
#include <aidl/android/media/tv/tunerresourcemanager/TunerFrontendInfo.h>
#include <utils/String16.h>
+using ::aidl::android::media::tv::tunerresourcemanager::TunerDemuxInfo;
using ::aidl::android::media::tv::tunerresourcemanager::TunerFrontendInfo;
using ::android::String16;
@@ -55,6 +57,10 @@
// TODO: update Demux, Descrambler.
static void updateTunerResources(const vector<TunerFrontendInfo>& feInfos,
const vector<int32_t>& lnbHandles);
+
+ static void updateTunerResources(const vector<TunerFrontendInfo>& feInfos,
+ const vector<TunerDemuxInfo>& demuxInfos,
+ const vector<int32_t>& lnbHandles);
// TODO: create a map between resource id and handles.
static int getResourceIdFromHandle(int resourceHandle, int type);
static int getResourceHandleFromId(int id, int resourceType);
diff --git a/services/tuner/TunerService.cpp b/services/tuner/TunerService.cpp
index d59d95f..e5bcf1f 100644
--- a/services/tuner/TunerService.cpp
+++ b/services/tuner/TunerService.cpp
@@ -82,18 +82,75 @@
return AServiceManager_addService(tunerService->asBinder().get(), getServiceName());
}
-::ndk::ScopedAStatus TunerService::openDemux(int32_t /* in_demuxHandle */,
+::ndk::ScopedAStatus TunerService::openDemux(int32_t in_demuxHandle,
shared_ptr<ITunerDemux>* _aidl_return) {
ALOGV("openDemux");
- vector<int32_t> id;
shared_ptr<IDemux> demux;
- auto status = mTuner->openDemux(&id, &demux);
- if (status.isOk()) {
- *_aidl_return =
- ::ndk::SharedRefBase::make<TunerDemux>(demux, id[0], this->ref<TunerService>());
+ bool fallBackToOpenDemux = false;
+ vector<int32_t> ids;
+
+ if (mTunerVersion <= TUNER_HAL_VERSION_2_0) {
+ fallBackToOpenDemux = true;
+ } else {
+ mTuner->getDemuxIds(&ids);
+ if (ids.size() == 0) {
+ fallBackToOpenDemux = true;
+ }
}
- return status;
+ if (fallBackToOpenDemux) {
+ auto status = mTuner->openDemux(&ids, &demux);
+ return ::ndk::ScopedAStatus::fromServiceSpecificError(
+ static_cast<int32_t>(Result::UNAVAILABLE));
+ } else {
+ int id = TunerHelper::getResourceIdFromHandle(in_demuxHandle, DEMUX);
+ auto status = mTuner->openDemuxById(id, &demux);
+ if (status.isOk()) {
+ *_aidl_return =
+ ::ndk::SharedRefBase::make<TunerDemux>(demux, id, this->ref<TunerService>());
+ }
+ return status;
+ }
+}
+
+::ndk::ScopedAStatus TunerService::getDemuxInfo(int32_t in_demuxHandle, DemuxInfo* _aidl_return) {
+ if (mTunerVersion <= TUNER_HAL_VERSION_2_0) {
+ return ::ndk::ScopedAStatus::fromServiceSpecificError(
+ static_cast<int32_t>(Result::UNAVAILABLE));
+ }
+ int id = TunerHelper::getResourceIdFromHandle(in_demuxHandle, DEMUX);
+ return mTuner->getDemuxInfo(id, _aidl_return);
+}
+
+::ndk::ScopedAStatus TunerService::getDemuxInfoList(vector<DemuxInfo>* _aidl_return) {
+ if (mTunerVersion <= TUNER_HAL_VERSION_2_0) {
+ return ::ndk::ScopedAStatus::fromServiceSpecificError(
+ static_cast<int32_t>(Result::UNAVAILABLE));
+ }
+ vector<DemuxInfo> demuxInfoList;
+ vector<int32_t> ids;
+ auto status = mTuner->getDemuxIds(&ids);
+ if (!status.isOk()) {
+ return ::ndk::ScopedAStatus::fromServiceSpecificError(
+ static_cast<int32_t>(Result::UNAVAILABLE));
+ }
+
+ for (int i = 0; i < ids.size(); i++) {
+ DemuxInfo demuxInfo;
+ auto res = mTuner->getDemuxInfo(ids[i], &demuxInfo);
+ if (!res.isOk()) {
+ continue;
+ }
+ demuxInfoList.push_back(demuxInfo);
+ }
+
+ if (demuxInfoList.size() > 0) {
+ *_aidl_return = demuxInfoList;
+ return ::ndk::ScopedAStatus::ok();
+ } else {
+ return ::ndk::ScopedAStatus::fromServiceSpecificError(
+ static_cast<int32_t>(Result::UNAVAILABLE));
+ }
}
::ndk::ScopedAStatus TunerService::getDemuxCaps(DemuxCapabilities* _aidl_return) {
@@ -230,7 +287,9 @@
}
void TunerService::updateTunerResources() {
- TunerHelper::updateTunerResources(getTRMFrontendInfos(), getTRMLnbHandles());
+ TunerHelper::updateTunerResources(getTRMFrontendInfos(),
+ getTRMDemuxInfos(),
+ getTRMLnbHandles());
}
vector<TunerFrontendInfo> TunerService::getTRMFrontendInfos() {
@@ -258,6 +317,32 @@
return infos;
}
+vector<TunerDemuxInfo> TunerService::getTRMDemuxInfos() {
+ vector<TunerDemuxInfo> infos;
+ vector<int32_t> ids;
+
+ if (mTunerVersion <= TUNER_HAL_VERSION_2_0) {
+ return infos;
+ }
+
+ auto status = mTuner->getDemuxIds(&ids);
+ if (!status.isOk()) {
+ return infos;
+ }
+
+ for (int i = 0; i < ids.size(); i++) {
+ DemuxInfo demuxInfo;
+ mTuner->getDemuxInfo(ids[i], &demuxInfo);
+ TunerDemuxInfo tunerDemuxInfo{
+ .handle = TunerHelper::getResourceHandleFromId((int)ids[i], DEMUX),
+ .filterTypes = static_cast<int>(demuxInfo.filterTypes)
+ };
+ infos.push_back(tunerDemuxInfo);
+ }
+
+ return infos;
+}
+
vector<int32_t> TunerService::getTRMLnbHandles() {
vector<int32_t> lnbHandles;
if (mTuner != nullptr) {
diff --git a/services/tuner/TunerService.h b/services/tuner/TunerService.h
index 517df4a..190ccd4 100644
--- a/services/tuner/TunerService.h
+++ b/services/tuner/TunerService.h
@@ -32,6 +32,7 @@
using ::aidl::android::hardware::tv::tuner::DemuxCapabilities;
using ::aidl::android::hardware::tv::tuner::DemuxFilterEvent;
using ::aidl::android::hardware::tv::tuner::DemuxFilterStatus;
+using ::aidl::android::hardware::tv::tuner::DemuxInfo;
using ::aidl::android::hardware::tv::tuner::FrontendInfo;
using ::aidl::android::hardware::tv::tuner::FrontendType;
using ::aidl::android::hardware::tv::tuner::ITuner;
@@ -71,6 +72,8 @@
::ndk::ScopedAStatus openDemux(int32_t in_demuxHandle,
shared_ptr<ITunerDemux>* _aidl_return) override;
::ndk::ScopedAStatus getDemuxCaps(DemuxCapabilities* _aidl_return) override;
+ ::ndk::ScopedAStatus getDemuxInfo(int32_t in_demuxHandle, DemuxInfo* _aidl_return) override;
+ ::ndk::ScopedAStatus getDemuxInfoList(vector<DemuxInfo>* _aidl_return) override;
::ndk::ScopedAStatus openDescrambler(int32_t in_descramblerHandle,
shared_ptr<ITunerDescrambler>* _aidl_return) override;
::ndk::ScopedAStatus getTunerHalVersion(int32_t* _aidl_return) override;
@@ -90,6 +93,7 @@
private:
void updateTunerResources();
vector<TunerFrontendInfo> getTRMFrontendInfos();
+ vector<TunerDemuxInfo> getTRMDemuxInfos();
vector<int32_t> getTRMLnbHandles();
shared_ptr<ITuner> mTuner;
diff --git a/services/tuner/aidl/android/media/tv/tuner/ITunerService.aidl b/services/tuner/aidl/android/media/tv/tuner/ITunerService.aidl
index 8d285e3..932133e 100644
--- a/services/tuner/aidl/android/media/tv/tuner/ITunerService.aidl
+++ b/services/tuner/aidl/android/media/tv/tuner/ITunerService.aidl
@@ -17,6 +17,7 @@
package android.media.tv.tuner;
import android.hardware.tv.tuner.DemuxCapabilities;
+import android.hardware.tv.tuner.DemuxInfo;
import android.hardware.tv.tuner.FrontendInfo;
import android.hardware.tv.tuner.FrontendType;
import android.media.tv.tuner.ITunerDemux;
@@ -77,6 +78,21 @@
ITunerDemux openDemux(in int demuxHandle);
/**
+ * Retrieve the supported filter main types
+ *
+ * @param demuxHandle the handle of the demux to query demux info for
+ * @return the demux info
+ */
+ DemuxInfo getDemuxInfo(in int demuxHandle);
+
+ /**
+ * Retrieve the list of demux info for all the demuxes on the system
+ *
+ * @return the list of DemuxInfo
+ */
+ DemuxInfo[] getDemuxInfoList();
+
+ /**
* Retrieve the Tuner Demux capabilities.
*
* @return the demux’s capabilities.
diff --git a/services/tuner/hidl/TunerHidlService.cpp b/services/tuner/hidl/TunerHidlService.cpp
index 52005c2..6bc36be 100644
--- a/services/tuner/hidl/TunerHidlService.cpp
+++ b/services/tuner/hidl/TunerHidlService.cpp
@@ -123,6 +123,20 @@
return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
}
+::ndk::ScopedAStatus TunerHidlService::getDemuxInfo(int32_t /* in_demuxHandle */,
+ DemuxInfo* /* _aidl_return */) {
+ ALOGE("getDemuxInfo is not supported");
+ return ::ndk::ScopedAStatus::fromServiceSpecificError(
+ static_cast<int32_t>(HidlResult::UNAVAILABLE));
+}
+
+::ndk::ScopedAStatus TunerHidlService::getDemuxInfoList(
+ vector<DemuxInfo>* /* _aidle_return */) {
+ ALOGE("getDemuxInfoList is not supported");
+ return ::ndk::ScopedAStatus::fromServiceSpecificError(
+ static_cast<int32_t>(HidlResult::UNAVAILABLE));
+}
+
::ndk::ScopedAStatus TunerHidlService::getDemuxCaps(DemuxCapabilities* _aidl_return) {
ALOGV("getDemuxCaps");
HidlResult res;
diff --git a/services/tuner/hidl/TunerHidlService.h b/services/tuner/hidl/TunerHidlService.h
index 872aefc..526c5e6 100644
--- a/services/tuner/hidl/TunerHidlService.h
+++ b/services/tuner/hidl/TunerHidlService.h
@@ -33,6 +33,7 @@
using ::aidl::android::hardware::tv::tuner::DemuxCapabilities;
using ::aidl::android::hardware::tv::tuner::DemuxFilterEvent;
using ::aidl::android::hardware::tv::tuner::DemuxFilterStatus;
+using ::aidl::android::hardware::tv::tuner::DemuxInfo;
using ::aidl::android::hardware::tv::tuner::FrontendInfo;
using ::aidl::android::hardware::tv::tuner::FrontendType;
using ::aidl::android::media::tv::tuner::ITunerDemux;
@@ -83,6 +84,8 @@
::ndk::ScopedAStatus openDemux(int32_t in_demuxHandle,
shared_ptr<ITunerDemux>* _aidl_return) override;
::ndk::ScopedAStatus getDemuxCaps(DemuxCapabilities* _aidl_return) override;
+ ::ndk::ScopedAStatus getDemuxInfo(int32_t in_demuxHandle, DemuxInfo* _aidl_return) override;
+ ::ndk::ScopedAStatus getDemuxInfoList(vector<DemuxInfo>* _aidl_return) override;
::ndk::ScopedAStatus openDescrambler(int32_t in_descramblerHandle,
shared_ptr<ITunerDescrambler>* _aidl_return) override;
::ndk::ScopedAStatus getTunerHalVersion(int32_t* _aidl_return) override;