From 93c02056b58f06949dc3ef606251a5365d2c6552 Mon Sep 17 00:00:00 2001 From: Fancy code <258828110.@qq.com> Date: Fri, 12 Jul 2024 23:50:37 +0800 Subject: [PATCH] Improve:Media handle frame. --- middleware/MediaManager/src/MediaHandle.cpp | 70 ++++++++++++++------- middleware/MediaManager/src/MediaHandle.h | 2 + 2 files changed, 49 insertions(+), 23 deletions(-) diff --git a/middleware/MediaManager/src/MediaHandle.cpp b/middleware/MediaManager/src/MediaHandle.cpp index 40b0fc6..ee77a78 100644 --- a/middleware/MediaManager/src/MediaHandle.cpp +++ b/middleware/MediaManager/src/MediaHandle.cpp @@ -134,27 +134,27 @@ void MediaHandle::TaskTimer(void) * @brief If the recording time is over, you need to stop the recording timer here. */ mTaskRuning = false; + mStreamHandle->StopHandleStream(); + std::vector files; + mStreamHandle->GetAllFiles(files); + mStreamHandle->UnInit(); + if (mCameraHal) { + mCameraHal->StopTask(); + ClearFrameList(); + } + // mMutex.lock(); + mStreamHandle.reset(); + mFirstFrameTimeStamp_us = MEDIA_TASK_NOT_START; + auto runingTask = mCurrentTask.lock(); + if (mCurrentTask.expired()) { + LogWarning("mCurrentTask is expired.\n"); + return; + } + LogInfo("Task finished response to application.\n"); + runingTask->Response(files); + mCurrentTask.reset(); + // mMutex.unlock(); } - mStreamHandle->StopHandleStream(); - std::vector files; - mStreamHandle->GetAllFiles(files); - mStreamHandle->UnInit(); - if (mCameraHal) { - mCameraHal->StopTask(); - ClearFrameList(); - } - mMutex.lock(); - mStreamHandle.reset(); - mFirstFrameTimeStamp_us = MEDIA_TASK_NOT_START; - auto runingTask = mCurrentTask.lock(); - if (mCurrentTask.expired()) { - LogWarning("mCurrentTask is expired.\n"); - return; - } - LogInfo("Task finished response to application.\n"); - runingTask->Response(files); - mCurrentTask.reset(); - mMutex.unlock(); } void MediaHandle::StartFrameHandle(void) { @@ -187,11 +187,17 @@ void MediaHandle::FrameHandle(void) } } } +/** + * @brief Processing audio and video streams may take a long time. This is not allowed to block the MediaHandle thread, + * which will cause it to be unable to add audio and video stream data. + */ void inline MediaHandle::HandleListFrame(void) { int leftFrameCount = -1; do { + mFrameMutex.lock(); OneFrameStream &frontFrame = mFrameList.front(); + mFrameMutex.unlock(); if (FrameType::VIDEO == frontFrame.mType) { mStreamHandle->GetVideoStream(frontFrame.mData, frontFrame.mLength, frontFrame.mTimeStamp_us); } @@ -200,7 +206,8 @@ void inline MediaHandle::HandleListFrame(void) } free(frontFrame.mData); frontFrame.mData = nullptr; - mFrameList.pop_front(); + // mFrameList.pop_front(); + DeleteFrame(frontFrame); leftFrameCount = mFrameList.size(); } while (leftFrameCount > 0); if (mStreamHandle->HandleFinished()) { @@ -222,7 +229,7 @@ void MediaHandle::GetAudioStreamCallback(const void *stream, const int &length, void MediaHandle::GetAVStream(const FrameType &type, const void *stream, const int &length, const unsigned long long &timeStamp_us) { - std::unique_lock lock(mMutex); + std::unique_lock lock(mFrameMutex); if (MEDIA_TASK_NOT_START == mFirstFrameTimeStamp_us) { mFirstFrameTimeStamp_us = timeStamp_us; } @@ -237,7 +244,7 @@ void MediaHandle::GetAVStream(const FrameType &type, const void *stream, const i } void MediaHandle::ClearFrameList(void) { - std::unique_lock lock(mMutex); + std::unique_lock lock(mFrameMutex); for (auto &frame : mFrameList) { if (frame.mData) { free(frame.mData); @@ -245,4 +252,21 @@ void MediaHandle::ClearFrameList(void) } } mFrameList.clear(); +} +void MediaHandle::DeleteFrame(const OneFrameStream &frame) +{ + constexpr bool REMOVE_THE_FRAME = true; + constexpr bool KEEP_THE_FRAME = false; + std::lock_guard locker(mFrameMutex); + auto searchMcuAsk = [frame](OneFrameStream &frameList) -> bool { + if (frame.mTimeStamp_us == frameList.mTimeStamp_us) { + if (frameList.mData) { + free(frameList.mData); + frameList.mData = nullptr; + } + return REMOVE_THE_FRAME; + } + return KEEP_THE_FRAME; + }; + mFrameList.remove_if(searchMcuAsk); } \ No newline at end of file diff --git a/middleware/MediaManager/src/MediaHandle.h b/middleware/MediaManager/src/MediaHandle.h index ee92210..55fc763 100644 --- a/middleware/MediaManager/src/MediaHandle.h +++ b/middleware/MediaManager/src/MediaHandle.h @@ -72,9 +72,11 @@ private: void GetAVStream(const FrameType &type, const void *stream, const int &length, const unsigned long long &timeStamp_us); void ClearFrameList(void); + void DeleteFrame(const OneFrameStream &frame); private: std::mutex mMutex; + std::mutex mFrameMutex; std::condition_variable mCvTaskHandle; std::condition_variable mCvFrameHandle; const MediaChannel &mMediaChannel;