Add descrambler dynamic configuration into Tuner 1.0 VTS

Test: atest VtsHalTvTunerV1_0TargetTest
Bug: 182519645
CTS-Coverage-Bug: 184077478
Change-Id: I2ab16fa9645dba07f8969e3cd7a26cf3b9bcb527
This commit is contained in:
Amy Zhang 2021-04-02 15:01:17 -07:00
parent c0e9a11256
commit 32b6f9eaf0
7 changed files with 182 additions and 78 deletions

View file

@ -441,11 +441,9 @@ TEST_P(TunerFilterHidlTest, SetFilterLinkage) {
if (caps.linkCaps[i] & (bitMask << j)) {
uint32_t sourceFilterId;
uint32_t sinkFilterId;
ASSERT_TRUE(mFilterTests.openFilterInDemux(filterLinkageTypes[SOURCE][i],
FMQ_SIZE_16M));
ASSERT_TRUE(mFilterTests.openFilterInDemux(getLinkageFilterType(i), FMQ_SIZE_16M));
ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId(sourceFilterId));
ASSERT_TRUE(
mFilterTests.openFilterInDemux(filterLinkageTypes[SINK][j], FMQ_SIZE_16M));
ASSERT_TRUE(mFilterTests.openFilterInDemux(getLinkageFilterType(j), FMQ_SIZE_16M));
ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId(sinkFilterId));
ASSERT_TRUE(mFilterTests.setFilterDataSource(sourceFilterId, sinkFilterId));
ASSERT_TRUE(mFilterTests.setFilterDataSourceToDemux(sinkFilterId));
@ -561,7 +559,7 @@ TEST_P(TunerDescramblerHidlTest, ScrambledBroadcastDataFlowMediaFiltersTest) {
filterConfs.insert(static_cast<FilterConfig>(filterMap[descrambling.audioFilterId]));
filterConfs.insert(static_cast<FilterConfig>(filterMap[descrambling.videoFilterId]));
scrambledBroadcastTest(filterConfs, frontendMap[descrambling.frontendId],
descramblerArray[DESC_0]);
descramblerMap[descrambling.descramblerId]);
}
INSTANTIATE_TEST_SUITE_P(

View file

@ -20,6 +20,9 @@
#include "LnbTests.h"
using android::hardware::tv::tuner::V1_0::DataFormat;
using android::hardware::tv::tuner::V1_0::DemuxAlpFilterType;
using android::hardware::tv::tuner::V1_0::DemuxMmtpFilterType;
using android::hardware::tv::tuner::V1_0::DemuxTlvFilterType;
using android::hardware::tv::tuner::V1_0::IDescrambler;
static AssertionResult success() {
@ -37,14 +40,12 @@ bool initConfiguration() {
initDvrConfig();
initLnbConfig();
initTimeFilterConfig();
initDescramblerConfig();
connectHardwaresToTestCases();
if (!validateConnections()) {
ALOGW("[vts] failed to validate connections.");
return false;
}
initDescramblerConfig();
return true;
}
@ -148,6 +149,29 @@ class TunerFilterHidlTest : public testing::TestWithParam<std::string> {
void configSingleFilterInDemuxTest(FilterConfig filterConf, FrontendConfig frontendConf);
void testTimeFilter(TimeFilterConfig filterConf);
DemuxFilterType getLinkageFilterType(int bit) {
DemuxFilterType type;
type.mainType = static_cast<DemuxFilterMainType>(1 << bit);
switch (type.mainType) {
case DemuxFilterMainType::TS:
type.subType.tsFilterType(DemuxTsFilterType::UNDEFINED);
break;
case DemuxFilterMainType::MMTP:
type.subType.mmtpFilterType(DemuxMmtpFilterType::UNDEFINED);
break;
case DemuxFilterMainType::IP:
type.subType.ipFilterType(DemuxIpFilterType::UNDEFINED);
break;
case DemuxFilterMainType::TLV:
type.subType.tlvFilterType(DemuxTlvFilterType::UNDEFINED);
break;
case DemuxFilterMainType::ALP:
type.subType.alpFilterType(DemuxAlpFilterType::UNDEFINED);
break;
}
return type;
}
sp<ITuner> mService;
FrontendTests mFrontendTests;
DemuxTests mDemuxTests;

View file

@ -23,82 +23,23 @@
#include "../../../config/TunerTestingConfigReader.h"
// TODO: remove unnecessary imports after config reader refactoring is done.
using android::hardware::tv::tuner::V1_0::DataFormat;
using android::hardware::tv::tuner::V1_0::DemuxAlpFilterType;
using android::hardware::tv::tuner::V1_0::DemuxFilterEvent;
using android::hardware::tv::tuner::V1_0::DemuxFilterMainType;
using android::hardware::tv::tuner::V1_0::DemuxFilterSettings;
using android::hardware::tv::tuner::V1_0::DemuxFilterType;
using android::hardware::tv::tuner::V1_0::DemuxIpFilterType;
using android::hardware::tv::tuner::V1_0::DemuxMmtpFilterType;
using android::hardware::tv::tuner::V1_0::DemuxRecordScIndexType;
using android::hardware::tv::tuner::V1_0::DemuxTlvFilterType;
using android::hardware::tv::tuner::V1_0::DemuxTpid;
using android::hardware::tv::tuner::V1_0::DemuxTsFilterType;
using android::hardware::tv::tuner::V1_0::DvrSettings;
using android::hardware::tv::tuner::V1_0::DvrType;
using android::hardware::tv::tuner::V1_0::FrontendDvbtBandwidth;
using android::hardware::tv::tuner::V1_0::FrontendDvbtCoderate;
using android::hardware::tv::tuner::V1_0::FrontendDvbtConstellation;
using android::hardware::tv::tuner::V1_0::FrontendDvbtGuardInterval;
using android::hardware::tv::tuner::V1_0::FrontendDvbtHierarchy;
using android::hardware::tv::tuner::V1_0::FrontendDvbtSettings;
using android::hardware::tv::tuner::V1_0::FrontendDvbtStandard;
using android::hardware::tv::tuner::V1_0::FrontendDvbtTransmissionMode;
using android::hardware::tv::tuner::V1_0::FrontendSettings;
using android::hardware::tv::tuner::V1_0::FrontendStatus;
using android::hardware::tv::tuner::V1_0::FrontendStatusType;
using android::hardware::tv::tuner::V1_0::FrontendType;
using android::hardware::tv::tuner::V1_0::LnbPosition;
using android::hardware::tv::tuner::V1_0::LnbTone;
using android::hardware::tv::tuner::V1_0::LnbVoltage;
using android::hardware::tv::tuner::V1_0::PlaybackSettings;
using android::hardware::tv::tuner::V1_0::RecordSettings;
using namespace std;
using namespace android::media::tuner::testing::configuration::V1_0;
// TODO: remove all the constants and structs after config reader refactoring is done.
const uint32_t FMQ_SIZE_512K = 0x80000;
const uint32_t FMQ_SIZE_1M = 0x100000;
const uint32_t FMQ_SIZE_4M = 0x400000;
const uint32_t FMQ_SIZE_16M = 0x1000000;
#define CLEAR_KEY_SYSTEM_ID 0xF6D8
#define FILTER_MAIN_TYPE_BIT_COUNT 32
#define PROVISION_STR \
"{ " \
" \"id\": 21140844, " \
" \"name\": \"Test Title\", " \
" \"lowercase_organization_name\": \"Android\", " \
" \"asset_key\": { " \
" \"encryption_key\": \"nezAr3CHFrmBR9R8Tedotw==\" " \
" }, " \
" \"cas_type\": 1, " \
" \"track_types\": [ ] " \
"} "
typedef enum {
SOURCE,
SINK,
LINKAGE_DIR,
} Linkage;
typedef enum {
DESC_0,
DESC_MAX,
} Descrambler;
struct DescramblerConfig {
uint32_t casSystemId;
string provisionStr;
vector<uint8_t> hidlPvtData;
};
// TODO: remove all the manual config array after the dynamic config refactoring is done.
static DemuxFilterType filterLinkageTypes[LINKAGE_DIR][FILTER_MAIN_TYPE_BIT_COUNT];
static DescramblerConfig descramblerArray[DESC_MAX];
#define FILTER_MAIN_TYPE_BIT_COUNT 5
// Hardware configs
static map<string, FrontendConfig> frontendMap;
@ -107,6 +48,7 @@ static map<string, DvrConfig> dvrMap;
static map<string, LnbConfig> lnbMap;
static map<string, TimeFilterConfig> timeFilterMap;
static map<string, vector<uint8_t>> diseqcMsgMap;
static map<string, DescramblerConfig> descramblerMap;
// Hardware and test cases connections
static LiveBroadcastHardwareConnections live;
@ -187,6 +129,12 @@ inline void initTimeFilterConfig() {
TunerTestingConfigReader::readTimeFilterConfig1_0(timeFilterMap);
};
/** Config all the descramblers that would be used in the tests */
inline void initDescramblerConfig() {
// Read customized config
TunerTestingConfigReader::readDescramblerConfig1_0(descramblerMap);
};
/** Read the vendor configurations of which hardware to use for each test cases/data flows */
inline void connectHardwaresToTestCases() {
TunerTestingConfigReader::connectLiveBroadcast(live);
@ -265,6 +213,16 @@ inline bool validateConnections() {
return false;
}
bool descramblerIsValid =
descrambling.support
? descramblerMap.find(descrambling.descramblerId) != descramblerMap.end()
: true;
if (!descramblerIsValid) {
ALOGW("[vts config] dynamic config descrambler connection is invalid.");
return false;
}
bool diseqcMsgIsValid = true;
if (lnbLive.support) {
for (auto msgName : lnbLive.diseqcMsgs) {
@ -284,11 +242,3 @@ inline bool validateConnections() {
return true;
}
// TODO: remove all the manual configs after the dynamic config refactoring is done.
/** Configuration array for the descrambler test */
inline void initDescramblerConfig() {
descramblerArray[DESC_0].casSystemId = CLEAR_KEY_SYSTEM_ID;
descramblerArray[DESC_0].provisionStr = PROVISION_STR;
descramblerArray[DESC_0].hidlPvtData.resize(256);
};

View file

@ -66,6 +66,18 @@ using android::hardware::tv::tuner::V1_0::RecordSettings;
const string configFilePath = "/vendor/etc/tuner_vts_config.xml";
const string emptyHardwareId = "";
#define PROVISION_STR \
"{ " \
" \"id\": 21140844, " \
" \"name\": \"Test Title\", " \
" \"lowercase_organization_name\": \"Android\", " \
" \"asset_key\": { " \
" \"encryption_key\": \"nezAr3CHFrmBR9R8Tedotw==\" " \
" }, " \
" \"cas_type\": 1, " \
" \"track_types\": [ ] " \
"} "
struct FrontendConfig {
bool isSoftwareFe;
FrontendType type;
@ -101,6 +113,12 @@ struct TimeFilterConfig {
uint64_t timeStamp;
};
struct DescramblerConfig {
uint32_t casSystemId;
string provisionStr;
vector<uint8_t> hidlPvtData;
};
struct LiveBroadcastHardwareConnections {
string frontendId;
string dvrSoftwareFeId;
@ -139,8 +157,8 @@ struct DescramblingHardwareConnections {
string dvrSoftwareFeId;
string audioFilterId;
string videoFilterId;
/* string descramblerId;
list string of extra filters; */
string descramblerId;
/* list string of extra filters; */
};
struct LnbLiveHardwareConnections {
@ -326,6 +344,31 @@ struct TunerTestingConfigReader {
}
}
static void readDescramblerConfig1_0(map<string, DescramblerConfig>& descramblerMap) {
auto hardwareConfig = getHardwareConfig();
if (hardwareConfig.hasDescramblers()) {
auto descramblers = *hardwareConfig.getFirstDescramblers();
for (auto descramblerConfig : descramblers.getDescrambler()) {
string id = descramblerConfig.getId();
descramblerMap[id].casSystemId =
static_cast<uint32_t>(descramblerConfig.getCasSystemId());
if (descramblerConfig.hasProvisionStr()) {
descramblerMap[id].provisionStr = descramblerConfig.getProvisionStr();
} else {
descramblerMap[id].provisionStr = PROVISION_STR;
}
if (descramblerConfig.hasSesstionPrivatData()) {
auto privateData = descramblerConfig.getSesstionPrivatData();
int size = privateData.size();
descramblerMap[id].hidlPvtData.resize(size);
memcpy(descramblerMap[id].hidlPvtData.data(), privateData.data(), size);
} else {
descramblerMap[id].hidlPvtData.resize(256);
}
}
}
}
static void readDiseqcMessages(map<string, vector<uint8_t>>& diseqcMsgMap) {
auto hardwareConfig = getHardwareConfig();
if (hardwareConfig.hasDiseqcMessages()) {
@ -420,6 +463,7 @@ struct TunerTestingConfigReader {
}
auto descConfig = *dataFlow.getFirstDescrambling();
descrambling.frontendId = descConfig.getFrontendConnection();
descrambling.descramblerId = descConfig.getDescramblerConnection();
descrambling.audioFilterId = descConfig.getAudioFilterConnection();
descrambling.videoFilterId = descConfig.getVideoFilterConnection();
if (descConfig.hasDvrSoftwareFeConnection()) {

View file

@ -46,10 +46,12 @@ package android.media.tuner.testing.configuration.V1_0 {
public static class DataFlowConfiguration.Descrambling {
ctor public DataFlowConfiguration.Descrambling();
method @Nullable public String getAudioFilterConnection();
method @Nullable public String getDescramblerConnection();
method @Nullable public String getDvrSoftwareFeConnection();
method @Nullable public String getFrontendConnection();
method @Nullable public String getVideoFilterConnection();
method public void setAudioFilterConnection(@Nullable String);
method public void setDescramblerConnection(@Nullable String);
method public void setDvrSoftwareFeConnection(@Nullable String);
method public void setFrontendConnection(@Nullable String);
method public void setVideoFilterConnection(@Nullable String);
@ -119,6 +121,18 @@ package android.media.tuner.testing.configuration.V1_0 {
method public void setTimeFilterConnection(@Nullable String);
}
public class Descrambler {
ctor public Descrambler();
method @Nullable public java.math.BigInteger getCasSystemId();
method @Nullable public String getId();
method @Nullable public String getProvisionStr();
method @Nullable public java.util.List<java.lang.Short> getSesstionPrivatData();
method public void setCasSystemId(@Nullable java.math.BigInteger);
method public void setId(@Nullable String);
method public void setProvisionStr(@Nullable String);
method public void setSesstionPrivatData(@Nullable java.util.List<java.lang.Short>);
}
public class DiseqcMessage {
ctor public DiseqcMessage();
method @Nullable public java.util.List<java.lang.Short> getMsgBody();
@ -269,12 +283,14 @@ 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.Descramblers getDescramblers();
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 setDescramblers(@Nullable android.media.tuner.testing.configuration.V1_0.HardwareConfiguration.Descramblers);
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);
@ -283,6 +299,11 @@ package android.media.tuner.testing.configuration.V1_0 {
method public void setTimeFilters(@Nullable android.media.tuner.testing.configuration.V1_0.HardwareConfiguration.TimeFilters);
}
public static class HardwareConfiguration.Descramblers {
ctor public HardwareConfiguration.Descramblers();
method @Nullable public java.util.List<android.media.tuner.testing.configuration.V1_0.Descrambler> getDescrambler();
}
public static class HardwareConfiguration.DiseqcMessages {
ctor public HardwareConfiguration.DiseqcMessages();
method @Nullable public java.util.List<android.media.tuner.testing.configuration.V1_0.DiseqcMessage> getDiseqcMessage();

View file

@ -168,6 +168,22 @@
<timeFilters>
<timeFilter id="TIME_FILTER_0" timeStamp="1"/>
</timeFilters>
<!-- Descrambler section:
This section contains configurations of all the descramblers that would be used in
the tests.
- This section is optional and can be skipped if Descrambler is not supported.
- The users can configure 1 or more descrambler elements in the descramblers sections.
Each Descrambler element contain the following attributes:
"id": unique id of the descrambler that could be used to connect to the test the
"dataFlowConfiguration"
"casSystemId": the cas system id to connect to the descrambler.
"provisionStr": the provision string to use with the cas plugin.
"sesstionPrivatData": the session private data used to open the cas session.
-->
<descramblers>
<descrambler id="DESCRAMBLER_0" casSystemId="63192"/>
</descramblers>
</hardwareConfiguration>
<!-- Data flow configuration section connects each data flow under test to the ids of the
@ -181,6 +197,7 @@
dvrSoftwareFeConnection="DVR_PLAYBACK_0"/>
<scan frontendConnection="FE_DEFAULT"/>
<descrambling frontendConnection="FE_DEFAULT"
descramblerConnection="DESCRAMBLER_0"
audioFilterConnection="FILTER_AUDIO_DEFAULT"
videoFilterConnection="FILTER_VIDEO_DEFAULT"
dvrSoftwareFeConnection="DVR_PLAYBACK_0"/>

View file

@ -372,6 +372,34 @@
<xs:attribute name="timeStamp" type="xs:nonNegativeInteger" use="required"/>
</xs:complexType>
<!-- DESCRAMBLER SESSION -->
<xs:simpleType name="descramblerId">
<!-- Descrambler id must be DESCRAMBLER_NUM: <descrambler id="DESCRAMBLER_2"/> -->
<xs:restriction base="xs:string">
<xs:pattern value="DESCRAMBLER_[0-9]+"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="sessionPrivateData">
<xs:list itemType="xs:unsignedByte"/>
</xs:simpleType>
<xs:complexType name="descrambler">
<xs:annotation>
<xs:documentation>
Each descrambler element contain the following attributes:
"id": unique id of the descrambler that could be used to connect to the test the
"dataFlowConfiguration"
"casSystemId": the cas system id to connect to the descrambler.
"provisionStr": the provision string to use with the cas plugin.
"sesstionPrivatData": the session private data used to open the cas session.
</xs:documentation>
</xs:annotation>
<xs:attribute name="id" type="descramblerId" use="required"/>
<xs:attribute name="casSystemId" type="xs:nonNegativeInteger" use="required"/>
<xs:attribute name="provisionStr" type="xs:string" use="required"/>
<xs:attribute name="sesstionPrivatData" type="sessionPrivateData" use="optional"/>
</xs:complexType>
<!-- HARDWARE CONFIGURATION SESSION -->
<xs:complexType name="hardwareConfiguration">
<xs:sequence>
@ -483,6 +511,23 @@
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="descramblers" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:annotation>
<xs:documentation xml:lang="en">
This section contains configurations of all the descramblers that would
be used in the tests.
- This section is optional and can be skipped if descrambling is not
supported.
- The users can configure 1 or more descrambler elements in the
descramblers sections.
</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="descrambler" type="descrambler" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
@ -509,6 +554,7 @@
<xs:element name="descrambling" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:attribute name="frontendConnection" type="frontendId" use="required"/>
<xs:attribute name="descramblerConnection" type="descramblerId" 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 -->
@ -590,5 +636,9 @@
<xs:selector xpath="hardwareConfiguration/timeFilters/timeFilter"/>
<xs:field xpath="@id"/>
</xs:key>
<xs:key name="descramblerIdUniqueness">
<xs:selector xpath="hardwareConfiguration/descramblers/descrambler"/>
<xs:field xpath="@id"/>
</xs:key>
</xs:element>
</xs:schema>