Connect Filter Event Callback between the TunerService and TunerClient

Test: make libmedia_tv_tuner
Bug: 174095851
Change-Id: I11b372050428c3e600cea9f3d5cc6fee2d82399c
This commit is contained in:
Amy Zhang
2021-02-01 11:02:26 -08:00
parent e0a71c1435
commit 6d81d76dec
2 changed files with 271 additions and 29 deletions

View File

@@ -23,15 +23,19 @@
#include "FilterClient.h"
using ::aidl::android::media::tv::tuner::TunerFilterAvSettings;
using ::aidl::android::media::tv::tuner::TunerFilterMonitorEvent;
using ::aidl::android::media::tv::tuner::TunerFilterScIndexMask;
using ::aidl::android::media::tv::tuner::TunerFilterSharedHandleInfo;
using ::aidl::android::media::tv::tuner::TunerFilterTsConfiguration;
using ::android::hardware::tv::tuner::V1_0::DemuxQueueNotifyBits;
using ::android::hardware::tv::tuner::V1_0::DemuxFilterMainType;
using ::android::hardware::tv::tuner::V1_0::DemuxMmtpFilterType;
using ::android::hardware::tv::tuner::V1_0::DemuxTpid;
using ::android::hardware::tv::tuner::V1_0::DemuxStreamId;
using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterSettings;
using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterType;
using ::android::hardware::tv::tuner::V1_1::ScramblingStatus;
namespace android {
@@ -294,6 +298,10 @@ Status TunerFilterCallback::onFilterEvent(const vector<TunerFilterEvent>& filter
return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
}
if (filterEvents.size() == 0) {
return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_ARGUMENT));
}
DemuxFilterEvent event;
DemuxFilterEventExt eventExt;
getHidlFilterEvent(filterEvents, event, eventExt);
@@ -348,37 +356,46 @@ TunerFilterConfiguration FilterClient::getAidlFilterSettings(DemuxFilterSettings
void TunerFilterCallback::getHidlFilterEvent(const vector<TunerFilterEvent>& filterEvents,
DemuxFilterEvent& event, DemuxFilterEventExt& /*eventExt*/) {
// TODO: finish handling extended evets and other filter event types
DemuxFilterEvent& event, DemuxFilterEventExt& eventExt) {
switch (filterEvents[0].getTag()) {
case TunerFilterEvent::media: {
for (int i = 0; i < filterEvents.size(); i++) {
hidl_handle handle = hidl_handle(
makeFromAidl(filterEvents[i].get<TunerFilterEvent::media>().avMemory));
int size = event.events.size();
event.events.resize(size + 1);
event.events[size].media({
.avMemory = handle,
.streamId = static_cast<DemuxStreamId>(
filterEvents[i].get<TunerFilterEvent::media>().streamId),
.isPtsPresent =
filterEvents[i].get<TunerFilterEvent::media>().isPtsPresent,
.pts = static_cast<uint64_t>(
filterEvents[i].get<TunerFilterEvent::media>().pts),
.dataLength = static_cast<uint32_t>(
filterEvents[i].get<TunerFilterEvent::media>().dataLength),
.offset = static_cast<uint32_t>(
filterEvents[i].get<TunerFilterEvent::media>().offset),
.isSecureMemory =
filterEvents[i].get<TunerFilterEvent::media>().isSecureMemory,
.avDataId = static_cast<uint64_t>(
filterEvents[i].get<TunerFilterEvent::media>().avDataId),
.mpuSequenceNumber = static_cast<uint32_t>(
filterEvents[i].get<TunerFilterEvent::media>().offset),
.isPesPrivateData =
filterEvents[i].get<TunerFilterEvent::media>().isPesPrivateData,
});
}
getHidlMediaEvent(filterEvents, event);
break;
}
case TunerFilterEvent::section: {
getHidlSectionEvent(filterEvents, event);
break;
}
case TunerFilterEvent::pes: {
getHidlPesEvent(filterEvents, event);
break;
}
case TunerFilterEvent::tsRecord: {
getHidlTsRecordEvent(filterEvents, event, eventExt);
break;
}
case TunerFilterEvent::mmtpRecord: {
getHidlMmtpRecordEvent(filterEvents, event, eventExt);
break;
}
case TunerFilterEvent::download: {
getHidlDownloadEvent(filterEvents, event);
break;
}
case TunerFilterEvent::ipPayload: {
getHidlIpPayloadEvent(filterEvents, event);
break;
}
case TunerFilterEvent::temi: {
getHidlTemiEvent(filterEvents, event);
break;
}
case TunerFilterEvent::monitor: {
getHidlMonitorEvent(filterEvents, eventExt);
break;
}
case TunerFilterEvent::startId: {
getHidlRestartEvent(filterEvents, eventExt);
break;
}
default:
@@ -386,6 +403,211 @@ void TunerFilterCallback::getHidlFilterEvent(const vector<TunerFilterEvent>& fil
}
}
void TunerFilterCallback::getHidlMediaEvent(
const vector<TunerFilterEvent>& filterEvents, DemuxFilterEvent& event) {
for (int i = 0; i < filterEvents.size(); i++) {
hidl_handle handle = hidl_handle(makeFromAidl(filterEvents[i]
.get<TunerFilterEvent::media>().avMemory));
event.events.resize(i + 1);
event.events[i].media({
.avMemory = handle,
.streamId = static_cast<DemuxStreamId>(filterEvents[i]
.get<TunerFilterEvent::media>().streamId),
.isPtsPresent = filterEvents[i]
.get<TunerFilterEvent::media>().isPtsPresent,
.pts = static_cast<uint64_t>(filterEvents[i]
.get<TunerFilterEvent::media>().pts),
.dataLength = static_cast<uint32_t>(filterEvents[i]
.get<TunerFilterEvent::media>().dataLength),
.offset = static_cast<uint32_t>(filterEvents[i]
.get<TunerFilterEvent::media>().offset),
.isSecureMemory = filterEvents[i]
.get<TunerFilterEvent::media>().isSecureMemory,
.avDataId = static_cast<uint64_t>(filterEvents[i]
.get<TunerFilterEvent::media>().avDataId),
.mpuSequenceNumber = static_cast<uint32_t>(filterEvents[i]
.get<TunerFilterEvent::media>().offset),
.isPesPrivateData = filterEvents[i]
.get<TunerFilterEvent::media>().isPesPrivateData,
});
if (filterEvents[i].get<TunerFilterEvent::media>().isAudioExtraMetaData) {
event.events[i].media().extraMetaData.audio({
.adFade = static_cast<uint8_t>(filterEvents[i]
.get<TunerFilterEvent::media>().audio.adFade),
.adPan = static_cast<uint8_t>(filterEvents[i]
.get<TunerFilterEvent::media>().audio.adPan),
.versionTextTag = static_cast<uint8_t>(filterEvents[i]
.get<TunerFilterEvent::media>().audio.versionTextTag),
.adGainCenter = static_cast<uint8_t>(filterEvents[i]
.get<TunerFilterEvent::media>().audio.adGainCenter),
.adGainFront = static_cast<uint8_t>(filterEvents[i]
.get<TunerFilterEvent::media>().audio.adGainFront),
.adGainSurround = static_cast<uint8_t>(filterEvents[i]
.get<TunerFilterEvent::media>().audio.adGainSurround),
});
} else {
event.events[i].media().extraMetaData.noinit();
}
}
}
void TunerFilterCallback::getHidlSectionEvent(
const vector<TunerFilterEvent>& filterEvents, DemuxFilterEvent& event) {
for (int i = 0; i < filterEvents.size(); i++) {
auto section = filterEvents[i].get<TunerFilterEvent::section>();
event.events.resize(i + 1);
event.events[i].section({
.tableId = static_cast<uint16_t>(section.tableId),
.version = static_cast<uint16_t>(section.version),
.sectionNum = static_cast<uint16_t>(section.sectionNum),
.dataLength = static_cast<uint16_t>(section.dataLength),
});
}
}
void TunerFilterCallback::getHidlPesEvent(
const vector<TunerFilterEvent>& filterEvents, DemuxFilterEvent& event) {
for (int i = 0; i < filterEvents.size(); i++) {
auto pes = filterEvents[i].get<TunerFilterEvent::pes>();
event.events.resize(i + 1);
event.events[i].pes({
.streamId = static_cast<DemuxStreamId>(pes.streamId),
.dataLength = static_cast<uint16_t>(pes.dataLength),
.mpuSequenceNumber = static_cast<uint32_t>(pes.mpuSequenceNumber),
});
}
}
void TunerFilterCallback::getHidlTsRecordEvent(const vector<TunerFilterEvent>& filterEvents,
DemuxFilterEvent& event, DemuxFilterEventExt& eventExt) {
for (int i = 0; i < filterEvents.size(); i++) {
auto ts = filterEvents[i].get<TunerFilterEvent::tsRecord>();
event.events.resize(i + 1);
event.events[i].tsRecord({
.tsIndexMask = static_cast<uint32_t>(ts.tsIndexMask),
.byteNumber = static_cast<uint64_t>(ts.byteNumber),
});
event.events[i].tsRecord().pid.tPid(static_cast<DemuxTpid>(ts.pid));
switch (ts.scIndexMask.getTag()) {
case TunerFilterScIndexMask::sc: {
event.events[i].tsRecord().scIndexMask.sc(
ts.scIndexMask.get<TunerFilterScIndexMask::sc>());
break;
}
case TunerFilterScIndexMask::scHevc: {
event.events[i].tsRecord().scIndexMask.scHevc(
ts.scIndexMask.get<TunerFilterScIndexMask::scHevc>());
break;
}
default:
break;
}
eventExt.events.resize(i + 1);
if (ts.isExtended) {
eventExt.events[i].tsRecord({
.pts = static_cast<uint64_t>(ts.pts),
.firstMbInSlice = static_cast<uint32_t>(ts.firstMbInSlice),
});
} else {
eventExt.events[i].noinit();
}
}
}
void TunerFilterCallback::getHidlMmtpRecordEvent(const vector<TunerFilterEvent>& filterEvents,
DemuxFilterEvent& event, DemuxFilterEventExt& eventExt) {
for (int i = 0; i < filterEvents.size(); i++) {
auto mmtp = filterEvents[i].get<TunerFilterEvent::mmtpRecord>();
event.events.resize(i + 1);
event.events[i].mmtpRecord({
.scHevcIndexMask = static_cast<uint32_t>(mmtp.scHevcIndexMask),
.byteNumber = static_cast<uint64_t>(mmtp.byteNumber),
});
eventExt.events.resize(i + 1);
if (mmtp.isExtended) {
eventExt.events[i].mmtpRecord({
.pts = static_cast<uint64_t>(mmtp.pts),
.mpuSequenceNumber = static_cast<uint32_t>(mmtp.mpuSequenceNumber),
.firstMbInSlice = static_cast<uint32_t>(mmtp.firstMbInSlice),
.tsIndexMask = static_cast<uint32_t>(mmtp.tsIndexMask),
});
} else {
eventExt.events[i].noinit();
}
}
}
void TunerFilterCallback::getHidlDownloadEvent(const vector<TunerFilterEvent>& filterEvents,
DemuxFilterEvent& event) {
for (int i = 0; i < filterEvents.size(); i++) {
auto download = filterEvents[i].get<TunerFilterEvent::download>();
event.events.resize(i + 1);
event.events[i].download({
.itemId = static_cast<uint32_t>(download.itemId),
.mpuSequenceNumber = static_cast<uint32_t>(download.mpuSequenceNumber),
.itemFragmentIndex = static_cast<uint32_t>(download.itemFragmentIndex),
.lastItemFragmentIndex = static_cast<uint32_t>(download.lastItemFragmentIndex),
.dataLength = static_cast<uint16_t>(download.dataLength),
});
}
}
void TunerFilterCallback::getHidlIpPayloadEvent(const vector<TunerFilterEvent>& filterEvents,
DemuxFilterEvent& event) {
for (int i = 0; i < filterEvents.size(); i++) {
auto ip = filterEvents[i].get<TunerFilterEvent::ipPayload>();
event.events.resize(i + 1);
event.events[i].ipPayload({
.dataLength = static_cast<uint16_t>(ip.dataLength),
});
}
}
void TunerFilterCallback::getHidlTemiEvent(const vector<TunerFilterEvent>& filterEvents,
DemuxFilterEvent& event) {
for (int i = 0; i < filterEvents.size(); i++) {
auto temi = filterEvents[i].get<TunerFilterEvent::temi>();
event.events.resize(i + 1);
event.events[i].temi({
.pts = static_cast<uint64_t>(temi.pts),
.descrTag = static_cast<uint8_t>(temi.descrTag),
});
vector<uint8_t> descrData(temi.descrData.size());
copy(temi.descrData.begin(), temi.descrData.end(), descrData.begin());
}
}
void TunerFilterCallback::getHidlMonitorEvent(const vector<TunerFilterEvent>& filterEvents,
DemuxFilterEventExt& eventExt) {
auto monitor = filterEvents[0].get<TunerFilterEvent::monitor>();
eventExt.events.resize(1);
switch (monitor.getTag()) {
case TunerFilterMonitorEvent::scramblingStatus: {
eventExt.events[0].monitorEvent().scramblingStatus(
static_cast<ScramblingStatus>(monitor.scramblingStatus));
break;
}
case TunerFilterMonitorEvent::cid: {
eventExt.events[0].monitorEvent().cid(static_cast<uint32_t>(monitor.cid));
break;
}
default:
eventExt.events[0].noinit();
break;
}
}
void TunerFilterCallback::getHidlRestartEvent(const vector<TunerFilterEvent>& filterEvents,
DemuxFilterEventExt& eventExt) {
uint32_t startId = filterEvents[0].get<TunerFilterEvent::startId>();
eventExt.events.resize(1);
eventExt.events[0].startId(static_cast<uint32_t>(startId));
}
Result FilterClient::getFilterMq() {
if (mFilter == NULL) {
return Result::INVALID_STATE;

View File

@@ -71,6 +71,26 @@ public:
private:
void getHidlFilterEvent(const vector<TunerFilterEvent>& filterEvents,
DemuxFilterEvent& event, DemuxFilterEventExt& eventExt);
void getHidlMediaEvent(
const vector<TunerFilterEvent>& filterEvents, DemuxFilterEvent& event);
void getHidlSectionEvent(
const vector<TunerFilterEvent>& filterEvents, DemuxFilterEvent& event);
void getHidlPesEvent(
const vector<TunerFilterEvent>& filterEvents, DemuxFilterEvent& event);
void getHidlTsRecordEvent(const vector<TunerFilterEvent>& filterEvents,
DemuxFilterEvent& event, DemuxFilterEventExt& eventExt);
void getHidlMmtpRecordEvent(const vector<TunerFilterEvent>& filterEvents,
DemuxFilterEvent& event, DemuxFilterEventExt& eventExt);
void getHidlDownloadEvent(
const vector<TunerFilterEvent>& filterEvents, DemuxFilterEvent& event);
void getHidlIpPayloadEvent(
const vector<TunerFilterEvent>& filterEvents, DemuxFilterEvent& event);
void getHidlTemiEvent(
const vector<TunerFilterEvent>& filterEvents, DemuxFilterEvent& event);
void getHidlMonitorEvent(
const vector<TunerFilterEvent>& filterEvents, DemuxFilterEventExt& eventExt);
void getHidlRestartEvent(
const vector<TunerFilterEvent>& filterEvents, DemuxFilterEventExt& eventExt);
sp<FilterClientCallback> mFilterClientCallback;
};