Skip to content

G-API: oneVPL merge DX11 acceleration #21049

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 23 commits into from
Dec 8, 2021
Merged

Conversation

sivanov-work
Copy link
Contributor

@sivanov-work sivanov-work commented Nov 12, 2021

Add DX11 allocation resources: surfaces
Implement actual DX11 acceleration with MFX allocator
Reuse IDeviceSelector interface for selecting device in DX11 accelerator policy

Add shared_lock & elastics_barrier to work out R-W pattern & provide lock-free access to MediaFrame data.
Add unit tests for lock-free primitives

Improve decode pipeline: add yield on queue decode operations for used up busy surfaces

Pull Request Readiness Checklist

See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request

  • I agree to contribute to the project under Apache 2 License.
  • To the best of my knowledge, the proposed patch is not based on a code under GPL or other license that is incompatible with OpenCV
  • The PR is proposed to proper branch
  • There is reference to original bug report and related work
  • There is accuracy test, performance test and test data in opencv_extra repository, if applicable
    Patch to opencv_extra has the same branch name.
  • The feature is well documented and sample code can be built with the project CMake

Build Configuration

force_builders=XCustom,Custom Win,Custom Mac
build_gapi_standalone:Linux x64=ade-0.1.1f
build_gapi_standalone:Win64=ade-0.1.1f
build_gapi_standalone:Mac=ade-0.1.1f
build_gapi_standalone:Linux x64 Debug=ade-0.1.1f

Xbuild_image:Custom=centos:7
Xbuildworker:Custom=linux-1
build_gapi_standalone:Custom=ade-0.1.1f

build_image:Custom=ubuntu-openvino-2021.3.0:20.04
Xbuild_image:Custom Win=openvino-2021.2.0
build_image:Custom Mac=openvino-2021.2.0

test_modules:Custom=gapi,python2,python3,java
test_modules:Custom Win=gapi,python2,python3,java
test_modules:Custom Mac=gapi,python2,python3,java

buildworker:Custom=linux-1
test_opencl:Custom=OFF
test_bigdata:Custom=1
test_filter:Custom=*

build_image:Custom Win=gapi-onevpl-2021.6.0
buildworker:Custom Win=windows-3
build_contrib:Custom Win=OFF

Copy link
Contributor

@mpashchenkov mpashchenkov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

First wave (stupid comments).

@@ -157,19 +154,26 @@ GAPI_OCV_KERNEL_ST(RenderFrameOCVImpl, cv::gapi::wip::draw::GRenderFrame, Render
*
*/
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it necessary to align comment with other code in {}?

switch (FourCC) {
case MFX_FOURCC_I420:
case MFX_FOURCC_NV12:
nbytes = width * height + 2 * half_width * half_height;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
nbytes = width * height + 2 * half_width * half_height;
nbytes = width * height + 2 * half_width * half_height;

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok

}

surface_ptr_t create_surface_RGB4_(mfxFrameInfo frameInfo,
std::shared_ptr<void> out_buf_ptr,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One more space for parameters.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok

}

surface_ptr_t create_surface_other_(mfxFrameInfo frameInfo,
std::shared_ptr<void> out_buf_ptr,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And here.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok

}

void VPLDX11AccelerationPolicy::init(session_t session) {
mfxStatus sts = MFXVideoCORE_GetHandle(session, MFX_HANDLE_D3D11_DEVICE, reinterpret_cast<mfxHDL*>(&hw_handle));
mfxStatus sts = MFXVideoCORE_SetHandle(session, MFX_HANDLE_D3D11_DEVICE, (mfxHDL) hw_handle);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(mfxHDL)
Why is it not some_cast<>()?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

some kind of copy-paste from public VPL examples. I'll fix it later

auto read_work = [&lock, &shared_value](size_t count) {

auto old_shared_value = shared_value;
for (size_t i = 0; i < count; i ++) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
for (size_t i = 0; i < count; i ++) {
for (size_t i = 0; i < count; i++) {


// TEST invariant: last_visitor_id MUST be one from any LATTER worker visitor_id
bool one_of_available_ids_matched = false;
for (size_t id = 0; id < max_worker_count; id ++) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
for (size_t id = 0; id < max_worker_count; id ++) {
for (size_t id = 0; id < max_worker_count; id++) {

if (adaptee.owns()) {
w_lock_counter ++;
} else {
r_lock_counter ++;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove extra space before increment ++ 648 and 650

if (adaptee.owns()) {
w_unlock_counter ++;
} else {
r_unlock_counter ++;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove extra space before increment ++ 657 and 659


mfxFrameData data;
const int exec_count = 123;
for (int i = 0; i < exec_count; i ++) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
for (int i = 0; i < exec_count; i ++) {
for (int i = 0; i < exec_count; i++) {

throw std::runtime_error("VPLDX11AccelerationPolicy::create_surface_pool() is not implemented");
// allocate textures by explicit request
mfxFrameAllocResponse mfxResponse;
//TODO
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i think it must be removed

desc.MiscFlags = 0;
std::vector<ID3D11Texture2D*> staging_textures;
staging_textures.reserve(request->NumFrameSuggested);
for (int i = 0; i < request->NumFrameSuggested; i ++ ) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
for (int i = 0; i < request->NumFrameSuggested; i ++ ) {
for (int i = 0; i < request->NumFrameSuggested; i++ ) {

pitch,
pitch / 2,
pitch / 2, 0u
};
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

alignment

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok

auto work = [&lock, &shared_value](size_t count) {
for (size_t i = 0; i < count; i ++) {
lock.lock();
shared_value ++;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
shared_value ++;
shared_value++;

};

std::thread worker_thread([&barrier, sync, work] () {

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

extra space


std::function<mfxStatus(mfxMemId, mfxFrameData *)> lock =
[&lock_counter] (mfxMemId, mfxFrameData *) {
lock_counter ++;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
lock_counter ++;
lock_counter++;


mfxFrameData data;
const int exec_count = 123;
for (int i = 0; i < exec_count; i ++) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
for (int i = 0; i < exec_count; i ++) {
for (int i = 0; i < exec_count; i++) {

bool pred_excl = exclusive_lock.load();
do {
if (!pred_excl) {
// if no exclusive lock than start shared lock transaction
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

than --> then

Copy link
Contributor

@OrestChura OrestChura left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

№ 2

~VPLDX11AccelerationPolicy();

using pool_t = CachedPool;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can this using be a part of the parent class, or it is specific for cpu & dx11 only?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

got it,
when new policies would be intorduced i suggest to make light refactoring here

@anna-khakimova
Copy link
Member

Looks good for me. Great work!

@alalek
Copy link
Member

alalek commented Dec 1, 2021

Please configure builders with enabled oneVPL support (see previous oneVPL-related PRs)

return MFX_ERR_NONE;
}

DX11AllocationRecord::DX11AllocationRecord() = default;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can this be declared in .hpp?

std::this_thread::yield();
}
prev_shared = shared_counter.load();
} while (prev_shared != 0 || !in_progress);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did I understand correctly that when in_progress == true (and in the end of cycle body shared_counter == 0, execution should go out of cycle?
Then why it is named in_progress? I would expect that if some process is in progress, it means it should remain cycling.
More likely this variable should have been called like complete, because it means that the current action is complete and execution should move forward.
The same is for the method shared_lock above

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's locking with rollback in failed case:

When i'm write thread and want to make exclusive lock, then when i get current shared_counter and make sure no other competitors is here (shared_counter == 0) (---1----) then i will make exclusive_lock (----2----) and flag operation as in progress. Starting from this moment no one reader thread cannot take shared access because bool pred_excl = exclusive_lock.load(); will fail for them.

But let's imaging situation when after check (---1---) and right before (---2----) one of the competitors reader thread would be succeeded in obtaining shared lock... So when i finish operation (---2---) it is more readers thread obtained lock already... So i need to rolled back my (---2---) operation in this case and wait until all readers complete their works before continue...
So in_progress is using as flag that i must rollback extra exclusive lock when the second condition fails. And must proceed when both condition true: is_progress == true && `shared_lock ==0)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's what I meant - in the end, in_progress == true, but you must proceed further. The comment is regarding naming. "In progress" itself means you are in the middle of some process and you cannot move further. It doesn't match with the meaning of this variable

If to suggest, this variable means that write access is gained, so it can be named like gained, succeeded; or, better, meaningful locked, because exclusive_lock was set true, but in the case you've described it should be rolled back. But it is locked that time.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this variable cannot be named as gained, succeeded of locked because resource is not locked until we finished final while. It actually means: we are in the middle of progress something and we must not make some assumption about succeed or not until we check the second condition shared_lock ==0

So in_progress means: I increased exclusive lock counter but i'm not sure that i'm allowed to continue with exclusive access until i check the second condition.
This is sync with using two independent atomic states: and we cannot proceed it both of them wouldn't reach the right state

@@ -82,7 +80,7 @@ TEST_P(OneVPL_Source_MFPAsyncDispatcherTest, open_and_decode_file)
mfxVariant mfx_param_0;
mfx_param_0.Type = MFX_VARIANT_TYPE_U32;
mfx_param_0.Data.U32 = provider_ptr->get_mfx_codec_id();
EXPECT_EQ(MFXSetConfigFilterProperty(cfg_inst_0,(mfxU8 *)"mfxImplDescription.mfxDecoderDescription.decoder.CodecID",
EXPECT_EQ(MFXSetConfigFilterProperty(cfg_inst_0,(mfxU8 *)CfgParam::decoder_id_name(),
mfx_param_0), MFX_ERR_NONE);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please, remove the C-style cast

@@ -116,7 +106,7 @@ struct GAPI_Streaming: public ::testing::TestWithParam<std::tuple<KernelPackage,
using namespace cv::gapi;
auto args = cv::compile_args(use_only{pkg});
if (cap) {
args += cv::compile_args(streaming::queue_capacity{cap.value()});
args += cv::compile_args(cv::gapi::streaming::queue_capacity{cap.value()});
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Then, maybe using namespace cv::gapi; should be removed 3 lines upper

decRequest.NumFrameSuggested = preallocated_frames_count;
if (static_cast<size_t>(std::numeric_limits<mfxU16>::max()) < preallocated_frames_count) {
GAPI_LOG_WARNING(nullptr, "Cannot proceed with CfgParam \"" << CfgParam::frames_pool_size_name() << "\": " <<
preallocated_frames_count << ". It must not be equal than " <<
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

must not be greater I believe

@@ -272,12 +275,16 @@ if(HAVE_GAPI_ONEVPL)
if(TARGET opencv_test_gapi)
ocv_target_compile_definitions(opencv_test_gapi PRIVATE -DHAVE_ONEVPL)
ocv_target_link_libraries(opencv_test_gapi PRIVATE ${VPL_IMPORTED_TARGETS})
if(MSVC)
target_compile_options(opencv_test_gapi PUBLIC "/wd4201")
endif()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You've rewritten includes via pragma in tests, too - is it still necessary?

Copy link
Contributor

@OrestChura OrestChura left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for all the efforts!

Copy link
Contributor

@mpashchenkov mpashchenkov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I didn't find places with possible nulls and going out of memory. I'm give up.

static_cast<DX11AllocationItem::subresource_id_t>(
reinterpret_cast<uint64_t>(
reinterpret_cast<DX11AllocationItem::subresource_id_t *>(
handle.second)))}};//,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
handle.second)))}};//,
handle.second)))}};

Comment on lines +4 to +10
#if defined(_MSC_VER)
#pragma warning(push)
#pragma warning(disable : 4201)
#pragma warning(disable : 4302)
#pragma warning(disable : 4311)
#pragma warning(disable : 4312)
#endif // defined(_MSC_VER)
Copy link
Contributor

@mpashchenkov mpashchenkov Dec 6, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is not:

if(MSVC)
  if(HAVE_GAPI_ONEVPL) <-- I'm not sure about the flag
    ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4201 /wd4302 /wd4311 /wd4312)
  endif()

in CMakeLists.txt?

One place of disabling can reduce problems in the future.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because we should not disable warnings anywhere.
Problems with warnings should be suppressed locally.

@sivanov-work
Copy link
Contributor Author

if no other comments are coming then I assume to apply them in the next PRs:

  • warning for cmake disabled for onevpl in unit tests only, regular build is unaffected: move them into header inclusion in tests
  • some typos in log & assert infos
  • to rename shared_lock : in_progress to is_pending etc.

@dmatveev dmatveev self-assigned this Dec 7, 2021
@dmatveev dmatveev added this to the 4.5.5 milestone Dec 7, 2021
Copy link
Contributor

@dmatveev dmatveev left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved with comments

@@ -272,12 +275,16 @@ if(HAVE_GAPI_ONEVPL)
if(TARGET opencv_test_gapi)
ocv_target_compile_definitions(opencv_test_gapi PRIVATE -DHAVE_ONEVPL)
ocv_target_link_libraries(opencv_test_gapi PRIVATE ${VPL_IMPORTED_TARGETS})
if(MSVC)
target_compile_options(opencv_test_gapi PUBLIC "/wd4201")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't this be PRIVATE?

};

if (!type.empty()) {
cfg_params.push_back(CfgParam::create_decoder_id(type.c_str()));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BTW this looks odd from the user perspective - why do you ask users to provide you with c_str() while there's std::string ? Is that char* thing copied or should stay alive - for how long?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

to retain public interface consistent (maybe for future): because STL classes are not ABI compatible in general

@@ -21,8 +21,100 @@ namespace cv {
namespace gapi {
namespace wip {
namespace onevpl {
namespace utils {
mfxU32 GetSurfaceSize_(mfxU32 FourCC, mfxU32 width, mfxU32 height) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

alignment is still not counted here right?

note sometimes planes are aligned by up to 4096

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it was get from VPL examples, may be we could add it when faces with the issue later

Comment on lines +50 to +53
surface_ptr_t create_surface_RGB4_(mfxFrameInfo frameInfo,
std::shared_ptr<void> out_buf_ptr,
size_t out_buf_ptr_offset,
size_t out_buf_size)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It may be a tiny detail but how this function is supposed to be used?

I see it creates something and returns, but that's the out_buf_ptr then?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it is shared across surfaces: each surface memory is sliced from out_buf_ptr
So all surfaces have reference to that buf and mapped on that buffer memory by offset

Referencing is required to keep out_buf_ptr alive when alive at least one surface

// TODO more intelligent check
if (out_buf_size <=
out_buf_ptr_offset + (surfW * surfH) + ((surfW / 2) * (surfH / 2))) {
GAPI_LOG_WARNING(nullptr, "Not enough buffer, ptr: " << out_buf_ptr <<
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

-> Insufficient buffer size?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TODO in next PR

if (mode == MediaFrame::Access::R) {
alloc_data->unlock_read(mid, data);
} else {
alloc_data->unlock_write(mid, data);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so can this be a plain abstract rwlock (e.g. like one from boost or pthreads)? Or something differs in the access at the VPL level?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

adapter is quite different, but shared_mutex inside it should be reused from official sources further
P.S. is_own_locked can be put on upper level to do not customize official shared_mutex
P.P.S. official c++17 shared_mutex is mutex-based with wait-lock, but tbb has imple,entation with rw_spinlock to make busy wait

namespace onevpl {

template<typename Impl>
class elastic_barrier {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the idea of this structure described anywhere?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(I'd expect to see it here)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

May i add in the next PR such description?
In short overview:
pass only single one thread (the first one) to make some initialization: resource acquisition - another will waiting for the first thread job completion.
And make final deinitialization: resource release - only for last one( if no other threads hold resource or intendent to acquire it)

Some kind of double check lock patter in Gstreamer MediaResource Adapter - but support more scenarios( and more efficient?)

}
bool SharedLock::owns() const {
return exclusive_lock.load();
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why do we need our own shared lock here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes it is, but this can be easily emulated on upper level in LockAdapter

namespace wip {
namespace onevpl {

class GAPI_EXPORTS SharedLock {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is it modelled after the C++14's shared_lock?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, homegrown solution...

@@ -116,6 +127,32 @@ mfxVariant cfg_param_to_mfx_variant(const CfgParam& cfg_val) {
}), cfg_val.get_value());
return ret;
}

size_t strtoull_or_throw(const char* str) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

y use chars

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

to satisty c-string in interface functions (to make interface ABI consistent)

@sivanov-work
Copy link
Contributor Author

@alalek Could you merge it please? Non addressed comment would be addressed at the next PR
Custom build for Win+gapi-onevpl is passed (warning fixed and disarmed for UT)

@alalek alalek merged commit 5c91f5b into opencv:4.x Dec 8, 2021
@alalek alalek mentioned this pull request Dec 30, 2021
@alalek alalek mentioned this pull request Feb 22, 2022
a-sajjad72 pushed a commit to a-sajjad72/opencv that referenced this pull request Mar 30, 2023
G-API: oneVPL merge DX11 acceleration

* Merge DX11 initial

* Fold conditions row in MACRO in utils

* Inject DeviceSelector

* Turn on DeviceSelector in DX11

* Change sharedLock logic & Move FMT checking in FrameAdapter c-tor

* Move out NumSuggestFrame to configure params

* Drain file source fix

* Fix compilation

* Force zero initializetion of SharedLock

* Fix some compiler warnings

* Fix integer comparison warnings

* Fix integers in sample

* Integrate Demux

* Fix compilation

* Add predefined names for some CfgParam

* Trigger CI

* Fix MultithreadCtx bug, Add Dx11 GetBlobParam(), Get rif of ATL CComPtr

* Fix UT: remove unit test with deprecated video from opencv_extra

* Add creators for most usable CfgParam

* Eliminate some warnings

* Fix warning in GAPI_Assert

* Apply comments

* Add VPL wrapped header with MSVC pragma to get rid of global warning masking
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants