#include "ChannelMix.h"#include "Config.h"#include "ChannelVI.h"#include <QFile>#include "Carousel.h"#include "Json.h"ChannelMix::ChannelMix(QObject *parent) : Channel(parent){audio=Link::create("MixA");video=Link::create("MixV");encA=Link::create("EncodeA");encV=Link::create("EncodeV");encV2=Link::create("EncodeV");lastSrcV=NULL;lastSrcV2=NULL;lastSrcA=NULL;lastSrcA2=NULL;}void ChannelMix::init(QVariantMap cfg){Q_UNUSED(cfg);gain->linkA(encA);overlay->linkV(encV);overlay->linkV(encV2);outputV=Link::create("OutputVo");outputV2=Link::create("OutputVo");outputA=Link::create("OutputAo");outputA2=NULL;QVariantMap aoData;aoData["interface"]="HDMI-OUT";outputA->setData(aoData);audio->linkA(outputA);QVariantMap ifaceA=Json::loadFile("/link/config/board.json").toMap()["interfaceA"].toMap();if(ifaceA.keys().contains("SDI-OUT") || ifaceA.keys().contains("HDMI-OUT2")){outputA2=Link::create("OutputAo");if(ifaceA.keys().contains("SDI-OUT"))aoData["interface"]="SDI-OUT";else if(ifaceA.keys().contains("HDMI-OUT2"))aoData["interface"]="HDMI-OUT2";outputA2->setData(aoData);audio->linkA(outputA2);}lastSrcA=audio;lastSrcA2=audio;Channel::init();}void ChannelMix::updateConfig(QVariantMap cfg){if(cfg["enable"].toBool()){QVariantMap dataMixV;if(cfg["encv"].toMap()["width"].toInt()!=-1){dataMixV["width"]=cfg["encv"].toMap()["width"].toInt();dataMixV["height"]=cfg["encv"].toMap()["height"].toInt();dataMixV["framerate"]=cfg["encv"].toMap()["framerate"].toInt();}video->start(dataMixV);audio->start();QVariantList srcV=cfg["srcV"].toList();QVariantList srcA=cfg["srcA"].toList();QVariantList videoList;for(int i=0;i<srcV.count();i++){if(srcV[i].toInt()!=-1){LinkObject *v=Config::findChannelById(srcV[i].toInt())->overlay;videoList.append(v->name());v->linkV(video);}else{videoList.append("unknow");}}if(!GCarousel || !GCarousel->hadCarousel){dataMixV["src"]=videoList;dataMixV["layout"]=cfg["layout"].toList();foreach(QString id,curAList){if(!srcA.contains(id)){if(LinkObject *g = getAudioGain(id))g->unLinkA(audio);curAList.removeAll(id);}}QVariantMap dataMixA;dataMixA["bufLen"]=20;if (srcA.contains("line")){if (LinkObject *g = getAudioGain("line"))dataMixA["main"] = g->name();}else if (srcA.contains("usbAlsa")){if (LinkObject *g = getAudioGain("usbAlsa"))dataMixA["main"] = g->name();}else{for (int i=0;i<srcA.count();i++){if (srcA[i].toString() == "-1")continue;if (LinkObject *g = getAudioGain(srcA[i].toString())){dataMixA["main"] = g->name();break;}}}for(int i=0;i<srcA.count();i++){if(srcA[i].toString() == "-1")continue;if(LinkObject *g = getAudioGain(srcA[i].toString())){g->linkA(audio);curAList.append(srcA[i].toString());}}audio->setData(dataMixA);video->setData(dataMixV);}if(cfg["enca"].toMap()["codec"].toString()!="close")encA->start(cfg["enca"].toMap());elseencA->stop();if(cfg["encv"].toMap()["codec"].toString()!="close"){encV->start(cfg["encv"].toMap());}elseencV->stop();if(cfg["encv"].toMap()["codec"].toString()!="close"){encV->start(cfg["encv"].toMap());}elseencV->stop();if(cfg["enable2"].toBool() && cfg["encv2"].toMap()["codec"].toString()!="close")encV2->start(cfg["encv2"].toMap());elseencV2->stop();}else{audio->stop();video->stop();encA->stop();encV->stop();encV2->stop();}QVariantMap outCfg=cfg["output"].toMap();if(outCfg["enable"].toBool()){outputA->start();Channel *chn=Config::findChannelById(outCfg["src"].toInt());#ifndef SS928V100outCfg["scaleUp"]=(chn->type=="vi");#endifoutCfg.remove("src");outputV->start(outCfg);LinkObject *v=chn->overlay;LinkObject *a=chn->gain;if(v!=NULL){if(v!=lastSrcV && lastSrcV!=NULL)lastSrcV->unLinkV(outputV);lastSrcV=v;v->linkV(outputV);}if(a!=NULL){if(a!=lastSrcA && lastSrcA!=NULL){lastSrcA->unLinkA(outputA);a->linkA(outputA);}lastSrcA=a;}}elseoutputV->stop();QVariantMap outCfg2=cfg["output2"].toMap();if(outCfg2["enable"].toBool()){if(outputA2!=NULL)outputA2->start();#if SS524V100if(outCfg2.contains("chip")){QVariantMap boardV=Link::getConfig()["interfaceV"].toMap();if(boardV.contains("SDI")&& boardV["SDI"].toMap().contains("chip")&& boardV["SDI"].toMap()["chip"].toString()=="fpga"){outCfg2.remove("chip");outCfg2.remove("swapYC");}}#endifChannel *chn=Config::findChannelById(outCfg2["src"].toInt());#ifndef SS928V100outCfg2["scaleUp"]=(chn->type=="vi");#endifoutCfg2.remove("src");outputV2->start(outCfg2);LinkObject *v=chn->overlay;LinkObject *a=chn->gain;if(v!=NULL){if(v!=lastSrcV2 && lastSrcV2!=NULL)lastSrcV2->unLinkV(outputV2);lastSrcV2=v;v->linkV(outputV2);}if(a!=NULL && outputA2!=NULL){if(a!=lastSrcA2 && lastSrcA2!=NULL){lastSrcA2->unLinkA(outputA2);a->linkA(outputA2);}lastSrcA2=a;}#if HI3531DV200 || SS528V100if(outCfg2.contains("chip") && outCfg2["chip"].toString()=="gs2972"){}else if(outCfg2["type"].toString().contains("bt1120")){static int lastNorm=0;int norm=0;int ddr=0;QString str=outCfg2["output"].toString();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;ddr=1;}else if(str=="1600x1200_60")norm=15;else if(str=="1280x1024_60")norm=16;else if(str=="1024x768_60")norm=17;else if(str=="800x600_60")norm=18;if(norm!=lastNorm){lastNorm=norm;QString cmd="rmmod hi_lt8618sx_lp.ko";system(cmd.toLatin1().data());cmd=cmd.sprintf("insmod /ko/extdrv/hi_lt8618sx_lp.ko norm=%d USE_DDRCLK=%d",norm,ddr);system(cmd.toLatin1().data());}}#endif}elseoutputV2->stop();Channel::updateConfig(cfg);}LinkObject *ChannelMix::getAudioGain(const QString &id){if (id == "line")return Channel::lineGain;if (id == "usbAlsa")return Channel::usbAlsaGain;Channel* chn = Config::findChannelById(id.toInt());return chn ? chn->gain : NULL;}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。