Merge "Fix issues in TunerClient implementations" into sc-dev

This commit is contained in:
TreeHugger Robot
2021-02-11 03:30:52 +00:00
committed by Android (Google) Code Review
7 changed files with 138 additions and 81 deletions

View File

@@ -180,6 +180,10 @@ cc_library_shared {
"libstagefright_foundation_headers",
],
// TunerService is a system service required for Tuner feature.
// TunerJNI is a client of TunerService so we build the dependency here.
required: ["mediatuner"],
export_include_dirs: ["."],
cflags: [

View File

@@ -19,6 +19,7 @@
#include <android/binder_parcel_utils.h>
#include <android/hardware/tv/tuner/1.1/types.h>
#include <utils/Log.h>
using Status = ::ndk::ScopedAStatus;
@@ -37,6 +38,7 @@ public:
} else if (s.isOk()) {
return Result::SUCCESS;
}
ALOGE("Aidl exception code %s", s.getDescription().c_str());
return Result::UNKNOWN_ERROR;
}
};

View File

@@ -43,6 +43,7 @@ using ::android::hardware::tv::tuner::V1_0::DemuxStreamId;
using ::android::hardware::tv::tuner::V1_0::DemuxTpid;
using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterSettings;
using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterType;
using ::android::hardware::tv::tuner::V1_1::DemuxFilterMonitorEvent;
using ::android::hardware::tv::tuner::V1_1::ScramblingStatus;
namespace android {
@@ -480,7 +481,7 @@ void FilterClient::getAidlIpAddress(DemuxIpAddress ipAddr,
case DemuxIpAddress::SrcIpAddress::hidl_discriminator::v4: {
int size = ipAddr.srcIpAddress.v4().size();
srcIpAddress.isIpV6 = false;
srcIpAddress.addr.resize(ipAddr.srcIpAddress.v4().size());
srcIpAddress.addr.resize(size);
copy(&ipAddr.srcIpAddress.v4()[0], &ipAddr.srcIpAddress.v4()[size],
srcIpAddress.addr.begin());
break;
@@ -493,8 +494,6 @@ void FilterClient::getAidlIpAddress(DemuxIpAddress ipAddr,
srcIpAddress.addr.begin());
break;
}
default:
break;
}
switch (ipAddr.dstIpAddress.getDiscriminator()) {
case DemuxIpAddress::DstIpAddress::hidl_discriminator::v4: {
@@ -513,8 +512,6 @@ void FilterClient::getAidlIpAddress(DemuxIpAddress ipAddr,
dstIpAddress.addr.begin());
break;
}
default:
break;
}
}
@@ -696,8 +693,6 @@ void TunerFilterCallback::getHidlFilterEvent(const vector<TunerFilterEvent>& fil
getHidlRestartEvent(filterEvents, eventExt);
break;
}
default:
break;
}
}
@@ -883,19 +878,18 @@ void TunerFilterCallback::getHidlMonitorEvent(const vector<TunerFilterEvent>& fi
DemuxFilterEventExt& eventExt) {
auto monitor = filterEvents[0].get<TunerFilterEvent::monitor>();
eventExt.events.resize(1);
DemuxFilterMonitorEvent monitorEvent;
switch (monitor.getTag()) {
case TunerFilterMonitorEvent::scramblingStatus: {
eventExt.events[0].monitorEvent().scramblingStatus(
static_cast<ScramblingStatus>(monitor.scramblingStatus));
monitorEvent.scramblingStatus(static_cast<ScramblingStatus>(monitor.scramblingStatus));
eventExt.events[0].monitorEvent(monitorEvent);
break;
}
case TunerFilterMonitorEvent::cid: {
eventExt.events[0].monitorEvent().cid(static_cast<uint32_t>(monitor.cid));
monitorEvent.cid(static_cast<uint32_t>(monitor.cid));
eventExt.events[0].monitorEvent(monitorEvent);
break;
}
default:
eventExt.events[0].noinit();
break;
}
}

View File

@@ -49,9 +49,12 @@ using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtBandwidth;
using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtGuardInterval;
using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtMode;
using ::android::hardware::tv::tuner::V1_0::FrontendIsdbtModulation;
using ::android::hardware::tv::tuner::V1_0::FrontendModulationStatus;
using ::android::hardware::tv::tuner::V1_0::FrontendScanAtsc3PlpInfo;
using ::android::hardware::tv::tuner::V1_0::FrontendStatusAtsc3PlpInfo;
using ::android::hardware::tv::tuner::V1_0::LnbVoltage;
using ::android::hardware::tv::tuner::V1_1::Constant;
using ::android::hardware::tv::tuner::V1_1::FrontendBandwidth;
using ::android::hardware::tv::tuner::V1_1::FrontendCableTimeInterleaveMode;
using ::android::hardware::tv::tuner::V1_1::FrontendDtmbBandwidth;
using ::android::hardware::tv::tuner::V1_1::FrontendDtmbGuardInterval;
@@ -61,19 +64,22 @@ using ::android::hardware::tv::tuner::V1_1::FrontendDtmbTransmissionMode;
using ::android::hardware::tv::tuner::V1_1::FrontendDvbcBandwidth;
using ::android::hardware::tv::tuner::V1_1::FrontendDvbtConstellation;
using ::android::hardware::tv::tuner::V1_1::FrontendDvbtTransmissionMode;
using ::android::hardware::tv::tuner::V1_1::FrontendGuardInterval;
using ::android::hardware::tv::tuner::V1_1::FrontendInterleaveMode;
using ::android::hardware::tv::tuner::V1_1::FrontendModulation;
using ::android::hardware::tv::tuner::V1_1::FrontendRollOff;
using ::android::hardware::tv::tuner::V1_1::FrontendSpectralInversion;
using ::android::hardware::tv::tuner::V1_1::FrontendTransmissionMode;
using ::android::hardware::tv::tuner::V1_1::FrontendType;
namespace android {
/////////////// FrontendClient ///////////////////////
FrontendClient::FrontendClient(shared_ptr<ITunerFrontend> tunerFrontend, int id, int type) {
FrontendClient::FrontendClient(shared_ptr<ITunerFrontend> tunerFrontend, int type) {
mTunerFrontend = tunerFrontend;
mAidlCallback = NULL;
mHidlCallback = NULL;
mId = id;
mType = type;
}
@@ -104,6 +110,11 @@ void FrontendClient::setHidlFrontend(sp<IFrontend> frontend) {
mFrontend_1_1 = ::android::hardware::tv::tuner::V1_1::IFrontend::castFrom(mFrontend);
}
// TODO: move after migration is done
void FrontendClient::setId(int id) {
mId = id;
}
Result FrontendClient::tune(const FrontendSettings& settings,
const FrontendSettingsExt1_1& settingsExt1_1) {
if (mTunerFrontend != NULL) {
@@ -333,13 +344,26 @@ shared_ptr<ITunerFrontend> FrontendClient::getAidlFrontend() {
}
int FrontendClient::getId() {
return mId;
if (mTunerFrontend != NULL) {
Status s = mTunerFrontend->getFrontendId(&mId);
if (ClientHelper::getServiceSpecificErrorCode(s) == Result::SUCCESS) {
return mId;
}
ALOGE("Failed to getFrontendId from Tuner Frontend");
return -1;
}
if (mFrontend != NULL) {
return mId;
}
return -1;
}
vector<FrontendStatus> FrontendClient::getHidlStatus(vector<TunerFrontendStatus>& aidlStatus) {
vector<FrontendStatus> hidlStatus;
for (TunerFrontendStatus s : aidlStatus) {
FrontendStatus status;
FrontendStatus status = FrontendStatus();
switch (s.getTag()) {
case TunerFrontendStatus::isDemodLocked: {
status.isDemodLocked(s.get<TunerFrontendStatus::isDemodLocked>());
@@ -389,25 +413,31 @@ vector<FrontendStatus> FrontendClient::getHidlStatus(vector<TunerFrontendStatus>
}
case TunerFrontendStatus::modulation: {
auto aidlMod = s.get<TunerFrontendStatus::modulation>();
FrontendModulationStatus modulation;
switch (mType) {
case (int)FrontendType::DVBC:
status.modulation().dvbc(static_cast<FrontendDvbcModulation>(aidlMod));
modulation.dvbc(static_cast<FrontendDvbcModulation>(aidlMod));
status.modulation(modulation);
hidlStatus.push_back(status);
break;
case (int)FrontendType::DVBS:
status.modulation().dvbs(static_cast<FrontendDvbsModulation>(aidlMod));
modulation.dvbs(static_cast<FrontendDvbsModulation>(aidlMod));
status.modulation(modulation);
hidlStatus.push_back(status);
break;
case (int)FrontendType::ISDBS:
status.modulation().isdbs(static_cast<FrontendIsdbsModulation>(aidlMod));
modulation.isdbs(static_cast<FrontendIsdbsModulation>(aidlMod));
status.modulation(modulation);
hidlStatus.push_back(status);
break;
case (int)FrontendType::ISDBS3:
status.modulation().isdbs3(static_cast<FrontendIsdbs3Modulation>(aidlMod));
modulation.isdbs3(static_cast<FrontendIsdbs3Modulation>(aidlMod));
status.modulation(modulation);
hidlStatus.push_back(status);
break;
case (int)FrontendType::ISDBT:
status.modulation().isdbt(static_cast<FrontendIsdbtModulation>(aidlMod));
modulation.isdbt(static_cast<FrontendIsdbtModulation>(aidlMod));
status.modulation(modulation);
hidlStatus.push_back(status);
break;
default:
@@ -466,7 +496,7 @@ vector<FrontendStatus> FrontendClient::getHidlStatus(vector<TunerFrontendStatus>
}
case TunerFrontendStatus::hierarchy: {
status.hierarchy(static_cast<FrontendDvbtHierarchy>(
s.get<TunerFrontendStatus::freqOffset>()));
s.get<TunerFrontendStatus::hierarchy>()));
hidlStatus.push_back(status);
break;
}
@@ -477,15 +507,16 @@ vector<FrontendStatus> FrontendClient::getHidlStatus(vector<TunerFrontendStatus>
}
case TunerFrontendStatus::plpInfo: {
int size = s.get<TunerFrontendStatus::plpInfo>().size();
status.plpInfo().resize(size);
hidl_vec<FrontendStatusAtsc3PlpInfo> info(size);
for (int i = 0; i < size; i++) {
auto aidlInfo = s.get<TunerFrontendStatus::plpInfo>()[i];
status.plpInfo()[i] = {
info[i] = {
.plpId = (uint8_t)aidlInfo.plpId,
.isLocked = aidlInfo.isLocked,
.uec = (uint32_t)aidlInfo.uec,
};
}
status.plpInfo(info);
hidlStatus.push_back(status);
break;
}
@@ -503,52 +534,54 @@ vector<FrontendStatusExt1_1> FrontendClient::getHidlStatusExt(
FrontendStatusExt1_1 status;
switch (s.getTag()) {
case TunerFrontendStatus::modulations: {
vector<FrontendModulation> ms;
for (auto aidlMod : s.get<TunerFrontendStatus::modulations>()) {
int size = status.modulations().size();
status.modulations().resize(size + 1);
FrontendModulation m;
switch (mType) {
case (int)FrontendType::DVBC:
status.modulations()[size].dvbc(
static_cast<FrontendDvbcModulation>(aidlMod));
m.dvbc(static_cast<FrontendDvbcModulation>(aidlMod));
ms.push_back(m);
break;
case (int)FrontendType::DVBS:
status.modulations()[size].dvbs(
static_cast<FrontendDvbsModulation>(aidlMod));
m.dvbs(static_cast<FrontendDvbsModulation>(aidlMod));
ms.push_back(m);
break;
case (int)FrontendType::DVBT:
status.modulations()[size].dvbt(
static_cast<FrontendDvbtConstellation>(aidlMod));
m.dvbt(static_cast<FrontendDvbtConstellation>(aidlMod));
ms.push_back(m);
break;
case (int)FrontendType::ISDBS:
status.modulations()[size].isdbs(
static_cast<FrontendIsdbsModulation>(aidlMod));
m.isdbs(static_cast<FrontendIsdbsModulation>(aidlMod));
ms.push_back(m);
break;
case (int)FrontendType::ISDBS3:
status.modulations()[size].isdbs3(
static_cast<FrontendIsdbs3Modulation>(aidlMod));
m.isdbs3(static_cast<FrontendIsdbs3Modulation>(aidlMod));
ms.push_back(m);
break;
case (int)FrontendType::ISDBT:
status.modulations()[size].isdbt(
static_cast<FrontendIsdbtModulation>(aidlMod));
m.isdbt(static_cast<FrontendIsdbtModulation>(aidlMod));
ms.push_back(m);
break;
case (int)FrontendType::ATSC:
status.modulations()[size].atsc(
static_cast<FrontendAtscModulation>(aidlMod));
m.atsc(static_cast<FrontendAtscModulation>(aidlMod));
ms.push_back(m);
break;
case (int)FrontendType::ATSC3:
status.modulations()[size].atsc3(
static_cast<FrontendAtsc3Modulation>(aidlMod));
m.atsc3(static_cast<FrontendAtsc3Modulation>(aidlMod));
ms.push_back(m);
break;
case (int)FrontendType::DTMB:
status.modulations()[size].dtmb(
static_cast<FrontendDtmbModulation>(aidlMod));
m.dtmb(static_cast<FrontendDtmbModulation>(aidlMod));
ms.push_back(m);
break;
default:
status.modulations().resize(size);
break;
}
}
hidlStatus.push_back(status);
if (ms.size() > 0) {
status.modulations(ms);
hidlStatus.push_back(status);
}
break;
}
case TunerFrontendStatus::bers: {
@@ -571,25 +604,31 @@ vector<FrontendStatusExt1_1> FrontendClient::getHidlStatusExt(
}
case TunerFrontendStatus::bandwidth: {
auto aidlBand = s.get<TunerFrontendStatus::bandwidth>();
FrontendBandwidth band;
switch (mType) {
case (int)FrontendType::ATSC3:
status.bandwidth().atsc3(static_cast<FrontendAtsc3Bandwidth>(aidlBand));
band.atsc3(static_cast<FrontendAtsc3Bandwidth>(aidlBand));
status.bandwidth(band);
hidlStatus.push_back(status);
break;
case (int)FrontendType::DVBC:
status.bandwidth().dvbc(static_cast<FrontendDvbcBandwidth>(aidlBand));
band.dvbc(static_cast<FrontendDvbcBandwidth>(aidlBand));
status.bandwidth(band);
hidlStatus.push_back(status);
break;
case (int)FrontendType::DVBT:
status.bandwidth().dvbt(static_cast<FrontendDvbtBandwidth>(aidlBand));
band.dvbt(static_cast<FrontendDvbtBandwidth>(aidlBand));
status.bandwidth(band);
hidlStatus.push_back(status);
break;
case (int)FrontendType::ISDBT:
status.bandwidth().isdbt(static_cast<FrontendIsdbtBandwidth>(aidlBand));
band.isdbt(static_cast<FrontendIsdbtBandwidth>(aidlBand));
status.bandwidth(band);
hidlStatus.push_back(status);
break;
case (int)FrontendType::DTMB:
status.bandwidth().dtmb(static_cast<FrontendDtmbBandwidth>(aidlBand));
band.dtmb(static_cast<FrontendDtmbBandwidth>(aidlBand));
status.bandwidth(band);
hidlStatus.push_back(status);
break;
default:
@@ -599,17 +638,21 @@ vector<FrontendStatusExt1_1> FrontendClient::getHidlStatusExt(
}
case TunerFrontendStatus::interval: {
auto aidlInter = s.get<TunerFrontendStatus::interval>();
FrontendGuardInterval inter;
switch (mType) {
case (int)FrontendType::DVBT:
status.interval().dvbt(static_cast<FrontendDvbtGuardInterval>(aidlInter));
inter.dvbt(static_cast<FrontendDvbtGuardInterval>(aidlInter));
status.interval(inter);
hidlStatus.push_back(status);
break;
case (int)FrontendType::ISDBT:
status.interval().isdbt(static_cast<FrontendIsdbtGuardInterval>(aidlInter));
inter.isdbt(static_cast<FrontendIsdbtGuardInterval>(aidlInter));
status.interval(inter);
hidlStatus.push_back(status);
break;
case (int)FrontendType::DTMB:
status.interval().dtmb(static_cast<FrontendDtmbGuardInterval>(aidlInter));
inter.dtmb(static_cast<FrontendDtmbGuardInterval>(aidlInter));
status.interval(inter);
hidlStatus.push_back(status);
break;
default:
@@ -619,19 +662,21 @@ vector<FrontendStatusExt1_1> FrontendClient::getHidlStatusExt(
}
case TunerFrontendStatus::transmissionMode: {
auto aidlTran = s.get<TunerFrontendStatus::transmissionMode>();
FrontendTransmissionMode trans;
switch (mType) {
case (int)FrontendType::DVBT:
status.transmissionMode().dvbt(
static_cast<FrontendDvbtTransmissionMode>(aidlTran));
trans.dvbt(static_cast<FrontendDvbtTransmissionMode>(aidlTran));
status.transmissionMode(trans);
hidlStatus.push_back(status);
break;
case (int)FrontendType::ISDBT:
status.transmissionMode().isdbt(static_cast<FrontendIsdbtMode>(aidlTran));
trans.isdbt(static_cast<FrontendIsdbtMode>(aidlTran));
status.transmissionMode(trans);
hidlStatus.push_back(status);
break;
case (int)FrontendType::DTMB:
status.transmissionMode().dtmb(
static_cast<FrontendDtmbTransmissionMode>(aidlTran));
trans.dtmb(static_cast<FrontendDtmbTransmissionMode>(aidlTran));
status.transmissionMode(trans);
hidlStatus.push_back(status);
break;
default:
@@ -650,28 +695,30 @@ vector<FrontendStatusExt1_1> FrontendClient::getHidlStatusExt(
break;
}
case TunerFrontendStatus::interleaving: {
vector<FrontendInterleaveMode> modes;
for (auto aidlInter : s.get<TunerFrontendStatus::interleaving>()) {
int size = status.interleaving().size();
status.interleaving().resize(size + 1);
FrontendInterleaveMode mode;
switch (mType) {
case (int)FrontendType::DVBC:
status.interleaving()[size].dvbc(
static_cast<FrontendCableTimeInterleaveMode>(aidlInter));
mode.dvbc(static_cast<FrontendCableTimeInterleaveMode>(aidlInter));
modes.push_back(mode);
break;
case (int)FrontendType::ATSC3:
status.interleaving()[size].atsc3(
static_cast<FrontendAtsc3TimeInterleaveMode>(aidlInter));
mode.atsc3(static_cast<FrontendAtsc3TimeInterleaveMode>(aidlInter));
modes.push_back(mode);
break;
case (int)FrontendType::DTMB:
status.interleaving()[size].dtmb(
static_cast<FrontendDtmbTimeInterleaveMode>(aidlInter));
mode.dtmb(static_cast<FrontendDtmbTimeInterleaveMode>(aidlInter));
modes.push_back(mode);
break;
default:
status.interleaving().resize(size);
break;
}
}
hidlStatus.push_back(status);
if (modes.size() > 0) {
status.interleaving(modes);
hidlStatus.push_back(status);
}
break;
}
case TunerFrontendStatus::isdbtSegment: {
@@ -690,17 +737,21 @@ vector<FrontendStatusExt1_1> FrontendClient::getHidlStatusExt(
}
case TunerFrontendStatus::rollOff: {
auto aidlRoll = s.get<TunerFrontendStatus::rollOff>();
FrontendRollOff roll;
switch (mType) {
case (int)FrontendType::DVBS:
status.rollOff().dvbs(static_cast<FrontendDvbsRolloff>(aidlRoll));
roll.dvbs(static_cast<FrontendDvbsRolloff>(aidlRoll));
status.rollOff(roll);
hidlStatus.push_back(status);
break;
case (int)FrontendType::ISDBS:
status.rollOff().isdbs(static_cast<FrontendIsdbsRolloff>(aidlRoll));
roll.isdbs(static_cast<FrontendIsdbsRolloff>(aidlRoll));
status.rollOff(roll);
hidlStatus.push_back(status);
break;
case (int)FrontendType::ISDBS3:
status.rollOff().isdbs3(static_cast<FrontendIsdbs3Rolloff>(aidlRoll));
roll.isdbs3(static_cast<FrontendIsdbs3Rolloff>(aidlRoll));
status.rollOff(roll);
hidlStatus.push_back(status);
break;
default:

View File

@@ -108,7 +108,7 @@ private:
struct FrontendClient : public RefBase {
public:
FrontendClient(shared_ptr<ITunerFrontend> tunerFrontend, int id, int type);
FrontendClient(shared_ptr<ITunerFrontend> tunerFrontend, int type);
~FrontendClient();
/**
@@ -180,6 +180,7 @@ public:
shared_ptr<ITunerFrontend> getAidlFrontend();
void setId(int id);
int getId();
private:

View File

@@ -46,13 +46,12 @@ TunerClient::TunerClient() {
// Connect with Tuner Service.
::ndk::SpAIBinder binder(AServiceManager_getService("media.tuner"));
mTunerService = ITunerService::fromBinder(binder);
// TODO: Remove after JNI migration is done.
mTunerService = NULL;
if (mTunerService == NULL) {
ALOGE("Failed to get tuner service");
} else {
// TODO: b/178124017 update TRM in TunerService independently.
mTunerService->updateTunerResources();
mTunerService->getTunerHalVersion(&mTunerVersion);
}
}
@@ -115,7 +114,7 @@ sp<FrontendClient> TunerClient::openFrontend(int frontendHandle) {
if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) {
return NULL;
}
return new FrontendClient(tunerFrontend, frontendHandle, aidlFrontendInfo.type);
return new FrontendClient(tunerFrontend, aidlFrontendInfo.type);
}
if (mTuner != NULL) {
@@ -127,8 +126,10 @@ sp<FrontendClient> TunerClient::openFrontend(int frontendHandle) {
if (res != Result::SUCCESS) {
return NULL;
}
sp<FrontendClient> frontendClient = new FrontendClient(NULL, id, (int)hidlInfo.type);
sp<FrontendClient> frontendClient = new FrontendClient(
NULL, (int)hidlInfo.type);
frontendClient->setHidlFrontend(hidlFrontend);
frontendClient->setId(id);
return frontendClient;
}
}
@@ -358,7 +359,7 @@ void TunerClient::updateLnbResources() {
sp<ITuner> TunerClient::getHidlTuner() {
if (mTuner == NULL) {
mTunerVersion = 0;
mTunerVersion = TUNER_HAL_VERSION_UNKNOWN;
mTuner_1_1 = ::android::hardware::tv::tuner::V1_1::ITuner::getService();
if (mTuner_1_1 == NULL) {
@@ -367,11 +368,11 @@ sp<ITuner> TunerClient::getHidlTuner() {
if (mTuner == NULL) {
ALOGW("Failed to get tuner 1.0 service.");
} else {
mTunerVersion = 1 << 16;
mTunerVersion = TUNER_HAL_VERSION_1_0;
}
} else {
mTuner = static_cast<sp<ITuner>>(mTuner_1_1);
mTunerVersion = ((1 << 16) | 1);
mTunerVersion = TUNER_HAL_VERSION_1_1;
}
}
return mTuner;

View File

@@ -48,6 +48,10 @@ using namespace std;
namespace android {
const static int TUNER_HAL_VERSION_UNKNOWN = 0;
const static int TUNER_HAL_VERSION_1_0 = 1 << 16;
const static int TUNER_HAL_VERSION_1_1 = (1 << 16) | 1;
typedef enum {
FRONTEND,
LNB,