backend_static.cpp 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. // This file is part of OpenCV project.
  2. // It is subject to the license terms in the LICENSE file found in the top-level directory
  3. // of this distribution and at http://opencv.org/license.html.
  4. #include "precomp.hpp"
  5. #include "backend.hpp"
  6. namespace cv {
  7. void applyParametersFallback(const Ptr<IVideoCapture>& cap, const VideoCaptureParameters& params)
  8. {
  9. std::vector<int> props = params.getUnused();
  10. CV_LOG_INFO(NULL, "VIDEOIO: Backend '" << videoio_registry::getBackendName((VideoCaptureAPIs)cap->getCaptureDomain()) <<
  11. "' implementation doesn't support parameters in .open(). Applying " <<
  12. props.size() << " properties through .setProperty()");
  13. for (int prop : props)
  14. {
  15. double value = params.get<double>(prop, -1);
  16. CV_LOG_INFO(NULL, "VIDEOIO: apply parameter: [" << prop << "]=" <<
  17. cv::format("%g / %lld / 0x%016llx", value, (long long)value, (long long)value));
  18. if (!cap->setProperty(prop, value))
  19. {
  20. if (prop != CAP_PROP_HW_ACCELERATION && prop != CAP_PROP_HW_DEVICE) { // optional parameters
  21. CV_Error_(cv::Error::StsNotImplemented, ("VIDEOIO: Failed to apply invalid or unsupported parameter: [%d]=%g / %lld / 0x%08llx", prop, value, (long long)value, (long long)value));
  22. }
  23. }
  24. }
  25. // NB: there is no dedicated "commit" parameters event, implementations should commit after each property automatically
  26. }
  27. // Legacy API. Modern API with parameters is below
  28. class StaticBackend: public IBackend
  29. {
  30. public:
  31. FN_createCaptureFile fn_createCaptureFile_;
  32. FN_createCaptureCamera fn_createCaptureCamera_;
  33. FN_createWriter fn_createWriter_;
  34. StaticBackend(FN_createCaptureFile fn_createCaptureFile, FN_createCaptureCamera fn_createCaptureCamera, FN_createWriter fn_createWriter)
  35. : fn_createCaptureFile_(fn_createCaptureFile), fn_createCaptureCamera_(fn_createCaptureCamera), fn_createWriter_(fn_createWriter)
  36. {
  37. // nothing
  38. }
  39. ~StaticBackend() CV_OVERRIDE {}
  40. Ptr<IVideoCapture> createCapture(int camera, const VideoCaptureParameters& params) const CV_OVERRIDE
  41. {
  42. if (fn_createCaptureCamera_)
  43. {
  44. Ptr<IVideoCapture> cap = fn_createCaptureCamera_(camera);
  45. if (cap && !params.empty())
  46. {
  47. applyParametersFallback(cap, params);
  48. }
  49. return cap;
  50. }
  51. return Ptr<IVideoCapture>();
  52. }
  53. Ptr<IVideoCapture> createCapture(const std::string &filename, const VideoCaptureParameters& params) const CV_OVERRIDE
  54. {
  55. if (fn_createCaptureFile_)
  56. {
  57. Ptr<IVideoCapture> cap = fn_createCaptureFile_(filename);
  58. if (cap && !params.empty())
  59. {
  60. applyParametersFallback(cap, params);
  61. }
  62. return cap;
  63. }
  64. return Ptr<IVideoCapture>();
  65. }
  66. Ptr<IVideoWriter> createWriter(const std::string& filename, int fourcc, double fps,
  67. const cv::Size& sz, const VideoWriterParameters& params) const CV_OVERRIDE
  68. {
  69. if (fn_createWriter_)
  70. return fn_createWriter_(filename, fourcc, fps, sz, params);
  71. return Ptr<IVideoWriter>();
  72. }
  73. }; // StaticBackend
  74. class StaticBackendFactory : public IBackendFactory
  75. {
  76. protected:
  77. Ptr<StaticBackend> backend;
  78. public:
  79. StaticBackendFactory(FN_createCaptureFile createCaptureFile, FN_createCaptureCamera createCaptureCamera, FN_createWriter createWriter)
  80. : backend(makePtr<StaticBackend>(createCaptureFile, createCaptureCamera, createWriter))
  81. {
  82. // nothing
  83. }
  84. ~StaticBackendFactory() CV_OVERRIDE {}
  85. Ptr<IBackend> getBackend() const CV_OVERRIDE
  86. {
  87. return backend.staticCast<IBackend>();
  88. }
  89. bool isBuiltIn() const CV_OVERRIDE { return true; }
  90. };
  91. Ptr<IBackendFactory> createBackendFactory(FN_createCaptureFile createCaptureFile,
  92. FN_createCaptureCamera createCaptureCamera,
  93. FN_createWriter createWriter)
  94. {
  95. return makePtr<StaticBackendFactory>(createCaptureFile, createCaptureCamera, createWriter).staticCast<IBackendFactory>();
  96. }
  97. class StaticBackendWithParams: public IBackend
  98. {
  99. public:
  100. FN_createCaptureFileWithParams fn_createCaptureFile_;
  101. FN_createCaptureCameraWithParams fn_createCaptureCamera_;
  102. FN_createWriter fn_createWriter_;
  103. StaticBackendWithParams(FN_createCaptureFileWithParams fn_createCaptureFile, FN_createCaptureCameraWithParams fn_createCaptureCamera, FN_createWriter fn_createWriter)
  104. : fn_createCaptureFile_(fn_createCaptureFile), fn_createCaptureCamera_(fn_createCaptureCamera), fn_createWriter_(fn_createWriter)
  105. {
  106. // nothing
  107. }
  108. ~StaticBackendWithParams() CV_OVERRIDE {}
  109. Ptr<IVideoCapture> createCapture(int camera, const VideoCaptureParameters& params) const CV_OVERRIDE
  110. {
  111. if (fn_createCaptureCamera_)
  112. return fn_createCaptureCamera_(camera, params);
  113. return Ptr<IVideoCapture>();
  114. }
  115. Ptr<IVideoCapture> createCapture(const std::string &filename, const VideoCaptureParameters& params) const CV_OVERRIDE
  116. {
  117. if (fn_createCaptureFile_)
  118. return fn_createCaptureFile_(filename, params);
  119. return Ptr<IVideoCapture>();
  120. }
  121. Ptr<IVideoWriter> createWriter(const std::string& filename, int fourcc, double fps,
  122. const cv::Size& sz, const VideoWriterParameters& params) const CV_OVERRIDE
  123. {
  124. if (fn_createWriter_)
  125. return fn_createWriter_(filename, fourcc, fps, sz, params);
  126. return Ptr<IVideoWriter>();
  127. }
  128. }; // StaticBackendWithParams
  129. class StaticBackendWithParamsFactory : public IBackendFactory
  130. {
  131. protected:
  132. Ptr<StaticBackendWithParams> backend;
  133. public:
  134. StaticBackendWithParamsFactory(FN_createCaptureFileWithParams createCaptureFile, FN_createCaptureCameraWithParams createCaptureCamera, FN_createWriter createWriter)
  135. : backend(makePtr<StaticBackendWithParams>(createCaptureFile, createCaptureCamera, createWriter))
  136. {
  137. // nothing
  138. }
  139. ~StaticBackendWithParamsFactory() CV_OVERRIDE {}
  140. Ptr<IBackend> getBackend() const CV_OVERRIDE
  141. {
  142. return backend.staticCast<IBackend>();
  143. }
  144. bool isBuiltIn() const CV_OVERRIDE { return true; }
  145. };
  146. Ptr<IBackendFactory> createBackendFactory(FN_createCaptureFileWithParams createCaptureFile,
  147. FN_createCaptureCameraWithParams createCaptureCamera,
  148. FN_createWriter createWriter)
  149. {
  150. return makePtr<StaticBackendWithParamsFactory>(createCaptureFile, createCaptureCamera, createWriter).staticCast<IBackendFactory>();
  151. }
  152. } // namespace