Improve:Media handle frame.

This commit is contained in:
Fancy code 2024-07-12 23:50:37 +08:00
parent 59dd2bda6a
commit 93c02056b5
2 changed files with 49 additions and 23 deletions

View File

@ -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<MediaTaskResponse> 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<MediaTaskResponse> 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<std::mutex> lock(mMutex);
std::unique_lock<std::mutex> 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<std::mutex> lock(mMutex);
std::unique_lock<std::mutex> 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<std::mutex> 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);
}

View File

@ -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;