summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2009-07-10 17:25:48 +0200
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2009-07-10 17:33:40 +0200
commit0775db44558dc8ca05e154f2ed5b2d7b264437b1 (patch)
tree4fe7fa283ad2e7cdfc048ec611aeb63e41e85b88
parent4ccd9c92ae107f58e5c1e36cf4d6f24d6afef7d0 (diff)
videomixer: Remove some redundant checks and error out immediately if not negotiated
Also stop leaking the output buffer in some error cases.
-rw-r--r--gst/videomixer/videomixer.c47
1 files changed, 21 insertions, 26 deletions
diff --git a/gst/videomixer/videomixer.c b/gst/videomixer/videomixer.c
index 1c9f17bc7..b3078be40 100644
--- a/gst/videomixer/videomixer.c
+++ b/gst/videomixer/videomixer.c
@@ -606,6 +606,8 @@ gst_videomixer_reset (GstVideoMixer * mix)
mix->segment_position = 0;
mix->segment_rate = 1.0;
+ mix->fmt = GST_VIDEO_FORMAT_UNKNOWN;
+
mix->last_ts = 0;
/* clean up collect data */
@@ -1190,13 +1192,9 @@ gst_videomixer_blend_buffers (GstVideoMixer * mix, GstBuffer * outbuf)
if (GST_CLOCK_TIME_IS_VALID (stream_time))
gst_object_sync_values (G_OBJECT (pad), stream_time);
- if (G_UNLIKELY (mix->blend == NULL)) {
- GST_ERROR_OBJECT (mix, "blend function not set");
- } else {
- (mix->blend) (GST_BUFFER_DATA (mixcol->buffer),
- pad->xpos, pad->ypos, pad->in_width, pad->in_height, pad->alpha,
- GST_BUFFER_DATA (outbuf), mix->out_width, mix->out_height);
- }
+ mix->blend (GST_BUFFER_DATA (mixcol->buffer),
+ pad->xpos, pad->ypos, pad->in_width, pad->in_height, pad->alpha,
+ GST_BUFFER_DATA (outbuf), mix->out_width, mix->out_height);
if (pad == mix->master) {
gint64 running_time;
@@ -1265,6 +1263,10 @@ gst_videomixer_collected (GstCollectPads * pads, GstVideoMixer * mix)
g_return_val_if_fail (GST_IS_VIDEO_MIXER (mix), GST_FLOW_ERROR);
+ /* This must be set, otherwise we have no caps */
+ if (G_UNLIKELY (mix->in_width == 0))
+ return GST_FLOW_NOT_NEGOTIATED;
+
GST_LOG ("all pads are collected");
GST_VIDEO_MIXER_STATE_LOCK (mix);
@@ -1310,35 +1312,25 @@ gst_videomixer_collected (GstCollectPads * pads, GstVideoMixer * mix)
outsize, GST_PAD_CAPS (mix->srcpad), &outbuf);
}
+ /* This must be set at this point, otherwise we have no src caps */
+ g_assert (mix->blend != NULL);
+
if (ret != GST_FLOW_OK) {
goto error;
}
switch (mix->background) {
case VIDEO_MIXER_BACKGROUND_CHECKER:
- if (G_UNLIKELY (mix->fill_checker == NULL)) {
- goto error;
- } else {
- mix->fill_checker (GST_BUFFER_DATA (outbuf), mix->out_width,
- mix->out_height);
- }
+ mix->fill_checker (GST_BUFFER_DATA (outbuf), mix->out_width,
+ mix->out_height);
break;
case VIDEO_MIXER_BACKGROUND_BLACK:
- if (G_UNLIKELY (mix->fill_color == NULL)) {
- goto error;
- } else {
- mix->fill_color (GST_BUFFER_DATA (outbuf), mix->out_width,
- mix->out_height, 16, 128, 128);
- }
+ mix->fill_color (GST_BUFFER_DATA (outbuf), mix->out_width,
+ mix->out_height, 16, 128, 128);
break;
case VIDEO_MIXER_BACKGROUND_WHITE:
-
- if (G_UNLIKELY (mix->fill_color == NULL)) {
- goto error;
- } else {
- mix->fill_color (GST_BUFFER_DATA (outbuf), mix->out_width,
- mix->out_height, 240, 128, 128);
- }
+ mix->fill_color (GST_BUFFER_DATA (outbuf), mix->out_width,
+ mix->out_height, 240, 128, 128);
break;
}
@@ -1355,6 +1347,9 @@ beach:
/* ERRORS */
error:
{
+ if (outbuf)
+ gst_buffer_unref (outbuf);
+
GST_VIDEO_MIXER_STATE_UNLOCK (mix);
goto beach;
}