@@ -564,20 +564,40 @@ class PluginCapture : public cv::IVideoCapture
564564public:
565565 static
566566 Ptr<PluginCapture> create (const OpenCV_VideoIO_Capture_Plugin_API* plugin_api,
567- const std::string &filename, int camera)
567+ const std::string &filename, int camera, const VideoCaptureParameters& params )
568568 {
569569 CV_Assert (plugin_api);
570+ CV_Assert (plugin_api->v0 .Capture_release );
571+
570572 CvPluginCapture capture = NULL ;
571573
572- if (plugin_api->v0 . Capture_open )
574+ if (plugin_api->api_header . api_version >= 1 && plugin_api-> v1 . Capture_open_with_params )
573575 {
574- CV_Assert (plugin_api->v0 .Capture_release );
575- if (CV_ERROR_OK == plugin_api->v0 .Capture_open (filename.empty () ? 0 : filename.c_str (), camera, &capture))
576+ std::vector<int > vint_params = params.getIntVector ();
577+ int * c_params = &vint_params[0 ];
578+ unsigned n_params = (unsigned )(vint_params.size () / 2 );
579+
580+ if (CV_ERROR_OK == plugin_api->v1 .Capture_open_with_params (
581+ filename.empty () ? 0 : filename.c_str (), camera, c_params, n_params, &capture))
576582 {
577583 CV_Assert (capture);
578584 return makePtr<PluginCapture>(plugin_api, capture);
579585 }
580586 }
587+ else if (plugin_api->v0 .Capture_open )
588+ {
589+ if (CV_ERROR_OK == plugin_api->v0 .Capture_open (filename.empty () ? 0 : filename.c_str (), camera, &capture))
590+ {
591+ CV_Assert (capture);
592+ Ptr<PluginCapture> cap = makePtr<PluginCapture>(plugin_api, capture);
593+ if (cap && !params.empty ())
594+ {
595+ applyParametersFallback (cap, params);
596+ }
597+ return cap;
598+ }
599+ }
600+
581601 return Ptr<PluginCapture>();
582602 }
583603
@@ -658,11 +678,13 @@ class PluginWriter : public cv::IVideoWriter
658678 const VideoWriterParameters& params)
659679 {
660680 CV_Assert (plugin_api);
681+ CV_Assert (plugin_api->v0 .Writer_release );
682+ CV_Assert (!filename.empty ());
683+
661684 CvPluginWriter writer = NULL ;
685+
662686 if (plugin_api->api_header .api_version >= 1 && plugin_api->v1 .Writer_open_with_params )
663687 {
664- CV_Assert (plugin_api->v0 .Writer_release );
665- CV_Assert (!filename.empty ());
666688 std::vector<int > vint_params = params.getIntVector ();
667689 int * c_params = &vint_params[0 ];
668690 unsigned n_params = (unsigned )(vint_params.size () / 2 );
@@ -675,21 +697,25 @@ class PluginWriter : public cv::IVideoWriter
675697 }
676698 else if (plugin_api->v0 .Writer_open )
677699 {
678- CV_Assert (plugin_api->v0 .Writer_release );
679- CV_Assert (!filename.empty ());
680700 const bool isColor = params.get (VIDEOWRITER_PROP_IS_COLOR, true );
681701 const int depth = params.get (VIDEOWRITER_PROP_DEPTH, CV_8U);
682702 if (depth != CV_8U)
683703 {
684704 CV_LOG_WARNING (NULL , " Video I/O plugin doesn't support (due to lower API level) creation of VideoWriter with depth != CV_8U" );
685705 return Ptr<PluginWriter>();
686706 }
707+ if (params.warnUnusedParameters ())
708+ {
709+ CV_LOG_ERROR (NULL , " VIDEOIO/FFMPEG: unsupported parameters in VideoWriter, see logger INFO channel for details" );
710+ return Ptr<PluginWriter>();
711+ }
687712 if (CV_ERROR_OK == plugin_api->v0 .Writer_open (filename.c_str (), fourcc, fps, sz.width , sz.height , isColor, &writer))
688713 {
689714 CV_Assert (writer);
690715 return makePtr<PluginWriter>(plugin_api, writer);
691716 }
692717 }
718+
693719 return Ptr<PluginWriter>();
694720 }
695721
@@ -743,14 +769,21 @@ class PluginWriter : public cv::IVideoWriter
743769};
744770
745771
746- Ptr<IVideoCapture> PluginBackend::createCapture (int camera) const
772+ Ptr<IVideoCapture> PluginBackend::createCapture (int camera, const VideoCaptureParameters& params ) const
747773{
748774 try
749775 {
750776 if (capture_api_)
751- return PluginCapture::create (capture_api_, std::string (), camera); // .staticCast<IVideoCapture>();
777+ return PluginCapture::create (capture_api_, std::string (), camera, params ); // .staticCast<IVideoCapture>();
752778 if (plugin_api_)
753- return legacy::PluginCapture::create (plugin_api_, std::string (), camera); // .staticCast<IVideoCapture>();
779+ {
780+ Ptr<IVideoCapture> cap = legacy::PluginCapture::create (plugin_api_, std::string (), camera); // .staticCast<IVideoCapture>();
781+ if (cap && !params.empty ())
782+ {
783+ applyParametersFallback (cap, params);
784+ }
785+ return cap;
786+ }
754787 }
755788 catch (...)
756789 {
@@ -760,25 +793,21 @@ Ptr<IVideoCapture> PluginBackend::createCapture(int camera) const
760793 return Ptr<IVideoCapture>();
761794}
762795
763- Ptr<IVideoCapture> PluginBackend::createCapture (int camera, const VideoCaptureParameters& params) const
764- {
765- // TODO Update plugins API to support parameters
766- Ptr<IVideoCapture> cap = createCapture (camera);
767- if (cap && !params.empty ())
768- {
769- applyParametersFallback (cap, params);
770- }
771- return cap;
772- }
773-
774- Ptr<IVideoCapture> PluginBackend::createCapture (const std::string &filename) const
796+ Ptr<IVideoCapture> PluginBackend::createCapture (const std::string &filename, const VideoCaptureParameters& params) const
775797{
776798 try
777799 {
778800 if (capture_api_)
779- return PluginCapture::create (capture_api_, filename, 0 ); // .staticCast<IVideoCapture>();
801+ return PluginCapture::create (capture_api_, filename, 0 , params ); // .staticCast<IVideoCapture>();
780802 if (plugin_api_)
781- return legacy::PluginCapture::create (plugin_api_, filename, 0 ); // .staticCast<IVideoCapture>();
803+ {
804+ Ptr<IVideoCapture> cap = legacy::PluginCapture::create (plugin_api_, filename, 0 ); // .staticCast<IVideoCapture>();
805+ if (cap && !params.empty ())
806+ {
807+ applyParametersFallback (cap, params);
808+ }
809+ return cap;
810+ }
782811 }
783812 catch (...)
784813 {
@@ -788,17 +817,6 @@ Ptr<IVideoCapture> PluginBackend::createCapture(const std::string &filename) con
788817 return Ptr<IVideoCapture>();
789818}
790819
791- Ptr<IVideoCapture> PluginBackend::createCapture (const std::string &filename, const VideoCaptureParameters& params) const
792- {
793- // TODO Update plugins API to support parameters
794- Ptr<IVideoCapture> cap = createCapture (filename);
795- if (cap && !params.empty ())
796- {
797- applyParametersFallback (cap, params);
798- }
799- return cap;
800- }
801-
802820Ptr<IVideoWriter> PluginBackend::createWriter (const std::string& filename, int fourcc, double fps,
803821 const cv::Size& sz, const VideoWriterParameters& params) const
804822{
0 commit comments