Fixed:read media file bug.

This commit is contained in:
Fancy code 2024-07-13 11:24:05 +08:00
parent 93c02056b5
commit cf7ac85f1f
6 changed files with 87 additions and 49 deletions
doc
middleware/MediaManager/src
test
application/HuntingCamera/src_mock
hal/tool/src

View File

@ -1,10 +1,10 @@
# 1. gdb coredump分析
  本文介绍ubuntu系统环境下coredump文件的分析方法。
  本文介绍ubuntu系统环境下coredump文件的分析方法。**重要此文的场景在Ubuntu每次开机后需要重复设置coredump调试环境例如开启coredump和设置coredump文件生成路径。**
**一个coredump示例**
```
```code
$ ../output_files/test/bin/McuManagerTest --gtest_filter=McuManagerTest.RH_INTEGRATION_McuManager_AUTO_OtherSideSendIpcMission
Note: Google Test filter = McuManagerTest.RH_INTEGRATION_McuManager_AUTO_OtherSideSendIpcMission
[==========] Running 1 test from 1 test suite.
@ -33,29 +33,31 @@ Aborted (core dumped)
## 1.1. coredump文件生成路径查询
```
```code
$ cat /proc/sys/kernel/core_pattern
|/usr/share/apport/apport -p%p -s%s -c%c -d%d -P%P -u%u -g%g -- %E
```
修改coredump文件生成路径
```
$ sudo sh -c 'echo /home/xiaojiazhu/project/rkipc/battery/ipc-rk1106/ipc-sdk/cmake-shell/core.%e.%p > /proc/sys/kernel/core_pattern'
```code
$ sudo sh -c 'echo /home/xiaojiazhu/project/ipc-sdk/ipc/cmake-shell/core.%e.%p > /proc/sys/kernel/core_pattern'
$ cat /proc/sys/kernel/core_pattern
/home/xiaojiazhu/project/rkipc/battery/ipc-rk1106/ipc-sdk/cmake-shell/core.%e.%p
```
命令:
sudo sh -c 'echo /path/core.%e.%p > /proc/sys/kernel/core_pattern'
例如:
```
例如(根据自己的实际情况写路径参数)
```code
sudo sh -c 'echo /home/xiaojiazhu/project/rkipc/battery/ipc-rk1106/ipc-sdk/cmake-shell/core.%e.%p > /proc/sys/kernel/core_pattern'
```
**发现路径下并未生成coredump文件**
```
```code
$ ulimit -a
core file size (blocks, -c) 0 // 0表示终端未开启core dump
data seg size (kbytes, -d) unlimited
@ -76,12 +78,11 @@ file locks (-x) unlimited
```
解决:
```
```code
$ ulimit -c unlimited
```
sudo echo /home/xiaojiazhu/project/rkipc/battery/ipc-rk1106/ipc-sdk/cmake-shell/core.%e.%p > /proc/sys/kernel/core_pattern
## 1.2. gdb查看堆栈信息
**Ubuntu系统需要加sudo执行程序才会生成coredump文件。**
@ -90,7 +91,7 @@ sudo echo /home/xiaojiazhu/project/rkipc/battery/ipc-rk1106/ipc-sdk/cmake-shell/
  在gdb中无法识别coredump文件如下所示
```
```code
$ sudo gdb ../output_files/test/bin/McuManagerTest core.smbd.3390383
[sudo] password for xiaojiazhu:
Sorry, try again.
@ -123,11 +124,11 @@ Program terminated with signal SIGABRT, Aborted.
#2 0x0000000000000000 in ?? ()
```
由于gdb和asan同时启用会冲突导致无法识别coredump文件。解决办法如下
**由于gdb和asan同时启用会冲突导致无法识别coredump文件。解决办法如下**
修改://build/sdk_config.cmake
```
```code
# Gdb debug
if(${TARGET_PLATFORM} MATCHES ${DEFINE_LINUX})
message("---------------------------Debug mode.-----------------------")
@ -149,7 +150,7 @@ endif()
解决后:
```
```code
$ sudo gdb ../output_files/test/bin/McuManagerTest core.McuManagerTest.3406751
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04.1) 9.2
Copyright (C) 2020 Free Software Foundation, Inc.
@ -206,4 +207,4 @@ Program terminated with signal SIGABRT, Aborted.
#17 main (argc=<optimized out>, argv=<optimized out>)
at /home/xiaojiazhu/project/rkipc/battery/ipc-rk1106/ipc-sdk/test/middleware/McuManager/mainTest.cpp:22
(gdb)
```
```

View File

@ -118,6 +118,9 @@ void MediaHandle::StartTaskTimer(void)
LogInfo("StartTaskTimer start.\n");
media->TaskTimer();
};
if (mTaskTimerThread.joinable()) {
mTaskTimerThread.join();
}
std::shared_ptr<MediaHandle> media = shared_from_this();
mTaskTimerThread = std::thread(taskTimerThread, media);
}
@ -162,6 +165,9 @@ void MediaHandle::StartFrameHandle(void)
LogInfo("StartFrameHandle start.\n");
media->FrameHandle();
};
if (mFrameHandleThread.joinable()) {
mFrameHandleThread.join();
}
std::shared_ptr<MediaHandle> media = shared_from_this();
mFrameHandleThread = std::thread(taskTimerThread, media);
}

View File

@ -33,7 +33,7 @@ public:
bool HandleFinished(void) override;
private:
std::mutex mMutex;
std::mutex mMutex; // TODO: To improve and delete this mutex.
void *mRecordMp4Object;
std::shared_ptr<VMediaTask> mRecordTask;
std::vector<MediaTaskResponse> mTaskResponse;

View File

@ -53,6 +53,22 @@ TEST_F(HuntingCameraTest, INTEGRATION_HunttingCamera_EXAMPLE_MediaTask)
MainThread::GetInstance()->Runing();
}
// ../output_files/test/bin/HuntingCameraTest
// --gtest_filter=HuntingCameraTest.INTEGRATION_HunttingCamera_EXAMPLE_MediaTask_Twice
TEST_F(HuntingCameraTest, INTEGRATION_HunttingCamera_EXAMPLE_MediaTask_Twice)
{
McuManagerTestTool::MockOtherSideIpcMissionReply(IpcMission::TEST);
SetAllCamerasResult(mAllCamerasMock);
std::this_thread::sleep_for(std::chrono::milliseconds(100));
MainThread::GetInstance()->Init();
TestManager::ResetTimeOut(1000 * 25);
std::this_thread::sleep_for(std::chrono::milliseconds(100));
HalTestTool::MockKeyClick("reset", 200); // Simulate pressing a button.
std::this_thread::sleep_for(std::chrono::milliseconds(1000 * 15));
LogInfo("Make a media task 2 times.\n");
HalTestTool::MockKeyClick("reset", 200); // Simulate pressing a button.
MainThread::GetInstance()->Runing();
}
// ../output_files/test/bin/HuntingCameraTest
// --gtest_filter=HuntingCameraTest.INTEGRATION_HunttingCamera_EXAMPLE_MediaTask_No_sdcard
TEST_F(HuntingCameraTest, INTEGRATION_HunttingCamera_EXAMPLE_MediaTask_No_sdcard)
{

View File

@ -28,26 +28,7 @@ CameraHalTest::CameraHalTest(const CameraType &cameraType)
void CameraHalTest::Init(void)
{
CameraHal::Init();
if (nullptr == mReadH264File) {
ReadVideoFileCallback videCallback = [](const void *stream,
const unsigned int length,
const unsigned long long duration_us,
void *context) -> void {
((CameraHalTest *)context)->ReadDataFromH264File(stream, length, duration_us);
};
mReadH264File = ICreateMediaBase(MEDIA_HANDLE_TYPE_READ_H264);
ISetReadVideoCallback(mReadH264File, videCallback, this);
}
if (nullptr == mReadG711aFile) {
ReadAudioFileCallback audioCallback = [](const void *stream,
const unsigned int length,
const unsigned long long duration_us,
void *context) -> void {
((CameraHalTest *)context)->ReadDataFromG711aFile(stream, length, duration_us);
};
mReadG711aFile = ICreateMediaBase(MEDIA_HANDLE_TYPE_READ_G711A);
ISetReadVideoCallback(mReadG711aFile, audioCallback, this);
}
// ReadFileInit();
}
void CameraHalTest::UnInit(void)
{
@ -57,18 +38,7 @@ void CameraHalTest::UnInit(void)
if (mTaskTimerThread.joinable()) {
mTaskTimerThread.join();
}
if (mReadH264File) {
ISetReadVideoCallback(mReadH264File, nullptr, nullptr);
IStopReadFile(mReadH264File);
IMediaBaseFree(mReadH264File);
mReadH264File = nullptr;
}
if (mReadG711aFile) {
ISetReadAudioCallback(mReadG711aFile, nullptr, nullptr);
IStopReadFile(mReadG711aFile);
IMediaBaseFree(mReadG711aFile);
mReadG711aFile = nullptr;
}
ReadFileUnInit();
}
void CameraHalTest::SetCameraMonitor(std::shared_ptr<VCameraHalMonitor> &monitor)
{
@ -86,6 +56,10 @@ void CameraHalTest::SetCameraMonitorTrace(std::shared_ptr<VCameraHalMonitor> &mo
StatusCode CameraHalTest::StartSingleTask(const CameraTaskParam &param)
{
LogInfo("CameraHalTest::StartSingleTask\n");
if (mTaskTimerThread.joinable()) {
mTaskTimerThread.join();
}
ReadFileInit();
auto taskTimerThread = [=](std::shared_ptr<CameraHalTest> cameraHal) {
LogInfo("MockReportMediaStream start.\n");
cameraHal->MockReportMediaStream();
@ -134,6 +108,7 @@ void CameraHalTest::MockReportMediaStream(void)
*/
mTaskRuning = false;
}
ReadFileUnInit();
}
void CameraHalTest::ReadDataFromH264File(const void *stream, const unsigned int length,
const unsigned long long duration_us)
@ -155,6 +130,44 @@ void CameraHalTest::ReadDataFromG711aFile(const void *stream, const unsigned int
// LogInfo("CameraHalTest::ReadDataFromG711aFile duration = %ld\n", microseconds);
std::this_thread::sleep_for(std::chrono::milliseconds((duration_us / 1000) + 43));
}
void CameraHalTest::ReadFileInit(void)
{
if (nullptr == mReadH264File) {
ReadVideoFileCallback videCallback = [](const void *stream,
const unsigned int length,
const unsigned long long duration_us,
void *context) -> void {
((CameraHalTest *)context)->ReadDataFromH264File(stream, length, duration_us);
};
mReadH264File = ICreateMediaBase(MEDIA_HANDLE_TYPE_READ_H264);
ISetReadVideoCallback(mReadH264File, videCallback, this);
}
if (nullptr == mReadG711aFile) {
ReadAudioFileCallback audioCallback = [](const void *stream,
const unsigned int length,
const unsigned long long duration_us,
void *context) -> void {
((CameraHalTest *)context)->ReadDataFromG711aFile(stream, length, duration_us);
};
mReadG711aFile = ICreateMediaBase(MEDIA_HANDLE_TYPE_READ_G711A);
ISetReadVideoCallback(mReadG711aFile, audioCallback, this);
}
}
void CameraHalTest::ReadFileUnInit(void)
{
if (mReadH264File) {
ISetReadVideoCallback(mReadH264File, nullptr, nullptr);
IStopReadFile(mReadH264File);
IMediaBaseFree(mReadH264File);
mReadH264File = nullptr;
}
if (mReadG711aFile) {
ISetReadAudioCallback(mReadG711aFile, nullptr, nullptr);
IStopReadFile(mReadG711aFile);
IMediaBaseFree(mReadG711aFile);
mReadG711aFile = nullptr;
}
}
CameraHalMock::CameraHalMock(const CameraType &cameraType) : CameraHalTest(cameraType)
{
}

View File

@ -39,6 +39,8 @@ private:
void MockReportMediaStream(void);
void ReadDataFromH264File(const void *stream, const unsigned int length, const unsigned long long duration_us);
void ReadDataFromG711aFile(const void *stream, const unsigned int length, const unsigned long long duration_us);
void ReadFileInit(void);
void ReadFileUnInit(void);
protected:
const CameraType mCameraType;