Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b638b7eb authored by Henry Fang's avatar Henry Fang Committed by Android (Google) Code Review
Browse files

Merge changes I003c6405,Ia35d2d45,I545be7d4

* changes:
  Tuner HAL VTS: Dynamically Configure LnbDescrambling
  Tuner HAL VTS: Testing LnbDescrambling
  Tuner HAL VTS: Added LnbDescrambling
parents 98cd1e04 bcf4ebbb
Loading
Loading
Loading
Loading
+108 −26
Original line number Diff line number Diff line
@@ -428,12 +428,14 @@ void TunerRecordAidlTest::recordSingleFilterTest(FilterConfig filterConf,

void TunerDescramblerAidlTest::scrambledBroadcastTest(set<struct FilterConfig> mediaFilterConfs,
                                                      FrontendConfig frontendConf,
                                                      DescramblerConfig descConfig) {
                                                      DescramblerConfig descConfig,
                                                      Dataflow_Context context) {
    int32_t demuxId;
    std::shared_ptr<IDemux> demux;
    ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId));

    DvrConfig dvrSourceConfig;
    if (context == Dataflow_Context::DESCRAMBLING) {
        if (descrambling.hasFrontendConnection) {
            int32_t feId;
            mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
@@ -451,6 +453,21 @@ void TunerDescramblerAidlTest::scrambledBroadcastTest(set<struct FilterConfig> m
            ASSERT_TRUE(mDvrTests.configDvrPlayback(dvrSourceConfig.settings));
            ASSERT_TRUE(mDvrTests.getDvrPlaybackMQDescriptor());
        }
    } else if (context == Dataflow_Context::LNBDESCRAMBLING) {
        int32_t feId;
        mFrontendTests.getFrontendIdByType(frontendConf.type, feId);
        ASSERT_TRUE(mFrontendTests.openFrontendById(feId));
        ASSERT_TRUE(mFrontendTests.setFrontendCallback());
        if (mLnbId != INVALID_LNB_ID) {
            ASSERT_TRUE(mFrontendTests.setLnb(mLnbId));
        } else {
            // If, for some reason, the test got here without failing. We fail it here.
            ALOGD("mLnbId is null. Something went wrong. Exiting ScrambledBroadcastWithLnbId.");
            FAIL();
        }
        ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId));
        mFrontendTests.setDemux(demux);
    }

    set<int64_t> filterIds;
    int64_t filterId;
@@ -480,6 +497,7 @@ void TunerDescramblerAidlTest::scrambledBroadcastTest(set<struct FilterConfig> m
        ASSERT_TRUE(mFilterTests.startFilter(*id));
    }

    if (context == Dataflow_Context::DESCRAMBLING) {
        if (descrambling.hasFrontendConnection) {
            // tune test
            ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
@@ -490,15 +508,22 @@ void TunerDescramblerAidlTest::scrambledBroadcastTest(set<struct FilterConfig> m
                    dvrSourceConfig.settings.get<DvrSettings::Tag::playback>());
            ASSERT_TRUE(mDvrTests.startDvrPlayback());
        }
    } else if (context == Dataflow_Context::LNBDESCRAMBLING) {
        ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf, true /*testWithDemux*/));
    }

    ASSERT_TRUE(filterDataOutputTest());

    if (context == Dataflow_Context::DESCRAMBLING) {
        if (descrambling.hasFrontendConnection) {
            ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
        } else {
            mDvrTests.stopPlaybackThread();
            ASSERT_TRUE(mDvrTests.stopDvrPlayback());
        }
    } else if (context == Dataflow_Context::LNBDESCRAMBLING) {
        ASSERT_TRUE(mFrontendTests.stopTuneFrontend(true /*testWithDemux*/));
    }

    for (id = filterIds.begin(); id != filterIds.end(); id++) {
        ASSERT_TRUE(mFilterTests.stopFilter(*id));
@@ -511,15 +536,50 @@ void TunerDescramblerAidlTest::scrambledBroadcastTest(set<struct FilterConfig> m
        ASSERT_TRUE(mFilterTests.closeFilter(*id));
    }

    if (context == Dataflow_Context::DESCRAMBLING) {
        if (descrambling.hasFrontendConnection) {
            ASSERT_TRUE(mFrontendTests.closeFrontend());
        } else {
            mDvrTests.closeDvrPlayback();
        }
    } else if (context == Dataflow_Context::LNBDESCRAMBLING) {
        ASSERT_TRUE(mFrontendTests.closeFrontend());
    }

    ASSERT_TRUE(mDemuxTests.closeDemux());
}

void TunerDescramblerAidlTest::scrambledBroadcastTestWithLnb(
        set<struct FilterConfig>& mediaFilterConfs, FrontendConfig& frontendConf,
        DescramblerConfig& descConfig, LnbConfig& lnbConfig) {
    // We can test the Lnb individually and make sure it functions properly. If the frontend is
    // software, we cannot test the whole dataflow. If the frontend is hardware, we can
    if (lnbConfig.name.compare(emptyHardwareId) == 0) {
        vector<int32_t> ids;
        ASSERT_TRUE(mLnbTests.getLnbIds(ids));
        ASSERT_TRUE(ids.size() > 0);
        ASSERT_TRUE(mLnbTests.openLnbById(ids[0]));
        mLnbId = ids[0];
    } else {
        ASSERT_TRUE(mLnbTests.openLnbByName(lnbConfig.name, mLnbId));
    }
    // Once Lnb is opened, test some of its basic functionality
    ASSERT_TRUE(mLnbTests.setLnbCallback());
    ASSERT_TRUE(mLnbTests.setVoltage(lnbConfig.voltage));
    ASSERT_TRUE(mLnbTests.setTone(lnbConfig.tone));
    ASSERT_TRUE(mLnbTests.setSatellitePosition(lnbConfig.position));
    if (!frontendConf.isSoftwareFe) {
        ALOGD("Frontend is not software, testing entire dataflow.");
        scrambledBroadcastTest(mediaFilterConfs, frontendConf, descConfig,
                               Dataflow_Context::LNBDESCRAMBLING);
    } else {
        ALOGD("Frontend is software, did not test the entire dataflow, but tested the Lnb "
              "individually.");
    }
    ASSERT_TRUE(mLnbTests.closeLnb());
    mLnbId = INVALID_LNB_ID;
}

TEST_P(TunerLnbAidlTest, SendDiseqcMessageToLnb) {
    description("Open and configure an Lnb with specific settings then send a diseqc msg to it.");
    if (!lnbLive.support) {
@@ -1227,7 +1287,29 @@ TEST_P(TunerDescramblerAidlTest, ScrambledBroadcastDataFlowMediaFiltersTest) {
        filterConfs.insert(static_cast<FilterConfig>(filterMap[descrambling.audioFilterId]));
        filterConfs.insert(static_cast<FilterConfig>(filterMap[descrambling.videoFilterId]));
        scrambledBroadcastTest(filterConfs, frontendMap[descrambling.frontendId],
                               descramblerMap[descrambling.descramblerId]);
                               descramblerMap[descrambling.descramblerId],
                               Dataflow_Context::DESCRAMBLING);
    }
}

TEST_P(TunerDescramblerAidlTest, ScrambledBroadcastDataFlowMediaFiltersTestWithLnb) {
    description("Test media filters in scrambled broadcast use case with Lnb");
    if (!lnbDescrambling.support) {
        return;
    }
    auto lnbDescrambling_configs = generateLnbDescramblingConfigurations();
    if (lnbDescrambling_configs.empty()) {
        ALOGD("No frontends that support satellites.");
        return;
    }
    for (auto& configuration : lnbDescrambling_configs) {
        lnbDescrambling = configuration;
        set<FilterConfig> filterConfs;
        filterConfs.insert(static_cast<FilterConfig>(filterMap[lnbDescrambling.audioFilterId]));
        filterConfs.insert(static_cast<FilterConfig>(filterMap[lnbDescrambling.videoFilterId]));
        scrambledBroadcastTestWithLnb(filterConfs, frontendMap[lnbDescrambling.frontendId],
                                      descramblerMap[lnbDescrambling.descramblerId],
                                      lnbMap[lnbDescrambling.lnbId]);
    }
}

+11 −2
Original line number Diff line number Diff line
@@ -80,7 +80,7 @@ void clearIds() {
    sectionFilterIds.clear();
}

enum class Dataflow_Context { LNBRECORD, RECORD };
enum class Dataflow_Context { LNBRECORD, RECORD, DESCRAMBLING, LNBDESCRAMBLING };

class TunerLnbAidlTest : public testing::TestWithParam<std::string> {
  public:
@@ -407,6 +407,7 @@ class TunerDescramblerAidlTest : public testing::TestWithParam<std::string> {
        mDvrTests.setService(mService);
        mDescramblerTests.setService(mService);
        mDescramblerTests.setCasService(mCasService);
        mLnbTests.setService(mService);
    }

    virtual void TearDown() override {
@@ -420,7 +421,11 @@ class TunerDescramblerAidlTest : public testing::TestWithParam<std::string> {
    }

    void scrambledBroadcastTest(set<struct FilterConfig> mediaFilterConfs,
                                FrontendConfig frontendConf, DescramblerConfig descConfig);
                                FrontendConfig frontendConf, DescramblerConfig descConfig,
                                Dataflow_Context context);
    void scrambledBroadcastTestWithLnb(set<struct FilterConfig>& mediaFilterConfs,
                                       FrontendConfig& frontendConf, DescramblerConfig& descConfig,
                                       LnbConfig& lnbConfig);
    AssertionResult filterDataOutputTest();

    std::shared_ptr<ITuner> mService;
@@ -430,6 +435,10 @@ class TunerDescramblerAidlTest : public testing::TestWithParam<std::string> {
    FilterTests mFilterTests;
    DescramblerTests mDescramblerTests;
    DvrTests mDvrTests;
    LnbTests mLnbTests;

  private:
    int32_t mLnbId = INVALID_LNB_ID;
};

GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(TunerDescramblerAidlTest);
+82 −0
Original line number Diff line number Diff line
@@ -74,6 +74,7 @@ static DescramblingHardwareConnections descrambling;
static LnbLiveHardwareConnections lnbLive;
static LnbRecordHardwareConnections lnbRecord;
static TimeFilterHardwareConnections timeFilter;
static LnbDescramblingHardwareConnections lnbDescrambling;

/*
 * This function takes in a 2d vector of device Id's
@@ -532,6 +533,54 @@ static inline vector<LiveBroadcastHardwareConnections> generateLiveConfiguration
    return live_configs;
}

static inline vector<LnbDescramblingHardwareConnections> generateLnbDescramblingCombinations() {
    vector<LnbDescramblingHardwareConnections> combinations;
    vector<vector<string>> deviceIds{frontendIds, audioFilterIds, lnbIds, descramblerIds};

    const int frontendIdIndex = 0;
    const int audioFilterIdIndex = 1;
    const int lnbIdIndex = 2;
    const int descramblerIdIndex = 3;

    auto idCombinations = generateIdCombinations(deviceIds);
    // TODO : Find a better way to vary diseqcMsgs, if at all
    for (auto& combo : idCombinations) {
        const string feId = combo[frontendIdIndex];
        auto type = frontendMap[feId].type;
        if (type == FrontendType::DVBS || type == FrontendType::ISDBS ||
            type == FrontendType::ISDBS3) {
            LnbDescramblingHardwareConnections mLnbDescrambling;
            mLnbDescrambling.support = true;
            mLnbDescrambling.frontendId = feId;
            mLnbDescrambling.audioFilterId = combo[audioFilterIdIndex];
            const int videoFilterIdIndex = find(audioFilterIds.begin(), audioFilterIds.end(),
                                                mLnbDescrambling.audioFilterId) -
                                           audioFilterIds.begin();
            mLnbDescrambling.videoFilterId = videoFilterIds[videoFilterIdIndex];
            mLnbDescrambling.lnbId = combo[lnbIdIndex];
            mLnbDescrambling.descramblerId = combo[descramblerIdIndex];
            mLnbDescrambling.diseqcMsgs = diseqcMsgs;
            combinations.push_back(mLnbDescrambling);
        }
    }

    return combinations;
}

static inline vector<LnbDescramblingHardwareConnections> generateLnbDescramblingConfigurations() {
    vector<LnbDescramblingHardwareConnections> lnbDescrambling_configs;
    if (configuredLnbDescrambling) {
        ALOGD("Using LnbDescrambling configuration provided");
        lnbDescrambling_configs = {lnbDescrambling};
    } else {
        ALOGD("LnbDescrambling not provided. Generating possible combinations. Consider adding it "
              "to the configuration file.");
        lnbDescrambling_configs = generateLnbDescramblingCombinations();
    }

    return lnbDescrambling_configs;
}

/** Config all the frontends that would be used in the tests */
inline void initFrontendConfig() {
    // The test will use the internal default fe when default fe is connected to any data flow
@@ -720,6 +769,15 @@ inline void determineDvrRecord() {
    record.support = true;
}

inline void determineLnbDescrambling() {
    if (frontendIds.empty() || audioFilterIds.empty() || videoFilterIds.empty() || lnbIds.empty() ||
        descramblerIds.empty()) {
        return;
    }
    ALOGD("Can support LnbDescrambling.");
    lnbDescrambling.support = true;
}

/** Read the vendor configurations of which hardware to use for each test cases/data flows */
inline void connectHardwaresToTestCases() {
    TunerTestingConfigAidlReader1_0::connectLiveBroadcast(live);
@@ -730,6 +788,7 @@ inline void connectHardwaresToTestCases() {
    TunerTestingConfigAidlReader1_0::connectLnbLive(lnbLive);
    TunerTestingConfigAidlReader1_0::connectLnbRecord(lnbRecord);
    TunerTestingConfigAidlReader1_0::connectDvrPlayback(playback);
    TunerTestingConfigAidlReader1_0::connectLnbDescrambling(lnbDescrambling);
};

inline void determineDataFlows() {
@@ -741,6 +800,7 @@ inline void determineDataFlows() {
    determineLive();
    determineDescrambling();
    determineDvrRecord();
    determineLnbDescrambling();
}

inline bool validateConnections() {
@@ -766,6 +826,10 @@ inline bool validateConnections() {
    feIsValid &=
            lnbRecord.support ? frontendMap.find(lnbRecord.frontendId) != frontendMap.end() : true;

    feIsValid &= lnbDescrambling.support
                         ? frontendMap.find(lnbDescrambling.frontendId) != frontendMap.end()
                         : true;

    if (!feIsValid) {
        ALOGW("[vts config] dynamic config fe connection is invalid.");
        return false;
@@ -850,6 +914,12 @@ inline bool validateConnections() {
                playback.hasExtraFilters ? filterMap.find(filterId) != filterMap.end() : true;
    }

    filterIsValid &=
            lnbDescrambling.support
                    ? filterMap.find(lnbDescrambling.audioFilterId) != filterMap.end() &&
                              filterMap.find(lnbDescrambling.videoFilterId) != filterMap.end()
                    : true;

    if (!filterIsValid) {
        ALOGW("[vts config] dynamic config filter connection is invalid.");
        return false;
@@ -880,6 +950,11 @@ inline bool validateConnections() {
                    ? descramblerMap.find(descrambling.descramblerId) != descramblerMap.end()
                    : true;

    descramblerIsValid &=
            lnbDescrambling.support
                    ? descramblerMap.find(lnbDescrambling.descramblerId) != descramblerMap.end()
                    : true;

    if (!descramblerIsValid) {
        ALOGW("[vts config] dynamic config descrambler connection is invalid.");
        return false;
@@ -889,6 +964,9 @@ inline bool validateConnections() {

    lnbIsValid &= lnbRecord.support ? lnbMap.find(lnbRecord.lnbId) != lnbMap.end() : true;

    lnbIsValid &=
            lnbDescrambling.support ? lnbMap.find(lnbDescrambling.lnbId) != lnbMap.end() : true;

    if (!lnbIsValid) {
        ALOGW("[vts config] dynamic config lnb connection is invalid.");
        return false;
@@ -904,6 +982,10 @@ inline bool validateConnections() {
        diseqcMsgsIsValid &= diseqcMsgMap.find(msg) != diseqcMsgMap.end();
    }

    for (auto& msg : lnbDescrambling.diseqcMsgs) {
        diseqcMsgsIsValid &= diseqcMsgMap.find(msg) != diseqcMsgMap.end();
    }

    if (!diseqcMsgsIsValid) {
        ALOGW("[vts config] dynamic config diseqcMsg is invalid.");
        return false;
+33 −0
Original line number Diff line number Diff line
@@ -73,6 +73,7 @@ static bool configuredPlayback = false;
static bool configuredLnbRecord = false;
static bool configuredTimeFilter = false;
static bool configuredDescrambling = false;
static bool configuredLnbDescrambling = false;

const string emptyHardwareId = "";

@@ -229,6 +230,16 @@ struct TimeFilterHardwareConnections {
    string timeFilterId;
};

struct LnbDescramblingHardwareConnections {
    bool support;
    string frontendId;
    string audioFilterId;
    string videoFilterId;
    string lnbId;
    string descramblerId;
    vector<string> diseqcMsgs;
};

struct TunerTestingConfigAidlReader1_0 {
  public:
    static void setConfigFilePath(string path) { mConfigFilePath = path; }
@@ -705,6 +716,28 @@ struct TunerTestingConfigAidlReader1_0 {
        timeFilter.timeFilterId = timeFilterConfig.getTimeFilterConnection();
    }

    static void connectLnbDescrambling(LnbDescramblingHardwareConnections& lnbDescrambling) {
        auto dataFlow = getDataFlowConfiguration();
        if (dataFlow.hasLnbDescrambling()) {
            lnbDescrambling.support = true;
            configuredLnbDescrambling = true;
        } else {
            lnbDescrambling.support = false;
            return;
        }
        auto lnbDescramblingConfig = *dataFlow.getFirstLnbDescrambling();
        lnbDescrambling.frontendId = lnbDescramblingConfig.getFrontendConnection();
        lnbDescrambling.audioFilterId = lnbDescramblingConfig.getAudioFilterConnection();
        lnbDescrambling.videoFilterId = lnbDescramblingConfig.getVideoFilterConnection();
        lnbDescrambling.lnbId = lnbDescramblingConfig.getLnbConnection();
        lnbDescrambling.descramblerId = lnbDescramblingConfig.getDescramblerConnection();
        if (lnbDescramblingConfig.hasDiseqcMsgSender()) {
            for (auto& msgName : lnbDescramblingConfig.getDiseqcMsgSender()) {
                lnbDescrambling.diseqcMsgs.push_back(msgName);
            }
        }
    }

  private:
    static FrontendDvbtSettings readDvbtFrontendSettings(Frontend feConfig) {
        ALOGW("[ConfigReader] fe type is dvbt");
+18 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ package android.media.tuner.testing.configuration.V1_0 {
    method @Nullable public android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.Descrambling getDescrambling();
    method @Nullable public android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.DvrPlayback getDvrPlayback();
    method @Nullable public android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.DvrRecord getDvrRecord();
    method @Nullable public android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.LnbDescrambling getLnbDescrambling();
    method @Nullable public android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.LnbLive getLnbLive();
    method @Nullable public android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.LnbRecord getLnbRecord();
    method @Nullable public android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.Scan getScan();
@@ -35,6 +36,7 @@ package android.media.tuner.testing.configuration.V1_0 {
    method public void setDescrambling(@Nullable android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.Descrambling);
    method public void setDvrPlayback(@Nullable android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.DvrPlayback);
    method public void setDvrRecord(@Nullable android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.DvrRecord);
    method public void setLnbDescrambling(@Nullable android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.LnbDescrambling);
    method public void setLnbLive(@Nullable android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.LnbLive);
    method public void setLnbRecord(@Nullable android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.LnbRecord);
    method public void setScan(@Nullable android.media.tuner.testing.configuration.V1_0.DataFlowConfiguration.Scan);
@@ -111,6 +113,22 @@ package android.media.tuner.testing.configuration.V1_0 {
    method public void setRecordFilterConnection(@Nullable String);
  }

  public static class DataFlowConfiguration.LnbDescrambling {
    ctor public DataFlowConfiguration.LnbDescrambling();
    method @Nullable public String getAudioFilterConnection();
    method @Nullable public String getDescramblerConnection();
    method @Nullable public java.util.List<java.lang.String> getDiseqcMsgSender();
    method @Nullable public String getFrontendConnection();
    method @Nullable public String getLnbConnection();
    method @Nullable public String getVideoFilterConnection();
    method public void setAudioFilterConnection(@Nullable String);
    method public void setDescramblerConnection(@Nullable String);
    method public void setDiseqcMsgSender(@Nullable java.util.List<java.lang.String>);
    method public void setFrontendConnection(@Nullable String);
    method public void setLnbConnection(@Nullable String);
    method public void setVideoFilterConnection(@Nullable String);
  }

  public static class DataFlowConfiguration.LnbLive {
    ctor public DataFlowConfiguration.LnbLive();
    method @Nullable public String getAudioFilterConnection();
Loading