shapewipe: Can't map twice the same buffer for writing

I took the opportunity to simplify that code a bit. We now use
gst_buffer_make_writable() to make the buffer writable and map twice the
same buffer, with first map being read/write, and second read only. This
get rid of the critical:

GStreamer-CRITICAL **: gst_structure_set_name: assertion `IS_MUTABLE

https://bugzilla.gnome.org/show_bug.cgi?id=700044
This commit is contained in:
Nicolas Dufresne 2013-05-09 22:20:28 -04:00 committed by Sebastian Dröge
parent 13a5d0304d
commit 0b737fba0d

View file

@ -832,7 +832,6 @@ gst_shape_wipe_video_sink_chain (GstPad * pad, GstObject * parent,
GstFlowReturn ret = GST_FLOW_OK; GstFlowReturn ret = GST_FLOW_OK;
GstBuffer *mask = NULL, *outbuf = NULL; GstBuffer *mask = NULL, *outbuf = NULL;
GstClockTime timestamp; GstClockTime timestamp;
gboolean new_outbuf = FALSE;
GstVideoFrame inframe, outframe, maskframe; GstVideoFrame inframe, outframe, maskframe;
if (G_UNLIKELY (GST_VIDEO_INFO_FORMAT (&self->vinfo) == if (G_UNLIKELY (GST_VIDEO_INFO_FORMAT (&self->vinfo) ==
@ -867,20 +866,10 @@ gst_shape_wipe_video_sink_chain (GstPad * pad, GstObject * parent,
if (!gst_shape_wipe_do_qos (self, GST_BUFFER_TIMESTAMP (buffer))) if (!gst_shape_wipe_do_qos (self, GST_BUFFER_TIMESTAMP (buffer)))
goto qos; goto qos;
/* Try to blend inplace, if it's not possible /* Will blend inplace if buffer is writable */
* get a new buffer from downstream. */ outbuf = gst_buffer_make_writable (buffer);
if (!gst_buffer_is_writable (buffer)) { gst_video_frame_map (&outframe, &self->vinfo, outbuf, GST_MAP_READWRITE);
outbuf = gst_buffer_new_allocate (NULL, gst_buffer_get_size (buffer), NULL); gst_video_frame_map (&inframe, &self->vinfo, outbuf, GST_MAP_READ);
gst_buffer_copy_into (outbuf, buffer, GST_BUFFER_COPY_METADATA, 0, -1);
new_outbuf = TRUE;
} else {
outbuf = buffer;
}
gst_video_frame_map (&inframe, &self->vinfo, buffer,
new_outbuf ? GST_MAP_READ : GST_MAP_READWRITE);
gst_video_frame_map (&outframe, &self->vinfo, outbuf,
new_outbuf ? GST_MAP_WRITE : GST_MAP_READWRITE);
gst_video_frame_map (&maskframe, &self->minfo, mask, GST_MAP_READ); gst_video_frame_map (&maskframe, &self->minfo, mask, GST_MAP_READ);
@ -911,8 +900,6 @@ gst_shape_wipe_video_sink_chain (GstPad * pad, GstObject * parent,
gst_video_frame_unmap (&maskframe); gst_video_frame_unmap (&maskframe);
gst_buffer_unref (mask); gst_buffer_unref (mask);
if (new_outbuf)
gst_buffer_unref (buffer);
ret = gst_pad_push (self->srcpad, outbuf); ret = gst_pad_push (self->srcpad, outbuf);
if (G_UNLIKELY (ret != GST_FLOW_OK)) if (G_UNLIKELY (ret != GST_FLOW_OK))
@ -942,8 +929,9 @@ qos:
} }
push_failed: push_failed:
{ {
GST_ERROR_OBJECT (self, "Pushing buffer downstream failed: %s", if (ret != GST_FLOW_FLUSHING)
gst_flow_get_name (ret)); GST_ERROR_OBJECT (self, "Pushing buffer downstream failed: %s",
gst_flow_get_name (ret));
return ret; return ret;
} }
} }