Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cae5cfee authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Complete TunerFilter aidl interface" into sc-dev

parents 97e6eae2 c5792a52
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -98,7 +98,7 @@ Status TunerDemux::openFilter(
        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();
}

+115 −1
Original line number Diff line number Diff line
@@ -30,17 +30,21 @@ using ::android::hardware::tv::tuner::V1_0::DemuxRecordScIndexType;
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 @@ TunerFilter::~TunerFilter() {
    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 @@ Status TunerFilter::configure(const TunerFilterConfiguration& config) {
    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 @@ sp<IFilter> TunerFilter::getHalFilter() {
    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) {
+21 −1
Original line number Diff line number Diff line
@@ -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::TunerFilterSharedHandleInfo;
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::DemuxTlvFilterSettings;
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 @@ using ::android::hardware::tv::tuner::V1_1::IFilterCallback;

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 @@ private:
    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 @@ private:
    sp<IFilterCallback> mFilterCallback;
    int32_t mId;
    int64_t mId64Bit;
    int mMainType;
    int mSubType;
};

} // namespace android
+27 −0
Original line number Diff line number Diff line
@@ -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;
@@ -36,11 +38,31 @@ interface ITunerFilter {
     */
    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
     */
@@ -51,6 +73,11 @@ interface ITunerFilter {
     */
    void releaseAvHandle(in NativeHandle handle, in long avDataId);

    /**
     * Set the filter's data source.
     */
    void setDataSource(ITunerFilter filter);

    /**
     * Start the filter.
     */