Loading media/jni/tuner/ClientHelper.h 0 → 100644 +45 −0 Original line number Diff line number Diff line /* * Copyright 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _ANDROID_MEDIA_TV_CLIENT_HELPER_H_ #define _ANDROID_MEDIA_TV_CLIENT_HELPER_H_ #include <android/binder_parcel_utils.h> #include <android/hardware/tv/tuner/1.1/types.h> using Status = ::ndk::ScopedAStatus; using ::android::hardware::tv::tuner::V1_0::Result; using namespace std; namespace android { struct ClientHelper { public: static Result getServiceSpecificErrorCode(Status& s) { if (s.getExceptionCode() == EX_SERVICE_SPECIFIC) { return static_cast<Result>(s.getServiceSpecificError()); } else if (s.isOk()) { return Result::SUCCESS; } return Result::UNKNOWN_ERROR; } }; } // namespace android #endif // _ANDROID_MEDIA_TV_CLIENT_HELPER_H_ No newline at end of file media/jni/tuner/DemuxClient.cpp +37 −12 Original line number Diff line number Diff line Loading @@ -23,20 +23,20 @@ using ::aidl::android::media::tv::tuner::TunerFrontendSettings; using ::android::hardware::tv::tuner::V1_0::DemuxFilterMainType; using ::android::hardware::tv::tuner::V1_0::Result; namespace android { /////////////// DemuxClient /////////////////////// // TODO: pending aidl interface DemuxClient::DemuxClient() { //mTunerDemux = tunerDemux; DemuxClient::DemuxClient(shared_ptr<ITunerDemux> tunerDemux) { mTunerDemux = tunerDemux; mId = -1; } DemuxClient::~DemuxClient() { //mTunerDemux = NULL; mTunerDemux = NULL; mDemux = NULL; mId = -1; } Loading @@ -47,12 +47,10 @@ void DemuxClient::setHidlDemux(sp<IDemux> demux) { } Result DemuxClient::setFrontendDataSource(sp<FrontendClient> frontendClient) { // TODO: pending aidl interface /*if (mTunerDemux != NULL) { // TODO: handle error message mTunerDemux->setFrontendDataSource(frontendClient->getAidlFrontend()); return (int) Result::SUCCESS; }*/ if (mTunerDemux != NULL) { Status s = mTunerDemux->setFrontendDataSource(frontendClient->getAidlFrontend()); return ClientHelper::getServiceSpecificErrorCode(s); } if (mDemux != NULL) { Result res = mDemux->setFrontendDataSource(frontendClient->getId()); Loading @@ -64,13 +62,23 @@ Result DemuxClient::setFrontendDataSource(sp<FrontendClient> frontendClient) { sp<FilterClient> DemuxClient::openFilter(DemuxFilterType type, int bufferSize, sp<FilterClientCallback> cb) { // TODO: pending aidl interface if (mTunerDemux != NULL) { shared_ptr<ITunerFilter> tunerFilter; shared_ptr<TunerFilterCallback> callback = ::ndk::SharedRefBase::make<TunerFilterCallback>(cb); Status s = mTunerDemux->openFilter((int)type.mainType, getSubType(type), bufferSize, callback, &tunerFilter); if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) { return NULL; } return new FilterClient(type, tunerFilter); } if (mDemux != NULL) { sp<HidlFilterCallback> callback = new HidlFilterCallback(cb); sp<IFilter> hidlFilter = openHidlFilter(type, bufferSize, callback); if (hidlFilter != NULL) { sp<FilterClient> filterClient = new FilterClient(type); sp<FilterClient> filterClient = new FilterClient(type, NULL); filterClient->setHidlFilter(hidlFilter); return filterClient; } Loading Loading @@ -244,4 +252,21 @@ sp<IDvr> DemuxClient::openHidlDvr(DvrType dvrType, int bufferSize, return hidlDvr; } int DemuxClient::getSubType(DemuxFilterType filterType) { switch (filterType.mainType) { case DemuxFilterMainType::TS: return (int)filterType.subType.tsFilterType(); case DemuxFilterMainType::MMTP: return (int)filterType.subType.mmtpFilterType(); case DemuxFilterMainType::IP: return (int)filterType.subType.ipFilterType(); case DemuxFilterMainType::TLV: return (int)filterType.subType.tlvFilterType(); case DemuxFilterMainType::ALP: return (int)filterType.subType.alpFilterType(); default: return -1; } } } // namespace android media/jni/tuner/DemuxClient.h +7 −5 Original line number Diff line number Diff line Loading @@ -17,10 +17,11 @@ #ifndef _ANDROID_MEDIA_TV_DEMUX_CLIENT_H_ #define _ANDROID_MEDIA_TV_DEMUX_CLIENT_H_ //#include <aidl/android/media/tv/tuner/ITunerDemux.h> #include <aidl/android/media/tv/tuner/ITunerDemux.h> #include <android/hardware/tv/tuner/1.0/IDemux.h> #include <android/hardware/tv/tuner/1.1/types.h> #include "ClientHelper.h" #include "DvrClient.h" #include "DvrClientCallback.h" #include "FilterClient.h" Loading @@ -28,7 +29,8 @@ #include "FrontendClient.h" #include "TimeFilterClient.h" //using ::aidl::android::media::tv::tuner::ITunerDemux; using Status = ::ndk::ScopedAStatus; using ::aidl::android::media::tv::tuner::ITunerDemux; using ::android::hardware::tv::tuner::V1_0::DemuxFilterType; using ::android::hardware::tv::tuner::V1_0::DvrType; Loading @@ -42,7 +44,7 @@ namespace android { struct DemuxClient : public RefBase { public: DemuxClient(); DemuxClient(shared_ptr<ITunerDemux> tunerDemux); ~DemuxClient(); // TODO: remove after migration to Tuner Service is done. Loading Loading @@ -100,13 +102,13 @@ private: sp<IFilter> openHidlFilter(DemuxFilterType type, int bufferSize, sp<HidlFilterCallback> cb); sp<ITimeFilter> openHidlTimeFilter(); sp<IDvr> openHidlDvr(DvrType type, int bufferSize, sp<HidlDvrCallback> cb); int getSubType(DemuxFilterType filterType); /** * An AIDL Tuner Demux Singleton assigned at the first time the Tuner Client * opens a demux. Default null when demux is not opened. */ // TODO: pending on aidl interface //shared_ptr<ITunerDemux> mTunerDemux; shared_ptr<ITunerDemux> mTunerDemux; /** * A Demux HAL interface that is ready before migrating to the TunerDemux. Loading media/jni/tuner/FilterClient.cpp +28 −7 Original line number Diff line number Diff line Loading @@ -30,16 +30,14 @@ namespace android { /////////////// FilterClient /////////////////////// // TODO: pending aidl interface // TODO: add filter callback FilterClient::FilterClient(DemuxFilterType type) { //mTunerFilter = tunerFilter; FilterClient::FilterClient(DemuxFilterType type, shared_ptr<ITunerFilter> tunerFilter) { mTunerFilter = tunerFilter; mAvSharedHandle = NULL; checkIsMediaFilter(type); } FilterClient::~FilterClient() { //mTunerFilter = NULL; mTunerFilter = NULL; mFilter = NULL; mFilter_1_1 = NULL; mAvSharedHandle = NULL; Loading Loading @@ -154,7 +152,12 @@ Result FilterClient::flush() { } Result FilterClient::getId(uint32_t& id) { // TODO: pending aidl interface if (mTunerFilter != NULL) { int32_t id32Bit; Status s = mTunerFilter->getId(&id32Bit); id = static_cast<uint32_t>(id32Bit); return ClientHelper::getServiceSpecificErrorCode(s); } if (mFilter != NULL) { Result res; Loading @@ -169,7 +172,12 @@ Result FilterClient::getId(uint32_t& id) { } Result FilterClient::getId64Bit(uint64_t& id) { // TODO: pending aidl interface if (mTunerFilter != NULL) { int64_t id64Bit; Status s = mTunerFilter->getId64Bit(&id64Bit); id = static_cast<uint64_t>(id64Bit); return ClientHelper::getServiceSpecificErrorCode(s); } if (mFilter_1_1 != NULL) { Result res; Loading Loading @@ -248,6 +256,19 @@ Return<void> HidlFilterCallback::onFilterEvent_1_1(const DemuxFilterEvent& filte return Void(); } /////////////// TunerFilterCallback /////////////////////// TunerFilterCallback::TunerFilterCallback(sp<FilterClientCallback> filterClientCallback) : mFilterClientCallback(filterClientCallback) {} Status TunerFilterCallback::onFilterStatus(int status) { if (mFilterClientCallback != NULL) { mFilterClientCallback->onFilterStatus(static_cast<DemuxFilterStatus>(status)); return Status::ok(); } return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE)); } /////////////// FilterClient Helper Methods /////////////////////// Result FilterClient::getFilterMq() { Loading media/jni/tuner/FilterClient.h +11 −12 Original line number Diff line number Diff line Loading @@ -17,15 +17,19 @@ #ifndef _ANDROID_MEDIA_TV_FILTER_CLIENT_H_ #define _ANDROID_MEDIA_TV_FILTER_CLIENT_H_ //#include <aidl/android/media/tv/tuner/ITunerFilter.h> #include <aidl/android/media/tv/tuner/ITunerFilter.h> #include <aidl/android/media/tv/tuner/BnTunerFilterCallback.h> #include <android/hardware/tv/tuner/1.1/IFilter.h> #include <android/hardware/tv/tuner/1.1/IFilterCallback.h> #include <android/hardware/tv/tuner/1.1/types.h> #include <fmq/MessageQueue.h> #include "ClientHelper.h" #include "FilterClientCallback.h" //using ::aidl::android::media::tv::tuner::ITunerFilter; using Status = ::ndk::ScopedAStatus; using ::aidl::android::media::tv::tuner::BnTunerFilterCallback; using ::aidl::android::media::tv::tuner::ITunerFilter; using ::android::hardware::EventFlag; using ::android::hardware::MessageQueue; Loading @@ -51,18 +55,16 @@ struct SharedHandleInfo { uint64_t size; }; // TODO: pending aidl interface /*class TunerFilterCallback : public BnTunerFilterCallback { class TunerFilterCallback : public BnTunerFilterCallback { public: TunerFilterCallback(sp<FilterClientCallback> filterClientCallback); Status onFilterEvent(vector<TunerDemuxFilterEvent> events); // TODO: complete TunerFilterCallback Status onFilterStatus(int status); private: sp<FilterClientCallback> mFilterClientCallback; };*/ }; struct HidlFilterCallback : public IFilterCallback { Loading @@ -80,8 +82,7 @@ private: struct FilterClient : public RefBase { public: // TODO: pending aidl interface FilterClient(DemuxFilterType type); FilterClient(DemuxFilterType type, shared_ptr<ITunerFilter> tunerFilter); ~FilterClient(); // TODO: remove after migration to Tuner Service is done. Loading Loading @@ -179,8 +180,7 @@ private: * An AIDL Tuner Filter Singleton assigned at the first time when the Tuner Client * opens a filter. Default null when Tuner Service does not exist. */ // TODO: pending on aidl interface //shared_ptr<ITunerFilter> mTunerFilter; shared_ptr<ITunerFilter> mTunerFilter; /** * A 1.0 Filter HAL interface that is ready before migrating to the TunerFilter. Loading @@ -200,7 +200,6 @@ private: EventFlag* mFilterMQEventFlag; sp<FilterClientCallback> mCallback; //shared_ptr<TunerFilterCallback> mAidlCallback; sp<HidlFilterCallback> mHidlCallback; native_handle_t* mAvSharedHandle; Loading Loading
media/jni/tuner/ClientHelper.h 0 → 100644 +45 −0 Original line number Diff line number Diff line /* * Copyright 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _ANDROID_MEDIA_TV_CLIENT_HELPER_H_ #define _ANDROID_MEDIA_TV_CLIENT_HELPER_H_ #include <android/binder_parcel_utils.h> #include <android/hardware/tv/tuner/1.1/types.h> using Status = ::ndk::ScopedAStatus; using ::android::hardware::tv::tuner::V1_0::Result; using namespace std; namespace android { struct ClientHelper { public: static Result getServiceSpecificErrorCode(Status& s) { if (s.getExceptionCode() == EX_SERVICE_SPECIFIC) { return static_cast<Result>(s.getServiceSpecificError()); } else if (s.isOk()) { return Result::SUCCESS; } return Result::UNKNOWN_ERROR; } }; } // namespace android #endif // _ANDROID_MEDIA_TV_CLIENT_HELPER_H_ No newline at end of file
media/jni/tuner/DemuxClient.cpp +37 −12 Original line number Diff line number Diff line Loading @@ -23,20 +23,20 @@ using ::aidl::android::media::tv::tuner::TunerFrontendSettings; using ::android::hardware::tv::tuner::V1_0::DemuxFilterMainType; using ::android::hardware::tv::tuner::V1_0::Result; namespace android { /////////////// DemuxClient /////////////////////// // TODO: pending aidl interface DemuxClient::DemuxClient() { //mTunerDemux = tunerDemux; DemuxClient::DemuxClient(shared_ptr<ITunerDemux> tunerDemux) { mTunerDemux = tunerDemux; mId = -1; } DemuxClient::~DemuxClient() { //mTunerDemux = NULL; mTunerDemux = NULL; mDemux = NULL; mId = -1; } Loading @@ -47,12 +47,10 @@ void DemuxClient::setHidlDemux(sp<IDemux> demux) { } Result DemuxClient::setFrontendDataSource(sp<FrontendClient> frontendClient) { // TODO: pending aidl interface /*if (mTunerDemux != NULL) { // TODO: handle error message mTunerDemux->setFrontendDataSource(frontendClient->getAidlFrontend()); return (int) Result::SUCCESS; }*/ if (mTunerDemux != NULL) { Status s = mTunerDemux->setFrontendDataSource(frontendClient->getAidlFrontend()); return ClientHelper::getServiceSpecificErrorCode(s); } if (mDemux != NULL) { Result res = mDemux->setFrontendDataSource(frontendClient->getId()); Loading @@ -64,13 +62,23 @@ Result DemuxClient::setFrontendDataSource(sp<FrontendClient> frontendClient) { sp<FilterClient> DemuxClient::openFilter(DemuxFilterType type, int bufferSize, sp<FilterClientCallback> cb) { // TODO: pending aidl interface if (mTunerDemux != NULL) { shared_ptr<ITunerFilter> tunerFilter; shared_ptr<TunerFilterCallback> callback = ::ndk::SharedRefBase::make<TunerFilterCallback>(cb); Status s = mTunerDemux->openFilter((int)type.mainType, getSubType(type), bufferSize, callback, &tunerFilter); if (ClientHelper::getServiceSpecificErrorCode(s) != Result::SUCCESS) { return NULL; } return new FilterClient(type, tunerFilter); } if (mDemux != NULL) { sp<HidlFilterCallback> callback = new HidlFilterCallback(cb); sp<IFilter> hidlFilter = openHidlFilter(type, bufferSize, callback); if (hidlFilter != NULL) { sp<FilterClient> filterClient = new FilterClient(type); sp<FilterClient> filterClient = new FilterClient(type, NULL); filterClient->setHidlFilter(hidlFilter); return filterClient; } Loading Loading @@ -244,4 +252,21 @@ sp<IDvr> DemuxClient::openHidlDvr(DvrType dvrType, int bufferSize, return hidlDvr; } int DemuxClient::getSubType(DemuxFilterType filterType) { switch (filterType.mainType) { case DemuxFilterMainType::TS: return (int)filterType.subType.tsFilterType(); case DemuxFilterMainType::MMTP: return (int)filterType.subType.mmtpFilterType(); case DemuxFilterMainType::IP: return (int)filterType.subType.ipFilterType(); case DemuxFilterMainType::TLV: return (int)filterType.subType.tlvFilterType(); case DemuxFilterMainType::ALP: return (int)filterType.subType.alpFilterType(); default: return -1; } } } // namespace android
media/jni/tuner/DemuxClient.h +7 −5 Original line number Diff line number Diff line Loading @@ -17,10 +17,11 @@ #ifndef _ANDROID_MEDIA_TV_DEMUX_CLIENT_H_ #define _ANDROID_MEDIA_TV_DEMUX_CLIENT_H_ //#include <aidl/android/media/tv/tuner/ITunerDemux.h> #include <aidl/android/media/tv/tuner/ITunerDemux.h> #include <android/hardware/tv/tuner/1.0/IDemux.h> #include <android/hardware/tv/tuner/1.1/types.h> #include "ClientHelper.h" #include "DvrClient.h" #include "DvrClientCallback.h" #include "FilterClient.h" Loading @@ -28,7 +29,8 @@ #include "FrontendClient.h" #include "TimeFilterClient.h" //using ::aidl::android::media::tv::tuner::ITunerDemux; using Status = ::ndk::ScopedAStatus; using ::aidl::android::media::tv::tuner::ITunerDemux; using ::android::hardware::tv::tuner::V1_0::DemuxFilterType; using ::android::hardware::tv::tuner::V1_0::DvrType; Loading @@ -42,7 +44,7 @@ namespace android { struct DemuxClient : public RefBase { public: DemuxClient(); DemuxClient(shared_ptr<ITunerDemux> tunerDemux); ~DemuxClient(); // TODO: remove after migration to Tuner Service is done. Loading Loading @@ -100,13 +102,13 @@ private: sp<IFilter> openHidlFilter(DemuxFilterType type, int bufferSize, sp<HidlFilterCallback> cb); sp<ITimeFilter> openHidlTimeFilter(); sp<IDvr> openHidlDvr(DvrType type, int bufferSize, sp<HidlDvrCallback> cb); int getSubType(DemuxFilterType filterType); /** * An AIDL Tuner Demux Singleton assigned at the first time the Tuner Client * opens a demux. Default null when demux is not opened. */ // TODO: pending on aidl interface //shared_ptr<ITunerDemux> mTunerDemux; shared_ptr<ITunerDemux> mTunerDemux; /** * A Demux HAL interface that is ready before migrating to the TunerDemux. Loading
media/jni/tuner/FilterClient.cpp +28 −7 Original line number Diff line number Diff line Loading @@ -30,16 +30,14 @@ namespace android { /////////////// FilterClient /////////////////////// // TODO: pending aidl interface // TODO: add filter callback FilterClient::FilterClient(DemuxFilterType type) { //mTunerFilter = tunerFilter; FilterClient::FilterClient(DemuxFilterType type, shared_ptr<ITunerFilter> tunerFilter) { mTunerFilter = tunerFilter; mAvSharedHandle = NULL; checkIsMediaFilter(type); } FilterClient::~FilterClient() { //mTunerFilter = NULL; mTunerFilter = NULL; mFilter = NULL; mFilter_1_1 = NULL; mAvSharedHandle = NULL; Loading Loading @@ -154,7 +152,12 @@ Result FilterClient::flush() { } Result FilterClient::getId(uint32_t& id) { // TODO: pending aidl interface if (mTunerFilter != NULL) { int32_t id32Bit; Status s = mTunerFilter->getId(&id32Bit); id = static_cast<uint32_t>(id32Bit); return ClientHelper::getServiceSpecificErrorCode(s); } if (mFilter != NULL) { Result res; Loading @@ -169,7 +172,12 @@ Result FilterClient::getId(uint32_t& id) { } Result FilterClient::getId64Bit(uint64_t& id) { // TODO: pending aidl interface if (mTunerFilter != NULL) { int64_t id64Bit; Status s = mTunerFilter->getId64Bit(&id64Bit); id = static_cast<uint64_t>(id64Bit); return ClientHelper::getServiceSpecificErrorCode(s); } if (mFilter_1_1 != NULL) { Result res; Loading Loading @@ -248,6 +256,19 @@ Return<void> HidlFilterCallback::onFilterEvent_1_1(const DemuxFilterEvent& filte return Void(); } /////////////// TunerFilterCallback /////////////////////// TunerFilterCallback::TunerFilterCallback(sp<FilterClientCallback> filterClientCallback) : mFilterClientCallback(filterClientCallback) {} Status TunerFilterCallback::onFilterStatus(int status) { if (mFilterClientCallback != NULL) { mFilterClientCallback->onFilterStatus(static_cast<DemuxFilterStatus>(status)); return Status::ok(); } return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE)); } /////////////// FilterClient Helper Methods /////////////////////// Result FilterClient::getFilterMq() { Loading
media/jni/tuner/FilterClient.h +11 −12 Original line number Diff line number Diff line Loading @@ -17,15 +17,19 @@ #ifndef _ANDROID_MEDIA_TV_FILTER_CLIENT_H_ #define _ANDROID_MEDIA_TV_FILTER_CLIENT_H_ //#include <aidl/android/media/tv/tuner/ITunerFilter.h> #include <aidl/android/media/tv/tuner/ITunerFilter.h> #include <aidl/android/media/tv/tuner/BnTunerFilterCallback.h> #include <android/hardware/tv/tuner/1.1/IFilter.h> #include <android/hardware/tv/tuner/1.1/IFilterCallback.h> #include <android/hardware/tv/tuner/1.1/types.h> #include <fmq/MessageQueue.h> #include "ClientHelper.h" #include "FilterClientCallback.h" //using ::aidl::android::media::tv::tuner::ITunerFilter; using Status = ::ndk::ScopedAStatus; using ::aidl::android::media::tv::tuner::BnTunerFilterCallback; using ::aidl::android::media::tv::tuner::ITunerFilter; using ::android::hardware::EventFlag; using ::android::hardware::MessageQueue; Loading @@ -51,18 +55,16 @@ struct SharedHandleInfo { uint64_t size; }; // TODO: pending aidl interface /*class TunerFilterCallback : public BnTunerFilterCallback { class TunerFilterCallback : public BnTunerFilterCallback { public: TunerFilterCallback(sp<FilterClientCallback> filterClientCallback); Status onFilterEvent(vector<TunerDemuxFilterEvent> events); // TODO: complete TunerFilterCallback Status onFilterStatus(int status); private: sp<FilterClientCallback> mFilterClientCallback; };*/ }; struct HidlFilterCallback : public IFilterCallback { Loading @@ -80,8 +82,7 @@ private: struct FilterClient : public RefBase { public: // TODO: pending aidl interface FilterClient(DemuxFilterType type); FilterClient(DemuxFilterType type, shared_ptr<ITunerFilter> tunerFilter); ~FilterClient(); // TODO: remove after migration to Tuner Service is done. Loading Loading @@ -179,8 +180,7 @@ private: * An AIDL Tuner Filter Singleton assigned at the first time when the Tuner Client * opens a filter. Default null when Tuner Service does not exist. */ // TODO: pending on aidl interface //shared_ptr<ITunerFilter> mTunerFilter; shared_ptr<ITunerFilter> mTunerFilter; /** * A 1.0 Filter HAL interface that is ready before migrating to the TunerFilter. Loading @@ -200,7 +200,6 @@ private: EventFlag* mFilterMQEventFlag; sp<FilterClientCallback> mCallback; //shared_ptr<TunerFilterCallback> mAidlCallback; sp<HidlFilterCallback> mHidlCallback; native_handle_t* mAvSharedHandle; Loading