Commit Graph

13825 Commits

Author SHA1 Message Date
GregoryMorse
b5a4159efc Add support for WinRT in the MF capture framework by removing the disallowed calls to enumerate devices and create a sample grabber sink and adding framework for the MediaCapture interface and a custom sink which interfaces with the sample grabber callback interface. The change requires discussion for making it completely functional as redundancy is required given that if the source is a video file, the old code pathways must be used. Otherwise all IMFMediaSession, IMFMediaSource, and IMFActivate code must use a MediaCapture code path and all sink code must use the CMediaSink custom sink.
Support for the custom sink is extended to non-WinRT not for compatibility as Windows Vista client is a minimum regardless, but because it offers more flexibility, could be faster and is able to be used as an optionally different code path during sink creation based on a future configuration parameter.

My discussion and proposal to finish this change:
 Devices are so easily enumerated through WinRT Windows.Devices namespace that wrapping the calls in a library is quite a chore for little benefit though to get the various modes and formats could still be a worthwhile project. For now conditional compilation to remove videodevices and any offending non-video file related activity in videodevice. In my opinion, this is a different , far less fundamental and important change which can possibly be done as a future project and also much more easily implemented in C++/CX.

ImageGrabber has the IMFSampleGrabberSinkCallback replaced with a base class (SharedSampleGrabber) which also be is base class for ImageGrabberRT. This change is necessary as the custom sink does not require a thread to pump events which is done through MediaCapture already. IMFSampleGrabberSinkCallback is the common element between both models and that piece can be shared. Initializing the new ImageGrabberRT is as simple as passing an already initialized MediaCapture object and any video format/encoding parameters.

The concurrency event is necessary to wait for completion and is the way the underlying, IAsyncAction wrappers in the task library work as well. Native WIN32 event objects would be an option if HAVE_CONCURRENCY is not defined. I could even imagine doing it with sleep/thread yield and InterlockedCompareExchange yet I am not enthusiastic about that approach either. Since there is a specific compiler HAVE_ for concurrency, I do not like pulling it in though I think for WinRT it is safe to say we will always have it available though should probably conditionally compile with the Interlocked option as WIN32 events would require HAVE_WIN32.

It looks like C++/CX cannot be used for the IMediaExtension sink (which should not be a problem) as using COM objects requires WRL and though deriving from IMediaExtension can be done, there is little purpose without COM. Objects from C++/CX can be swapped to interact with objects from native C++ as Inspectable* can reinterpret_cast to the ref object IInspectable^ and vice-versa. A solution to the COM class with C++/CX would be great so we could have dual support. Also without #define for every WRL object in use, the code will get quite muddy given that the */^ would need to be ifdef'd everywhere.

Fixed bugs and completed the change.  I believe the new classes need to be moved to a header file as the file has become to large and more classes need to be added for handling all the asynchronous problems (one wrapping IAsyncAction in a task and another for making a task out of IAsyncAction).  Unfortunately, blocking on the UI thread is not an option in WinRT so a synchronous architecture is considered "illegal" by Microsoft's standards even if implementable (C++/CX ppltasks library throws errors if you try it).  Worse, either by design or a bug in the MF MediaCapture class with Custom Sinks causes a crash if stop/start previewing without reinitializing (spPreferredPreviewMediaType is fatally nulled).  After decompiling Windows.Media.dll, I worked around this in my own projects by using an activate-able custom sink ID which strangely assigns 1 to this pointer allowing it to be reinitialized in what can only be described as a hack by Microsoft.  This would add additional overhead to the project to implement especially for static libraries as it requires IDL/DLL exporting followed by manifest declaration.  Better to document that it is not supported.

Furthermore, an additional class for IMFAttributes should be implemented to make clean architecture for passing around attributes as opposed to directly calling non-COM interface calls on the objects and making use of SetProperties which would also be a set up for an object that uses the RuntimeClass activation ID.

The remaining changes are not difficult and will be complete soon along with debug tracing messages.

Update and rename cap_msmf.h to cap_msmf.hpp

Successful test - samples are grabbed

Library updated and cleaned up with comments, marshaling, exceptions and linker settings
Fixed trailing whitespace

VS 2013 support and cleanup consistency plus C++/CX new object fixed

Conflicts:
	modules/highgui/src/cap_msmf.cpp
	modules/highgui/src/cap_msmf.hpp
	modules/highgui/src/ppltasks_winrt.h

Fix merge conflicts

VS 2013 Update 2 library bug fix integrated

a-wi's changed integrated
2014-09-10 17:05:52 +08:00
Alexander Alekhin
0f1a0a9818 Merge pull request #2951 from ilya-lavrenov:tapi_ipp_filter2d 2014-07-08 15:21:35 +00:00
Ilya Lavrenov
e8f5c2fcf6 OpenCL before IPP 2014-07-08 18:51:27 +04:00
Alexander Alekhin
e79ceb4b45 Merge pull request #2936 from ilya-lavrenov:tapi_minmaxloc_opt 2014-07-08 07:30:49 +00:00
Vadim Pisarevsky
d05d235c01 Merge pull request #2669 from Adil-Ibragimov:flann_distance_fix 2014-07-07 13:35:09 +00:00
Vadim Pisarevsky
e1553d5da3 Merge pull request #2929 from ilya-lavrenov:sse_pow 2014-07-07 11:22:26 +00:00
Vadim Pisarevsky
b2ab1b758a Merge pull request #2937 from ilya-lavrenov:sse_patch_nans 2014-07-07 11:20:30 +00:00
Vadim Pisarevsky
41dcd0ac03 Merge pull request #2941 from ilya-lavrenov:sse_inrange 2014-07-07 11:19:54 +00:00
Alexander Alekhin
7d9f79b130 Merge pull request #2944 from bkueng:fix_compiler_error 2014-07-07 11:18:31 +00:00
Beat Küng
90dce84314 imgproc: fix compiler error for gcc 4.8
this bug was introduced in a73809e6.
2014-07-05 09:27:11 +02:00
Ilya Lavrenov
e2b86974ae SSE2 optimization of cv::patchNaNs 2014-07-04 10:27:44 +04:00
Ilya Lavrenov
e04c39b089 SSE2 optimization of cv::inRange 2014-07-04 10:11:18 +04:00
Alexander Alekhin
964b260937 Merge pull request #2932 from ilya-lavrenov:tapi_other_vendors 2014-07-03 13:02:41 +00:00
Ilya Lavrenov
55d84cf815 optimization of cv::minMaxLoc - used min/max 2014-07-03 16:56:22 +04:00
Ilya Lavrenov
2fe07abf83 use vectors for devices of all vendors 2014-07-03 15:32:34 +04:00
Alexander Alekhin
d183554600 Merge pull request #2931 from alalek:mac_fix_master 2014-07-03 09:26:52 +00:00
Alexander Alekhin
e6c305cb75 Merge pull request #2897 from vbystricky:oclopt_sepFilter2D 2014-07-03 09:26:05 +00:00
Alexander Alekhin
c5d3c08256 ocl: add try-catch for OpenCL device getter 2014-07-03 12:18:19 +04:00
Ilya Lavrenov
93f8581b69 fixed warnings 2014-07-03 11:10:28 +04:00
Ilya Lavrenov
e5b63d43f2 sse2 optimization of inv_sqrt_64f 2014-07-03 01:33:49 +04:00
Alexander Alekhin
effff27c4e Merge pull request #2928 from ilya-lavrenov:tapi_warp_fix 2014-07-02 19:06:46 +00:00
Ilya Lavrenov
46e2216165 fixed cv::warpPerspective 2014-07-02 19:32:10 +04:00
Vadim Pisarevsky
c3329ff79d Merge pull request #2856 from sanchom:master 2014-07-02 14:22:56 +00:00
Vadim Pisarevsky
0e534b5a25 Merge pull request #2923 from alalek:ocl_default_device_ignore_cpu 2014-07-02 09:56:59 +00:00
Vadim Pisarevsky
d6233b13ba Merge pull request #2913 from ilya-lavrenov:sse2_precornerdetect 2014-07-02 09:55:51 +00:00
Alexander Alekhin
d65abcaedb Merge pull request #2830 from mlyashko:moments 2014-07-02 09:14:48 +00:00
Vadim Pisarevsky
15197eb09b Merge pull request #2911 from ilya-lavrenov:sse2_convert_scale_abs 2014-07-01 17:31:37 +00:00
Vadim Pisarevsky
fe4bdcd71b Merge pull request #2895 from fradelg:master 2014-07-01 17:16:22 +00:00
Alexander Alekhin
6bb8c46d9a Merge pull request #2906 from ilya-lavrenov:tapi_transpose 2014-07-01 13:21:35 +00:00
Alexander Alekhin
157257b072 ocl: don't use OpenCL CPU device in default setup 2014-07-01 14:25:31 +04:00
Ilya Lavrenov
972119bff3 sse2 optimization of cv::convertScaleAbs 2014-07-01 02:21:00 +04:00
Ilya Lavrenov
54e4ef657c optimized cv::transpose inplace 2014-07-01 00:36:13 +04:00
Ilya Lavrenov
9c8b9fc733 cv::transpose 2014-06-30 19:07:45 +04:00
Alexander Alekhin
cbd0511a56 Merge pull request #2907 from ilya-lavrenov:tapi_perf_transpose 2014-06-30 14:59:36 +00:00
Ilya Lavrenov
978f7eb44a added perf test for transpose inplace 2014-06-30 18:33:26 +04:00
Alexander Alekhin
acbabedac9 Merge pull request #2869 from ilya-lavrenov:tapi_warps 2014-06-30 11:59:13 +00:00
Alexander Alekhin
e0584bb818 Merge pull request #2876 from vbystricky:oclopt_integralsum 2014-06-30 10:06:54 +00:00
Alexander Alekhin
1493160f26 Merge pull request #2899 from ilya-lavrenov:tapi_ex 2014-06-30 10:05:24 +00:00
Alexander Alekhin
b304868d91 Merge pull request #2886 from ilya-lavrenov:tapi_inrange 2014-06-30 10:04:04 +00:00
Alexander Alekhin
667a9328fb Merge pull request #2829 from ilya-lavrenov:tapi_cvtcolor 2014-06-30 10:02:41 +00:00
Ilya Lavrenov
654bdde8ed SSE2 optimization of cv::preCornerDetect 2014-06-30 01:51:53 +04:00
Ilya Lavrenov
36db85a94d optimized some operations 2014-06-27 12:52:29 +04:00
Alexander Alekhin
2d81595ed4 Merge pull request #2852 from ilya-lavrenov:tapi_abs 2014-06-27 08:21:06 +00:00
Roman Donchenko
e8850bf84a Merge pull request #2626 from KayKwon:matlab_formatter 2014-06-26 17:40:26 +04:00
Roman Donchenko
1576e24c93 Merge pull request #2672 from a-wi:findContours 2014-06-26 17:35:08 +04:00
Roman Donchenko
e89e3066e8 Merge pull request #2774 from 23pointsNorth:lsd-nfa-fix 2014-06-26 17:29:27 +04:00
Roman Donchenko
e9bb750d4e Merge pull request #2858 from 23pointsNorth:patch-3 2014-06-26 17:24:25 +04:00
Roman Donchenko
b0a70787e1 Merge pull request #2824 from abidrahmank:pylsd 2014-06-26 17:22:54 +04:00
vbystricky
1a73aa1f6a Change local size 2014-06-26 15:43:40 +04:00
Ilya Lavrenov
16ab6ec534 ported changes from PR #2867 2014-06-26 13:52:44 +04:00