mirror of
https://github.com/Evolution-X/hardware_interfaces
synced 2026-02-02 06:22:53 +00:00
Add filter dynamic configuration into Tuner 1.0 VTS
Test: atest VtsHalTvTunerV1_0TargetTest Bug: 182519645 CTS-Coverage-Bug: 184077478 Change-Id: I26da0561b79ae741d1516bedda8c273fa0ed933b
This commit is contained in:
@@ -394,6 +394,9 @@ TEST_P(TunerDemuxHidlTest, openDemux) {
|
|||||||
|
|
||||||
TEST_P(TunerDemuxHidlTest, getAvSyncTime) {
|
TEST_P(TunerDemuxHidlTest, getAvSyncTime) {
|
||||||
description("Get the A/V sync time from a PCR filter.");
|
description("Get the A/V sync time from a PCR filter.");
|
||||||
|
if (live.pcrFilterId.compare(emptyHardwareId) == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
uint32_t feId;
|
uint32_t feId;
|
||||||
uint32_t demuxId;
|
uint32_t demuxId;
|
||||||
sp<IDemux> demux;
|
sp<IDemux> demux;
|
||||||
@@ -409,15 +412,15 @@ TEST_P(TunerDemuxHidlTest, getAvSyncTime) {
|
|||||||
ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
|
ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));
|
||||||
ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
|
ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
|
||||||
mFilterTests.setDemux(demux);
|
mFilterTests.setDemux(demux);
|
||||||
ASSERT_TRUE(mFilterTests.openFilterInDemux(filterArray[TS_VIDEO1].type,
|
ASSERT_TRUE(mFilterTests.openFilterInDemux(filterMap[live.videoFilterId].type,
|
||||||
filterArray[TS_VIDEO1].bufferSize));
|
filterMap[live.videoFilterId].bufferSize));
|
||||||
ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId(mediaFilterId));
|
ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId(mediaFilterId));
|
||||||
ASSERT_TRUE(mFilterTests.configFilter(filterArray[TS_VIDEO1].settings, mediaFilterId));
|
ASSERT_TRUE(mFilterTests.configFilter(filterMap[live.videoFilterId].settings, mediaFilterId));
|
||||||
mediaFilter = mFilterTests.getFilterById(mediaFilterId);
|
mediaFilter = mFilterTests.getFilterById(mediaFilterId);
|
||||||
ASSERT_TRUE(mFilterTests.openFilterInDemux(filterArray[TS_PCR0].type,
|
ASSERT_TRUE(mFilterTests.openFilterInDemux(filterMap[live.pcrFilterId].type,
|
||||||
filterArray[TS_PCR0].bufferSize));
|
filterMap[live.pcrFilterId].bufferSize));
|
||||||
ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId(pcrFilterId));
|
ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId(pcrFilterId));
|
||||||
ASSERT_TRUE(mFilterTests.configFilter(filterArray[TS_PCR0].settings, pcrFilterId));
|
ASSERT_TRUE(mFilterTests.configFilter(filterMap[live.pcrFilterId].settings, pcrFilterId));
|
||||||
ASSERT_TRUE(mDemuxTests.getAvSyncId(mediaFilter, avSyncHwId));
|
ASSERT_TRUE(mDemuxTests.getAvSyncId(mediaFilter, avSyncHwId));
|
||||||
ASSERT_TRUE(pcrFilterId == avSyncHwId);
|
ASSERT_TRUE(pcrFilterId == avSyncHwId);
|
||||||
ASSERT_TRUE(mDemuxTests.getAvSyncTime(pcrFilterId));
|
ASSERT_TRUE(mDemuxTests.getAvSyncTime(pcrFilterId));
|
||||||
@@ -430,7 +433,7 @@ TEST_P(TunerDemuxHidlTest, getAvSyncTime) {
|
|||||||
TEST_P(TunerFilterHidlTest, StartFilterInDemux) {
|
TEST_P(TunerFilterHidlTest, StartFilterInDemux) {
|
||||||
description("Open and start a filter in Demux.");
|
description("Open and start a filter in Demux.");
|
||||||
// TODO use paramterized tests
|
// TODO use paramterized tests
|
||||||
configSingleFilterInDemuxTest(filterArray[TS_VIDEO0], frontendMap[live.frontendId]);
|
configSingleFilterInDemuxTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_P(TunerFilterHidlTest, SetFilterLinkage) {
|
TEST_P(TunerFilterHidlTest, SetFilterLinkage) {
|
||||||
@@ -471,35 +474,42 @@ TEST_P(TunerFilterHidlTest, testTimeFilter) {
|
|||||||
|
|
||||||
TEST_P(TunerBroadcastHidlTest, BroadcastDataFlowVideoFilterTest) {
|
TEST_P(TunerBroadcastHidlTest, BroadcastDataFlowVideoFilterTest) {
|
||||||
description("Test Video Filter functionality in Broadcast use case.");
|
description("Test Video Filter functionality in Broadcast use case.");
|
||||||
broadcastSingleFilterTest(filterArray[TS_VIDEO1], frontendMap[live.frontendId]);
|
broadcastSingleFilterTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_P(TunerBroadcastHidlTest, BroadcastDataFlowAudioFilterTest) {
|
TEST_P(TunerBroadcastHidlTest, BroadcastDataFlowAudioFilterTest) {
|
||||||
description("Test Audio Filter functionality in Broadcast use case.");
|
description("Test Audio Filter functionality in Broadcast use case.");
|
||||||
broadcastSingleFilterTest(filterArray[TS_AUDIO0], frontendMap[live.frontendId]);
|
broadcastSingleFilterTest(filterMap[live.audioFilterId], frontendMap[live.frontendId]);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_P(TunerBroadcastHidlTest, BroadcastDataFlowSectionFilterTest) {
|
TEST_P(TunerBroadcastHidlTest, BroadcastDataFlowSectionFilterTest) {
|
||||||
description("Test Section Filter functionality in Broadcast use case.");
|
description("Test Section Filter functionality in Broadcast use case.");
|
||||||
broadcastSingleFilterTest(filterArray[TS_SECTION0], frontendMap[live.frontendId]);
|
if (live.sectionFilterId.compare(emptyHardwareId) == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
broadcastSingleFilterTest(filterMap[live.sectionFilterId], frontendMap[live.frontendId]);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_P(TunerBroadcastHidlTest, IonBufferTest) {
|
TEST_P(TunerBroadcastHidlTest, IonBufferTest) {
|
||||||
description("Test the av filter data bufferring.");
|
description("Test the av filter data bufferring.");
|
||||||
broadcastSingleFilterTest(filterArray[TS_VIDEO0], frontendMap[live.frontendId]);
|
broadcastSingleFilterTest(filterMap[live.videoFilterId], frontendMap[live.frontendId]);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_P(TunerBroadcastHidlTest, LnbBroadcastDataFlowVideoFilterTest) {
|
TEST_P(TunerBroadcastHidlTest, LnbBroadcastDataFlowVideoFilterTest) {
|
||||||
description("Test Video Filter functionality in Broadcast with Lnb use case.");
|
description("Test Video Filter functionality in Broadcast with Lnb use case.");
|
||||||
broadcastSingleFilterTest(filterArray[TS_VIDEO0], frontendMap[live.frontendId]);
|
if (!lnbLive.support) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
broadcastSingleFilterTestWithLnb(filterMap[lnbLive.videoFilterId],
|
||||||
|
frontendMap[lnbLive.frontendId], lnbArray[LNB0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_P(TunerPlaybackHidlTest, PlaybackDataFlowWithTsSectionFilterTest) {
|
TEST_P(TunerPlaybackHidlTest, PlaybackDataFlowWithTsSectionFilterTest) {
|
||||||
description("Feed ts data from playback and configure Ts section filter to get output");
|
description("Feed ts data from playback and configure Ts section filter to get output");
|
||||||
if (!playback.support) {
|
if (!playback.support || playback.sectionFilterId.compare(emptyHardwareId) == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
playbackSingleFilterTest(filterArray[TS_SECTION0], dvrMap[playback.dvrId]);
|
playbackSingleFilterTest(filterMap[playback.sectionFilterId], dvrMap[playback.dvrId]);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_P(TunerRecordHidlTest, AttachFiltersToRecordTest) {
|
TEST_P(TunerRecordHidlTest, AttachFiltersToRecordTest) {
|
||||||
@@ -508,8 +518,8 @@ TEST_P(TunerRecordHidlTest, AttachFiltersToRecordTest) {
|
|||||||
if (!record.support) {
|
if (!record.support) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
attachSingleFilterToRecordDvrTest(filterArray[TS_RECORD0], frontendMap[record.frontendId],
|
attachSingleFilterToRecordDvrTest(filterMap[record.recordFilterId],
|
||||||
dvrMap[record.dvrRecordId]);
|
frontendMap[record.frontendId], dvrMap[record.dvrRecordId]);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_P(TunerRecordHidlTest, RecordDataFlowWithTsRecordFilterTest) {
|
TEST_P(TunerRecordHidlTest, RecordDataFlowWithTsRecordFilterTest) {
|
||||||
@@ -517,17 +527,18 @@ TEST_P(TunerRecordHidlTest, RecordDataFlowWithTsRecordFilterTest) {
|
|||||||
if (!record.support) {
|
if (!record.support) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
recordSingleFilterTest(filterArray[TS_RECORD0], frontendMap[record.frontendId],
|
recordSingleFilterTest(filterMap[record.recordFilterId], frontendMap[record.frontendId],
|
||||||
dvrMap[record.dvrRecordId]);
|
dvrMap[record.dvrRecordId]);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_P(TunerRecordHidlTest, LnbRecordDataFlowWithTsRecordFilterTest) {
|
TEST_P(TunerRecordHidlTest, LnbRecordDataFlowWithTsRecordFilterTest) {
|
||||||
description("Feed ts data from Fe with Lnb to recording and test with ts record filter");
|
description("Feed ts data from Fe with Lnb to recording and test with ts record filter");
|
||||||
if (record.support) {
|
if (lnbRecord.support) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
recordSingleFilterTestWithLnb(filterArray[TS_RECORD0], frontendMap[lnbRecord.frontendId],
|
recordSingleFilterTestWithLnb(filterMap[lnbRecord.recordFilterId],
|
||||||
dvrMap[record.dvrRecordId], lnbArray[LNB0]);
|
frontendMap[lnbRecord.frontendId], dvrMap[lnbRecord.dvrRecordId],
|
||||||
|
lnbArray[LNB0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_P(TunerDescramblerHidlTest, CreateDescrambler) {
|
TEST_P(TunerDescramblerHidlTest, CreateDescrambler) {
|
||||||
@@ -556,8 +567,8 @@ TEST_P(TunerDescramblerHidlTest, ScrambledBroadcastDataFlowMediaFiltersTest) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
set<FilterConfig> filterConfs;
|
set<FilterConfig> filterConfs;
|
||||||
filterConfs.insert(filterArray[TS_AUDIO0]);
|
filterConfs.insert(static_cast<FilterConfig>(filterMap[descrambling.audioFilterId]));
|
||||||
filterConfs.insert(filterArray[TS_VIDEO1]);
|
filterConfs.insert(static_cast<FilterConfig>(filterMap[descrambling.videoFilterId]));
|
||||||
scrambledBroadcastTest(filterConfs, frontendMap[descrambling.frontendId],
|
scrambledBroadcastTest(filterConfs, frontendMap[descrambling.frontendId],
|
||||||
descramblerArray[DESC_0]);
|
descramblerArray[DESC_0]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ bool initConfiguration() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
initFrontendConfig();
|
initFrontendConfig();
|
||||||
|
initFilterConfig();
|
||||||
initDvrConfig();
|
initDvrConfig();
|
||||||
connectHardwaresToTestCases();
|
connectHardwaresToTestCases();
|
||||||
if (!validateConnections()) {
|
if (!validateConnections()) {
|
||||||
@@ -41,7 +42,6 @@ bool initConfiguration() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
initLnbConfig();
|
initLnbConfig();
|
||||||
initFilterConfig();
|
|
||||||
initTimeFilterConfig();
|
initTimeFilterConfig();
|
||||||
initDescramblerConfig();
|
initDescramblerConfig();
|
||||||
|
|
||||||
|
|||||||
@@ -79,19 +79,6 @@ const uint32_t FMQ_SIZE_16M = 0x1000000;
|
|||||||
" \"track_types\": [ ] " \
|
" \"track_types\": [ ] " \
|
||||||
"} "
|
"} "
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
TS_VIDEO0,
|
|
||||||
TS_VIDEO1,
|
|
||||||
TS_AUDIO0,
|
|
||||||
TS_AUDIO1,
|
|
||||||
TS_PES0,
|
|
||||||
TS_PCR0,
|
|
||||||
TS_SECTION0,
|
|
||||||
TS_TS0,
|
|
||||||
TS_RECORD0,
|
|
||||||
FILTER_MAX,
|
|
||||||
} Filter;
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
TIMER0,
|
TIMER0,
|
||||||
TIMER_MAX,
|
TIMER_MAX,
|
||||||
@@ -119,15 +106,6 @@ typedef enum {
|
|||||||
DESC_MAX,
|
DESC_MAX,
|
||||||
} Descrambler;
|
} Descrambler;
|
||||||
|
|
||||||
struct FilterConfig {
|
|
||||||
uint32_t bufferSize;
|
|
||||||
DemuxFilterType type;
|
|
||||||
DemuxFilterSettings settings;
|
|
||||||
bool getMqDesc;
|
|
||||||
|
|
||||||
bool operator<(const FilterConfig& /*c*/) const { return false; }
|
|
||||||
};
|
|
||||||
|
|
||||||
struct TimeFilterConfig {
|
struct TimeFilterConfig {
|
||||||
bool supportTimeFilter;
|
bool supportTimeFilter;
|
||||||
uint64_t timeStamp;
|
uint64_t timeStamp;
|
||||||
@@ -150,13 +128,13 @@ struct DescramblerConfig {
|
|||||||
// TODO: remove all the manual config array after the dynamic config refactoring is done.
|
// TODO: remove all the manual config array after the dynamic config refactoring is done.
|
||||||
static LnbConfig lnbArray[LNB_MAX];
|
static LnbConfig lnbArray[LNB_MAX];
|
||||||
static vector<uint8_t> diseqcMsgArray[DISEQC_MAX];
|
static vector<uint8_t> diseqcMsgArray[DISEQC_MAX];
|
||||||
static FilterConfig filterArray[FILTER_MAX];
|
|
||||||
static TimeFilterConfig timeFilterArray[TIMER_MAX];
|
static TimeFilterConfig timeFilterArray[TIMER_MAX];
|
||||||
static DemuxFilterType filterLinkageTypes[LINKAGE_DIR][FILTER_MAIN_TYPE_BIT_COUNT];
|
static DemuxFilterType filterLinkageTypes[LINKAGE_DIR][FILTER_MAIN_TYPE_BIT_COUNT];
|
||||||
static DescramblerConfig descramblerArray[DESC_MAX];
|
static DescramblerConfig descramblerArray[DESC_MAX];
|
||||||
|
|
||||||
// Hardware configs
|
// Hardware configs
|
||||||
static map<string, FrontendConfig> frontendMap;
|
static map<string, FrontendConfig> frontendMap;
|
||||||
|
static map<string, FilterConfig> filterMap;
|
||||||
static map<string, DvrConfig> dvrMap;
|
static map<string, DvrConfig> dvrMap;
|
||||||
|
|
||||||
// Hardware and test cases connections
|
// Hardware and test cases connections
|
||||||
@@ -196,6 +174,28 @@ inline void initFrontendConfig() {
|
|||||||
TunerTestingConfigReader::readFrontendConfig1_0(frontendMap);
|
TunerTestingConfigReader::readFrontendConfig1_0(frontendMap);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
inline void initFilterConfig() {
|
||||||
|
// The test will use the internal default filter when default filter is connected to any
|
||||||
|
// data flow without overriding in the xml config.
|
||||||
|
string defaultAudioFilterId = "FILTER_AUDIO_DEFAULT";
|
||||||
|
string defaultVideoFilterId = "FILTER_VIDEO_DEFAULT";
|
||||||
|
|
||||||
|
filterMap[defaultVideoFilterId].type.mainType = DemuxFilterMainType::TS;
|
||||||
|
filterMap[defaultVideoFilterId].type.subType.tsFilterType(DemuxTsFilterType::VIDEO);
|
||||||
|
filterMap[defaultVideoFilterId].bufferSize = FMQ_SIZE_16M;
|
||||||
|
filterMap[defaultVideoFilterId].settings.ts().tpid = 256;
|
||||||
|
filterMap[defaultVideoFilterId].settings.ts().filterSettings.av({.isPassthrough = false});
|
||||||
|
|
||||||
|
filterMap[defaultAudioFilterId].type.mainType = DemuxFilterMainType::TS;
|
||||||
|
filterMap[defaultAudioFilterId].type.subType.tsFilterType(DemuxTsFilterType::AUDIO);
|
||||||
|
filterMap[defaultAudioFilterId].bufferSize = FMQ_SIZE_16M;
|
||||||
|
filterMap[defaultAudioFilterId].settings.ts().tpid = 256;
|
||||||
|
filterMap[defaultAudioFilterId].settings.ts().filterSettings.av({.isPassthrough = false});
|
||||||
|
|
||||||
|
// Read customized config
|
||||||
|
TunerTestingConfigReader::readFilterConfig1_0(filterMap);
|
||||||
|
};
|
||||||
|
|
||||||
/** Config all the dvrs that would be used in the tests */
|
/** Config all the dvrs that would be used in the tests */
|
||||||
inline void initDvrConfig() {
|
inline void initDvrConfig() {
|
||||||
// Read customized config
|
// Read customized config
|
||||||
@@ -250,6 +250,34 @@ inline bool validateConnections() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
if (!filterIsValid) {
|
||||||
|
ALOGW("[vts config] dynamic config filter connection is invalid.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -272,91 +300,6 @@ inline void initDiseqcMsg() {
|
|||||||
diseqcMsgArray[DISEQC_POWER_ON] = {0xE, 0x0, 0x0, 0x0, 0x0, 0x3};
|
diseqcMsgArray[DISEQC_POWER_ON] = {0xE, 0x0, 0x0, 0x0, 0x0, 0x3};
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Configuration array for the filter test */
|
|
||||||
inline void initFilterConfig() {
|
|
||||||
// TS VIDEO filter setting for default implementation testing
|
|
||||||
filterArray[TS_VIDEO0].type.mainType = DemuxFilterMainType::TS;
|
|
||||||
filterArray[TS_VIDEO0].type.subType.tsFilterType(DemuxTsFilterType::VIDEO);
|
|
||||||
filterArray[TS_VIDEO0].bufferSize = FMQ_SIZE_16M;
|
|
||||||
filterArray[TS_VIDEO0].settings.ts().tpid = 256;
|
|
||||||
filterArray[TS_VIDEO0].settings.ts().filterSettings.av({.isPassthrough = false});
|
|
||||||
filterArray[TS_VIDEO1].type.mainType = DemuxFilterMainType::TS;
|
|
||||||
filterArray[TS_VIDEO1].type.subType.tsFilterType(DemuxTsFilterType::VIDEO);
|
|
||||||
filterArray[TS_VIDEO1].bufferSize = FMQ_SIZE_16M;
|
|
||||||
filterArray[TS_VIDEO1].settings.ts().tpid = 256;
|
|
||||||
filterArray[TS_VIDEO1].settings.ts().filterSettings.av({.isPassthrough = false});
|
|
||||||
// TS AUDIO filter setting
|
|
||||||
filterArray[TS_AUDIO0].type.mainType = DemuxFilterMainType::TS;
|
|
||||||
filterArray[TS_AUDIO0].type.subType.tsFilterType(DemuxTsFilterType::AUDIO);
|
|
||||||
filterArray[TS_AUDIO0].bufferSize = FMQ_SIZE_16M;
|
|
||||||
filterArray[TS_AUDIO0].settings.ts().tpid = 256;
|
|
||||||
filterArray[TS_AUDIO0].settings.ts().filterSettings.av({.isPassthrough = false});
|
|
||||||
filterArray[TS_AUDIO1].type.mainType = DemuxFilterMainType::TS;
|
|
||||||
filterArray[TS_AUDIO1].type.subType.tsFilterType(DemuxTsFilterType::AUDIO);
|
|
||||||
filterArray[TS_AUDIO1].bufferSize = FMQ_SIZE_16M;
|
|
||||||
filterArray[TS_AUDIO1].settings.ts().tpid = 257;
|
|
||||||
filterArray[TS_AUDIO1].settings.ts().filterSettings.av({.isPassthrough = false});
|
|
||||||
// TS PES filter setting
|
|
||||||
filterArray[TS_PES0].type.mainType = DemuxFilterMainType::TS;
|
|
||||||
filterArray[TS_PES0].type.subType.tsFilterType(DemuxTsFilterType::PES);
|
|
||||||
filterArray[TS_PES0].bufferSize = FMQ_SIZE_16M;
|
|
||||||
filterArray[TS_PES0].settings.ts().tpid = 256;
|
|
||||||
filterArray[TS_PES0].settings.ts().filterSettings.pesData({
|
|
||||||
.isRaw = false,
|
|
||||||
.streamId = 0xbd,
|
|
||||||
});
|
|
||||||
filterArray[TS_PES0].getMqDesc = true;
|
|
||||||
// TS PCR filter setting
|
|
||||||
filterArray[TS_PCR0].type.mainType = DemuxFilterMainType::TS;
|
|
||||||
filterArray[TS_PCR0].type.subType.tsFilterType(DemuxTsFilterType::PCR);
|
|
||||||
filterArray[TS_PCR0].bufferSize = FMQ_SIZE_16M;
|
|
||||||
filterArray[TS_PCR0].settings.ts().tpid = 256;
|
|
||||||
filterArray[TS_PCR0].settings.ts().filterSettings.noinit();
|
|
||||||
// TS filter setting
|
|
||||||
filterArray[TS_TS0].type.mainType = DemuxFilterMainType::TS;
|
|
||||||
filterArray[TS_TS0].type.subType.tsFilterType(DemuxTsFilterType::TS);
|
|
||||||
filterArray[TS_TS0].bufferSize = FMQ_SIZE_16M;
|
|
||||||
filterArray[TS_TS0].settings.ts().tpid = 256;
|
|
||||||
filterArray[TS_TS0].settings.ts().filterSettings.noinit();
|
|
||||||
// TS SECTION filter setting
|
|
||||||
filterArray[TS_SECTION0].type.mainType = DemuxFilterMainType::TS;
|
|
||||||
filterArray[TS_SECTION0].type.subType.tsFilterType(DemuxTsFilterType::SECTION);
|
|
||||||
filterArray[TS_SECTION0].bufferSize = FMQ_SIZE_16M;
|
|
||||||
filterArray[TS_SECTION0].settings.ts().tpid = 256;
|
|
||||||
filterArray[TS_SECTION0].settings.ts().filterSettings.section({
|
|
||||||
.isRaw = false,
|
|
||||||
});
|
|
||||||
filterArray[TS_SECTION0].getMqDesc = true;
|
|
||||||
// TS RECORD filter setting
|
|
||||||
filterArray[TS_RECORD0].type.mainType = DemuxFilterMainType::TS;
|
|
||||||
filterArray[TS_RECORD0].type.subType.tsFilterType(DemuxTsFilterType::RECORD);
|
|
||||||
filterArray[TS_RECORD0].settings.ts().tpid = 81;
|
|
||||||
filterArray[TS_RECORD0].settings.ts().filterSettings.record({
|
|
||||||
.scIndexType = DemuxRecordScIndexType::NONE,
|
|
||||||
});
|
|
||||||
|
|
||||||
// TS Linkage filter setting
|
|
||||||
filterLinkageTypes[SOURCE][0].mainType = DemuxFilterMainType::TS;
|
|
||||||
filterLinkageTypes[SOURCE][0].subType.tsFilterType(DemuxTsFilterType::TS);
|
|
||||||
filterLinkageTypes[SINK][0] = filterLinkageTypes[SOURCE][0];
|
|
||||||
// MMTP Linkage filter setting
|
|
||||||
filterLinkageTypes[SOURCE][1].mainType = DemuxFilterMainType::MMTP;
|
|
||||||
filterLinkageTypes[SOURCE][1].subType.mmtpFilterType(DemuxMmtpFilterType::AUDIO);
|
|
||||||
filterLinkageTypes[SINK][1] = filterLinkageTypes[SOURCE][1];
|
|
||||||
// IP Linkage filter setting
|
|
||||||
filterLinkageTypes[SOURCE][2].mainType = DemuxFilterMainType::IP;
|
|
||||||
filterLinkageTypes[SOURCE][2].subType.ipFilterType(DemuxIpFilterType::IP);
|
|
||||||
filterLinkageTypes[SINK][2] = filterLinkageTypes[SOURCE][2];
|
|
||||||
// TLV Linkage filter setting
|
|
||||||
filterLinkageTypes[SOURCE][3].mainType = DemuxFilterMainType::TLV;
|
|
||||||
filterLinkageTypes[SOURCE][3].subType.tlvFilterType(DemuxTlvFilterType::TLV);
|
|
||||||
filterLinkageTypes[SINK][3] = filterLinkageTypes[SOURCE][3];
|
|
||||||
// ALP Linkage PTP filter setting
|
|
||||||
filterLinkageTypes[SOURCE][4].mainType = DemuxFilterMainType::ALP;
|
|
||||||
filterLinkageTypes[SOURCE][4].subType.alpFilterType(DemuxAlpFilterType::PTP);
|
|
||||||
filterLinkageTypes[SINK][4] = filterLinkageTypes[SOURCE][4];
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Configuration array for the timer filter test */
|
/** Configuration array for the timer filter test */
|
||||||
inline void initTimeFilterConfig() {
|
inline void initTimeFilterConfig() {
|
||||||
timeFilterArray[TIMER0].supportTimeFilter = true;
|
timeFilterArray[TIMER0].supportTimeFilter = true;
|
||||||
|
|||||||
@@ -29,8 +29,11 @@ using namespace android::media::tuner::testing::configuration::V1_0;
|
|||||||
|
|
||||||
using android::hardware::tv::tuner::V1_0::DataFormat;
|
using android::hardware::tv::tuner::V1_0::DataFormat;
|
||||||
using android::hardware::tv::tuner::V1_0::DemuxAlpFilterType;
|
using android::hardware::tv::tuner::V1_0::DemuxAlpFilterType;
|
||||||
|
using android::hardware::tv::tuner::V1_0::DemuxFilterAvSettings;
|
||||||
using android::hardware::tv::tuner::V1_0::DemuxFilterEvent;
|
using android::hardware::tv::tuner::V1_0::DemuxFilterEvent;
|
||||||
using android::hardware::tv::tuner::V1_0::DemuxFilterMainType;
|
using android::hardware::tv::tuner::V1_0::DemuxFilterMainType;
|
||||||
|
using android::hardware::tv::tuner::V1_0::DemuxFilterRecordSettings;
|
||||||
|
using android::hardware::tv::tuner::V1_0::DemuxFilterSectionSettings;
|
||||||
using android::hardware::tv::tuner::V1_0::DemuxFilterSettings;
|
using android::hardware::tv::tuner::V1_0::DemuxFilterSettings;
|
||||||
using android::hardware::tv::tuner::V1_0::DemuxFilterType;
|
using android::hardware::tv::tuner::V1_0::DemuxFilterType;
|
||||||
using android::hardware::tv::tuner::V1_0::DemuxIpFilterType;
|
using android::hardware::tv::tuner::V1_0::DemuxIpFilterType;
|
||||||
@@ -61,6 +64,7 @@ using android::hardware::tv::tuner::V1_0::PlaybackSettings;
|
|||||||
using android::hardware::tv::tuner::V1_0::RecordSettings;
|
using android::hardware::tv::tuner::V1_0::RecordSettings;
|
||||||
|
|
||||||
const string configFilePath = "/vendor/etc/tuner_vts_config.xml";
|
const string configFilePath = "/vendor/etc/tuner_vts_config.xml";
|
||||||
|
const string emptyHardwareId = "";
|
||||||
|
|
||||||
struct FrontendConfig {
|
struct FrontendConfig {
|
||||||
bool isSoftwareFe;
|
bool isSoftwareFe;
|
||||||
@@ -70,6 +74,15 @@ struct FrontendConfig {
|
|||||||
vector<FrontendStatus> expectTuneStatuses;
|
vector<FrontendStatus> expectTuneStatuses;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct FilterConfig {
|
||||||
|
uint32_t bufferSize;
|
||||||
|
DemuxFilterType type;
|
||||||
|
DemuxFilterSettings settings;
|
||||||
|
bool getMqDesc;
|
||||||
|
|
||||||
|
bool operator<(const FilterConfig& /*c*/) const { return false; }
|
||||||
|
};
|
||||||
|
|
||||||
struct DvrConfig {
|
struct DvrConfig {
|
||||||
DvrType type;
|
DvrType type;
|
||||||
uint32_t bufferSize;
|
uint32_t bufferSize;
|
||||||
@@ -80,9 +93,11 @@ struct DvrConfig {
|
|||||||
struct LiveBroadcastHardwareConnections {
|
struct LiveBroadcastHardwareConnections {
|
||||||
string frontendId;
|
string frontendId;
|
||||||
string dvrSoftwareFeId;
|
string dvrSoftwareFeId;
|
||||||
/* string audioFilterId;
|
string audioFilterId;
|
||||||
string videoFilterId;
|
string videoFilterId;
|
||||||
list string of extra filters; */
|
string sectionFilterId;
|
||||||
|
string pcrFilterId;
|
||||||
|
/* list string of extra filters; */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ScanHardwareConnections {
|
struct ScanHardwareConnections {
|
||||||
@@ -93,9 +108,10 @@ struct DvrPlaybackHardwareConnections {
|
|||||||
bool support;
|
bool support;
|
||||||
string frontendId;
|
string frontendId;
|
||||||
string dvrId;
|
string dvrId;
|
||||||
/* string audioFilterId;
|
string audioFilterId;
|
||||||
string videoFilterId;
|
string videoFilterId;
|
||||||
list string of extra filters; */
|
string sectionFilterId;
|
||||||
|
/* list string of extra filters; */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DvrRecordHardwareConnections {
|
struct DvrRecordHardwareConnections {
|
||||||
@@ -103,34 +119,34 @@ struct DvrRecordHardwareConnections {
|
|||||||
string frontendId;
|
string frontendId;
|
||||||
string dvrRecordId;
|
string dvrRecordId;
|
||||||
string dvrSoftwareFeId;
|
string dvrSoftwareFeId;
|
||||||
/* string recordFilterId;
|
string recordFilterId;
|
||||||
string dvrId; */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DescramblingHardwareConnections {
|
struct DescramblingHardwareConnections {
|
||||||
bool support;
|
bool support;
|
||||||
string frontendId;
|
string frontendId;
|
||||||
string dvrSoftwareFeId;
|
string dvrSoftwareFeId;
|
||||||
/* string descramblerId;
|
|
||||||
string audioFilterId;
|
string audioFilterId;
|
||||||
string videoFilterId;
|
string videoFilterId;
|
||||||
|
/* string descramblerId;
|
||||||
list string of extra filters; */
|
list string of extra filters; */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct LnbLiveHardwareConnections {
|
struct LnbLiveHardwareConnections {
|
||||||
bool support;
|
bool support;
|
||||||
string frontendId;
|
string frontendId;
|
||||||
/* string audioFilterId;
|
string audioFilterId;
|
||||||
string videoFilterId;
|
string videoFilterId;
|
||||||
list string of extra filters;
|
/* list string of extra filters;
|
||||||
string lnbId; */
|
string lnbId; */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct LnbRecordHardwareConnections {
|
struct LnbRecordHardwareConnections {
|
||||||
bool support;
|
bool support;
|
||||||
string frontendId;
|
string frontendId;
|
||||||
/* string recordFilterId;
|
string dvrRecordId;
|
||||||
list string of extra filters;
|
string recordFilterId;
|
||||||
|
/* list string of extra filters;
|
||||||
string lnbId; */
|
string lnbId; */
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -149,7 +165,7 @@ struct TunerTestingConfigReader {
|
|||||||
static void readFrontendConfig1_0(map<string, FrontendConfig>& frontendMap) {
|
static void readFrontendConfig1_0(map<string, FrontendConfig>& frontendMap) {
|
||||||
auto hardwareConfig = getHardwareConfig();
|
auto hardwareConfig = getHardwareConfig();
|
||||||
if (hardwareConfig.hasFrontends()) {
|
if (hardwareConfig.hasFrontends()) {
|
||||||
// TODO: complete the tune status config
|
// TODO: b/182519645 complete the tune status config
|
||||||
vector<FrontendStatusType> types;
|
vector<FrontendStatusType> types;
|
||||||
types.push_back(FrontendStatusType::DEMOD_LOCK);
|
types.push_back(FrontendStatusType::DEMOD_LOCK);
|
||||||
FrontendStatus status;
|
FrontendStatus status;
|
||||||
@@ -169,7 +185,7 @@ struct TunerTestingConfigReader {
|
|||||||
case FrontendTypeEnum::UNDEFINED:
|
case FrontendTypeEnum::UNDEFINED:
|
||||||
type = FrontendType::UNDEFINED;
|
type = FrontendType::UNDEFINED;
|
||||||
break;
|
break;
|
||||||
// TODO: finish all other frontend settings
|
// TODO: b/182519645 finish all other frontend settings
|
||||||
case FrontendTypeEnum::ANALOG:
|
case FrontendTypeEnum::ANALOG:
|
||||||
type = FrontendType::ANALOG;
|
type = FrontendType::ANALOG;
|
||||||
break;
|
break;
|
||||||
@@ -209,13 +225,42 @@ struct TunerTestingConfigReader {
|
|||||||
}
|
}
|
||||||
frontendMap[id].type = type;
|
frontendMap[id].type = type;
|
||||||
frontendMap[id].isSoftwareFe = feConfig.getIsSoftwareFrontend();
|
frontendMap[id].isSoftwareFe = feConfig.getIsSoftwareFrontend();
|
||||||
// TODO: complete the tune status config
|
// TODO: b/182519645 complete the tune status config
|
||||||
frontendMap[id].tuneStatusTypes = types;
|
frontendMap[id].tuneStatusTypes = types;
|
||||||
frontendMap[id].expectTuneStatuses = statuses;
|
frontendMap[id].expectTuneStatuses = statuses;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void readFilterConfig1_0(map<string, FilterConfig>& filterMap) {
|
||||||
|
auto hardwareConfig = getHardwareConfig();
|
||||||
|
if (hardwareConfig.hasFilters()) {
|
||||||
|
auto filters = *hardwareConfig.getFirstFilters();
|
||||||
|
for (auto filterConfig : filters.getFilter()) {
|
||||||
|
string id = filterConfig.getId();
|
||||||
|
if (id.compare(string("FILTER_AUDIO_DEFAULT")) == 0) {
|
||||||
|
// overrid default
|
||||||
|
filterMap.erase(string("FILTER_AUDIO_DEFAULT"));
|
||||||
|
}
|
||||||
|
if (id.compare(string("FILTER_VIDEO_DEFAULT")) == 0) {
|
||||||
|
// overrid default
|
||||||
|
filterMap.erase(string("FILTER_VIDEO_DEFAULT"));
|
||||||
|
}
|
||||||
|
|
||||||
|
DemuxFilterType type;
|
||||||
|
DemuxFilterSettings settings;
|
||||||
|
if (!readFilterTypeAndSettings(filterConfig, type, settings)) {
|
||||||
|
ALOGW("[ConfigReader] invalid filter type");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
filterMap[id].type = type;
|
||||||
|
filterMap[id].bufferSize = filterConfig.getBufferSize();
|
||||||
|
filterMap[id].getMqDesc = filterConfig.getUseFMQ();
|
||||||
|
filterMap[id].settings = settings;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void readDvrConfig1_0(map<string, DvrConfig>& dvrMap) {
|
static void readDvrConfig1_0(map<string, DvrConfig>& dvrMap) {
|
||||||
auto hardwareConfig = getHardwareConfig();
|
auto hardwareConfig = getHardwareConfig();
|
||||||
if (hardwareConfig.hasDvrs()) {
|
if (hardwareConfig.hasDvrs()) {
|
||||||
@@ -246,10 +291,23 @@ struct TunerTestingConfigReader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void connectLiveBroadcast(LiveBroadcastHardwareConnections& live) {
|
static void connectLiveBroadcast(LiveBroadcastHardwareConnections& live) {
|
||||||
auto liveConfig = getDataFlowConfiguration().getFirstClearLiveBroadcast();
|
auto liveConfig = *getDataFlowConfiguration().getFirstClearLiveBroadcast();
|
||||||
live.frontendId = liveConfig->getFrontendConnection();
|
live.frontendId = liveConfig.getFrontendConnection();
|
||||||
if (liveConfig->hasDvrSoftwareFeConnection()) {
|
|
||||||
live.dvrSoftwareFeId = liveConfig->getDvrSoftwareFeConnection();
|
live.audioFilterId = liveConfig.getAudioFilterConnection();
|
||||||
|
live.videoFilterId = liveConfig.getVideoFilterConnection();
|
||||||
|
if (liveConfig.hasPcrFilterConnection()) {
|
||||||
|
live.pcrFilterId = liveConfig.getPcrFilterConnection();
|
||||||
|
} else {
|
||||||
|
live.pcrFilterId = emptyHardwareId;
|
||||||
|
}
|
||||||
|
if (liveConfig.hasSectionFilterConnection()) {
|
||||||
|
live.sectionFilterId = liveConfig.getSectionFilterConnection();
|
||||||
|
} else {
|
||||||
|
live.sectionFilterId = emptyHardwareId;
|
||||||
|
}
|
||||||
|
if (liveConfig.hasDvrSoftwareFeConnection()) {
|
||||||
|
live.dvrSoftwareFeId = liveConfig.getDvrSoftwareFeConnection();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -260,59 +318,78 @@ struct TunerTestingConfigReader {
|
|||||||
|
|
||||||
static void connectDvrPlayback(DvrPlaybackHardwareConnections& playback) {
|
static void connectDvrPlayback(DvrPlaybackHardwareConnections& playback) {
|
||||||
auto dataFlow = getDataFlowConfiguration();
|
auto dataFlow = getDataFlowConfiguration();
|
||||||
if (!dataFlow.hasDvrPlayback()) {
|
if (dataFlow.hasDvrPlayback()) {
|
||||||
playback.support = false;
|
playback.support = true;
|
||||||
|
} else {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto playbackConfig = dataFlow.getFirstDvrPlayback();
|
auto playbackConfig = *dataFlow.getFirstDvrPlayback();
|
||||||
playback.dvrId = playbackConfig->getDvrConnection();
|
playback.dvrId = playbackConfig.getDvrConnection();
|
||||||
|
playback.audioFilterId = playbackConfig.getAudioFilterConnection();
|
||||||
|
playback.videoFilterId = playbackConfig.getVideoFilterConnection();
|
||||||
|
if (playbackConfig.hasSectionFilterConnection()) {
|
||||||
|
playback.sectionFilterId = playbackConfig.getSectionFilterConnection();
|
||||||
|
} else {
|
||||||
|
playback.sectionFilterId = emptyHardwareId;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void connectDvrRecord(DvrRecordHardwareConnections& record) {
|
static void connectDvrRecord(DvrRecordHardwareConnections& record) {
|
||||||
auto dataFlow = getDataFlowConfiguration();
|
auto dataFlow = getDataFlowConfiguration();
|
||||||
if (!dataFlow.hasDvrRecord()) {
|
if (dataFlow.hasDvrRecord()) {
|
||||||
record.support = false;
|
record.support = true;
|
||||||
|
} else {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto recordConfig = dataFlow.getFirstDvrRecord();
|
auto recordConfig = *dataFlow.getFirstDvrRecord();
|
||||||
record.frontendId = recordConfig->getFrontendConnection();
|
record.frontendId = recordConfig.getFrontendConnection();
|
||||||
record.dvrRecordId = recordConfig->getDvrRecordConnection();
|
record.recordFilterId = recordConfig.getRecordFilterConnection();
|
||||||
if (recordConfig->hasDvrSoftwareFeConnection()) {
|
record.dvrRecordId = recordConfig.getDvrRecordConnection();
|
||||||
record.dvrSoftwareFeId = recordConfig->getDvrSoftwareFeConnection();
|
if (recordConfig.hasDvrSoftwareFeConnection()) {
|
||||||
|
record.dvrSoftwareFeId = recordConfig.getDvrSoftwareFeConnection();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void connectDescrambling(DescramblingHardwareConnections& descrambling) {
|
static void connectDescrambling(DescramblingHardwareConnections& descrambling) {
|
||||||
auto dataFlow = getDataFlowConfiguration();
|
auto dataFlow = getDataFlowConfiguration();
|
||||||
if (!dataFlow.hasDescrambling()) {
|
if (dataFlow.hasDescrambling()) {
|
||||||
descrambling.support = false;
|
descrambling.support = true;
|
||||||
|
} else {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto descConfig = dataFlow.getFirstDescrambling();
|
auto descConfig = *dataFlow.getFirstDescrambling();
|
||||||
descrambling.frontendId = descConfig->getFrontendConnection();
|
descrambling.frontendId = descConfig.getFrontendConnection();
|
||||||
if (descConfig->hasDvrSoftwareFeConnection()) {
|
descrambling.audioFilterId = descConfig.getAudioFilterConnection();
|
||||||
descrambling.dvrSoftwareFeId = descConfig->getDvrSoftwareFeConnection();
|
descrambling.videoFilterId = descConfig.getVideoFilterConnection();
|
||||||
|
if (descConfig.hasDvrSoftwareFeConnection()) {
|
||||||
|
descrambling.dvrSoftwareFeId = descConfig.getDvrSoftwareFeConnection();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void connectLnbLive(LnbLiveHardwareConnections& lnbLive) {
|
static void connectLnbLive(LnbLiveHardwareConnections& lnbLive) {
|
||||||
auto dataFlow = getDataFlowConfiguration();
|
auto dataFlow = getDataFlowConfiguration();
|
||||||
if (!dataFlow.hasLnbLive()) {
|
if (dataFlow.hasLnbLive()) {
|
||||||
lnbLive.support = false;
|
lnbLive.support = true;
|
||||||
|
} else {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto lnbLiveConfig = dataFlow.getFirstLnbLive();
|
auto lnbLiveConfig = *dataFlow.getFirstLnbLive();
|
||||||
lnbLive.frontendId = lnbLiveConfig->getFrontendConnection();
|
lnbLive.frontendId = lnbLiveConfig.getFrontendConnection();
|
||||||
|
lnbLive.audioFilterId = lnbLiveConfig.getAudioFilterConnection();
|
||||||
|
lnbLive.videoFilterId = lnbLiveConfig.getVideoFilterConnection();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void connectLnbRecord(LnbRecordHardwareConnections& lnbRecord) {
|
static void connectLnbRecord(LnbRecordHardwareConnections& lnbRecord) {
|
||||||
auto dataFlow = getDataFlowConfiguration();
|
auto dataFlow = getDataFlowConfiguration();
|
||||||
if (!dataFlow.hasLnbRecord()) {
|
if (dataFlow.hasLnbRecord()) {
|
||||||
lnbRecord.support = false;
|
lnbRecord.support = true;
|
||||||
|
} else {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto lnbRecordConfig = dataFlow.getFirstLnbRecord();
|
auto lnbRecordConfig = *dataFlow.getFirstLnbRecord();
|
||||||
lnbRecord.frontendId = lnbRecordConfig->getFrontendConnection();
|
lnbRecord.frontendId = lnbRecordConfig.getFrontendConnection();
|
||||||
|
lnbRecord.recordFilterId = lnbRecordConfig.getRecordFilterConnection();
|
||||||
|
lnbRecord.dvrRecordId = lnbRecordConfig.getDvrRecordConnection();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -350,6 +427,147 @@ struct TunerTestingConfigReader {
|
|||||||
return dvbsSettings;
|
return dvbsSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool readFilterTypeAndSettings(Filter filterConfig, DemuxFilterType& type,
|
||||||
|
DemuxFilterSettings& settings) {
|
||||||
|
auto mainType = filterConfig.getMainType();
|
||||||
|
auto subType = filterConfig.getSubType();
|
||||||
|
uint32_t pid = static_cast<uint32_t>(filterConfig.getPid());
|
||||||
|
switch (mainType) {
|
||||||
|
case FilterMainTypeEnum::TS: {
|
||||||
|
ALOGW("[ConfigReader] filter main type is ts");
|
||||||
|
type.mainType = DemuxFilterMainType::TS;
|
||||||
|
switch (subType) {
|
||||||
|
case FilterSubTypeEnum::UNDEFINED:
|
||||||
|
break;
|
||||||
|
case FilterSubTypeEnum::SECTION:
|
||||||
|
type.subType.tsFilterType(DemuxTsFilterType::SECTION);
|
||||||
|
settings.ts().filterSettings.section(
|
||||||
|
readSectionFilterSettings(filterConfig));
|
||||||
|
break;
|
||||||
|
case FilterSubTypeEnum::PES:
|
||||||
|
// TODO: b/182519645 support all the filter settings
|
||||||
|
/*settings.ts().filterSettings.pesData(
|
||||||
|
getPesFilterSettings(filterConfig));*/
|
||||||
|
type.subType.tsFilterType(DemuxTsFilterType::PES);
|
||||||
|
break;
|
||||||
|
case FilterSubTypeEnum::TS:
|
||||||
|
type.subType.tsFilterType(DemuxTsFilterType::TS);
|
||||||
|
settings.ts().filterSettings.noinit();
|
||||||
|
break;
|
||||||
|
case FilterSubTypeEnum::PCR:
|
||||||
|
type.subType.tsFilterType(DemuxTsFilterType::PCR);
|
||||||
|
settings.ts().filterSettings.noinit();
|
||||||
|
break;
|
||||||
|
case FilterSubTypeEnum::TEMI:
|
||||||
|
type.subType.tsFilterType(DemuxTsFilterType::TEMI);
|
||||||
|
settings.ts().filterSettings.noinit();
|
||||||
|
break;
|
||||||
|
case FilterSubTypeEnum::AUDIO:
|
||||||
|
type.subType.tsFilterType(DemuxTsFilterType::AUDIO);
|
||||||
|
settings.ts().filterSettings.av(readAvFilterSettings(filterConfig));
|
||||||
|
break;
|
||||||
|
case FilterSubTypeEnum::VIDEO:
|
||||||
|
type.subType.tsFilterType(DemuxTsFilterType::VIDEO);
|
||||||
|
settings.ts().filterSettings.av(readAvFilterSettings(filterConfig));
|
||||||
|
break;
|
||||||
|
case FilterSubTypeEnum::RECORD:
|
||||||
|
type.subType.tsFilterType(DemuxTsFilterType::RECORD);
|
||||||
|
settings.ts().filterSettings.record(readRecordFilterSettings(filterConfig));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ALOGW("[ConfigReader] ts subtype is not supported");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
settings.ts().tpid = pid;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case FilterMainTypeEnum::MMTP: {
|
||||||
|
ALOGW("[ConfigReader] filter main type is mmtp");
|
||||||
|
type.mainType = DemuxFilterMainType::MMTP;
|
||||||
|
switch (subType) {
|
||||||
|
case FilterSubTypeEnum::UNDEFINED:
|
||||||
|
break;
|
||||||
|
case FilterSubTypeEnum::SECTION:
|
||||||
|
type.subType.mmtpFilterType(DemuxMmtpFilterType::SECTION);
|
||||||
|
settings.mmtp().filterSettings.section(
|
||||||
|
readSectionFilterSettings(filterConfig));
|
||||||
|
break;
|
||||||
|
case FilterSubTypeEnum::PES:
|
||||||
|
type.subType.mmtpFilterType(DemuxMmtpFilterType::PES);
|
||||||
|
// TODO: b/182519645 support all the filter settings
|
||||||
|
/*settings.mmtp().filterSettings.pesData(
|
||||||
|
getPesFilterSettings(filterConfig));*/
|
||||||
|
break;
|
||||||
|
case FilterSubTypeEnum::MMTP:
|
||||||
|
type.subType.mmtpFilterType(DemuxMmtpFilterType::MMTP);
|
||||||
|
settings.mmtp().filterSettings.noinit();
|
||||||
|
break;
|
||||||
|
case FilterSubTypeEnum::AUDIO:
|
||||||
|
type.subType.mmtpFilterType(DemuxMmtpFilterType::AUDIO);
|
||||||
|
settings.mmtp().filterSettings.av(readAvFilterSettings(filterConfig));
|
||||||
|
break;
|
||||||
|
case FilterSubTypeEnum::VIDEO:
|
||||||
|
settings.mmtp().filterSettings.av(readAvFilterSettings(filterConfig));
|
||||||
|
break;
|
||||||
|
case FilterSubTypeEnum::RECORD:
|
||||||
|
type.subType.mmtpFilterType(DemuxMmtpFilterType::RECORD);
|
||||||
|
settings.mmtp().filterSettings.record(
|
||||||
|
readRecordFilterSettings(filterConfig));
|
||||||
|
break;
|
||||||
|
case FilterSubTypeEnum::DOWNLOAD:
|
||||||
|
type.subType.mmtpFilterType(DemuxMmtpFilterType::DOWNLOAD);
|
||||||
|
// TODO: b/182519645 support all the filter settings
|
||||||
|
/*settings.mmtp().filterSettings.download(
|
||||||
|
getDownloadFilterSettings(filterConfig));*/
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ALOGW("[ConfigReader] mmtp subtype is not supported");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
settings.mmtp().mmtpPid = pid;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
// TODO: b/182519645 support all the filter configs
|
||||||
|
ALOGW("[ConfigReader] filter main type is not supported in dynamic config");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DemuxFilterSectionSettings readSectionFilterSettings(Filter filterConfig) {
|
||||||
|
DemuxFilterSectionSettings settings;
|
||||||
|
if (!filterConfig.hasSectionFilterSettings_optional()) {
|
||||||
|
return settings;
|
||||||
|
}
|
||||||
|
auto section = filterConfig.getFirstSectionFilterSettings_optional();
|
||||||
|
settings.isCheckCrc = section->getIsCheckCrc();
|
||||||
|
settings.isRepeat = section->getIsRepeat();
|
||||||
|
settings.isRaw = section->getIsRaw();
|
||||||
|
return settings;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DemuxFilterAvSettings readAvFilterSettings(Filter filterConfig) {
|
||||||
|
DemuxFilterAvSettings settings;
|
||||||
|
if (!filterConfig.hasAvFilterSettings_optional()) {
|
||||||
|
return settings;
|
||||||
|
}
|
||||||
|
auto av = filterConfig.getFirstAvFilterSettings_optional();
|
||||||
|
settings.isPassthrough = av->getIsPassthrough();
|
||||||
|
return settings;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DemuxFilterRecordSettings readRecordFilterSettings(Filter filterConfig) {
|
||||||
|
DemuxFilterRecordSettings settings;
|
||||||
|
if (!filterConfig.hasRecordFilterSettings_optional()) {
|
||||||
|
return settings;
|
||||||
|
}
|
||||||
|
auto record = filterConfig.getFirstRecordFilterSettings_optional();
|
||||||
|
settings.tsIndexMask = static_cast<uint32_t>(record->getTsIndexMask());
|
||||||
|
settings.scIndexType = static_cast<DemuxRecordScIndexType>(record->getScIndexType());
|
||||||
|
return settings;
|
||||||
|
}
|
||||||
|
|
||||||
static PlaybackSettings readPlaybackSettings(Dvr dvrConfig) {
|
static PlaybackSettings readPlaybackSettings(Dvr dvrConfig) {
|
||||||
ALOGW("[ConfigReader] dvr type is playback");
|
ALOGW("[ConfigReader] dvr type is playback");
|
||||||
PlaybackSettings playbackSettings{
|
PlaybackSettings playbackSettings{
|
||||||
|
|||||||
@@ -1,6 +1,12 @@
|
|||||||
// Signature format: 2.0
|
// Signature format: 2.0
|
||||||
package android.media.tuner.testing.configuration.V1_0 {
|
package android.media.tuner.testing.configuration.V1_0 {
|
||||||
|
|
||||||
|
public class AvFilterSettings {
|
||||||
|
ctor public AvFilterSettings();
|
||||||
|
method @Nullable public boolean getIsPassthrough();
|
||||||
|
method public void setIsPassthrough(@Nullable boolean);
|
||||||
|
}
|
||||||
|
|
||||||
public class DataFlowConfiguration {
|
public class DataFlowConfiguration {
|
||||||
ctor public DataFlowConfiguration();
|
ctor public DataFlowConfiguration();
|
||||||
method @Nullable public android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.ClearLiveBroadcast getClearLiveBroadcast();
|
method @Nullable public android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.ClearLiveBroadcast getClearLiveBroadcast();
|
||||||
@@ -21,24 +27,42 @@ package android.media.tuner.testing.configuration.V1_0 {
|
|||||||
|
|
||||||
public static class DataFlowConfiguration.ClearLiveBroadcast {
|
public static class DataFlowConfiguration.ClearLiveBroadcast {
|
||||||
ctor public DataFlowConfiguration.ClearLiveBroadcast();
|
ctor public DataFlowConfiguration.ClearLiveBroadcast();
|
||||||
|
method @Nullable public String getAudioFilterConnection();
|
||||||
method @Nullable public String getDvrSoftwareFeConnection();
|
method @Nullable public String getDvrSoftwareFeConnection();
|
||||||
method @Nullable public String getFrontendConnection();
|
method @Nullable public String getFrontendConnection();
|
||||||
|
method @Nullable public String getPcrFilterConnection();
|
||||||
|
method @Nullable public String getSectionFilterConnection();
|
||||||
|
method @Nullable public String getVideoFilterConnection();
|
||||||
|
method public void setAudioFilterConnection(@Nullable String);
|
||||||
method public void setDvrSoftwareFeConnection(@Nullable String);
|
method public void setDvrSoftwareFeConnection(@Nullable String);
|
||||||
method public void setFrontendConnection(@Nullable String);
|
method public void setFrontendConnection(@Nullable String);
|
||||||
|
method public void setPcrFilterConnection(@Nullable String);
|
||||||
|
method public void setSectionFilterConnection(@Nullable String);
|
||||||
|
method public void setVideoFilterConnection(@Nullable String);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class DataFlowConfiguration.Descrambling {
|
public static class DataFlowConfiguration.Descrambling {
|
||||||
ctor public DataFlowConfiguration.Descrambling();
|
ctor public DataFlowConfiguration.Descrambling();
|
||||||
|
method @Nullable public String getAudioFilterConnection();
|
||||||
method @Nullable public String getDvrSoftwareFeConnection();
|
method @Nullable public String getDvrSoftwareFeConnection();
|
||||||
method @Nullable public String getFrontendConnection();
|
method @Nullable public String getFrontendConnection();
|
||||||
|
method @Nullable public String getVideoFilterConnection();
|
||||||
|
method public void setAudioFilterConnection(@Nullable String);
|
||||||
method public void setDvrSoftwareFeConnection(@Nullable String);
|
method public void setDvrSoftwareFeConnection(@Nullable String);
|
||||||
method public void setFrontendConnection(@Nullable String);
|
method public void setFrontendConnection(@Nullable String);
|
||||||
|
method public void setVideoFilterConnection(@Nullable String);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class DataFlowConfiguration.DvrPlayback {
|
public static class DataFlowConfiguration.DvrPlayback {
|
||||||
ctor public DataFlowConfiguration.DvrPlayback();
|
ctor public DataFlowConfiguration.DvrPlayback();
|
||||||
|
method @Nullable public String getAudioFilterConnection();
|
||||||
method @Nullable public String getDvrConnection();
|
method @Nullable public String getDvrConnection();
|
||||||
|
method @Nullable public String getSectionFilterConnection();
|
||||||
|
method @Nullable public String getVideoFilterConnection();
|
||||||
|
method public void setAudioFilterConnection(@Nullable String);
|
||||||
method public void setDvrConnection(@Nullable String);
|
method public void setDvrConnection(@Nullable String);
|
||||||
|
method public void setSectionFilterConnection(@Nullable String);
|
||||||
|
method public void setVideoFilterConnection(@Nullable String);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class DataFlowConfiguration.DvrRecord {
|
public static class DataFlowConfiguration.DvrRecord {
|
||||||
@@ -46,23 +70,31 @@ package android.media.tuner.testing.configuration.V1_0 {
|
|||||||
method @Nullable public String getDvrRecordConnection();
|
method @Nullable public String getDvrRecordConnection();
|
||||||
method @Nullable public String getDvrSoftwareFeConnection();
|
method @Nullable public String getDvrSoftwareFeConnection();
|
||||||
method @Nullable public String getFrontendConnection();
|
method @Nullable public String getFrontendConnection();
|
||||||
|
method @Nullable public String getRecordFilterConnection();
|
||||||
method public void setDvrRecordConnection(@Nullable String);
|
method public void setDvrRecordConnection(@Nullable String);
|
||||||
method public void setDvrSoftwareFeConnection(@Nullable String);
|
method public void setDvrSoftwareFeConnection(@Nullable String);
|
||||||
method public void setFrontendConnection(@Nullable String);
|
method public void setFrontendConnection(@Nullable String);
|
||||||
|
method public void setRecordFilterConnection(@Nullable String);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class DataFlowConfiguration.LnbLive {
|
public static class DataFlowConfiguration.LnbLive {
|
||||||
ctor public DataFlowConfiguration.LnbLive();
|
ctor public DataFlowConfiguration.LnbLive();
|
||||||
|
method @Nullable public String getAudioFilterConnection();
|
||||||
method @Nullable public String getFrontendConnection();
|
method @Nullable public String getFrontendConnection();
|
||||||
|
method @Nullable public String getVideoFilterConnection();
|
||||||
|
method public void setAudioFilterConnection(@Nullable String);
|
||||||
method public void setFrontendConnection(@Nullable String);
|
method public void setFrontendConnection(@Nullable String);
|
||||||
|
method public void setVideoFilterConnection(@Nullable String);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class DataFlowConfiguration.LnbRecord {
|
public static class DataFlowConfiguration.LnbRecord {
|
||||||
ctor public DataFlowConfiguration.LnbRecord();
|
ctor public DataFlowConfiguration.LnbRecord();
|
||||||
method @Nullable public String getDvrRecordConnection();
|
method @Nullable public String getDvrRecordConnection();
|
||||||
method @Nullable public String getFrontendConnection();
|
method @Nullable public String getFrontendConnection();
|
||||||
|
method @Nullable public String getRecordFilterConnection();
|
||||||
method public void setDvrRecordConnection(@Nullable String);
|
method public void setDvrRecordConnection(@Nullable String);
|
||||||
method public void setFrontendConnection(@Nullable String);
|
method public void setFrontendConnection(@Nullable String);
|
||||||
|
method public void setRecordFilterConnection(@Nullable String);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class DataFlowConfiguration.Scan {
|
public static class DataFlowConfiguration.Scan {
|
||||||
@@ -133,6 +165,49 @@ package android.media.tuner.testing.configuration.V1_0 {
|
|||||||
enum_constant public static final android.media.tuner.testing.configuration.V1_0.DvrTypeEnum RECORD;
|
enum_constant public static final android.media.tuner.testing.configuration.V1_0.DvrTypeEnum RECORD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class Filter {
|
||||||
|
ctor public Filter();
|
||||||
|
method @Nullable public android.media.tuner.testing.configuration.V1_0.AvFilterSettings getAvFilterSettings_optional();
|
||||||
|
method @Nullable public java.math.BigInteger getBufferSize();
|
||||||
|
method @Nullable public String getId();
|
||||||
|
method @Nullable public android.media.tuner.testing.configuration.V1_0.FilterMainTypeEnum getMainType();
|
||||||
|
method @Nullable public java.math.BigInteger getPid();
|
||||||
|
method @Nullable public android.media.tuner.testing.configuration.V1_0.RecordFilterSettings getRecordFilterSettings_optional();
|
||||||
|
method @Nullable public android.media.tuner.testing.configuration.V1_0.SectionFilterSettings getSectionFilterSettings_optional();
|
||||||
|
method @Nullable public android.media.tuner.testing.configuration.V1_0.FilterSubTypeEnum getSubType();
|
||||||
|
method @Nullable public boolean getUseFMQ();
|
||||||
|
method public void setAvFilterSettings_optional(@Nullable android.media.tuner.testing.configuration.V1_0.AvFilterSettings);
|
||||||
|
method public void setBufferSize(@Nullable java.math.BigInteger);
|
||||||
|
method public void setId(@Nullable String);
|
||||||
|
method public void setMainType(@Nullable android.media.tuner.testing.configuration.V1_0.FilterMainTypeEnum);
|
||||||
|
method public void setPid(@Nullable java.math.BigInteger);
|
||||||
|
method public void setRecordFilterSettings_optional(@Nullable android.media.tuner.testing.configuration.V1_0.RecordFilterSettings);
|
||||||
|
method public void setSectionFilterSettings_optional(@Nullable android.media.tuner.testing.configuration.V1_0.SectionFilterSettings);
|
||||||
|
method public void setSubType(@Nullable android.media.tuner.testing.configuration.V1_0.FilterSubTypeEnum);
|
||||||
|
method public void setUseFMQ(@Nullable boolean);
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum FilterMainTypeEnum {
|
||||||
|
method @NonNull public String getRawName();
|
||||||
|
enum_constant public static final android.media.tuner.testing.configuration.V1_0.FilterMainTypeEnum MMTP;
|
||||||
|
enum_constant public static final android.media.tuner.testing.configuration.V1_0.FilterMainTypeEnum TS;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum FilterSubTypeEnum {
|
||||||
|
method @NonNull public String getRawName();
|
||||||
|
enum_constant public static final android.media.tuner.testing.configuration.V1_0.FilterSubTypeEnum AUDIO;
|
||||||
|
enum_constant public static final android.media.tuner.testing.configuration.V1_0.FilterSubTypeEnum DOWNLOAD;
|
||||||
|
enum_constant public static final android.media.tuner.testing.configuration.V1_0.FilterSubTypeEnum MMTP;
|
||||||
|
enum_constant public static final android.media.tuner.testing.configuration.V1_0.FilterSubTypeEnum PCR;
|
||||||
|
enum_constant public static final android.media.tuner.testing.configuration.V1_0.FilterSubTypeEnum PES;
|
||||||
|
enum_constant public static final android.media.tuner.testing.configuration.V1_0.FilterSubTypeEnum RECORD;
|
||||||
|
enum_constant public static final android.media.tuner.testing.configuration.V1_0.FilterSubTypeEnum SECTION;
|
||||||
|
enum_constant public static final android.media.tuner.testing.configuration.V1_0.FilterSubTypeEnum TEMI;
|
||||||
|
enum_constant public static final android.media.tuner.testing.configuration.V1_0.FilterSubTypeEnum TS;
|
||||||
|
enum_constant public static final android.media.tuner.testing.configuration.V1_0.FilterSubTypeEnum UNDEFINED;
|
||||||
|
enum_constant public static final android.media.tuner.testing.configuration.V1_0.FilterSubTypeEnum VIDEO;
|
||||||
|
}
|
||||||
|
|
||||||
public class Frontend {
|
public class Frontend {
|
||||||
ctor public Frontend();
|
ctor public Frontend();
|
||||||
method @Nullable public java.math.BigInteger getConnectToCicamId();
|
method @Nullable public java.math.BigInteger getConnectToCicamId();
|
||||||
@@ -171,8 +246,10 @@ package android.media.tuner.testing.configuration.V1_0 {
|
|||||||
public class HardwareConfiguration {
|
public class HardwareConfiguration {
|
||||||
ctor public HardwareConfiguration();
|
ctor public HardwareConfiguration();
|
||||||
method @Nullable public android.media.tuner.testing.configuration.V1_0.HardwareConfiguration.Dvrs getDvrs();
|
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.Frontends getFrontends();
|
||||||
method public void setDvrs(@Nullable android.media.tuner.testing.configuration.V1_0.HardwareConfiguration.Dvrs);
|
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 setFrontends(@Nullable android.media.tuner.testing.configuration.V1_0.HardwareConfiguration.Frontends);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -181,11 +258,41 @@ package android.media.tuner.testing.configuration.V1_0 {
|
|||||||
method @Nullable public java.util.List<android.media.tuner.testing.configuration.V1_0.Dvr> getDvr();
|
method @Nullable public java.util.List<android.media.tuner.testing.configuration.V1_0.Dvr> getDvr();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class HardwareConfiguration.Filters {
|
||||||
|
ctor public HardwareConfiguration.Filters();
|
||||||
|
method @Nullable public java.util.List<android.media.tuner.testing.configuration.V1_0.Filter> getFilter();
|
||||||
|
}
|
||||||
|
|
||||||
public static class HardwareConfiguration.Frontends {
|
public static class HardwareConfiguration.Frontends {
|
||||||
ctor public HardwareConfiguration.Frontends();
|
ctor public HardwareConfiguration.Frontends();
|
||||||
method @Nullable public java.util.List<android.media.tuner.testing.configuration.V1_0.Frontend> getFrontend();
|
method @Nullable public java.util.List<android.media.tuner.testing.configuration.V1_0.Frontend> getFrontend();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class RecordFilterSettings {
|
||||||
|
ctor public RecordFilterSettings();
|
||||||
|
method @Nullable public android.media.tuner.testing.configuration.V1_0.ScIndexTypeEnum getScIndexType();
|
||||||
|
method @Nullable public java.math.BigInteger getTsIndexMask();
|
||||||
|
method public void setScIndexType(@Nullable android.media.tuner.testing.configuration.V1_0.ScIndexTypeEnum);
|
||||||
|
method public void setTsIndexMask(@Nullable java.math.BigInteger);
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum ScIndexTypeEnum {
|
||||||
|
method @NonNull public String getRawName();
|
||||||
|
enum_constant public static final android.media.tuner.testing.configuration.V1_0.ScIndexTypeEnum NONE;
|
||||||
|
enum_constant public static final android.media.tuner.testing.configuration.V1_0.ScIndexTypeEnum SC;
|
||||||
|
enum_constant public static final android.media.tuner.testing.configuration.V1_0.ScIndexTypeEnum SC_HEVC;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class SectionFilterSettings {
|
||||||
|
ctor public SectionFilterSettings();
|
||||||
|
method @Nullable public boolean getIsCheckCrc();
|
||||||
|
method @Nullable public boolean getIsRaw();
|
||||||
|
method @Nullable public boolean getIsRepeat();
|
||||||
|
method public void setIsCheckCrc(@Nullable boolean);
|
||||||
|
method public void setIsRaw(@Nullable boolean);
|
||||||
|
method public void setIsRepeat(@Nullable boolean);
|
||||||
|
}
|
||||||
|
|
||||||
public class TunerConfiguration {
|
public class TunerConfiguration {
|
||||||
ctor public TunerConfiguration();
|
ctor public TunerConfiguration();
|
||||||
method @Nullable public android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration getDataFlowConfiguration();
|
method @Nullable public android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration getDataFlowConfiguration();
|
||||||
|
|||||||
@@ -60,6 +60,51 @@
|
|||||||
connectToCicamId="0" frequency="578000" endFrequency="800000">
|
connectToCicamId="0" frequency="578000" endFrequency="800000">
|
||||||
</frontend>
|
</frontend>
|
||||||
</frontends>
|
</frontends>
|
||||||
|
<!-- Filter section:
|
||||||
|
This section contains configurations of all the filters that would be used in the tests.
|
||||||
|
- This section is optional and can be skipped to use the default filter settings.
|
||||||
|
- The default settings can be found in the sample_tuner_vts_configurations.xml.
|
||||||
|
- The users can also override the default filter settings using
|
||||||
|
- id="FILTER_AUDIO_DEFAULT" or "FILTER_VIDEO_DEFAULT".
|
||||||
|
- The users can configure 1 or more filter elements in the filters sections.
|
||||||
|
|
||||||
|
Each filter element contain the following attributes:
|
||||||
|
"id": unique id of the filter that could be used to connect to the test the
|
||||||
|
"dataFlowConfiguration"
|
||||||
|
"mainType": the main filter type. The enums are defined in the xsd.
|
||||||
|
"subType": the sub filter type. The enums are defined in the xsd.
|
||||||
|
"bufferSize": the buffer size of the filter in hex.
|
||||||
|
"pid": the pid that would be used to configure the filter.
|
||||||
|
"useFMQ": if the filter uses FMQ.
|
||||||
|
|
||||||
|
Each filter element also contains at most one type-related "filterSettings".
|
||||||
|
- The settings type should match the filter "subType" attribute.
|
||||||
|
- For example, when filter subType is audio or video, the avFilterSettings can be
|
||||||
|
configured.
|
||||||
|
- This is optional and skipping the settings would pass a setting with tpid config
|
||||||
|
only to the hal.
|
||||||
|
-->
|
||||||
|
<filters>
|
||||||
|
<filter id="FILTER_AUDIO_DEFAULT" mainType="TS" subType="AUDIO"
|
||||||
|
bufferSize="16777216" pid="257" useFMQ="false">
|
||||||
|
<avFilterSettings isPassthrough="false"/>
|
||||||
|
</filter>
|
||||||
|
<filter id="FILTER_VIDEO_DEFAULT" mainType="TS" subType="VIDEO"
|
||||||
|
bufferSize="16777216" pid="256" useFMQ="false">
|
||||||
|
<avFilterSettings isPassthrough="false"/>
|
||||||
|
</filter>
|
||||||
|
<filter id="FILTER_TS_RECORD_0" mainType="TS" subType="RECORD"
|
||||||
|
bufferSize="16777216" pid="257" useFMQ="false">
|
||||||
|
<recordFilterSettings tsIndexMask="1" scIndexType="NONE"/>
|
||||||
|
</filter>
|
||||||
|
<filter id="FILTER_TS_SECTION_0" mainType="TS" subType="SECTION"
|
||||||
|
bufferSize="16777216" pid="257" useFMQ="true">
|
||||||
|
<sectionFilterSettings isCheckCrc="false" isRepeat="false" isRaw="false"/>
|
||||||
|
</filter>
|
||||||
|
<filter id="FILTER_TS_PCR_0" mainType="TS" subType="PCR"
|
||||||
|
bufferSize="16777216" pid="256" useFMQ="false">
|
||||||
|
</filter>
|
||||||
|
</filters>
|
||||||
<!-- Dvr section:
|
<!-- Dvr section:
|
||||||
This section contains configurations of all the dvrs that would be used in the tests.
|
This section contains configurations of all the dvrs that would be used in the tests.
|
||||||
- This section is optional and can be skipped if DVR is not supported.
|
- This section is optional and can be skipped if DVR is not supported.
|
||||||
@@ -94,15 +139,29 @@
|
|||||||
hardwares that would be used during the tests. -->
|
hardwares that would be used during the tests. -->
|
||||||
<dataFlowConfiguration>
|
<dataFlowConfiguration>
|
||||||
<clearLiveBroadcast frontendConnection="FE_DEFAULT"
|
<clearLiveBroadcast frontendConnection="FE_DEFAULT"
|
||||||
|
audioFilterConnection="FILTER_AUDIO_DEFAULT"
|
||||||
|
videoFilterConnection="FILTER_VIDEO_DEFAULT"
|
||||||
|
pcrFilterConnection="FILTER_TS_PCR_0"
|
||||||
|
sectionFilterConnection="FILTER_TS_SECTION_0"
|
||||||
dvrSoftwareFeConnection="DVR_PLAYBACK_0"/>
|
dvrSoftwareFeConnection="DVR_PLAYBACK_0"/>
|
||||||
<scan frontendConnection="FE_DEFAULT"/>
|
<scan frontendConnection="FE_DEFAULT"/>
|
||||||
<descrambling frontendConnection="FE_DEFAULT"
|
<descrambling frontendConnection="FE_DEFAULT"
|
||||||
|
audioFilterConnection="FILTER_AUDIO_DEFAULT"
|
||||||
|
videoFilterConnection="FILTER_VIDEO_DEFAULT"
|
||||||
dvrSoftwareFeConnection="DVR_PLAYBACK_0"/>
|
dvrSoftwareFeConnection="DVR_PLAYBACK_0"/>
|
||||||
|
<dvrPlayback dvrConnection="DVR_PLAYBACK_0"
|
||||||
|
audioFilterConnection="FILTER_AUDIO_DEFAULT"
|
||||||
|
videoFilterConnection="FILTER_VIDEO_DEFAULT"
|
||||||
|
sectionFilterConnection="FILTER_TS_SECTION_0"/>
|
||||||
<dvrRecord frontendConnection="FE_DEFAULT"
|
<dvrRecord frontendConnection="FE_DEFAULT"
|
||||||
|
recordFilterConnection="FILTER_TS_RECORD_0"
|
||||||
dvrRecordConnection="DVR_RECORD_0"
|
dvrRecordConnection="DVR_RECORD_0"
|
||||||
dvrSoftwareFeConnection="DVR_PLAYBACK_0"/>
|
dvrSoftwareFeConnection="DVR_PLAYBACK_0"/>
|
||||||
<lnbLive frontendConnection="FE_DVBS_0"/>
|
<lnbLive frontendConnection="FE_DVBS_0"
|
||||||
<lnbRecord frontendConnection="FE_DVBS_0"
|
audioFilterConnection="FILTER_AUDIO_DEFAULT"
|
||||||
dvrRecordConnection="DVR_RECORD_0"/>
|
videoFilterConnection="FILTER_VIDEO_DEFAULT"/>
|
||||||
|
<lnbRecord frontendConnection="FE_DVBS_0"
|
||||||
|
recordFilterConnection="FILTER_TS_RECORD_0"
|
||||||
|
dvrRecordConnection="DVR_RECORD_0"/>
|
||||||
</dataFlowConfiguration>
|
</dataFlowConfiguration>
|
||||||
</TunerConfiguration>
|
</TunerConfiguration>
|
||||||
|
|||||||
@@ -85,7 +85,7 @@
|
|||||||
</xs:documentation>
|
</xs:documentation>
|
||||||
</xs:annotation>
|
</xs:annotation>
|
||||||
<xs:choice minOccurs="0" maxOccurs="1">
|
<xs:choice minOccurs="0" maxOccurs="1">
|
||||||
<!-- TODO: finish all the frontend settings structures. -->
|
<!-- TODO: b/182519645 finish all the frontend settings structures. -->
|
||||||
<!--xs:element name="analog" type="analogSettings"/>
|
<!--xs:element name="analog" type="analogSettings"/>
|
||||||
<xs:element name="atsc" type="atscSettings"/>
|
<xs:element name="atsc" type="atscSettings"/>
|
||||||
<xs:element name="atsc3" type="atsc3Settings"/>
|
<xs:element name="atsc3" type="atsc3Settings"/>
|
||||||
@@ -107,6 +107,112 @@
|
|||||||
<xs:attribute name="endFrequency" type="xs:nonNegativeInteger" use="optional"/>
|
<xs:attribute name="endFrequency" type="xs:nonNegativeInteger" use="optional"/>
|
||||||
</xs:complexType>
|
</xs:complexType>
|
||||||
|
|
||||||
|
<!-- FILTER SESSION -->
|
||||||
|
<xs:simpleType name="filterId">
|
||||||
|
<!-- Filter id must be either FILTER_AUDIO_DEFAULT or FILTER_VIDEO_DEFAULT
|
||||||
|
or FILTER_MAINTYPE_SUBTYPE_NUM
|
||||||
|
<filter id="FILTER_TS_AUDIO_0"/>
|
||||||
|
-->
|
||||||
|
<xs:restriction base="xs:string">
|
||||||
|
<xs:pattern value="FILTER_AUDIO_DEFAULT|FILTER_VIDEO_DEFAULT|FILTER_[A-Z]+_[A-Z]+_[0-9]+"/>
|
||||||
|
</xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
<!-- A list of filter ids that could be used in the data flow configurations to connect
|
||||||
|
filters under testing. -->
|
||||||
|
<xs:simpleType name="filterConnections">
|
||||||
|
<xs:list itemType="filterId" />
|
||||||
|
</xs:simpleType>
|
||||||
|
<!-- DemuxFilterRecordSettings::tsIndexMask -->
|
||||||
|
<xs:simpleType name="tsIndexMask">
|
||||||
|
<xs:restriction base="xs:integer">
|
||||||
|
<xs:minInclusive value="0"/>
|
||||||
|
<xs:maxInclusive value="8191"/>
|
||||||
|
</xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
<!-- DemuxFilterRecordSettings::scIndexType -->
|
||||||
|
<xs:simpleType name="scIndexTypeEnum">
|
||||||
|
<xs:restriction base="xs:string">
|
||||||
|
<xs:enumeration value="NONE" />
|
||||||
|
<xs:enumeration value="SC" />
|
||||||
|
<xs:enumeration value="SC_HEVC"/>
|
||||||
|
</xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
|
||||||
|
<xs:simpleType name="filterMainTypeEnum">
|
||||||
|
<xs:restriction base="xs:string">
|
||||||
|
<xs:enumeration value="TS" />
|
||||||
|
<xs:enumeration value="MMTP" />
|
||||||
|
<!-- TODO: b/182519645 Support IP/TLV/ALP filter config
|
||||||
|
<xs:enumeration value="IP"/>
|
||||||
|
<xs:enumeration value="TLV"/>
|
||||||
|
<xs:enumeration value="ALP"/-->
|
||||||
|
</xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
<xs:simpleType name="filterSubTypeEnum">
|
||||||
|
<xs:restriction base="xs:string">
|
||||||
|
<xs:enumeration value="UNDEFINED" />
|
||||||
|
<xs:enumeration value="SECTION" />
|
||||||
|
<xs:enumeration value="PES" />
|
||||||
|
<xs:enumeration value="TS"/>
|
||||||
|
<xs:enumeration value="AUDIO"/>
|
||||||
|
<xs:enumeration value="VIDEO"/>
|
||||||
|
<xs:enumeration value="PCR"/>
|
||||||
|
<xs:enumeration value="RECORD"/>
|
||||||
|
<xs:enumeration value="TEMI"/>
|
||||||
|
<xs:enumeration value="MMTP"/>
|
||||||
|
<xs:enumeration value="DOWNLOAD"/>
|
||||||
|
</xs:restriction>
|
||||||
|
</xs:simpleType>
|
||||||
|
|
||||||
|
<xs:complexType name="avFilterSettings">
|
||||||
|
<xs:attribute name="isPassthrough" type="xs:boolean" use="required"/>
|
||||||
|
</xs:complexType>
|
||||||
|
<xs:complexType name="sectionFilterSettings">
|
||||||
|
<xs:attribute name="isCheckCrc" type="xs:boolean" use="required"/>
|
||||||
|
<xs:attribute name="isRepeat" type="xs:boolean" use="required"/>
|
||||||
|
<xs:attribute name="isRaw" type="xs:boolean" use="required"/>
|
||||||
|
</xs:complexType>
|
||||||
|
<xs:complexType name="recordFilterSettings">
|
||||||
|
<xs:attribute name="tsIndexMask" type="tsIndexMask" use="required"/>
|
||||||
|
<xs:attribute name="scIndexType" type="scIndexTypeEnum" use="required"/>
|
||||||
|
</xs:complexType>
|
||||||
|
|
||||||
|
<xs:complexType name="filter">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>
|
||||||
|
Each filter element contain the following attributes:
|
||||||
|
"id": unique id of the filter that could be used to connect to the test the
|
||||||
|
"dataFlowConfiguration"
|
||||||
|
"mainType": the main filter type. The enums are defined in the xsd.
|
||||||
|
"subType": the sub filter type. The enums are defined in the xsd.
|
||||||
|
"bufferSize": the buffer size of the filter in hex.
|
||||||
|
"pid": the pid that would be used to configure the filter.
|
||||||
|
"useFMQ": if the filter uses FMQ.
|
||||||
|
|
||||||
|
Each filter element also contains at most one type-related "filterSettings".
|
||||||
|
- The settings type should match the filter "subType" attribute.
|
||||||
|
- For example, when filter subType is audio or video, the avFilterSettings
|
||||||
|
can be configured.
|
||||||
|
- This is optional and skipping the settings would pass a setting with tpid
|
||||||
|
config only to the hal.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
<xs:choice minOccurs="0" maxOccurs="1">
|
||||||
|
<!-- TODO: b/182519645 finish all the filter settings structures. -->
|
||||||
|
<xs:element name="sectionFilterSettings" type="sectionFilterSettings"/>
|
||||||
|
<xs:element name="avFilterSettings" type="avFilterSettings"/>
|
||||||
|
<xs:element name="recordFilterSettings" type="recordFilterSettings"/>
|
||||||
|
<!--xs:element name="pes" type="pesFilterSettings"/>
|
||||||
|
<xs:element name="download" type="downloadFilterSettings"/-->
|
||||||
|
</xs:choice>
|
||||||
|
<xs:attribute name="id" type="filterId" use="required"/>
|
||||||
|
<xs:attribute name="mainType" type="filterMainTypeEnum" use="required"/>
|
||||||
|
<xs:attribute name="subType" type="filterSubTypeEnum" use="required"/>
|
||||||
|
<xs:attribute name="bufferSize" type="xs:nonNegativeInteger" use="required"/>
|
||||||
|
<xs:attribute name="pid" type="xs:nonNegativeInteger" use="optional"/>
|
||||||
|
<xs:attribute name="useFMQ" type="xs:boolean" use="required"/>
|
||||||
|
</xs:complexType>
|
||||||
|
|
||||||
<!-- DVR SESSION -->
|
<!-- DVR SESSION -->
|
||||||
<xs:simpleType name="dvrId">
|
<xs:simpleType name="dvrId">
|
||||||
<!-- Dvr id must be DVR_TYPE_NUM. <dvr id="DVR_PLAYBACK_0"/> -->
|
<!-- Dvr id must be DVR_TYPE_NUM. <dvr id="DVR_PLAYBACK_0"/> -->
|
||||||
@@ -197,6 +303,27 @@
|
|||||||
</xs:sequence>
|
</xs:sequence>
|
||||||
</xs:complexType>
|
</xs:complexType>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
|
<xs:element name="filters" minOccurs="0" maxOccurs="1">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation xml:lang="en">
|
||||||
|
This section contains configurations of all the filters that would be
|
||||||
|
used in the tests.
|
||||||
|
- This section is optional and can be skipped to use the default
|
||||||
|
filter settings.
|
||||||
|
- The default settings can be found in the
|
||||||
|
sample_tuner_vts_configurations.xml.
|
||||||
|
- The users can also override the default filter settings using
|
||||||
|
- id="FILTER_AUDIO_DEFAULT" or "FILTER_VIDEO_DEFAULT".
|
||||||
|
- The users can configure 1 or more filter elements in the filters
|
||||||
|
sections.
|
||||||
|
</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
<xs:sequence>
|
||||||
|
<xs:element name="filter" type="filter" minOccurs="1" maxOccurs="unbounded"/>
|
||||||
|
</xs:sequence>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
<xs:element name="dvrs" minOccurs="0" maxOccurs="1">
|
<xs:element name="dvrs" minOccurs="0" maxOccurs="1">
|
||||||
<xs:complexType>
|
<xs:complexType>
|
||||||
<xs:annotation>
|
<xs:annotation>
|
||||||
@@ -223,6 +350,11 @@
|
|||||||
<xs:element name="clearLiveBroadcast" minOccurs="1" maxOccurs="1">
|
<xs:element name="clearLiveBroadcast" minOccurs="1" maxOccurs="1">
|
||||||
<xs:complexType>
|
<xs:complexType>
|
||||||
<xs:attribute name="frontendConnection" type="frontendId" use="required"/>
|
<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="pcrFilterConnection" type="filterId" use="optional"/>
|
||||||
|
<xs:attribute name="sectionFilterConnection" type="filterId" use="optional"/>
|
||||||
|
<!-- TODO: b/182519645 allow the users to insert extra filters -->
|
||||||
<!-- DVR is only required when the frontend is using the software input -->
|
<!-- DVR is only required when the frontend is using the software input -->
|
||||||
<xs:attribute name="dvrSoftwareFeConnection" type="dvrId" use="optional"/>
|
<xs:attribute name="dvrSoftwareFeConnection" type="dvrId" use="optional"/>
|
||||||
</xs:complexType>
|
</xs:complexType>
|
||||||
@@ -235,6 +367,9 @@
|
|||||||
<xs:element name="descrambling" minOccurs="0" maxOccurs="1">
|
<xs:element name="descrambling" minOccurs="0" maxOccurs="1">
|
||||||
<xs:complexType>
|
<xs:complexType>
|
||||||
<xs:attribute name="frontendConnection" type="frontendId" use="required"/>
|
<xs:attribute name="frontendConnection" type="frontendId" use="required"/>
|
||||||
|
<xs:attribute name="audioFilterConnection" type="filterId" use="required"/>
|
||||||
|
<xs:attribute name="videoFilterConnection" type="filterId" use="required"/>
|
||||||
|
<!-- TODO: b/182519645 allow the users to insert extra filters -->
|
||||||
<!-- DVR is only required when the frontend is using the software input -->
|
<!-- DVR is only required when the frontend is using the software input -->
|
||||||
<xs:attribute name="dvrSoftwareFeConnection" type="dvrId" use="optional"/>
|
<xs:attribute name="dvrSoftwareFeConnection" type="dvrId" use="optional"/>
|
||||||
</xs:complexType>
|
</xs:complexType>
|
||||||
@@ -242,6 +377,10 @@
|
|||||||
<xs:element name="dvrPlayback" minOccurs="0" maxOccurs="1">
|
<xs:element name="dvrPlayback" minOccurs="0" maxOccurs="1">
|
||||||
<xs:complexType>
|
<xs:complexType>
|
||||||
<xs:attribute name="dvrConnection" type="dvrId" use="required"/>
|
<xs:attribute name="dvrConnection" type="dvrId" use="required"/>
|
||||||
|
<xs:attribute name="audioFilterConnection" type="filterId" use="required"/>
|
||||||
|
<xs:attribute name="videoFilterConnection" type="filterId" use="required"/>
|
||||||
|
<xs:attribute name="sectionFilterConnection" type="filterId" use="optional"/>
|
||||||
|
<!-- TODO: b/182519645 allow the users to insert extra filters -->
|
||||||
</xs:complexType>
|
</xs:complexType>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
<xs:element name="dvrRecord" minOccurs="0" maxOccurs="1">
|
<xs:element name="dvrRecord" minOccurs="0" maxOccurs="1">
|
||||||
@@ -250,16 +389,21 @@
|
|||||||
<xs:attribute name="dvrRecordConnection" type="dvrId" use="required"/>
|
<xs:attribute name="dvrRecordConnection" type="dvrId" use="required"/>
|
||||||
<!-- DVR is only required when the frontend is using the software input -->
|
<!-- DVR is only required when the frontend is using the software input -->
|
||||||
<xs:attribute name="dvrSoftwareFeConnection" type="dvrId" use="optional"/>
|
<xs:attribute name="dvrSoftwareFeConnection" type="dvrId" use="optional"/>
|
||||||
|
<xs:attribute name="recordFilterConnection" type="filterId" use="required"/>
|
||||||
</xs:complexType>
|
</xs:complexType>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
<xs:element name="lnbLive" minOccurs="0" maxOccurs="1">
|
<xs:element name="lnbLive" minOccurs="0" maxOccurs="1">
|
||||||
<xs:complexType>
|
<xs:complexType>
|
||||||
<xs:attribute name="frontendConnection" type="frontendId" use="required"/>
|
<xs:attribute name="frontendConnection" type="frontendId" use="required"/>
|
||||||
|
<xs:attribute name="audioFilterConnection" type="filterId" use="required"/>
|
||||||
|
<xs:attribute name="videoFilterConnection" type="filterId" use="required"/>
|
||||||
|
<!-- TODO: b/182519645 allow the users to insert extra filters -->
|
||||||
</xs:complexType>
|
</xs:complexType>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
<xs:element name="lnbRecord" minOccurs="0" maxOccurs="1">
|
<xs:element name="lnbRecord" minOccurs="0" maxOccurs="1">
|
||||||
<xs:complexType>
|
<xs:complexType>
|
||||||
<xs:attribute name="frontendConnection" type="frontendId" use="required"/>
|
<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="dvrRecordConnection" type="dvrId" use="required"/>
|
||||||
</xs:complexType>
|
</xs:complexType>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
@@ -279,5 +423,13 @@
|
|||||||
<xs:selector xpath="hardwareConfiguration/frontends/frontend"/>
|
<xs:selector xpath="hardwareConfiguration/frontends/frontend"/>
|
||||||
<xs:field xpath="@id"/>
|
<xs:field xpath="@id"/>
|
||||||
</xs:key>
|
</xs:key>
|
||||||
|
<xs:key name="filterIdUniqueness">
|
||||||
|
<xs:selector xpath="hardwareConfiguration/filters/filter"/>
|
||||||
|
<xs:field xpath="@id"/>
|
||||||
|
</xs:key>
|
||||||
|
<xs:key name="dvrIdUniqueness">
|
||||||
|
<xs:selector xpath="hardwareConfiguration/dvrs/dvr"/>
|
||||||
|
<xs:field xpath="@id"/>
|
||||||
|
</xs:key>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
</xs:schema>
|
</xs:schema>
|
||||||
|
|||||||
Reference in New Issue
Block a user