Complete TunerFilter aidl interface
Test: make
Bug: 159067322
Change-Id: I2707a0ea4a6f07256fdfdfb01ca6182f6f428712
diff --git a/services/tuner/TunerDemux.cpp b/services/tuner/TunerDemux.cpp
index 1f8b70d..d2041f4 100644
--- a/services/tuner/TunerDemux.cpp
+++ b/services/tuner/TunerDemux.cpp
@@ -97,7 +97,7 @@
return Status::fromServiceSpecificError(static_cast<int32_t>(status));
}
- *_aidl_return = ::ndk::SharedRefBase::make<TunerFilter>(filterSp, cbSp);
+ *_aidl_return = ::ndk::SharedRefBase::make<TunerFilter>(filterSp, cbSp, type, subType);
return Status::ok();
}
diff --git a/services/tuner/TunerFilter.cpp b/services/tuner/TunerFilter.cpp
index b712348..7b7cc36 100644
--- a/services/tuner/TunerFilter.cpp
+++ b/services/tuner/TunerFilter.cpp
@@ -30,17 +30,21 @@
using ::android::hardware::tv::tuner::V1_0::DemuxStreamId;
using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterType;
using ::android::hardware::tv::tuner::V1_0::Result;
+using ::android::hardware::tv::tuner::V1_1::AudioStreamType;
using ::android::hardware::tv::tuner::V1_1::Constant;
+using ::android::hardware::tv::tuner::V1_1::VideoStreamType;
namespace android {
using namespace std;
TunerFilter::TunerFilter(
- sp<IFilter> filter, sp<IFilterCallback> callback) {
+ sp<IFilter> filter, sp<IFilterCallback> callback, int mainType, int subType) {
mFilter = filter;
mFilter_1_1 = ::android::hardware::tv::tuner::V1_1::IFilter::castFrom(filter);
mFilterCallback = callback;
+ mMainType = mainType;
+ mSubType = subType;
}
TunerFilter::~TunerFilter() {
@@ -49,6 +53,29 @@
mFilterCallback = nullptr;
}
+Status TunerFilter::getQueueDesc(AidlMQDesc* _aidl_return) {
+ if (mFilter == NULL) {
+ ALOGE("IFilter is not initialized");
+ return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
+ }
+
+ MQDesc dvrMQDesc;
+ Result res;
+ mFilter->getQueueDesc([&](Result r, const MQDesc& desc) {
+ dvrMQDesc = desc;
+ res = r;
+ });
+ if (res != Result::SUCCESS) {
+ return Status::fromServiceSpecificError(static_cast<int32_t>(res));
+ }
+
+ AidlMQDesc aidlMQDesc;
+ unsafeHidlToAidlMQDescriptor<uint8_t, int8_t, SynchronizedReadWrite>(
+ dvrMQDesc, &aidlMQDesc);
+ *_aidl_return = move(aidlMQDesc);
+ return Status::ok();
+}
+
Status TunerFilter::getId(int32_t* _aidl_return) {
if (mFilter == nullptr) {
ALOGE("IFilter is not initialized");
@@ -122,6 +149,65 @@
return Status::ok();
}
+Status TunerFilter::configureMonitorEvent(int monitorEventType) {
+ if (mFilter_1_1 == nullptr) {
+ ALOGE("IFilter_1_1 is not initialized");
+ return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
+ }
+
+ Result res = mFilter_1_1->configureMonitorEvent(monitorEventType);
+ if (res != Result::SUCCESS) {
+ return Status::fromServiceSpecificError(static_cast<int32_t>(res));
+ }
+ return Status::ok();
+}
+
+Status TunerFilter::configureIpFilterContextId(int cid) {
+ if (mFilter_1_1 == nullptr) {
+ ALOGE("IFilter_1_1 is not initialized");
+ return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
+ }
+
+ Result res = mFilter_1_1->configureIpCid(cid);
+ if (res != Result::SUCCESS) {
+ return Status::fromServiceSpecificError(static_cast<int32_t>(res));
+ }
+ return Status::ok();
+}
+
+Status TunerFilter::configureAvStreamType(int avStreamType) {
+ if (mFilter_1_1 == nullptr) {
+ ALOGE("IFilter_1_1 is not initialized");
+ return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
+ }
+
+ AvStreamType type;
+ if (!getHidlAvStreamType(avStreamType, type)) {
+ return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
+ }
+
+ Result res = mFilter_1_1->configureAvStreamType(type);
+ if (res != Result::SUCCESS) {
+ return Status::fromServiceSpecificError(static_cast<int32_t>(res));
+ }
+ return Status::ok();
+}
+
+Status TunerFilter::setDataSource(const shared_ptr<ITunerFilter>& filter) {
+ if (mFilter == nullptr) {
+ ALOGE("IFilter is not initialized");
+ return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
+ }
+
+ ITunerFilter* tunerFilter = filter.get();
+ sp<IFilter> hidlFilter = static_cast<TunerFilter*>(tunerFilter)->getHalFilter();
+ Result res = mFilter->setDataSource(hidlFilter);
+ if (res != Result::SUCCESS) {
+ return Status::fromServiceSpecificError(static_cast<int32_t>(res));
+ }
+ return Status::ok();
+}
+
void TunerFilter::getHidlTsSettings(
const TunerFilterConfiguration& config, DemuxFilterSettings& settings) {
auto tsConf = config.get<TunerFilterConfiguration::ts>();
@@ -468,6 +554,34 @@
return mFilter;
}
+bool TunerFilter::isAudioFilter() {
+ return (mMainType == (int)DemuxFilterMainType::TS
+ && mSubType == (int)DemuxTsFilterType::AUDIO)
+ || (mMainType == (int)DemuxFilterMainType::MMTP
+ && mSubType == (int)DemuxMmtpFilterType::AUDIO);
+}
+
+bool TunerFilter::isVideoFilter() {
+ return (mMainType == (int)DemuxFilterMainType::TS
+ && mSubType == (int)DemuxTsFilterType::VIDEO)
+ || (mMainType == (int)DemuxFilterMainType::MMTP
+ && mSubType == (int)DemuxMmtpFilterType::VIDEO);
+}
+
+bool TunerFilter::getHidlAvStreamType(int avStreamType, AvStreamType& type) {
+ if (isAudioFilter()) {
+ type.audio(static_cast<AudioStreamType>(avStreamType));
+ return true;
+ }
+
+ if (isVideoFilter()) {
+ type.video(static_cast<VideoStreamType>(avStreamType));
+ return true;
+ }
+
+ return false;
+}
+
/////////////// FilterCallback ///////////////////////
Return<void> TunerFilter::FilterCallback::onFilterStatus(DemuxFilterStatus status) {
diff --git a/services/tuner/TunerFilter.h b/services/tuner/TunerFilter.h
index 0055b53..d12b7ac 100644
--- a/services/tuner/TunerFilter.h
+++ b/services/tuner/TunerFilter.h
@@ -25,8 +25,12 @@
#include <android/hardware/tv/tuner/1.1/IFilterCallback.h>
#include <android/hardware/tv/tuner/1.1/types.h>
#include <media/stagefright/foundation/ADebug.h>
+#include <fmq/ConvertMQDescriptors.h>
+#include <fmq/MessageQueue.h>
using Status = ::ndk::ScopedAStatus;
+using ::aidl::android::hardware::common::fmq::MQDescriptor;
+using ::aidl::android::hardware::common::fmq::SynchronizedReadWrite;
using ::aidl::android::media::tv::tuner::BnTunerFilter;
using ::aidl::android::media::tv::tuner::ITunerFilterCallback;
using ::aidl::android::media::tv::tuner::TunerDemuxIpAddress;
@@ -44,6 +48,7 @@
using ::aidl::android::media::tv::tuner::TunerFilterSettings;
using ::aidl::android::media::tv::tuner::TunerFilterTemiEvent;
using ::aidl::android::media::tv::tuner::TunerFilterTsRecordEvent;
+using ::android::hardware::MQDescriptorSync;
using ::android::hardware::Return;
using ::android::hardware::Void;
using ::android::hardware::hidl_array;
@@ -70,6 +75,7 @@
using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterSettings;
using ::android::hardware::tv::tuner::V1_0::DemuxPid;
using ::android::hardware::tv::tuner::V1_0::IFilter;
+using ::android::hardware::tv::tuner::V1_1::AvStreamType;
using ::android::hardware::tv::tuner::V1_1::DemuxFilterEventExt;
using ::android::hardware::tv::tuner::V1_1::DemuxFilterMonitorEvent;
using ::android::hardware::tv::tuner::V1_1::DemuxFilterTsRecordEventExt;
@@ -77,20 +83,28 @@
namespace android {
+using MQDesc = MQDescriptorSync<uint8_t>;
+using AidlMQDesc = MQDescriptor<int8_t, SynchronizedReadWrite>;
+
const static int IP_V4_LENGTH = 4;
const static int IP_V6_LENGTH = 16;
class TunerFilter : public BnTunerFilter {
public:
- TunerFilter(sp<IFilter> filter, sp<IFilterCallback> callback);
+ TunerFilter(sp<IFilter> filter, sp<IFilterCallback> callback, int mainType, int subTyp);
virtual ~TunerFilter();
Status getId(int32_t* _aidl_return) override;
Status getId64Bit(int64_t* _aidl_return) override;
+ Status getQueueDesc(AidlMQDesc* _aidl_return) override;
Status configure(const TunerFilterConfiguration& config) override;
+ Status configureMonitorEvent(int monitorEventType) override;
+ Status configureIpFilterContextId(int cid) override;
+ Status configureAvStreamType(int avStreamType) override;
Status getAvSharedHandleInfo(TunerFilterSharedHandleInfo* _aidl_return) override;
Status releaseAvHandle(const ::aidl::android::hardware::common::NativeHandle& handle,
int64_t avDataId) override;
+ Status setDataSource(const std::shared_ptr<ITunerFilter>& filter) override;
Status start() override;
Status stop() override;
Status flush() override;
@@ -147,6 +161,10 @@
DemuxFilterRecordSettings getRecordSettings(const TunerFilterSettings& settings);
DemuxFilterDownloadSettings getDownloadSettings(const TunerFilterSettings& settings);
+ bool isAudioFilter();
+ bool isVideoFilter();
+ bool getHidlAvStreamType(int avStreamType, AvStreamType& type);
+
void getHidlTsSettings(
const TunerFilterConfiguration& config, DemuxFilterSettings& settings);
void getHidlMmtpSettings(
@@ -166,6 +184,8 @@
sp<IFilterCallback> mFilterCallback;
int32_t mId;
int64_t mId64Bit;
+ int mMainType;
+ int mSubType;
};
} // namespace android
diff --git a/services/tuner/aidl/android/media/tv/tuner/ITunerFilter.aidl b/services/tuner/aidl/android/media/tv/tuner/ITunerFilter.aidl
index 1d5544f..10d4c3b 100644
--- a/services/tuner/aidl/android/media/tv/tuner/ITunerFilter.aidl
+++ b/services/tuner/aidl/android/media/tv/tuner/ITunerFilter.aidl
@@ -16,6 +16,8 @@
package android.media.tv.tuner;
+import android.hardware.common.fmq.MQDescriptor;
+import android.hardware.common.fmq.SynchronizedReadWrite;
import android.hardware.common.NativeHandle;
import android.media.tv.tuner.TunerFilterConfiguration;
import android.media.tv.tuner.TunerFilterSharedHandleInfo;
@@ -37,11 +39,31 @@
long getId64Bit();
/**
+ * Get the descriptor of the Filter's FMQ.
+ */
+ MQDescriptor<byte, SynchronizedReadWrite> getQueueDesc();
+
+ /**
* Configure the filter.
*/
void configure(in TunerFilterConfiguration config);
/**
+ * Configure the monitor event of the Filter.
+ */
+ void configureMonitorEvent(in int monitorEventType);
+
+ /**
+ * Configure the context id of the IP Filter.
+ */
+ void configureIpFilterContextId(in int cid);
+
+ /**
+ * Configure the stream type of the media Filter.
+ */
+ void configureAvStreamType(in int avStreamType);
+
+ /**
* Get the a/v shared memory handle
*/
TunerFilterSharedHandleInfo getAvSharedHandleInfo();
@@ -52,6 +74,11 @@
void releaseAvHandle(in NativeHandle handle, in long avDataId);
/**
+ * Set the filter's data source.
+ */
+ void setDataSource(ITunerFilter filter);
+
+ /**
* Start the filter.
*/
void start();