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

Commit 013fc384 authored by Amy Zhang's avatar Amy Zhang
Browse files

Add various filter events callbacks after filter starting in the Filter

default impl

Note: these events are only for testing purpose. This would make sure
that CTS could cover more of the Filter events codes.

Test: atest android.media.tv.tuner.cts
Bug: 181152149
Change-Id: I8b4318a384af75646b61060f849353602ecefc03
parent 33750d29
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -340,6 +340,10 @@ void* Demux::__threadLoopFrontend(void* user) {
}

void Demux::frontendInputThreadLoop() {
    if (!mFrontendInputThreadRunning) {
        return;
    }

    std::lock_guard<std::mutex> lock(mFrontendInputThreadLock);
    if (!mDvrPlayback) {
        ALOGW("[Demux] No software Frontend input configured. Ending Frontend thread loop.");
+201 −2
Original line number Diff line number Diff line
@@ -72,9 +72,8 @@ Filter::Filter(DemuxFilterType type, uint64_t filterId, uint32_t bufferSize,
    sp<V1_1::IFilterCallback> filterCallback_v1_1 = V1_1::IFilterCallback::castFrom(cb);
    if (filterCallback_v1_1 != NULL) {
        mCallback_1_1 = filterCallback_v1_1;
    } else {
        mCallback = cb;
    }
    mCallback = cb;
}

Filter::~Filter() {
@@ -141,6 +140,36 @@ Return<Result> Filter::configure(const DemuxFilterSettings& settings) {
Return<Result> Filter::start() {
    ALOGV("%s", __FUNCTION__);
    mFilterThreadRunning = true;
    // All the filter event callbacks in start are for testing purpose.
    switch (mType.mainType) {
        case DemuxFilterMainType::TS:
            mCallback->onFilterEvent(createMediaEvent());
            mCallback->onFilterEvent(createTsRecordEvent());
            mCallback_1_1->onFilterEvent_1_1(createTsRecordEvent(), createTsRecordEventExt());
            mCallback->onFilterEvent(createTemiEvent());
            break;
        case DemuxFilterMainType::MMTP:
            mCallback->onFilterEvent(createDownloadEvent());
            mCallback->onFilterEvent(createMmtpRecordEvent());
            mCallback_1_1->onFilterEvent_1_1(createMmtpRecordEvent(), createMmtpRecordEventExt());
            break;
        case DemuxFilterMainType::IP:
            mCallback->onFilterEvent(createSectionEvent());
            mCallback->onFilterEvent(createIpPayloadEvent());
            break;
        case DemuxFilterMainType::TLV: {
            DemuxFilterEvent emptyFilterEvent;
            mCallback_1_1->onFilterEvent_1_1(emptyFilterEvent, createMonitorEvent());
            break;
        }
        case DemuxFilterMainType::ALP: {
            DemuxFilterEvent emptyFilterEvent;
            mCallback_1_1->onFilterEvent_1_1(emptyFilterEvent, createRestartEvent());
            break;
        }
        default:
            break;
    }
    return startFilterLoop();
}

@@ -926,6 +955,176 @@ bool Filter::sameFile(int fd1, int fd2) {
    }
    return (stat1.st_dev == stat2.st_dev) && (stat1.st_ino == stat2.st_ino);
}

DemuxFilterEvent Filter::createMediaEvent() {
    DemuxFilterEvent event;
    event.events.resize(1);

    event.events[0].media({
            .streamId = 1,
            .isPtsPresent = true,
            .pts = 2,
            .dataLength = 3,
            .offset = 4,
            .isSecureMemory = true,
            .avDataId = 5,
            .mpuSequenceNumber = 6,
            .isPesPrivateData = true,
    });

    event.events[0].media().extraMetaData.audio({
            .adFade = 1,
            .adPan = 2,
            .versionTextTag = 3,
            .adGainCenter = 4,
            .adGainFront = 5,
            .adGainSurround = 6,
    });

    int av_fd = createAvIonFd(BUFFER_SIZE_16M);
    if (av_fd == -1) {
        return event;
    }

    native_handle_t* nativeHandle = createNativeHandle(av_fd);
    if (nativeHandle == NULL) {
        return event;
    }

    hidl_handle handle;
    handle.setTo(nativeHandle, /*shouldOwn=*/true);
    event.events[0].media().avMemory = std::move(handle);
    ::close(av_fd);

    return event;
}

DemuxFilterEvent Filter::createTsRecordEvent() {
    DemuxFilterEvent event;
    event.events.resize(1);

    DemuxPid pid;
    pid.tPid(1);
    DemuxFilterTsRecordEvent::ScIndexMask mask;
    mask.sc(1);
    event.events[0].tsRecord({
            .pid = pid,
            .tsIndexMask = 1,
            .scIndexMask = mask,
            .byteNumber = 2,
    });
    return event;
}

V1_1::DemuxFilterEventExt Filter::createTsRecordEventExt() {
    V1_1::DemuxFilterEventExt event;
    event.events.resize(1);

    event.events[0].tsRecord({
            .pts = 1,
            .firstMbInSlice = 2,  // random address
    });
    return event;
}

DemuxFilterEvent Filter::createMmtpRecordEvent() {
    DemuxFilterEvent event;
    event.events.resize(1);

    event.events[0].mmtpRecord({
            .scHevcIndexMask = 1,
            .byteNumber = 2,
    });
    return event;
}

V1_1::DemuxFilterEventExt Filter::createMmtpRecordEventExt() {
    V1_1::DemuxFilterEventExt event;
    event.events.resize(1);

    event.events[0].mmtpRecord({
            .pts = 1,
            .mpuSequenceNumber = 2,
            .firstMbInSlice = 3,
            .tsIndexMask = 4,
    });
    return event;
}

DemuxFilterEvent Filter::createSectionEvent() {
    DemuxFilterEvent event;
    event.events.resize(1);

    event.events[0].section({
            .tableId = 1,
            .version = 2,
            .sectionNum = 3,
            .dataLength = 0,
    });
    return event;
}

DemuxFilterEvent Filter::createPesEvent() {
    DemuxFilterEvent event;
    event.events.resize(1);

    event.events[0].pes({
            .streamId = static_cast<DemuxStreamId>(1),
            .dataLength = 1,
            .mpuSequenceNumber = 2,
    });
    return event;
}

DemuxFilterEvent Filter::createDownloadEvent() {
    DemuxFilterEvent event;
    event.events.resize(1);

    event.events[0].download({
            .itemId = 1,
            .mpuSequenceNumber = 2,
            .itemFragmentIndex = 3,
            .lastItemFragmentIndex = 4,
            .dataLength = 0,
    });
    return event;
}

DemuxFilterEvent Filter::createIpPayloadEvent() {
    DemuxFilterEvent event;
    event.events.resize(1);

    event.events[0].ipPayload({
            .dataLength = 0,
    });
    return event;
}

DemuxFilterEvent Filter::createTemiEvent() {
    DemuxFilterEvent event;
    event.events.resize(1);

    event.events[0].temi({.pts = 1, .descrTag = 2, .descrData = {3}});
    return event;
}

V1_1::DemuxFilterEventExt Filter::createMonitorEvent() {
    V1_1::DemuxFilterEventExt event;
    event.events.resize(1);

    V1_1::DemuxFilterMonitorEvent monitor;
    monitor.scramblingStatus(V1_1::ScramblingStatus::SCRAMBLED);
    event.events[0].monitorEvent(monitor);
    return event;
}

V1_1::DemuxFilterEventExt Filter::createRestartEvent() {
    V1_1::DemuxFilterEventExt event;
    event.events.resize(1);

    event.events[0].startId(1);
    return event;
}
}  // namespace implementation
}  // namespace V1_0
}  // namespace tuner
+12 −0
Original line number Diff line number Diff line
@@ -198,6 +198,18 @@ class Filter : public V1_1::IFilter {
    Result createShareMemMediaEvents(vector<uint8_t> output);
    bool sameFile(int fd1, int fd2);

    DemuxFilterEvent createMediaEvent();
    DemuxFilterEvent createTsRecordEvent();
    V1_1::DemuxFilterEventExt createTsRecordEventExt();
    DemuxFilterEvent createMmtpRecordEvent();
    V1_1::DemuxFilterEventExt createMmtpRecordEventExt();
    DemuxFilterEvent createSectionEvent();
    DemuxFilterEvent createPesEvent();
    DemuxFilterEvent createDownloadEvent();
    DemuxFilterEvent createIpPayloadEvent();
    DemuxFilterEvent createTemiEvent();
    V1_1::DemuxFilterEventExt createMonitorEvent();
    V1_1::DemuxFilterEventExt createRestartEvent();
    /**
     * Lock to protect writes to the FMQs
     */