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.
|
* @brief If the recording time is over, you need to stop the recording timer here.
|
||||||
*/
|
*/
|
||||||
mTaskRuning = false;
|
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)
|
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)
|
void inline MediaHandle::HandleListFrame(void)
|
||||||
{
|
{
|
||||||
int leftFrameCount = -1;
|
int leftFrameCount = -1;
|
||||||
do {
|
do {
|
||||||
|
mFrameMutex.lock();
|
||||||
OneFrameStream &frontFrame = mFrameList.front();
|
OneFrameStream &frontFrame = mFrameList.front();
|
||||||
|
mFrameMutex.unlock();
|
||||||
if (FrameType::VIDEO == frontFrame.mType) {
|
if (FrameType::VIDEO == frontFrame.mType) {
|
||||||
mStreamHandle->GetVideoStream(frontFrame.mData, frontFrame.mLength, frontFrame.mTimeStamp_us);
|
mStreamHandle->GetVideoStream(frontFrame.mData, frontFrame.mLength, frontFrame.mTimeStamp_us);
|
||||||
}
|
}
|
||||||
|
@ -200,7 +206,8 @@ void inline MediaHandle::HandleListFrame(void)
|
||||||
}
|
}
|
||||||
free(frontFrame.mData);
|
free(frontFrame.mData);
|
||||||
frontFrame.mData = nullptr;
|
frontFrame.mData = nullptr;
|
||||||
mFrameList.pop_front();
|
// mFrameList.pop_front();
|
||||||
|
DeleteFrame(frontFrame);
|
||||||
leftFrameCount = mFrameList.size();
|
leftFrameCount = mFrameList.size();
|
||||||
} while (leftFrameCount > 0);
|
} while (leftFrameCount > 0);
|
||||||
if (mStreamHandle->HandleFinished()) {
|
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,
|
void MediaHandle::GetAVStream(const FrameType &type, const void *stream, const int &length,
|
||||||
const unsigned long long &timeStamp_us)
|
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) {
|
if (MEDIA_TASK_NOT_START == mFirstFrameTimeStamp_us) {
|
||||||
mFirstFrameTimeStamp_us = timeStamp_us;
|
mFirstFrameTimeStamp_us = timeStamp_us;
|
||||||
}
|
}
|
||||||
|
@ -237,7 +244,7 @@ void MediaHandle::GetAVStream(const FrameType &type, const void *stream, const i
|
||||||
}
|
}
|
||||||
void MediaHandle::ClearFrameList(void)
|
void MediaHandle::ClearFrameList(void)
|
||||||
{
|
{
|
||||||
std::unique_lock<std::mutex> lock(mMutex);
|
std::unique_lock<std::mutex> lock(mFrameMutex);
|
||||||
for (auto &frame : mFrameList) {
|
for (auto &frame : mFrameList) {
|
||||||
if (frame.mData) {
|
if (frame.mData) {
|
||||||
free(frame.mData);
|
free(frame.mData);
|
||||||
|
@ -245,4 +252,21 @@ void MediaHandle::ClearFrameList(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mFrameList.clear();
|
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,
|
void GetAVStream(const FrameType &type, const void *stream, const int &length,
|
||||||
const unsigned long long &timeStamp_us);
|
const unsigned long long &timeStamp_us);
|
||||||
void ClearFrameList(void);
|
void ClearFrameList(void);
|
||||||
|
void DeleteFrame(const OneFrameStream &frame);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::mutex mMutex;
|
std::mutex mMutex;
|
||||||
|
std::mutex mFrameMutex;
|
||||||
std::condition_variable mCvTaskHandle;
|
std::condition_variable mCvTaskHandle;
|
||||||
std::condition_variable mCvFrameHandle;
|
std::condition_variable mCvFrameHandle;
|
||||||
const MediaChannel &mMediaChannel;
|
const MediaChannel &mMediaChannel;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user