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