ImageCaptureInterface::CapErrorCode DirectShowCaptureInterface::getFormats(int *num, CameraFormat *&formats) { if (!isCorrectDeviceHandle(0)) return ImageCaptureInterface::FAILURE; if (0 != DirectShowCapDll_getFormatNumber(mCameras[0].deviceHandle, num)) { L_ERROR_P("Error to get number of supported formats for cameraId: %d", (int)mCameras[0].deviceHandle); return ImageCaptureInterface::FAILURE; } int number = *num; CaptureTypeFormat* captureTypeFormats = new CaptureTypeFormat[number]; delete formats; formats = new CameraFormat[number]; if (0 != DirectShowCapDll_getFormats(mCameras[0].deviceHandle, number, captureTypeFormats)) { delete[] captureTypeFormats; L_ERROR_P("Error to get supported formats for cameraId: %d", (int)mCameras[0].deviceHandle); return ImageCaptureInterface::FAILURE; } for (int i = 0; i < number; i++) { formats[i] = CameraFormat(captureTypeFormats[i].height, captureTypeFormats[i].width, captureTypeFormats[i].fps); } delete[] captureTypeFormats; return ImageCaptureInterface::SUCCESS; }
bool FolderScanner::scan(const string &path, vector<string> &childs, bool findFiles) { fs::path p(path); if (!fs::exists(p)) { L_ERROR_P("<%s> does not exist", p.string().c_str()); return false; } if (!fs::is_directory(p)) { L_ERROR_P("<%s> is not a directory", p.string().c_str()); return false; } for (fs::directory_iterator it = fs::directory_iterator(p); it != fs::directory_iterator(); ++it) { fs::path pathChild(*it); // pathChild has linux style slashes inside bool isDir = fs::is_directory(pathChild); L_DDEBUG_P("%s contains\t%s\tas a %s", p.string().c_str(), pathChild.string().c_str(), (isDir ? "dir" : "file")); if (!(findFiles ^ isDir)) continue; childs.push_back(pathChild); // string(pathChild) has native platform style slashes inside } return true; }
bool FolderScanner::createDir(const string &path, bool allowRecursive) { if (isDir(path)) return true; std::cout << "creating dir <" << path << ">" << std::endl; std::system(("mkdir " + path).c_str()); if (!isDir(path)) { if (!allowRecursive) { L_ERROR_P("couldn't create dir <%s>", path.c_str()); return false; } L_INFO_P("creating subfolders of <%s>", path.c_str()); auto subfolders = HelperUtils::stringSplit(path, PATH_SEPARATOR[0]); string p; for (auto& subfolder : subfolders) { if (!p.empty()) p += PATH_SEPARATOR; p += subfolder; if (!createDir(p, false)) return false; } } return true; }
bool FolderScanner::scan(const string &path, vector<string> &children, bool findFiles) { if (!isDir(path)) { L_ERROR_P("<%s> does not exist or not a directory", path.c_str()); return false; } fs::path p(path); for (fs::directory_iterator it = fs::directory_iterator(p); it != fs::directory_iterator(); ++it) { fs::path pathChild(*it); // pathChild has linux style slashes inside bool isDir = fs::is_directory(pathChild); //L_DDEBUG_P("%s contains\t%s\tas a %s", p.string().c_str(), pathChild.string().c_str(), (isDir ? "dir" : "file")); if (!(findFiles ^ isDir)) continue; // win32: bugfix state: // pathChild.string() - has linux style slashes everywhere // (string)pathChild - has windows style slashes on vc12, but it's obsolete in vc14 #ifdef _MSC_VER childs.push_back(corecvs::HelperUtils::toNativeSlashes(pathChild.string())); #else children.push_back(pathChild); #endif } return true; }
bool FolderScanner::scan(const string &path, vector<string> &childs, bool findFiles) { if (!isDir(path)) { L_ERROR_P("<%s> does not exist or not a directory", path.c_str()); return false; } DIR *dp = opendir(path.c_str()); CORE_ASSERT_TRUE_S(dp != NULL); struct dirent *ep; while ((ep = readdir(dp)) != NULL) { /* We need to form path */ string childPath = path + PATH_SEPARATOR + ep->d_name; /* Ok there are devices, pipes, links... I don't know... */ bool dir = (ep->d_type != DT_REG) && (ep->d_type != DT_LNK); if (ep->d_type == DT_UNKNOWN) { dir = isDir(childPath); } //L_DDEBUG_P("%s contains\t%s\tas a %s (d_type:0x%x)", path.c_str(), ep->d_name, (dir ? "dir" : "file"), ep->d_type); if (!(findFiles ^ dir)) continue; childs.push_back(childPath); } closedir(dp); return true; }
DirectShowCaptureInterface::CapErrorCode DirectShowCaptureInterface::getDeviceName(int num, QString &name) { if (num < 0 || num >= 2) { return ImageCaptureInterface::FAILURE; } // Group Number 1 2 3 4 5 6 7 8 9 10 11 1213 14 QRegExp deviceStringPattern(QString("^([^,:]*)(,([^:]*))?(:(\\d*)/(\\d*))?((:mjpeg)|(:yuyv)|(:rgb)|(:fjpeg))?(:(\\d*)x(\\d*))?$")); static const int Device1Group = 1; static const int Device2Group = 3; QString qdevname(mDevname.c_str()); int result = deviceStringPattern.indexIn(qdevname); if (result == -1) { L_ERROR_P("Error in device string format:<%s>", mDevname.c_str()); return ImageCaptureInterface::FAILURE; } if (num == 0) { name = deviceStringPattern.cap(Device1Group); } else { name = deviceStringPattern.cap(Device2Group); } return ImageCaptureInterface::SUCCESS; }
bool FolderScanner::createDir(const string &path, bool allowRecursive) { if (isDir(path)) return true; std::cout << "creating dir <" << path << ">" << std::endl; bool res; try { fs::path p(path); res = allowRecursive ? fs::create_directories(p) : fs::create_directory(p); } catch (...) { L_ERROR_P("couldn't create dir <%s>", path.c_str()); res = false; } return res; }
DirectShowCaptureInterface::DirectShowCaptureInterface(const string &devname, bool isRgb) { mDevname = devname; mIsRgb = isRgb; // Group Number 1 2 3 4 5 6 7 8 9 10 11 1213 14 QRegExp deviceStringPattern(QString("^([^,:]*)(,([^:]*))?(:(\\d*)/(\\d*))?((:mjpeg)|(:yuyv)|(:rgb)|(:fjpeg))?(:(\\d*)x(\\d*))?$")); static const int Device1Group = 1; static const int Device2Group = 3; static const int FpsNumGroup = 5; static const int FpsDenumGroup = 6; static const int CompressionGroup = 7; static const int WidthGroup = 13; static const int HeightGroup = 14; L_DDEBUG_P("Input string <%s>", devname.c_str()); QString qdevname(devname.c_str()); int result = deviceStringPattern.indexIn(qdevname); if (result == -1) { L_ERROR_P("Error in device string format:<%s>", devname.c_str()); return; } L_INFO_P("Parsed data:\n" " | - Device 1=%s\n" " | - Device 2=%s\n" " | - FPS %s/%s\n" " | - Size [%sx%s]\n" " \\ - Compressing: %s\n" "RGB decoding is %s", deviceStringPattern.cap(Device1Group).toLatin1().constData(), deviceStringPattern.cap(Device2Group).toLatin1().constData(), deviceStringPattern.cap(FpsNumGroup).toLatin1().constData(), deviceStringPattern.cap(FpsDenumGroup).toLatin1().constData(), deviceStringPattern.cap(WidthGroup).toLatin1().constData(), deviceStringPattern.cap(HeightGroup).toLatin1().constData(), deviceStringPattern.cap(CompressionGroup).toLatin1().constData(), mIsRgb ? "on" : "off" ); mDeviceIDs[Frames::LEFT_FRAME ] = deviceStringPattern.cap(Device1Group).isEmpty() ? -1 : deviceStringPattern.cap(Device1Group).toInt(); mDeviceIDs[Frames::RIGHT_FRAME] = deviceStringPattern.cap(Device2Group).isEmpty() ? -1 : deviceStringPattern.cap(Device2Group).toInt(); bool err; int fpsnum = deviceStringPattern.cap(FpsNumGroup).toInt(&err); if (!err) fpsnum = 1; int fpsdenum = deviceStringPattern.cap(FpsDenumGroup).toInt(&err); if (!err) fpsdenum = 10; int width = deviceStringPattern.cap(WidthGroup).toInt(&err); if (!err || width <= 0) width = 800; int height = deviceStringPattern.cap(HeightGroup).toInt(&err); if (!err || height <= 0) height = 600; mCompressed = DirectShowCameraDescriptor::UNCOMPRESSED_YUV; if (!deviceStringPattern.cap(CompressionGroup).isEmpty()) { if (!deviceStringPattern.cap(CompressionGroup).compare(QString(":rgb"))) { mCompressed = DirectShowCameraDescriptor::UNCOMPRESSED_RGB; mIsRgb = true; } else if (!deviceStringPattern.cap(CompressionGroup).compare(QString(":mjpeg"))) { mCompressed = DirectShowCameraDescriptor::COMPRESSED_JPEG; } else if (!deviceStringPattern.cap(CompressionGroup).compare(QString(":fjpeg"))) { mCompressed = DirectShowCameraDescriptor::COMPRESSED_FAST_JPEG; } } for (int i = 0; i < Frames::MAX_INPUTS_NUMBER; i++) { L_INFO_P("Capture %s device: DShow:%d", Frames::getEnumName((Frames::FrameSourceId)i), mDeviceIDs[i]); } L_INFO_P("Format is: %s", DirectShowCameraDescriptor::codec_names[mCompressed]); /* TODO: Make cycle here */ for (int i = 0; i < Frames::MAX_INPUTS_NUMBER; i++) { mFormats[i].type = DirectShowCameraDescriptor::codec_types[mCompressed]; mFormats[i].height = height; mFormats[i].width = width; mFormats[i].fps = (int)((double)fpsdenum / fpsnum); } skippedCount = 0; isRunning = false; }