mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-11 09:55:36 +00:00
examples: remove prehistoric examples
This commit is contained in:
parent
e861c72efc
commit
d0ab9172c5
12 changed files with 0 additions and 939 deletions
|
@ -1,6 +0,0 @@
|
||||||
noinst_PROGRAMS = capsfilter1
|
|
||||||
|
|
||||||
LDADD = $(GST_LIBS)
|
|
||||||
AM_CFLAGS = $(GST_CFLAGS)
|
|
||||||
|
|
||||||
|
|
|
@ -1,87 +0,0 @@
|
||||||
#include <string.h>
|
|
||||||
#include <gst/gst.h>
|
|
||||||
|
|
||||||
/* This app uses a filter to connect colorspace and videosink
|
|
||||||
* so that only RGB data can pass the connection, colorspace will use
|
|
||||||
* a converter to convert the I420 data to RGB. Without a filter, this
|
|
||||||
* connection would use the I420 format (assuming Xv is enabled) */
|
|
||||||
|
|
||||||
static void
|
|
||||||
new_pad_func (GstElement * element, GstPad * newpad, gpointer data)
|
|
||||||
{
|
|
||||||
GstElement *pipeline = (GstElement *) data;
|
|
||||||
GstElement *queue = gst_bin_get_by_name (GST_BIN (pipeline), "queue");
|
|
||||||
|
|
||||||
if (!strcmp (gst_pad_get_name (newpad), "video_00")) {
|
|
||||||
gst_element_set_state (pipeline, GST_STATE_PAUSED);
|
|
||||||
gst_pad_link (newpad, gst_element_get_pad (queue, "sink"));
|
|
||||||
gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
gint
|
|
||||||
main (gint argc, gchar * argv[])
|
|
||||||
{
|
|
||||||
GstElement *pipeline;
|
|
||||||
GstElement *filesrc;
|
|
||||||
GstElement *demux;
|
|
||||||
GstElement *thread;
|
|
||||||
GstElement *queue;
|
|
||||||
GstElement *mpeg2dec;
|
|
||||||
GstElement *colorspace;
|
|
||||||
GstElement *videosink;
|
|
||||||
gboolean res;
|
|
||||||
|
|
||||||
gst_init (&argc, &argv);
|
|
||||||
|
|
||||||
if (argc < 2) {
|
|
||||||
g_print ("usage: %s <mpeg1 system stream>\n", argv[0]);
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
pipeline = gst_pipeline_new ("main_pipeline");
|
|
||||||
filesrc = gst_element_factory_make ("filesrc", "filesrc");
|
|
||||||
g_return_val_if_fail (filesrc, -1);
|
|
||||||
g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL);
|
|
||||||
demux = gst_element_factory_make ("mpegdemux", "demux");
|
|
||||||
g_return_val_if_fail (demux, -1);
|
|
||||||
g_signal_connect (G_OBJECT (demux), "new_pad", G_CALLBACK (new_pad_func),
|
|
||||||
pipeline);
|
|
||||||
|
|
||||||
thread = gst_thread_new ("thread");
|
|
||||||
queue = gst_element_factory_make ("queue", "queue");
|
|
||||||
mpeg2dec = gst_element_factory_make ("mpeg2dec", "mpeg2dec");
|
|
||||||
g_return_val_if_fail (mpeg2dec, -1);
|
|
||||||
colorspace = gst_element_factory_make ("videoconvert", "colorspace");
|
|
||||||
g_return_val_if_fail (colorspace, -1);
|
|
||||||
videosink = gst_element_factory_make (DEFAULT_VIDEOSINK, "videosink");
|
|
||||||
g_return_val_if_fail (videosink, -1);
|
|
||||||
|
|
||||||
gst_bin_add (GST_BIN (pipeline), filesrc);
|
|
||||||
gst_bin_add (GST_BIN (pipeline), demux);
|
|
||||||
|
|
||||||
gst_bin_add (GST_BIN (thread), queue);
|
|
||||||
gst_bin_add (GST_BIN (thread), mpeg2dec);
|
|
||||||
gst_bin_add (GST_BIN (thread), colorspace);
|
|
||||||
gst_bin_add (GST_BIN (thread), videosink);
|
|
||||||
gst_bin_add (GST_BIN (pipeline), thread);
|
|
||||||
|
|
||||||
gst_element_link_pads (filesrc, "src", demux, "sink");
|
|
||||||
gst_element_link_pads (queue, "src", mpeg2dec, "sink");
|
|
||||||
gst_element_link_pads (mpeg2dec, "src", colorspace, "sink");
|
|
||||||
/* force RGB data passing between colorspace and videosink */
|
|
||||||
res = gst_element_link_pads_filtered (colorspace, "src", videosink, "sink",
|
|
||||||
gst_caps_new_simple ("video/x-raw-rgb", NULL));
|
|
||||||
if (!res) {
|
|
||||||
g_print ("could not connect colorspace and videosink\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
|
||||||
|
|
||||||
while (gst_bin_iterate (GST_BIN (pipeline)));
|
|
||||||
|
|
||||||
gst_element_set_state (pipeline, GST_STATE_NULL);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
1
tests/examples/gstplay/.gitignore
vendored
1
tests/examples/gstplay/.gitignore
vendored
|
@ -1 +0,0 @@
|
||||||
player
|
|
|
@ -1,11 +0,0 @@
|
||||||
|
|
||||||
noinst_PROGRAMS = player
|
|
||||||
|
|
||||||
player_SOURCES = player.c
|
|
||||||
player_CFLAGS = $(GST_CFLAGS) $(GCONF_CFLAGS)
|
|
||||||
player_LDFLAGS = \
|
|
||||||
$(GST_LIBS) \
|
|
||||||
$(top_builddir)/gst-libs/gst/gconf/libgstgconf-@GST_API_VERSION@.la \
|
|
||||||
$(top_builddir)/gst-libs/gst/play/libgstplay-@GST_API_VERSION@.la \
|
|
||||||
$(top_builddir)/gst-libs/gst/libgstinterfaces-$(GST_API_VERSION).la
|
|
||||||
|
|
|
@ -1,176 +0,0 @@
|
||||||
/* GStreamer
|
|
||||||
* Copyright (C) 2003 Julien Moutte <julien@moutte.net>
|
|
||||||
*
|
|
||||||
* 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., 51 Franklin St, Fifth Floor,
|
|
||||||
* Boston, MA 02110-1301, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <gst/play/play.h>
|
|
||||||
#include <gst/gconf/gconf.h>
|
|
||||||
|
|
||||||
static GMainLoop *loop = NULL;
|
|
||||||
static gint64 length = 0;
|
|
||||||
|
|
||||||
static void
|
|
||||||
print_tag (const GstTagList * list, const gchar * tag, gpointer unused)
|
|
||||||
{
|
|
||||||
gint i, count;
|
|
||||||
|
|
||||||
count = gst_tag_list_get_tag_size (list, tag);
|
|
||||||
|
|
||||||
for (i = 0; i < count; i++) {
|
|
||||||
gchar *str;
|
|
||||||
|
|
||||||
if (gst_tag_get_type (tag) == G_TYPE_STRING) {
|
|
||||||
if (!gst_tag_list_get_string_index (list, tag, i, &str))
|
|
||||||
g_assert_not_reached ();
|
|
||||||
} else {
|
|
||||||
str =
|
|
||||||
g_strdup_value_contents (gst_tag_list_get_value_index (list, tag, i));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i == 0) {
|
|
||||||
g_print ("%15s: %s\n", gst_tag_get_nick (tag), str);
|
|
||||||
} else {
|
|
||||||
g_print (" : %s\n", str);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_free (str);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
got_found_tag (GstPlay * play, GstElement * source, GstTagList * tag_list)
|
|
||||||
{
|
|
||||||
gst_tag_list_foreach (tag_list, print_tag, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
got_time_tick (GstPlay * play, gint64 time_nanos)
|
|
||||||
{
|
|
||||||
g_print ("time tick %f\n", time_nanos / (float) GST_SECOND);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
got_stream_length (GstPlay * play, gint64 length_nanos)
|
|
||||||
{
|
|
||||||
g_print ("got length %" G_GUINT64_FORMAT "\n", length_nanos);
|
|
||||||
length = length_nanos;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
got_video_size (GstPlay * play, gint width, gint height)
|
|
||||||
{
|
|
||||||
g_print ("got video size %d, %d\n", width, height);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
got_eos (GstPlay * play)
|
|
||||||
{
|
|
||||||
g_print ("End Of Stream\n");
|
|
||||||
g_main_loop_quit (loop);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
seek_timer (GstPlay * play)
|
|
||||||
{
|
|
||||||
gst_play_seek_to_time (play, length / 2);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
main (int argc, char *argv[])
|
|
||||||
{
|
|
||||||
GstPlay *play;
|
|
||||||
GstElement *data_src, *video_sink, *audio_sink, *vis_element;
|
|
||||||
GError *error = NULL;
|
|
||||||
|
|
||||||
/* Initing GStreamer library */
|
|
||||||
gst_init (&argc, &argv);
|
|
||||||
|
|
||||||
if (argc != 2) {
|
|
||||||
g_print ("usage: %s <video filename>\n", argv[0]);
|
|
||||||
exit (-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
loop = g_main_loop_new (NULL, FALSE);
|
|
||||||
|
|
||||||
/* Creating the GstPlay object */
|
|
||||||
play = gst_play_new (&error);
|
|
||||||
if (error) {
|
|
||||||
g_print ("Error: could not create play object:\n%s\n", error->message);
|
|
||||||
g_error_free (error);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Getting default audio and video plugins from GConf */
|
|
||||||
vis_element = gst_element_factory_make ("goom", "vis_element");
|
|
||||||
data_src = gst_element_factory_make ("gnomevfssrc", "source");
|
|
||||||
|
|
||||||
audio_sink = gst_gconf_get_default_audio_sink ();
|
|
||||||
if (!GST_IS_ELEMENT (audio_sink))
|
|
||||||
g_error ("Could not get default audio sink from GConf");
|
|
||||||
video_sink = gst_gconf_get_default_video_sink ();
|
|
||||||
if (!GST_IS_ELEMENT (video_sink))
|
|
||||||
g_error ("Could not get default video sink from GConf");
|
|
||||||
|
|
||||||
|
|
||||||
/* Let's send them to GstPlay object */
|
|
||||||
if (!gst_play_set_audio_sink (play, audio_sink))
|
|
||||||
g_warning ("Could not set audio sink");
|
|
||||||
if (!gst_play_set_video_sink (play, video_sink))
|
|
||||||
g_warning ("Could not set video sink");
|
|
||||||
if (!gst_play_set_data_src (play, data_src))
|
|
||||||
g_warning ("Could not set data src");
|
|
||||||
if (!gst_play_set_visualization (play, vis_element))
|
|
||||||
g_warning ("Could not set visualisation");
|
|
||||||
|
|
||||||
/* Setting location we want to play */
|
|
||||||
if (!gst_play_set_location (play, argv[1]))
|
|
||||||
g_warning ("Could not set location");
|
|
||||||
|
|
||||||
/* Uncomment that line to get an XML dump of the pipeline */
|
|
||||||
/* gst_xml_write_file (GST_ELEMENT (play), stdout); */
|
|
||||||
|
|
||||||
g_signal_connect (G_OBJECT (play), "time_tick",
|
|
||||||
G_CALLBACK (got_time_tick), NULL);
|
|
||||||
g_signal_connect (G_OBJECT (play), "stream_length",
|
|
||||||
G_CALLBACK (got_stream_length), NULL);
|
|
||||||
g_signal_connect (G_OBJECT (play), "have_video_size",
|
|
||||||
G_CALLBACK (got_video_size), NULL);
|
|
||||||
g_signal_connect (G_OBJECT (play), "found_tag",
|
|
||||||
G_CALLBACK (got_found_tag), NULL);
|
|
||||||
g_signal_connect (G_OBJECT (play), "error",
|
|
||||||
G_CALLBACK (gst_element_default_error), NULL);
|
|
||||||
g_signal_connect (G_OBJECT (play), "eos", G_CALLBACK (got_eos), NULL);
|
|
||||||
|
|
||||||
/* Change state to PLAYING */
|
|
||||||
if (gst_element_set_state (GST_ELEMENT (play),
|
|
||||||
GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE)
|
|
||||||
g_error ("Could not set state to PLAYING");
|
|
||||||
|
|
||||||
g_timeout_add (20000, (GSourceFunc) seek_timer, play);
|
|
||||||
|
|
||||||
g_main_loop_run (loop);
|
|
||||||
|
|
||||||
g_print ("setting pipeline to ready\n");
|
|
||||||
|
|
||||||
gst_element_set_state (GST_ELEMENT (play), GST_STATE_READY);
|
|
||||||
|
|
||||||
/* unref
|
|
||||||
gst_object_unref (GST_OBJECT (play)); */
|
|
||||||
|
|
||||||
exit (0);
|
|
||||||
}
|
|
1
tests/examples/indexing/.gitignore
vendored
1
tests/examples/indexing/.gitignore
vendored
|
@ -1 +0,0 @@
|
||||||
indexmpeg
|
|
|
@ -1,7 +0,0 @@
|
||||||
examples = indexmpeg
|
|
||||||
|
|
||||||
noinst_PROGRAMS = $(examples)
|
|
||||||
|
|
||||||
# we have nothing but apps here, we can do this safely
|
|
||||||
LIBS = $(GST_LIBS) $(GTK_LIBS)
|
|
||||||
AM_CFLAGS = $(GST_CFLAGS) $(GTK_CFLAGS)
|
|
|
@ -1,321 +0,0 @@
|
||||||
/* GStreamer
|
|
||||||
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
|
|
||||||
*
|
|
||||||
* 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., 51 Franklin St, Fifth Floor,
|
|
||||||
* Boston, MA 02110-1301, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <gst/gst.h>
|
|
||||||
|
|
||||||
static gboolean verbose = FALSE;
|
|
||||||
static gboolean quiet = FALSE;
|
|
||||||
|
|
||||||
static void
|
|
||||||
entry_added (GstIndex * index, GstIndexEntry * entry)
|
|
||||||
{
|
|
||||||
switch (entry->type) {
|
|
||||||
case GST_INDEX_ENTRY_ID:
|
|
||||||
g_print ("id %d describes writer %s\n", entry->id,
|
|
||||||
GST_INDEX_ID_DESCRIPTION (entry));
|
|
||||||
break;
|
|
||||||
case GST_INDEX_ENTRY_FORMAT:
|
|
||||||
g_print ("%d: registered format %d for %s\n", entry->id,
|
|
||||||
GST_INDEX_FORMAT_FORMAT (entry), GST_INDEX_FORMAT_KEY (entry));
|
|
||||||
break;
|
|
||||||
case GST_INDEX_ENTRY_ASSOCIATION:
|
|
||||||
{
|
|
||||||
gint i;
|
|
||||||
|
|
||||||
g_print ("%p, %d: %08x ", entry, entry->id,
|
|
||||||
GST_INDEX_ASSOC_FLAGS (entry));
|
|
||||||
for (i = 0; i < GST_INDEX_NASSOCS (entry); i++) {
|
|
||||||
g_print ("%d %" G_GINT64_FORMAT " ", GST_INDEX_ASSOC_FORMAT (entry, i),
|
|
||||||
GST_INDEX_ASSOC_VALUE (entry, i));
|
|
||||||
}
|
|
||||||
g_print ("\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
const gchar *padname;
|
|
||||||
GstPad *target;
|
|
||||||
GstElement *bin;
|
|
||||||
GstElement *pipeline;
|
|
||||||
GstIndex *index;
|
|
||||||
}
|
|
||||||
dyn_link;
|
|
||||||
|
|
||||||
static void
|
|
||||||
dynamic_link (GstPadTemplate * templ, GstPad * newpad, gpointer data)
|
|
||||||
{
|
|
||||||
dyn_link *link = (dyn_link *) data;
|
|
||||||
|
|
||||||
if (!strcmp (gst_pad_get_name (newpad), link->padname)) {
|
|
||||||
gst_element_set_state (link->pipeline, GST_STATE_PAUSED);
|
|
||||||
gst_bin_add (GST_BIN (link->pipeline), link->bin);
|
|
||||||
gst_pad_link (newpad, link->target);
|
|
||||||
gst_element_set_index (link->bin, link->index);
|
|
||||||
gst_element_set_state (link->pipeline, GST_STATE_PLAYING);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
setup_dynamic_linking (GstElement * pipeline,
|
|
||||||
GstElement * element,
|
|
||||||
const gchar * padname, GstPad * target, GstElement * bin, GstIndex * index)
|
|
||||||
{
|
|
||||||
dyn_link *link;
|
|
||||||
|
|
||||||
link = g_new0 (dyn_link, 1);
|
|
||||||
link->padname = g_strdup (padname);
|
|
||||||
link->target = target;
|
|
||||||
link->bin = bin;
|
|
||||||
link->pipeline = pipeline;
|
|
||||||
link->index = index;
|
|
||||||
|
|
||||||
g_signal_connect (G_OBJECT (element), "new-pad", G_CALLBACK (dynamic_link),
|
|
||||||
link);
|
|
||||||
}
|
|
||||||
|
|
||||||
static GstElement *
|
|
||||||
make_mpeg_systems_pipeline (const gchar * path, GstIndex * index)
|
|
||||||
{
|
|
||||||
GstElement *pipeline;
|
|
||||||
GstElement *src, *demux;
|
|
||||||
|
|
||||||
pipeline = gst_pipeline_new ("pipeline");
|
|
||||||
|
|
||||||
src = gst_element_factory_make ("filesrc", "src");
|
|
||||||
g_object_set (G_OBJECT (src), "location", path, NULL);
|
|
||||||
|
|
||||||
demux = gst_element_factory_make ("mpegdemux", "demux");
|
|
||||||
|
|
||||||
gst_bin_add (GST_BIN (pipeline), src);
|
|
||||||
gst_bin_add (GST_BIN (pipeline), demux);
|
|
||||||
|
|
||||||
if (index) {
|
|
||||||
gst_element_set_index (pipeline, index);
|
|
||||||
}
|
|
||||||
|
|
||||||
gst_element_link_pads (src, "src", demux, "sink");
|
|
||||||
|
|
||||||
return pipeline;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GstElement *
|
|
||||||
make_mpeg_decoder_pipeline (const gchar * path, GstIndex * index)
|
|
||||||
{
|
|
||||||
GstElement *pipeline;
|
|
||||||
GstElement *src, *demux;
|
|
||||||
GstElement *video_bin, *audio_bin;
|
|
||||||
GstElement *video_decoder, *audio_decoder;
|
|
||||||
|
|
||||||
pipeline = gst_pipeline_new ("pipeline");
|
|
||||||
|
|
||||||
src = gst_element_factory_make ("filesrc", "src");
|
|
||||||
g_object_set (G_OBJECT (src), "location", path, NULL);
|
|
||||||
|
|
||||||
demux = gst_element_factory_make ("mpegdemux", "demux");
|
|
||||||
|
|
||||||
gst_bin_add (GST_BIN (pipeline), src);
|
|
||||||
gst_bin_add (GST_BIN (pipeline), demux);
|
|
||||||
|
|
||||||
gst_element_link_pads (src, "src", demux, "sink");
|
|
||||||
|
|
||||||
video_bin = gst_bin_new ("video_bin");
|
|
||||||
video_decoder = gst_element_factory_make ("mpeg2dec", "video_decoder");
|
|
||||||
|
|
||||||
gst_bin_add (GST_BIN (video_bin), video_decoder);
|
|
||||||
|
|
||||||
setup_dynamic_linking (pipeline, demux, "video_00",
|
|
||||||
gst_element_get_pad (video_decoder, "sink"), video_bin, index);
|
|
||||||
|
|
||||||
audio_bin = gst_bin_new ("audio_bin");
|
|
||||||
audio_decoder = gst_element_factory_make ("mad", "audio_decoder");
|
|
||||||
|
|
||||||
setup_dynamic_linking (pipeline, demux, "audio_00",
|
|
||||||
gst_element_get_pad (audio_decoder, "sink"), audio_bin, index);
|
|
||||||
|
|
||||||
gst_bin_add (GST_BIN (audio_bin), audio_decoder);
|
|
||||||
|
|
||||||
if (index) {
|
|
||||||
gst_element_set_index (pipeline, index);
|
|
||||||
}
|
|
||||||
|
|
||||||
return pipeline;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
print_progress (GstPad * pad)
|
|
||||||
{
|
|
||||||
gint i = 0;
|
|
||||||
gchar status[53];
|
|
||||||
GstFormat format;
|
|
||||||
gboolean res;
|
|
||||||
gint64 value;
|
|
||||||
gint percent = 0;
|
|
||||||
|
|
||||||
status[0] = '|';
|
|
||||||
|
|
||||||
format = GST_FORMAT_PERCENT;
|
|
||||||
res = gst_pad_query (pad, GST_QUERY_POSITION, &format, &value);
|
|
||||||
if (res) {
|
|
||||||
percent = value / (2 * GST_FORMAT_PERCENT_SCALE);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < percent; i++) {
|
|
||||||
status[i + 1] = '=';
|
|
||||||
}
|
|
||||||
for (i = percent; i < 50; i++) {
|
|
||||||
status[i + 1] = ' ';
|
|
||||||
}
|
|
||||||
status[51] = '|';
|
|
||||||
status[52] = 0;
|
|
||||||
|
|
||||||
g_print ("%s\r", status);
|
|
||||||
}
|
|
||||||
|
|
||||||
gint
|
|
||||||
main (gint argc, gchar * argv[])
|
|
||||||
{
|
|
||||||
GstElement *pipeline;
|
|
||||||
GstElement *src;
|
|
||||||
GstPad *pad;
|
|
||||||
GstIndex *index;
|
|
||||||
gint count = 0;
|
|
||||||
GstEvent *event;
|
|
||||||
gboolean res;
|
|
||||||
GstElement *sink;
|
|
||||||
struct poptOption options[] = {
|
|
||||||
{"verbose", 'v', POPT_ARG_NONE | POPT_ARGFLAG_STRIP, &verbose, 0,
|
|
||||||
"Print index entries", NULL},
|
|
||||||
{"quiet", 'q', POPT_ARG_NONE | POPT_ARGFLAG_STRIP, &quiet, 0,
|
|
||||||
"don't print progress bar", NULL},
|
|
||||||
POPT_TABLEEND
|
|
||||||
};
|
|
||||||
|
|
||||||
if (!gst_init_check_with_popt_table (&argc, &argv, options) || argc < 3) {
|
|
||||||
g_print ("usage: %s [-v] <type> <filename> \n"
|
|
||||||
" type can be: 0 mpeg_systems\n"
|
|
||||||
" 1 mpeg_decoder\n"
|
|
||||||
" -v : report added index entries\n"
|
|
||||||
" -q : don't print progress\n", argv[0]);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* create index that elements can fill */
|
|
||||||
index = gst_index_factory_make ("memindex");
|
|
||||||
if (index) {
|
|
||||||
if (verbose)
|
|
||||||
g_signal_connect (G_OBJECT (index), "entry-added",
|
|
||||||
G_CALLBACK (entry_added), NULL);
|
|
||||||
|
|
||||||
g_object_set (G_OBJECT (index), "resolver", 1, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* construct pipeline */
|
|
||||||
switch (atoi (argv[1])) {
|
|
||||||
case 0:
|
|
||||||
pipeline = make_mpeg_systems_pipeline (argv[2], index);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
pipeline = make_mpeg_decoder_pipeline (argv[2], index);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
g_print ("unknown type %d\n", atoi (argv[1]));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* setup some default info/error handlers */
|
|
||||||
g_signal_connect (G_OBJECT (pipeline), "deep-notify",
|
|
||||||
G_CALLBACK (gst_element_default_deep_notify), NULL);
|
|
||||||
g_signal_connect (G_OBJECT (pipeline), "error",
|
|
||||||
G_CALLBACK (gst_element_default_error), NULL);
|
|
||||||
|
|
||||||
/* get a pad to perform progress reporting on */
|
|
||||||
src = gst_bin_get_by_name (GST_BIN (pipeline), "src");
|
|
||||||
pad = gst_element_get_pad (src, "src");
|
|
||||||
|
|
||||||
/* prepare for iteration */
|
|
||||||
gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
|
||||||
|
|
||||||
g_print ("indexing %s...\n", argv[2]);
|
|
||||||
/* run through the complete stream to let it generate an index */
|
|
||||||
while (gst_bin_iterate (GST_BIN (pipeline))) {
|
|
||||||
if (!quiet && (count % 1000 == 0)) {
|
|
||||||
print_progress (pad);
|
|
||||||
}
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
g_print ("\n");
|
|
||||||
|
|
||||||
/* bring to ready to restart the pipeline */
|
|
||||||
gst_element_set_state (pipeline, GST_STATE_READY);
|
|
||||||
gst_element_set_state (pipeline, GST_STATE_PAUSED);
|
|
||||||
|
|
||||||
if (index)
|
|
||||||
GST_OBJECT_FLAG_UNSET (index, GST_INDEX_WRITABLE);
|
|
||||||
|
|
||||||
src = gst_bin_get_by_name (GST_BIN (pipeline), "video_decoder");
|
|
||||||
|
|
||||||
{
|
|
||||||
gint id;
|
|
||||||
GstIndexEntry *entry;
|
|
||||||
gint64 result;
|
|
||||||
gint total_tm;
|
|
||||||
|
|
||||||
gst_index_get_writer_id (index, GST_OBJECT (src), &id);
|
|
||||||
|
|
||||||
entry = gst_index_get_assoc_entry (index, id, GST_INDEX_LOOKUP_BEFORE, 0,
|
|
||||||
GST_FORMAT_TIME, G_MAXINT64);
|
|
||||||
g_assert (entry);
|
|
||||||
gst_index_entry_assoc_map (entry, GST_FORMAT_TIME, &result);
|
|
||||||
total_tm = result * 60 / GST_SECOND;
|
|
||||||
g_print ("total time = %.2fs\n", total_tm / 60.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
pad = gst_element_get_pad (src, "src");
|
|
||||||
sink = gst_element_factory_make ("fakesink", "sink");
|
|
||||||
gst_element_link_pads (src, "src", sink, "sink");
|
|
||||||
gst_bin_add (GST_BIN (pipeline), sink);
|
|
||||||
|
|
||||||
g_print ("seeking %s...\n", argv[2]);
|
|
||||||
event = gst_event_new_seek (GST_FORMAT_TIME |
|
|
||||||
GST_SEEK_METHOD_SET | GST_SEEK_FLAG_FLUSH, 5 * GST_SECOND);
|
|
||||||
|
|
||||||
res = gst_pad_send_event (pad, event);
|
|
||||||
if (!res) {
|
|
||||||
g_warning ("seek failed");
|
|
||||||
}
|
|
||||||
|
|
||||||
gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
|
||||||
count = 0;
|
|
||||||
while (gst_bin_iterate (GST_BIN (pipeline))) {
|
|
||||||
if (!quiet && (count % 1000 == 0)) {
|
|
||||||
print_progress (pad);
|
|
||||||
}
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
gst_element_set_state (pipeline, GST_STATE_NULL);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
|
@ -1,11 +0,0 @@
|
||||||
noinst_PROGRAMS = demo plot
|
|
||||||
|
|
||||||
demo_SOURCES = demo.c
|
|
||||||
demo_CFLAGS = $(GTK_CFLAGS) $(GST_CFLAGS)
|
|
||||||
demo_LDFLAGS = $(GTK_LIBS) $(GST_LIBS)
|
|
||||||
|
|
||||||
plot_SOURCES = plot.c
|
|
||||||
plot_CFLAGS = $(GTK_CFLAGS) $(GST_CFLAGS)
|
|
||||||
plot_LDFLAGS = $(GTK_LIBS) $(GST_LIBS)
|
|
||||||
|
|
||||||
EXTRA_DIST = README
|
|
|
@ -1,39 +0,0 @@
|
||||||
level plugin by thomas <thomas@apestaart.org>
|
|
||||||
|
|
||||||
this plugin signals:
|
|
||||||
- running time since last EOS/start
|
|
||||||
- channel
|
|
||||||
- RMS level
|
|
||||||
- peak level
|
|
||||||
- decaying peak level
|
|
||||||
over the given interval.
|
|
||||||
|
|
||||||
This is useful for a VU meter display and for plotting out the signal graph.
|
|
||||||
The VU meter can either display RMS, or display immediate peak level and
|
|
||||||
have the falloff decaying peak level displayed as a line.
|
|
||||||
|
|
||||||
The interval for signal emission, ttl of decay peak, and falloff of decay peak
|
|
||||||
can all be set.
|
|
||||||
|
|
||||||
The element only takes unsigned data in; it could be extended to signed as
|
|
||||||
well, if separate fast chain functions are made that displaces the incoming
|
|
||||||
data to its midpoint (ie, 0,65535 should be mapped to -32768, 32767)
|
|
||||||
|
|
||||||
There are two demo apps, apps and plot. apps will create some GTK sliders
|
|
||||||
to display the volume. plot will output data readable by gnuplot.
|
|
||||||
|
|
||||||
Here is a sample plot script to plot output of the plot command that was
|
|
||||||
stored to plot.dat
|
|
||||||
|
|
||||||
set xlabel "Seconds"
|
|
||||||
set ylabel "dB"
|
|
||||||
set yrange [-60:0]
|
|
||||||
plot 'plot.dat' using 1:2 title 'L RMS' with lines, \
|
|
||||||
'plot.dat' using 1:3 title 'L peak' with lines, \
|
|
||||||
'plot.dat' using 1:4 title 'L decay' with lines
|
|
||||||
|
|
||||||
plot 'plot.dat' using 1:5 title 'R RMS' with lines, \
|
|
||||||
'plot.dat' using 1:6 title 'R peak' with lines, \
|
|
||||||
'plot.dat' using 1:7 title 'R decay' with lines
|
|
||||||
|
|
||||||
|
|
|
@ -1,155 +0,0 @@
|
||||||
/* GStreamer
|
|
||||||
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
|
|
||||||
*
|
|
||||||
* demo.c: sample application to display VU meter-like output of level
|
|
||||||
* Copyright (C) 2003
|
|
||||||
* Thomas Vander Stichele <thomas at apestaart dot org>
|
|
||||||
*
|
|
||||||
* 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., 51 Franklin St, Fifth Floor,
|
|
||||||
* Boston, MA 02110-1301, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <gst/gst.h>
|
|
||||||
#include <gtk/gtk.h>
|
|
||||||
|
|
||||||
/* global array for the scale widgets, we'll assume stereo */
|
|
||||||
GtkWidget *elapsed;
|
|
||||||
GtkWidget *scale[2][3];
|
|
||||||
|
|
||||||
static void
|
|
||||||
level_callback (GstElement * element, gdouble time, gint channel,
|
|
||||||
gdouble rms, gdouble peak, gdouble decay)
|
|
||||||
{
|
|
||||||
gchar *label;
|
|
||||||
|
|
||||||
label = g_strdup_printf ("%.3f", time);
|
|
||||||
gtk_label_set (GTK_LABEL (elapsed), label);
|
|
||||||
g_free (label);
|
|
||||||
gtk_range_set_value (GTK_RANGE (scale[channel][0]), rms);
|
|
||||||
gtk_range_set_value (GTK_RANGE (scale[channel][1]), peak);
|
|
||||||
gtk_range_set_value (GTK_RANGE (scale[channel][2]), decay);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
idler (gpointer data)
|
|
||||||
{
|
|
||||||
GstElement *pipeline = GST_ELEMENT (data);
|
|
||||||
|
|
||||||
g_print ("+");
|
|
||||||
if (gst_bin_iterate (GST_BIN (pipeline)))
|
|
||||||
return TRUE;
|
|
||||||
gtk_main_quit ();
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
setup_gui ()
|
|
||||||
{
|
|
||||||
GtkWidget *window;
|
|
||||||
GtkWidget *vbox;
|
|
||||||
GtkWidget *label, *hbox;
|
|
||||||
int c;
|
|
||||||
|
|
||||||
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
|
||||||
g_signal_connect (window, "destroy", gtk_main_quit, NULL);
|
|
||||||
|
|
||||||
vbox = gtk_vbox_new (TRUE, 0);
|
|
||||||
gtk_container_add (GTK_CONTAINER (window), vbox);
|
|
||||||
|
|
||||||
/* elapsed widget */
|
|
||||||
hbox = gtk_hbox_new (TRUE, 0);
|
|
||||||
label = gtk_label_new ("Elapsed");
|
|
||||||
elapsed = gtk_label_new ("0.000");
|
|
||||||
gtk_container_add (GTK_CONTAINER (hbox), label);
|
|
||||||
gtk_container_add (GTK_CONTAINER (hbox), elapsed);
|
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), hbox);
|
|
||||||
|
|
||||||
for (c = 0; c < 2; ++c) {
|
|
||||||
/* RMS */
|
|
||||||
hbox = gtk_hbox_new (TRUE, 0);
|
|
||||||
label = gtk_label_new ("RMS");
|
|
||||||
gtk_container_add (GTK_CONTAINER (hbox), label);
|
|
||||||
scale[c][0] = gtk_hscale_new_with_range (-90.0, 0.0, 0.2);
|
|
||||||
gtk_widget_set_size_request (scale[c][0], 100, -1);
|
|
||||||
gtk_container_add (GTK_CONTAINER (hbox), scale[c][0]);
|
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), hbox);
|
|
||||||
/* peak */
|
|
||||||
hbox = gtk_hbox_new (TRUE, 0);
|
|
||||||
label = gtk_label_new ("peak");
|
|
||||||
gtk_container_add (GTK_CONTAINER (hbox), label);
|
|
||||||
scale[c][1] = gtk_hscale_new_with_range (-90.0, 0.0, 0.2);
|
|
||||||
gtk_widget_set_size_request (scale[c][1], 100, -1);
|
|
||||||
gtk_container_add (GTK_CONTAINER (hbox), scale[c][1]);
|
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), hbox);
|
|
||||||
/* decay */
|
|
||||||
hbox = gtk_hbox_new (TRUE, 0);
|
|
||||||
label = gtk_label_new ("decaying peek");
|
|
||||||
gtk_container_add (GTK_CONTAINER (hbox), label);
|
|
||||||
scale[c][2] = gtk_hscale_new_with_range (-90.0, 0.0, 0.2);
|
|
||||||
gtk_widget_set_size_request (scale[c][2], 100, -1);
|
|
||||||
gtk_container_add (GTK_CONTAINER (hbox), scale[c][2]);
|
|
||||||
gtk_container_add (GTK_CONTAINER (vbox), hbox);
|
|
||||||
}
|
|
||||||
|
|
||||||
gtk_widget_show_all (GTK_WIDGET (window));
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
main (int argc, char *argv[])
|
|
||||||
{
|
|
||||||
|
|
||||||
GstElement *pipeline = NULL;
|
|
||||||
GError *error = NULL;
|
|
||||||
GstElement *level;
|
|
||||||
|
|
||||||
gst_init (&argc, &argv);
|
|
||||||
gtk_init (&argc, &argv);
|
|
||||||
|
|
||||||
pipeline = gst_parse_launchv ((const gchar **) &argv[1], &error);
|
|
||||||
if (error) {
|
|
||||||
g_print ("pipeline could not be constructed: %s\n", error->message);
|
|
||||||
g_print ("Please give a complete pipeline with a 'level' element.\n");
|
|
||||||
g_print ("Example: sinesrc ! level ! %s\n", DEFAULT_AUDIOSINK);
|
|
||||||
g_error_free (error);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
level = gst_bin_get_by_name (GST_BIN (pipeline), "level0");
|
|
||||||
if (level == NULL) {
|
|
||||||
g_print ("Please give a pipeline with a 'level' element in it\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_object_set (level, "signal", TRUE, NULL);
|
|
||||||
g_signal_connect (level, "level", G_CALLBACK (level_callback), NULL);
|
|
||||||
|
|
||||||
|
|
||||||
/* setup GUI */
|
|
||||||
setup_gui ();
|
|
||||||
|
|
||||||
/* connect level signal */
|
|
||||||
|
|
||||||
/* go to main loop */
|
|
||||||
gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
|
||||||
g_idle_add (idler, pipeline);
|
|
||||||
|
|
||||||
gtk_main ();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,124 +0,0 @@
|
||||||
/* GStreamer
|
|
||||||
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
|
|
||||||
*
|
|
||||||
* plot.c: output data points to be graphed with gnuplot
|
|
||||||
* Copyright (C) 2003
|
|
||||||
* Thomas Vander Stichele <thomas at apestaart dot org>
|
|
||||||
*
|
|
||||||
* 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., 51 Franklin St, Fifth Floor,
|
|
||||||
* Boston, MA 02110-1301, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <gst/gst.h>
|
|
||||||
#include <gtk/gtk.h>
|
|
||||||
|
|
||||||
gboolean got_channel[2] = { FALSE, FALSE }; /* to see if we got the signal for this one yet */
|
|
||||||
|
|
||||||
gint channels = 0; /* guess at how many channels there are */
|
|
||||||
gdouble last_time = 0.0; /* time of last signal */
|
|
||||||
gdouble values[2][3]; /* array of levels from which to print */
|
|
||||||
|
|
||||||
static void
|
|
||||||
level_callback (GstElement * element, gdouble time, gint channel,
|
|
||||||
gdouble rms, gdouble peak, gdouble decay)
|
|
||||||
{
|
|
||||||
int i = 0, j = 0;
|
|
||||||
gboolean got_all = FALSE;
|
|
||||||
|
|
||||||
if (channel + 1 > channels)
|
|
||||||
channels = channel + 1;
|
|
||||||
|
|
||||||
/* reset got_channel if this is a new time point */
|
|
||||||
if (time > last_time) {
|
|
||||||
for (i = 0; i < channels; ++i)
|
|
||||||
got_channel[i] = FALSE;
|
|
||||||
last_time = time;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* store values */
|
|
||||||
got_channel[channel] = TRUE;
|
|
||||||
values[channel][0] = rms;
|
|
||||||
values[channel][1] = peak;
|
|
||||||
values[channel][2] = decay;
|
|
||||||
|
|
||||||
/* check if we have all channels, and output if we do */
|
|
||||||
/* FIXME: this fails on the first, no ? */
|
|
||||||
got_all = TRUE;
|
|
||||||
for (i = 0; i < channels; ++i)
|
|
||||||
if (!got_channel[i])
|
|
||||||
got_all = FALSE;
|
|
||||||
if (got_all) {
|
|
||||||
g_print ("%f ", time);
|
|
||||||
for (i = 0; i < channels; ++i)
|
|
||||||
for (j = 0; j < 3; ++j)
|
|
||||||
g_print ("%f ", values[i][j]);
|
|
||||||
g_print ("\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
idler (gpointer data)
|
|
||||||
{
|
|
||||||
GstElement *pipeline = GST_ELEMENT (data);
|
|
||||||
|
|
||||||
if (gst_bin_iterate (GST_BIN (pipeline)))
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
gtk_main_quit ();
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
main (int argc, char *argv[])
|
|
||||||
{
|
|
||||||
|
|
||||||
GstElement *pipeline = NULL;
|
|
||||||
GError *error = NULL;
|
|
||||||
GstElement *level;
|
|
||||||
|
|
||||||
gst_init (&argc, &argv);
|
|
||||||
gtk_init (&argc, &argv);
|
|
||||||
|
|
||||||
pipeline = gst_parse_launchv ((const gchar **) &argv[1], &error);
|
|
||||||
if (error) {
|
|
||||||
g_print ("pipeline could not be constructed: %s\n", error->message);
|
|
||||||
g_print ("Please give a complete pipeline with a 'level' element.\n");
|
|
||||||
g_print ("Example: sinesrc ! level ! %s\n", DEFAULT_AUDIOSINK);
|
|
||||||
g_error_free (error);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
level = gst_bin_get_by_name (GST_BIN (pipeline), "level0");
|
|
||||||
if (level == NULL) {
|
|
||||||
g_print ("Please give a pipeline with a 'level' element in it\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_object_set (level, "signal", TRUE, NULL);
|
|
||||||
g_signal_connect (level, "level", G_CALLBACK (level_callback), NULL);
|
|
||||||
|
|
||||||
|
|
||||||
/* go to main loop */
|
|
||||||
gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
|
||||||
g_idle_add (idler, pipeline);
|
|
||||||
|
|
||||||
gtk_main ();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
Loading…
Reference in a new issue