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

Commit 7e55ac00 authored by Amy Zhang's avatar Amy Zhang
Browse files

Connect TunerFilter with FilterClient

Test: make
Bug: 174095851
Change-Id: If57bda43eea7e4404692943510a33ab4e66bf2e6
parent 852ca25a
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -3786,7 +3786,7 @@ static jint android_media_tv_Tuner_read_filter_fmq(
        jniThrowRuntimeException(env, "Failed to GetByteArrayElements");
        return -1;
    }
    int realReadSize = filterClient->read(reinterpret_cast<uint8_t*>(dst) + offset, size);
    int realReadSize = filterClient->read(reinterpret_cast<int8_t*>(dst) + offset, size);
    env->ReleaseByteArrayElements(buffer, dst, 0);
    return (jint) realReadSize;
}
+61 −31
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@

#include <aidlcommonsupport/NativeHandle.h>
#include <android-base/logging.h>
#include <fmq/ConvertMQDescriptors.h>
#include <utils/Log.h>

#include "FilterClient.h"
@@ -68,10 +69,7 @@ void FilterClient::setHidlFilter(sp<IFilter> filter) {
    mFilter_1_1 = ::android::hardware::tv::tuner::V1_1::IFilter::castFrom(mFilter);
}

int FilterClient::read(uint8_t* buffer, int size) {
    // TODO: pending aidl interface

    if (mFilter != NULL) {
int FilterClient::read(int8_t* buffer, int size) {
    Result res = getFilterMq();
    if (res != Result::SUCCESS) {
        return -1;
@@ -79,9 +77,6 @@ int FilterClient::read(uint8_t* buffer, int size) {
    return copyData(buffer, size);
}

    return -1;
}

SharedHandleInfo FilterClient::getAvSharedHandleInfo() {
    handleAvShareMemory();
    SharedHandleInfo info{
@@ -106,7 +101,10 @@ Result FilterClient::configure(DemuxFilterSettings configure) {
}

Result FilterClient::configureMonitorEvent(int monitorEventType) {
    // TODO: pending aidl interface
    if (mTunerFilter != NULL) {
        Status s = mTunerFilter->configureMonitorEvent(monitorEventType);
        return ClientHelper::getServiceSpecificErrorCode(s);
    }

    if (mFilter_1_1 != NULL) {
        return mFilter_1_1->configureMonitorEvent(monitorEventType);
@@ -116,7 +114,10 @@ Result FilterClient::configureMonitorEvent(int monitorEventType) {
}

Result FilterClient::configureIpFilterContextId(int cid) {
    // TODO: pending aidl interface
    if (mTunerFilter != NULL) {
        Status s = mTunerFilter->configureIpFilterContextId(cid);
        return ClientHelper::getServiceSpecificErrorCode(s);
    }

    if (mFilter_1_1 != NULL) {
        return mFilter_1_1->configureIpCid(cid);
@@ -126,7 +127,19 @@ Result FilterClient::configureIpFilterContextId(int cid) {
}

Result FilterClient::configureAvStreamType(AvStreamType avStreamType) {
    // TODO: pending aidl interface
    if (mTunerFilter != NULL) {
        int type;
        switch (avStreamType.getDiscriminator()) {
            case AvStreamType::hidl_discriminator::audio:
                type = (int)avStreamType.audio();
                break;
            case AvStreamType::hidl_discriminator::video:
                type = (int)avStreamType.video();
                break;
        }
        Status s = mTunerFilter->configureAvStreamType(type);
        return ClientHelper::getServiceSpecificErrorCode(s);
    }

    if (mFilter_1_1 != NULL) {
        return mFilter_1_1->configureAvStreamType(avStreamType);
@@ -228,7 +241,10 @@ Result FilterClient::releaseAvHandle(native_handle_t* handle, uint64_t avDataId)
}

Result FilterClient::setDataSource(sp<FilterClient> filterClient){
    // TODO: pending aidl interface
    if (mTunerFilter != NULL) {
        Status s = mTunerFilter->setDataSource(filterClient->getAidlFilter());
        return ClientHelper::getServiceSpecificErrorCode(s);
    }

    if (mFilter != NULL) {
        sp<IFilter> sourceFilter = filterClient->getHalFilter();
@@ -891,29 +907,43 @@ void TunerFilterCallback::getHidlRestartEvent(const vector<TunerFilterEvent>& fi
}

Result FilterClient::getFilterMq() {
    if (mFilter == NULL) {
        return Result::INVALID_STATE;
    }

    if (mFilterMQ != NULL) {
        return Result::SUCCESS;
    }

    Result getQueueDescResult = Result::UNKNOWN_ERROR;
    AidlMQDesc aidlMqDesc;
    Result res = Result::UNAVAILABLE;

    if (mTunerFilter != NULL) {
        Status s = mTunerFilter->getQueueDesc(&aidlMqDesc);
        res = ClientHelper::getServiceSpecificErrorCode(s);
        if (res == Result::SUCCESS) {
            mFilterMQ = new (nothrow) AidlMQ(aidlMqDesc);
            EventFlag::createEventFlag(mFilterMQ->getEventFlagWord(), &mFilterMQEventFlag);
        }
        return res;
    }

    if (mFilter != NULL) {
        MQDescriptorSync<uint8_t> filterMQDesc;
        mFilter->getQueueDesc(
                [&](Result r, const MQDescriptorSync<uint8_t>& desc) {
                    filterMQDesc = desc;
                getQueueDescResult = r;
                    res = r;
                });
    if (getQueueDescResult == Result::SUCCESS) {
        mFilterMQ = std::make_unique<MQ>(filterMQDesc, true);
        if (res == Result::SUCCESS) {
            AidlMQDesc aidlMQDesc;
            unsafeHidlToAidlMQDescriptor<uint8_t, int8_t, SynchronizedReadWrite>(
                    filterMQDesc,  &aidlMQDesc);
            mFilterMQ = new (nothrow) AidlMessageQueue(aidlMQDesc);
            EventFlag::createEventFlag(mFilterMQ->getEventFlagWord(), &mFilterMQEventFlag);
        }
    return getQueueDescResult;
    }

int FilterClient::copyData(uint8_t* buffer, int size) {
    return res;
}

int FilterClient::copyData(int8_t* buffer, int size) {
    if (mFilter == NULL || mFilterMQ == NULL || mFilterMQEventFlag == NULL) {
        return -1;
    }
+10 −5
Original line number Diff line number Diff line
@@ -25,12 +25,14 @@
#include <android/hardware/tv/tuner/1.1/IFilter.h>
#include <android/hardware/tv/tuner/1.1/IFilterCallback.h>
#include <android/hardware/tv/tuner/1.1/types.h>
#include <fmq/AidlMessageQueue.h>
#include <fmq/MessageQueue.h>

#include "ClientHelper.h"
#include "FilterClientCallback.h"

using Status = ::ndk::ScopedAStatus;
using ::aidl::android::hardware::common::fmq::SynchronizedReadWrite;
using ::aidl::android::media::tv::tuner::BnTunerFilterCallback;
using ::aidl::android::media::tv::tuner::ITunerFilter;
using ::aidl::android::media::tv::tuner::TunerDemuxIpAddress;
@@ -69,10 +71,13 @@ using ::android::hardware::tv::tuner::V1_1::IFilterCallback;

using namespace std;

using MQ = MessageQueue<uint8_t, kSynchronizedReadWrite>;

namespace android {

using MQ = MessageQueue<uint8_t, kSynchronizedReadWrite>;
using MQDesc = MQDescriptorSync<uint8_t>;
using AidlMQ = AidlMessageQueue<int8_t, SynchronizedReadWrite>;
using AidlMQDesc = MQDescriptor<int8_t, SynchronizedReadWrite>;

struct SharedHandleInfo {
    native_handle_t* sharedHandle;
    uint64_t size;
@@ -139,7 +144,7 @@ public:
     *
     * @return the actual reading size. -1 if failed to read.
     */
    int read(uint8_t* buffer, int size);
    int read(int8_t* buffer, int size);

    /**
     * Get the a/v shared memory handle information
@@ -234,7 +239,7 @@ private:
    void getAidlIpAddress(DemuxIpAddress ipAddr,
            TunerDemuxIpAddress& srcIpAddress, TunerDemuxIpAddress& dstIpAddress);
    Result getFilterMq();
    int copyData(uint8_t* buffer, int size);
    int copyData(int8_t* buffer, int size);
    void checkIsMediaFilter(DemuxFilterType type);
    void handleAvShareMemory();
    void closeAvSharedMemory();
@@ -259,7 +264,7 @@ private:
     */
    sp<::android::hardware::tv::tuner::V1_1::IFilter> mFilter_1_1;

    unique_ptr<MQ> mFilterMQ;
    AidlMQ* mFilterMQ;
    EventFlag* mFilterMQEventFlag;

    sp<FilterClientCallback> mCallback;