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

Commit 16ba3c91 authored by shubang's avatar shubang Committed by Amy Zhang
Browse files

Impement filter settings, configuration and callback

Bug: 177530961
Test: mmm
Change-Id: I64a4a448512d791c54a9b741076f3b3dbe63ecf9
parent d1fbbd6e
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ aidl_interface {
        ":tv_tuner_aidl",
    ],
    imports: [
        "android.hardware.common",
        "android.hardware.common.fmq",
    ],

@@ -85,6 +86,7 @@ cc_library {

    static_libs: [
        "android.hardware.common.fmq-unstable-ndk_platform",
        "libaidlcommonsupport",
    ],

    include_dirs: [
+124 −2
Original line number Diff line number Diff line
@@ -16,8 +16,11 @@

#define LOG_TAG "TunerFilter"

#include <aidlcommonsupport/NativeHandle.h>
#include "TunerFilter.h"

using ::android::hardware::tv::tuner::V1_0::DemuxFilterSettings;
using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterSettings;
using ::android::hardware::tv::tuner::V1_0::Result;

namespace android {
@@ -34,6 +37,13 @@ TunerFilter::~TunerFilter() {
    mFilterCallback = nullptr;
}

DemuxFilterAvSettings TunerFilter::getAvSettings(const TunerFilterSettings& settings) {
    DemuxFilterAvSettings av {
        .isPassthrough = settings.get<TunerFilterSettings::av>().isPassthrough,
    };
    return av;
}

Status TunerFilter::getId(int32_t* _aidl_return) {
    if (mFilter == nullptr) {
        ALOGE("IFilter is not initialized");
@@ -46,7 +56,7 @@ Status TunerFilter::getId(int32_t* _aidl_return) {
        mId = filterId;
    });
    if (res != Result::SUCCESS) {
        return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
        return Status::fromServiceSpecificError(static_cast<int32_t>(res));
    }
    *_aidl_return = mId;
    return Status::ok();
@@ -70,14 +80,126 @@ Status TunerFilter::getId64Bit(int64_t* _aidl_return) {
    return Status::ok();
}

Status TunerFilter::configure(const TunerFilterConfiguration& config) {
    if (mFilter == nullptr) {
        ALOGE("IFilter is not initialized");
        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
    }

    // TODO: more filter types.
    TunerFilterSettings tunerSettings;
    DemuxFilterSettings halSettings;
    switch (config.getTag()) {
        case TunerFilterConfiguration::ts: {
            uint16_t tpid = static_cast<uint16_t>(config.get<TunerFilterConfiguration::ts>().tpid);
            tunerSettings = config.get<TunerFilterConfiguration::ts>().filterSettings;
            DemuxTsFilterSettings ts {
                .tpid = tpid,
            };

            switch (tunerSettings.getTag()) {
                case TunerFilterSettings::av: {
                    ts.filterSettings.av(getAvSettings(tunerSettings));
                    break;
                }
            }
            break;
        }
    }
    Result res = mFilter->configure(halSettings);
    if (res != Result::SUCCESS) {
        return Status::fromServiceSpecificError(static_cast<int32_t>(res));
    }
    return Status::ok();
}

Status TunerFilter::start() {
    if (mFilter == nullptr) {
        ALOGE("IFilter is not initialized");
        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
    }
    Result res = mFilter->start();
    if (res != Result::SUCCESS) {
        return Status::fromServiceSpecificError(static_cast<int32_t>(res));
    }
    return Status::ok();
}

Status TunerFilter::stop() {
    if (mFilter == nullptr) {
        ALOGE("IFilter is not initialized");
        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
    }
    Result res = mFilter->stop();
    if (res != Result::SUCCESS) {
        return Status::fromServiceSpecificError(static_cast<int32_t>(res));
    }
    return Status::ok();
}

Status TunerFilter::flush() {
    if (mFilter == nullptr) {
        ALOGE("IFilter is not initialized");
        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
    }
    Result res = mFilter->flush();
    if (res != Result::SUCCESS) {
        return Status::fromServiceSpecificError(static_cast<int32_t>(res));
    }
    return Status::ok();
}

/////////////// FilterCallback ///////////////////////

void TunerFilter::FilterCallback::getMediaEvent(
        std::vector<DemuxFilterEvent::Event>& events, std::vector<TunerFilterEvent>& res) {
    for (DemuxFilterEvent::Event e : events) {
        DemuxFilterMediaEvent mediaEvent = e.media();
        TunerFilterMediaEvent tunerMedia;

        tunerMedia.streamId = static_cast<int>(mediaEvent.streamId);
        tunerMedia.isPtsPresent = mediaEvent.isPtsPresent;
        tunerMedia.pts = static_cast<long>(mediaEvent.pts);
        tunerMedia.dataLength = static_cast<long>(mediaEvent.dataLength);
        tunerMedia.offset = static_cast<long>(mediaEvent.offset);
        tunerMedia.isSecureMemory = mediaEvent.isSecureMemory;
        tunerMedia.avDataId = static_cast<long>(mediaEvent.avDataId);
        tunerMedia.mpuSequenceNumber = static_cast<int>(mediaEvent.mpuSequenceNumber);
        tunerMedia.isPesPrivateData = mediaEvent.isPesPrivateData;

        if (mediaEvent.avMemory.getNativeHandle() != nullptr) {
            tunerMedia.avMemory = dupToAidl(mediaEvent.avMemory.getNativeHandle());
        }

        TunerFilterEvent tunerEvent;
        tunerEvent.set<TunerFilterEvent::media>(std::move(tunerMedia));
        res.push_back(std::move(tunerEvent));
    }
}

Return<void> TunerFilter::FilterCallback::onFilterStatus(DemuxFilterStatus status) {
    mTunerFilterCallback->onFilterStatus((int)status);
    return Void();
}

Return<void> TunerFilter::FilterCallback::onFilterEvent(const DemuxFilterEvent&) {
Return<void> TunerFilter::FilterCallback::onFilterEvent(const DemuxFilterEvent& filterEvent) {
    ALOGD("FilterCallback::onFilterEvent");
    std::vector<DemuxFilterEvent::Event> events = filterEvent.events;
    std::vector<TunerFilterEvent> tunerEvent;

    if (!events.empty()) {
        DemuxFilterEvent::Event event = events[0];
        switch (event.getDiscriminator()) {
            case DemuxFilterEvent::Event::hidl_discriminator::media: {
                getMediaEvent(events, tunerEvent);
                break;
            }
            default: {
                break;
            }
        }
    }
    mTunerFilterCallback->onFilterEvent(&tunerEvent);
    return Void();
}

+13 −0
Original line number Diff line number Diff line
@@ -26,9 +26,15 @@
using Status = ::ndk::ScopedAStatus;
using ::aidl::android::media::tv::tuner::BnTunerFilter;
using ::aidl::android::media::tv::tuner::ITunerFilterCallback;
using ::aidl::android::media::tv::tuner::TunerFilterConfiguration;
using ::aidl::android::media::tv::tuner::TunerFilterEvent;
using ::aidl::android::media::tv::tuner::TunerFilterMediaEvent;
using ::aidl::android::media::tv::tuner::TunerFilterSettings;
using ::android::hardware::Return;
using ::android::hardware::Void;
using ::android::hardware::tv::tuner::V1_0::DemuxFilterAvSettings;
using ::android::hardware::tv::tuner::V1_0::DemuxFilterEvent;
using ::android::hardware::tv::tuner::V1_0::DemuxFilterMediaEvent;
using ::android::hardware::tv::tuner::V1_0::DemuxFilterStatus;
using ::android::hardware::tv::tuner::V1_0::IFilter;
using ::android::hardware::tv::tuner::V1_0::IFilterCallback;
@@ -43,6 +49,10 @@ public:
    virtual ~TunerFilter();
    Status getId(int32_t* _aidl_return) override;
    Status getId64Bit(int64_t* _aidl_return) override;
    Status configure(const TunerFilterConfiguration& config) override;
    Status start() override;
    Status stop() override;
    Status flush() override;

    struct FilterCallback : public IFilterCallback {
        FilterCallback(const std::shared_ptr<ITunerFilterCallback> tunerFilterCallback)
@@ -50,11 +60,14 @@ public:

        virtual Return<void> onFilterEvent(const DemuxFilterEvent& filterEvent);
        virtual Return<void> onFilterStatus(DemuxFilterStatus status);
        void getMediaEvent(
                std::vector<DemuxFilterEvent::Event>& events, std::vector<TunerFilterEvent>& res);

        std::shared_ptr<ITunerFilterCallback> mTunerFilterCallback;
    };

private:
    DemuxFilterAvSettings getAvSettings(const TunerFilterSettings& settings);
    sp<IFilter> mFilter;
    sp<::android::hardware::tv::tuner::V1_1::IFilter> mFilter_1_1;
    sp<IFilterCallback> mFilterCallback;
+22 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package android.media.tv.tuner;

import android.media.tv.tuner.TunerFilterConfiguration;

/**
 * Tuner Filter interface handles tuner related operations.
 *
@@ -31,4 +33,24 @@ interface ITunerFilter {
     * Get the 64-bit filter Id.
     */
    long getId64Bit();

    /**
     * Configure the filter.
     */
    void configure(in TunerFilterConfiguration config);

    /**
     * Start the filter.
     */
    void start();

    /**
     * Stop the filter.
     */
    void stop();

    /**
     * Flush the filter.
     */
    void flush();
}
+7 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package android.media.tv.tuner;

import android.media.tv.tuner.TunerFilterEvent;

/**
 * TunerFilterCallback interface handles tuner filter related callbacks.
 *
@@ -26,4 +28,9 @@ interface ITunerFilterCallback {
     * Notify the client a new status of a filter.
     */
    void onFilterStatus(int status);

    /**
     * Notify the client that a new filter event happened.
     */
    void onFilterEvent(out TunerFilterEvent[] filterEvent);
}
Loading