diff --git a/media/jni/Android.bp b/media/jni/Android.bp index 383389f448e8a..f80f41219e344 100644 --- a/media/jni/Android.bp +++ b/media/jni/Android.bp @@ -145,6 +145,7 @@ cc_library_shared { "tuner/FilterClient.cpp", "tuner/FrontendClient.cpp", "tuner/LnbClient.cpp", + "tuner/TimeFilterClient.cpp", "tuner/TunerClient.cpp", ], diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index f470fe85d3836..ee2d83b9ca77b 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -841,25 +841,6 @@ void FilterClientCallbackImpl::setFilter(jweak filterObj, sp filte mFilterClient = filterClient; } -/////////////// TimeFilter /////////////////////// - -TimeFilter::TimeFilter(sp sp, jobject obj) : mTimeFilterSp(sp) { - JNIEnv *env = AndroidRuntime::getJNIEnv(); - mTimeFilterObj = env->NewWeakGlobalRef(obj); -} - -TimeFilter::~TimeFilter() { - ALOGD("~TimeFilter"); - JNIEnv *env = AndroidRuntime::getJNIEnv(); - - env->DeleteWeakGlobalRef(mTimeFilterObj); - mTimeFilterObj = NULL; -} - -sp TimeFilter::getITimeFilter() { - return mTimeFilterSp; -} - /////////////// FrontendClientCallbackImpl /////////////////////// FrontendClientCallbackImpl::FrontendClientCallbackImpl(jweak tunerObj) : mObject(tunerObj) {} @@ -1104,8 +1085,6 @@ void FrontendClientCallbackImpl::onScanMessageExt1_1(FrontendScanMessageTypeExt1 /////////////// Tuner /////////////////////// -sp JTuner::mTuner; -sp<::android::hardware::tv::tuner::V1_1::ITuner> JTuner::mTuner_1_1; sp JTuner::mTunerClient; JTuner::JTuner(JNIEnv *env, jobject thiz) @@ -1115,10 +1094,6 @@ JTuner::JTuner(JNIEnv *env, jobject thiz) mClass = (jclass)env->NewGlobalRef(clazz); mObject = env->NewWeakGlobalRef(thiz); - // TODO: remove after migrate to client lib - if (mTuner == NULL) { - mTuner = getTunerService(); - } if (mTunerClient == NULL) { mTunerClient = new TunerClient(); } @@ -1128,15 +1103,13 @@ JTuner::~JTuner() { if (mFeClient != NULL) { mFeClient->close(); } - if (mDemux != NULL) { - mDemux->close(); + if (mDemuxClient != NULL) { + mDemuxClient->close(); } JNIEnv *env = AndroidRuntime::getJNIEnv(); env->DeleteWeakGlobalRef(mObject); env->DeleteGlobalRef(mClass); - mTuner = NULL; - mDemux = NULL; mTunerClient = NULL; mFeClient = NULL; mDemuxClient = NULL; @@ -1144,23 +1117,6 @@ JTuner::~JTuner() { mObject = NULL; } -sp JTuner::getTunerService() { - if (mTuner == nullptr) { - mTuner_1_1 = ::android::hardware::tv::tuner::V1_1::ITuner::getService(); - - if (mTuner_1_1 == nullptr) { - ALOGW("Failed to get tuner 1.1 service."); - mTuner = ITuner::getService(); - if (mTuner == nullptr) { - ALOGW("Failed to get tuner 1.0 service."); - } - } else { - mTuner = static_cast>(mTuner_1_1); - } - } - return mTuner; -} - jint JTuner::getTunerVersion() { ALOGD("JTuner::getTunerVersion()"); return (jint) mTunerClient->getHalTunerVersion(); @@ -1554,56 +1510,27 @@ int JTuner::setLna(bool enable) { return (int)result; } -Result JTuner::openDemux() { - if (mTuner == nullptr || mTunerClient == nullptr) { +Result JTuner::openDemux(int handle) { + if (mTunerClient == nullptr) { return Result::NOT_INITIALIZED; } - Result res = Result::SUCCESS; - - if (mDemux == nullptr) { - uint32_t id; - sp demuxSp; - mTuner->openDemux([&](Result r, uint32_t demuxId, const sp& demux) { - demuxSp = demux; - id = demuxId; - res = r; - ALOGD("open demux, id = %d", demuxId); - }); - if (res == Result::SUCCESS) { - mDemux = demuxSp; - mDemuxId = id; - } else { - return res; - } - } - - // TODO: replace demux opening with mTunerClient->openDemux(handle) - // when DemuxClient is fully ready if (mDemuxClient == nullptr) { - sp demuxClient = new DemuxClient(); - if (demuxClient == NULL) { + mDemuxClient = mTunerClient->openDemux(handle); + if (mDemuxClient == NULL) { ALOGE("Failed to open demux"); return Result::UNKNOWN_ERROR; } - mDemuxClient = demuxClient; - mDemuxClient->setHidlDemux(mDemux); if (mFeClient != NULL) { mDemuxClient->setFrontendDataSource(mFeClient); } } - return res; + return Result::SUCCESS; } jint JTuner::close() { Result res = Result::SUCCESS; - if (mDemux != NULL) { - res = mDemux->close(); - if (res != Result::SUCCESS) { - return (jint) res; - } - } if (mFeClient != NULL) { res = mFeClient->close(); @@ -1653,10 +1580,7 @@ jobject JTuner::getAvSyncTime(jint id) { int JTuner::connectCiCam(jint id) { if (mDemuxClient == NULL) { - Result r = openDemux(); - if (r != Result::SUCCESS) { - return (int) r; - } + return (int)Result::NOT_INITIALIZED; } Result r = mDemuxClient->connectCiCam((int)id); return (int) r; @@ -1672,10 +1596,7 @@ int JTuner::linkCiCam(int id) { int JTuner::disconnectCiCam() { if (mDemuxClient == NULL) { - Result r = openDemux(); - if (r != Result::SUCCESS) { - return (int) r; - } + return (int)Result::NOT_INITIALIZED; } Result r = mDemuxClient->disconnectCiCam(); return (int) r; @@ -1720,7 +1641,7 @@ jobject JTuner::openDescrambler() { } jobject JTuner::openFilter(DemuxFilterType type, int bufferSize) { - if (mDemux == NULL || mDemuxClient == NULL) { + if (mDemuxClient == NULL) { return NULL; } @@ -1754,20 +1675,7 @@ jobject JTuner::openFilter(DemuxFilterType type, int bufferSize) { } jobject JTuner::openTimeFilter() { - if (mDemux == NULL) { - if (openDemux() != Result::SUCCESS) { - return NULL; - } - } - sp iTimeFilterSp; - Result res; - mDemux->openTimeFilter( - [&](Result r, const sp& filter) { - iTimeFilterSp = filter; - res = r; - }); - - if (res != Result::SUCCESS || iTimeFilterSp == NULL) { + if (mDemuxClient == NULL) { return NULL; } @@ -1776,9 +1684,13 @@ jobject JTuner::openTimeFilter() { env->NewObject( env->FindClass("android/media/tv/tuner/filter/TimeFilter"), gFields.timeFilterInitID); - sp timeFilterSp = new TimeFilter(iTimeFilterSp, timeFilterObj); - timeFilterSp->incStrong(timeFilterObj); - env->SetLongField(timeFilterObj, gFields.timeFilterContext, (jlong)timeFilterSp.get()); + sp timeFilterClient = mDemuxClient->openTimeFilter(); + if (timeFilterClient == NULL) { + ALOGD("Failed to open time filter."); + return NULL; + } + timeFilterClient->incStrong(timeFilterObj); + env->SetLongField(timeFilterObj, gFields.timeFilterContext, (jlong)timeFilterClient.get()); return timeFilterObj; } @@ -1822,35 +1734,36 @@ jobject JTuner::openDvr(DvrType type, jlong bufferSize) { } jobject JTuner::getDemuxCaps() { - DemuxCapabilities caps; - Result res; - mTuner->getDemuxCaps([&](Result r, const DemuxCapabilities& demuxCaps) { - caps = demuxCaps; - res = r; - }); - if (res != Result::SUCCESS) { + if (mTunerClient == NULL) { return NULL; } + + shared_ptr caps; + caps = mTunerClient->getDemuxCaps(); + if (caps == NULL) { + return NULL; + } + JNIEnv *env = AndroidRuntime::getJNIEnv(); jclass clazz = env->FindClass("android/media/tv/tuner/DemuxCapabilities"); jmethodID capsInit = env->GetMethodID(clazz, "", "(IIIIIIIIIJI[IZ)V"); - jint numDemux = caps.numDemux; - jint numRecord = caps.numRecord; - jint numPlayback = caps.numPlayback; - jint numTsFilter = caps.numTsFilter; - jint numSectionFilter = caps.numSectionFilter; - jint numAudioFilter = caps.numAudioFilter; - jint numVideoFilter = caps.numVideoFilter; - jint numPesFilter = caps.numPesFilter; - jint numPcrFilter = caps.numPcrFilter; - jlong numBytesInSectionFilter = caps.numBytesInSectionFilter; - jint filterCaps = static_cast(caps.filterCaps); - jboolean bTimeFilter = caps.bTimeFilter; + jint numDemux = caps->numDemux; + jint numRecord = caps->numRecord; + jint numPlayback = caps->numPlayback; + jint numTsFilter = caps->numTsFilter; + jint numSectionFilter = caps->numSectionFilter; + jint numAudioFilter = caps->numAudioFilter; + jint numVideoFilter = caps->numVideoFilter; + jint numPesFilter = caps->numPesFilter; + jint numPcrFilter = caps->numPcrFilter; + jlong numBytesInSectionFilter = caps->numBytesInSectionFilter; + jint filterCaps = static_cast(caps->filterCaps); + jboolean bTimeFilter = caps->bTimeFilter; - jintArray linkCaps = env->NewIntArray(caps.linkCaps.size()); + jintArray linkCaps = env->NewIntArray(caps->linkCaps.size()); env->SetIntArrayRegion( - linkCaps, 0, caps.linkCaps.size(), reinterpret_cast(&caps.linkCaps[0])); + linkCaps, 0, caps->linkCaps.size(), reinterpret_cast(&caps->linkCaps[0])); return env->NewObject(clazz, capsInit, numDemux, numRecord, numPlayback, numTsFilter, numSectionFilter, numAudioFilter, numVideoFilter, numPesFilter, numPcrFilter, @@ -2434,14 +2347,6 @@ jint JTuner::closeFrontend() { jint JTuner::closeDemux() { Result r = Result::SUCCESS; - if (mDemux != NULL) { - r = mDemux->close(); - } - if (r == Result::SUCCESS) { - mDemux = NULL; - } else { - return (jint) r; - } if (mDemuxClient != NULL) { r = mDemuxClient->close(); @@ -3897,49 +3802,39 @@ static jint android_media_tv_Tuner_close_filter(JNIEnv *env, jobject filter) { return (jint) filterClient->close(); } -static sp getTimeFilter(JNIEnv *env, jobject filter) { - return (TimeFilter *)env->GetLongField(filter, gFields.timeFilterContext); +static sp getTimeFilterClient(JNIEnv *env, jobject filter) { + return (TimeFilterClient *)env->GetLongField(filter, gFields.timeFilterContext); } static int android_media_tv_Tuner_time_filter_set_timestamp( JNIEnv *env, jobject filter, jlong timestamp) { - sp filterSp = getTimeFilter(env, filter); - if (filterSp == NULL) { - ALOGD("Failed set timestamp: time filter not found"); + sp timeFilterClient = getTimeFilterClient(env, filter); + if (timeFilterClient == NULL) { + ALOGD("Failed set timestamp: time filter client not found"); return (int) Result::INVALID_STATE; } - sp iFilterSp = filterSp->getITimeFilter(); - Result r = iFilterSp->setTimeStamp(static_cast(timestamp)); + Result r = timeFilterClient->setTimeStamp(static_cast(timestamp)); return (int) r; } static int android_media_tv_Tuner_time_filter_clear_timestamp(JNIEnv *env, jobject filter) { - sp filterSp = getTimeFilter(env, filter); - if (filterSp == NULL) { - ALOGD("Failed clear timestamp: time filter not found"); + sp timeFilterClient = getTimeFilterClient(env, filter); + if (timeFilterClient == NULL) { + ALOGD("Failed clear timestamp: time filter client not found"); return (int) Result::INVALID_STATE; } - sp iFilterSp = filterSp->getITimeFilter(); - Result r = iFilterSp->clearTimeStamp(); + Result r = timeFilterClient->clearTimeStamp(); return (int) r; } static jobject android_media_tv_Tuner_time_filter_get_timestamp(JNIEnv *env, jobject filter) { - sp filterSp = getTimeFilter(env, filter); - if (filterSp == NULL) { - ALOGD("Failed get timestamp: time filter not found"); + sp timeFilterClient = getTimeFilterClient(env, filter); + if (timeFilterClient == NULL) { + ALOGD("Failed get timestamp: time filter client not found"); return NULL; } - - sp iFilterSp = filterSp->getITimeFilter(); - Result res; - uint64_t timestamp; - iFilterSp->getTimeStamp( - [&](Result r, uint64_t t) { - res = r; - timestamp = t; - }); - if (res != Result::SUCCESS) { + uint64_t timestamp = timeFilterClient->getTimeStamp(); + if (timestamp == (long)Constant64Bit::INVALID_PRESENTATION_TIME_STAMP) { return NULL; } @@ -3951,21 +3846,13 @@ static jobject android_media_tv_Tuner_time_filter_get_timestamp(JNIEnv *env, job } static jobject android_media_tv_Tuner_time_filter_get_source_time(JNIEnv *env, jobject filter) { - sp filterSp = getTimeFilter(env, filter); - if (filterSp == NULL) { - ALOGD("Failed get source time: time filter not found"); + sp timeFilterClient = getTimeFilterClient(env, filter); + if (timeFilterClient == NULL) { + ALOGD("Failed get source time: time filter client not found"); return NULL; } - - sp iFilterSp = filterSp->getITimeFilter(); - Result res; - uint64_t timestamp; - iFilterSp->getSourceTime( - [&](Result r, uint64_t t) { - res = r; - timestamp = t; - }); - if (res != Result::SUCCESS) { + uint64_t timestamp = timeFilterClient->getSourceTime(); + if (timestamp == (long)Constant64Bit::INVALID_PRESENTATION_TIME_STAMP) { return NULL; } @@ -3977,15 +3864,15 @@ static jobject android_media_tv_Tuner_time_filter_get_source_time(JNIEnv *env, j } static int android_media_tv_Tuner_time_filter_close(JNIEnv *env, jobject filter) { - sp filterSp = getTimeFilter(env, filter); - if (filterSp == NULL) { - ALOGD("Failed close time filter: time filter not found"); + sp timeFilterClient = getTimeFilterClient(env, filter); + if (timeFilterClient == NULL) { + ALOGD("Failed close time filter: time filter client not found"); return (int) Result::INVALID_STATE; } - Result r = filterSp->getITimeFilter()->close(); + Result r = timeFilterClient->close(); if (r == Result::SUCCESS) { - filterSp->decStrong(filter); + timeFilterClient->decStrong(filter); env->SetLongField(filter, gFields.timeFilterContext, 0); } return (int) r; @@ -4060,9 +3947,9 @@ static jobject android_media_tv_Tuner_get_demux_caps(JNIEnv* env, jobject thiz) return tuner->getDemuxCaps(); } -static jint android_media_tv_Tuner_open_demux(JNIEnv* env, jobject thiz, jint /* handle */) { +static jint android_media_tv_Tuner_open_demux(JNIEnv* env, jobject thiz, jint handle) { sp tuner = getTuner(env, thiz); - return (jint) tuner->openDemux(); + return (jint) tuner->openDemux(handle); } static jint android_media_tv_Tuner_close_tuner(JNIEnv* env, jobject thiz) { diff --git a/media/jni/android_media_tv_Tuner.h b/media/jni/android_media_tv_Tuner.h index bbead260b8cf4..0e30b18eb2d45 100644 --- a/media/jni/android_media_tv_Tuner.h +++ b/media/jni/android_media_tv_Tuner.h @@ -17,11 +17,6 @@ #ifndef _ANDROID_MEDIA_TV_TUNER_H_ #define _ANDROID_MEDIA_TV_TUNER_H_ -#include -#include -#include -#include -#include #include #include @@ -42,6 +37,7 @@ #include "tuner/FrontendClientCallback.h" #include "tuner/LnbClient.h" #include "tuner/LnbClientCallback.h" +#include "tuner/TimeFilterClient.h" #include "tuner/TunerClient.h" #include "jni.h" @@ -65,17 +61,6 @@ using ::android::hardware::tv::tuner::V1_0::FrontendScanMessageType; using ::android::hardware::tv::tuner::V1_0::FrontendScanType; using ::android::hardware::tv::tuner::V1_0::FrontendSettings; using ::android::hardware::tv::tuner::V1_1::FrontendSettingsExt1_1; -using ::android::hardware::tv::tuner::V1_0::IDemux; -using ::android::hardware::tv::tuner::V1_0::IDescrambler; -using ::android::hardware::tv::tuner::V1_0::IDvr; -using ::android::hardware::tv::tuner::V1_0::IDvrCallback; -using ::android::hardware::tv::tuner::V1_0::IFilter; -using ::android::hardware::tv::tuner::V1_1::IFilterCallback; -using ::android::hardware::tv::tuner::V1_0::IFrontend; -using ::android::hardware::tv::tuner::V1_0::ILnb; -using ::android::hardware::tv::tuner::V1_0::ILnbCallback; -using ::android::hardware::tv::tuner::V1_0::ITimeFilter; -using ::android::hardware::tv::tuner::V1_0::ITuner; using ::android::hardware::tv::tuner::V1_0::LnbEventType; using ::android::hardware::tv::tuner::V1_0::LnbId; using ::android::hardware::tv::tuner::V1_0::PlaybackStatus; @@ -100,15 +85,6 @@ private: jweak mLnbObj; }; -struct Lnb : public RefBase { - Lnb(sp sp, jobject obj); - ~Lnb(); - sp getILnb(); - // TODO: remove after migrate to client lib - sp mLnbSp; - jweak mLnbObj; -}; - struct DvrClientCallbackImpl : public DvrClientCallback { ~DvrClientCallbackImpl(); virtual void onRecordStatus(RecordStatus status); @@ -189,19 +165,8 @@ struct FrontendClientCallbackImpl : public FrontendClientCallback { jweak mObject; }; -struct TimeFilter : public RefBase { - TimeFilter(sp sp, jweak obj); - ~TimeFilter(); - sp getITimeFilter(); - // TODO: remove after migrate to client lib - sp mTimeFilterSp; - jweak mTimeFilterObj; -}; - struct JTuner : public RefBase { JTuner(JNIEnv *env, jobject thiz); - // TODO: modify after migrate to client lib - sp getTunerService(); int getTunerVersion(); jobject getAvSyncHwId(sp filter); jobject getAvSyncTime(jint id); @@ -228,7 +193,7 @@ struct JTuner : public RefBase { jobject openDvr(DvrType type, jlong bufferSize); jobject getDemuxCaps(); jobject getFrontendStatus(jintArray types); - Result openDemux(); + Result openDemux(int handle); jint close(); jint closeFrontend(); jint closeDemux(); @@ -239,17 +204,11 @@ protected: private: jclass mClass; jweak mObject; - // TODO: remove after migrate to client lib - static sp mTuner; - static sp<::android::hardware::tv::tuner::V1_1::ITuner> mTuner_1_1; static sp mTunerClient; sp mFeClient; int mFeId; sp mLnbClient; - // TODO: remove after migrate to client lib - sp mDemux; sp mDemuxClient; - uint32_t mDemuxId; static jobject getAnalogFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps); static jobject getAtsc3FrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps); static jobject getAtscFrontendCaps(JNIEnv *env, FrontendInfo::FrontendCapabilities& caps); diff --git a/media/jni/tuner/DemuxClient.cpp b/media/jni/tuner/DemuxClient.cpp index 58f9a46bdbeb2..08b7398543789 100644 --- a/media/jni/tuner/DemuxClient.cpp +++ b/media/jni/tuner/DemuxClient.cpp @@ -79,6 +79,21 @@ sp DemuxClient::openFilter(DemuxFilterType type, int bufferSize, return NULL; } +sp DemuxClient::openTimeFilter() { + // TODO: pending aidl interface + + if (mDemux != NULL) { + sp hidlTimeFilter = openHidlTimeFilter(); + if (hidlTimeFilter != NULL) { + sp timeFilterClient = new TimeFilterClient(); + timeFilterClient->setHidlTimeFilter(hidlTimeFilter); + return timeFilterClient; + } + } + + return NULL; +} + int DemuxClient::getAvSyncHwId(sp filterClient) { // pending aidl interface @@ -190,6 +205,26 @@ sp DemuxClient::openHidlFilter(DemuxFilterType type, int bufferSize, return hidlFilter; } +sp DemuxClient::openHidlTimeFilter() { + if (mDemux == NULL) { + return NULL; + } + + sp timeFilter; + Result res; + mDemux->openTimeFilter( + [&](Result r, const sp& timeFilterSp) { + timeFilter = timeFilterSp; + res = r; + }); + + if (res != Result::SUCCESS || timeFilter == NULL) { + return NULL; + } + + return timeFilter; +} + sp DemuxClient::openHidlDvr(DvrType dvrType, int bufferSize, sp callback) { if (mDemux == NULL) { diff --git a/media/jni/tuner/DemuxClient.h b/media/jni/tuner/DemuxClient.h index 7b8eedeacf0e3..2950dd449a101 100644 --- a/media/jni/tuner/DemuxClient.h +++ b/media/jni/tuner/DemuxClient.h @@ -26,12 +26,14 @@ #include "FilterClient.h" #include "FilterClientCallback.h" #include "FrontendClient.h" +#include "TimeFilterClient.h" //using ::aidl::android::media::tv::tuner::ITunerDemux; using ::android::hardware::tv::tuner::V1_0::DemuxFilterType; using ::android::hardware::tv::tuner::V1_0::DvrType; using ::android::hardware::tv::tuner::V1_0::IDemux; +using ::android::hardware::tv::tuner::V1_0::ITimeFilter; using namespace std; @@ -56,7 +58,10 @@ public: */ sp openFilter(DemuxFilterType type, int bufferSize, sp cb); - // TODO: handle TimeFilterClient + /** + * Open time filter of the demux. + */ + sp openTimeFilter(); /** * Get hardware sync ID for audio and video. @@ -93,6 +98,7 @@ public: private: sp openHidlFilter(DemuxFilterType type, int bufferSize, sp cb); + sp openHidlTimeFilter(); sp openHidlDvr(DvrType type, int bufferSize, sp cb); /** diff --git a/media/jni/tuner/TimeFilterClient.cpp b/media/jni/tuner/TimeFilterClient.cpp new file mode 100644 index 0000000000000..27ea6e596204c --- /dev/null +++ b/media/jni/tuner/TimeFilterClient.cpp @@ -0,0 +1,115 @@ +/* + * 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. + */ + +#define LOG_TAG "TimeFilterClient" + +#include +#include + +#include "TimeFilterClient.h" + +using ::android::hardware::tv::tuner::V1_0::Result; +using ::android::hardware::tv::tuner::V1_1::Constant64Bit; + +namespace android { + +/////////////// TimeFilterClient /////////////////////// + +// TODO: pending aidl interface +TimeFilterClient::TimeFilterClient() { + //mTunerTimeFilter = tunerTimeFilter; +} + +TimeFilterClient::~TimeFilterClient() { + //mTunerTimeFilter = NULL; + mTimeFilter = NULL; +} + +// TODO: remove after migration to Tuner Service is done. +void TimeFilterClient::setHidlTimeFilter(sp timeFilter) { + mTimeFilter = timeFilter; +} + +Result TimeFilterClient::setTimeStamp(long timeStamp) { + // TODO: pending aidl interface + + if (mTimeFilter != NULL) { + return mTimeFilter->setTimeStamp(timeStamp); + } + + return Result::INVALID_STATE; +} + +Result TimeFilterClient::clearTimeStamp() { + // TODO: pending aidl interface + + if (mTimeFilter != NULL) { + return mTimeFilter->clearTimeStamp(); + } + + return Result::INVALID_STATE; +} + +long TimeFilterClient::getTimeStamp() { + // TODO: pending aidl interface + + if (mTimeFilter != NULL) { + Result res; + long timestamp; + mTimeFilter->getTimeStamp( + [&](Result r, uint64_t t) { + res = r; + timestamp = t; + }); + if (res != Result::SUCCESS) { + return (long)Constant64Bit::INVALID_PRESENTATION_TIME_STAMP; + } + return timestamp; + } + + return (long)Constant64Bit::INVALID_PRESENTATION_TIME_STAMP; +} + +long TimeFilterClient::getSourceTime() { + // TODO: pending aidl interface + + if (mTimeFilter != NULL) { + Result res; + long timestamp; + mTimeFilter->getSourceTime( + [&](Result r, uint64_t t) { + res = r; + timestamp = t; + }); + if (res != Result::SUCCESS) { + return (long)Constant64Bit::INVALID_PRESENTATION_TIME_STAMP; + } + return timestamp; + } + + return (long)Constant64Bit::INVALID_PRESENTATION_TIME_STAMP; +} + +Result TimeFilterClient::close() { + // TODO: pending aidl interface + + if (mTimeFilter != NULL) { + return mTimeFilter->close(); + } + + return Result::INVALID_STATE; +} +} // namespace android diff --git a/media/jni/tuner/TimeFilterClient.h b/media/jni/tuner/TimeFilterClient.h new file mode 100644 index 0000000000000..9a9d172665ec1 --- /dev/null +++ b/media/jni/tuner/TimeFilterClient.h @@ -0,0 +1,88 @@ +/* + * 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_TIME_FILTER_CLIENT_H_ +#define _ANDROID_MEDIA_TV_TIME_FILTER_CLIENT_H_ + +//#include +#include +#include + +//using ::aidl::android::media::tv::tuner::ITunerTimeFilter; + +using ::android::hardware::Return; +using ::android::hardware::Void; +using ::android::hardware::hidl_vec; +using ::android::hardware::tv::tuner::V1_0::ITimeFilter; +using ::android::hardware::tv::tuner::V1_0::Result; + +using namespace std; + +namespace android { + +struct TimeFilterClient : public RefBase { + +public: + // TODO: add TunerTimeFilter as parameter. + TimeFilterClient(); + ~TimeFilterClient(); + + // TODO: remove after migration to Tuner Service is done. + void setHidlTimeFilter(sp timeFilter); + + /** + * Set time stamp for time based filter. + */ + Result setTimeStamp(long timeStamp); + + /** + * Clear the time stamp in the time filter. + */ + Result clearTimeStamp(); + + /** + * Get the current time in the time filter. + */ + long getTimeStamp(); + + /** + * Get the time from the beginning of current data source. + */ + long getSourceTime(); + + /** + * Releases the Time Filter instance. + */ + Result close(); + +private: + /** + * An AIDL Tuner TimeFilter Singleton assigned at the first time the Tuner Client + * opens an TimeFilter. Default null when time filter is not opened. + */ + // TODO: pending on aidl interface + //shared_ptr mTunerTimeFilter; + + /** + * A TimeFilter HAL interface that is ready before migrating to the TunerTimeFilter. + * This is a temprary interface before Tuner Framework migrates to use TunerService. + * Default null when the HAL service does not exist. + */ + sp mTimeFilter; +}; +} // namespace android + +#endif // _ANDROID_MEDIA_TV_TIME_FILTER_CLIENT_H_ diff --git a/media/jni/tuner/TunerClient.cpp b/media/jni/tuner/TunerClient.cpp index e469aa3126471..b14e902d549c1 100644 --- a/media/jni/tuner/TunerClient.cpp +++ b/media/jni/tuner/TunerClient.cpp @@ -173,9 +173,22 @@ sp TunerClient::openDemux(int /*demuxHandle*/) { return NULL; } -DemuxCapabilities TunerClient::getDemuxCaps() { - DemuxCapabilities caps; - return caps; +shared_ptr TunerClient::getDemuxCaps() { + // pending aidl interface + + if (mTuner != NULL) { + Result res; + DemuxCapabilities caps; + mTuner->getDemuxCaps([&](Result r, const DemuxCapabilities& demuxCaps) { + caps = demuxCaps; + res = r; + }); + if (res == Result::SUCCESS) { + return make_shared(caps); + } + } + + return NULL; } sp TunerClient::openDescrambler(int /*descramblerHandle*/) { diff --git a/media/jni/tuner/TunerClient.h b/media/jni/tuner/TunerClient.h index 036360f213525..94fdf274ef166 100644 --- a/media/jni/tuner/TunerClient.h +++ b/media/jni/tuner/TunerClient.h @@ -96,7 +96,7 @@ public: * * @return the demux’s capabilities. */ - DemuxCapabilities getDemuxCaps(); + shared_ptr getDemuxCaps(); /** * Open a new interface of DescramblerClient given a descramblerHandle.