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

Commit eb292c1b authored by Amy Zhang's avatar Amy Zhang
Browse files

Implement MediaFilter/MediaEvents core path in Tuner Service

Test: tuner sample tis on cuttlefish
Bug: 159067322
Change-Id: I37b7338e8c7b02bbf562f67da81088d07b2a807f
Merged-In: I37b7338e8c7b02bbf562f67da81088d07b2a807f
parent 40e3a7a2
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -124,4 +124,17 @@ Status TunerDemux::openDvr(int dvrType, int bufferSize, const shared_ptr<ITunerD
    *_aidl_return = ::ndk::SharedRefBase::make<TunerDvr>(hidlDvr, dvrType);
    return Status::ok();
}

Status TunerDemux::close() {
    if (mDemux == nullptr) {
        ALOGE("IDemux is not initialized.");
        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
    }

    Result res = mDemux->close();
    if (res != Result::SUCCESS) {
        return Status::fromServiceSpecificError(static_cast<int32_t>(res));
    }
    return Status::ok();
}
}  // namespace android
+1 −0
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ public:
    Status openDvr(
        int dvbType, int bufferSize, const shared_ptr<ITunerDvrCallback>& cb,
        shared_ptr<ITunerDvr>* _aidl_return) override;
    Status close() override;

private:
    sp<IDemux> mDemux;
+61 −7
Original line number Diff line number Diff line
@@ -16,16 +16,19 @@

#define LOG_TAG "TunerFilter"

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

using ::android::hardware::hidl_handle;
using ::android::hardware::tv::tuner::V1_0::DemuxFilterMainType;
using ::android::hardware::tv::tuner::V1_0::DemuxFilterSettings;
using ::android::hardware::tv::tuner::V1_0::DemuxMmtpFilterType;
using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterSettings;
using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterType;
using ::android::hardware::tv::tuner::V1_0::Result;

namespace android {

TunerFilter::TunerFilter(sp<IFilter> filter, sp<IFilterCallback> callback) {
TunerFilter::TunerFilter(
        sp<IFilter> filter, sp<IFilterCallback> callback) {
    mFilter = filter;
    mFilter_1_1 = ::android::hardware::tv::tuner::V1_1::IFilter::castFrom(filter);
    mFilterCallback = callback;
@@ -103,6 +106,7 @@ Status TunerFilter::configure(const TunerFilterConfiguration& config) {
                    break;
                }
            }
            halSettings.ts(ts);
            break;
        }
    }
@@ -113,6 +117,44 @@ Status TunerFilter::configure(const TunerFilterConfiguration& config) {
    return Status::ok();
}

Status TunerFilter::getAvSharedHandleInfo(TunerFilterSharedHandleInfo* _aidl_return) {
    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->getAvSharedHandle([&](Result r, hidl_handle avMemory, uint64_t avMemSize) {
        res = r;
        if (res == Result::SUCCESS) {
            TunerFilterSharedHandleInfo info{
                .handle = dupToAidl(hidl_handle(avMemory.getNativeHandle())),
                .size = static_cast<int64_t>(avMemSize),
            };
            *_aidl_return = std::move(info);
        } else {
            _aidl_return = NULL;
        }
    });

    return Status::fromServiceSpecificError(static_cast<int32_t>(res));
}

Status TunerFilter::releaseAvHandle(
        const ::aidl::android::hardware::common::NativeHandle& handle, int64_t avDataId) {
    if (mFilter == nullptr) {
        ALOGE("IFilter is not initialized");
        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
    }

    Result res = mFilter->releaseAvHandle(hidl_handle(makeFromAidl(handle)), avDataId);
    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");
@@ -149,6 +191,18 @@ Status TunerFilter::flush() {
    return Status::ok();
}

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

sp<IFilter> TunerFilter::getHalFilter() {
    return mFilter;
}
@@ -164,8 +218,8 @@ void TunerFilter::FilterCallback::getMediaEvent(
        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.dataLength = static_cast<int>(mediaEvent.dataLength);
        tunerMedia.offset = static_cast<int>(mediaEvent.offset);
        tunerMedia.isSecureMemory = mediaEvent.isSecureMemory;
        tunerMedia.avDataId = static_cast<long>(mediaEvent.avDataId);
        tunerMedia.mpuSequenceNumber = static_cast<int>(mediaEvent.mpuSequenceNumber);
@@ -187,7 +241,6 @@ Return<void> TunerFilter::FilterCallback::onFilterStatus(DemuxFilterStatus statu
}

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

@@ -203,7 +256,8 @@ Return<void> TunerFilter::FilterCallback::onFilterEvent(const DemuxFilterEvent&
            }
        }
    }
    mTunerFilterCallback->onFilterEvent(&tunerEvent);

    mTunerFilterCallback->onFilterEvent(tunerEvent);
    return Void();
}

+6 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@

#include <aidl/android/media/tv/tuner/BnTunerFilter.h>
#include <aidl/android/media/tv/tuner/ITunerFilterCallback.h>
#include <aidlcommonsupport/NativeHandle.h>
#include <android/hardware/tv/tuner/1.1/IFilter.h>
#include <android/hardware/tv/tuner/1.0/ITuner.h>
#include <media/stagefright/foundation/ADebug.h>
@@ -29,6 +30,7 @@ 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::TunerFilterSharedHandleInfo;
using ::aidl::android::media::tv::tuner::TunerFilterSettings;
using ::android::hardware::Return;
using ::android::hardware::Void;
@@ -39,7 +41,6 @@ using ::android::hardware::tv::tuner::V1_0::DemuxFilterStatus;
using ::android::hardware::tv::tuner::V1_0::IFilter;
using ::android::hardware::tv::tuner::V1_0::IFilterCallback;


namespace android {

class TunerFilter : public BnTunerFilter {
@@ -50,9 +51,13 @@ public:
    Status getId(int32_t* _aidl_return) override;
    Status getId64Bit(int64_t* _aidl_return) override;
    Status configure(const TunerFilterConfiguration& config) override;
    Status getAvSharedHandleInfo(TunerFilterSharedHandleInfo* _aidl_return) override;
    Status releaseAvHandle(const ::aidl::android::hardware::common::NativeHandle& handle,
            int64_t avDataId) override;
    Status start() override;
    Status stop() override;
    Status flush() override;
    Status close() override;
    sp<IFilter> getHalFilter();

    struct FilterCallback : public IFilterCallback {
Loading