2024-03-04 16:22:40 +08:00
|
|
|
|
#include "Channel.h"
|
|
|
|
|
#include "CheckStorageThread.h"
|
|
|
|
|
#include "Constant.h"
|
|
|
|
|
#include "Json.h"
|
2024-01-18 15:41:43 +08:00
|
|
|
|
#include "Link.h"
|
2024-03-04 16:22:40 +08:00
|
|
|
|
#include "Log.h"
|
2024-01-18 15:41:43 +08:00
|
|
|
|
#include "TcpServer.h"
|
|
|
|
|
#include "Widget.h"
|
|
|
|
|
#include <QApplication>
|
|
|
|
|
#include <QDebug>
|
|
|
|
|
#include <unistd.h>
|
|
|
|
|
|
|
|
|
|
TcpServer* server;
|
|
|
|
|
LinkObject* vo;
|
|
|
|
|
LinkObject* vo1;
|
2024-01-25 09:57:08 +08:00
|
|
|
|
|
2024-03-04 16:22:40 +08:00
|
|
|
|
// 通道列表
|
|
|
|
|
QList<Channel*> channelList;
|
|
|
|
|
// 录制模式
|
|
|
|
|
Constant::RecordMode recordMode;
|
|
|
|
|
// 回放模式
|
|
|
|
|
Constant::PlaybackMode playbackMode;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 加载配置文件
|
|
|
|
|
*/
|
|
|
|
|
bool loadConfiguration(QString path)
|
|
|
|
|
{
|
|
|
|
|
QFileInfo fileInfo(path);
|
|
|
|
|
if (!fileInfo.exists()) {
|
|
|
|
|
Log::critical("config.json does not exist, exit");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QVariantMap config = Json::loadFile(path).toMap();
|
|
|
|
|
recordMode = Constant::RecordMode(config["recordMode"].toInt());
|
|
|
|
|
playbackMode = Constant::PlaybackMode(config["playbackMode"].toInt());
|
|
|
|
|
QVariantList list = config["interface"].toList();
|
|
|
|
|
for (int i = 0; i < list.count(); i++) {
|
|
|
|
|
Channel* chn = new Channel();
|
|
|
|
|
QVariantMap cfg = list.at(i).toMap();
|
|
|
|
|
chn->channelName = cfg["name"].toString();
|
|
|
|
|
|
|
|
|
|
QVariantMap encV = cfg["encV"].toMap();
|
|
|
|
|
chn->videoEncoderParams = encV;
|
|
|
|
|
|
|
|
|
|
QVariantMap encA = cfg["encA"].toMap();
|
|
|
|
|
chn->audioEncoderParams = encA;
|
|
|
|
|
|
|
|
|
|
chn->pushCode = cfg["pushCode"].toString();
|
|
|
|
|
|
|
|
|
|
chn->init();
|
|
|
|
|
channelList.push_back(chn);
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 开始录制
|
|
|
|
|
*/
|
|
|
|
|
void startRecord()
|
|
|
|
|
{
|
|
|
|
|
// 一路录制,只录制HDMI-A通道
|
|
|
|
|
if (recordMode == Constant::OneChannelRecord) {
|
|
|
|
|
for (Channel* chn : channelList) {
|
|
|
|
|
if (chn->channelName == Constant::MainChannel) {
|
|
|
|
|
chn->startRecord();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 两路录制
|
|
|
|
|
else if (recordMode == Constant::TwoChannelRecord) {
|
|
|
|
|
for (Channel* chn : channelList) {
|
|
|
|
|
chn->startRecord();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-01-18 15:41:43 +08:00
|
|
|
|
|
|
|
|
|
int main(int argc, char* argv[])
|
|
|
|
|
{
|
2024-03-04 16:22:40 +08:00
|
|
|
|
// 初始化日志
|
|
|
|
|
Log::init();
|
|
|
|
|
|
|
|
|
|
// 初始化Link编码系统
|
2024-01-18 15:41:43 +08:00
|
|
|
|
if (!Link::init()) {
|
2024-03-04 16:22:40 +08:00
|
|
|
|
Log::error("Link init failed, exit");
|
2024-01-18 15:41:43 +08:00
|
|
|
|
return 0;
|
|
|
|
|
}
|
2024-03-04 16:22:40 +08:00
|
|
|
|
// 在初始化QApplication之前初始化视频输出和linuxfb
|
|
|
|
|
// 否则不能显示qt的ui
|
2024-01-18 15:41:43 +08:00
|
|
|
|
|
2024-03-04 16:22:40 +08:00
|
|
|
|
// HDMI-OUT0视频输出,只将ui输出在0口
|
2024-01-18 15:41:43 +08:00
|
|
|
|
vo = Link::create("OutputVo");
|
|
|
|
|
QVariantMap dataVo;
|
|
|
|
|
dataVo["vid"] = 0;
|
|
|
|
|
dataVo["type"] = "hdmi";
|
|
|
|
|
vo->start(dataVo);
|
|
|
|
|
|
2024-03-04 16:22:40 +08:00
|
|
|
|
// HDMI-OUT1视频输出
|
2024-01-18 15:41:43 +08:00
|
|
|
|
vo1 = Link::create("OutputVo");
|
|
|
|
|
QVariantMap dataVo1;
|
|
|
|
|
dataVo1["vid"] = 1;
|
|
|
|
|
dataVo1["ui"] = false;
|
|
|
|
|
dataVo1["type"] = "vga|bt1120";
|
|
|
|
|
vo1->start(dataVo1);
|
|
|
|
|
|
2024-03-04 16:22:40 +08:00
|
|
|
|
/**
|
|
|
|
|
* 后续可能需要进行修改**************************
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
// HDMI-OUT1口特殊设置
|
2024-01-18 15:41:43 +08:00
|
|
|
|
static int lastNorm = 0;
|
|
|
|
|
int norm = 0;
|
|
|
|
|
QString str = "1080P60";
|
|
|
|
|
if (str == "1080P60")
|
|
|
|
|
norm = 9;
|
|
|
|
|
else if (str == "1080P50")
|
|
|
|
|
norm = 10;
|
|
|
|
|
else if (str == "1080P30")
|
|
|
|
|
norm = 12;
|
|
|
|
|
else if (str == "720P60")
|
|
|
|
|
norm = 5;
|
|
|
|
|
else if (str == "720P50")
|
|
|
|
|
norm = 6;
|
|
|
|
|
else if (str == "3840x2160_30")
|
|
|
|
|
norm = 14;
|
|
|
|
|
if (norm != lastNorm) {
|
|
|
|
|
lastNorm = norm;
|
|
|
|
|
QString cmd = "rmmod hi_lt8618sx_lp.ko";
|
|
|
|
|
system(cmd.toLatin1().data());
|
|
|
|
|
cmd = "insmod /ko/extdrv/hi_lt8618sx_lp.ko norm=" + QString::number(norm);
|
|
|
|
|
system(cmd.toLatin1().data());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QApplication a(argc, argv);
|
|
|
|
|
|
2024-03-04 16:22:40 +08:00
|
|
|
|
// 初始化配置文件, 需要在QApplication之后
|
|
|
|
|
if (!loadConfiguration(Constant::ConfigurationPath)) {
|
|
|
|
|
Log::error("load configuration failed, exit...");
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
2024-01-18 15:41:43 +08:00
|
|
|
|
|
2024-03-04 16:22:40 +08:00
|
|
|
|
// qt界面
|
|
|
|
|
Widget w;
|
|
|
|
|
w.show();
|
|
|
|
|
|
|
|
|
|
// 开始录制
|
|
|
|
|
startRecord();
|
|
|
|
|
|
|
|
|
|
// 开启Tcp服务
|
2024-01-25 09:57:08 +08:00
|
|
|
|
server = new TcpServer();
|
|
|
|
|
server->listen(QHostAddress::Any, 8080);
|
2024-03-04 16:22:40 +08:00
|
|
|
|
Log::info("start tcp server, listen port 8080...");
|
2024-01-18 15:41:43 +08:00
|
|
|
|
|
2024-03-04 16:22:40 +08:00
|
|
|
|
// 硬盘检测线程,检测硬盘容量
|
|
|
|
|
CheckStorageThread* thread = new CheckStorageThread();
|
2024-03-05 13:47:32 +08:00
|
|
|
|
thread->start();
|
|
|
|
|
Log::info("start storage check thread...");
|
2024-01-18 15:41:43 +08:00
|
|
|
|
|
|
|
|
|
return a.exec();
|
|
|
|
|
}
|