Commit b5ee4225 authored by Tim-Philipp Müller's avatar Tim-Philipp Müller 🐠

Make progressreport element post messages with the current progress on the...

Make progressreport element post messages with the current progress on the bus. Also add some basic docs for it.

Original commit message from CVS:
* docs/plugins/Makefile.am:
* docs/plugins/gst-plugins-good-plugins-docs.sgml:
* docs/plugins/gst-plugins-good-plugins-sections.txt:
* docs/plugins/gst-plugins-good-plugins.hierarchy:
* gst/debug/Makefile.am:
* gst/debug/progressreport.c: (gst_progress_report_post_progress),
(gst_progress_report_do_query), (gst_progress_report_report):
Make progressreport element post messages with the current progress
on the bus. Also add some basic docs for it.
parent 784a4689
2007-02-07 Tim-Philipp Müller <tim at centricular dot net>
* docs/plugins/Makefile.am:
* docs/plugins/gst-plugins-good-plugins-docs.sgml:
* docs/plugins/gst-plugins-good-plugins-sections.txt:
* docs/plugins/gst-plugins-good-plugins.hierarchy:
* gst/debug/Makefile.am:
* gst/debug/progressreport.c: (gst_progress_report_post_progress),
(gst_progress_report_do_query), (gst_progress_report_report):
Make progressreport element post messages with the current progress
on the bus. Also add some basic docs for it.
2007-01-30 Tim-Philipp Müller <tim at centricular dot net>
* ext/hal/hal.c: (gst_hal_get_string):
......
......@@ -82,6 +82,7 @@ EXTRA_HFILES = \
$(top_srcdir)/gst/autodetect/gstautovideosink.h \
$(top_srcdir)/gst/avi/gstavidemux.h \
$(top_srcdir)/gst/avi/gstavimux.h \
$(top_srcdir)/gst/debug/progressreport.h \
$(top_srcdir)/gst/level/gstlevel.h \
$(top_srcdir)/gst/goom/gstgoom.h \
$(top_srcdir)/gst/id3demux/gstid3demux.h \
......
......@@ -44,6 +44,7 @@
<xi:include href="xml/element-ossmixer.xml" />
<xi:include href="xml/element-osssink.xml" />
<xi:include href="xml/element-osssrc.xml" />
<xi:include href="xml/element-progressreport.xml" />
<xi:include href="xml/element-rtspsrc.xml" />
<xi:include href="xml/element-rtpdec.xml" />
<xi:include href="xml/element-smokedec.xml" />
......
......@@ -449,6 +449,20 @@ GST_IS_OSS_SRC_CLASS
gst_oss_src_get_type
</SECTION>
<SECTION>
<FILE>element-progressreport</FILE>
GstProgressReport
<TITLE>progressreport</TITLE>
<SUBSECTION Standard>
GstProgressReportClass
GST_TYPE_PROGRESS_REPORT
GST_PROGRESS_REPORT
GST_PROGRESS_REPORT_CLASS
GST_IS_PROGRESS_REPORT
GST_IS_PROGRESS_REPORT_CLASS
gst_progress_report_get_type
</SECTION>
<SECTION>
<FILE>element-rtspsrc</FILE>
GstRTSPProto
......
......@@ -6,7 +6,7 @@ endif
plugin_LTLIBRARIES = $(EFENCE_PLUGIN) libgstdebug.la libgstnavigationtest.la
noinst_HEADERS = efence.h gstnavigationtest.h gstnavseek.h tests.h
noinst_HEADERS = efence.h gstnavigationtest.h gstnavseek.h progressreport.h tests.h
libgstefence_la_SOURCES = efence.c
libgstefence_la_CFLAGS = $(GST_CFLAGS)
......@@ -24,6 +24,7 @@ libgstdebug_la_SOURCES = \
gstdebug.c \
breakmydata.c \
progressreport.c \
progressreport.h \
gstnavseek.c \
tests.c \
testplugin.c
......
/* GStreamer
/* GStreamer Progress Report Element
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
* Copyright (C) <2003> David Schleef <ds@schleef.org>
* Copyright (C) <2004> Jan Schmidt <thaytan@mad.scientist.com>
......@@ -20,48 +20,60 @@
* Boston, MA 02111-1307, USA.
*/
/**
* SECTION:element-progressreport
* @short_description: Reports progress
* @see_also:
*
* <refsect2>
* <para>
* The progressreport element can be put into a pipeline to report progress,
* which is done by doing upstream duration and position queries in regular
* (real-time) intervals. Both the interval and the prefered query format
* can be specified via the "update-freq" and the "format" property.
* </para>
* <para>
* Element messages containing a "progress" structure are posted on the bus
* whenever progress has been queried (since gst-plugins-good 0.10.6 only).
* </para>
* <para>
* Since the element was originally designed for debugging purposes, it will
* by default also print information about the current progress to the
* terminal. This can be prevented by setting the "silent" property to TRUE.
* </para>
* <para>
* This element is most useful in transcoding pipelines or other situations
* where just querying the pipeline might not lead to the wanted result. For
* progress in TIME format, the element is best placed in a 'raw stream'
* section of the pipeline (or after any demuxers/decoders/parsers).
* </para>
* <title>Example launch line</title>
* <para>
* <programlisting>
* gst-launch -m filesrc location=foo.ogg ! decodebin ! progressreport update-freq=1 ! audioconvert ! audioresample ! autoaudiosink
* </programlisting>
* This shows a progress query where a duration is available.
* </para>
* <para>
* <programlisting>
* gst-launch -m audiotestsrc ! progressreport update-freq=1 ! audioconvert ! autoaudiosink
* </programlisting>
* This shows a progress query where no duration is available.
* </para>
* </refsect2>
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <gst/gst.h>
#include <gst/base/gstbasetransform.h>
#include <string.h>
#include <math.h>
#include <time.h>
#define GST_TYPE_PROGRESS_REPORT \
(gst_progress_report_get_type())
#define GST_PROGRESS_REPORT(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PROGRESS_REPORT,GstProgressReport))
#define GST_PROGRESS_REPORT_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PROGRESS_REPORT,GstProgressReportClass))
#define GST_IS_PROGRESS_REPORT(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PROGRESS_REPORT))
#define GST_IS_PROGRESS_REPORT_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PROGRESS_REPORT))
typedef struct _GstProgressReport GstProgressReport;
typedef struct _GstProgressReportClass GstProgressReportClass;
struct _GstProgressReport
{
GstBaseTransform basetransform;
gint update_freq;
gboolean silent;
GTimeVal start_time;
GTimeVal last_report;
#include "progressreport.h"
/* Format used for querying. Using a string here because the
* format might not be registered yet when the property is set */
gchar *format;
};
struct _GstProgressReportClass
{
GstBaseTransformClass parent_class;
};
enum
{
......@@ -178,6 +190,37 @@ gst_progress_report_init (GstProgressReport * report,
report->format = g_strdup (DEFAULT_FORMAT);
}
static void
gst_progress_report_post_progress (GstProgressReport * filter,
GstFormat format, gint64 current, gint64 total)
{
GstStructure *s = NULL;
if (current >= 0 && total > 0) {
gdouble perc;
perc = gst_util_guint64_to_gdouble (current) * 100.0 /
gst_util_guint64_to_gdouble (total);
perc = CLAMP (perc, 0.0, 100.0);
/* we provide a "percent" field of integer type to stay compatible
* with qtdemux, but add a second "percent-double" field for those who
* want more precision and are too lazy to calculate it themselves */
s = gst_structure_new ("progress", "percent", G_TYPE_INT, (gint) perc,
"percent-double", G_TYPE_DOUBLE, perc, "current", G_TYPE_INT64, current,
"total", G_TYPE_INT64, total, NULL);
} else if (current >= 0) {
s = gst_structure_new ("progress", "current", G_TYPE_INT64, current, NULL);
}
if (s) {
GST_LOG_OBJECT (filter, "posting progress message: %" GST_PTR_FORMAT, s);
gst_structure_set (s, "format", GST_TYPE_FORMAT, format, NULL);
/* can't post it right here because we're holding the object lock */
filter->pending_msg = gst_message_new_element (GST_OBJECT_CAST (filter), s);
}
}
static gboolean
gst_progress_report_do_query (GstProgressReport * filter, GstFormat format,
gint hh, gint mm, gint ss)
......@@ -253,6 +296,7 @@ gst_progress_report_do_query (GstProgressReport * filter, GstFormat format,
}
}
gst_progress_report_post_progress (filter, format, cur, total);
return TRUE;
}
......@@ -263,6 +307,7 @@ gst_progress_report_report (GstProgressReport * filter, GTimeVal cur_time)
GST_FORMAT_PERCENT, GST_FORMAT_BUFFERS,
GST_FORMAT_DEFAULT
};
GstMessage *msg;
GstFormat format = GST_FORMAT_UNDEFINED;
gboolean done = FALSE;
glong run_time;
......@@ -297,7 +342,11 @@ gst_progress_report_report (GstProgressReport * filter, GTimeVal cur_time)
GST_OBJECT_NAME (filter), hh, mm, ss);
}
msg = filter->pending_msg;
filter->pending_msg = NULL;
GST_OBJECT_UNLOCK (filter);
gst_element_post_message (GST_ELEMENT_CAST (filter), msg);
}
static gboolean
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment