Exemple #1
0
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;
}
Exemple #6
0
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;
}
Exemple #8
0
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;
}