5feca50f58
removed unused context_id2; changed blur size 7x7 to 3x3; added short comments removed unnecessary call to convertFromVASurface() replaced dumpSurface() with writeImage() added infile cmdline parameter, input image loaded by imread()
240 lines
5.5 KiB
PHP
240 lines
5.5 KiB
PHP
#include <dirent.h>
|
|
#include <fcntl.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/types.h>
|
|
#include <unistd.h>
|
|
|
|
#include "cvconfig.h"
|
|
|
|
#include <va/va.h>
|
|
# include <va/va_drm.h>
|
|
|
|
namespace va {
|
|
|
|
bool openDisplay();
|
|
void closeDisplay();
|
|
|
|
VADisplay display = NULL;
|
|
bool initialized = false;
|
|
|
|
#define VA_INTEL_PCI_DIR "/sys/bus/pci/devices"
|
|
#define VA_INTEL_DRI_DIR "/dev/dri/"
|
|
#define VA_INTEL_PCI_DISPLAY_CONTROLLER_CLASS 0x03
|
|
|
|
static unsigned readId(const char* devName, const char* idName);
|
|
static int findAdapter(unsigned desiredVendorId);
|
|
|
|
int drmfd = -1;
|
|
|
|
class Directory
|
|
{
|
|
typedef int (*fsort)(const struct dirent**, const struct dirent**);
|
|
public:
|
|
Directory(const char* path)
|
|
{
|
|
dirEntries = 0;
|
|
numEntries = scandir(path, &dirEntries, filterFunc, (fsort)alphasort);
|
|
}
|
|
~Directory()
|
|
{
|
|
if (numEntries && dirEntries)
|
|
{
|
|
for (int i = 0; i < numEntries; ++i)
|
|
free(dirEntries[i]);
|
|
free(dirEntries);
|
|
}
|
|
}
|
|
int count() const
|
|
{
|
|
return numEntries;
|
|
}
|
|
const struct dirent* operator[](int index) const
|
|
{
|
|
return ((dirEntries != 0) && (index >= 0) && (index < numEntries)) ? dirEntries[index] : 0;
|
|
}
|
|
protected:
|
|
static int filterFunc(const struct dirent* dir)
|
|
{
|
|
if (!dir) return 0;
|
|
if (!strcmp(dir->d_name, ".")) return 0;
|
|
if (!strcmp(dir->d_name, "..")) return 0;
|
|
return 1;
|
|
}
|
|
private:
|
|
int numEntries;
|
|
struct dirent** dirEntries;
|
|
};
|
|
|
|
static unsigned readId(const char* devName, const char* idName)
|
|
{
|
|
long int id = 0;
|
|
|
|
char fileName[256];
|
|
snprintf(fileName, sizeof(fileName), "%s/%s/%s", VA_INTEL_PCI_DIR, devName, idName);
|
|
|
|
FILE* file = fopen(fileName, "r");
|
|
if (file)
|
|
{
|
|
char str[16] = "";
|
|
if (fgets(str, sizeof(str), file))
|
|
id = strtol(str, NULL, 16);
|
|
fclose(file);
|
|
}
|
|
return (unsigned)id;
|
|
}
|
|
|
|
static int findAdapter(unsigned desiredVendorId)
|
|
{
|
|
int adapterIndex = -1;
|
|
int numAdapters = 0;
|
|
|
|
Directory dir(VA_INTEL_PCI_DIR);
|
|
|
|
for (int i = 0; i < dir.count(); ++i)
|
|
{
|
|
const char* name = dir[i]->d_name;
|
|
|
|
unsigned classId = readId(name, "class");
|
|
if ((classId >> 16) == VA_INTEL_PCI_DISPLAY_CONTROLLER_CLASS)
|
|
{
|
|
unsigned vendorId = readId(name, "vendor");
|
|
if (vendorId == desiredVendorId)
|
|
{
|
|
adapterIndex = numAdapters;
|
|
break;
|
|
}
|
|
++numAdapters;
|
|
}
|
|
}
|
|
|
|
return adapterIndex;
|
|
}
|
|
|
|
class NodeInfo
|
|
{
|
|
enum { NUM_NODES = 2 };
|
|
public:
|
|
NodeInfo(int adapterIndex)
|
|
{
|
|
const char* names[NUM_NODES] = { "renderD", "card" };
|
|
int numbers[NUM_NODES];
|
|
numbers[0] = adapterIndex+128;
|
|
numbers[1] = adapterIndex;
|
|
for (int i = 0; i < NUM_NODES; ++i)
|
|
{
|
|
int sz = sizeof(VA_INTEL_DRI_DIR) + strlen(names[i]) + 3;
|
|
paths[i] = new char [sz];
|
|
snprintf(paths[i], sz, "%s%s%d", VA_INTEL_DRI_DIR, names[i], numbers[i]);
|
|
}
|
|
}
|
|
~NodeInfo()
|
|
{
|
|
for (int i = 0; i < NUM_NODES; ++i)
|
|
{
|
|
delete paths[i];
|
|
paths[i] = 0;
|
|
}
|
|
}
|
|
int count() const
|
|
{
|
|
return NUM_NODES;
|
|
}
|
|
const char* path(int index) const
|
|
{
|
|
return ((index >= 0) && (index < NUM_NODES)) ? paths[index] : 0;
|
|
}
|
|
private:
|
|
char* paths[NUM_NODES];
|
|
};
|
|
|
|
static bool openDeviceIntel();
|
|
static bool openDeviceGeneric();
|
|
|
|
static bool openDeviceIntel()
|
|
{
|
|
const unsigned IntelVendorID = 0x8086;
|
|
|
|
int adapterIndex = findAdapter(IntelVendorID);
|
|
if (adapterIndex >= 0)
|
|
{
|
|
NodeInfo nodes(adapterIndex);
|
|
|
|
for (int i = 0; i < nodes.count(); ++i)
|
|
{
|
|
drmfd = open(nodes.path(i), O_RDWR);
|
|
if (drmfd >= 0)
|
|
{
|
|
display = vaGetDisplayDRM(drmfd);
|
|
if (display)
|
|
return true;
|
|
close(drmfd);
|
|
drmfd = -1;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
static bool openDeviceGeneric()
|
|
{
|
|
static const char* device_paths[] = { "/dev/dri/renderD128", "/dev/dri/card0" };
|
|
static const int num_devices = sizeof(device_paths) / sizeof(device_paths[0]);
|
|
|
|
for (int i = 0; i < num_devices; ++i)
|
|
{
|
|
drmfd = open(device_paths[i], O_RDWR);
|
|
if (drmfd >= 0)
|
|
{
|
|
display = vaGetDisplayDRM(drmfd);
|
|
if (display)
|
|
return true;
|
|
close(drmfd);
|
|
drmfd = -1;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool openDisplay()
|
|
{
|
|
if (!initialized)
|
|
{
|
|
drmfd = -1;
|
|
display = 0;
|
|
|
|
if (openDeviceIntel() || openDeviceGeneric())
|
|
{
|
|
int majorVersion = 0, minorVersion = 0;
|
|
if (vaInitialize(display, &majorVersion, &minorVersion) == VA_STATUS_SUCCESS)
|
|
{
|
|
initialized = true;
|
|
return true;
|
|
}
|
|
close(drmfd);
|
|
display = 0;
|
|
drmfd = -1;
|
|
}
|
|
return false; // Can't open VA display
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void closeDisplay()
|
|
{
|
|
if (initialized)
|
|
{
|
|
if (display)
|
|
vaTerminate(display);
|
|
if (drmfd >= 0)
|
|
close(drmfd);
|
|
display = 0;
|
|
drmfd = -1;
|
|
initialized = false;
|
|
}
|
|
}
|
|
|
|
} // namespace va
|