From 9ccc38c9e7af1c5d0dbd9aa29d499d9718000d0a Mon Sep 17 00:00:00 2001 From: Fancy code <258828110.@qq.com> Date: Sat, 13 Jul 2024 15:05:38 +0800 Subject: [PATCH] Improve:MediaBase module. --- .../MissionManager/src/MediaHandleState.cpp | 8 +++++++- .../MediaManager/include/IMediaManager.h | 3 ++- middleware/MediaManager/src/IMediaManager.cpp | 3 ++- middleware/MediaManager/src/RecordMp4.cpp | 18 +++++++++++++----- utils/MediaBase/include/MediaBase.h | 8 +++++--- utils/MediaBase/src/FfmpegMuxStreamV2.cpp | 8 ++++++++ utils/MediaBase/src/FfmpegMuxStreamV2.h | 1 + utils/MediaBase/src/IMediaBase.cpp | 6 ++++++ utils/MediaBase/src/IMediaBase.h | 1 + utils/MediaBase/src/MediaBase.cpp | 8 ++++++++ 10 files changed, 53 insertions(+), 11 deletions(-) diff --git a/application/MissionManager/src/MediaHandleState.cpp b/application/MissionManager/src/MediaHandleState.cpp index 947fb29..3feb577 100644 --- a/application/MissionManager/src/MediaHandleState.cpp +++ b/application/MissionManager/src/MediaHandleState.cpp @@ -66,7 +66,13 @@ bool MediaHandleState::MediaTaskFinishedHandle(VStateMachineData *msg) LogInfo("response files = %d.\n", data->mData.mResponse.size()); std::vector files; for (auto &response : data->mData.mResponse) { - SyncFileInfo file(data->mData.mSerialNumber, response.mFileName, 0, 0, 0, FileCreateType::END, FileStatus::END); + SyncFileInfo file(data->mData.mSerialNumber, + response.mFileName, + 0, + response.mDuration_ms, + 0, + FileCreateType::MANUAL_TEST, + FileStatus::FINISHED_RECORD); files.push_back(file); } IFilesManager::GetInstance()->SaveFiles(files); diff --git a/middleware/MediaManager/include/IMediaManager.h b/middleware/MediaManager/include/IMediaManager.h index fb39bcb..46f5da7 100644 --- a/middleware/MediaManager/include/IMediaManager.h +++ b/middleware/MediaManager/include/IMediaManager.h @@ -47,8 +47,9 @@ typedef struct media_report_event } MediaReportEvent; typedef struct media_task_response { - media_task_response(const std::string &fileName); + media_task_response(const std::string &fileName, const unsigned int &duration_ms); const std::string mFileName; + const unsigned int mDuration_ms; } MediaTaskResponse; class VMediaTask { diff --git a/middleware/MediaManager/src/IMediaManager.cpp b/middleware/MediaManager/src/IMediaManager.cpp index 62fcd00..ac873da 100644 --- a/middleware/MediaManager/src/IMediaManager.cpp +++ b/middleware/MediaManager/src/IMediaManager.cpp @@ -22,7 +22,8 @@ media_report_event::media_report_event(const std::string &fileName, const MediaC : mFileName(fileName), mMediaChannedl(mediaChannedl) { } -media_task_response::media_task_response(const std::string &fileName) : mFileName(fileName) +media_task_response::media_task_response(const std::string &fileName, const unsigned int &duration_ms) + : mFileName(fileName), mDuration_ms(duration_ms) { } const MediaTaskType VMediaTask::GetTaskType(void) diff --git a/middleware/MediaManager/src/RecordMp4.cpp b/middleware/MediaManager/src/RecordMp4.cpp index 102fa18..ae775ca 100644 --- a/middleware/MediaManager/src/RecordMp4.cpp +++ b/middleware/MediaManager/src/RecordMp4.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -37,8 +38,14 @@ StatusCode RecordMp4::Init(void) return CreateStatusCode(STATUS_CODE_NOT_OK); } std::string videoPath = mRecordTask->GetTargetNameForSaving(); - OutputFileInfo fileInfo = { - .mFileName = videoPath.c_str(), .mDuration_ms = 5000, .mFinished = &mIsRecordingFinished}; + OutputFileInfo fileInfo = {.mDuration_ms = 5000, .mFinished = &mIsRecordingFinished}; + if (OUTPUT_FILE_NAME_MAX >= videoPath.size()) { + memcpy(fileInfo.mFileName, videoPath.c_str(), videoPath.size()); + } + else { + LogError("VideoPath is too long.\n"); + return CreateStatusCode(STATUS_CODE_NOT_OK); + } StatusCode code = IOpenOutputFile(mRecordMp4Object, &fileInfo); if (!IsCodeOK(code)) { LogError("OpenOutputFile failed.\n"); @@ -57,13 +64,14 @@ void RecordMp4::StopHandleStream(void) { std::lock_guard locker(mMutex); if (mRecordMp4Object) { + OutputFileInfo finalFile = IGetOutputFileInfo(mRecordMp4Object); + MediaTaskResponse response(finalFile.mFileName, finalFile.mDuration_ms); + mTaskResponse.push_back(response); ICloseOutputFile(mRecordMp4Object); IMediaBaseFree(mRecordMp4Object); mRecordMp4Object = nullptr; } - std::string videoPath = mRecordTask->GetTargetNameForSaving(); - MediaTaskResponse response(videoPath.c_str()); - mTaskResponse.push_back(response); + // std::string videoPath = mRecordTask->GetTargetNameForSaving(); } void RecordMp4::GetVideoStream(const void *stream, const unsigned int &length, const unsigned long long &timeStamp) { diff --git a/utils/MediaBase/include/MediaBase.h b/utils/MediaBase/include/MediaBase.h index b6f892e..56ab693 100644 --- a/utils/MediaBase/include/MediaBase.h +++ b/utils/MediaBase/include/MediaBase.h @@ -48,11 +48,12 @@ enum OutputFileStatus OUTPUT_FILE_STATUS_FINISHED, OUTPUT_FILE_STATUS_END }; +#define OUTPUT_FILE_NAME_MAX 256 typedef struct output_file_info { - const char *mFileName; ///< Name of the output file. Must be an absolute path. - const unsigned int mDuration_ms; ///< Duration of the output file in milliseconds. - int *const mFinished; ///< Whether the output file is finished. See OutputFileStatus. + char mFileName[OUTPUT_FILE_NAME_MAX]; ///< Name of the output file. Must be an absolute path. + const unsigned int mDuration_ms; ///< Duration of the output file in milliseconds. + int *const mFinished; ///< Whether the output file is finished. See OutputFileStatus. } OutputFileInfo; typedef void (*ReadVideoFileCallback)(const void *, const unsigned int, const unsigned long long, void *); typedef void (*ReadAudioFileCallback)(const void *, const unsigned int, const unsigned long long, void *); @@ -68,6 +69,7 @@ StatusCode IStopReadFile(void *object); StatusCode IOpenOutputFile(void *object, const OutputFileInfo *info); StatusCode ICloseOutputFile(void *object); void IGetStreamData(void *object, const void *data, const size_t size, const StreamInfo streamInfo); +OutputFileInfo IGetOutputFileInfo(void *object); void IMediaBaseFree(void *object); #ifdef __cplusplus diff --git a/utils/MediaBase/src/FfmpegMuxStreamV2.cpp b/utils/MediaBase/src/FfmpegMuxStreamV2.cpp index 5b1110f..f38dc70 100644 --- a/utils/MediaBase/src/FfmpegMuxStreamV2.cpp +++ b/utils/MediaBase/src/FfmpegMuxStreamV2.cpp @@ -34,6 +34,7 @@ extern "C" { #include #include // #include +#include #include constexpr unsigned long long MUXING_NOT_START = 0; FfmpegMuxStreamV2::FfmpegMuxStreamV2() @@ -95,6 +96,13 @@ void FfmpegMuxStreamV2::GetStreamData(const void *data, const size_t &size, cons mAudioStream->WriteSourceData(data, size, streamInfo.mTimeStamp_us); } } +OutputFileInfo FfmpegMuxStreamV2::GetOutputFileInfo(void) +{ + OutputFileInfo finalFile = {.mDuration_ms = static_cast(mFileMuxingDuration_us / 1000), + .mFinished = nullptr}; + memcpy(finalFile.mFileName, mOutputFileInfo->mFileName, OUTPUT_FILE_NAME_MAX); + return finalFile; +} StatusCode inline FfmpegMuxStreamV2::OpenMuxOutputFile(const std::string &fileName) { AVDictionary *opt = nullptr; diff --git a/utils/MediaBase/src/FfmpegMuxStreamV2.h b/utils/MediaBase/src/FfmpegMuxStreamV2.h index 9b30fd4..0412449 100644 --- a/utils/MediaBase/src/FfmpegMuxStreamV2.h +++ b/utils/MediaBase/src/FfmpegMuxStreamV2.h @@ -48,6 +48,7 @@ public: // About combine file. StatusCode OpenOutputFile(const OutputFileInfo &fileInfo) override; StatusCode CloseOutputFile(void) override; void GetStreamData(const void *data, const size_t &size, const StreamInfo &streamInfo) override; + OutputFileInfo GetOutputFileInfo(void) override; private: StatusCode OpenMuxOutputFile(const std::string &fileName); diff --git a/utils/MediaBase/src/IMediaBase.cpp b/utils/MediaBase/src/IMediaBase.cpp index 408a4d9..da75d40 100644 --- a/utils/MediaBase/src/IMediaBase.cpp +++ b/utils/MediaBase/src/IMediaBase.cpp @@ -54,6 +54,12 @@ StatusCode IMediaBase::CloseOutputFile(void) void IMediaBase::GetStreamData(const void *data, const size_t &size, const StreamInfo &streamInfo) { } +OutputFileInfo IMediaBase::GetOutputFileInfo(void) +{ + LogWarning("STATUS_CODE_VIRTUAL_FUNCTION\n"); + OutputFileInfo info = {.mFileName = {0}, .mDuration_ms = 0, .mFinished = nullptr}; + return info; +} static const char *MEDIA_BASE_NAME = "media_adapter"; const char *GetMediaBaseModuleName(void) { diff --git a/utils/MediaBase/src/IMediaBase.h b/utils/MediaBase/src/IMediaBase.h index e04108b..d0f4aef 100644 --- a/utils/MediaBase/src/IMediaBase.h +++ b/utils/MediaBase/src/IMediaBase.h @@ -32,6 +32,7 @@ public: // About combine file. virtual StatusCode OpenOutputFile(const OutputFileInfo &fileInfo); virtual StatusCode CloseOutputFile(void); virtual void GetStreamData(const void *data, const size_t &size, const StreamInfo &streamInfo); + virtual OutputFileInfo GetOutputFileInfo(void); }; typedef struct media_base_header { diff --git a/utils/MediaBase/src/MediaBase.cpp b/utils/MediaBase/src/MediaBase.cpp index 50b322f..01f979e 100644 --- a/utils/MediaBase/src/MediaBase.cpp +++ b/utils/MediaBase/src/MediaBase.cpp @@ -84,6 +84,14 @@ void IGetStreamData(void *object, const void *data, const size_t size, const Str (*(std::shared_ptr *)object)->GetStreamData(data, size, streamInfo); } } +OutputFileInfo IGetOutputFileInfo(void *object) +{ + if (ObjectCheck(object) == true) { + return (*(std::shared_ptr *)object)->GetOutputFileInfo(); + } + OutputFileInfo info = {.mFileName = {0}, .mDuration_ms = 0, .mFinished = nullptr}; + return info; +} void IMediaBaseFree(void *object) { if (ObjectCheck(object) == true) {