diff --git a/modules/videoio/include/opencv2/videoio.hpp b/modules/videoio/include/opencv2/videoio.hpp index 54f42fd9a8..d0ec8a7c82 100644 --- a/modules/videoio/include/opencv2/videoio.hpp +++ b/modules/videoio/include/opencv2/videoio.hpp @@ -170,6 +170,7 @@ enum VideoCaptureProperties { CAP_PROP_SAR_NUM =40, //!< Sample aspect ratio: num/den (num) CAP_PROP_SAR_DEN =41, //!< Sample aspect ratio: num/den (den) CAP_PROP_BACKEND =42, //!< current backend (enum VideoCaptureAPIs). Read-only property + CAP_CROSSBAR_INPIN_TYPE =43, //!connection = PhysConn_Video_1394; break; + case 5: + VDList[id]->connection = PhysConn_Video_YRYBY; + break; + case 6: + VDList[id]->connection = PhysConn_Video_SerialDigital; + break; default: return; //if it is not these types don't set crossbar break; @@ -2449,6 +2455,9 @@ static bool setSizeAndSubtype(videoDevice * VD, int attemptWidth, int attemptHei //width and height HEADER(pVih)->biWidth = attemptWidth; HEADER(pVih)->biHeight = attemptHeight; + pVih->rcSource.top = pVih->rcSource.left = pVih->rcTarget.top =pVih->rcTarget.left=0; + pVih->rcSource.right = pVih->rcTarget.right= attemptWidth; + pVih->rcSource.bottom = pVih->rcTarget.bottom = attemptHeight; VD->pAmMediaType->formattype = FORMAT_VideoInfo; VD->pAmMediaType->majortype = MEDIATYPE_Video; @@ -3269,6 +3278,14 @@ bool VideoCapture_DShow::setProperty(int propIdx, double propVal) handled = true; break; + case CAP_CROSSBAR_INPIN_TYPE: + + if (cvFloor(propVal) < 0) + break; + g_VI.stopDevice(m_index); + g_VI.setupDevice(m_index, cvFloor(propVal)); + break; + case CV_CAP_PROP_FPS: { int fps = cvRound(propVal); diff --git a/modules/videoio/test/test_camera.cpp b/modules/videoio/test/test_camera.cpp index 9a7e266846..ef66dca8d9 100644 --- a/modules/videoio/test/test_camera.cpp +++ b/modules/videoio/test/test_camera.cpp @@ -38,4 +38,33 @@ TEST(DISABLED_VideoIO_Camera, basic) capture.release(); } +//Following test if for capture device using PhysConn_Video_SerialDigital as crossbar input pin +TEST(DISABLED_VideoIO_Camera, dshow_avermedia_capture) +{ + VideoCapture capture(0); + ASSERT_TRUE(capture.isOpened()); + capture.set(CAP_CROSSBAR_INPIN_TYPE, 6); + std::cout << "Camera 0 via " << capture.getBackendName() << " backend" << std::endl; + std::cout << "Frame width: " << capture.get(CAP_PROP_FRAME_WIDTH) << std::endl; + std::cout << " height: " << capture.get(CAP_PROP_FRAME_HEIGHT) << std::endl; + std::cout << "Capturing FPS: " << capture.get(CAP_PROP_FPS) << std::endl; + + const int N = 100; + Mat frame; + int64 time0 = cv::getTickCount(); + for (int i = 0; i < N; i++) + { + SCOPED_TRACE(cv::format("frame=%d", i)); + + capture >> frame; + ASSERT_FALSE(frame.empty()); + + EXPECT_GT(cvtest::norm(frame, NORM_INF), 0) << "Complete black image has been received"; + } + int64 time1 = cv::getTickCount(); + printf("Processed %d frames on %.2f FPS\n", N, (N * cv::getTickFrequency()) / (time1 - time0 + 1)); + + capture.release(); +} + }} // namespace