summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArun Raghavan <arun@accosted.net>2014-07-01 12:18:45 +0530
committerArun Raghavan <arun@accosted.net>2014-07-03 23:08:22 +0530
commit46a7f258a1fe22828c401c1a1923d89beb85be54 (patch)
treea05ed3f0e9f583cc65dcb39bc93597facbdb51fd
parent357298c84f3c523a8c6b21c4b0d6a730d4f2518c (diff)
openni2src: Don't embed C++ objects in our GObject
Since C++ objects shoudl be properly constructed, we keep only pointers to them and manually construct them on the heap. https://bugzilla.gnome.org/show_bug.cgi?id=732535
-rw-r--r--ext/openni2/gstopenni2src.cpp169
-rw-r--r--ext/openni2/gstopenni2src.h6
2 files changed, 100 insertions, 75 deletions
diff --git a/ext/openni2/gstopenni2src.cpp b/ext/openni2/gstopenni2src.cpp
index ad7c33ad3..0416b1290 100644
--- a/ext/openni2/gstopenni2src.cpp
+++ b/ext/openni2/gstopenni2src.cpp
@@ -113,7 +113,6 @@ static gboolean openni2_initialise_library ();
static gboolean openni2_initialise_devices (GstOpenni2Src * src);
static GstFlowReturn openni2_read_gstbuffer (GstOpenni2Src * src,
GstBuffer * buf);
-static void openni2_finalise (GstOpenni2Src * src);
#define parent_class gst_openni2_src_parent_class
G_DEFINE_TYPE (GstOpenni2Src, gst_openni2_src, GST_TYPE_PUSH_SRC);
@@ -179,6 +178,12 @@ gst_openni2_src_init (GstOpenni2Src * ni2src)
gst_base_src_set_live (GST_BASE_SRC (ni2src), TRUE);
gst_base_src_set_format (GST_BASE_SRC (ni2src), GST_FORMAT_TIME);
+ ni2src->device = new openni::Device ();
+ ni2src->depth = new openni::VideoStream ();
+ ni2src->color = new openni::VideoStream ();
+ ni2src->depthFrame = new openni::VideoFrameRef ();
+ ni2src->colorFrame = new openni::VideoFrameRef ();
+
ni2src->oni_start_ts = GST_CLOCK_TIME_NONE;
}
@@ -198,15 +203,42 @@ gst_openni2_src_finalize (GObject * gobject)
{
GstOpenni2Src *ni2src = GST_OPENNI2_SRC (gobject);
- openni2_finalise (ni2src);
-
if (ni2src->uri_name) {
g_free (ni2src->uri_name);
ni2src->uri_name = NULL;
}
- if (ni2src->gst_caps)
+
+ if (ni2src->gst_caps) {
gst_caps_unref (ni2src->gst_caps);
- ni2src->gst_caps = NULL;
+ ni2src->gst_caps = NULL;
+ }
+
+ if (ni2src->device) {
+ delete ni2src->device;
+ ni2src->device = NULL;
+ }
+
+ if (ni2src->depth) {
+ ni2src->depth->destroy ();
+ delete ni2src->depth;
+ ni2src->depth = NULL;
+ }
+
+ if (ni2src->color) {
+ ni2src->color->destroy ();
+ delete ni2src->color;
+ ni2src->color = NULL;
+ }
+
+ if (ni2src->depthFrame) {
+ delete ni2src->depthFrame;
+ ni2src->depthFrame = NULL;
+ }
+
+ if (ni2src->colorFrame) {
+ delete ni2src->colorFrame;
+ ni2src->colorFrame = NULL;
+ }
G_OBJECT_CLASS (parent_class)->finalize (gobject);
}
@@ -275,8 +307,8 @@ gst_openni2_src_start (GstBaseSrc * bsrc)
GstOpenni2Src *src = GST_OPENNI2_SRC (bsrc);
openni::Status rc = openni::STATUS_OK;
- if (src->depth.isValid ()) {
- rc = src->depth.start ();
+ if (src->depth->isValid ()) {
+ rc = src->depth->start ();
if (rc != openni::STATUS_OK) {
GST_ERROR_OBJECT (src, "Couldn't start the depth stream\n%s\n",
openni::OpenNI::getExtendedError ());
@@ -284,8 +316,8 @@ gst_openni2_src_start (GstBaseSrc * bsrc)
}
}
- if (src->color.isValid ()) {
- rc = src->color.start ();
+ if (src->color->isValid ()) {
+ rc = src->color->start ();
if (rc != openni::STATUS_OK) {
GST_ERROR_OBJECT (src, "Couldn't start the color stream\n%s\n",
openni::OpenNI::getExtendedError ());
@@ -301,10 +333,10 @@ gst_openni2_src_stop (GstBaseSrc * bsrc)
{
GstOpenni2Src *src = GST_OPENNI2_SRC (bsrc);
- if (src->depth.isValid ())
- src->depth.stop ();
- if (src->color.isValid ())
- src->color.stop ();
+ if (src->depth->isValid ())
+ src->depth->stop ();
+ if (src->color->isValid ())
+ src->color->stop ();
src->device->close ();
@@ -327,13 +359,14 @@ gst_openni2_src_get_caps (GstBaseSrc * src, GstCaps * filter)
// If we are here, we need to compose the caps and return them.
- if (ni2src->depth.isValid () && ni2src->color.isValid () &&
+ if (ni2src->depth->isValid () && ni2src->color->isValid () &&
ni2src->sourcetype == SOURCETYPE_BOTH
&& ni2src->colorpixfmt == openni::PIXEL_FORMAT_RGB888) {
format = GST_VIDEO_FORMAT_RGBA;
- } else if (ni2src->depth.isValid () && ni2src->sourcetype == SOURCETYPE_DEPTH) {
+ } else if (ni2src->depth->isValid () &&
+ ni2src->sourcetype == SOURCETYPE_DEPTH) {
format = GST_VIDEO_FORMAT_GRAY16_LE;
- } else if (ni2src->color.isValid () && ni2src->sourcetype == SOURCETYPE_COLOR
+ } else if (ni2src->color->isValid () && ni2src->sourcetype == SOURCETYPE_COLOR
&& ni2src->colorpixfmt == openni::PIXEL_FORMAT_RGB888) {
format = GST_VIDEO_FORMAT_RGB;
} else {
@@ -503,8 +536,7 @@ openni2_initialise_devices (GstOpenni2Src * src)
if (src->uri_name)
deviceURI = src->uri_name;
- /** OpenNI2 open device or file **/
- rc = src->device.open (deviceURI);
+ rc = src->device->open (deviceURI);
if (rc != openni::STATUS_OK) {
GST_ERROR_OBJECT (src, "Device (%s) open failed: %s", deviceURI,
openni::OpenNI::getExtendedError ());
@@ -513,12 +545,12 @@ openni2_initialise_devices (GstOpenni2Src * src)
}
/** depth sensor **/
- rc = src->depth.create (src->device, openni::SENSOR_DEPTH);
+ rc = src->depth->create (*src->device, openni::SENSOR_DEPTH);
if (rc == openni::STATUS_OK) {
- rc = src->depth.start ();
+ rc = src->depth->start ();
if (rc != openni::STATUS_OK) {
GST_ERROR_OBJECT (src, "%s", openni::OpenNI::getExtendedError ());
- src->depth.destroy ();
+ src->depth->destroy ();
}
} else {
GST_WARNING_OBJECT (src, "Couldn't find depth stream: %s",
@@ -526,29 +558,29 @@ openni2_initialise_devices (GstOpenni2Src * src)
}
/** color sensor **/
- rc = src->color.create (src->device, openni::SENSOR_COLOR);
+ rc = src->color->create (*src->device, openni::SENSOR_COLOR);
if (rc == openni::STATUS_OK) {
- rc = src->color.start ();
+ rc = src->color->start ();
if (rc != openni::STATUS_OK) {
GST_ERROR_OBJECT (src, "Couldn't start color stream: %s ",
openni::OpenNI::getExtendedError ());
- src->color.destroy ();
+ src->color->destroy ();
}
} else {
GST_WARNING_OBJECT (src, "Couldn't find color stream: %s",
openni::OpenNI::getExtendedError ());
}
- if (!src->depth.isValid () && !src->color.isValid ()) {
+ if (!src->depth->isValid () && !src->color->isValid ()) {
GST_ERROR_OBJECT (src, "No valid streams. Exiting\n");
openni::OpenNI::shutdown ();
return FALSE;
}
/** Get resolution and make sure is valid **/
- if (src->depth.isValid () && src->color.isValid ()) {
- src->depthVideoMode = src->depth.getVideoMode ();
- src->colorVideoMode = src->color.getVideoMode ();
+ if (src->depth->isValid () && src->color->isValid ()) {
+ src->depthVideoMode = src->depth->getVideoMode ();
+ src->colorVideoMode = src->color->getVideoMode ();
int depthWidth = src->depthVideoMode.getResolutionX ();
int depthHeight = src->depthVideoMode.getResolutionY ();
@@ -569,15 +601,15 @@ openni2_initialise_devices (GstOpenni2Src * src)
}
GST_INFO_OBJECT (src, "DEPTH&COLOR resolution: %dx%d",
src->width, src->height);
- } else if (src->depth.isValid ()) {
- src->depthVideoMode = src->depth.getVideoMode ();
+ } else if (src->depth->isValid ()) {
+ src->depthVideoMode = src->depth->getVideoMode ();
src->width = src->depthVideoMode.getResolutionX ();
src->height = src->depthVideoMode.getResolutionY ();
src->fps = src->depthVideoMode.getFps ();
src->depthpixfmt = src->depthVideoMode.getPixelFormat ();
GST_INFO_OBJECT (src, "DEPTH resolution: %dx%d", src->width, src->height);
- } else if (src->color.isValid ()) {
- src->colorVideoMode = src->color.getVideoMode ();
+ } else if (src->color->isValid ()) {
+ src->colorVideoMode = src->color->getVideoMode ();
src->width = src->colorVideoMode.getResolutionX ();
src->height = src->colorVideoMode.getResolutionY ();
src->fps = src->colorVideoMode.getFps ();
@@ -595,7 +627,7 @@ static GstFlowReturn
openni2_read_gstbuffer (GstOpenni2Src * src, GstBuffer * buf)
{
openni::Status rc = openni::STATUS_OK;
- openni::VideoStream * pStream = &(src->depth);
+ openni::VideoStream * pStream = src->depth;
int changedStreamDummy;
GstVideoFrame vframe;
uint64_t oni_ts;
@@ -609,15 +641,15 @@ openni2_read_gstbuffer (GstOpenni2Src * src, GstBuffer * buf)
return GST_FLOW_ERROR;
}
- if (src->depth.isValid () && src->color.isValid () &&
+ if (src->depth->isValid () && src->color->isValid () &&
src->sourcetype == SOURCETYPE_BOTH) {
- rc = src->depth.readFrame (&src->depthFrame);
+ rc = src->depth->readFrame (src->depthFrame);
if (rc != openni::STATUS_OK) {
GST_ERROR_OBJECT (src, "Frame read error: %s",
openni::OpenNI::getExtendedError ());
return GST_FLOW_ERROR;
}
- rc = src->color.readFrame (&src->colorFrame);
+ rc = src->color->readFrame (src->colorFrame);
if (rc != openni::STATUS_OK) {
GST_ERROR_OBJECT (src, "Frame read error: %s",
openni::OpenNI::getExtendedError ());
@@ -628,30 +660,30 @@ openni2_read_gstbuffer (GstOpenni2Src * src, GstBuffer * buf)
gst_video_frame_map (&vframe, &src->info, buf, GST_MAP_WRITE);
guint8 *pData = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (&vframe, 0);
- guint8 *pColor = (guint8 *) src->colorFrame.getData ();
+ guint8 *pColor = (guint8 *) src->colorFrame->getData ();
/* Add depth as 8bit alpha channel, depth is 16bit samples. */
- guint16 *pDepth = (guint16 *) src->depthFrame.getData ();
+ guint16 *pDepth = (guint16 *) src->depthFrame->getData ();
- for (int i = 0; i < src->colorFrame.getHeight (); ++i) {
- for (int j = 0; j < src->colorFrame.getWidth (); ++j) {
+ for (int i = 0; i < src->colorFrame->getHeight (); ++i) {
+ for (int j = 0; j < src->colorFrame->getWidth (); ++j) {
pData[4 * j + 0] = pColor[3 * j + 0];
pData[4 * j + 1] = pColor[3 * j + 1];
pData[4 * j + 2] = pColor[3 * j + 2];
pData[4 * j + 3] = pDepth[j] >> 8;
}
pData += GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 0);
- pColor += src->colorFrame.getStrideInBytes ();
- pDepth += src->depthFrame.getStrideInBytes () / 2;
+ pColor += src->colorFrame->getStrideInBytes ();
+ pDepth += src->depthFrame->getStrideInBytes () / 2;
}
gst_video_frame_unmap (&vframe);
- oni_ts = src->colorFrame.getTimestamp () * 1000;
+ oni_ts = src->colorFrame->getTimestamp () * 1000;
GST_LOG_OBJECT (src, "sending buffer (%d+%d)B",
- src->colorFrame.getDataSize (),
- src->depthFrame.getDataSize ());
- } else if (src->depth.isValid () && src->sourcetype == SOURCETYPE_DEPTH) {
- rc = src->depth.readFrame (&src->depthFrame);
+ src->colorFrame->getDataSize (),
+ src->depthFrame->getDataSize ());
+ } else if (src->depth->isValid () && src->sourcetype == SOURCETYPE_DEPTH) {
+ rc = src->depth->readFrame (src->depthFrame);
if (rc != openni::STATUS_OK) {
GST_ERROR_OBJECT (src, "Frame read error: %s",
openni::OpenNI::getExtendedError ());
@@ -662,23 +694,23 @@ openni2_read_gstbuffer (GstOpenni2Src * src, GstBuffer * buf)
gst_video_frame_map (&vframe, &src->info, buf, GST_MAP_WRITE);
guint16 *pData = (guint16 *) GST_VIDEO_FRAME_PLANE_DATA (&vframe, 0);
- guint16 *pDepth = (guint16 *) src->depthFrame.getData ();
+ guint16 *pDepth = (guint16 *) src->depthFrame->getData ();
- for (int i = 0; i < src->depthFrame.getHeight (); ++i) {
- memcpy (pData, pDepth, 2 * src->depthFrame.getWidth ());
- pDepth += src->depthFrame.getStrideInBytes () / 2;
+ for (int i = 0; i < src->depthFrame->getHeight (); ++i) {
+ memcpy (pData, pDepth, 2 * src->depthFrame->getWidth ());
+ pDepth += src->depthFrame->getStrideInBytes () / 2;
pData += GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 0) / 2;
}
gst_video_frame_unmap (&vframe);
- oni_ts = src->depthFrame.getTimestamp () * 1000;
+ oni_ts = src->depthFrame->getTimestamp () * 1000;
GST_LOG_OBJECT (src, "sending buffer (%dx%d)=%dB",
- src->depthFrame.getWidth (),
- src->depthFrame.getHeight (),
- src->depthFrame.getDataSize ());
- } else if (src->color.isValid () && src->sourcetype == SOURCETYPE_COLOR) {
- rc = src->color.readFrame (&src->colorFrame);
+ src->depthFrame->getWidth (),
+ src->depthFrame->getHeight (),
+ src->depthFrame->getDataSize ());
+ } else if (src->color->isValid () && src->sourcetype == SOURCETYPE_COLOR) {
+ rc = src->color->readFrame (src->colorFrame);
if (rc != openni::STATUS_OK) {
GST_ERROR_OBJECT (src, "Frame read error: %s",
openni::OpenNI::getExtendedError ());
@@ -688,21 +720,21 @@ openni2_read_gstbuffer (GstOpenni2Src * src, GstBuffer * buf)
gst_video_frame_map (&vframe, &src->info, buf, GST_MAP_WRITE);
guint8 *pData = (guint8 *) GST_VIDEO_FRAME_PLANE_DATA (&vframe, 0);
- guint8 *pColor = (guint8 *) src->colorFrame.getData ();
+ guint8 *pColor = (guint8 *) src->colorFrame->getData ();
- for (int i = 0; i < src->colorFrame.getHeight (); ++i) {
- memcpy (pData, pColor, 3 * src->colorFrame.getWidth ());
- pColor += src->colorFrame.getStrideInBytes ();
+ for (int i = 0; i < src->colorFrame->getHeight (); ++i) {
+ memcpy (pData, pColor, 3 * src->colorFrame->getWidth ());
+ pColor += src->colorFrame->getStrideInBytes ();
pData += GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 0);
}
gst_video_frame_unmap (&vframe);
- oni_ts = src->colorFrame.getTimestamp () * 1000;
+ oni_ts = src->colorFrame->getTimestamp () * 1000;
GST_LOG_OBJECT (src, "sending buffer (%dx%d)=%dB",
- src->colorFrame.getWidth (),
- src->colorFrame.getHeight (),
- src->colorFrame.getDataSize ());
+ src->colorFrame->getWidth (),
+ src->colorFrame->getHeight (),
+ src->colorFrame->getDataSize ());
}
if (G_UNLIKELY (src->oni_start_ts == GST_CLOCK_TIME_NONE))
@@ -715,10 +747,3 @@ openni2_read_gstbuffer (GstOpenni2Src * src, GstBuffer * buf)
return GST_FLOW_OK;
}
-
-static void
-openni2_finalise (GstOpenni2Src * src)
-{
- src->depth.destroy ();
- src->color.destroy ();
-}
diff --git a/ext/openni2/gstopenni2src.h b/ext/openni2/gstopenni2src.h
index 103ff56d9..39ec2a0c1 100644
--- a/ext/openni2/gstopenni2src.h
+++ b/ext/openni2/gstopenni2src.h
@@ -61,12 +61,12 @@ struct _GstOpenni2Src
GstClockTime oni_start_ts;
/* OpenNI2 variables */
- openni::Device device;
- openni::VideoStream depth, color;
+ openni::Device *device;
+ openni::VideoStream *depth, *color;
openni::VideoMode depthVideoMode, colorVideoMode;
openni::PixelFormat depthpixfmt, colorpixfmt;
int width, height, fps;
- openni::VideoFrameRef depthFrame, colorFrame;
+ openni::VideoFrameRef *depthFrame, *colorFrame;
};
struct _GstOpenni2SrcClass