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

Commit 07428dca authored by Amy Zhang's avatar Amy Zhang
Browse files

Complete TunerDemux and TunerTimeFilter aidl interface

Test: make
Bug: 159067322
Change-Id: I2f1580a781765691e1f5d7f28f47b9b5ccf54ff0
parent 95a6374c
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