Improve:Media handle frame.
This commit is contained in:
parent
59dd2bda6a
commit
93c02056b5
|
@ -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);
|
||||
}
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue
Block a user