Merge pull request #3269 from asmorkalov:ocv_gstreamer3
This commit is contained in:
commit
e6f653af44
@ -150,9 +150,11 @@ protected:
|
|||||||
#endif
|
#endif
|
||||||
GstBuffer* buffer;
|
GstBuffer* buffer;
|
||||||
GstCaps* caps;
|
GstCaps* caps;
|
||||||
GstCaps* buffer_caps;
|
|
||||||
IplImage* frame;
|
IplImage* frame;
|
||||||
gint64 duration;
|
gint64 duration;
|
||||||
|
gint width;
|
||||||
|
gint height;
|
||||||
|
double fps;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -171,9 +173,11 @@ void CvCapture_GStreamer::init()
|
|||||||
#endif
|
#endif
|
||||||
buffer = NULL;
|
buffer = NULL;
|
||||||
caps = NULL;
|
caps = NULL;
|
||||||
buffer_caps = NULL;
|
|
||||||
frame = NULL;
|
frame = NULL;
|
||||||
duration = -1;
|
duration = -1;
|
||||||
|
width = -1;
|
||||||
|
height = -1;
|
||||||
|
fps = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -192,6 +196,9 @@ void CvCapture_GStreamer::close()
|
|||||||
}
|
}
|
||||||
|
|
||||||
duration = -1;
|
duration = -1;
|
||||||
|
width = -1;
|
||||||
|
height = -1;
|
||||||
|
fps = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@ -249,16 +256,10 @@ IplImage * CvCapture_GStreamer::retrieveFrame(int)
|
|||||||
//construct a frame header if we did not have any yet
|
//construct a frame header if we did not have any yet
|
||||||
if(!frame)
|
if(!frame)
|
||||||
{
|
{
|
||||||
gint height, width;
|
|
||||||
|
|
||||||
//reuse the caps ptr
|
|
||||||
if (buffer_caps)
|
|
||||||
gst_caps_unref(buffer_caps);
|
|
||||||
|
|
||||||
#if GST_VERSION_MAJOR == 0
|
#if GST_VERSION_MAJOR == 0
|
||||||
buffer_caps = gst_buffer_get_caps(buffer);
|
GstCaps* buffer_caps = gst_buffer_get_caps(buffer);
|
||||||
#else
|
#else
|
||||||
buffer_caps = gst_sample_get_caps(sample);
|
GstCaps* buffer_caps = gst_sample_get_caps(sample);
|
||||||
#endif
|
#endif
|
||||||
// bail out in no caps
|
// bail out in no caps
|
||||||
assert(gst_caps_get_size(buffer_caps) == 1);
|
assert(gst_caps_get_size(buffer_caps) == 1);
|
||||||
@ -268,10 +269,10 @@ IplImage * CvCapture_GStreamer::retrieveFrame(int)
|
|||||||
if(!gst_structure_get_int(structure, "width", &width) ||
|
if(!gst_structure_get_int(structure, "width", &width) ||
|
||||||
!gst_structure_get_int(structure, "height", &height))
|
!gst_structure_get_int(structure, "height", &height))
|
||||||
{
|
{
|
||||||
|
gst_caps_unref(buffer_caps);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int depth = 3;
|
int depth = 3;
|
||||||
#if GST_VERSION_MAJOR > 0
|
#if GST_VERSION_MAJOR > 0
|
||||||
depth = 0;
|
depth = 0;
|
||||||
@ -304,9 +305,12 @@ IplImage * CvCapture_GStreamer::retrieveFrame(int)
|
|||||||
#endif
|
#endif
|
||||||
if (depth > 0) {
|
if (depth > 0) {
|
||||||
frame = cvCreateImageHeader(cvSize(width, height), IPL_DEPTH_8U, depth);
|
frame = cvCreateImageHeader(cvSize(width, height), IPL_DEPTH_8U, depth);
|
||||||
}else{
|
} else {
|
||||||
|
gst_caps_unref(buffer_caps);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gst_caps_unref(buffer_caps);
|
||||||
}
|
}
|
||||||
|
|
||||||
// gstreamer expects us to handle the memory at this point
|
// gstreamer expects us to handle the memory at this point
|
||||||
@ -782,12 +786,42 @@ bool CvCapture_GStreamer::open( int type, const char* filename )
|
|||||||
handleMessage(pipeline);
|
handleMessage(pipeline);
|
||||||
CV_WARN("GStreamer: unable to query duration of stream");
|
CV_WARN("GStreamer: unable to query duration of stream");
|
||||||
duration = -1;
|
duration = -1;
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GstPad* pad = gst_element_get_static_pad(color, "src");
|
||||||
|
#if GST_VERSION_MAJOR == 0
|
||||||
|
GstCaps* buffer_caps = gst_pad_get_caps(pad);
|
||||||
|
#else
|
||||||
|
GstCaps* buffer_caps = gst_pad_get_current_caps(pad);
|
||||||
|
#endif
|
||||||
|
const GstStructure *structure = gst_caps_get_structure (buffer_caps, 0);
|
||||||
|
|
||||||
|
if (!gst_structure_get_int (structure, "width", &width))
|
||||||
|
{
|
||||||
|
CV_WARN("Cannot query video width\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!gst_structure_get_int (structure, "height", &height))
|
||||||
|
{
|
||||||
|
CV_WARN("Cannot query video heigth\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
gint num = 0, denom=1;
|
||||||
|
if(!gst_structure_get_fraction(structure, "framerate", &num, &denom))
|
||||||
|
{
|
||||||
|
CV_WARN("Cannot query video fps\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
fps = (double)num/(double)denom;
|
||||||
|
|
||||||
|
// GST_DEBUG_BIN_TO_DOT_FILE(GST_BIN(pipeline), GST_DEBUG_GRAPH_SHOW_ALL, "pipeline");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
duration = -1;
|
duration = -1;
|
||||||
|
width = -1;
|
||||||
|
height = -1;
|
||||||
|
fps = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
__END__;
|
__END__;
|
||||||
@ -846,48 +880,12 @@ double CvCapture_GStreamer::getProperty( int propId )
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return ((double) value) / GST_FORMAT_PERCENT_MAX;
|
return ((double) value) / GST_FORMAT_PERCENT_MAX;
|
||||||
case CV_CAP_PROP_FRAME_WIDTH: {
|
case CV_CAP_PROP_FRAME_WIDTH:
|
||||||
if (!buffer_caps){
|
|
||||||
CV_WARN("GStreamer: unable to query width of frame; no frame grabbed yet");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
GstStructure* structure = gst_caps_get_structure(buffer_caps, 0);
|
|
||||||
gint width = 0;
|
|
||||||
if(!gst_structure_get_int(structure, "width", &width)){
|
|
||||||
CV_WARN("GStreamer: unable to query width of frame");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return width;
|
return width;
|
||||||
break;
|
case CV_CAP_PROP_FRAME_HEIGHT:
|
||||||
}
|
|
||||||
case CV_CAP_PROP_FRAME_HEIGHT: {
|
|
||||||
if (!buffer_caps){
|
|
||||||
CV_WARN("GStreamer: unable to query height of frame; no frame grabbed yet");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
GstStructure* structure = gst_caps_get_structure(buffer_caps, 0);
|
|
||||||
gint height = 0;
|
|
||||||
if(!gst_structure_get_int(structure, "height", &height)){
|
|
||||||
CV_WARN("GStreamer: unable to query height of frame");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return height;
|
return height;
|
||||||
break;
|
case CV_CAP_PROP_FPS:
|
||||||
}
|
return fps;
|
||||||
case CV_CAP_PROP_FPS: {
|
|
||||||
if (!buffer_caps){
|
|
||||||
CV_WARN("GStreamer: unable to query framerate of stream; no frame grabbed yet");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
GstStructure* structure = gst_caps_get_structure(buffer_caps, 0);
|
|
||||||
gint num = 0, denom=1;
|
|
||||||
if(!gst_structure_get_fraction(structure, "framerate", &num, &denom)){
|
|
||||||
CV_WARN("GStreamer: unable to query framerate of stream");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return (double)num/(double)denom;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case CV_CAP_PROP_FOURCC:
|
case CV_CAP_PROP_FOURCC:
|
||||||
break;
|
break;
|
||||||
case CV_CAP_PROP_FRAME_COUNT:
|
case CV_CAP_PROP_FRAME_COUNT:
|
||||||
@ -1225,8 +1223,11 @@ bool CvVideoWriter_GStreamer::open( const char * filename, int fourcc,
|
|||||||
gboolean done = FALSE;
|
gboolean done = FALSE;
|
||||||
GstElement *element = NULL;
|
GstElement *element = NULL;
|
||||||
gchar* name = NULL;
|
gchar* name = NULL;
|
||||||
|
|
||||||
|
#if GST_VERSION_MAJOR == 0
|
||||||
GstElement* splitter = NULL;
|
GstElement* splitter = NULL;
|
||||||
GstElement* combiner = NULL;
|
GstElement* combiner = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
// we first try to construct a pipeline from the given string.
|
// we first try to construct a pipeline from the given string.
|
||||||
// if that fails, we assume it is an ordinary filename
|
// if that fails, we assume it is an ordinary filename
|
||||||
|
157
modules/videoio/test/test_basic_props.cpp
Normal file
157
modules/videoio/test/test_basic_props.cpp
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||||
|
//
|
||||||
|
// By downloading, copying, installing or using the software you agree to this license.
|
||||||
|
// If you do not agree to this license, do not download, install,
|
||||||
|
// copy or use the software.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// License Agreement
|
||||||
|
// For Open Source Computer Vision Library
|
||||||
|
//
|
||||||
|
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||||
|
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
|
||||||
|
// Third party copyrights are property of their respective owners.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
// are permitted provided that the following conditions are met:
|
||||||
|
//
|
||||||
|
// * Redistribution's of source code must retain the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer.
|
||||||
|
//
|
||||||
|
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||||
|
// this list of conditions and the following disclaimer in the documentation
|
||||||
|
// and/or other materials provided with the distribution.
|
||||||
|
//
|
||||||
|
// * The name of the copyright holders may not be used to endorse or promote products
|
||||||
|
// derived from this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// This software is provided by the copyright holders and contributors "as is" and
|
||||||
|
// any express or implied warranties, including, but not limited to, the implied
|
||||||
|
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||||
|
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||||
|
// indirect, incidental, special, exemplary, or consequential damages
|
||||||
|
// (including, but not limited to, procurement of substitute goods or services;
|
||||||
|
// loss of use, data, or profits; or business interruption) however caused
|
||||||
|
// and on any theory of liability, whether in contract, strict liability,
|
||||||
|
// or tort (including negligence or otherwise) arising in any way out of
|
||||||
|
// the use of this software, even if advised of the possibility of such damage.
|
||||||
|
//
|
||||||
|
//M*/
|
||||||
|
|
||||||
|
#include "test_precomp.hpp"
|
||||||
|
#include "opencv2/videoio.hpp"
|
||||||
|
#include "opencv2/ts.hpp"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#if BUILD_WITH_VIDEO_INPUT_SUPPORT
|
||||||
|
|
||||||
|
using namespace cv;
|
||||||
|
using namespace std;
|
||||||
|
using namespace cvtest;
|
||||||
|
|
||||||
|
#ifdef HAVE_GSTREAMER
|
||||||
|
const string ext[] = {"avi"};
|
||||||
|
#else
|
||||||
|
const string ext[] = {"avi", "mov", "mp4"};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
TEST(Videoio_Video, prop_resolution)
|
||||||
|
{
|
||||||
|
const size_t n = sizeof(ext)/sizeof(ext[0]);
|
||||||
|
const string src_dir = TS::ptr()->get_data_path();
|
||||||
|
|
||||||
|
TS::ptr()->printf(cvtest::TS::LOG, "\n\nSource files directory: %s\n", (src_dir+"video/").c_str());
|
||||||
|
|
||||||
|
for (size_t i = 0; i < n; ++i)
|
||||||
|
{
|
||||||
|
string file_path = src_dir+"video/big_buck_bunny."+ext[i];
|
||||||
|
VideoCapture cap(file_path);
|
||||||
|
if (!cap.isOpened())
|
||||||
|
{
|
||||||
|
TS::ptr()->printf(cvtest::TS::LOG, "\nFile information (video %d): \n\nName: big_buck_bunny.%s\nFAILED\n\n", i+1, ext[i].c_str());
|
||||||
|
TS::ptr()->printf(cvtest::TS::LOG, "Error: cannot read source video file.\n");
|
||||||
|
TS::ptr()->set_failed_test_info(cvtest::TS::FAIL_INVALID_TEST_DATA);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT_EQ(672, cap.get(CAP_PROP_FRAME_WIDTH));
|
||||||
|
ASSERT_EQ(384, cap.get(CAP_PROP_FRAME_HEIGHT));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(Videoio_Video, actual_resolution)
|
||||||
|
{
|
||||||
|
const size_t n = sizeof(ext)/sizeof(ext[0]);
|
||||||
|
const string src_dir = TS::ptr()->get_data_path();
|
||||||
|
|
||||||
|
TS::ptr()->printf(cvtest::TS::LOG, "\n\nSource files directory: %s\n", (src_dir+"video/").c_str());
|
||||||
|
|
||||||
|
for (size_t i = 0; i < n; ++i)
|
||||||
|
{
|
||||||
|
string file_path = src_dir+"video/big_buck_bunny."+ext[i];
|
||||||
|
VideoCapture cap(file_path);
|
||||||
|
if (!cap.isOpened())
|
||||||
|
{
|
||||||
|
TS::ptr()->printf(cvtest::TS::LOG, "\nFile information (video %d): \n\nName: big_buck_bunny.%s\nFAILED\n\n", i+1, ext[i].c_str());
|
||||||
|
TS::ptr()->printf(cvtest::TS::LOG, "Error: cannot read source video file.\n");
|
||||||
|
TS::ptr()->set_failed_test_info(cvtest::TS::FAIL_INVALID_TEST_DATA);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Mat frame;
|
||||||
|
cap >> frame;
|
||||||
|
|
||||||
|
ASSERT_EQ(672, frame.cols);
|
||||||
|
ASSERT_EQ(384, frame.rows);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(Videoio_Video, prop_fps)
|
||||||
|
{
|
||||||
|
const size_t n = sizeof(ext)/sizeof(ext[0]);
|
||||||
|
const string src_dir = TS::ptr()->get_data_path();
|
||||||
|
|
||||||
|
TS::ptr()->printf(cvtest::TS::LOG, "\n\nSource files directory: %s\n", (src_dir+"video/").c_str());
|
||||||
|
|
||||||
|
for (size_t i = 0; i < n; ++i)
|
||||||
|
{
|
||||||
|
string file_path = src_dir+"video/big_buck_bunny."+ext[i];
|
||||||
|
VideoCapture cap(file_path);
|
||||||
|
if (!cap.isOpened())
|
||||||
|
{
|
||||||
|
TS::ptr()->printf(cvtest::TS::LOG, "\nFile information (video %d): \n\nName: big_buck_bunny.%s\nFAILED\n\n", i+1, ext[i].c_str());
|
||||||
|
TS::ptr()->printf(cvtest::TS::LOG, "Error: cannot read source video file.\n");
|
||||||
|
TS::ptr()->set_failed_test_info(cvtest::TS::FAIL_INVALID_TEST_DATA);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT_EQ(24, cap.get(CAP_PROP_FPS));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(Videoio_Video, prop_framecount)
|
||||||
|
{
|
||||||
|
const size_t n = sizeof(ext)/sizeof(ext[0]);
|
||||||
|
const string src_dir = TS::ptr()->get_data_path();
|
||||||
|
|
||||||
|
TS::ptr()->printf(cvtest::TS::LOG, "\n\nSource files directory: %s\n", (src_dir+"video/").c_str());
|
||||||
|
|
||||||
|
for (size_t i = 0; i < n; ++i)
|
||||||
|
{
|
||||||
|
string file_path = src_dir+"video/big_buck_bunny."+ext[i];
|
||||||
|
VideoCapture cap(file_path);
|
||||||
|
if (!cap.isOpened())
|
||||||
|
{
|
||||||
|
TS::ptr()->printf(cvtest::TS::LOG, "\nFile information (video %d): \n\nName: big_buck_bunny.%s\nFAILED\n\n", i+1, ext[i].c_str());
|
||||||
|
TS::ptr()->printf(cvtest::TS::LOG, "Error: cannot read source video file.\n");
|
||||||
|
TS::ptr()->set_failed_test_info(cvtest::TS::FAIL_INVALID_TEST_DATA);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT_EQ(125, cap.get(CAP_PROP_FRAME_COUNT));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user