CV_CAP_OPENNI_IMAGE_GENERATOR = 1 << 31,
CV_CAP_OPENNI_GENERATORS_MASK = 1 << 31,
- // Properties of cameras avalible through OpenNI interfaces
+ // Properties of cameras available through OpenNI interfaces
CV_CAP_PROP_OPENNI_OUTPUT_MODE = 100,
CV_CAP_PROP_OPENNI_FRAME_MAX_DEPTH = 101, // in mm
CV_CAP_PROP_OPENNI_BASELINE = 102, // in mm
CV_CAP_PROP_OPENNI_FOCAL_LENGTH = 103, // in pixels
CV_CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE = CV_CAP_OPENNI_IMAGE_GENERATOR + CV_CAP_PROP_OPENNI_OUTPUT_MODE,
CV_CAP_OPENNI_DEPTH_GENERATOR_BASELINE = CV_CAP_OPENNI_DEPTH_GENERATOR + CV_CAP_PROP_OPENNI_BASELINE,
- CV_CAP_OPENNI_DEPTH_GENERATOR_FOCAL_LENGTH = CV_CAP_OPENNI_DEPTH_GENERATOR + CV_CAP_PROP_OPENNI_FOCAL_LENGTH
+ CV_CAP_OPENNI_DEPTH_GENERATOR_FOCAL_LENGTH = CV_CAP_OPENNI_DEPTH_GENERATOR + CV_CAP_PROP_OPENNI_FOCAL_LENGTH,
+
+ // Properties of cameras available through GStreamer interface
+ CV_CAP_GSTREAMER_QUEUE_LENGTH = 200 // default is 1
};
enum
GstCaps *caps;
IplImage *frame;
};
+
void CvCapture_GStreamer::init()
{
pipeline=0;
else
#endif
{
+// printf("pulling buffer\n");
buffer = gst_app_sink_pull_buffer(GST_APP_SINK(sink));
+// printf("pulled buffer %p\n", GST_BUFFER_DATA(buffer));
}
if(!buffer)
return false;
if(!buffer)
return false;
+// printf("retrieving buffer %p\n", GST_BUFFER_DATA(buffer));
+
if(!frame) {
gint height, width;
GstCaps *buff_caps = gst_buffer_get_caps(buffer);
GstStructure* structure = gst_caps_get_structure(buff_caps, 0);
if(!gst_structure_get_int(structure, "width", &width) ||
- !gst_structure_get_int(structure, "height", &height))
+ !gst_structure_get_int(structure, "height", &height))
return false;
- frame = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3);
+ frame = cvCreateImageHeader(cvSize(width, height), IPL_DEPTH_8U, 3);
gst_caps_unref(buff_caps);
}
- memcpy (frame->imageData, GST_BUFFER_DATA(buffer), GST_BUFFER_SIZE (buffer));
+ frame->imageData = (char *)GST_BUFFER_DATA(buffer);
+ //memcpy (frame->imageData, GST_BUFFER_DATA(buffer), GST_BUFFER_SIZE (buffer));
//gst_data_copy_into (frame->imageData,GST_BUFFER_DATA(buffer));
- gst_buffer_unref(buffer);
- buffer = 0;
+ //gst_buffer_unref(buffer);
+ //buffer = 0;
return frame;
}
gst_object_unref (sinkpad);
}
+// static int buffernum = 0;
+// static GstFlowReturn newbuffer(GstAppSink *sink, gpointer data)
+// {
+ // printf("new buffer %d\n", buffernum);
+ // buffernum++;
+ // return GST_FLOW_OK;
+// }
+
bool CvCapture_GStreamer::open( int type, const char* filename )
{
close();
if (stream) {
gst_app_sink_set_drop (GST_APP_SINK(sink),true);
}
+// GstAppSinkCallbacks cb = {0, 0, newbuffer, 0};
+// gst_app_sink_set_callbacks(GST_APP_SINK(sink), &cb, 0, 0);
#else
sink = gst_element_factory_make("opencv-appsink", NULL);
#endif
}
void CvVideoWriter_GStreamer::close()
{
- if (pipeline) {
- gst_app_src_end_of_stream(GST_APP_SRC(source));
- gst_element_set_state (pipeline, GST_STATE_NULL);
- gst_object_unref (GST_OBJECT (pipeline));
- }
+ if (pipeline) {
+ gst_app_src_end_of_stream(GST_APP_SRC(source));
+ gst_element_set_state (pipeline, GST_STATE_NULL);
+ gst_object_unref (GST_OBJECT (pipeline));
+ }
}
bool CvVideoWriter_GStreamer::open( const char * filename, int fourcc,
double fps, CvSize frameSize, bool is_color )
}
if(buffer)
gst_buffer_unref(buffer);
+ if(frame) {
+ frame->imageData = 0;
+ cvReleaseImage(&frame);
+ }
}
double CvCapture_GStreamer::getProperty( int propId )
switch(propId) {
case CV_CAP_PROP_POS_MSEC:
format = GST_FORMAT_TIME;
- if(!gst_element_query_position(pipeline, &format, &value)) {
+ if(!gst_element_query_position(sink, &format, &value)) {
CV_WARN("GStreamer: unable to query position of stream");
return false;
}
return value * 1e-6; // nano seconds to milli seconds
case CV_CAP_PROP_POS_FRAMES:
format = GST_FORMAT_DEFAULT;
- if(!gst_element_query_position(pipeline, &format, &value)) {
+ if(!gst_element_query_position(sink, &format, &value)) {
CV_WARN("GStreamer: unable to query position of stream");
return false;
}
case CV_CAP_PROP_GAIN:
case CV_CAP_PROP_CONVERT_RGB:
break;
+ case CV_CAP_GSTREAMER_QUEUE_LENGTH:
+ if(!sink) {
+ CV_WARN("GStreamer: there is no sink yet");
+ return false;
+ }
+ return gst_app_sink_get_max_buffers(GST_APP_SINK(sink));
default:
CV_WARN("GStreamer: unhandled property");
break;
case CV_CAP_PROP_GAIN:
case CV_CAP_PROP_CONVERT_RGB:
break;
+ case CV_CAP_GSTREAMER_QUEUE_LENGTH:
+ if(!sink)
+ break;
+ gst_app_sink_set_max_buffers(GST_APP_SINK(sink), (guint) value);
+ break;
default:
CV_WARN("GStreamer: unhandled property");
}