Loading services/tuner/TunerDemux.cpp +90 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #include "TunerDvr.h" #include "TunerDemux.h" #include "TunerTimeFilter.h" using ::android::hardware::tv::tuner::V1_0::DemuxAlpFilterType; using ::android::hardware::tv::tuner::V1_0::DemuxFilterMainType; Loading Loading @@ -101,6 +102,69 @@ Status TunerDemux::openFilter( return Status::ok(); } Status TunerDemux::openTimeFilter(shared_ptr<ITunerTimeFilter>* _aidl_return) { if (mDemux == nullptr) { ALOGE("IDemux is not initialized."); return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE)); } Result status; sp<ITimeFilter> filterSp; mDemux->openTimeFilter([&](Result r, const sp<ITimeFilter>& filter) { filterSp = filter; status = r; }); if (status != Result::SUCCESS) { return Status::fromServiceSpecificError(static_cast<int32_t>(status)); } *_aidl_return = ::ndk::SharedRefBase::make<TunerTimeFilter>(filterSp); return Status::ok(); } Status TunerDemux::getAvSyncHwId(const shared_ptr<ITunerFilter>& tunerFilter, int* _aidl_return) { if (mDemux == nullptr) { ALOGE("IDemux is not initialized."); return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE)); } uint32_t avSyncHwId; Result res; sp<IFilter> halFilter = static_cast<TunerFilter*>(tunerFilter.get())->getHalFilter(); mDemux->getAvSyncHwId(halFilter, [&](Result r, uint32_t id) { res = r; avSyncHwId = id; }); if (res != Result::SUCCESS) { return Status::fromServiceSpecificError(static_cast<int32_t>(res)); } *_aidl_return = (int)avSyncHwId; return Status::ok(); } Status TunerDemux::getAvSyncTime(int avSyncHwId, int64_t* _aidl_return) { if (mDemux == nullptr) { ALOGE("IDemux is not initialized."); return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE)); } uint64_t time; Result res; mDemux->getAvSyncTime(static_cast<uint32_t>(avSyncHwId), [&](Result r, uint64_t ts) { res = r; time = ts; }); if (res != Result::SUCCESS) { return Status::fromServiceSpecificError(static_cast<int32_t>(res)); } *_aidl_return = (int64_t)time; return Status::ok(); } Status TunerDemux::openDvr(int dvrType, int bufferSize, const shared_ptr<ITunerDvrCallback>& cb, shared_ptr<ITunerDvr>* _aidl_return) { if (mDemux == nullptr) { Loading @@ -125,6 +189,32 @@ Status TunerDemux::openDvr(int dvrType, int bufferSize, const shared_ptr<ITunerD return Status::ok(); } Status TunerDemux::connectCiCam(int ciCamId) { if (mDemux == nullptr) { ALOGE("IDemux is not initialized."); return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE)); } Result res = mDemux->connectCiCam(static_cast<uint32_t>(ciCamId)); if (res != Result::SUCCESS) { return Status::fromServiceSpecificError(static_cast<int32_t>(res)); } return Status::ok(); } Status TunerDemux::disconnectCiCam() { if (mDemux == nullptr) { ALOGE("IDemux is not initialized."); return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE)); } Result res = mDemux->disconnectCiCam(); if (res != Result::SUCCESS) { return Status::fromServiceSpecificError(static_cast<int32_t>(res)); } return Status::ok(); } Status TunerDemux::close() { if (mDemux == nullptr) { ALOGE("IDemux is not initialized."); Loading services/tuner/TunerDemux.h +8 −1 Original line number Diff line number Diff line Loading @@ -27,9 +27,11 @@ using ::aidl::android::media::tv::tuner::ITunerDvrCallback; using ::aidl::android::media::tv::tuner::ITunerFilter; using ::aidl::android::media::tv::tuner::ITunerFilterCallback; using ::aidl::android::media::tv::tuner::ITunerFrontend; using ::aidl::android::media::tv::tuner::ITunerTimeFilter; using ::android::hardware::tv::tuner::V1_0::IDemux; using ::android::hardware::tv::tuner::V1_0::IDvr; using ::android::hardware::tv::tuner::V1_0::IDvrCallback; using ::android::hardware::tv::tuner::V1_0::ITimeFilter; using namespace std; Loading @@ -43,10 +45,15 @@ public: Status setFrontendDataSource(const shared_ptr<ITunerFrontend>& frontend) override; Status openFilter( int mainType, int subtype, int bufferSize, const shared_ptr<ITunerFilterCallback>& cb, shared_ptr<ITunerFilter>* _aidl_return); shared_ptr<ITunerFilter>* _aidl_return) override; Status openTimeFilter(shared_ptr<ITunerTimeFilter>* _aidl_return) override; Status getAvSyncHwId(const shared_ptr<ITunerFilter>& tunerFilter, int* _aidl_return) override; Status getAvSyncTime(int avSyncHwId, int64_t* _aidl_return) override; Status openDvr( int dvbType, int bufferSize, const shared_ptr<ITunerDvrCallback>& cb, shared_ptr<ITunerDvr>* _aidl_return) override; Status connectCiCam(int ciCamId) override; Status disconnectCiCam() override; Status close() override; private: Loading services/tuner/TunerService.cpp +41 −1 Original line number Diff line number Diff line Loading @@ -92,7 +92,27 @@ Status TunerService::openDemux( return Status::ok(); } ALOGD("open demux failed, res = %d", res); ALOGW("open demux failed, res = %d", res); return Status::fromServiceSpecificError(static_cast<int32_t>(res)); } Status TunerService::getDemuxCaps(TunerDemuxCapabilities* _aidl_return) { ALOGD("getDemuxCaps"); if (!getITuner()) { return Status::fromServiceSpecificError(static_cast<int32_t>(Result::NOT_INITIALIZED)); } Result res; DemuxCapabilities caps; mTuner->getDemuxCaps([&](Result r, const DemuxCapabilities& demuxCaps) { caps = demuxCaps; res = r; }); if (res == Result::SUCCESS) { *_aidl_return = getAidlDemuxCaps(caps); return Status::ok(); } ALOGW("Get demux caps failed, res = %d", res); return Status::fromServiceSpecificError(static_cast<int32_t>(res)); } Loading Loading @@ -343,6 +363,26 @@ Result TunerService::getHidlFrontendInfo(int id, FrontendInfo& info) { return res; } TunerDemuxCapabilities TunerService::getAidlDemuxCaps(DemuxCapabilities caps) { TunerDemuxCapabilities aidlCaps{ .numDemux = (int)caps.numDemux, .numRecord = (int)caps.numRecord, .numPlayback = (int)caps.numPlayback, .numTsFilter = (int)caps.numTsFilter, .numSectionFilter = (int)caps.numSectionFilter, .numAudioFilter = (int)caps.numAudioFilter, .numVideoFilter = (int)caps.numVideoFilter, .numPesFilter = (int)caps.numPesFilter, .numPcrFilter = (int)caps.numPcrFilter, .numBytesInSectionFilter = (int)caps.numBytesInSectionFilter, .filterCaps = (int)caps.filterCaps, .bTimeFilter = caps.bTimeFilter, }; aidlCaps.linkCaps.resize(caps.linkCaps.size()); copy(caps.linkCaps.begin(), caps.linkCaps.end(), aidlCaps.linkCaps.begin()); return aidlCaps; } TunerFrontendInfo TunerService::convertToAidlFrontendInfo(FrontendInfo halInfo) { TunerFrontendInfo info{ .type = (int)halInfo.type, Loading services/tuner/TunerService.h +4 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ using ::aidl::android::media::tv::tuner::BnTunerService; using ::aidl::android::media::tv::tuner::ITunerDemux; using ::aidl::android::media::tv::tuner::ITunerFrontend; using ::aidl::android::media::tv::tuner::ITunerLnb; using ::aidl::android::media::tv::tuner::TunerDemuxCapabilities; using ::aidl::android::media::tv::tuner::TunerFrontendInfo; using ::aidl::android::media::tv::tunerresourcemanager::ITunerResourceManager; Loading @@ -42,6 +43,7 @@ using ::android::hardware::MessageQueue; using ::android::hardware::MQDescriptorSync; using ::android::hardware::Return; using ::android::hardware::Void; using ::android::hardware::tv::tuner::V1_0::DemuxCapabilities; using ::android::hardware::tv::tuner::V1_0::DemuxFilterAvSettings; using ::android::hardware::tv::tuner::V1_0::DemuxFilterEvent; using ::android::hardware::tv::tuner::V1_0::DemuxFilterMainType; Loading Loading @@ -113,6 +115,7 @@ public: Status openLnb(int lnbHandle, shared_ptr<ITunerLnb>* _aidl_return) override; Status openLnbByName(const string& lnbName, shared_ptr<ITunerLnb>* _aidl_return) override; Status openDemux(int32_t demuxHandle, std::shared_ptr<ITunerDemux>* _aidl_return) override; Status getDemuxCaps(TunerDemuxCapabilities* _aidl_return) override; Status updateTunerResources() override; private: Loading @@ -125,6 +128,7 @@ private: Result getHidlFrontendInfo(int id, FrontendInfo& info); vector<int> getLnbHandles(); TunerDemuxCapabilities getAidlDemuxCaps(DemuxCapabilities caps); TunerFrontendInfo convertToAidlFrontendInfo(FrontendInfo halInfo); sp<ITuner> mTuner; Loading services/tuner/aidl/android/media/tv/tuner/ITunerDemux.aidl +26 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.media.tv.tuner.ITunerDvrCallback; import android.media.tv.tuner.ITunerFilter; import android.media.tv.tuner.ITunerFilterCallback; import android.media.tv.tuner.ITunerFrontend; import android.media.tv.tuner.ITunerTimeFilter; /** * Tuner Demux interface handles tuner related operations. Loading @@ -40,11 +41,36 @@ interface ITunerDemux { ITunerFilter openFilter( in int mainType, in int subtype, in int bufferSize, in ITunerFilterCallback cb); /** * Open time filter of the demux. */ ITunerTimeFilter openTimeFilter(); /** * Get hardware sync ID for audio and video. */ int getAvSyncHwId(ITunerFilter tunerFilter); /** * Get current time stamp to use for A/V sync. */ long getAvSyncTime(in int avSyncHwId); /** * Open a DVR (Digital Video Record) instance in the demux. */ ITunerDvr openDvr(in int dvbType, in int bufferSize, in ITunerDvrCallback cb); /** * Connect Conditional Access Modules (CAM) through Common Interface (CI). */ void connectCiCam(in int ciCamId); /** * Disconnect Conditional Access Modules (CAM). */ void disconnectCiCam(); /** * Releases the ITunerDemux instance. */ Loading Loading
services/tuner/TunerDemux.cpp +90 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #include "TunerDvr.h" #include "TunerDemux.h" #include "TunerTimeFilter.h" using ::android::hardware::tv::tuner::V1_0::DemuxAlpFilterType; using ::android::hardware::tv::tuner::V1_0::DemuxFilterMainType; Loading Loading @@ -101,6 +102,69 @@ Status TunerDemux::openFilter( return Status::ok(); } Status TunerDemux::openTimeFilter(shared_ptr<ITunerTimeFilter>* _aidl_return) { if (mDemux == nullptr) { ALOGE("IDemux is not initialized."); return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE)); } Result status; sp<ITimeFilter> filterSp; mDemux->openTimeFilter([&](Result r, const sp<ITimeFilter>& filter) { filterSp = filter; status = r; }); if (status != Result::SUCCESS) { return Status::fromServiceSpecificError(static_cast<int32_t>(status)); } *_aidl_return = ::ndk::SharedRefBase::make<TunerTimeFilter>(filterSp); return Status::ok(); } Status TunerDemux::getAvSyncHwId(const shared_ptr<ITunerFilter>& tunerFilter, int* _aidl_return) { if (mDemux == nullptr) { ALOGE("IDemux is not initialized."); return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE)); } uint32_t avSyncHwId; Result res; sp<IFilter> halFilter = static_cast<TunerFilter*>(tunerFilter.get())->getHalFilter(); mDemux->getAvSyncHwId(halFilter, [&](Result r, uint32_t id) { res = r; avSyncHwId = id; }); if (res != Result::SUCCESS) { return Status::fromServiceSpecificError(static_cast<int32_t>(res)); } *_aidl_return = (int)avSyncHwId; return Status::ok(); } Status TunerDemux::getAvSyncTime(int avSyncHwId, int64_t* _aidl_return) { if (mDemux == nullptr) { ALOGE("IDemux is not initialized."); return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE)); } uint64_t time; Result res; mDemux->getAvSyncTime(static_cast<uint32_t>(avSyncHwId), [&](Result r, uint64_t ts) { res = r; time = ts; }); if (res != Result::SUCCESS) { return Status::fromServiceSpecificError(static_cast<int32_t>(res)); } *_aidl_return = (int64_t)time; return Status::ok(); } Status TunerDemux::openDvr(int dvrType, int bufferSize, const shared_ptr<ITunerDvrCallback>& cb, shared_ptr<ITunerDvr>* _aidl_return) { if (mDemux == nullptr) { Loading @@ -125,6 +189,32 @@ Status TunerDemux::openDvr(int dvrType, int bufferSize, const shared_ptr<ITunerD return Status::ok(); } Status TunerDemux::connectCiCam(int ciCamId) { if (mDemux == nullptr) { ALOGE("IDemux is not initialized."); return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE)); } Result res = mDemux->connectCiCam(static_cast<uint32_t>(ciCamId)); if (res != Result::SUCCESS) { return Status::fromServiceSpecificError(static_cast<int32_t>(res)); } return Status::ok(); } Status TunerDemux::disconnectCiCam() { if (mDemux == nullptr) { ALOGE("IDemux is not initialized."); return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE)); } Result res = mDemux->disconnectCiCam(); if (res != Result::SUCCESS) { return Status::fromServiceSpecificError(static_cast<int32_t>(res)); } return Status::ok(); } Status TunerDemux::close() { if (mDemux == nullptr) { ALOGE("IDemux is not initialized."); Loading
services/tuner/TunerDemux.h +8 −1 Original line number Diff line number Diff line Loading @@ -27,9 +27,11 @@ using ::aidl::android::media::tv::tuner::ITunerDvrCallback; using ::aidl::android::media::tv::tuner::ITunerFilter; using ::aidl::android::media::tv::tuner::ITunerFilterCallback; using ::aidl::android::media::tv::tuner::ITunerFrontend; using ::aidl::android::media::tv::tuner::ITunerTimeFilter; using ::android::hardware::tv::tuner::V1_0::IDemux; using ::android::hardware::tv::tuner::V1_0::IDvr; using ::android::hardware::tv::tuner::V1_0::IDvrCallback; using ::android::hardware::tv::tuner::V1_0::ITimeFilter; using namespace std; Loading @@ -43,10 +45,15 @@ public: Status setFrontendDataSource(const shared_ptr<ITunerFrontend>& frontend) override; Status openFilter( int mainType, int subtype, int bufferSize, const shared_ptr<ITunerFilterCallback>& cb, shared_ptr<ITunerFilter>* _aidl_return); shared_ptr<ITunerFilter>* _aidl_return) override; Status openTimeFilter(shared_ptr<ITunerTimeFilter>* _aidl_return) override; Status getAvSyncHwId(const shared_ptr<ITunerFilter>& tunerFilter, int* _aidl_return) override; Status getAvSyncTime(int avSyncHwId, int64_t* _aidl_return) override; Status openDvr( int dvbType, int bufferSize, const shared_ptr<ITunerDvrCallback>& cb, shared_ptr<ITunerDvr>* _aidl_return) override; Status connectCiCam(int ciCamId) override; Status disconnectCiCam() override; Status close() override; private: Loading
services/tuner/TunerService.cpp +41 −1 Original line number Diff line number Diff line Loading @@ -92,7 +92,27 @@ Status TunerService::openDemux( return Status::ok(); } ALOGD("open demux failed, res = %d", res); ALOGW("open demux failed, res = %d", res); return Status::fromServiceSpecificError(static_cast<int32_t>(res)); } Status TunerService::getDemuxCaps(TunerDemuxCapabilities* _aidl_return) { ALOGD("getDemuxCaps"); if (!getITuner()) { return Status::fromServiceSpecificError(static_cast<int32_t>(Result::NOT_INITIALIZED)); } Result res; DemuxCapabilities caps; mTuner->getDemuxCaps([&](Result r, const DemuxCapabilities& demuxCaps) { caps = demuxCaps; res = r; }); if (res == Result::SUCCESS) { *_aidl_return = getAidlDemuxCaps(caps); return Status::ok(); } ALOGW("Get demux caps failed, res = %d", res); return Status::fromServiceSpecificError(static_cast<int32_t>(res)); } Loading Loading @@ -343,6 +363,26 @@ Result TunerService::getHidlFrontendInfo(int id, FrontendInfo& info) { return res; } TunerDemuxCapabilities TunerService::getAidlDemuxCaps(DemuxCapabilities caps) { TunerDemuxCapabilities aidlCaps{ .numDemux = (int)caps.numDemux, .numRecord = (int)caps.numRecord, .numPlayback = (int)caps.numPlayback, .numTsFilter = (int)caps.numTsFilter, .numSectionFilter = (int)caps.numSectionFilter, .numAudioFilter = (int)caps.numAudioFilter, .numVideoFilter = (int)caps.numVideoFilter, .numPesFilter = (int)caps.numPesFilter, .numPcrFilter = (int)caps.numPcrFilter, .numBytesInSectionFilter = (int)caps.numBytesInSectionFilter, .filterCaps = (int)caps.filterCaps, .bTimeFilter = caps.bTimeFilter, }; aidlCaps.linkCaps.resize(caps.linkCaps.size()); copy(caps.linkCaps.begin(), caps.linkCaps.end(), aidlCaps.linkCaps.begin()); return aidlCaps; } TunerFrontendInfo TunerService::convertToAidlFrontendInfo(FrontendInfo halInfo) { TunerFrontendInfo info{ .type = (int)halInfo.type, Loading
services/tuner/TunerService.h +4 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ using ::aidl::android::media::tv::tuner::BnTunerService; using ::aidl::android::media::tv::tuner::ITunerDemux; using ::aidl::android::media::tv::tuner::ITunerFrontend; using ::aidl::android::media::tv::tuner::ITunerLnb; using ::aidl::android::media::tv::tuner::TunerDemuxCapabilities; using ::aidl::android::media::tv::tuner::TunerFrontendInfo; using ::aidl::android::media::tv::tunerresourcemanager::ITunerResourceManager; Loading @@ -42,6 +43,7 @@ using ::android::hardware::MessageQueue; using ::android::hardware::MQDescriptorSync; using ::android::hardware::Return; using ::android::hardware::Void; using ::android::hardware::tv::tuner::V1_0::DemuxCapabilities; using ::android::hardware::tv::tuner::V1_0::DemuxFilterAvSettings; using ::android::hardware::tv::tuner::V1_0::DemuxFilterEvent; using ::android::hardware::tv::tuner::V1_0::DemuxFilterMainType; Loading Loading @@ -113,6 +115,7 @@ public: Status openLnb(int lnbHandle, shared_ptr<ITunerLnb>* _aidl_return) override; Status openLnbByName(const string& lnbName, shared_ptr<ITunerLnb>* _aidl_return) override; Status openDemux(int32_t demuxHandle, std::shared_ptr<ITunerDemux>* _aidl_return) override; Status getDemuxCaps(TunerDemuxCapabilities* _aidl_return) override; Status updateTunerResources() override; private: Loading @@ -125,6 +128,7 @@ private: Result getHidlFrontendInfo(int id, FrontendInfo& info); vector<int> getLnbHandles(); TunerDemuxCapabilities getAidlDemuxCaps(DemuxCapabilities caps); TunerFrontendInfo convertToAidlFrontendInfo(FrontendInfo halInfo); sp<ITuner> mTuner; Loading
services/tuner/aidl/android/media/tv/tuner/ITunerDemux.aidl +26 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.media.tv.tuner.ITunerDvrCallback; import android.media.tv.tuner.ITunerFilter; import android.media.tv.tuner.ITunerFilterCallback; import android.media.tv.tuner.ITunerFrontend; import android.media.tv.tuner.ITunerTimeFilter; /** * Tuner Demux interface handles tuner related operations. Loading @@ -40,11 +41,36 @@ interface ITunerDemux { ITunerFilter openFilter( in int mainType, in int subtype, in int bufferSize, in ITunerFilterCallback cb); /** * Open time filter of the demux. */ ITunerTimeFilter openTimeFilter(); /** * Get hardware sync ID for audio and video. */ int getAvSyncHwId(ITunerFilter tunerFilter); /** * Get current time stamp to use for A/V sync. */ long getAvSyncTime(in int avSyncHwId); /** * Open a DVR (Digital Video Record) instance in the demux. */ ITunerDvr openDvr(in int dvbType, in int bufferSize, in ITunerDvrCallback cb); /** * Connect Conditional Access Modules (CAM) through Common Interface (CI). */ void connectCiCam(in int ciCamId); /** * Disconnect Conditional Access Modules (CAM). */ void disconnectCiCam(); /** * Releases the ITunerDemux instance. */ Loading