Loading services/tuner/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -86,6 +86,7 @@ cc_library { static_libs: [ "android.hardware.common.fmq-unstable-ndk_platform", "libaidlcommonsupport", ], include_dirs: [ Loading services/tuner/TunerFilter.cpp +124 −2 Original line number Diff line number Diff line Loading @@ -16,8 +16,11 @@ #define LOG_TAG "TunerFilter" #include <aidlcommonsupport/NativeHandle.h> #include "TunerFilter.h" using ::android::hardware::tv::tuner::V1_0::DemuxFilterSettings; using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterSettings; using ::android::hardware::tv::tuner::V1_0::Result; namespace android { Loading @@ -34,6 +37,13 @@ TunerFilter::~TunerFilter() { mFilterCallback = nullptr; } DemuxFilterAvSettings TunerFilter::getAvSettings(const TunerFilterSettings& settings) { DemuxFilterAvSettings av { .isPassthrough = settings.get<TunerFilterSettings::av>().isPassthrough, }; return av; } Status TunerFilter::getId(int32_t* _aidl_return) { if (mFilter == nullptr) { ALOGE("IFilter is not initialized"); Loading @@ -46,7 +56,7 @@ Status TunerFilter::getId(int32_t* _aidl_return) { mId = filterId; }); if (res != Result::SUCCESS) { return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res)); return Status::fromServiceSpecificError(static_cast<int32_t>(res)); } *_aidl_return = mId; return Status::ok(); Loading @@ -70,14 +80,126 @@ Status TunerFilter::getId64Bit(int64_t* _aidl_return) { return Status::ok(); } Status TunerFilter::configure(const TunerFilterConfiguration& config) { if (mFilter == nullptr) { ALOGE("IFilter is not initialized"); return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE)); } // TODO: more filter types. TunerFilterSettings tunerSettings; DemuxFilterSettings halSettings; switch (config.getTag()) { case TunerFilterConfiguration::ts: { uint16_t tpid = static_cast<uint16_t>(config.get<TunerFilterConfiguration::ts>().tpid); tunerSettings = config.get<TunerFilterConfiguration::ts>().filterSettings; DemuxTsFilterSettings ts { .tpid = tpid, }; switch (tunerSettings.getTag()) { case TunerFilterSettings::av: { ts.filterSettings.av(getAvSettings(tunerSettings)); break; } } break; } } Result res = mFilter->configure(halSettings); if (res != Result::SUCCESS) { return Status::fromServiceSpecificError(static_cast<int32_t>(res)); } return Status::ok(); } Status TunerFilter::start() { if (mFilter == nullptr) { ALOGE("IFilter is not initialized"); return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE)); } Result res = mFilter->start(); if (res != Result::SUCCESS) { return Status::fromServiceSpecificError(static_cast<int32_t>(res)); } return Status::ok(); } Status TunerFilter::stop() { if (mFilter == nullptr) { ALOGE("IFilter is not initialized"); return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE)); } Result res = mFilter->stop(); if (res != Result::SUCCESS) { return Status::fromServiceSpecificError(static_cast<int32_t>(res)); } return Status::ok(); } Status TunerFilter::flush() { if (mFilter == nullptr) { ALOGE("IFilter is not initialized"); return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE)); } Result res = mFilter->flush(); if (res != Result::SUCCESS) { return Status::fromServiceSpecificError(static_cast<int32_t>(res)); } return Status::ok(); } /////////////// FilterCallback /////////////////////// void TunerFilter::FilterCallback::getMediaEvent( std::vector<DemuxFilterEvent::Event>& events, std::vector<TunerFilterEvent>& res) { for (DemuxFilterEvent::Event e : events) { DemuxFilterMediaEvent mediaEvent = e.media(); TunerFilterMediaEvent tunerMedia; tunerMedia.streamId = static_cast<int>(mediaEvent.streamId); tunerMedia.isPtsPresent = mediaEvent.isPtsPresent; tunerMedia.pts = static_cast<long>(mediaEvent.pts); tunerMedia.dataLength = static_cast<long>(mediaEvent.dataLength); tunerMedia.offset = static_cast<long>(mediaEvent.offset); tunerMedia.isSecureMemory = mediaEvent.isSecureMemory; tunerMedia.avDataId = static_cast<long>(mediaEvent.avDataId); tunerMedia.mpuSequenceNumber = static_cast<int>(mediaEvent.mpuSequenceNumber); tunerMedia.isPesPrivateData = mediaEvent.isPesPrivateData; if (mediaEvent.avMemory.getNativeHandle() != nullptr) { tunerMedia.avMemory = dupToAidl(mediaEvent.avMemory.getNativeHandle()); } TunerFilterEvent tunerEvent; tunerEvent.set<TunerFilterEvent::media>(std::move(tunerMedia)); res.push_back(std::move(tunerEvent)); } } Return<void> TunerFilter::FilterCallback::onFilterStatus(DemuxFilterStatus status) { mTunerFilterCallback->onFilterStatus((int)status); return Void(); } Return<void> TunerFilter::FilterCallback::onFilterEvent(const DemuxFilterEvent&) { Return<void> TunerFilter::FilterCallback::onFilterEvent(const DemuxFilterEvent& filterEvent) { ALOGD("FilterCallback::onFilterEvent"); std::vector<DemuxFilterEvent::Event> events = filterEvent.events; std::vector<TunerFilterEvent> tunerEvent; if (!events.empty()) { DemuxFilterEvent::Event event = events[0]; switch (event.getDiscriminator()) { case DemuxFilterEvent::Event::hidl_discriminator::media: { getMediaEvent(events, tunerEvent); break; } default: { break; } } } mTunerFilterCallback->onFilterEvent(&tunerEvent); return Void(); } Loading services/tuner/TunerFilter.h +13 −0 Original line number Diff line number Diff line Loading @@ -26,9 +26,15 @@ using Status = ::ndk::ScopedAStatus; using ::aidl::android::media::tv::tuner::BnTunerFilter; using ::aidl::android::media::tv::tuner::ITunerFilterCallback; using ::aidl::android::media::tv::tuner::TunerFilterConfiguration; using ::aidl::android::media::tv::tuner::TunerFilterEvent; using ::aidl::android::media::tv::tuner::TunerFilterMediaEvent; using ::aidl::android::media::tv::tuner::TunerFilterSettings; using ::android::hardware::Return; using ::android::hardware::Void; using ::android::hardware::tv::tuner::V1_0::DemuxFilterAvSettings; using ::android::hardware::tv::tuner::V1_0::DemuxFilterEvent; using ::android::hardware::tv::tuner::V1_0::DemuxFilterMediaEvent; using ::android::hardware::tv::tuner::V1_0::DemuxFilterStatus; using ::android::hardware::tv::tuner::V1_0::IFilter; using ::android::hardware::tv::tuner::V1_0::IFilterCallback; Loading @@ -43,6 +49,10 @@ public: virtual ~TunerFilter(); Status getId(int32_t* _aidl_return) override; Status getId64Bit(int64_t* _aidl_return) override; Status configure(const TunerFilterConfiguration& config) override; Status start() override; Status stop() override; Status flush() override; struct FilterCallback : public IFilterCallback { FilterCallback(const std::shared_ptr<ITunerFilterCallback> tunerFilterCallback) Loading @@ -50,11 +60,14 @@ public: virtual Return<void> onFilterEvent(const DemuxFilterEvent& filterEvent); virtual Return<void> onFilterStatus(DemuxFilterStatus status); void getMediaEvent( std::vector<DemuxFilterEvent::Event>& events, std::vector<TunerFilterEvent>& res); std::shared_ptr<ITunerFilterCallback> mTunerFilterCallback; }; private: DemuxFilterAvSettings getAvSettings(const TunerFilterSettings& settings); sp<IFilter> mFilter; sp<::android::hardware::tv::tuner::V1_1::IFilter> mFilter_1_1; sp<IFilterCallback> mFilterCallback; Loading services/tuner/aidl/android/media/tv/tuner/ITunerFilter.aidl +22 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package android.media.tv.tuner; import android.media.tv.tuner.TunerFilterConfiguration; /** * Tuner Filter interface handles tuner related operations. * Loading @@ -31,4 +33,24 @@ interface ITunerFilter { * Get the 64-bit filter Id. */ long getId64Bit(); /** * Configure the filter. */ void configure(in TunerFilterConfiguration config); /** * Start the filter. */ void start(); /** * Stop the filter. */ void stop(); /** * Flush the filter. */ void flush(); } services/tuner/aidl/android/media/tv/tuner/ITunerFilterCallback.aidl +7 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package android.media.tv.tuner; import android.media.tv.tuner.TunerFilterEvent; /** * TunerFilterCallback interface handles tuner filter related callbacks. * Loading @@ -26,4 +28,9 @@ interface ITunerFilterCallback { * Notify the client a new status of a filter. */ void onFilterStatus(int status); /** * Notify the client that a new filter event happened. */ void onFilterEvent(out TunerFilterEvent[] filterEvent); } Loading
services/tuner/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -86,6 +86,7 @@ cc_library { static_libs: [ "android.hardware.common.fmq-unstable-ndk_platform", "libaidlcommonsupport", ], include_dirs: [ Loading
services/tuner/TunerFilter.cpp +124 −2 Original line number Diff line number Diff line Loading @@ -16,8 +16,11 @@ #define LOG_TAG "TunerFilter" #include <aidlcommonsupport/NativeHandle.h> #include "TunerFilter.h" using ::android::hardware::tv::tuner::V1_0::DemuxFilterSettings; using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterSettings; using ::android::hardware::tv::tuner::V1_0::Result; namespace android { Loading @@ -34,6 +37,13 @@ TunerFilter::~TunerFilter() { mFilterCallback = nullptr; } DemuxFilterAvSettings TunerFilter::getAvSettings(const TunerFilterSettings& settings) { DemuxFilterAvSettings av { .isPassthrough = settings.get<TunerFilterSettings::av>().isPassthrough, }; return av; } Status TunerFilter::getId(int32_t* _aidl_return) { if (mFilter == nullptr) { ALOGE("IFilter is not initialized"); Loading @@ -46,7 +56,7 @@ Status TunerFilter::getId(int32_t* _aidl_return) { mId = filterId; }); if (res != Result::SUCCESS) { return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res)); return Status::fromServiceSpecificError(static_cast<int32_t>(res)); } *_aidl_return = mId; return Status::ok(); Loading @@ -70,14 +80,126 @@ Status TunerFilter::getId64Bit(int64_t* _aidl_return) { return Status::ok(); } Status TunerFilter::configure(const TunerFilterConfiguration& config) { if (mFilter == nullptr) { ALOGE("IFilter is not initialized"); return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE)); } // TODO: more filter types. TunerFilterSettings tunerSettings; DemuxFilterSettings halSettings; switch (config.getTag()) { case TunerFilterConfiguration::ts: { uint16_t tpid = static_cast<uint16_t>(config.get<TunerFilterConfiguration::ts>().tpid); tunerSettings = config.get<TunerFilterConfiguration::ts>().filterSettings; DemuxTsFilterSettings ts { .tpid = tpid, }; switch (tunerSettings.getTag()) { case TunerFilterSettings::av: { ts.filterSettings.av(getAvSettings(tunerSettings)); break; } } break; } } Result res = mFilter->configure(halSettings); if (res != Result::SUCCESS) { return Status::fromServiceSpecificError(static_cast<int32_t>(res)); } return Status::ok(); } Status TunerFilter::start() { if (mFilter == nullptr) { ALOGE("IFilter is not initialized"); return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE)); } Result res = mFilter->start(); if (res != Result::SUCCESS) { return Status::fromServiceSpecificError(static_cast<int32_t>(res)); } return Status::ok(); } Status TunerFilter::stop() { if (mFilter == nullptr) { ALOGE("IFilter is not initialized"); return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE)); } Result res = mFilter->stop(); if (res != Result::SUCCESS) { return Status::fromServiceSpecificError(static_cast<int32_t>(res)); } return Status::ok(); } Status TunerFilter::flush() { if (mFilter == nullptr) { ALOGE("IFilter is not initialized"); return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE)); } Result res = mFilter->flush(); if (res != Result::SUCCESS) { return Status::fromServiceSpecificError(static_cast<int32_t>(res)); } return Status::ok(); } /////////////// FilterCallback /////////////////////// void TunerFilter::FilterCallback::getMediaEvent( std::vector<DemuxFilterEvent::Event>& events, std::vector<TunerFilterEvent>& res) { for (DemuxFilterEvent::Event e : events) { DemuxFilterMediaEvent mediaEvent = e.media(); TunerFilterMediaEvent tunerMedia; tunerMedia.streamId = static_cast<int>(mediaEvent.streamId); tunerMedia.isPtsPresent = mediaEvent.isPtsPresent; tunerMedia.pts = static_cast<long>(mediaEvent.pts); tunerMedia.dataLength = static_cast<long>(mediaEvent.dataLength); tunerMedia.offset = static_cast<long>(mediaEvent.offset); tunerMedia.isSecureMemory = mediaEvent.isSecureMemory; tunerMedia.avDataId = static_cast<long>(mediaEvent.avDataId); tunerMedia.mpuSequenceNumber = static_cast<int>(mediaEvent.mpuSequenceNumber); tunerMedia.isPesPrivateData = mediaEvent.isPesPrivateData; if (mediaEvent.avMemory.getNativeHandle() != nullptr) { tunerMedia.avMemory = dupToAidl(mediaEvent.avMemory.getNativeHandle()); } TunerFilterEvent tunerEvent; tunerEvent.set<TunerFilterEvent::media>(std::move(tunerMedia)); res.push_back(std::move(tunerEvent)); } } Return<void> TunerFilter::FilterCallback::onFilterStatus(DemuxFilterStatus status) { mTunerFilterCallback->onFilterStatus((int)status); return Void(); } Return<void> TunerFilter::FilterCallback::onFilterEvent(const DemuxFilterEvent&) { Return<void> TunerFilter::FilterCallback::onFilterEvent(const DemuxFilterEvent& filterEvent) { ALOGD("FilterCallback::onFilterEvent"); std::vector<DemuxFilterEvent::Event> events = filterEvent.events; std::vector<TunerFilterEvent> tunerEvent; if (!events.empty()) { DemuxFilterEvent::Event event = events[0]; switch (event.getDiscriminator()) { case DemuxFilterEvent::Event::hidl_discriminator::media: { getMediaEvent(events, tunerEvent); break; } default: { break; } } } mTunerFilterCallback->onFilterEvent(&tunerEvent); return Void(); } Loading
services/tuner/TunerFilter.h +13 −0 Original line number Diff line number Diff line Loading @@ -26,9 +26,15 @@ using Status = ::ndk::ScopedAStatus; using ::aidl::android::media::tv::tuner::BnTunerFilter; using ::aidl::android::media::tv::tuner::ITunerFilterCallback; using ::aidl::android::media::tv::tuner::TunerFilterConfiguration; using ::aidl::android::media::tv::tuner::TunerFilterEvent; using ::aidl::android::media::tv::tuner::TunerFilterMediaEvent; using ::aidl::android::media::tv::tuner::TunerFilterSettings; using ::android::hardware::Return; using ::android::hardware::Void; using ::android::hardware::tv::tuner::V1_0::DemuxFilterAvSettings; using ::android::hardware::tv::tuner::V1_0::DemuxFilterEvent; using ::android::hardware::tv::tuner::V1_0::DemuxFilterMediaEvent; using ::android::hardware::tv::tuner::V1_0::DemuxFilterStatus; using ::android::hardware::tv::tuner::V1_0::IFilter; using ::android::hardware::tv::tuner::V1_0::IFilterCallback; Loading @@ -43,6 +49,10 @@ public: virtual ~TunerFilter(); Status getId(int32_t* _aidl_return) override; Status getId64Bit(int64_t* _aidl_return) override; Status configure(const TunerFilterConfiguration& config) override; Status start() override; Status stop() override; Status flush() override; struct FilterCallback : public IFilterCallback { FilterCallback(const std::shared_ptr<ITunerFilterCallback> tunerFilterCallback) Loading @@ -50,11 +60,14 @@ public: virtual Return<void> onFilterEvent(const DemuxFilterEvent& filterEvent); virtual Return<void> onFilterStatus(DemuxFilterStatus status); void getMediaEvent( std::vector<DemuxFilterEvent::Event>& events, std::vector<TunerFilterEvent>& res); std::shared_ptr<ITunerFilterCallback> mTunerFilterCallback; }; private: DemuxFilterAvSettings getAvSettings(const TunerFilterSettings& settings); sp<IFilter> mFilter; sp<::android::hardware::tv::tuner::V1_1::IFilter> mFilter_1_1; sp<IFilterCallback> mFilterCallback; Loading
services/tuner/aidl/android/media/tv/tuner/ITunerFilter.aidl +22 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package android.media.tv.tuner; import android.media.tv.tuner.TunerFilterConfiguration; /** * Tuner Filter interface handles tuner related operations. * Loading @@ -31,4 +33,24 @@ interface ITunerFilter { * Get the 64-bit filter Id. */ long getId64Bit(); /** * Configure the filter. */ void configure(in TunerFilterConfiguration config); /** * Start the filter. */ void start(); /** * Stop the filter. */ void stop(); /** * Flush the filter. */ void flush(); }
services/tuner/aidl/android/media/tv/tuner/ITunerFilterCallback.aidl +7 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package android.media.tv.tuner; import android.media.tv.tuner.TunerFilterEvent; /** * TunerFilterCallback interface handles tuner filter related callbacks. * Loading @@ -26,4 +28,9 @@ interface ITunerFilterCallback { * Notify the client a new status of a filter. */ void onFilterStatus(int status); /** * Notify the client that a new filter event happened. */ void onFilterEvent(out TunerFilterEvent[] filterEvent); }