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

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

Merge "Add various filter events callbacks after filter starting in the Filter...

Merge "Add various filter events callbacks after filter starting in the Filter default impl" into sc-dev
parents 5f985651 013fc384
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
     */