diff --git a/src/backends/mpv/mpv_proxy.cpp b/src/backends/mpv/mpv_proxy.cpp index b2253ba6..4d857dcd 100644 --- a/src/backends/mpv/mpv_proxy.cpp +++ b/src/backends/mpv/mpv_proxy.cpp @@ -27,6 +27,135 @@ #include #include +struct gpuInfo_t { // null 表无效值 + int index; // 序号索引 请将 集显排最后,不同卡可相同,值越大优先级越低; 同一款GPU 有多种配置选择时,值越小优选 ,使用待实现 + QString vendorId; // input vendor ID lspci -nnk可询 + QString productId; // input productID lspci -nnk可询 0xffff 为通配符 代表该厂商所有设备 + QString kerneldriver; // input vendor ID lspci -nnk可询 + QString dev_filename; // input /dev/filename + QString vaapi_filename; // input /usr/lib/${arch}-linux-gnu/dri/file?_drv_video.so + QString vdpau_filename; // input /usr/lib/${arch}-linux-gnu/vdpau/libvdpau_file?.so + QString hwdec; // res + QString vo; // res + QString classId; // input vendor ID lspci -nnk可询 refence to http://pci-ids.ucw.cz/ + QString maxWidth; // input 宽最大值,解码能力参考规格值 不同压缩格式可能不同 + QString maxHeigh; // input 高最大值, 同上 + QString message; // debug 信息 +}; + +static QList m_dbInfoGPU; //硬解库 +static QList mychoice_dbindex; //存上选中的队列 +static bool isMatchGPU = false; //是否匹配硬解库 + +static bool isFileExist(const QString &absolutepathfile) +{ + QFile fi(absolutepathfile); + return fi.exists() ? true : false; +} + +static QString readfile(const QString &absolutepathfile) +{ + QString ret = QString(); + QFile fi(absolutepathfile); + if(fi.exists() && fi.open(QFile::ReadOnly)) { + QByteArray data = fi.readAll(); + ret = QString(data); + fi.close(); + } + return ret; +} + +static bool readDrmCardVidPid() +{ + bool ret = false; + QList m_localGPUlist; + m_localGPUlist.clear(); + + for(int id=0; id < 3; id++) { // 目前不超过 3 张 显卡 + QString kernelDriverdir = QString("/sys/class/drm/card%1").arg(id); + QDir dirdrmcard(kernelDriverdir); + if(!dirdrmcard.exists()) + continue; + + QString kmdname; + QString classID = readfile(kernelDriverdir + QString("/device/class")); + QString vendorID = readfile(kernelDriverdir + QString("/device/vendor")); + QString productID = readfile(kernelDriverdir + QString("/device/device")); + QString kernelDriverPath = kernelDriverdir + QString("/device/driver"); + QFileInfo kerneldriver(kernelDriverPath); + QString kernelDriverName = kerneldriver.symLinkTarget(); + if(kerneldriver.exists() && kerneldriver.isSymLink()) { + QString kernelDriverName = kerneldriver.symLinkTarget(); + QFileInfo driverfile(kernelDriverName); + kmdname = driverfile.fileName(); + } + if(!vendorID.isEmpty() || !productID.isEmpty() || !kmdname.isEmpty()) { + gpuInfo_t gpu; + gpu.index = id; + gpu.classId = classID.trimmed(); + gpu.vendorId = vendorID.trimmed(); + gpu.productId = productID.trimmed(); + gpu.kerneldriver = kmdname.trimmed(); + m_localGPUlist.append(gpu); + } + } + + if(m_localGPUlist.size() > 0){ + // after iterator local GPU ; blow find the best data base; + + QList ivaapi; + QList ivdpau; + for (int i = 0; i < m_localGPUlist.size(); ++i) { + gpuInfo_t gpu_this = m_localGPUlist.at(i); + int indexlevel = m_dbInfoGPU.size() + 1; + for (int j = 0; j