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

Commit 97e6eae2 authored by Amy Zhang's avatar Amy Zhang Committed by Android (Google) Code Review
Browse files

Merge "Complete TunerDemux and TunerTimeFilter aidl interface" into sc-dev

parents 37e46f6c 07428dca
Loading
Loading
Loading
Loading
+90 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@

#include "TunerDvr.h"
#include "TunerDemux.h"
#include "TunerTimeFilter.h"

using ::android::hardware::tv::tuner::V1_0::DemuxAlpFilterType;
using ::android::hardware::tv::tuner::V1_0::DemuxFilterMainType;
@@ -101,6 +102,69 @@ Status TunerDemux::openFilter(
    return Status::ok();
}

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

    Result status;
    sp<ITimeFilter> filterSp;
    mDemux->openTimeFilter([&](Result r, const sp<ITimeFilter>& filter) {
        filterSp = filter;
        status = r;
    });
    if (status != Result::SUCCESS) {
        return Status::fromServiceSpecificError(static_cast<int32_t>(status));
    }

    *_aidl_return = ::ndk::SharedRefBase::make<TunerTimeFilter>(filterSp);
    return Status::ok();
}

Status TunerDemux::getAvSyncHwId(const shared_ptr<ITunerFilter>& tunerFilter, int* _aidl_return) {
    if (mDemux == nullptr) {
        ALOGE("IDemux is not initialized.");
        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
    }

    uint32_t avSyncHwId;
    Result res;
    sp<IFilter> halFilter = static_cast<TunerFilter*>(tunerFilter.get())->getHalFilter();
    mDemux->getAvSyncHwId(halFilter,
            [&](Result r, uint32_t id) {
                res = r;
                avSyncHwId = id;
            });
    if (res != Result::SUCCESS) {
        return Status::fromServiceSpecificError(static_cast<int32_t>(res));
    }

    *_aidl_return = (int)avSyncHwId;
    return Status::ok();
}

Status TunerDemux::getAvSyncTime(int avSyncHwId, int64_t* _aidl_return) {
    if (mDemux == nullptr) {
        ALOGE("IDemux is not initialized.");
        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
    }

    uint64_t time;
    Result res;
    mDemux->getAvSyncTime(static_cast<uint32_t>(avSyncHwId),
            [&](Result r, uint64_t ts) {
                res = r;
                time = ts;
            });
    if (res != Result::SUCCESS) {
        return Status::fromServiceSpecificError(static_cast<int32_t>(res));
    }

    *_aidl_return = (int64_t)time;
    return Status::ok();
}

Status TunerDemux::openDvr(int dvrType, int bufferSize, const shared_ptr<ITunerDvrCallback>& cb,
        shared_ptr<ITunerDvr>* _aidl_return) {
    if (mDemux == nullptr) {
@@ -125,6 +189,32 @@ Status TunerDemux::openDvr(int dvrType, int bufferSize, const shared_ptr<ITunerD
    return Status::ok();
}

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

    Result res = mDemux->connectCiCam(static_cast<uint32_t>(ciCamId));
    if (res != Result::SUCCESS) {
        return Status::fromServiceSpecificError(static_cast<int32_t>(res));
    }
    return Status::ok();
}

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

    Result res = mDemux->disconnectCiCam();
    if (res != Result::SUCCESS) {
        return Status::fromServiceSpecificError(static_cast<int32_t>(res));
    }
    return Status::ok();
}

Status TunerDemux::close() {
    if (mDemux == nullptr) {
        ALOGE("IDemux is not initialized.");
+8 −1
Original line number Diff line number Diff line
@@ -27,9 +27,11 @@ using ::aidl::android::media::tv::tuner::ITunerDvrCallback;
using ::aidl::android::media::tv::tuner::ITunerFilter;
using ::aidl::android::media::tv::tuner::ITunerFilterCallback;
using ::aidl::android::media::tv::tuner::ITunerFrontend;
using ::aidl::android::media::tv::tuner::ITunerTimeFilter;
using ::android::hardware::tv::tuner::V1_0::IDemux;
using ::android::hardware::tv::tuner::V1_0::IDvr;
using ::android::hardware::tv::tuner::V1_0::IDvrCallback;
using ::android::hardware::tv::tuner::V1_0::ITimeFilter;

using namespace std;

@@ -43,10 +45,15 @@ public:
    Status setFrontendDataSource(const shared_ptr<ITunerFrontend>& frontend) override;
    Status openFilter(
        int mainType, int subtype, int bufferSize, const shared_ptr<ITunerFilterCallback>& cb,
        shared_ptr<ITunerFilter>* _aidl_return);
        shared_ptr<ITunerFilter>* _aidl_return) override;
    Status openTimeFilter(shared_ptr<ITunerTimeFilter>* _aidl_return) override;
    Status getAvSyncHwId(const shared_ptr<ITunerFilter>& tunerFilter, int* _aidl_return) override;
    Status getAvSyncTime(int avSyncHwId, int64_t* _aidl_return) override;
    Status openDvr(
        int dvbType, int bufferSize, const shared_ptr<ITunerDvrCallback>& cb,
        shared_ptr<ITunerDvr>* _aidl_return) override;
    Status connectCiCam(int ciCamId) override;
    Status disconnectCiCam() override;
    Status close() override;

private:
+41 −1
Original line number Diff line number Diff line
@@ -92,7 +92,27 @@ Status TunerService::openDemux(
        return Status::ok();
    }

    ALOGD("open demux failed, res = %d", res);
    ALOGW("open demux failed, res = %d", res);
    return Status::fromServiceSpecificError(static_cast<int32_t>(res));
}

Status TunerService::getDemuxCaps(TunerDemuxCapabilities* _aidl_return) {
    ALOGD("getDemuxCaps");
    if (!getITuner()) {
        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::NOT_INITIALIZED));
    }
    Result res;
    DemuxCapabilities caps;
    mTuner->getDemuxCaps([&](Result r, const DemuxCapabilities& demuxCaps) {
        caps = demuxCaps;
        res = r;
    });
    if (res == Result::SUCCESS) {
        *_aidl_return = getAidlDemuxCaps(caps);
        return Status::ok();
    }

    ALOGW("Get demux caps failed, res = %d", res);
    return Status::fromServiceSpecificError(static_cast<int32_t>(res));
}

@@ -343,6 +363,26 @@ Result TunerService::getHidlFrontendInfo(int id, FrontendInfo& info) {
    return res;
}

TunerDemuxCapabilities TunerService::getAidlDemuxCaps(DemuxCapabilities caps) {
    TunerDemuxCapabilities aidlCaps{
        .numDemux = (int)caps.numDemux,
        .numRecord = (int)caps.numRecord,
        .numPlayback = (int)caps.numPlayback,
        .numTsFilter = (int)caps.numTsFilter,
        .numSectionFilter = (int)caps.numSectionFilter,
        .numAudioFilter = (int)caps.numAudioFilter,
        .numVideoFilter = (int)caps.numVideoFilter,
        .numPesFilter = (int)caps.numPesFilter,
        .numPcrFilter = (int)caps.numPcrFilter,
        .numBytesInSectionFilter = (int)caps.numBytesInSectionFilter,
        .filterCaps = (int)caps.filterCaps,
        .bTimeFilter = caps.bTimeFilter,
    };
    aidlCaps.linkCaps.resize(caps.linkCaps.size());
    copy(caps.linkCaps.begin(), caps.linkCaps.end(), aidlCaps.linkCaps.begin());
    return aidlCaps;
}

TunerFrontendInfo TunerService::convertToAidlFrontendInfo(FrontendInfo halInfo) {
    TunerFrontendInfo info{
        .type = (int)halInfo.type,
+4 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ using ::aidl::android::media::tv::tuner::BnTunerService;
using ::aidl::android::media::tv::tuner::ITunerDemux;
using ::aidl::android::media::tv::tuner::ITunerFrontend;
using ::aidl::android::media::tv::tuner::ITunerLnb;
using ::aidl::android::media::tv::tuner::TunerDemuxCapabilities;
using ::aidl::android::media::tv::tuner::TunerFrontendInfo;
using ::aidl::android::media::tv::tunerresourcemanager::ITunerResourceManager;

@@ -42,6 +43,7 @@ using ::android::hardware::MessageQueue;
using ::android::hardware::MQDescriptorSync;
using ::android::hardware::Return;
using ::android::hardware::Void;
using ::android::hardware::tv::tuner::V1_0::DemuxCapabilities;
using ::android::hardware::tv::tuner::V1_0::DemuxFilterAvSettings;
using ::android::hardware::tv::tuner::V1_0::DemuxFilterEvent;
using ::android::hardware::tv::tuner::V1_0::DemuxFilterMainType;
@@ -113,6 +115,7 @@ public:
    Status openLnb(int lnbHandle, shared_ptr<ITunerLnb>* _aidl_return) override;
    Status openLnbByName(const string& lnbName, shared_ptr<ITunerLnb>* _aidl_return) override;
    Status openDemux(int32_t demuxHandle, std::shared_ptr<ITunerDemux>* _aidl_return) override;
    Status getDemuxCaps(TunerDemuxCapabilities* _aidl_return) override;
    Status updateTunerResources() override;

private:
@@ -125,6 +128,7 @@ private:
    Result getHidlFrontendInfo(int id, FrontendInfo& info);
    vector<int> getLnbHandles();

    TunerDemuxCapabilities getAidlDemuxCaps(DemuxCapabilities caps);
    TunerFrontendInfo convertToAidlFrontendInfo(FrontendInfo halInfo);

    sp<ITuner> mTuner;
+26 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.media.tv.tuner.ITunerDvrCallback;
import android.media.tv.tuner.ITunerFilter;
import android.media.tv.tuner.ITunerFilterCallback;
import android.media.tv.tuner.ITunerFrontend;
import android.media.tv.tuner.ITunerTimeFilter;

/**
 * Tuner Demux interface handles tuner related operations.
@@ -40,11 +41,36 @@ interface ITunerDemux {
    ITunerFilter openFilter(
        in int mainType, in int subtype, in int bufferSize, in ITunerFilterCallback cb);

    /**
     * Open time filter of the demux.
     */
    ITunerTimeFilter openTimeFilter();

    /**
     * Get hardware sync ID for audio and video.
     */
    int getAvSyncHwId(ITunerFilter tunerFilter);

    /**
     * Get current time stamp to use for A/V sync.
     */
    long getAvSyncTime(in int avSyncHwId);

    /**
     * Open a DVR (Digital Video Record) instance in the demux.
     */
    ITunerDvr openDvr(in int dvbType, in int bufferSize, in ITunerDvrCallback cb);

    /**
     * Connect Conditional Access Modules (CAM) through Common Interface (CI).
     */
    void connectCiCam(in int ciCamId);

    /**
     * Disconnect Conditional Access Modules (CAM).
     */
    void disconnectCiCam();

    /**
     * Releases the ITunerDemux instance.
     */
Loading