diff --git a/tv/tuner/1.1/IFilter.hal b/tv/tuner/1.1/IFilter.hal index 2ba9bb761d..3ea42094b8 100644 --- a/tv/tuner/1.1/IFilter.hal +++ b/tv/tuner/1.1/IFilter.hal @@ -70,4 +70,15 @@ interface IFilter extends @1.0::IFilter { * memory is not initialized. */ getAvSharedHandle() generates (Result result, handle avMemory, uint64_t avMemSize); + + /** + * Configure A/V filter’s stream type. This API only applies to A/V filters. + * + * @param avStreamType the stream type for A/V. + * @return return result Result status of the operation. + * SUCCESS if successful, + * INVALID_STATE if configure can't be applied, + * UNKNOWN_ERROR if failed for other reasons. + */ + configureAvStreamType(AvStreamType avStreamType) generates (Result result); }; diff --git a/tv/tuner/1.1/default/Filter.cpp b/tv/tuner/1.1/default/Filter.cpp index c69beca12b..11e323c54c 100644 --- a/tv/tuner/1.1/default/Filter.cpp +++ b/tv/tuner/1.1/default/Filter.cpp @@ -228,6 +228,27 @@ Return Filter::getAvSharedHandle(getAvSharedHandle_cb _hidl_cb) { return Void(); } +Return Filter::configureAvStreamType(const V1_1::AvStreamType& avStreamType) { + ALOGV("%s", __FUNCTION__); + + if (!mIsMediaFilter) { + return Result::UNAVAILABLE; + } + + switch (avStreamType.getDiscriminator()) { + case V1_1::AvStreamType::hidl_discriminator::audio: + mAudioStreamType = static_cast(avStreamType.audio()); + break; + case V1_1::AvStreamType::hidl_discriminator::video: + mVideoStreamType = static_cast(avStreamType.video()); + break; + default: + break; + } + + return Result::SUCCESS; +} + bool Filter::createFilterMQ() { ALOGV("%s", __FUNCTION__); diff --git a/tv/tuner/1.1/default/Filter.h b/tv/tuner/1.1/default/Filter.h index f6776661d3..f8b9a651e4 100644 --- a/tv/tuner/1.1/default/Filter.h +++ b/tv/tuner/1.1/default/Filter.h @@ -82,6 +82,8 @@ class Filter : public V1_1::IFilter { virtual Return getAvSharedHandle(getAvSharedHandle_cb _hidl_cb) override; + virtual Return configureAvStreamType(const V1_1::AvStreamType& avStreamType) override; + /** * To create a FilterMQ and its Event Flag. * @@ -225,6 +227,9 @@ class Filter : public V1_1::IFilter { hidl_handle mSharedAvMemHandle; bool mUsingSharedAvMem = true; uint32_t mSharedAvMemOffset = 0; + + uint32_t mAudioStreamType; + uint32_t mVideoStreamType; }; } // namespace implementation diff --git a/tv/tuner/1.1/types.hal b/tv/tuner/1.1/types.hal index 695826ab16..1ed64037e1 100644 --- a/tv/tuner/1.1/types.hal +++ b/tv/tuner/1.1/types.hal @@ -568,3 +568,130 @@ safe_union FrontendScanMessageExt1_1 { bool isHighPriority; }; + +@export +enum VideoStreamType : uint32_t { + UNDEFINED, + /* + * ITU-T | ISO/IEC Reserved + */ + RESERVED, + /* + * ISO/IEC 11172 + */ + MPEG1, + /* + * ITU-T Rec.H.262 and ISO/IEC 13818-2 + */ + MPEG2, + /* + * ISO/IEC 14496-2 (MPEG-4 H.263 based video) + */ + MPEG4P2, + /* + * ITU-T Rec.H.264 and ISO/IEC 14496-10 + */ + AVC, + /* + * ITU-T Rec. H.265 and ISO/IEC 23008-2 + */ + HEVC, + /* + * Microsoft VC.1 + */ + VC1, + /* + * Google VP8 + */ + VP8, + /* + * Google VP9 + */ + VP9, + /* + * AOMedia Video 1 + */ + AV1, + /* + * Chinese Standard + */ + AVS, + /* + * New Chinese Standard + */ + AVS2, +}; + +@export +enum AudioStreamType : uint32_t { + UNDEFINED, + /* + * Uncompressed Audio + */ + PCM, + /* + * MPEG Audio Layer III versions + */ + MP3, + /* + * ISO/IEC 11172 Audio + */ + MPEG1, + /* + * ISO/IEC 13818-3 + */ + MPEG2, + /* + * ISO/IEC 23008-3 (MPEG-H Part 3) + */ + MPEGH, + /* + * ISO/IEC 14496-3 + */ + AAC, + /* + * Dolby Digital + */ + AC3, + /* + * Dolby Digital Plus + */ + EAC3, + /* + * Dolby AC-4 + */ + AC4, + /* + * Basic DTS + */ + DTS, + /* + * High Resolution DTS + */ + DTS_HD, + /* + * Windows Media Audio + */ + WMA, + /* + * Opus Interactive Audio Codec + */ + OPUS, + /* + * VORBIS Interactive Audio Codec + */ + VORBIS, + /* + * SJ/T 11368-2006 + */ + DRA, +}; + +/** + * Stream type for A/V filter. + */ +safe_union AvStreamType { + VideoStreamType video; + + AudioStreamType audio; +}; diff --git a/tv/tuner/1.1/vts/functional/FilterTests.cpp b/tv/tuner/1.1/vts/functional/FilterTests.cpp index 5a8985dc2a..e661735808 100644 --- a/tv/tuner/1.1/vts/functional/FilterTests.cpp +++ b/tv/tuner/1.1/vts/functional/FilterTests.cpp @@ -164,6 +164,20 @@ AssertionResult FilterTests::configFilter(DemuxFilterSettings setting, uint64_t return AssertionResult(status == Result::SUCCESS); } +AssertionResult FilterTests::configAvFilterStreamType(AvStreamType type, uint64_t filterId) { + Result status; + EXPECT_TRUE(mFilters[filterId]) << "Test with getNewlyOpenedFilterId first."; + sp filter_v1_1 = + android::hardware::tv::tuner::V1_1::IFilter::castFrom(mFilters[filterId]); + if (filter_v1_1 != NULL) { + status = filter_v1_1->configureAvStreamType(type); + } else { + ALOGW("[vts] Can't cast IFilter into v1_1."); + return failure(); + } + return AssertionResult(status == Result::SUCCESS); +} + AssertionResult FilterTests::configIpFilterCid(uint32_t ipCid, uint64_t filterId) { Result status; EXPECT_TRUE(mFilters[filterId]) << "Open Ip filter first."; diff --git a/tv/tuner/1.1/vts/functional/FilterTests.h b/tv/tuner/1.1/vts/functional/FilterTests.h index bc6db86f9c..3472e4ebb5 100644 --- a/tv/tuner/1.1/vts/functional/FilterTests.h +++ b/tv/tuner/1.1/vts/functional/FilterTests.h @@ -54,6 +54,7 @@ using android::hardware::tv::tuner::V1_0::DemuxTsFilterType; using android::hardware::tv::tuner::V1_0::IDemux; using android::hardware::tv::tuner::V1_0::IFilter; using android::hardware::tv::tuner::V1_0::Result; +using android::hardware::tv::tuner::V1_1::AvStreamType; using android::hardware::tv::tuner::V1_1::DemuxFilterEventExt; using android::hardware::tv::tuner::V1_1::IFilterCallback; using android::hardware::tv::tuner::V1_1::ITuner; @@ -150,6 +151,7 @@ class FilterTests { AssertionResult getSharedAvMemoryHandle(uint64_t filterId); AssertionResult releaseShareAvHandle(uint64_t filterId); AssertionResult configFilter(DemuxFilterSettings setting, uint64_t filterId); + AssertionResult configAvFilterStreamType(AvStreamType type, uint64_t filterId); AssertionResult configIpFilterCid(uint32_t ipCid, uint64_t filterId); AssertionResult getFilterMQDescriptor(uint64_t filterId); AssertionResult startFilter(uint64_t filterId); diff --git a/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TargetTest.cpp b/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TargetTest.cpp index 263b0e9a8c..db2ac1bda1 100644 --- a/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TargetTest.cpp +++ b/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TargetTest.cpp @@ -69,6 +69,7 @@ void TunerBroadcastHidlTest::mediaFilterUsingSharedMemoryTest(FilterConfig filte ASSERT_TRUE(mFilterTests.getNewlyOpenedFilterId_64bit(filterId)); ASSERT_TRUE(mFilterTests.getSharedAvMemoryHandle(filterId)); ASSERT_TRUE(mFilterTests.configFilter(filterConf.settings, filterId)); + ASSERT_TRUE(mFilterTests.configAvFilterStreamType(filterConf.streamType, filterId)); ASSERT_TRUE(mFilterTests.getFilterMQDescriptor(filterId)); ASSERT_TRUE(mFilterTests.startFilter(filterId)); // tune test diff --git a/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TestConfigurations.h b/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TestConfigurations.h index a3bfa1f87a..cb86ce8546 100644 --- a/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TestConfigurations.h +++ b/tv/tuner/1.1/vts/functional/VtsHalTvTunerV1_1TestConfigurations.h @@ -46,9 +46,12 @@ using android::hardware::tv::tuner::V1_0::FrontendSettings; using android::hardware::tv::tuner::V1_0::FrontendType; using android::hardware::tv::tuner::V1_0::PlaybackSettings; using android::hardware::tv::tuner::V1_0::RecordSettings; +using android::hardware::tv::tuner::V1_1::AudioStreamType; +using android::hardware::tv::tuner::V1_1::AvStreamType; using android::hardware::tv::tuner::V1_1::FrontendSettingsExt1_1; using android::hardware::tv::tuner::V1_1::FrontendStatusExt1_1; using android::hardware::tv::tuner::V1_1::FrontendStatusTypeExt1_1; +using android::hardware::tv::tuner::V1_1::VideoStreamType; using namespace std; @@ -91,6 +94,7 @@ struct FilterConfig { uint32_t bufferSize; DemuxFilterType type; DemuxFilterSettings settings; + AvStreamType streamType; uint32_t ipCid; bool operator<(const FilterConfig& /*c*/) const { return false; } @@ -184,6 +188,7 @@ inline void initFilterConfig() { filterArray[TS_VIDEO1].bufferSize = FMQ_SIZE_16M; filterArray[TS_VIDEO1].settings.ts().tpid = 256; filterArray[TS_VIDEO1].settings.ts().filterSettings.av({.isPassthrough = false}); + filterArray[TS_VIDEO1].streamType.video(VideoStreamType::MPEG1); // TS AUDIO filter setting filterArray[TS_AUDIO0].type.mainType = DemuxFilterMainType::TS; filterArray[TS_AUDIO0].type.subType.tsFilterType(DemuxTsFilterType::AUDIO); @@ -195,6 +200,7 @@ inline void initFilterConfig() { filterArray[TS_AUDIO1].bufferSize = FMQ_SIZE_16M; filterArray[TS_AUDIO1].settings.ts().tpid = 257; filterArray[TS_AUDIO1].settings.ts().filterSettings.av({.isPassthrough = false}); + filterArray[TS_VIDEO1].streamType.audio(AudioStreamType::MP3); // TS PES filter setting filterArray[TS_PES0].type.mainType = DemuxFilterMainType::TS; filterArray[TS_PES0].type.subType.tsFilterType(DemuxTsFilterType::PES);