Add lnb/timeFilter dynamic configuration into Tuner 1.0 VTS

Test: atest VtsHalTvTunerV1_0TargetTest
Bug: 182519645
CTS-Coverage-Bug: 184077478
Change-Id: I75d7fb53054120c6ef5ce36a0bea1e4e334183c7
Merged-In: I75d7fb53054120c6ef5ce36a0bea1e4e334183c7
This commit is contained in:
Amy Zhang 2021-04-01 19:25:21 -07:00
parent 1d603678ae
commit 78e3dadf53
9 changed files with 471 additions and 123 deletions

View file

@ -48,10 +48,11 @@ AssertionResult LnbTests::openLnbById(uint32_t lnbId) {
return AssertionResult(status == Result::SUCCESS);
}
AssertionResult LnbTests::openLnbByName(string lnbName) {
AssertionResult LnbTests::openLnbByName(string lnbName, uint32_t& id) {
Result status;
mService->openLnbByName(lnbName, [&](Result result, uint32_t /*lnbId*/, const sp<ILnb>& lnb) {
mService->openLnbByName(lnbName, [&](Result result, uint32_t lnbId, const sp<ILnb>& lnb) {
mLnb = lnb;
id = lnbId;
status = result;
});

View file

@ -64,7 +64,7 @@ class LnbTests {
AssertionResult getLnbIds(vector<uint32_t>& ids);
AssertionResult openLnbById(uint32_t lnbId);
AssertionResult openLnbByName(string lnbName);
AssertionResult openLnbByName(string lnbName, uint32_t& lnbId);
AssertionResult setLnbCallback();
AssertionResult setVoltage(LnbVoltage voltage);
AssertionResult setTone(LnbTone tone);

View file

@ -56,7 +56,7 @@ void TunerFilterHidlTest::configSingleFilterInDemuxTest(FilterConfig filterConf,
}
void TunerFilterHidlTest::testTimeFilter(TimeFilterConfig filterConf) {
if (!filterConf.supportTimeFilter) {
if (!timeFilter.support) {
return;
}
uint32_t demuxId;
@ -64,11 +64,8 @@ void TunerFilterHidlTest::testTimeFilter(TimeFilterConfig filterConf) {
DemuxCapabilities caps;
ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
// TODO: add time filter hardware support checker
ASSERT_TRUE(mDemuxTests.getDemuxCaps(caps));
if (!caps.bTimeFilter) {
return;
}
ASSERT_TRUE(caps.bTimeFilter);
mFilterTests.setDemux(demux);
ASSERT_TRUE(mFilterTests.openTimeFilterInDemux());
ASSERT_TRUE(mFilterTests.setTimeStamp(filterConf.timeStamp));
@ -116,14 +113,16 @@ void TunerBroadcastHidlTest::broadcastSingleFilterTest(FilterConfig filterConf,
void TunerBroadcastHidlTest::broadcastSingleFilterTestWithLnb(FilterConfig filterConf,
FrontendConfig frontendConf,
LnbConfig lnbConf) {
vector<uint32_t> ids;
ASSERT_TRUE(mLnbTests.getLnbIds(ids));
if (ids.size() == 0) {
return;
if (lnbConf.name.compare(emptyHardwareId) == 0) {
vector<uint32_t> ids;
ASSERT_TRUE(mLnbTests.getLnbIds(ids));
ASSERT_TRUE(ids.size() > 0);
ASSERT_TRUE(mLnbTests.openLnbById(ids[0]));
mLnbId = &ids[0];
} else {
mLnbId = (uint32_t*)malloc(sizeof(uint32_t));
ASSERT_TRUE(mLnbTests.openLnbByName(lnbConf.name, *mLnbId));
}
ASSERT_TRUE(ids.size() > 0);
ASSERT_TRUE(mLnbTests.openLnbById(ids[0]));
mLnbId = &ids[0];
ASSERT_TRUE(mLnbTests.setLnbCallback());
ASSERT_TRUE(mLnbTests.setVoltage(lnbConf.voltage));
ASSERT_TRUE(mLnbTests.setTone(lnbConf.tone));
@ -212,18 +211,23 @@ void TunerRecordHidlTest::recordSingleFilterTest(FilterConfig filterConf,
void TunerRecordHidlTest::recordSingleFilterTestWithLnb(FilterConfig filterConf,
FrontendConfig frontendConf,
DvrConfig dvrConf, LnbConfig lnbConf) {
vector<uint32_t> ids;
ASSERT_TRUE(mLnbTests.getLnbIds(ids));
if (ids.size() == 0) {
return;
if (lnbConf.name.compare(emptyHardwareId) == 0) {
vector<uint32_t> ids;
ASSERT_TRUE(mLnbTests.getLnbIds(ids));
ASSERT_TRUE(ids.size() > 0);
ASSERT_TRUE(mLnbTests.openLnbById(ids[0]));
mLnbId = &ids[0];
} else {
mLnbId = (uint32_t*)malloc(sizeof(uint32_t));
ASSERT_TRUE(mLnbTests.openLnbByName(lnbConf.name, *mLnbId));
}
ASSERT_TRUE(ids.size() > 0);
ASSERT_TRUE(mLnbTests.openLnbById(ids[0]));
mLnbId = &ids[0];
ASSERT_TRUE(mLnbTests.setLnbCallback());
ASSERT_TRUE(mLnbTests.setVoltage(lnbConf.voltage));
ASSERT_TRUE(mLnbTests.setTone(lnbConf.tone));
ASSERT_TRUE(mLnbTests.setSatellitePosition(lnbConf.position));
for (auto msgName : lnbRecord.diseqcMsgs) {
ASSERT_TRUE(mLnbTests.sendDiseqcMessage(diseqcMsgMap[msgName]));
}
recordSingleFilterTest(filterConf, frontendConf, dvrConf);
ASSERT_TRUE(mLnbTests.closeLnb());
mLnbId = nullptr;
@ -343,37 +347,24 @@ TEST_P(TunerFrontendHidlTest, BlindScanFrontend) {
mFrontendTests.scanTest(frontendMap[scan.frontendId], FrontendScanType::SCAN_BLIND);
}
TEST_P(TunerLnbHidlTest, OpenLnbByName) {
description("Open and configure an Lnb with name then send a diseqc msg to it.");
// TODO: add lnb hardware support checker
vector<uint32_t> ids;
ASSERT_TRUE(mLnbTests.getLnbIds(ids));
if (ids.size() == 0) {
return;
}
ASSERT_TRUE(mLnbTests.openLnbByName(lnbArray[LNB_EXTERNAL].name));
ASSERT_TRUE(mLnbTests.setLnbCallback());
ASSERT_TRUE(mLnbTests.setVoltage(lnbArray[LNB_EXTERNAL].voltage));
ASSERT_TRUE(mLnbTests.setTone(lnbArray[LNB_EXTERNAL].tone));
ASSERT_TRUE(mLnbTests.setSatellitePosition(lnbArray[LNB_EXTERNAL].position));
ASSERT_TRUE(mLnbTests.sendDiseqcMessage(diseqcMsgArray[DISEQC_POWER_ON]));
ASSERT_TRUE(mLnbTests.closeLnb());
}
TEST_P(TunerLnbHidlTest, SendDiseqcMessageToLnb) {
description("Open and configure an Lnb with specific settings then send a diseqc msg to it.");
vector<uint32_t> ids;
ASSERT_TRUE(mLnbTests.getLnbIds(ids));
if (ids.size() == 0) {
return;
if (lnbMap[lnbLive.lnbId].name.compare(emptyHardwareId) == 0) {
vector<uint32_t> ids;
ASSERT_TRUE(mLnbTests.getLnbIds(ids));
ASSERT_TRUE(ids.size() > 0);
ASSERT_TRUE(mLnbTests.openLnbById(ids[0]));
} else {
uint32_t id;
ASSERT_TRUE(mLnbTests.openLnbByName(lnbMap[lnbLive.lnbId].name, id));
}
ASSERT_TRUE(ids.size() > 0);
ASSERT_TRUE(mLnbTests.openLnbById(ids[0]));
ASSERT_TRUE(mLnbTests.setLnbCallback());
ASSERT_TRUE(mLnbTests.setVoltage(lnbArray[LNB0].voltage));
ASSERT_TRUE(mLnbTests.setTone(lnbArray[LNB0].tone));
ASSERT_TRUE(mLnbTests.setSatellitePosition(lnbArray[LNB0].position));
ASSERT_TRUE(mLnbTests.sendDiseqcMessage(diseqcMsgArray[DISEQC_POWER_ON]));
ASSERT_TRUE(mLnbTests.setVoltage(lnbMap[lnbLive.lnbId].voltage));
ASSERT_TRUE(mLnbTests.setTone(lnbMap[lnbLive.lnbId].tone));
ASSERT_TRUE(mLnbTests.setSatellitePosition(lnbMap[lnbLive.lnbId].position));
for (auto msgName : lnbLive.diseqcMsgs) {
ASSERT_TRUE(mLnbTests.sendDiseqcMessage(diseqcMsgMap[msgName]));
}
ASSERT_TRUE(mLnbTests.closeLnb());
}
@ -469,7 +460,7 @@ TEST_P(TunerFilterHidlTest, SetFilterLinkage) {
TEST_P(TunerFilterHidlTest, testTimeFilter) {
description("Open a timer filter in Demux and set time stamp.");
// TODO use paramterized tests
testTimeFilter(timeFilterArray[TIMER0]);
testTimeFilter(timeFilterMap[timeFilter.timeFilterId]);
}
TEST_P(TunerBroadcastHidlTest, BroadcastDataFlowVideoFilterTest) {
@ -501,7 +492,7 @@ TEST_P(TunerBroadcastHidlTest, LnbBroadcastDataFlowVideoFilterTest) {
return;
}
broadcastSingleFilterTestWithLnb(filterMap[lnbLive.videoFilterId],
frontendMap[lnbLive.frontendId], lnbArray[LNB0]);
frontendMap[lnbLive.frontendId], lnbMap[lnbLive.lnbId]);
}
TEST_P(TunerPlaybackHidlTest, PlaybackDataFlowWithTsSectionFilterTest) {
@ -538,7 +529,7 @@ TEST_P(TunerRecordHidlTest, LnbRecordDataFlowWithTsRecordFilterTest) {
}
recordSingleFilterTestWithLnb(filterMap[lnbRecord.recordFilterId],
frontendMap[lnbRecord.frontendId], dvrMap[lnbRecord.dvrRecordId],
lnbArray[LNB0]);
lnbMap[lnbRecord.lnbId]);
}
TEST_P(TunerDescramblerHidlTest, CreateDescrambler) {

View file

@ -35,14 +35,14 @@ bool initConfiguration() {
initFrontendConfig();
initFilterConfig();
initDvrConfig();
initLnbConfig();
initTimeFilterConfig();
connectHardwaresToTestCases();
if (!validateConnections()) {
ALOGW("[vts] failed to validate connections.");
return false;
}
initLnbConfig();
initTimeFilterConfig();
initDescramblerConfig();
return true;

View file

@ -79,46 +79,17 @@ const uint32_t FMQ_SIZE_16M = 0x1000000;
" \"track_types\": [ ] " \
"} "
typedef enum {
TIMER0,
TIMER_MAX,
} TimeFilter;
typedef enum {
SOURCE,
SINK,
LINKAGE_DIR,
} Linkage;
typedef enum {
LNB0,
LNB_EXTERNAL,
LNB_MAX,
} Lnb;
typedef enum {
DISEQC_POWER_ON,
DISEQC_MAX,
} Diseqc;
typedef enum {
DESC_0,
DESC_MAX,
} Descrambler;
struct TimeFilterConfig {
bool supportTimeFilter;
uint64_t timeStamp;
};
struct LnbConfig {
bool usingLnb;
string name;
LnbVoltage voltage;
LnbTone tone;
LnbPosition position;
};
struct DescramblerConfig {
uint32_t casSystemId;
string provisionStr;
@ -126,9 +97,6 @@ struct DescramblerConfig {
};
// TODO: remove all the manual config array after the dynamic config refactoring is done.
static LnbConfig lnbArray[LNB_MAX];
static vector<uint8_t> diseqcMsgArray[DISEQC_MAX];
static TimeFilterConfig timeFilterArray[TIMER_MAX];
static DemuxFilterType filterLinkageTypes[LINKAGE_DIR][FILTER_MAIN_TYPE_BIT_COUNT];
static DescramblerConfig descramblerArray[DESC_MAX];
@ -136,6 +104,9 @@ static DescramblerConfig descramblerArray[DESC_MAX];
static map<string, FrontendConfig> frontendMap;
static map<string, FilterConfig> filterMap;
static map<string, DvrConfig> dvrMap;
static map<string, LnbConfig> lnbMap;
static map<string, TimeFilterConfig> timeFilterMap;
static map<string, vector<uint8_t>> diseqcMsgMap;
// Hardware and test cases connections
static LiveBroadcastHardwareConnections live;
@ -145,6 +116,7 @@ static DvrRecordHardwareConnections record;
static DescramblingHardwareConnections descrambling;
static LnbLiveHardwareConnections lnbLive;
static LnbRecordHardwareConnections lnbRecord;
static TimeFilterHardwareConnections timeFilter;
/** Config all the frontends that would be used in the tests */
inline void initFrontendConfig() {
@ -202,6 +174,19 @@ inline void initDvrConfig() {
TunerTestingConfigReader::readDvrConfig1_0(dvrMap);
};
/** Config all the lnbs that would be used in the tests */
inline void initLnbConfig() {
// Read customized config
TunerTestingConfigReader::readLnbConfig1_0(lnbMap);
TunerTestingConfigReader::readDiseqcMessages(diseqcMsgMap);
};
/** Config all the time filters that would be used in the tests */
inline void initTimeFilterConfig() {
// Read customized config
TunerTestingConfigReader::readTimeFilterConfig1_0(timeFilterMap);
};
/** Read the vendor configurations of which hardware to use for each test cases/data flows */
inline void connectHardwaresToTestCases() {
TunerTestingConfigReader::connectLiveBroadcast(live);
@ -211,6 +196,7 @@ inline void connectHardwaresToTestCases() {
TunerTestingConfigReader::connectDescrambling(descrambling);
TunerTestingConfigReader::connectLnbLive(lnbLive);
TunerTestingConfigReader::connectLnbRecord(lnbRecord);
TunerTestingConfigReader::connectTimeFilter(timeFilter);
};
inline bool validateConnections() {
@ -233,14 +219,12 @@ inline bool validateConnections() {
? dvrMap.find(live.dvrSoftwareFeId) != dvrMap.end()
: true;
dvrIsValid &= playback.support ? dvrMap.find(playback.dvrId) != dvrMap.end() : true;
if (record.support) {
if (frontendMap[record.frontendId].isSoftwareFe) {
dvrIsValid &= dvrMap.find(record.dvrSoftwareFeId) != dvrMap.end();
}
dvrIsValid &= dvrMap.find(record.dvrRecordId) != dvrMap.end();
}
if (descrambling.support && frontendMap[descrambling.frontendId].isSoftwareFe) {
dvrIsValid &= dvrMap.find(descrambling.dvrSoftwareFeId) != dvrMap.end();
}
@ -252,24 +236,19 @@ inline bool validateConnections() {
bool filterIsValid = filterMap.find(live.audioFilterId) != filterMap.end() &&
filterMap.find(live.videoFilterId) != filterMap.end();
filterIsValid &= playback.support
? (filterMap.find(playback.audioFilterId) != filterMap.end() &&
filterMap.find(playback.videoFilterId) != filterMap.end())
: true;
filterIsValid &=
record.support ? filterMap.find(record.recordFilterId) != filterMap.end() : true;
filterIsValid &= descrambling.support
? (filterMap.find(descrambling.audioFilterId) != filterMap.end() &&
filterMap.find(descrambling.videoFilterId) != filterMap.end())
: true;
filterIsValid &= lnbLive.support ? (filterMap.find(lnbLive.audioFilterId) != filterMap.end() &&
filterMap.find(lnbLive.videoFilterId) != filterMap.end())
: true;
filterIsValid &=
lnbRecord.support ? filterMap.find(lnbRecord.recordFilterId) != filterMap.end() : true;
@ -278,34 +257,35 @@ inline bool validateConnections() {
return false;
}
bool lnbIsValid = lnbLive.support ? lnbMap.find(lnbLive.lnbId) != lnbMap.end() : true;
lnbIsValid &= lnbRecord.support ? lnbMap.find(lnbRecord.lnbId) != lnbMap.end() : true;
if (!lnbIsValid) {
ALOGW("[vts config] dynamic config lnb connection is invalid.");
return false;
}
bool diseqcMsgIsValid = true;
if (lnbLive.support) {
for (auto msgName : lnbLive.diseqcMsgs) {
diseqcMsgIsValid &= diseqcMsgMap.find(msgName) != diseqcMsgMap.end();
}
}
if (lnbRecord.support) {
for (auto msgName : lnbRecord.diseqcMsgs) {
diseqcMsgIsValid &= diseqcMsgMap.find(msgName) != diseqcMsgMap.end();
}
}
if (!diseqcMsgIsValid) {
ALOGW("[vts config] dynamic config diseqcMsg sender is invalid.");
return false;
}
return true;
}
// TODO: remove all the manual configs after the dynamic config refactoring is done.
/** Configuration array for the Lnb test */
inline void initLnbConfig() {
lnbArray[LNB0].usingLnb = true;
lnbArray[LNB0].voltage = LnbVoltage::VOLTAGE_12V;
lnbArray[LNB0].tone = LnbTone::NONE;
lnbArray[LNB0].position = LnbPosition::UNDEFINED;
lnbArray[LNB_EXTERNAL].usingLnb = true;
lnbArray[LNB_EXTERNAL].name = "default_lnb_external";
lnbArray[LNB_EXTERNAL].voltage = LnbVoltage::VOLTAGE_5V;
lnbArray[LNB_EXTERNAL].tone = LnbTone::NONE;
lnbArray[LNB_EXTERNAL].position = LnbPosition::UNDEFINED;
};
/** Diseqc messages array for the Lnb test */
inline void initDiseqcMsg() {
diseqcMsgArray[DISEQC_POWER_ON] = {0xE, 0x0, 0x0, 0x0, 0x0, 0x3};
};
/** Configuration array for the timer filter test */
inline void initTimeFilterConfig() {
timeFilterArray[TIMER0].supportTimeFilter = true;
timeFilterArray[TIMER0].timeStamp = 1;
}
/** Configuration array for the descrambler test */
inline void initDescramblerConfig() {
descramblerArray[DESC_0].casSystemId = CLEAR_KEY_SYSTEM_ID;

View file

@ -90,6 +90,17 @@ struct DvrConfig {
string playbackInputFile;
};
struct LnbConfig {
string name;
LnbVoltage voltage;
LnbTone tone;
LnbPosition position;
};
struct TimeFilterConfig {
uint64_t timeStamp;
};
struct LiveBroadcastHardwareConnections {
string frontendId;
string dvrSoftwareFeId;
@ -137,8 +148,9 @@ struct LnbLiveHardwareConnections {
string frontendId;
string audioFilterId;
string videoFilterId;
/* list string of extra filters;
string lnbId; */
string lnbId;
vector<string> diseqcMsgs;
/* list string of extra filters; */
};
struct LnbRecordHardwareConnections {
@ -146,8 +158,14 @@ struct LnbRecordHardwareConnections {
string frontendId;
string dvrRecordId;
string recordFilterId;
/* list string of extra filters;
string lnbId; */
string lnbId;
vector<string> diseqcMsgs;
/* list string of extra filters; */
};
struct TimeFilterHardwareConnections {
bool support;
string timeFilterId;
};
struct TunerTestingConfigReader {
@ -290,6 +308,49 @@ struct TunerTestingConfigReader {
}
}
static void readLnbConfig1_0(map<string, LnbConfig>& lnbMap) {
auto hardwareConfig = getHardwareConfig();
if (hardwareConfig.hasLnbs()) {
auto lnbs = *hardwareConfig.getFirstLnbs();
for (auto lnbConfig : lnbs.getLnb()) {
string id = lnbConfig.getId();
if (lnbConfig.hasName()) {
lnbMap[id].name = lnbConfig.getName();
} else {
lnbMap[id].name = emptyHardwareId;
}
lnbMap[id].voltage = static_cast<LnbVoltage>(lnbConfig.getVoltage());
lnbMap[id].tone = static_cast<LnbTone>(lnbConfig.getTone());
lnbMap[id].position = static_cast<LnbPosition>(lnbConfig.getPosition());
}
}
}
static void readDiseqcMessages(map<string, vector<uint8_t>>& diseqcMsgMap) {
auto hardwareConfig = getHardwareConfig();
if (hardwareConfig.hasDiseqcMessages()) {
auto msgs = *hardwareConfig.getFirstDiseqcMessages();
for (auto msgConfig : msgs.getDiseqcMessage()) {
string name = msgConfig.getMsgName();
for (uint8_t atom : msgConfig.getMsgBody()) {
diseqcMsgMap[name].push_back(atom);
}
}
}
}
static void readTimeFilterConfig1_0(map<string, TimeFilterConfig>& timeFilterMap) {
auto hardwareConfig = getHardwareConfig();
if (hardwareConfig.hasTimeFilters()) {
auto timeFilters = *hardwareConfig.getFirstTimeFilters();
for (auto timeFilterConfig : timeFilters.getTimeFilter()) {
string id = timeFilterConfig.getId();
timeFilterMap[id].timeStamp =
static_cast<uint64_t>(timeFilterConfig.getTimeStamp());
}
}
}
static void connectLiveBroadcast(LiveBroadcastHardwareConnections& live) {
auto liveConfig = *getDataFlowConfiguration().getFirstClearLiveBroadcast();
live.frontendId = liveConfig.getFrontendConnection();
@ -377,6 +438,12 @@ struct TunerTestingConfigReader {
lnbLive.frontendId = lnbLiveConfig.getFrontendConnection();
lnbLive.audioFilterId = lnbLiveConfig.getAudioFilterConnection();
lnbLive.videoFilterId = lnbLiveConfig.getVideoFilterConnection();
lnbLive.lnbId = lnbLiveConfig.getLnbConnection();
if (lnbLiveConfig.hasDiseqcMsgSender()) {
for (auto msgName : lnbLiveConfig.getDiseqcMsgSender()) {
lnbLive.diseqcMsgs.push_back(msgName);
}
}
}
static void connectLnbRecord(LnbRecordHardwareConnections& lnbRecord) {
@ -390,6 +457,23 @@ struct TunerTestingConfigReader {
lnbRecord.frontendId = lnbRecordConfig.getFrontendConnection();
lnbRecord.recordFilterId = lnbRecordConfig.getRecordFilterConnection();
lnbRecord.dvrRecordId = lnbRecordConfig.getDvrRecordConnection();
lnbRecord.lnbId = lnbRecordConfig.getLnbConnection();
if (lnbRecordConfig.hasDiseqcMsgSender()) {
for (auto msgName : lnbRecordConfig.getDiseqcMsgSender()) {
lnbRecord.diseqcMsgs.push_back(msgName);
}
}
}
static void connectTimeFilter(TimeFilterHardwareConnections& timeFilter) {
auto dataFlow = getDataFlowConfiguration();
if (dataFlow.hasTimeFilter()) {
timeFilter.support = true;
} else {
return;
}
auto timeFilterConfig = *dataFlow.getFirstTimeFilter();
timeFilter.timeFilterId = timeFilterConfig.getTimeFilterConnection();
}
private:

View file

@ -16,6 +16,7 @@ package android.media.tuner.testing.configuration.V1_0 {
method @Nullable public android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.LnbLive getLnbLive();
method @Nullable public android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.LnbRecord getLnbRecord();
method @Nullable public android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.Scan getScan();
method @Nullable public android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.TimeFilter getTimeFilter();
method public void setClearLiveBroadcast(@Nullable android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.ClearLiveBroadcast);
method public void setDescrambling(@Nullable android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.Descrambling);
method public void setDvrPlayback(@Nullable android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.DvrPlayback);
@ -23,6 +24,7 @@ package android.media.tuner.testing.configuration.V1_0 {
method public void setLnbLive(@Nullable android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.LnbLive);
method public void setLnbRecord(@Nullable android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.LnbRecord);
method public void setScan(@Nullable android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.Scan);
method public void setTimeFilter(@Nullable android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.TimeFilter);
}
public static class DataFlowConfiguration.ClearLiveBroadcast {
@ -80,20 +82,28 @@ package android.media.tuner.testing.configuration.V1_0 {
public static class DataFlowConfiguration.LnbLive {
ctor public DataFlowConfiguration.LnbLive();
method @Nullable public String getAudioFilterConnection();
method @Nullable public java.util.List<java.lang.String> getDiseqcMsgSender();
method @Nullable public String getFrontendConnection();
method @Nullable public String getLnbConnection();
method @Nullable public String getVideoFilterConnection();
method public void setAudioFilterConnection(@Nullable String);
method public void setDiseqcMsgSender(@Nullable java.util.List<java.lang.String>);
method public void setFrontendConnection(@Nullable String);
method public void setLnbConnection(@Nullable String);
method public void setVideoFilterConnection(@Nullable String);
}
public static class DataFlowConfiguration.LnbRecord {
ctor public DataFlowConfiguration.LnbRecord();
method @Nullable public java.util.List<java.lang.String> getDiseqcMsgSender();
method @Nullable public String getDvrRecordConnection();
method @Nullable public String getFrontendConnection();
method @Nullable public String getLnbConnection();
method @Nullable public String getRecordFilterConnection();
method public void setDiseqcMsgSender(@Nullable java.util.List<java.lang.String>);
method public void setDvrRecordConnection(@Nullable String);
method public void setFrontendConnection(@Nullable String);
method public void setLnbConnection(@Nullable String);
method public void setRecordFilterConnection(@Nullable String);
}
@ -103,6 +113,20 @@ package android.media.tuner.testing.configuration.V1_0 {
method public void setFrontendConnection(@Nullable String);
}
public static class DataFlowConfiguration.TimeFilter {
ctor public DataFlowConfiguration.TimeFilter();
method @Nullable public String getTimeFilterConnection();
method public void setTimeFilterConnection(@Nullable String);
}
public class DiseqcMessage {
ctor public DiseqcMessage();
method @Nullable public java.util.List<java.lang.Short> getMsgBody();
method @Nullable public String getMsgName();
method public void setMsgBody(@Nullable java.util.List<java.lang.Short>);
method public void setMsgName(@Nullable String);
}
public class DvbsFrontendSettings {
ctor public DvbsFrontendSettings();
method @Nullable public java.math.BigInteger getInputStreamId();
@ -245,12 +269,23 @@ package android.media.tuner.testing.configuration.V1_0 {
public class HardwareConfiguration {
ctor public HardwareConfiguration();
method @Nullable public android.media.tuner.testing.configuration.V1_0.HardwareConfiguration.DiseqcMessages getDiseqcMessages();
method @Nullable public android.media.tuner.testing.configuration.V1_0.HardwareConfiguration.Dvrs getDvrs();
method @Nullable public android.media.tuner.testing.configuration.V1_0.HardwareConfiguration.Filters getFilters();
method @Nullable public android.media.tuner.testing.configuration.V1_0.HardwareConfiguration.Frontends getFrontends();
method @Nullable public android.media.tuner.testing.configuration.V1_0.HardwareConfiguration.Lnbs getLnbs();
method @Nullable public android.media.tuner.testing.configuration.V1_0.HardwareConfiguration.TimeFilters getTimeFilters();
method public void setDiseqcMessages(@Nullable android.media.tuner.testing.configuration.V1_0.HardwareConfiguration.DiseqcMessages);
method public void setDvrs(@Nullable android.media.tuner.testing.configuration.V1_0.HardwareConfiguration.Dvrs);
method public void setFilters(@Nullable android.media.tuner.testing.configuration.V1_0.HardwareConfiguration.Filters);
method public void setFrontends(@Nullable android.media.tuner.testing.configuration.V1_0.HardwareConfiguration.Frontends);
method public void setLnbs(@Nullable android.media.tuner.testing.configuration.V1_0.HardwareConfiguration.Lnbs);
method public void setTimeFilters(@Nullable android.media.tuner.testing.configuration.V1_0.HardwareConfiguration.TimeFilters);
}
public static class HardwareConfiguration.DiseqcMessages {
ctor public HardwareConfiguration.DiseqcMessages();
method @Nullable public java.util.List<android.media.tuner.testing.configuration.V1_0.DiseqcMessage> getDiseqcMessage();
}
public static class HardwareConfiguration.Dvrs {
@ -268,6 +303,56 @@ package android.media.tuner.testing.configuration.V1_0 {
method @Nullable public java.util.List<android.media.tuner.testing.configuration.V1_0.Frontend> getFrontend();
}
public static class HardwareConfiguration.Lnbs {
ctor public HardwareConfiguration.Lnbs();
method @Nullable public java.util.List<android.media.tuner.testing.configuration.V1_0.Lnb> getLnb();
}
public static class HardwareConfiguration.TimeFilters {
ctor public HardwareConfiguration.TimeFilters();
method @Nullable public java.util.List<android.media.tuner.testing.configuration.V1_0.TimeFilter> getTimeFilter();
}
public class Lnb {
ctor public Lnb();
method @Nullable public String getId();
method @Nullable public String getName();
method @Nullable public android.media.tuner.testing.configuration.V1_0.LnbPositionEnum getPosition();
method @Nullable public android.media.tuner.testing.configuration.V1_0.LnbToneEnum getTone();
method @Nullable public android.media.tuner.testing.configuration.V1_0.LnbVoltageEnum getVoltage();
method public void setId(@Nullable String);
method public void setName(@Nullable String);
method public void setPosition(@Nullable android.media.tuner.testing.configuration.V1_0.LnbPositionEnum);
method public void setTone(@Nullable android.media.tuner.testing.configuration.V1_0.LnbToneEnum);
method public void setVoltage(@Nullable android.media.tuner.testing.configuration.V1_0.LnbVoltageEnum);
}
public enum LnbPositionEnum {
method @NonNull public String getRawName();
enum_constant public static final android.media.tuner.testing.configuration.V1_0.LnbPositionEnum POSITION_A;
enum_constant public static final android.media.tuner.testing.configuration.V1_0.LnbPositionEnum POSITION_B;
enum_constant public static final android.media.tuner.testing.configuration.V1_0.LnbPositionEnum UNDEFINED;
}
public enum LnbToneEnum {
method @NonNull public String getRawName();
enum_constant public static final android.media.tuner.testing.configuration.V1_0.LnbToneEnum CONTINUOUS;
enum_constant public static final android.media.tuner.testing.configuration.V1_0.LnbToneEnum NONE;
}
public enum LnbVoltageEnum {
method @NonNull public String getRawName();
enum_constant public static final android.media.tuner.testing.configuration.V1_0.LnbVoltageEnum NONE;
enum_constant public static final android.media.tuner.testing.configuration.V1_0.LnbVoltageEnum VOLTAGE_11V;
enum_constant public static final android.media.tuner.testing.configuration.V1_0.LnbVoltageEnum VOLTAGE_12V;
enum_constant public static final android.media.tuner.testing.configuration.V1_0.LnbVoltageEnum VOLTAGE_13V;
enum_constant public static final android.media.tuner.testing.configuration.V1_0.LnbVoltageEnum VOLTAGE_14V;
enum_constant public static final android.media.tuner.testing.configuration.V1_0.LnbVoltageEnum VOLTAGE_15V;
enum_constant public static final android.media.tuner.testing.configuration.V1_0.LnbVoltageEnum VOLTAGE_18V;
enum_constant public static final android.media.tuner.testing.configuration.V1_0.LnbVoltageEnum VOLTAGE_19V;
enum_constant public static final android.media.tuner.testing.configuration.V1_0.LnbVoltageEnum VOLTAGE_5V;
}
public class RecordFilterSettings {
ctor public RecordFilterSettings();
method @Nullable public android.media.tuner.testing.configuration.V1_0.ScIndexTypeEnum getScIndexType();
@ -293,6 +378,14 @@ package android.media.tuner.testing.configuration.V1_0 {
method public void setIsRepeat(@Nullable boolean);
}
public class TimeFilter {
ctor public TimeFilter();
method @Nullable public String getId();
method @Nullable public java.math.BigInteger getTimeStamp();
method public void setId(@Nullable String);
method public void setTimeStamp(@Nullable java.math.BigInteger);
}
public class TunerConfiguration {
ctor public TunerConfiguration();
method @Nullable public android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration getDataFlowConfiguration();

View file

@ -133,6 +133,41 @@
statusMask="15" lowThreshold="4096" highThreshold="32767"
dataFormat="ES" packetSize="188" inputFilePath="/data/local/tmp/test.es"/>
</dvrs>
<!-- Lnb section:
This section contains configurations of all the lnbs that would be used in the tests.
- This section is optional and can be skipped if LNB is not supported.
- The users can configure 1 or more lnb elements in the lnbs sections.
Each lnb element contain the following attributes:
"id": unique id of the lnb that could be used to connect to the test the
"dataFlowConfiguration"
"name": the external lnb device name.
"voltage": the voltage used to config the lnb.
"tone": the voltage used to config the lnb.
"position": the voltage used to config the lnb.
-->
<diseqcMessages>
<diseqcMessage msgName="DISEQC_POWER_ON" msgBody="14 0 0 0 0 3"/>
</diseqcMessages>
<lnbs>
<lnb id="LNB_0" voltage="VOLTAGE_12V" tone="NONE" position="UNDEFINED"/>
<lnb id="LNB_1" name="default_lnb_external" voltage="VOLTAGE_5V"
tone="NONE" position="UNDEFINED"/>
</lnbs>
<!-- TimeFilter section:
This section contains configurations of all the time filters that would be used in
the tests.
- This section is optional and can be skipped if Time Filter is not supported.
- The users can configure 1 or more timeFilter elements in the timeFilters sections.
Each timeFilter element contain the following attributes:
"id": unique id of the time filter that could be used to connect to the test the
"dataFlowConfiguration"
"timeStamp": the time stamp used to config the time filter.
-->
<timeFilters>
<timeFilter id="TIME_FILTER_0" timeStamp="1"/>
</timeFilters>
</hardwareConfiguration>
<!-- Data flow configuration section connects each data flow under test to the ids of the
@ -159,9 +194,14 @@
dvrSoftwareFeConnection="DVR_PLAYBACK_0"/>
<lnbLive frontendConnection="FE_DVBS_0"
audioFilterConnection="FILTER_AUDIO_DEFAULT"
videoFilterConnection="FILTER_VIDEO_DEFAULT"/>
videoFilterConnection="FILTER_VIDEO_DEFAULT"
lnbConnection="LNB_1"
diseqcMsgSender="DISEQC_POWER_ON"/>
<lnbRecord frontendConnection="FE_DVBS_0"
recordFilterConnection="FILTER_TS_RECORD_0"
dvrRecordConnection="DVR_RECORD_0"/>
dvrRecordConnection="DVR_RECORD_0"
lnbConnection="LNB_0"
diseqcMsgSender="DISEQC_POWER_ON"/>
<timeFilter timeFilterConnection="TIME_FILTER_0"/>
</dataFlowConfiguration>
</TunerConfiguration>

View file

@ -279,6 +279,99 @@
<xs:attribute name="inputFilePath" type="xs:anyURI" use="optional"/>
</xs:complexType>
<!-- LNB SESSION -->
<xs:simpleType name="lnbId">
<!-- Lnb id must be LNB_NUM: <lnb id="LNB_10"/> -->
<xs:restriction base="xs:string">
<xs:pattern value="LNB_[0-9]+"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="lnbVoltageEnum">
<xs:restriction base="xs:string">
<xs:enumeration value="NONE" />
<xs:enumeration value="VOLTAGE_5V" />
<xs:enumeration value="VOLTAGE_11V" />
<xs:enumeration value="VOLTAGE_12V"/>
<xs:enumeration value="VOLTAGE_13V"/>
<xs:enumeration value="VOLTAGE_14V"/>
<xs:enumeration value="VOLTAGE_15V"/>
<xs:enumeration value="VOLTAGE_18V"/>
<xs:enumeration value="VOLTAGE_19V"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="lnbToneEnum">
<xs:restriction base="xs:string">
<xs:enumeration value="NONE" />
<xs:enumeration value="CONTINUOUS" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="lnbPositionEnum">
<xs:restriction base="xs:string">
<xs:enumeration value="UNDEFINED" />
<xs:enumeration value="POSITION_A" />
<xs:enumeration value="POSITION_B" />
</xs:restriction>
</xs:simpleType>
<!-- Diseqc Messages that would be used to send to the lnb under test. -->
<xs:simpleType name="diseqcMsgName">
<xs:restriction base="xs:string">
<xs:pattern value="[A-Z_]+"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="diseqcMsgBody">
<xs:list itemType="xs:unsignedByte"/>
</xs:simpleType>
<xs:complexType name="diseqcMessage">
<xs:attribute name="msgName" type="diseqcMsgName"/>
<xs:attribute name="msgBody" type="diseqcMsgBody"/>
</xs:complexType>
<xs:simpleType name="diseqcMsgSender">
<xs:list itemType="diseqcMsgName"/>
</xs:simpleType>
<xs:complexType name="lnb">
<xs:annotation>
<xs:documentation>
Each lnb element contain the following attributes:
"id": unique id of the lnb that could be used to connect to the test the
"dataFlowConfiguration"
"name": the external lnb device name.
"voltage": the voltage used to config the lnb.
"tone": the voltage used to config the lnb.
"position": the voltage used to config the lnb.
</xs:documentation>
</xs:annotation>
<xs:attribute name="id" type="lnbId" use="required"/>
<!-- Only required on external lnb with no device id. -->
<xs:attribute name="name" type="xs:string" use="optional"/>
<xs:attribute name="voltage" type="lnbVoltageEnum" use="required"/>
<xs:attribute name="tone" type="lnbToneEnum" use="required"/>
<xs:attribute name="position" type="lnbPositionEnum" use="required"/>
</xs:complexType>
<!-- TIME FILTER SESSION -->
<xs:simpleType name="timeFilterId">
<!-- Time Filter id must be TIME_FILTER_NUM: <timeFilter id="TIME_FILTER_1"/> -->
<xs:restriction base="xs:string">
<xs:pattern value="TIME_FILTER_[0-9]+"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="timeFilter">
<xs:annotation>
<xs:documentation>
Each timeFilter element contain the following attributes:
"id": unique id of the time filter that could be used to connect to the test the
"dataFlowConfiguration"
"timeStamp": the time stamp used to config the time filter.
</xs:documentation>
</xs:annotation>
<xs:attribute name="id" type="timeFilterId" use="required"/>
<xs:attribute name="timeStamp" type="xs:nonNegativeInteger" use="required"/>
</xs:complexType>
<!-- HARDWARE CONFIGURATION SESSION -->
<xs:complexType name="hardwareConfiguration">
<xs:sequence>
@ -341,6 +434,55 @@
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="diseqcMessages" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:annotation>
<xs:documentation xml:lang="en">
This section contains configurations of all the diseqc messages that
would be used in the lnb tests.
- This section is optional and can be skipped if lnb is not suppoted
- The users can configure 1 or more message elements in the
diseqcMessages sections.
</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="diseqcMessage" type="diseqcMessage" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="lnbs" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:annotation>
<xs:documentation xml:lang="en">
This section contains configurations of all the lnbs that would be used
in the tests.
- This section is optional and can be skipped if lnb is not suppoted
- The users can configure 1 or more lnb elements in the lnbs
sections.
</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="lnb" type="lnb" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="timeFilters" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:annotation>
<xs:documentation xml:lang="en">
This section contains configurations of all the time filters that would
be used in the tests.
- This section is optional and can be skipped if time filter is
not supported.
- The users can configure 1 or more time filter elements in the
time filters sections.
</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="timeFilter" type="timeFilter" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
@ -397,6 +539,8 @@
<xs:attribute name="frontendConnection" type="frontendId" use="required"/>
<xs:attribute name="audioFilterConnection" type="filterId" use="required"/>
<xs:attribute name="videoFilterConnection" type="filterId" use="required"/>
<xs:attribute name="lnbConnection" type="lnbId" use="required"/>
<xs:attribute name="diseqcMsgSender" type="diseqcMsgSender" use="optional"/>
<!-- TODO: b/182519645 allow the users to insert extra filters -->
</xs:complexType>
</xs:element>
@ -405,6 +549,13 @@
<xs:attribute name="frontendConnection" type="frontendId" use="required"/>
<xs:attribute name="recordFilterConnection" type="filterId" use="required"/>
<xs:attribute name="dvrRecordConnection" type="dvrId" use="required"/>
<xs:attribute name="lnbConnection" type="lnbId" use="required"/>
<xs:attribute name="diseqcMsgSender" type="diseqcMsgSender" use="optional"/>
</xs:complexType>
</xs:element>
<xs:element name="timeFilter" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:attribute name="timeFilterConnection" type="timeFilterId" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
@ -431,5 +582,13 @@
<xs:selector xpath="hardwareConfiguration/dvrs/dvr"/>
<xs:field xpath="@id"/>
</xs:key>
<xs:key name="lnbIdUniqueness">
<xs:selector xpath="hardwareConfiguration/lnbs/lnb"/>
<xs:field xpath="@id"/>
</xs:key>
<xs:key name="timeFilterIdUniqueness">
<xs:selector xpath="hardwareConfiguration/timeFilters/timeFilter"/>
<xs:field xpath="@id"/>
</xs:key>
</xs:element>
</xs:schema>