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

Commit 5f5026c6 authored by Amy Zhang's avatar Amy Zhang Committed by Automerger Merge Worker
Browse files

Merge "Wait for all the thread loop to exit to finish the filter/dvr/frontend...

Merge "Wait for all the thread loop to exit to finish the filter/dvr/frontend close/stop API Call" into sc-dev am: 5cf45d5b

Original change: https://googleplex-android-review.googlesource.com/c/platform/hardware/interfaces/+/13619031

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: I3ef6b46e996255d2b49a2f8be4aa9990c00b6137
parents 6fe06b50 5cf45d5b
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -27,12 +27,16 @@ namespace V1_0 {
namespace implementation {

#define WAIT_TIMEOUT 3000000000

Demux::Demux(uint32_t demuxId, sp<Tuner> tuner) {
    mDemuxId = demuxId;
    mTunerService = tuner;
}

Demux::~Demux() {}
Demux::~Demux() {
    mFrontendInputThreadRunning = false;
    std::lock_guard<std::mutex> lock(mFrontendInputThreadLock);
}

Return<Result> Demux::setFrontendDataSource(uint32_t frontendId) {
    ALOGV("%s", __FUNCTION__);
@@ -171,6 +175,8 @@ Return<Result> Demux::close() {
    mFilters.clear();
    mLastUsedFilterId = -1;
    mTunerService->removeDemux(mDemuxId);
    mFrontendInputThreadRunning = false;
    std::lock_guard<std::mutex> lock(mFrontendInputThreadLock);

    return Result::SUCCESS;
}
@@ -322,6 +328,7 @@ uint16_t Demux::getFilterTpid(uint64_t filterId) {
}

void Demux::startFrontendInputLoop() {
    mFrontendInputThreadRunning = true;
    pthread_create(&mFrontendInputThread, NULL, __threadLoopFrontend, this);
    pthread_setname_np(mFrontendInputThread, "frontend_input_thread");
}
@@ -334,8 +341,6 @@ void* Demux::__threadLoopFrontend(void* user) {

void Demux::frontendInputThreadLoop() {
    std::lock_guard<std::mutex> lock(mFrontendInputThreadLock);
    mFrontendInputThreadRunning = true;

    if (!mDvrPlayback) {
        ALOGW("[Demux] No software Frontend input configured. Ending Frontend thread loop.");
        mFrontendInputThreadRunning = false;
+10 −3
Original line number Diff line number Diff line
@@ -37,7 +37,10 @@ Dvr::Dvr(DvrType type, uint32_t bufferSize, const sp<IDvrCallback>& cb, sp<Demux
    mDemux = demux;
}

Dvr::~Dvr() {}
Dvr::~Dvr() {
    mDvrThreadRunning = false;
    lock_guard<mutex> lock(mDvrThreadLock);
}

Return<void> Dvr::getQueueDesc(getQueueDesc_cb _hidl_cb) {
    ALOGV("%s", __FUNCTION__);
@@ -118,6 +121,9 @@ Return<Result> Dvr::detachFilter(const sp<V1_0::IFilter>& filter) {

Return<Result> Dvr::start() {
    ALOGV("%s", __FUNCTION__);
    if (mDvrThreadRunning) {
        return Result::SUCCESS;
    }

    if (!mCallback) {
        return Result::NOT_INITIALIZED;
@@ -128,6 +134,7 @@ Return<Result> Dvr::start() {
    }

    if (mType == DvrType::PLAYBACK) {
        mDvrThreadRunning = true;
        pthread_create(&mDvrThread, NULL, __threadLoopPlayback, this);
        pthread_setname_np(mDvrThread, "playback_waiting_loop");
    } else if (mType == DvrType::RECORD) {
@@ -144,7 +151,6 @@ Return<Result> Dvr::stop() {
    ALOGV("%s", __FUNCTION__);

    mDvrThreadRunning = false;

    lock_guard<mutex> lock(mDvrThreadLock);

    mIsRecordStarted = false;
@@ -164,6 +170,8 @@ Return<Result> Dvr::flush() {
Return<Result> Dvr::close() {
    ALOGV("%s", __FUNCTION__);

    mDvrThreadRunning = false;
    lock_guard<mutex> lock(mDvrThreadLock);
    return Result::SUCCESS;
}

@@ -199,7 +207,6 @@ void* Dvr::__threadLoopPlayback(void* user) {
void Dvr::playbackThreadLoop() {
    ALOGD("[Dvr] playback threadLoop start.");
    lock_guard<mutex> lock(mDvrThreadLock);
    mDvrThreadRunning = true;

    while (mDvrThreadRunning) {
        uint32_t efState = 0;
+16 −8
Original line number Diff line number Diff line
@@ -77,7 +77,10 @@ Filter::Filter(DemuxFilterType type, uint64_t filterId, uint32_t bufferSize,
    }
}

Filter::~Filter() {}
Filter::~Filter() {
    mFilterThreadRunning = false;
    std::lock_guard<std::mutex> lock(mFilterThreadLock);
}

Return<void> Filter::getId64Bit(getId64Bit_cb _hidl_cb) {
    ALOGV("%s", __FUNCTION__);
@@ -137,15 +140,14 @@ Return<Result> Filter::configure(const DemuxFilterSettings& settings) {

Return<Result> Filter::start() {
    ALOGV("%s", __FUNCTION__);

    mFilterThreadRunning = true;
    return startFilterLoop();
}

Return<Result> Filter::stop() {
    ALOGV("%s", __FUNCTION__);

    mFilterThreadRunning = false;

    std::lock_guard<std::mutex> lock(mFilterThreadLock);
    return Result::SUCCESS;
}

@@ -185,6 +187,8 @@ Return<Result> Filter::releaseAvHandle(const hidl_handle& avMemory, uint64_t avD
Return<Result> Filter::close() {
    ALOGV("%s", __FUNCTION__);

    mFilterThreadRunning = false;
    std::lock_guard<std::mutex> lock(mFilterThreadLock);
    return mDemux->removeFilter(mFilterId);
}

@@ -331,9 +335,11 @@ void* Filter::__threadLoopFilter(void* user) {
}

void Filter::filterThreadLoop() {
    ALOGD("[Filter] filter %" PRIu64 " threadLoop start.", mFilterId);
    if (!mFilterThreadRunning) {
        return;
    }
    std::lock_guard<std::mutex> lock(mFilterThreadLock);
    mFilterThreadRunning = true;
    ALOGD("[Filter] filter %" PRIu64 " threadLoop start.", mFilterId);

    // For the first time of filter output, implementation needs to send the filter
    // Event Callback without waiting for the DATA_CONSUMED to init the process.
@@ -382,6 +388,9 @@ void Filter::filterThreadLoop() {
        // We do not wait for the last round of written data to be read to finish the thread
        // because the VTS can verify the reading itself.
        for (int i = 0; i < SECTION_WRITE_COUNT; i++) {
            if (!mFilterThreadRunning) {
                break;
            }
            while (mFilterThreadRunning && mIsUsingFMQ) {
                status_t status = mFilterEventFlag->wait(
                        static_cast<uint32_t>(DemuxQueueNotifyBits::DATA_CONSUMED), &efState,
@@ -417,9 +426,8 @@ void Filter::filterThreadLoop() {
                break;
            }
        }
        mFilterThreadRunning = false;
        break;
    }

    ALOGD("[Filter] filter thread ended.");
}