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

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

Complete TunerDescrambler aidl interface and implementation

Test: make
Bug: 159067322
Change-Id: I84322f8597080643ad5bbb829eb92f3dcd1493db
parent 7e20b993
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -56,6 +56,8 @@ public:
    Status disconnectCiCam() override;
    Status close() override;

    int getId() { return mDemuxId; }

private:
    sp<IDemux> mDemux;
    int mDemuxId;
+120 −0
Original line number Diff line number Diff line
/**
 * Copyright 2021, The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#define LOG_TAG "TunerDescrambler"

#include "TunerFilter.h"
#include "TunerDemux.h"
#include "TunerDescrambler.h"

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

using namespace std;

namespace android {

TunerDescrambler::TunerDescrambler(sp<IDescrambler> descrambler) {
    mDescrambler = descrambler;
}

TunerDescrambler::~TunerDescrambler() {
    mDescrambler = nullptr;
}

Status TunerDescrambler::setDemuxSource(const std::shared_ptr<ITunerDemux>& demux) {
    if (mDescrambler == nullptr) {
        ALOGE("IDescrambler is not initialized");
        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
    }

    Result res = mDescrambler->setDemuxSource(static_cast<TunerDemux*>(demux.get())->getId());
    if (res != Result::SUCCESS) {
        return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
    }
    return Status::ok();
}

Status TunerDescrambler::setKeyToken(const vector<uint8_t>& keyToken) {
    if (mDescrambler == nullptr) {
        ALOGE("IDescrambler is not initialized");
        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
    }

    Result res = mDescrambler->setKeyToken(keyToken);
    if (res != Result::SUCCESS) {
        return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
    }
    return Status::ok();
}

Status TunerDescrambler::addPid(const TunerDemuxPid& pid,
        const shared_ptr<ITunerFilter>& optionalSourceFilter) {
    if (mDescrambler == nullptr) {
        ALOGE("IDescrambler is not initialized");
        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
    }

    Result res = mDescrambler->addPid(getHidlDemuxPid(pid),
            static_cast<TunerFilter*>(optionalSourceFilter.get())->getHalFilter());
    if (res != Result::SUCCESS) {
        return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
    }
    return Status::ok();
}

Status TunerDescrambler::removePid(const TunerDemuxPid& pid,
        const shared_ptr<ITunerFilter>& optionalSourceFilter) {
    if (mDescrambler == nullptr) {
        ALOGE("IDescrambler is not initialized");
        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
    }

    Result res = mDescrambler->removePid(getHidlDemuxPid(pid),
            static_cast<TunerFilter*>(optionalSourceFilter.get())->getHalFilter());
    if (res != Result::SUCCESS) {
        return ::ndk::ScopedAStatus::fromServiceSpecificError(static_cast<int32_t>(res));
    }
    return Status::ok();
}

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

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

DemuxPid TunerDescrambler::getHidlDemuxPid(const TunerDemuxPid& pid) {
    DemuxPid hidlPid;
    switch (pid.getTag()) {
        case TunerDemuxPid::tPid: {
            hidlPid.tPid((uint16_t)pid.tPid);
            break;
        }
        case TunerDemuxPid::mmtpPid: {
            hidlPid.mmtpPid((uint16_t)pid.mmtpPid);
            break;
        }
    }
    return hidlPid;
}
}  // namespace android
+54 −0
Original line number Diff line number Diff line
/**
 * Copyright 2021, The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef ANDROID_MEDIA_TUNERDESCRAMBLER_H
#define ANDROID_MEDIA_TUNERDESCRAMBLER_H

#include <aidl/android/media/tv/tuner/BnTunerDescrambler.h>
#include <android/hardware/tv/tuner/1.0/ITuner.h>

using Status = ::ndk::ScopedAStatus;
using ::aidl::android::media::tv::tuner::BnTunerDescrambler;
using ::aidl::android::media::tv::tuner::ITunerDemux;
using ::aidl::android::media::tv::tuner::ITunerFilter;
using ::aidl::android::media::tv::tuner::TunerDemuxPid;
using ::android::hardware::tv::tuner::V1_0::DemuxPid;
using ::android::hardware::tv::tuner::V1_0::IDescrambler;

namespace android {

class TunerDescrambler : public BnTunerDescrambler {

public:
    TunerDescrambler(sp<IDescrambler> descrambler);
    virtual ~TunerDescrambler();
    Status setDemuxSource(const shared_ptr<ITunerDemux>& demux) override;
    Status setKeyToken(const vector<uint8_t>& keyToken) override;
    Status addPid(const TunerDemuxPid& pid,
            const shared_ptr<ITunerFilter>& optionalSourceFilter) override;
    Status removePid(const TunerDemuxPid& pid,
            const shared_ptr<ITunerFilter>& optionalSourceFilter) override;
    Status close() override;

private:
    DemuxPid getHidlDemuxPid(const TunerDemuxPid& pid);

    sp<IDescrambler> mDescrambler;
};

} // namespace android

#endif // ANDROID_MEDIA_TUNERDESCRAMBLER_H
+23 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@
#include "TunerFrontend.h"
#include "TunerLnb.h"
#include "TunerDemux.h"
#include "TunerDescrambler.h"

using ::aidl::android::media::tv::tuner::TunerFrontendAnalogCapabilities;
using ::aidl::android::media::tv::tuner::TunerFrontendAtsc3Capabilities;
@@ -273,6 +274,28 @@ Status TunerService::openLnbByName(const string& lnbName, shared_ptr<ITunerLnb>*
    return Status::ok();
}

Status TunerService::openDescrambler(int32_t /*descramblerHandle*/,
            std::shared_ptr<ITunerDescrambler>* _aidl_return) {
    if (!getITuner()) {
        ALOGD("get ITuner failed");
        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
    }

    Result status;
    sp<IDescrambler> descrambler;
    //int id = getResourceIdFromHandle(descramblerHandle, DESCRAMBLER);
    mTuner->openDescrambler([&](Result r, const sp<IDescrambler>& descramblerSp) {
        status = r;
        descrambler = descramblerSp;
    });
    if (status != Result::SUCCESS) {
        return Status::fromServiceSpecificError(static_cast<int32_t>(status));
    }

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

Status TunerService::updateTunerResources() {
    if (!getITuner()) {
        return Status::fromServiceSpecificError(static_cast<int32_t>(Result::UNAVAILABLE));
+16 −12
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ using ::aidl::android::hardware::common::fmq::MQDescriptor;
using ::aidl::android::hardware::common::fmq::SynchronizedReadWrite;
using ::aidl::android::media::tv::tuner::BnTunerService;
using ::aidl::android::media::tv::tuner::ITunerDemux;
using ::aidl::android::media::tv::tuner::ITunerDescrambler;
using ::aidl::android::media::tv::tuner::ITunerFrontend;
using ::aidl::android::media::tv::tuner::ITunerLnb;
using ::aidl::android::media::tv::tuner::TunerDemuxCapabilities;
@@ -55,6 +56,7 @@ using ::android::hardware::tv::tuner::V1_0::DemuxTsFilterType;
using ::android::hardware::tv::tuner::V1_0::FrontendId;
using ::android::hardware::tv::tuner::V1_0::FrontendInfo;
using ::android::hardware::tv::tuner::V1_0::IDemux;
using ::android::hardware::tv::tuner::V1_0::IDescrambler;
using ::android::hardware::tv::tuner::V1_0::IFilter;
using ::android::hardware::tv::tuner::V1_0::IFilterCallback;
using ::android::hardware::tv::tuner::V1_0::ITuner;
@@ -94,6 +96,20 @@ public:
    TunerService();
    virtual ~TunerService();

    Status getFrontendIds(vector<int32_t>* ids) override;
    Status getFrontendInfo(int32_t id, TunerFrontendInfo* _aidl_return) override;
    Status openFrontend(
            int32_t frontendHandle, shared_ptr<ITunerFrontend>* _aidl_return) override;
    Status getFmqSyncReadWrite(
            MQDescriptor<int8_t, SynchronizedReadWrite>* mqDesc, bool* _aidl_return) override;
    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 openDescrambler(int32_t descramblerHandle,
            std::shared_ptr<ITunerDescrambler>* _aidl_return) override;
    Status updateTunerResources() override;

    // TODO: create a map between resource id and handles.
    static int getResourceIdFromHandle(int resourceHandle, int /*type*/) {
        return (resourceHandle & 0x00ff0000) >> 16;
@@ -106,18 +122,6 @@ public:
                | (mResourceRequestCount++ & 0xffff);
    }

    Status getFrontendIds(vector<int32_t>* ids) override;
    Status getFrontendInfo(int32_t frontendHandle, TunerFrontendInfo* _aidl_return) override;
    Status openFrontend(
            int32_t frontendHandle, shared_ptr<ITunerFrontend>* _aidl_return) override;
    Status getFmqSyncReadWrite(
            MQDescriptor<int8_t, SynchronizedReadWrite>* mqDesc, bool* _aidl_return) override;
    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:
    bool getITuner();
    Result configFilter();
Loading