mirror of
https://github.com/opencv/opencv.git
synced 2026-07-30 07:43:03 +04:00
fallback path & sample timing implemented
fixed trailing whitespaces renamed files *vaapi* to *va_intel* changed names vaapi* to va_intel*
This commit is contained in:
@@ -22,8 +22,8 @@ if((NOT ANDROID) AND HAVE_OPENGL)
|
||||
add_subdirectory(opengl)
|
||||
endif()
|
||||
|
||||
if(UNIX AND NOT ANDROID AND HAVE_VAAPI)
|
||||
add_subdirectory(vaapi)
|
||||
if(UNIX AND NOT ANDROID AND HAVE_VA_INTEL)
|
||||
add_subdirectory(va_intel)
|
||||
endif()
|
||||
|
||||
if(ANDROID AND BUILD_ANDROID_EXAMPLES)
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
SET(OPENCV_VAAPI_SAMPLES_REQUIRED_DEPS opencv_core opencv_imgproc opencv_imgcodecs opencv_videoio opencv_highgui)
|
||||
SET(OPENCV_VA_INTEL_SAMPLES_REQUIRED_DEPS opencv_core opencv_imgproc opencv_imgcodecs opencv_videoio opencv_highgui)
|
||||
|
||||
ocv_check_dependencies(${OPENCV_VAAPI_SAMPLES_REQUIRED_DEPS})
|
||||
ocv_check_dependencies(${OPENCV_VA_INTEL_SAMPLES_REQUIRED_DEPS})
|
||||
|
||||
if(BUILD_EXAMPLES AND OCV_DEPENDENCIES_FOUND)
|
||||
set(project "vaapi")
|
||||
set(project "va_intel")
|
||||
string(TOUPPER "${project}" project_upper)
|
||||
|
||||
project("${project}_samples")
|
||||
|
||||
ocv_include_modules_recurse(${OPENCV_VAAPI_SAMPLES_REQUIRED_DEPS})
|
||||
ocv_include_modules_recurse(${OPENCV_VA_INTEL_SAMPLES_REQUIRED_DEPS})
|
||||
|
||||
# ---------------------------------------------
|
||||
# Define executable targets
|
||||
# ---------------------------------------------
|
||||
MACRO(OPENCV_DEFINE_VAAPI_EXAMPLE name srcs)
|
||||
MACRO(OPENCV_DEFINE_VA_INTEL_EXAMPLE name srcs)
|
||||
set(the_target "example_${project}_${name}")
|
||||
add_executable(${the_target} ${srcs})
|
||||
|
||||
ocv_target_link_libraries(${the_target} ${OPENCV_LINKER_LIBS} ${OPENCV_VAAPI_SAMPLES_REQUIRED_DEPS} ${VAAPI_EXTRA_LIBS})
|
||||
ocv_target_link_libraries(${the_target} ${OPENCV_LINKER_LIBS} ${OPENCV_VA_INTEL_SAMPLES_REQUIRED_DEPS} ${VA_INTEL_LIBRARIES})
|
||||
|
||||
set_target_properties(${the_target} PROPERTIES
|
||||
OUTPUT_NAME "${project}-example-${name}"
|
||||
@@ -33,6 +33,6 @@ if(BUILD_EXAMPLES AND OCV_DEPENDENCIES_FOUND)
|
||||
foreach(sample_filename ${all_samples})
|
||||
get_filename_component(sample ${sample_filename} NAME_WE)
|
||||
file(GLOB sample_srcs RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${sample}.*)
|
||||
OPENCV_DEFINE_VAAPI_EXAMPLE(${sample} ${sample_srcs})
|
||||
OPENCV_DEFINE_VA_INTEL_EXAMPLE(${sample} ${sample_srcs})
|
||||
endforeach()
|
||||
endif()
|
||||
@@ -10,9 +10,9 @@
|
||||
#include <va/va.h>
|
||||
#include <va/va_drm.h>
|
||||
|
||||
#define VAAPI_PCI_DIR "/sys/bus/pci/devices"
|
||||
#define VAAPI_DRI_DIR "/dev/dri/"
|
||||
#define VAAPI_PCI_DISPLAY_CONTROLLER_CLASS 0x03
|
||||
#define VA_INTEL_PCI_DIR "/sys/bus/pci/devices"
|
||||
#define VA_INTEL_DRI_DIR "/dev/dri/"
|
||||
#define VA_INTEL_PCI_DISPLAY_CONTROLLER_CLASS 0x03
|
||||
|
||||
namespace va {
|
||||
|
||||
@@ -70,7 +70,7 @@ static unsigned readId(const char* devName, const char* idName)
|
||||
long int id = 0;
|
||||
|
||||
char fileName[256];
|
||||
snprintf(fileName, sizeof(fileName), "%s/%s/%s", VAAPI_PCI_DIR, devName, idName);
|
||||
snprintf(fileName, sizeof(fileName), "%s/%s/%s", VA_INTEL_PCI_DIR, devName, idName);
|
||||
|
||||
FILE* file = fopen(fileName, "r");
|
||||
if (file)
|
||||
@@ -88,14 +88,14 @@ static int findAdapter(unsigned desiredVendorId)
|
||||
int adapterIndex = -1;
|
||||
int numAdapters = 0;
|
||||
|
||||
Directory dir(VAAPI_PCI_DIR);
|
||||
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) == VAAPI_PCI_DISPLAY_CONTROLLER_CLASS)
|
||||
if ((classId >> 16) == VA_INTEL_PCI_DISPLAY_CONTROLLER_CLASS)
|
||||
{
|
||||
unsigned vendorId = readId(name, "vendor");
|
||||
if (vendorId == desiredVendorId)
|
||||
@@ -122,9 +122,9 @@ public:
|
||||
numbers[1] = adapterIndex;
|
||||
for (int i = 0; i < NUM_NODES; ++i)
|
||||
{
|
||||
int sz = sizeof(VAAPI_DRI_DIR) + strlen(names[i]) + 3;
|
||||
int sz = sizeof(VA_INTEL_DRI_DIR) + strlen(names[i]) + 3;
|
||||
paths[i] = new char [sz];
|
||||
snprintf(paths[i], sz, "%s%s%d", VAAPI_DRI_DIR, names[i], numbers[i]);
|
||||
snprintf(paths[i], sz, "%s%s%d", VA_INTEL_DRI_DIR, names[i], numbers[i]);
|
||||
}
|
||||
}
|
||||
~NodeInfo()
|
||||
@@ -24,6 +24,8 @@
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <string>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
@@ -39,7 +41,7 @@
|
||||
|
||||
#include "opencv2/core.hpp"
|
||||
#include "opencv2/imgproc.hpp"
|
||||
#include "opencv2/core/vaapi.hpp"
|
||||
#include "opencv2/core/va_intel.hpp"
|
||||
|
||||
#define CHECK_VASTATUS(va_status,func) \
|
||||
if (va_status != VA_STATUS_SUCCESS) { \
|
||||
@@ -129,7 +131,55 @@ static VASliceParameterBufferMPEG2 slice_param={
|
||||
#define CLIP_WIDTH 16
|
||||
#define CLIP_HEIGHT 16
|
||||
|
||||
static void dumpSurface(VADisplay display, VASurfaceID surface_id, const char* fileName)
|
||||
class Timer
|
||||
{
|
||||
public:
|
||||
enum UNITS
|
||||
{
|
||||
USEC = 0,
|
||||
MSEC,
|
||||
SEC
|
||||
};
|
||||
|
||||
Timer() : m_t0(0), m_diff(0)
|
||||
{
|
||||
m_tick_frequency = (float)cv::getTickFrequency();
|
||||
|
||||
m_unit_mul[USEC] = 1000000;
|
||||
m_unit_mul[MSEC] = 1000;
|
||||
m_unit_mul[SEC] = 1;
|
||||
}
|
||||
|
||||
void clear()
|
||||
{
|
||||
m_t0 = m_diff = 0;
|
||||
}
|
||||
|
||||
void start()
|
||||
{
|
||||
m_t0 = cv::getTickCount();
|
||||
}
|
||||
|
||||
void stop()
|
||||
{
|
||||
m_diff = cv::getTickCount() - m_t0;
|
||||
}
|
||||
|
||||
float time(UNITS u = MSEC)
|
||||
{
|
||||
float sec = m_diff / m_tick_frequency;
|
||||
|
||||
return sec * m_unit_mul[u];
|
||||
}
|
||||
|
||||
public:
|
||||
float m_tick_frequency;
|
||||
int64 m_t0;
|
||||
int64 m_diff;
|
||||
int m_unit_mul[3];
|
||||
};
|
||||
|
||||
static void dumpSurface(VADisplay display, VASurfaceID surface_id, const char* fileName, bool doInterop)
|
||||
{
|
||||
VAStatus va_status;
|
||||
|
||||
@@ -153,7 +203,8 @@ static void dumpSurface(VADisplay display, VASurfaceID surface_id, const char* f
|
||||
printf("image.pitches[0..2] = 0x%08x 0x%08x 0x%08x\n", image.pitches[0], image.pitches[1], image.pitches[2]);
|
||||
printf("image.offsets[0..2] = 0x%08x 0x%08x 0x%08x\n", image.offsets[0], image.offsets[1], image.offsets[2]);
|
||||
*/
|
||||
FILE* out = fopen(fileName, "wb");
|
||||
std::string fn = std::string(fileName) + std::string(doInterop ? ".gpu" : ".cpu");
|
||||
FILE* out = fopen(fn.c_str(), "wb");
|
||||
if (!out)
|
||||
{
|
||||
perror(fileName);
|
||||
@@ -169,10 +220,8 @@ static void dumpSurface(VADisplay display, VASurfaceID surface_id, const char* f
|
||||
CHECK_VASTATUS(va_status, "vaDestroyImage");
|
||||
}
|
||||
|
||||
int main(int argc,char **argv)
|
||||
static float run(const char* fn1, const char* fn2, bool doInterop)
|
||||
{
|
||||
(void)argc; (void)argv;
|
||||
|
||||
VAEntrypoint entrypoints[5];
|
||||
int num_entrypoints,vld_entrypoint;
|
||||
VAConfigAttrib attrib;
|
||||
@@ -181,24 +230,10 @@ int main(int argc,char **argv)
|
||||
VAContextID context_id;
|
||||
VABufferID pic_param_buf,iqmatrix_buf,slice_param_buf,slice_data_buf;
|
||||
VAStatus va_status;
|
||||
Timer t;
|
||||
|
||||
if (argc < 3)
|
||||
{
|
||||
fprintf(stderr,
|
||||
"Usage: vaapi_interop file1 file2\n\n"
|
||||
"where: file1 is to be created, contains original surface data (NV12)\n"
|
||||
" file2 is to be created, contains processed surface data (NV12)\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if (!va::openDisplay())
|
||||
{
|
||||
fprintf(stderr, "Failed to open VA display for CL-VA interoperability\n");
|
||||
exit(1);
|
||||
}
|
||||
fprintf(stderr, "VA display opened successfully\n");
|
||||
|
||||
cv::vaapi::ocl::initializeContextFromVA(va::display);
|
||||
fprintf(stderr, "Run on %s\n", doInterop ? "GPU" : "CPU");
|
||||
cv::va_intel::ocl::initializeContextFromVA(va::display, doInterop);
|
||||
|
||||
va_status = vaQueryConfigEntrypoints(va::display, VAProfileMPEG2Main, entrypoints,
|
||||
&num_entrypoints);
|
||||
@@ -294,22 +329,50 @@ int main(int argc,char **argv)
|
||||
va_status = vaSyncSurface(va::display, surface_id);
|
||||
CHECK_VASTATUS(va_status, "vaSyncSurface");
|
||||
|
||||
dumpSurface(va::display, surface_id, argv[1]);
|
||||
dumpSurface(va::display, surface_id, fn1, doInterop);
|
||||
|
||||
cv::Size size(CLIP_WIDTH,CLIP_HEIGHT);
|
||||
cv::UMat u;
|
||||
|
||||
cv::vaapi::convertFromVASurface(surface_id, size, u);
|
||||
t.start();
|
||||
cv::va_intel::convertFromVASurface(va::display, surface_id, size, u);
|
||||
cv::blur(u, u, cv::Size(7, 7), cv::Point(-3, -3));
|
||||
cv::vaapi::convertToVASurface(u, surface_id, size);
|
||||
cv::va_intel::convertToVASurface(va::display, u, surface_id, size);
|
||||
t.stop();
|
||||
|
||||
dumpSurface(va::display, surface_id, argv[2]);
|
||||
dumpSurface(va::display, surface_id, fn2, doInterop);
|
||||
|
||||
vaDestroySurfaces(va::display,&surface_id,1);
|
||||
vaDestroyConfig(va::display,config_id);
|
||||
vaDestroyContext(va::display,context_id);
|
||||
|
||||
vaTerminate(va::display);
|
||||
return t.time(Timer::MSEC);
|
||||
}
|
||||
|
||||
int main(int argc,char **argv)
|
||||
{
|
||||
if (argc < 3)
|
||||
{
|
||||
fprintf(stderr,
|
||||
"Usage: va_intel_interop file1 file2\n\n"
|
||||
"where: file1 is to be created, contains original surface data (NV12)\n"
|
||||
" file2 is to be created, contains processed surface data (NV12)\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if (!va::openDisplay())
|
||||
{
|
||||
fprintf(stderr, "Failed to open VA display for CL-VA interoperability\n");
|
||||
exit(1);
|
||||
}
|
||||
fprintf(stderr, "VA display opened successfully\n");
|
||||
|
||||
float gpuTime = run(argv[1], argv[2], true);
|
||||
float cpuTime = run(argv[1], argv[2], false);
|
||||
|
||||
fprintf(stderr, "GPU processing time, msec: %7.3f\n", gpuTime);
|
||||
fprintf(stderr, "CPU processing time, msec: %7.3f\n", cpuTime);
|
||||
|
||||
va::closeDisplay();
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user