diff options
author | Amy Zhang <amyjojo@google.com> | 2020-04-20 17:59:26 -0700 |
---|---|---|
committer | Amy Zhang <amyjojo@google.com> | 2020-04-28 15:00:38 -0700 |
commit | a305c1c58caad9bfa9bc69dec6f2142773753458 (patch) | |
tree | c694b9697193bfda79282b528a389a2342373158 /tv | |
parent | d8040b86f798fbbc51a76ec656c05f24f006fae5 (diff) | |
download | platform_hardware_interfaces-a305c1c58caad9bfa9bc69dec6f2142773753458.tar.gz platform_hardware_interfaces-a305c1c58caad9bfa9bc69dec6f2142773753458.tar.bz2 platform_hardware_interfaces-a305c1c58caad9bfa9bc69dec6f2142773753458.zip |
Refactoring the Dvr data flow tests in the Tuner VTS
Test: atest VtsHalTvTunerV1_0TargetTest
Bug: 150989084
Change-Id: I496dccd9dddcf6043c05faee6fbe1f0418586bc4
Diffstat (limited to 'tv')
-rw-r--r-- | tv/tuner/1.0/default/Filter.cpp | 16 | ||||
-rw-r--r-- | tv/tuner/1.0/default/Filter.h | 1 | ||||
-rw-r--r-- | tv/tuner/1.0/vts/functional/DvrTests.cpp | 6 | ||||
-rw-r--r-- | tv/tuner/1.0/vts/functional/DvrTests.h | 6 | ||||
-rw-r--r-- | tv/tuner/1.0/vts/functional/FilterTests.cpp | 6 | ||||
-rw-r--r-- | tv/tuner/1.0/vts/functional/FilterTests.h | 5 | ||||
-rw-r--r-- | tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.cpp | 427 | ||||
-rw-r--r-- | tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.h | 102 | ||||
-rw-r--r-- | tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TestConfigurations.h | 30 |
9 files changed, 262 insertions, 337 deletions
diff --git a/tv/tuner/1.0/default/Filter.cpp b/tv/tuner/1.0/default/Filter.cpp index f610c60743..dab3c177a5 100644 --- a/tv/tuner/1.0/default/Filter.cpp +++ b/tv/tuner/1.0/default/Filter.cpp @@ -73,18 +73,22 @@ Return<Result> Filter::configure(const DemuxFilterSettings& settings) { switch (mType.mainType) { case DemuxFilterMainType::TS: mTpid = settings.ts().tpid; + if (mType.subType.tsFilterType() == DemuxTsFilterType::AUDIO || + mType.subType.tsFilterType() == DemuxTsFilterType::VIDEO) { + mIsMediaFilter = true; + } break; case DemuxFilterMainType::MMTP: - /*mmtpSettings*/ + if (mType.subType.mmtpFilterType() == DemuxMmtpFilterType::AUDIO || + mType.subType.mmtpFilterType() == DemuxMmtpFilterType::VIDEO) { + mIsMediaFilter = true; + } break; case DemuxFilterMainType::IP: - /*ipSettings*/ break; case DemuxFilterMainType::TLV: - /*tlvSettings*/ break; case DemuxFilterMainType::ALP: - /*alpSettings*/ break; default: break; @@ -241,9 +245,7 @@ void Filter::filterThreadLoop() { } void Filter::freeAvHandle() { - if (mType.mainType != DemuxFilterMainType::TS || - (mType.subType.tsFilterType() == DemuxTsFilterType::AUDIO && - mType.subType.tsFilterType() == DemuxTsFilterType::VIDEO)) { + if (!mIsMediaFilter) { return; } for (int i = 0; i < mFilterEvent.events.size(); i++) { diff --git a/tv/tuner/1.0/default/Filter.h b/tv/tuner/1.0/default/Filter.h index afed98eb0a..9b49ad8bd9 100644 --- a/tv/tuner/1.0/default/Filter.h +++ b/tv/tuner/1.0/default/Filter.h @@ -103,6 +103,7 @@ class Filter : public IFilter { uint32_t mFilterId; uint32_t mBufferSize; DemuxFilterType mType; + bool mIsMediaFilter = false; DemuxFilterSettings mFilterSettings; uint16_t mTpid; diff --git a/tv/tuner/1.0/vts/functional/DvrTests.cpp b/tv/tuner/1.0/vts/functional/DvrTests.cpp index a1ce23d730..9b24aa7a08 100644 --- a/tv/tuner/1.0/vts/functional/DvrTests.cpp +++ b/tv/tuner/1.0/vts/functional/DvrTests.cpp @@ -186,14 +186,14 @@ void DvrCallback::stopRecordThread() { android::Mutex::Autolock autoLock(mRecordThreadLock); } -AssertionResult DvrTests::openDvrInDemux(DvrType type) { +AssertionResult DvrTests::openDvrInDemux(DvrType type, uint32_t bufferSize) { Result status; EXPECT_TRUE(mDemux) << "Test with openDemux first."; // Create dvr callback mDvrCallback = new DvrCallback(); - mDemux->openDvr(type, FMQ_SIZE_1M, mDvrCallback, [&](Result result, const sp<IDvr>& dvr) { + mDemux->openDvr(type, bufferSize, mDvrCallback, [&](Result result, const sp<IDvr>& dvr) { mDvr = dvr; status = result; }); @@ -264,4 +264,4 @@ void DvrTests::closeDvr() { ASSERT_TRUE(mDemux); ASSERT_TRUE(mDvr); ASSERT_TRUE(mDvr->close() == Result::SUCCESS); -}
\ No newline at end of file +} diff --git a/tv/tuner/1.0/vts/functional/DvrTests.h b/tv/tuner/1.0/vts/functional/DvrTests.h index 74ef58ebf1..d60ce2bd9d 100644 --- a/tv/tuner/1.0/vts/functional/DvrTests.h +++ b/tv/tuner/1.0/vts/functional/DvrTests.h @@ -146,7 +146,7 @@ class DvrTests { void setService(sp<ITuner> tuner) { mService = tuner; } void setDemux(sp<IDemux> demux) { mDemux = demux; } - void startPlaybackInputThread(string dataInputFile, PlaybackSettings settings) { + void startPlaybackInputThread(string& dataInputFile, PlaybackSettings& settings) { PlaybackConf conf{ .inputDataFile = dataInputFile, .setting = settings, @@ -162,7 +162,7 @@ class DvrTests { void testRecordOutput() { mDvrCallback->testRecordOutput(); } void stopRecordThread() { mDvrCallback->stopPlaybackThread(); } - AssertionResult openDvrInDemux(DvrType type); + AssertionResult openDvrInDemux(DvrType type, uint32_t bufferSize); AssertionResult configDvr(DvrSettings setting); AssertionResult getDvrMQDescriptor(); AssertionResult attachFilterToDvr(sp<IFilter> filter); @@ -184,4 +184,4 @@ class DvrTests { pthread_t mPlaybackshread; bool mPlaybackThreadRunning; -};
\ No newline at end of file +}; diff --git a/tv/tuner/1.0/vts/functional/FilterTests.cpp b/tv/tuner/1.0/vts/functional/FilterTests.cpp index 82e955d90e..4639e59c62 100644 --- a/tv/tuner/1.0/vts/functional/FilterTests.cpp +++ b/tv/tuner/1.0/vts/functional/FilterTests.cpp @@ -128,7 +128,7 @@ bool FilterCallback::dumpAvData(DemuxFilterMediaEvent event) { return true; } -AssertionResult FilterTests::openFilterInDemux(DemuxFilterType type) { +AssertionResult FilterTests::openFilterInDemux(DemuxFilterType type, uint32_t bufferSize) { Result status; EXPECT_TRUE(mDemux) << "Test with openDemux first."; @@ -136,7 +136,7 @@ AssertionResult FilterTests::openFilterInDemux(DemuxFilterType type) { mFilterCallback = new FilterCallback(); // Add filter to the local demux - mDemux->openFilter(type, FMQ_SIZE_16M, mFilterCallback, + mDemux->openFilter(type, bufferSize, mFilterCallback, [&](Result result, const sp<IFilter>& filter) { mFilter = filter; status = result; @@ -223,4 +223,4 @@ AssertionResult FilterTests::closeFilter(uint32_t filterId) { mFilters.erase(filterId); } return AssertionResult(status == Result::SUCCESS); -}
\ No newline at end of file +} diff --git a/tv/tuner/1.0/vts/functional/FilterTests.h b/tv/tuner/1.0/vts/functional/FilterTests.h index dc798c9b1e..71efce4e21 100644 --- a/tv/tuner/1.0/vts/functional/FilterTests.h +++ b/tv/tuner/1.0/vts/functional/FilterTests.h @@ -78,9 +78,6 @@ enum FilterEventType : uint8_t { using FilterMQ = MessageQueue<uint8_t, kSynchronizedReadWrite>; using MQDesc = MQDescriptorSync<uint8_t>; -const uint32_t FMQ_SIZE_1M = 0x100000; -const uint32_t FMQ_SIZE_16M = 0x1000000; - #define WAIT_TIMEOUT 3000000000 class FilterCallback : public IFilterCallback { @@ -153,7 +150,7 @@ class FilterTests { std::map<uint32_t, sp<FilterCallback>> getFilterCallbacks() { return mFilterCallbacks; } - AssertionResult openFilterInDemux(DemuxFilterType type); + AssertionResult openFilterInDemux(DemuxFilterType type, uint32_t bufferSize); AssertionResult getNewlyOpenedFilterId(uint32_t& filterId); AssertionResult configFilter(DemuxFilterSettings setting, uint32_t filterId); AssertionResult getFilterMQDescriptor(uint32_t filterId); diff --git a/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.cpp b/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.cpp index f211be2e90..c5b159f4f3 100644 --- a/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.cpp +++ b/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.cpp @@ -17,7 +17,7 @@ #include "VtsHalTvTunerV1_0TargetTest.h" namespace { -/*======================== Start Descrambler APIs Tests Implementation ========================*/ + AssertionResult TunerHidlTest::createDescrambler(uint32_t demuxId) { Result status; mService->openDescrambler([&](Result result, const sp<IDescrambler>& descrambler) { @@ -46,10 +46,8 @@ AssertionResult TunerHidlTest::closeDescrambler() { mDescrambler = nullptr; return AssertionResult(status == Result::SUCCESS); } -/*========================= End Descrambler APIs Tests Implementation =========================*/ -/*========================== Start Data Flow Tests Implementation ==========================*/ -AssertionResult TunerHidlTest::broadcastDataFlowTest(vector<string> /*goldenOutputFiles*/) { +AssertionResult TunerBroadcastHidlTest::filterDataOutputTest(vector<string> /*goldenOutputFiles*/) { // Data Verify Module std::map<uint32_t, sp<FilterCallback>>::iterator it; std::map<uint32_t, sp<FilterCallback>> filterCallbacks = mFilterTests.getFilterCallbacks(); @@ -59,154 +57,43 @@ AssertionResult TunerHidlTest::broadcastDataFlowTest(vector<string> /*goldenOutp return success(); } -/* - * TODO: re-enable the tests after finalizing the test refactoring. - */ -/*AssertionResult TunerHidlTest::playbackDataFlowTest( - vector<FilterConf> filterConf, PlaybackConf playbackConf, - vector<string> \/\*goldenOutputFiles\*\/) { - Result status; - int filterIdsSize; - // Filter Configuration Module - for (int i = 0; i < filterConf.size(); i++) { - if (addFilterToDemux(filterConf[i].type, filterConf[i].setting) == - failure() || - // TODO use a map to save the FMQs/EvenFlags and pass to callback - getFilterMQDescriptor() == failure()) { - return failure(); - } - filterIdsSize = mUsedFilterIds.size(); - mUsedFilterIds.resize(filterIdsSize + 1); - mUsedFilterIds[filterIdsSize] = mFilterId; - mFilters[mFilterId] = mFilter; - mFilterCallbacks[mFilterId] = mFilterCallback; - mFilterCallback->updateFilterMQ(mFilterMQDescriptor); - // mDemuxCallback->updateGoldenOutputMap(goldenOutputFiles[i]); - status = mFilter->start(); - if (status != Result::SUCCESS) { - return failure(); - } - } - - // Playback Input Module - PlaybackSettings playbackSetting = playbackConf.setting; - if (addPlaybackToDemux(playbackSetting) == failure() || - getPlaybackMQDescriptor() == failure()) { - return failure(); - } - for (int i = 0; i <= filterIdsSize; i++) { - if (mDvr->attachFilter(mFilters[mUsedFilterIds[i]]) != Result::SUCCESS) { - return failure(); - } - } - mDvrCallback->startPlaybackInputThread(playbackConf, mPlaybackMQDescriptor); - status = mDvr->start(); - if (status != Result::SUCCESS) { - return failure(); - } - +AssertionResult TunerPlaybackHidlTest::filterDataOutputTest(vector<string> /*goldenOutputFiles*/) { // Data Verify Module std::map<uint32_t, sp<FilterCallback>>::iterator it; - for (it = mFilterCallbacks.begin(); it != mFilterCallbacks.end(); it++) { + std::map<uint32_t, sp<FilterCallback>> filterCallbacks = mFilterTests.getFilterCallbacks(); + for (it = filterCallbacks.begin(); it != filterCallbacks.end(); it++) { it->second->testFilterDataOutput(); } - mDvrCallback->stopPlaybackThread(); - - // Clean Up Module - for (int i = 0; i <= filterIdsSize; i++) { - if (mFilters[mUsedFilterIds[i]]->stop() != Result::SUCCESS) { - return failure(); - } - } - if (mDvr->stop() != Result::SUCCESS) { - return failure(); - } - mUsedFilterIds.clear(); - mFilterCallbacks.clear(); - mFilters.clear(); - return closeDemux(); + return success(); } -AssertionResult TunerHidlTest::recordDataFlowTest(vector<FilterConf> filterConf, - RecordSettings recordSetting, - vector<string> goldenOutputFiles) { - Result status; - hidl_vec<FrontendId> feIds; - - mService->getFrontendIds([&](Result result, const hidl_vec<FrontendId>& frontendIds) { - status = result; - feIds = frontendIds; - }); - - if (feIds.size() == 0) { - ALOGW("[ WARN ] Frontend isn't available"); - return failure(); - } - - FrontendDvbtSettings dvbt{ - .frequency = 1000, - }; - FrontendSettings settings; - settings.dvbt(dvbt); - - int filterIdsSize; - // Filter Configuration Module - for (int i = 0; i < filterConf.size(); i++) { - if (addFilterToDemux(filterConf[i].type, filterConf[i].setting) == - failure() || - // TODO use a map to save the FMQs/EvenFlags and pass to callback - getFilterMQDescriptor() == failure()) { - return failure(); - } - filterIdsSize = mUsedFilterIds.size(); - mUsedFilterIds.resize(filterIdsSize + 1); - mUsedFilterIds[filterIdsSize] = mFilterId; - mFilters[mFilterId] = mFilter; - } - - // Record Config Module - if (addRecordToDemux(recordSetting) == failure() || - getRecordMQDescriptor() == failure()) { - return failure(); - } - for (int i = 0; i <= filterIdsSize; i++) { - if (mDvr->attachFilter(mFilters[mUsedFilterIds[i]]) != Result::SUCCESS) { - return failure(); - } - } - - mDvrCallback->startRecordOutputThread(recordSetting, mRecordMQDescriptor); - status = mDvr->start(); - if (status != Result::SUCCESS) { - return failure(); - } - - if (setDemuxFrontendDataSource(feIds[0]) != success()) { - return failure(); - } +void TunerFilterHidlTest::configSingleFilterInDemuxTest(FilterConfig filterConf, + FrontendConfig frontendConf) { + uint32_t feId; + uint32_t demuxId; + sp<IDemux> demux; + uint32_t filterId; - // Data Verify Module - mDvrCallback->testRecordOutput(); + mFrontendTests.getFrontendIdByType(frontendConf.type, feId); + ASSERT_TRUE(feId != INVALID_ID); + ASSERT_TRUE(mFrontendTests.openFrontendById(feId)); + ASSERT_TRUE(mFrontendTests.setFrontendCallback()); + ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); + ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); + mFilterTests.setDemux(demux); + ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize)); + ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId(filterId)); + ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId)); + ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId)); + ASSERT_TRUE(mFilterTests.startFilter(filterId)); + ASSERT_TRUE(mFilterTests.stopFilter(filterId)); + ASSERT_TRUE(mFilterTests.closeFilter(filterId)); + ASSERT_TRUE(mDemuxTests.closeDemux()); + ASSERT_TRUE(mFrontendTests.closeFrontend()); +} - // Clean Up Module - for (int i = 0; i <= filterIdsSize; i++) { - if (mFilters[mUsedFilterIds[i]]->stop() != Result::SUCCESS) { - return failure(); - } - } - if (mFrontend->stopTune() != Result::SUCCESS) { - return failure(); - } - mUsedFilterIds.clear(); - mFilterCallbacks.clear(); - mFilters.clear(); - return closeDemux(); -}*/ -/*========================= End Data Flow Tests Implementation =========================*/ - -/*================================= Start Test Module =================================*/ -void TunerHidlTest::broadcastSingleFilterTest(FilterConfig filterConf, - FrontendConfig frontendConf) { +void TunerBroadcastHidlTest::broadcastSingleFilterTest(FilterConfig filterConf, + FrontendConfig frontendConf) { uint32_t feId; uint32_t demuxId; sp<IDemux> demux; @@ -224,15 +111,14 @@ void TunerHidlTest::broadcastSingleFilterTest(FilterConfig filterConf, ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); mFilterTests.setDemux(demux); - ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type)); + ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize)); ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId(filterId)); ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId)); ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId)); ASSERT_TRUE(mFilterTests.startFilter(filterId)); // tune test ASSERT_TRUE(mFrontendTests.tuneFrontend(frontendConf)); - // broadcast data flow test - ASSERT_TRUE(broadcastDataFlowTest(goldenOutputFiles)); + ASSERT_TRUE(filterDataOutputTest(goldenOutputFiles)); ASSERT_TRUE(mFrontendTests.stopTuneFrontend()); ASSERT_TRUE(mFilterTests.stopFilter(filterId)); ASSERT_TRUE(mFilterTests.closeFilter(filterId)); @@ -240,9 +126,38 @@ void TunerHidlTest::broadcastSingleFilterTest(FilterConfig filterConf, ASSERT_TRUE(mFrontendTests.closeFrontend()); } -void TunerDvrHidlTest::attachSingleFilterToDvrTest(FilterConfig filterConf, - FrontendConfig frontendConf, DvrConfig dvrConf) { - description("Open and configure a Dvr in Demux."); +void TunerPlaybackHidlTest::playbackSingleFilterTest(FilterConfig filterConf, DvrConfig dvrConf) { + uint32_t demuxId; + sp<IDemux> demux; + uint32_t filterId; + sp<IFilter> filter; + + ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); + mFilterTests.setDemux(demux); + mDvrTests.setDemux(demux); + ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize)); + ASSERT_TRUE(mDvrTests.configDvr(dvrConf.settings)); + ASSERT_TRUE(mDvrTests.getDvrMQDescriptor()); + ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize)); + ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId(filterId)); + ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId)); + ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId)); + filter = mFilterTests.getFilterById(filterId); + ASSERT_TRUE(filter != nullptr); + mDvrTests.startPlaybackInputThread(dvrConf.playbackInputFile, dvrConf.settings.playback()); + ASSERT_TRUE(mDvrTests.startDvr()); + ASSERT_TRUE(mFilterTests.startFilter(filterId)); + ASSERT_TRUE(filterDataOutputTest(goldenOutputFiles)); + mDvrTests.stopPlaybackThread(); + ASSERT_TRUE(mFilterTests.stopFilter(filterId)); + ASSERT_TRUE(mDvrTests.stopDvr()); + ASSERT_TRUE(mFilterTests.closeFilter(filterId)); + mDvrTests.closeDvr(); + ASSERT_TRUE(mDemuxTests.closeDemux()); +} + +void TunerRecordHidlTest::recordSingleFilterTest(FilterConfig filterConf, + FrontendConfig frontendConf, DvrConfig dvrConf) { uint32_t feId; uint32_t demuxId; sp<IDemux> demux; @@ -257,31 +172,38 @@ void TunerDvrHidlTest::attachSingleFilterToDvrTest(FilterConfig filterConf, ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); mFilterTests.setDemux(demux); mDvrTests.setDemux(demux); - ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type)); + ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize)); ASSERT_TRUE(mDvrTests.configDvr(dvrConf.settings)); ASSERT_TRUE(mDvrTests.getDvrMQDescriptor()); - ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type)); + ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize)); ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId(filterId)); ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId)); ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId)); - ASSERT_TRUE(mFilterTests.startFilter(filterId)); filter = mFilterTests.getFilterById(filterId); ASSERT_TRUE(filter != nullptr); ASSERT_TRUE(mDvrTests.attachFilterToDvr(filter)); - ASSERT_TRUE(mDvrTests.detachFilterToDvr(filter)); + mDvrTests.startRecordOutputThread(dvrConf.settings.record()); + ASSERT_TRUE(mDvrTests.startDvr()); + ASSERT_TRUE(mFilterTests.startFilter(filterId)); + mDvrTests.testRecordOutput(); + mDvrTests.stopRecordThread(); ASSERT_TRUE(mFilterTests.stopFilter(filterId)); + ASSERT_TRUE(mDvrTests.stopDvr()); + ASSERT_TRUE(mDvrTests.detachFilterToDvr(filter)); ASSERT_TRUE(mFilterTests.closeFilter(filterId)); mDvrTests.closeDvr(); ASSERT_TRUE(mDemuxTests.closeDemux()); ASSERT_TRUE(mFrontendTests.closeFrontend()); } -void TunerFilterHidlTest::configSingleFilterInDemuxTest(FilterConfig filterConf, - FrontendConfig frontendConf) { +void TunerRecordHidlTest::attachSingleFilterToRecordDvrTest(FilterConfig filterConf, + FrontendConfig frontendConf, + DvrConfig dvrConf) { uint32_t feId; uint32_t demuxId; sp<IDemux> demux; uint32_t filterId; + sp<IFilter> filter; mFrontendTests.getFrontendIdByType(frontendConf.type, feId); ASSERT_TRUE(feId != INVALID_ID); @@ -290,20 +212,28 @@ void TunerFilterHidlTest::configSingleFilterInDemuxTest(FilterConfig filterConf, ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); mFilterTests.setDemux(demux); - ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type)); + mDvrTests.setDemux(demux); + ASSERT_TRUE(mDvrTests.openDvrInDemux(dvrConf.type, dvrConf.bufferSize)); + ASSERT_TRUE(mDvrTests.configDvr(dvrConf.settings)); + ASSERT_TRUE(mDvrTests.getDvrMQDescriptor()); + ASSERT_TRUE(mFilterTests.openFilterInDemux(filterConf.type, filterConf.bufferSize)); ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId(filterId)); ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId)); ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId)); + filter = mFilterTests.getFilterById(filterId); + ASSERT_TRUE(filter != nullptr); + ASSERT_TRUE(mDvrTests.attachFilterToDvr(filter)); + ASSERT_TRUE(mDvrTests.startDvr()); ASSERT_TRUE(mFilterTests.startFilter(filterId)); ASSERT_TRUE(mFilterTests.stopFilter(filterId)); + ASSERT_TRUE(mDvrTests.stopDvr()); + ASSERT_TRUE(mDvrTests.detachFilterToDvr(filter)); ASSERT_TRUE(mFilterTests.closeFilter(filterId)); + mDvrTests.closeDvr(); ASSERT_TRUE(mDemuxTests.closeDemux()); ASSERT_TRUE(mFrontendTests.closeFrontend()); } -/*================================== End Test Module ==================================*/ -/***************************** End Test Implementation *****************************/ -/******************************** Start Test Entry **********************************/ TEST_P(TunerFrontendHidlTest, TuneFrontend) { description("Tune one Frontend with specific setting and check Lock event"); mFrontendTests.tuneTest(frontendArray[DVBT]); @@ -331,6 +261,7 @@ TEST_P(TunerDemuxHidlTest, openDemux) { ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); ASSERT_TRUE(mDemuxTests.closeDemux()); + ASSERT_TRUE(mFrontendTests.closeFrontend()); } TEST_P(TunerFilterHidlTest, StartFilterInDemux) { @@ -339,173 +270,97 @@ TEST_P(TunerFilterHidlTest, StartFilterInDemux) { configSingleFilterInDemuxTest(filterArray[TS_VIDEO0], frontendArray[DVBT]); } -TEST_P(TunerDvrHidlTest, AttachFiltersToRecordTest) { - description("Attach a single filter to the record dvr test."); - // TODO use paramterized tests - attachSingleFilterToDvrTest(filterArray[TS_VIDEO0], frontendArray[DVBT], dvrArray[DVR_RECORD0]); -} - -TEST_P(TunerDvrHidlTest, AttachFiltersToPlaybackTest) { - description("Attach a single filter to the playback dvr test."); - // TODO use paramterized tests - attachSingleFilterToDvrTest(filterArray[TS_VIDEO0], frontendArray[DVBT], - dvrArray[DVR_PLAYBACK0]); -} - -/*============================ Start Descrambler Tests ============================*/ -/* - * TODO: re-enable the tests after finalizing the test refactoring. - */ -TEST_P(TunerHidlTest, CreateDescrambler) { - description("Create Descrambler"); - uint32_t feId; - uint32_t demuxId; - sp<IDemux> demux; - mFrontendTests.getFrontendIdByType(frontendArray[DVBT].type, feId); - ASSERT_TRUE(feId != INVALID_ID); - ASSERT_TRUE(mFrontendTests.openFrontendById(feId)); - ASSERT_TRUE(mFrontendTests.setFrontendCallback()); - ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); - ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); - ASSERT_TRUE(createDescrambler(demuxId)); - ASSERT_TRUE(mDemuxTests.closeDemux()); - ASSERT_TRUE(closeDescrambler()); -} - -/*============================== End Descrambler Tests ==============================*/ - -/*============================== Start Data Flow Tests ==============================*/ -TEST_P(TunerHidlTest, BroadcastDataFlowVideoFilterTest) { +TEST_P(TunerBroadcastHidlTest, BroadcastDataFlowVideoFilterTest) { description("Test Video Filter functionality in Broadcast use case."); broadcastSingleFilterTest(filterArray[TS_VIDEO1], frontendArray[DVBS]); } -TEST_P(TunerHidlTest, BroadcastDataFlowAudioFilterTest) { +TEST_P(TunerBroadcastHidlTest, BroadcastDataFlowAudioFilterTest) { description("Test Audio Filter functionality in Broadcast use case."); broadcastSingleFilterTest(filterArray[TS_AUDIO0], frontendArray[DVBS]); } -TEST_P(TunerHidlTest, BroadcastDataFlowTsFilterTest) { +TEST_P(TunerBroadcastHidlTest, BroadcastDataFlowTsFilterTest) { description("Test TS Filter functionality in Broadcast use case."); broadcastSingleFilterTest(filterArray[TS_TS0], frontendArray[DVBS]); } -TEST_P(TunerHidlTest, BroadcastDataFlowSectionFilterTest) { +TEST_P(TunerBroadcastHidlTest, BroadcastDataFlowSectionFilterTest) { description("Test Section Filter functionality in Broadcast use case."); broadcastSingleFilterTest(filterArray[TS_SECTION0], frontendArray[DVBS]); } -TEST_P(TunerHidlTest, IonBufferTest) { +TEST_P(TunerBroadcastHidlTest, IonBufferTest) { description("Test the av filter data bufferring."); broadcastSingleFilterTest(filterArray[TS_VIDEO0], frontendArray[DVBS]); } -/* - * TODO: re-enable the tests after finalizing the testing stream. - */ -/*TEST_P(TunerHidlTest, PlaybackDataFlowWithSectionFilterTest) { - description("Feed ts data from playback and configure pes filter to get output"); - - // todo modulize the filter conf parser - vector<FilterConf> filterConf; - filterConf.resize(1); - - DemuxFilterSettings filterSetting; - DemuxTsFilterSettings tsFilterSetting{ - .tpid = 18, - }; - DemuxFilterSectionSettings sectionFilterSetting; - tsFilterSetting.filterSettings.section(sectionFilterSetting); - filterSetting.ts(tsFilterSetting); - - DemuxFilterType type{ - .mainType = DemuxFilterMainType::TS, - }; - type.subType.tsFilterType(DemuxTsFilterType::SECTION); - FilterConf sectionFilterConf{ - .type = type, - .setting = filterSetting, - }; - filterConf[0] = sectionFilterConf; - - PlaybackSettings playbackSetting{ - .statusMask = 0xf, - .lowThreshold = 0x1000, - .highThreshold = 0x07fff, - .dataFormat = DataFormat::TS, - .packetSize = 188, - }; - - PlaybackConf playbackConf{ - .inputDataFile = "/vendor/etc/test1.ts", - .setting = playbackSetting, - }; - - vector<string> goldenOutputFiles; - - ASSERT_TRUE(playbackDataFlowTest(filterConf, playbackConf, goldenOutputFiles)); + +TEST_P(TunerPlaybackHidlTest, PlaybackDataFlowWithTsRecordFilterTest) { + description("Feed ts data from playback and configure Ts filter to get output"); + playbackSingleFilterTest(filterArray[TS_VIDEO1], dvrArray[DVR_PLAYBACK0]); } -TEST_P(TunerHidlTest, RecordDataFlowWithTsRecordFilterTest) { +TEST_P(TunerRecordHidlTest, AttachFiltersToRecordTest) { + description("Attach a single filter to the record dvr test."); + // TODO use paramterized tests + attachSingleFilterToRecordDvrTest(filterArray[TS_RECORD0], frontendArray[DVBT], + dvrArray[DVR_RECORD0]); +} + +TEST_P(TunerRecordHidlTest, RecordDataFlowWithTsRecordFilterTest) { description("Feed ts data from frontend to recording and test with ts record filter"); + recordSingleFilterTest(filterArray[TS_RECORD0], frontendArray[DVBT], dvrArray[DVR_RECORD0]); +} + +TEST_P(TunerHidlTest, CreateDescrambler) { + description("Create Descrambler"); + uint32_t feId; + uint32_t demuxId; + sp<IDemux> demux; + mFrontendTests.getFrontendIdByType(frontendArray[DVBT].type, feId); + ASSERT_TRUE(feId != INVALID_ID); + ASSERT_TRUE(mFrontendTests.openFrontendById(feId)); + ASSERT_TRUE(mFrontendTests.setFrontendCallback()); + ASSERT_TRUE(mDemuxTests.openDemux(demux, demuxId)); + ASSERT_TRUE(mDemuxTests.setDemuxFrontendDataSource(feId)); + ASSERT_TRUE(createDescrambler(demuxId)); + ASSERT_TRUE(closeDescrambler()); + ASSERT_TRUE(mDemuxTests.closeDemux()); + ASSERT_TRUE(mFrontendTests.closeFrontend()); +} - // todo modulize the filter conf parser - vector<FilterConf> filterConf; - filterConf.resize(1); - - DemuxFilterSettings filterSetting; - DemuxTsFilterSettings tsFilterSetting{ - .tpid = 119, - }; - DemuxFilterRecordSettings recordFilterSetting; - tsFilterSetting.filterSettings.record(recordFilterSetting); - filterSetting.ts(tsFilterSetting); - - DemuxFilterType type{ - .mainType = DemuxFilterMainType::TS, - }; - type.subType.tsFilterType(DemuxTsFilterType::RECORD); - FilterConf recordFilterConf{ - .type = type, - .setting = filterSetting, - }; - filterConf[0] = recordFilterConf; - - RecordSettings recordSetting{ - .statusMask = 0xf, - .lowThreshold = 0x1000, - .highThreshold = 0x07fff, - .dataFormat = DataFormat::TS, - .packetSize = 188, - }; - - vector<string> goldenOutputFiles; - - ASSERT_TRUE(recordDataFlowTest(filterConf, recordSetting, goldenOutputFiles)); -}*/ -/*============================== End Data Flow Tests ==============================*/ -/******************************** End Test Entry **********************************/ INSTANTIATE_TEST_SUITE_P( PerInstance, TunerFrontendHidlTest, testing::ValuesIn(android::hardware::getAllHalInstanceNames(ITuner::descriptor)), android::hardware::PrintInstanceNameToString); INSTANTIATE_TEST_SUITE_P( - PerInstance, TunerHidlTest, + PerInstance, TunerDemuxHidlTest, testing::ValuesIn(android::hardware::getAllHalInstanceNames(ITuner::descriptor)), android::hardware::PrintInstanceNameToString); INSTANTIATE_TEST_SUITE_P( - PerInstance, TunerDemuxHidlTest, + PerInstance, TunerFilterHidlTest, testing::ValuesIn(android::hardware::getAllHalInstanceNames(ITuner::descriptor)), android::hardware::PrintInstanceNameToString); INSTANTIATE_TEST_SUITE_P( - PerInstance, TunerFilterHidlTest, + PerInstance, TunerBroadcastHidlTest, + testing::ValuesIn(android::hardware::getAllHalInstanceNames(ITuner::descriptor)), + android::hardware::PrintInstanceNameToString); + +INSTANTIATE_TEST_SUITE_P( + PerInstance, TunerPlaybackHidlTest, testing::ValuesIn(android::hardware::getAllHalInstanceNames(ITuner::descriptor)), android::hardware::PrintInstanceNameToString); INSTANTIATE_TEST_SUITE_P( - PerInstance, TunerDvrHidlTest, + PerInstance, TunerRecordHidlTest, + testing::ValuesIn(android::hardware::getAllHalInstanceNames(ITuner::descriptor)), + android::hardware::PrintInstanceNameToString); + +INSTANTIATE_TEST_SUITE_P( + PerInstance, TunerHidlTest, testing::ValuesIn(android::hardware::getAllHalInstanceNames(ITuner::descriptor)), android::hardware::PrintInstanceNameToString); } // namespace diff --git a/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.h b/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.h index 37b28660fb..21a98559f9 100644 --- a/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.h +++ b/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TargetTest.h @@ -33,13 +33,19 @@ static AssertionResult success() { namespace { +void initConfiguration() { + initFrontendConfig(); + initFrontendScanConfig(); + initFilterConfig(); + initDvrConfig(); +} + class TunerFrontendHidlTest : public testing::TestWithParam<std::string> { public: virtual void SetUp() override { mService = ITuner::getService(GetParam()); ASSERT_NE(mService, nullptr); - initFrontendConfig(); - initFrontendScanConfig(); + initConfiguration(); mFrontendTests.setService(mService); } @@ -58,9 +64,7 @@ class TunerDemuxHidlTest : public testing::TestWithParam<std::string> { virtual void SetUp() override { mService = ITuner::getService(GetParam()); ASSERT_NE(mService, nullptr); - initFrontendConfig(); - initFrontendScanConfig(); - initFilterConfig(); + initConfiguration(); mFrontendTests.setService(mService); mDemuxTests.setService(mService); @@ -81,9 +85,7 @@ class TunerFilterHidlTest : public testing::TestWithParam<std::string> { virtual void SetUp() override { mService = ITuner::getService(GetParam()); ASSERT_NE(mService, nullptr); - initFrontendConfig(); - initFrontendScanConfig(); - initFilterConfig(); + initConfiguration(); mFrontendTests.setService(mService); mDemuxTests.setService(mService); @@ -103,20 +105,16 @@ class TunerFilterHidlTest : public testing::TestWithParam<std::string> { FilterTests mFilterTests; }; -class TunerDvrHidlTest : public testing::TestWithParam<std::string> { +class TunerBroadcastHidlTest : public testing::TestWithParam<std::string> { public: virtual void SetUp() override { mService = ITuner::getService(GetParam()); ASSERT_NE(mService, nullptr); - initFrontendConfig(); - initFrontendScanConfig(); - initFilterConfig(); - initDvrConfig(); + initConfiguration(); mFrontendTests.setService(mService); mDemuxTests.setService(mService); mFilterTests.setService(mService); - mDvrTests.setService(mService); } protected: @@ -124,28 +122,56 @@ class TunerDvrHidlTest : public testing::TestWithParam<std::string> { RecordProperty("description", description); } - void attachSingleFilterToDvrTest(FilterConfig filterConf, FrontendConfig frontendConf, - DvrConfig dvrConf); + sp<ITuner> mService; + FrontendTests mFrontendTests; + DemuxTests mDemuxTests; + FilterTests mFilterTests; + + AssertionResult filterDataOutputTest(vector<string> goldenOutputFiles); + + void broadcastSingleFilterTest(FilterConfig filterConf, FrontendConfig frontendConf); +}; + +class TunerPlaybackHidlTest : public testing::TestWithParam<std::string> { + public: + virtual void SetUp() override { + mService = ITuner::getService(GetParam()); + ASSERT_NE(mService, nullptr); + initConfiguration(); + + mFrontendTests.setService(mService); + mDemuxTests.setService(mService); + mFilterTests.setService(mService); + mDvrTests.setService(mService); + } + + protected: + static void description(const std::string& description) { + RecordProperty("description", description); + } sp<ITuner> mService; FrontendTests mFrontendTests; DemuxTests mDemuxTests; FilterTests mFilterTests; DvrTests mDvrTests; + + AssertionResult filterDataOutputTest(vector<string> goldenOutputFiles); + + void playbackSingleFilterTest(FilterConfig filterConf, DvrConfig dvrConf); }; -class TunerHidlTest : public testing::TestWithParam<std::string> { +class TunerRecordHidlTest : public testing::TestWithParam<std::string> { public: virtual void SetUp() override { mService = ITuner::getService(GetParam()); ASSERT_NE(mService, nullptr); - initFrontendConfig(); - initFrontendScanConfig(); - initFilterConfig(); + initConfiguration(); mFrontendTests.setService(mService); mDemuxTests.setService(mService); mFilterTests.setService(mService); + mDvrTests.setService(mService); } protected: @@ -153,23 +179,41 @@ class TunerHidlTest : public testing::TestWithParam<std::string> { RecordProperty("description", description); } + void attachSingleFilterToRecordDvrTest(FilterConfig filterConf, FrontendConfig frontendConf, + DvrConfig dvrConf); + void recordSingleFilterTest(FilterConfig filterConf, FrontendConfig frontendConf, + DvrConfig dvrConf); + sp<ITuner> mService; FrontendTests mFrontendTests; DemuxTests mDemuxTests; FilterTests mFilterTests; + DvrTests mDvrTests; +}; + +class TunerHidlTest : public testing::TestWithParam<std::string> { + public: + virtual void SetUp() override { + mService = ITuner::getService(GetParam()); + ASSERT_NE(mService, nullptr); + initConfiguration(); + + mFrontendTests.setService(mService); + mDemuxTests.setService(mService); + } + + protected: + static void description(const std::string& description) { + RecordProperty("description", description); + } + + sp<ITuner> mService; + FrontendTests mFrontendTests; + DemuxTests mDemuxTests; sp<IDescrambler> mDescrambler; AssertionResult createDescrambler(uint32_t demuxId); AssertionResult closeDescrambler(); - - AssertionResult playbackDataFlowTest(vector<FilterConfig> filterConf, PlaybackConf playbackConf, - vector<string> goldenOutputFiles); - AssertionResult recordDataFlowTest(vector<FilterConfig> filterConf, - RecordSettings recordSetting, - vector<string> goldenOutputFiles); - AssertionResult broadcastDataFlowTest(vector<string> goldenOutputFiles); - - void broadcastSingleFilterTest(FilterConfig filterConf, FrontendConfig frontendConf); }; } // namespace diff --git a/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TestConfigurations.h b/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TestConfigurations.h index a74fa02855..a9f892262c 100644 --- a/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TestConfigurations.h +++ b/tv/tuner/1.0/vts/functional/VtsHalTvTunerV1_0TestConfigurations.h @@ -26,6 +26,7 @@ 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::DemuxRecordScIndexType; using android::hardware::tv::tuner::V1_0::DemuxTpid; using android::hardware::tv::tuner::V1_0::DemuxTsFilterType; using android::hardware::tv::tuner::V1_0::DvrSettings; @@ -45,6 +46,10 @@ using android::hardware::tv::tuner::V1_0::RecordSettings; using namespace std; +const uint32_t FMQ_SIZE_1M = 0x100000; +const uint32_t FMQ_SIZE_4M = 0x400000; +const uint32_t FMQ_SIZE_16M = 0x1000000; + typedef enum { TS_VIDEO0, TS_VIDEO1, @@ -53,6 +58,7 @@ typedef enum { TS_PCR0, TS_SECTION0, TS_TS0, + TS_RECORD0, FILTER_MAX, } Filter; @@ -74,6 +80,7 @@ typedef enum { } Dvr; struct FilterConfig { + uint32_t bufferSize; DemuxFilterType type; DemuxFilterSettings settings; }; @@ -93,7 +100,9 @@ struct ChannelConfig { struct DvrConfig { DvrType type; + uint32_t bufferSize; DvrSettings settings; + string playbackInputFile; }; static FrontendConfig frontendArray[FILTER_MAX]; @@ -143,20 +152,24 @@ 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 = 119; 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 = 81; 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 = 84; filterArray[TS_AUDIO0].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, @@ -165,20 +178,30 @@ inline void initFilterConfig() { // 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 = 81; 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].settings.ts().tpid = 48; + filterArray[TS_TS0].bufferSize = FMQ_SIZE_16M; + filterArray[TS_TS0].settings.ts().tpid = 18; 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 = 48; filterArray[TS_SECTION0].settings.ts().filterSettings.section({ .isRaw = false, }); + // 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, + }); }; /** Configuration array for the dvr test */ @@ -191,6 +214,7 @@ inline void initDvrConfig() { .packetSize = 188, }; dvrArray[DVR_RECORD0].type = DvrType::RECORD; + dvrArray[DVR_RECORD0].bufferSize = FMQ_SIZE_4M; dvrArray[DVR_RECORD0].settings.record(recordSettings); PlaybackSettings playbackSettings{ .statusMask = 0xf, @@ -200,5 +224,7 @@ inline void initDvrConfig() { .packetSize = 188, }; dvrArray[DVR_PLAYBACK0].type = DvrType::PLAYBACK; + dvrArray[DVR_PLAYBACK0].playbackInputFile = "/vendor/etc/test1.ts"; + dvrArray[DVR_PLAYBACK0].bufferSize = FMQ_SIZE_4M; dvrArray[DVR_PLAYBACK0].settings.playback(playbackSettings); -};
\ No newline at end of file +}; |