diff --git a/Makefile.am b/Makefile.am index 3821d0c717..fdd7e9cb4e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -46,12 +46,15 @@ CRUFT_FILES = \ $(top_builddir)/gst/flacparse/.libs/*.{so,dll,DLL,dylib} \ $(top_builddir)/gst/shapewipe/.libs/*.{so,dll,DLL,dylib} \ $(top_builddir)/ext/ivorbis/.libs/*.{so,dll,DLL,dylib} \ - $(top_builddir)/tests/check/elements/capssetter + $(top_builddir)/gst/imagefreeze/.libs/*.{so,dll,DLL,dylib} \ + $(top_builddir)/tests/check/elements/capssetter \ + $(top_builddir)/tests/check/elements/imagefreeze CRUFT_DIRS = \ $(top_srcdir)/gst/aacparse \ $(top_srcdir)/gst/amrparse \ $(top_srcdir)/gst/flacparse \ + $(top_srcdir)/gst/imagefreeze \ $(top_srcdir)/gst/shapewipe \ $(top_srcdir)/tests/examples/shapewipe $(top_srcdir)/ext/ivorbis diff --git a/configure.ac b/configure.ac index ccaea01ab4..097ec42830 100644 --- a/configure.ac +++ b/configure.ac @@ -285,7 +285,6 @@ AG_GST_CHECK_PLUGIN(h264parse) AG_GST_CHECK_PLUGIN(hdvparse) AG_GST_CHECK_PLUGIN(id3tag) AG_GST_CHECK_PLUGIN(invtelecine) -AG_GST_CHECK_PLUGIN(imagefreeze) AG_GST_CHECK_PLUGIN(jpegformat) AG_GST_CHECK_PLUGIN(librfb) AG_GST_CHECK_PLUGIN(liveadder) @@ -1632,7 +1631,6 @@ gst/h264parse/Makefile gst/hdvparse/Makefile gst/id3tag/Makefile gst/invtelecine/Makefile -gst/imagefreeze/Makefile gst/jpegformat/Makefile gst/legacyresample/Makefile gst/librfb/Makefile diff --git a/docs/plugins/Makefile.am b/docs/plugins/Makefile.am index b8460fedac..368d9fd751 100644 --- a/docs/plugins/Makefile.am +++ b/docs/plugins/Makefile.am @@ -143,7 +143,6 @@ EXTRA_HFILES = \ $(top_srcdir)/gst/dvdspu/gstdvdspu.h \ $(top_srcdir)/gst/festival/gstfestival.h \ $(top_srcdir)/gst/freeze/gstfreeze.h \ - $(top_srcdir)/gst/imagefreeze/gstimagefreeze.h \ $(top_srcdir)/gst/legacyresample/gstlegacyresample.h \ $(top_srcdir)/gst/liveadder/liveadder.h \ $(top_srcdir)/gst/jpegformat/gstjpegparse.h \ diff --git a/docs/plugins/gst-plugins-bad-plugins-docs.sgml b/docs/plugins/gst-plugins-bad-plugins-docs.sgml index 167877f9f8..c56545929b 100644 --- a/docs/plugins/gst-plugins-bad-plugins-docs.sgml +++ b/docs/plugins/gst-plugins-bad-plugins-docs.sgml @@ -47,7 +47,6 @@ - @@ -130,7 +129,6 @@ - diff --git a/docs/plugins/gst-plugins-bad-plugins-sections.txt b/docs/plugins/gst-plugins-bad-plugins-sections.txt index 62264ff8e7..65330adebe 100644 --- a/docs/plugins/gst-plugins-bad-plugins-sections.txt +++ b/docs/plugins/gst-plugins-bad-plugins-sections.txt @@ -478,20 +478,6 @@ GST_TYPE_FREEZE gst_freeze_get_type -
-element-imagefreeze -imagefreeze -GstImageFreeze - -GstImageFreezeClass -GST_IMAGE_FREEZE -GST_IMAGE_FREEZE_CLASS -GST_IS_IMAGE_FREEZE -GST_IS_IMAGE_FREEZE_CLASS -GST_TYPE_IMAGE_FREEZE -gst_image_freeze_get_type -
-
element-input-selector input-selector diff --git a/docs/plugins/inspect/plugin-imagefreeze.xml b/docs/plugins/inspect/plugin-imagefreeze.xml deleted file mode 100644 index eca432f8cf..0000000000 --- a/docs/plugins/inspect/plugin-imagefreeze.xml +++ /dev/null @@ -1,34 +0,0 @@ - - imagefreeze - Still frame stream generator - ../../gst/imagefreeze/.libs/libgstimagefreeze.so - libgstimagefreeze.so - 0.10.17.3 - LGPL - gst-plugins-bad - GStreamer Bad Plug-ins prerelease - Unknown package origin - - - imagefreeze - Still frame stream generator - Filter/Video - Generates a still frame stream from an image - Sebastian Dröge <sebastian.droege@collabora.co.uk> - - - src - source - always -
video/x-raw-yuv; video/x-raw-rgb; video/x-raw-gray
-
- - sink - sink - always -
video/x-raw-yuv; video/x-raw-rgb; video/x-raw-gray
-
-
-
-
-
\ No newline at end of file diff --git a/gst/imagefreeze/Makefile.am b/gst/imagefreeze/Makefile.am deleted file mode 100644 index af96a98c19..0000000000 --- a/gst/imagefreeze/Makefile.am +++ /dev/null @@ -1,11 +0,0 @@ -plugin_LTLIBRARIES = libgstimagefreeze.la - -libgstimagefreeze_la_SOURCES = gstimagefreeze.c - -libgstimagefreeze_la_CFLAGS = $(GST_CFLAGS) -libgstimagefreeze_la_LIBADD = $(GST_LIBS) -libgstimagefreeze_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -libgstimagefreeze_la_LIBTOOLFLAGS = --tag=disable-static - -noinst_HEADERS = gstimagefreeze.h - diff --git a/gst/imagefreeze/gstimagefreeze.c b/gst/imagefreeze/gstimagefreeze.c deleted file mode 100644 index e4ffcb7b67..0000000000 --- a/gst/imagefreeze/gstimagefreeze.c +++ /dev/null @@ -1,840 +0,0 @@ -/* GStreamer - * Copyright (c) 2005 Edward Hervey - * Copyright (C) 2010 Sebastian Dröge - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/** - * SECTION:element-imagefreeze - * - * The imagefreeze element generates a still frame video stream from - * the input. It duplicates the first frame with the framerate requested - * by downstream, allows seeking and answers queries. - * - * - * Example launch line - * |[ - * gst-launch -v filesrc location=some.png ! decodebin2 ! imagefreeze ! autovideosink - * ]| This pipeline shows a still frame stream of a PNG file. - * - */ - -/* This is based on the imagefreeze element from PiTiVi: - * http://git.gnome.org/browse/pitivi/tree/pitivi/elements/imagefreeze.py - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "gstimagefreeze.h" - -static void gst_image_freeze_finalize (GObject * object); - -static void gst_image_freeze_reset (GstImageFreeze * self); - -static GstStateChangeReturn gst_image_freeze_change_state (GstElement * element, - GstStateChange transition); - -static GstFlowReturn gst_image_freeze_sink_chain (GstPad * pad, - GstBuffer * buffer); -static gboolean gst_image_freeze_sink_event (GstPad * pad, GstEvent * event); -static gboolean gst_image_freeze_sink_setcaps (GstPad * pad, GstCaps * caps); -static GstCaps *gst_image_freeze_sink_getcaps (GstPad * pad); -static gboolean gst_image_freeze_sink_query (GstPad * pad, GstQuery * query); -static void gst_image_freeze_src_loop (GstPad * pad); -static gboolean gst_image_freeze_src_event (GstPad * pad, GstEvent * event); -static gboolean gst_image_freeze_src_query (GstPad * pad, GstQuery * query); -static const GstQueryType *gst_image_freeze_src_query_type (GstPad * pad); - -static GstStaticPadTemplate sink_pad_template = GST_STATIC_PAD_TEMPLATE ("sink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-raw-yuv; video/x-raw-rgb; video/x-raw-gray")); - -static GstStaticPadTemplate src_pad_template = - GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/x-raw-yuv; video/x-raw-rgb; video/x-raw-gray")); - -GST_DEBUG_CATEGORY_STATIC (gst_image_freeze_debug); -#define GST_CAT_DEFAULT gst_image_freeze_debug - -GST_BOILERPLATE (GstImageFreeze, gst_image_freeze, GstElement, - GST_TYPE_ELEMENT); - -static void -gst_image_freeze_base_init (gpointer g_class) -{ - GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_set_details_simple (gstelement_class, - "Still frame stream generator", - "Filter/Video", - "Generates a still frame stream from an image", - "Sebastian Dröge "); - - gst_element_class_add_pad_template (gstelement_class, - gst_static_pad_template_get (&sink_pad_template)); - gst_element_class_add_pad_template (gstelement_class, - gst_static_pad_template_get (&src_pad_template)); -} - -static void -gst_image_freeze_class_init (GstImageFreezeClass * klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass); - - gobject_class->finalize = gst_image_freeze_finalize; - - gstelement_class->change_state = - GST_DEBUG_FUNCPTR (gst_image_freeze_change_state); -} - -static void -gst_image_freeze_init (GstImageFreeze * self, GstImageFreezeClass * g_class) -{ - self->sinkpad = gst_pad_new_from_static_template (&sink_pad_template, "sink"); - gst_pad_set_chain_function (self->sinkpad, - GST_DEBUG_FUNCPTR (gst_image_freeze_sink_chain)); - gst_pad_set_event_function (self->sinkpad, - GST_DEBUG_FUNCPTR (gst_image_freeze_sink_event)); - gst_pad_set_query_function (self->sinkpad, - GST_DEBUG_FUNCPTR (gst_image_freeze_sink_query)); - gst_pad_set_setcaps_function (self->sinkpad, - GST_DEBUG_FUNCPTR (gst_image_freeze_sink_setcaps)); - gst_pad_set_getcaps_function (self->sinkpad, - GST_DEBUG_FUNCPTR (gst_image_freeze_sink_getcaps)); - gst_element_add_pad (GST_ELEMENT (self), self->sinkpad); - - self->srcpad = gst_pad_new_from_static_template (&src_pad_template, "src"); - gst_pad_set_event_function (self->srcpad, - GST_DEBUG_FUNCPTR (gst_image_freeze_src_event)); - gst_pad_set_query_function (self->srcpad, - GST_DEBUG_FUNCPTR (gst_image_freeze_src_query)); - gst_pad_set_query_type_function (self->srcpad, - GST_DEBUG_FUNCPTR (gst_image_freeze_src_query_type)); - gst_pad_use_fixed_caps (self->srcpad); - gst_element_add_pad (GST_ELEMENT (self), self->srcpad); - - gst_image_freeze_reset (self); -} - -static void -gst_image_freeze_finalize (GObject * object) -{ - GstImageFreeze *self = GST_IMAGE_FREEZE (object); - - gst_image_freeze_reset (self); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -static void -gst_image_freeze_reset (GstImageFreeze * self) -{ - GST_DEBUG_OBJECT (self, "Resetting internal state"); - - GST_OBJECT_LOCK (self); - gst_buffer_replace (&self->buffer, NULL); - - gst_segment_init (&self->segment, GST_FORMAT_TIME); - self->need_segment = TRUE; - gst_event_replace (&self->close_segment, NULL); - - self->fps_n = self->fps_d = 0; - self->offset = 0; - GST_OBJECT_UNLOCK (self); -} - -static gboolean -gst_image_freeze_sink_setcaps (GstPad * pad, GstCaps * caps) -{ - GstImageFreeze *self = GST_IMAGE_FREEZE (gst_pad_get_parent (pad)); - gboolean ret = FALSE; - GstStructure *s; - gint fps_n, fps_d; - GstCaps *othercaps, *intersection; - guint i, n; - - caps = gst_caps_make_writable (gst_caps_ref (caps)); - - GST_DEBUG_OBJECT (pad, "Setting caps: %" GST_PTR_FORMAT, caps); - - s = gst_caps_get_structure (caps, 0); - - /* 1. Remove framerate */ - gst_structure_remove_field (s, "framerate"); - gst_structure_set (s, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, 1, - NULL); - - /* 2. Intersect with template caps */ - othercaps = (GstCaps *) gst_pad_get_pad_template_caps (pad); - intersection = gst_caps_intersect (caps, othercaps); - GST_DEBUG_OBJECT (pad, "Intersecting: %" GST_PTR_FORMAT, caps); - GST_DEBUG_OBJECT (pad, "with: %" GST_PTR_FORMAT, othercaps); - GST_DEBUG_OBJECT (pad, "gave: %" GST_PTR_FORMAT, intersection); - gst_caps_unref (caps); - caps = intersection; - intersection = othercaps = NULL; - - /* 3. Intersect with downstream peer caps */ - othercaps = gst_pad_peer_get_caps (self->srcpad); - if (othercaps) { - intersection = gst_caps_intersect (caps, othercaps); - GST_DEBUG_OBJECT (pad, "Intersecting: %" GST_PTR_FORMAT, caps); - GST_DEBUG_OBJECT (pad, "with: %" GST_PTR_FORMAT, othercaps); - GST_DEBUG_OBJECT (pad, "gave: %" GST_PTR_FORMAT, intersection); - gst_caps_unref (othercaps); - gst_caps_unref (caps); - caps = intersection; - intersection = othercaps = NULL; - } - - /* 4. For every candidate check if it's accepted downstream - * and fixate framerate to nearest 25/1 */ - n = gst_caps_get_size (caps); - for (i = 0; i < n; i++) { - GstCaps *candidate = gst_caps_new_empty (); - GstStructure *s = gst_structure_copy (gst_caps_get_structure (caps, i)); - - gst_caps_append_structure (candidate, s); - if (gst_pad_peer_accept_caps (self->srcpad, candidate)) { - if (gst_structure_has_field_typed (s, "framerate", GST_TYPE_FRACTION) || - gst_structure_fixate_field_nearest_fraction (s, "framerate", 25, 1)) { - gst_structure_get_fraction (s, "framerate", &fps_n, &fps_d); - if (fps_d != 0) { - GST_OBJECT_LOCK (self); - self->fps_n = fps_n; - self->fps_d = fps_d; - GST_OBJECT_UNLOCK (self); - GST_DEBUG_OBJECT (pad, "Setting caps %" GST_PTR_FORMAT, candidate); - gst_pad_set_caps (self->srcpad, candidate); - gst_caps_unref (candidate); - ret = TRUE; - goto done; - } else { - GST_WARNING_OBJECT (pad, "Invalid caps with framerate %d/%d", fps_n, - fps_d); - } - } - } - gst_caps_unref (candidate); - } - -done: - if (!ret) - GST_ERROR_OBJECT (pad, "No usable caps found"); - - gst_caps_unref (caps); - gst_object_unref (self); - - return ret; -} - -static GstCaps * -gst_image_freeze_sink_getcaps (GstPad * pad) -{ - GstImageFreeze *self = GST_IMAGE_FREEZE (gst_pad_get_parent (pad)); - GstCaps *ret, *tmp; - guint i, n; - - if (GST_PAD_CAPS (pad)) { - ret = gst_caps_copy (GST_PAD_CAPS (pad)); - goto done; - } - - tmp = gst_pad_peer_get_caps (self->srcpad); - if (tmp) { - ret = gst_caps_intersect (tmp, gst_pad_get_pad_template_caps (pad)); - gst_caps_unref (tmp); - } else { - ret = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); - } - - n = gst_caps_get_size (ret); - for (i = 0; i < n; i++) { - GstStructure *s = gst_caps_get_structure (ret, i); - - gst_structure_remove_field (s, "framerate"); - gst_structure_set (s, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, G_MAXINT, - 1, NULL); - } - -done: - gst_object_unref (self); - - GST_LOG_OBJECT (pad, "Returning caps: %" GST_PTR_FORMAT, ret); - - return ret; -} - -static gboolean -gst_image_freeze_sink_query (GstPad * pad, GstQuery * query) -{ - GstImageFreeze *self = GST_IMAGE_FREEZE (gst_pad_get_parent (pad)); - gboolean ret; - GstPad *peer = gst_pad_get_peer (self->srcpad); - - GST_LOG_OBJECT (pad, "Handling query of type '%s'", - gst_query_type_get_name (GST_QUERY_TYPE (query))); - - if (!peer) { - GST_INFO_OBJECT (pad, "No peer yet, dropping query"); - ret = FALSE; - } else { - ret = gst_pad_query (peer, query); - gst_object_unref (peer); - } - - gst_object_unref (self); - return ret; -} - -static gboolean -gst_image_freeze_convert (GstImageFreeze * self, - GstFormat src_format, gint64 src_value, - GstFormat * dest_format, gint64 * dest_value) -{ - gboolean ret = FALSE; - - if (src_format == *dest_format) { - *dest_value = src_value; - return TRUE; - } - - if (src_value == -1) { - *dest_value = -1; - return TRUE; - } - - switch (src_format) { - case GST_FORMAT_DEFAULT:{ - switch (*dest_format) { - case GST_FORMAT_TIME: - GST_OBJECT_LOCK (self); - if (self->fps_n == 0) - *dest_value = -1; - else - *dest_value = - gst_util_uint64_scale (src_value, GST_SECOND * self->fps_d, - self->fps_n); - GST_OBJECT_UNLOCK (self); - ret = TRUE; - break; - default: - break; - } - } - case GST_FORMAT_TIME:{ - switch (*dest_format) { - case GST_FORMAT_DEFAULT: - GST_OBJECT_LOCK (self); - *dest_value = - gst_util_uint64_scale (src_value, self->fps_n, - self->fps_d * GST_SECOND); - GST_OBJECT_UNLOCK (self); - ret = TRUE; - break; - default: - break; - } - - } - default: - break; - } - - return ret; -} - -static const GstQueryType * -gst_image_freeze_src_query_type (GstPad * pad) -{ - static const GstQueryType types[] = { - GST_QUERY_POSITION, - GST_QUERY_DURATION, - GST_QUERY_SEEKING, - GST_QUERY_CONVERT, - 0 - }; - - return types; -} - -static gboolean -gst_image_freeze_src_query (GstPad * pad, GstQuery * query) -{ - GstImageFreeze *self = GST_IMAGE_FREEZE (gst_pad_get_parent (pad)); - gboolean ret = FALSE; - - GST_LOG_OBJECT (pad, "Handling query of type '%s'", - gst_query_type_get_name (GST_QUERY_TYPE (query))); - - switch (GST_QUERY_TYPE (query)) { - case GST_QUERY_CONVERT:{ - GstFormat src_format, dest_format; - gint64 src_value, dest_value; - - gst_query_parse_convert (query, &src_format, &src_value, &dest_format, - &dest_value); - ret = - gst_image_freeze_convert (self, src_format, src_value, &dest_format, - &dest_value); - if (ret) - gst_query_set_convert (query, src_format, src_value, dest_format, - dest_value); - break; - } - case GST_QUERY_POSITION:{ - GstFormat format; - gint64 position; - - gst_query_parse_position (query, &format, NULL); - switch (format) { - case GST_FORMAT_DEFAULT:{ - GST_OBJECT_LOCK (self); - position = self->offset; - GST_OBJECT_UNLOCK (self); - ret = TRUE; - } - case GST_FORMAT_TIME:{ - GST_OBJECT_LOCK (self); - position = self->segment.last_stop; - GST_OBJECT_UNLOCK (self); - ret = TRUE; - } - default: - break; - } - - if (ret) { - gst_query_set_position (query, format, position); - GST_DEBUG_OBJECT (pad, - "Returning position %" G_GINT64_FORMAT " in format %s", position, - gst_format_get_name (format)); - } else { - GST_DEBUG_OBJECT (pad, "Position query failed"); - } - break; - } - case GST_QUERY_DURATION:{ - GstFormat format; - gint64 duration; - - gst_query_parse_duration (query, &format, NULL); - switch (format) { - case GST_FORMAT_TIME:{ - GST_OBJECT_LOCK (self); - duration = self->segment.stop; - GST_OBJECT_UNLOCK (self); - ret = TRUE; - } - case GST_FORMAT_DEFAULT:{ - GST_OBJECT_LOCK (self); - duration = self->segment.stop; - if (duration != -1) - duration = - gst_util_uint64_scale (duration, self->fps_n, - GST_SECOND * self->fps_d); - GST_OBJECT_UNLOCK (self); - ret = TRUE; - } - default: - break; - } - - if (ret) { - gst_query_set_duration (query, format, duration); - GST_DEBUG_OBJECT (pad, - "Returning duration %" G_GINT64_FORMAT " in format %s", duration, - gst_format_get_name (format)); - } else { - GST_DEBUG_OBJECT (pad, "Duration query failed"); - } - break; - } - case GST_QUERY_SEEKING:{ - GstFormat format; - gboolean seekable; - - gst_query_parse_seeking (query, &format, NULL, NULL, NULL); - seekable = (format == GST_FORMAT_TIME || format == GST_FORMAT_DEFAULT); - - gst_query_set_seeking (query, format, seekable, (seekable ? 0 : -1), -1); - ret = TRUE; - break; - } - default: - ret = FALSE; - break; - } - - gst_object_unref (self); - return ret; -} - - -static gboolean -gst_image_freeze_sink_event (GstPad * pad, GstEvent * event) -{ - GstImageFreeze *self = GST_IMAGE_FREEZE (gst_pad_get_parent (pad)); - gboolean ret; - - GST_LOG_OBJECT (pad, "Got %s event", GST_EVENT_TYPE_NAME (event)); - - switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_EOS: - case GST_EVENT_NEWSEGMENT: - GST_DEBUG_OBJECT (pad, "Dropping event"); - gst_event_unref (event); - ret = TRUE; - break; - case GST_EVENT_FLUSH_START: - gst_image_freeze_reset (self); - /* fall through */ - default: - ret = gst_pad_push_event (self->srcpad, event); - break; - } - - gst_object_unref (self); - return ret; -} - -static gboolean -gst_image_freeze_src_event (GstPad * pad, GstEvent * event) -{ - GstImageFreeze *self = GST_IMAGE_FREEZE (gst_pad_get_parent (pad)); - gboolean ret; - - GST_LOG_OBJECT (pad, "Got %s event", GST_EVENT_TYPE_NAME (event)); - - switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_NAVIGATION: - case GST_EVENT_QOS: - case GST_EVENT_LATENCY: - case GST_EVENT_STEP: - GST_DEBUG_OBJECT (pad, "Dropping event"); - gst_event_unref (event); - ret = TRUE; - break; - case GST_EVENT_SEEK:{ - gdouble rate; - GstFormat format; - GstSeekFlags flags; - GstSeekType start_type, stop_type; - gint64 start, stop; - gint64 last_stop; - gboolean start_task; - - gst_event_parse_seek (event, &rate, &format, &flags, &start_type, &start, - &stop_type, &stop); - gst_event_unref (event); - - if (format != GST_FORMAT_TIME && format != GST_FORMAT_DEFAULT) { - GST_ERROR_OBJECT (pad, "Seek in invalid format: %s", - gst_format_get_name (format)); - ret = FALSE; - break; - } - - if (format == GST_FORMAT_DEFAULT) { - format = GST_FORMAT_TIME; - if (!gst_image_freeze_convert (self, GST_FORMAT_DEFAULT, start, &format, - &start) - || !gst_image_freeze_convert (self, GST_FORMAT_DEFAULT, stop, - &format, &stop) - || start == -1 || stop == -1) { - GST_ERROR_OBJECT (pad, - "Failed to convert seek from DEFAULT format into TIME format"); - ret = FALSE; - break; - } - } - - if ((flags & GST_SEEK_FLAG_FLUSH)) { - GstEvent *e; - - e = gst_event_new_flush_start (); - gst_pad_push_event (self->srcpad, e); - } else { - gst_pad_pause_task (self->srcpad); - } - - GST_PAD_STREAM_LOCK (self->srcpad); - - GST_OBJECT_LOCK (self); - gst_event_replace (&self->close_segment, NULL); - if (self->segment.rate >= 0) { - self->close_segment = - gst_event_new_new_segment_full (TRUE, self->segment.rate, - self->segment.applied_rate, self->segment.format, - self->segment.start, self->segment.last_stop, self->segment.time); - } else { - gint64 stop; - - if ((stop = self->segment.stop) == -1) - stop = self->segment.duration; - - self->close_segment = - gst_event_new_new_segment_full (TRUE, self->segment.rate, - self->segment.applied_rate, self->segment.format, - self->segment.last_stop, stop, self->segment.last_stop); - } - - gst_segment_set_seek (&self->segment, rate, format, flags, start_type, - start, stop_type, stop, NULL); - self->need_segment = TRUE; - last_stop = self->segment.last_stop; - - start_task = self->buffer != NULL; - GST_OBJECT_UNLOCK (self); - - if ((flags & GST_SEEK_FLAG_FLUSH)) { - GstEvent *e; - - e = gst_event_new_flush_stop (); - gst_pad_push_event (self->srcpad, e); - } - - if (flags & GST_SEEK_FLAG_SEGMENT) { - GstMessage *m; - - m = gst_message_new_segment_start (GST_OBJECT (self), - format, last_stop); - gst_element_post_message (GST_ELEMENT (self), m); - } - - GST_PAD_STREAM_UNLOCK (self->srcpad); - - GST_DEBUG_OBJECT (pad, "Seek successful"); - - if (start_task) - gst_pad_start_task (self->srcpad, - (GstTaskFunction) gst_image_freeze_src_loop, self->srcpad); - ret = TRUE; - break; - } - case GST_EVENT_FLUSH_START: - gst_image_freeze_reset (self); - /* fall through */ - default: - ret = gst_pad_push_event (self->sinkpad, event); - break; - } - - gst_object_unref (self); - return ret; -} - -static GstFlowReturn -gst_image_freeze_sink_chain (GstPad * pad, GstBuffer * buffer) -{ - GstImageFreeze *self = GST_IMAGE_FREEZE (GST_PAD_PARENT (pad)); - GstFlowReturn ret = GST_FLOW_OK; - - GST_OBJECT_LOCK (self); - if (self->buffer) { - GST_DEBUG_OBJECT (pad, "Already have a buffer, dropping"); - gst_buffer_unref (buffer); - GST_OBJECT_UNLOCK (self); - return ret; - } - - self->buffer = buffer; - GST_OBJECT_UNLOCK (self); - - gst_pad_start_task (self->srcpad, (GstTaskFunction) gst_image_freeze_src_loop, - self->srcpad); - return ret; -} - -static void -gst_image_freeze_src_loop (GstPad * pad) -{ - GstImageFreeze *self = GST_IMAGE_FREEZE (GST_PAD_PARENT (pad)); - GstBuffer *buffer; - guint64 offset; - GstClockTime timestamp, duration; - gint64 cstart, cstop; - gboolean in_seg, eos; - - GST_OBJECT_LOCK (self); - if (!self->buffer) { - GST_ERROR_OBJECT (pad, "Have no buffer yet"); - GST_OBJECT_UNLOCK (self); - gst_pad_pause_task (self->srcpad); - return; - } - buffer = gst_buffer_ref (self->buffer); - buffer = gst_buffer_make_metadata_writable (buffer); - GST_OBJECT_UNLOCK (self); - - if (self->close_segment) { - GST_DEBUG_OBJECT (pad, "Closing previous segment"); - gst_pad_push_event (self->srcpad, self->close_segment); - self->close_segment = NULL; - } - - if (self->need_segment) { - GstEvent *e; - - GST_DEBUG_OBJECT (pad, "Pushing NEWSEGMENT event: %" GST_SEGMENT_FORMAT, - &self->segment); - e = gst_event_new_new_segment_full (FALSE, self->segment.rate, - self->segment.applied_rate, self->segment.format, self->segment.start, - self->segment.stop, self->segment.start); - - GST_OBJECT_LOCK (self); - if (self->segment.rate >= 0) { - self->offset = - gst_util_uint64_scale (self->segment.start, self->fps_n, - self->fps_d * GST_SECOND); - } else { - self->offset = - gst_util_uint64_scale (self->segment.stop, self->fps_n, - self->fps_d * GST_SECOND); - } - GST_OBJECT_UNLOCK (self); - - self->need_segment = FALSE; - - gst_pad_push_event (self->srcpad, e); - } - - GST_OBJECT_LOCK (self); - offset = self->offset; - - if (self->fps_n != 0) { - timestamp = - gst_util_uint64_scale (offset, self->fps_d * GST_SECOND, self->fps_n); - duration = gst_util_uint64_scale_int (GST_SECOND, self->fps_d, self->fps_n); - } else { - timestamp = self->segment.start; - duration = GST_CLOCK_TIME_NONE; - } - eos = (self->fps_n == 0 && offset > 0) || - (self->segment.rate >= 0 && self->segment.stop != -1 - && timestamp > self->segment.stop) || (self->segment.rate < 0 - && offset == 0) || (self->segment.rate < 0 - && self->segment.start != -1 - && timestamp + duration < self->segment.start); - - if (self->fps_n == 0 && offset > 0) - in_seg = FALSE; - else - in_seg = - gst_segment_clip (&self->segment, GST_FORMAT_TIME, timestamp, - timestamp + duration, &cstart, &cstop); - - if (in_seg) - gst_segment_set_last_stop (&self->segment, GST_FORMAT_TIME, cstart); - - if (self->segment.rate >= 0) - self->offset++; - else - self->offset--; - GST_OBJECT_UNLOCK (self); - - GST_DEBUG_OBJECT (pad, "Handling buffer with timestamp %" GST_TIME_FORMAT, - GST_TIME_ARGS (timestamp)); - - if (in_seg) { - GstFlowReturn ret; - - GST_BUFFER_TIMESTAMP (buffer) = cstart; - GST_BUFFER_DURATION (buffer) = cstop - cstart; - GST_BUFFER_OFFSET (buffer) = offset; - GST_BUFFER_OFFSET_END (buffer) = offset + 1; - gst_buffer_set_caps (buffer, GST_PAD_CAPS (self->srcpad)); - ret = gst_pad_push (self->srcpad, buffer); - GST_DEBUG_OBJECT (pad, "Pushing buffer resulted in %s", - gst_flow_get_name (ret)); - if (ret != GST_FLOW_OK) - gst_pad_pause_task (self->srcpad); - } else { - gst_buffer_unref (buffer); - } - - if (eos) { - if ((self->segment.flags & GST_SEEK_FLAG_SEGMENT)) { - GstMessage *m; - - GST_DEBUG_OBJECT (pad, "Sending segment done at end of segment"); - if (self->segment.rate >= 0) - m = gst_message_new_segment_done (GST_OBJECT_CAST (self), - GST_FORMAT_TIME, self->segment.stop); - else - m = gst_message_new_segment_done (GST_OBJECT_CAST (self), - GST_FORMAT_TIME, self->segment.start); - gst_element_post_message (GST_ELEMENT_CAST (self), m); - } else { - GST_DEBUG_OBJECT (pad, "Sending EOS at end of segment"); - gst_pad_push_event (self->srcpad, gst_event_new_eos ()); - } - gst_pad_pause_task (self->srcpad); - } -} - -static GstStateChangeReturn -gst_image_freeze_change_state (GstElement * element, GstStateChange transition) -{ - GstImageFreeze *self = GST_IMAGE_FREEZE (element); - GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; - - switch (transition) { - case GST_STATE_CHANGE_READY_TO_PAUSED: - gst_image_freeze_reset (self); - break; - case GST_STATE_CHANGE_PAUSED_TO_READY: - gst_pad_stop_task (self->srcpad); - gst_image_freeze_reset (self); - break; - default: - break; - } - - if (GST_ELEMENT_CLASS (parent_class)->change_state) - ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); - - switch (transition) { - default: - break; - } - - return ret; -} - -static gboolean -plugin_init (GstPlugin * plugin) -{ - GST_DEBUG_CATEGORY_INIT (gst_image_freeze_debug, "imagefreeze", 0, - "imagefreeze element"); - - if (!gst_element_register (plugin, "imagefreeze", GST_RANK_NONE, - GST_TYPE_IMAGE_FREEZE)) - return FALSE; - - return TRUE; -} - -GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "imagefreeze", - "Still frame stream generator", - plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/imagefreeze/gstimagefreeze.h b/gst/imagefreeze/gstimagefreeze.h deleted file mode 100644 index c65a3cd648..0000000000 --- a/gst/imagefreeze/gstimagefreeze.h +++ /dev/null @@ -1,69 +0,0 @@ -/* GStreamer - * Copyright (C) 2010 Sebastian Dröge - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __GST_IMAGE_FREEZE_H__ -#define __GST_IMAGE_FREEZE_H__ - -#include - -G_BEGIN_DECLS - -#define GST_TYPE_IMAGE_FREEZE \ - (gst_image_freeze_get_type()) -#define GST_IMAGE_FREEZE(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_IMAGE_FREEZE,GstImageFreeze)) -#define GST_IMAGE_FREEZE_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_IMAGE_FREEZE,GstImageFreezeClass)) -#define GST_IMAGE_FREEZE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_IMAGE_FREEZE,GstImageFreezeClass)) -#define GST_IS_IMAGE_FREEZE(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_IMAGE_FREEZE)) -#define GST_IS_IMAGE_FREEZE_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_IMAGE_FREEZE)) - -typedef struct _GstImageFreeze GstImageFreeze; -typedef struct _GstImageFreezeClass GstImageFreezeClass; - -struct _GstImageFreeze -{ - GstElement parent; - - /* < private > */ - GstPad *sinkpad; - GstPad *srcpad; - - GstBuffer *buffer; - gint fps_n, fps_d; - - GstSegment segment; - gboolean need_segment; - GstEvent *close_segment; - - guint64 offset; -}; - -struct _GstImageFreezeClass -{ - GstElementClass parent_class; -}; - -GType gst_image_freeze_get_type (void); - -G_END_DECLS - -#endif /* __GST_IMAGE_FREEZE_H__ */ diff --git a/tests/check/Makefile.am b/tests/check/Makefile.am index 2f7e1e2158..3096006772 100644 --- a/tests/check/Makefile.am +++ b/tests/check/Makefile.am @@ -126,7 +126,6 @@ check_PROGRAMS = \ elements/asfmux \ elements/camerabin \ elements/dataurisrc \ - elements/imagefreeze \ elements/legacyresample \ elements/jpegparse \ elements/qtmux \ @@ -170,7 +169,4 @@ elements_rtpmux_LDADD = $(GST_BASE_LIBS) $(LDADD) -lgstrtp-0.10 elements_assrender_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS) elements_assrender_LDADD = $(GST_BASE_LIBS) $(LDADD) -lgstvideo-0.10 -lgstapp-0.10 -elements_imagefreeze_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS) -elements_imagefreeze_LDADD = $(GST_BASE_LIBS) $(LDADD) -lgstvideo-0.10 - EXTRA_DIST = gst-plugins-bad.supp diff --git a/tests/check/elements/.gitignore b/tests/check/elements/.gitignore index a140c984f2..6af8803259 100644 --- a/tests/check/elements/.gitignore +++ b/tests/check/elements/.gitignore @@ -11,7 +11,6 @@ faac faad gdpdepay gdppay -imagefreeze interleave jpegparse kate diff --git a/tests/check/elements/imagefreeze.c b/tests/check/elements/imagefreeze.c deleted file mode 100644 index eb2243d3d2..0000000000 --- a/tests/check/elements/imagefreeze.c +++ /dev/null @@ -1,446 +0,0 @@ -/* GStreamer - * Copyright (C) 2010 Sebastian Dröge - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include - -#include -#include - -static gboolean -bus_handler (GstBus * bus, GstMessage * message, gpointer data) -{ - GMainLoop *loop = (GMainLoop *) data; - - switch (message->type) { - case GST_MESSAGE_EOS: - g_main_loop_quit (loop); - break; - case GST_MESSAGE_WARNING: - case GST_MESSAGE_ERROR:{ - GError *gerror; - gchar *debug; - - if (message->type == GST_MESSAGE_WARNING) - gst_message_parse_warning (message, &gerror, &debug); - else - gst_message_parse_error (message, &gerror, &debug); - g_error ("error from %s: %s (%s)\n", - GST_ELEMENT_NAME (GST_MESSAGE_SRC (message)), gerror->message, - GST_STR_NULL (debug)); - gst_message_unref (message); - g_error_free (gerror); - g_free (debug); - g_main_loop_quit (loop); - break; - } - default: - break; - } - - return TRUE; -} - -static GstElement * -setup_imagefreeze (const GstCaps * caps1, const GstCaps * caps2, - GCallback sink_handoff, gpointer sink_handoff_data) -{ - GstElement *pipeline; - GstElement *videotestsrc, *capsfilter1, *imagefreeze, *capsfilter2, *fakesink; - - pipeline = gst_pipeline_new ("pipeline"); - fail_unless (pipeline != NULL); - - videotestsrc = gst_element_factory_make ("videotestsrc", NULL); - fail_unless (videotestsrc != NULL); - g_object_set (videotestsrc, "num-buffers", 1, NULL); - - capsfilter1 = gst_element_factory_make ("capsfilter", NULL); - fail_unless (capsfilter1 != NULL); - g_object_set (capsfilter1, "caps", caps1, NULL); - - imagefreeze = gst_element_factory_make ("imagefreeze", NULL); - fail_unless (imagefreeze != NULL); - - capsfilter2 = gst_element_factory_make ("capsfilter", NULL); - fail_unless (capsfilter2 != NULL); - g_object_set (capsfilter2, "caps", caps2, NULL); - - fakesink = gst_element_factory_make ("fakesink", NULL); - fail_unless (fakesink != NULL); - g_object_set (fakesink, "signal-handoffs", TRUE, "async", FALSE, NULL); - g_signal_connect (fakesink, "handoff", sink_handoff, sink_handoff_data); - - gst_bin_add_many (GST_BIN (pipeline), videotestsrc, capsfilter1, imagefreeze, - capsfilter2, fakesink, NULL); - - fail_unless (gst_element_link_pads (videotestsrc, "src", capsfilter1, - "sink")); - fail_unless (gst_element_link_pads (capsfilter1, "src", imagefreeze, "sink")); - fail_unless (gst_element_link_pads (imagefreeze, "src", capsfilter2, "sink")); - fail_unless (gst_element_link_pads (capsfilter2, "src", fakesink, "sink")); - - return pipeline; -} - -static void -sink_handoff_cb_0_1 (GstElement * object, GstBuffer * buffer, GstPad * pad, - gpointer user_data) -{ - guint *n_buffers = (guint *) user_data; - - fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buffer), 0); - fail_unless_equals_uint64 (GST_BUFFER_DURATION (buffer), GST_CLOCK_TIME_NONE); - fail_unless_equals_uint64 (GST_BUFFER_OFFSET (buffer), 0); - fail_unless_equals_uint64 (GST_BUFFER_OFFSET_END (buffer), 1); - - *n_buffers = *n_buffers + 1; -} - -GST_START_TEST (test_imagefreeze_0_1) -{ - GstElement *pipeline; - GstCaps *caps1, *caps2; - GstBus *bus; - GMainLoop *loop; - guint n_buffers = 0; - - caps1 = - gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); - caps2 = - gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 0, 1, 1, 1); - - pipeline = - setup_imagefreeze (caps1, caps2, G_CALLBACK (sink_handoff_cb_0_1), - &n_buffers); - - loop = g_main_loop_new (NULL, TRUE); - fail_unless (loop != NULL); - - bus = gst_element_get_bus (pipeline); - fail_unless (bus != NULL); - gst_bus_add_watch (bus, bus_handler, loop); - gst_object_unref (bus); - - fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING), - GST_STATE_CHANGE_SUCCESS); - - g_main_loop_run (loop); - - fail_unless_equals_int (n_buffers, 1); - - gst_element_set_state (pipeline, GST_STATE_NULL); - - g_object_unref (pipeline); - g_main_loop_unref (loop); - gst_caps_unref (caps1); - gst_caps_unref (caps2); -} - -GST_END_TEST; - -static void -sink_handoff_cb_25_1_0ms_400ms (GstElement * object, GstBuffer * buffer, - GstPad * pad, gpointer user_data) -{ - guint *n_buffers = (guint *) user_data; - - fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buffer), - *n_buffers * 40 * GST_MSECOND); - fail_unless_equals_uint64 (GST_BUFFER_DURATION (buffer), 40 * GST_MSECOND); - fail_unless_equals_uint64 (GST_BUFFER_OFFSET (buffer), *n_buffers); - fail_unless_equals_uint64 (GST_BUFFER_OFFSET_END (buffer), *n_buffers + 1); - - *n_buffers = *n_buffers + 1; -} - -GST_START_TEST (test_imagefreeze_25_1_0ms_400ms) -{ - GstElement *pipeline; - GstCaps *caps1, *caps2; - GstBus *bus; - GMainLoop *loop; - guint n_buffers = 0; - - caps1 = - gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); - caps2 = - gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); - - pipeline = - setup_imagefreeze (caps1, caps2, - G_CALLBACK (sink_handoff_cb_25_1_0ms_400ms), &n_buffers); - - loop = g_main_loop_new (NULL, TRUE); - fail_unless (loop != NULL); - - bus = gst_element_get_bus (pipeline); - fail_unless (bus != NULL); - gst_bus_add_watch (bus, bus_handler, loop); - gst_object_unref (bus); - - fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING), - GST_STATE_CHANGE_SUCCESS); - - fail_unless (gst_element_seek (pipeline, 1.0, GST_FORMAT_TIME, - GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET, - 400 * GST_MSECOND)); - - fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING), - GST_STATE_CHANGE_SUCCESS); - - g_main_loop_run (loop); - - fail_unless_equals_int (n_buffers, 10); - - gst_element_set_state (pipeline, GST_STATE_NULL); - - g_object_unref (pipeline); - g_main_loop_unref (loop); - gst_caps_unref (caps1); - gst_caps_unref (caps2); -} - -GST_END_TEST; - -static void -sink_handoff_cb_25_1_200ms_400ms (GstElement * object, GstBuffer * buffer, - GstPad * pad, gpointer user_data) -{ - guint *n_buffers = (guint *) user_data; - - fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buffer), - 200 * GST_MSECOND + *n_buffers * 40 * GST_MSECOND); - fail_unless_equals_uint64 (GST_BUFFER_DURATION (buffer), 40 * GST_MSECOND); - fail_unless_equals_uint64 (GST_BUFFER_OFFSET (buffer), 5 + *n_buffers); - fail_unless_equals_uint64 (GST_BUFFER_OFFSET_END (buffer), - 5 + *n_buffers + 1); - - *n_buffers = *n_buffers + 1; -} - -GST_START_TEST (test_imagefreeze_25_1_200ms_400ms) -{ - GstElement *pipeline; - GstCaps *caps1, *caps2; - GstBus *bus; - GMainLoop *loop; - guint n_buffers = 0; - - caps1 = - gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); - caps2 = - gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); - - pipeline = - setup_imagefreeze (caps1, caps2, - G_CALLBACK (sink_handoff_cb_25_1_200ms_400ms), &n_buffers); - - loop = g_main_loop_new (NULL, TRUE); - fail_unless (loop != NULL); - - bus = gst_element_get_bus (pipeline); - fail_unless (bus != NULL); - gst_bus_add_watch (bus, bus_handler, loop); - gst_object_unref (bus); - - fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING), - GST_STATE_CHANGE_SUCCESS); - - fail_unless (gst_element_seek (pipeline, 1.0, GST_FORMAT_TIME, - GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 200 * GST_MSECOND, - GST_SEEK_TYPE_SET, 400 * GST_MSECOND)); - - fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING), - GST_STATE_CHANGE_SUCCESS); - - g_main_loop_run (loop); - - fail_unless_equals_int (n_buffers, 5); - - gst_element_set_state (pipeline, GST_STATE_NULL); - - g_object_unref (pipeline); - g_main_loop_unref (loop); - gst_caps_unref (caps1); - gst_caps_unref (caps2); -} - -GST_END_TEST; - -static void -sink_handoff_cb_25_1_400ms_0ms (GstElement * object, GstBuffer * buffer, - GstPad * pad, gpointer user_data) -{ - guint *n_buffers = (guint *) user_data; - - fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buffer), - 400 * GST_MSECOND - (*n_buffers + 1) * 40 * GST_MSECOND); - fail_unless_equals_uint64 (GST_BUFFER_DURATION (buffer), 40 * GST_MSECOND); - fail_unless_equals_uint64 (GST_BUFFER_OFFSET (buffer), 10 - (*n_buffers + 1)); - fail_unless_equals_uint64 (GST_BUFFER_OFFSET_END (buffer), - 10 - (*n_buffers + 1) + 1); - - *n_buffers = *n_buffers + 1; -} - -GST_START_TEST (test_imagefreeze_25_1_400ms_0ms) -{ - GstElement *pipeline; - GstCaps *caps1, *caps2; - GstBus *bus; - GMainLoop *loop; - guint n_buffers = 0; - - caps1 = - gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); - caps2 = - gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); - - pipeline = - setup_imagefreeze (caps1, caps2, - G_CALLBACK (sink_handoff_cb_25_1_400ms_0ms), &n_buffers); - - loop = g_main_loop_new (NULL, TRUE); - fail_unless (loop != NULL); - - bus = gst_element_get_bus (pipeline); - fail_unless (bus != NULL); - gst_bus_add_watch (bus, bus_handler, loop); - gst_object_unref (bus); - - fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING), - GST_STATE_CHANGE_SUCCESS); - - fail_unless (gst_element_seek (pipeline, -1.0, GST_FORMAT_TIME, - GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET, - 400 * GST_MSECOND)); - - fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING), - GST_STATE_CHANGE_SUCCESS); - - g_main_loop_run (loop); - - fail_unless_equals_int (n_buffers, 10); - - gst_element_set_state (pipeline, GST_STATE_NULL); - - g_object_unref (pipeline); - g_main_loop_unref (loop); - gst_caps_unref (caps1); - gst_caps_unref (caps2); -} - -GST_END_TEST; - -static void -sink_handoff_cb_25_1_220ms_380ms (GstElement * object, GstBuffer * buffer, - GstPad * pad, gpointer user_data) -{ - guint *n_buffers = (guint *) user_data; - - if (*n_buffers == 0) { - fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buffer), - 220 * GST_MSECOND); - fail_unless_equals_uint64 (GST_BUFFER_DURATION (buffer), 20 * GST_MSECOND); - } else if (*n_buffers == 4) { - fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buffer), - 360 * GST_MSECOND); - fail_unless_equals_uint64 (GST_BUFFER_DURATION (buffer), 20 * GST_MSECOND); - } else { - fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buffer), - 200 * GST_MSECOND + *n_buffers * 40 * GST_MSECOND); - fail_unless_equals_uint64 (GST_BUFFER_DURATION (buffer), 40 * GST_MSECOND); - } - - fail_unless_equals_uint64 (GST_BUFFER_OFFSET (buffer), 5 + *n_buffers); - fail_unless_equals_uint64 (GST_BUFFER_OFFSET_END (buffer), - 5 + *n_buffers + 1); - - *n_buffers = *n_buffers + 1; -} - -GST_START_TEST (test_imagefreeze_25_1_220ms_380ms) -{ - GstElement *pipeline; - GstCaps *caps1, *caps2; - GstBus *bus; - GMainLoop *loop; - guint n_buffers = 0; - - caps1 = - gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); - caps2 = - gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1); - - pipeline = - setup_imagefreeze (caps1, caps2, - G_CALLBACK (sink_handoff_cb_25_1_220ms_380ms), &n_buffers); - - loop = g_main_loop_new (NULL, TRUE); - fail_unless (loop != NULL); - - bus = gst_element_get_bus (pipeline); - fail_unless (bus != NULL); - gst_bus_add_watch (bus, bus_handler, loop); - gst_object_unref (bus); - - fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING), - GST_STATE_CHANGE_SUCCESS); - - fail_unless (gst_element_seek (pipeline, 1.0, GST_FORMAT_TIME, - GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 220 * GST_MSECOND, - GST_SEEK_TYPE_SET, 380 * GST_MSECOND)); - - fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING), - GST_STATE_CHANGE_SUCCESS); - - g_main_loop_run (loop); - - fail_unless_equals_int (n_buffers, 5); - - gst_element_set_state (pipeline, GST_STATE_NULL); - - g_object_unref (pipeline); - g_main_loop_unref (loop); - gst_caps_unref (caps1); - gst_caps_unref (caps2); -} - -GST_END_TEST; - -static Suite * -imagefreeze_suite (void) -{ - Suite *s = suite_create ("imagefreeze"); - TCase *tc_chain = tcase_create ("linear"); - - /* time out after 120s, not the default 3 */ - tcase_set_timeout (tc_chain, 120); - - suite_add_tcase (s, tc_chain); - tcase_add_test (tc_chain, test_imagefreeze_0_1); - tcase_add_test (tc_chain, test_imagefreeze_25_1_0ms_400ms); - tcase_add_test (tc_chain, test_imagefreeze_25_1_200ms_400ms); - tcase_add_test (tc_chain, test_imagefreeze_25_1_400ms_0ms); - tcase_add_test (tc_chain, test_imagefreeze_25_1_220ms_380ms); - - return s; -} - -GST_CHECK_MAIN (imagefreeze);