reorganize stuff under tests/

Original commit message from CVS:
reorganize stuff under tests/
This commit is contained in:
Thomas Vander Stichele 2005-11-30 17:38:24 +00:00
parent d8ceb02149
commit 68eca5a99c
28 changed files with 64 additions and 3473 deletions

View file

@ -1,3 +1,34 @@
2005-11-30 Thomas Vander Stichele <thomas (at) apestaart (dot) org>
* Makefile.am:
* configure.ac:
* examples/Makefile.am:
* examples/capsfilter/Makefile.am:
* examples/capsfilter/capsfilter1.c:
* examples/gob/Makefile.am:
* examples/gob/gst-identity2.gob:
* examples/indexing/.cvsignore:
* examples/indexing/Makefile.am:
* examples/indexing/indexmpeg.c:
* examples/seeking/.cvsignore:
* examples/seeking/Makefile.am:
* examples/seeking/cdparanoia.c:
* examples/seeking/cdplayer.c:
* examples/seeking/chained.c:
* examples/seeking/scrubby.c:
* examples/seeking/seek.c:
* examples/stats/Makefile.am:
* examples/stats/mp2ogg.c:
* examples/switch/.cvsignore:
* examples/switch/Makefile.am:
* examples/switch/switcher.c:
* tests/Makefile.am:
* tests/check/generic/.cvsignore:
* tests/check/pipelines/.cvsignore:
* tests/examples/Makefile.am:
* tests/examples/seek/Makefile.am:
reorganize stuff under tests/
2005-11-30 Edward Hervey <edward@fluendo.com>
* ext/ogg/gstoggdemux.c: (gst_ogg_pad_typefind):

View file

@ -6,16 +6,9 @@ else
SUBDIRS_EXT =
endif
if BUILD_EXAMPLES
SUBDIRS_EXAMPLES = examples
else
SUBDIRS_EXAMPLES =
endif
SUBDIRS = \
gst-libs \
gst sys $(SUBDIRS_EXT) \
$(SUBDIRS_EXAMPLES) \
tools \
docs \
po \
@ -27,7 +20,6 @@ DIST_SUBDIRS = \
docs \
gst-libs \
gst sys ext \
examples \
tools \
po \
common \

View file

@ -609,14 +609,14 @@ gst-libs/gst/riff/Makefile
gst-libs/gst/rtp/Makefile
gst-libs/gst/tag/Makefile
gst-libs/gst/video/Makefile
examples/seeking/Makefile
examples/Makefile
tools/Makefile
pkgconfig/Makefile
pkgconfig/gstreamer-plugins-base.pc
pkgconfig/gstreamer-plugins-base-uninstalled.pc
tests/Makefile
tests/check/Makefile
tests/examples/Makefile
tests/examples/seek/Makefile
docs/Makefile
docs/libs/Makefile
docs/plugins/Makefile

View file

@ -1,15 +0,0 @@
if HAVE_FT2
FT2_SUBDIRS=seeking
else
FT2_SUBDIRS=
endif
# if HAVE_GTK
# GTK_SUBDIRS=dynparams $(FT2_SUBDIRS)
# else
GTK_SUBDIRS=
# endif
SUBDIRS=$(GTK_SUBDIRS)
#DIST_SUBDIRS=capsfilter seeking indexing switch
DIST_SUBDIRS=seeking

View file

@ -1,6 +0,0 @@
noinst_PROGRAMS = capsfilter1
LDADD = $(GST_LIBS)
AM_CFLAGS = $(GST_CFLAGS)

View file

@ -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 ("ffmpegcolorspace", "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;
}

View file

@ -1,19 +0,0 @@
plugin_LTLIBRARIES = libgstidentity2.la
GOB_FILES_ID = gst-identity2.c gst-identity2.h gst-identity2-private.h
BUILT_SOURCES = \
$(GOB_FILES_ID)
libgstidentity2_la_SOURCES = gst-identity2.gob $(GOB_FILES_ID)
libgstidentity2_la_CFLAGS = $(GST_CFLAGS)
libgstidentity2_la_LIBADD =
%.c %.h %-private.h: %.gob
gob $<
CLEANFILES = $(GOB_FILES_ID)
dist-hook:
cd $(distdir); rm -f $(CLEANFILES)

View file

@ -1,141 +0,0 @@
%header{
#include <gst/gst.h>
#include "gst-identity2.h"
#include "gst-identity2-private.h"
%}
class Gst:Identity2 from Gst:Element {
/* plugin init */
private gboolean
plugin_init (GModule *module, GstPlugin *plugin)
{
static GstElementDetails identity2_details = {
"GOB Identity",
"Filter/Effect",
"Does nothing",
"1.0",
"Wim Taymans <wim.taymans@chello.be>",
"(C) 2001",
};
GstElementFactory *factory;
factory = gst_elementfactory_new ("identity2", TYPE_SELF,
&identity2_details);
g_return_val_if_fail (factory != NULL, FALSE);
gst_plugin_add_feature (plugin, &(factory->feature));
return TRUE;
}
/* pads FIXME gob oculd be improved here */
private GstPad *sinkpad =
{
gst_pad_new ("sink", GST_PAD_SINK);
gst_element_add_pad (GST_ELEMENT (o), o->_priv->sinkpad);
gst_pad_set_chain_function (o->_priv->sinkpad, chain);
gst_pad_set_bufferpool_function (o->_priv->sinkpad, get_bufferpool);
//gst_pad_set_negotiate_function (o->_priv->sinkpad, negotiate_sink);
};
private GstPad *srcpad =
{
gst_pad_new ("src", GST_PAD_SRC);
gst_element_add_pad (GST_ELEMENT (o), o->_priv->srcpad);
//gst_pad_set_negotiate_function (o->_priv->srcpad, negotiate_src);
};
/* arguments */
/*
private gboolean loop_based = FALSE; argument BOOL loop_based
get {
ARG = self->_priv->loop_based;
}
set {
self->_priv->loop_based = ARG;
if (self->_priv->loop_based) {
gst_element_set_loop_function (GST_ELEMENT (self), loop);
gst_pad_set_chain_function (self->_priv->sinkpad, NULL);
}
else {
gst_pad_set_chain_function (self->_priv->sinkpad, chain);
gst_element_set_loop_function (GST_ELEMENT (self), NULL);
}
};*/
private guint sleep_time = 0; argument UINT sleep_time link;
private gboolean silent = FALSE; argument BOOL silent link;
/* signals */
private signal last NONE(NONE) void handoff(self);
/* core code here */
private GstBufferPool*
get_bufferpool (GstPad *pad (check null))
{
Self *self = SELF (gst_pad_get_parent (pad));
return gst_pad_get_bufferpool (self->_priv->srcpad);
}
/* private GstPadNegotiateReturn
negotiate_src (GstPad *pad, GstCaps **caps, gpointer *data)
{
Self *self = SELF (gst_pad_get_parent (pad));
return gst_pad_negotiate_proxy (pad, self->_priv->sinkpad, caps);
}
private GstPadNegotiateReturn
negotiate_sink (GstPad *pad, GstCaps **caps, gpointer *data)
{
Self *self = SELF (gst_pad_get_parent (pad));
return gst_pad_negotiate_proxy (pad, self->_priv->srcpad, caps);
} */
private void
chain (GstPad *pad (check null), GstBuffer *buf (check null))
{
Self *self;
self = SELF (gst_pad_get_parent (pad));
if (!self->_priv->silent)
g_print("identity2: chain ******* (%s:%s)i \n",GST_DEBUG_PAD_NAME(pad));
handoff (self);
gst_pad_push (self->_priv->srcpad, buf);
if (self->_priv->sleep_time)
usleep (self->_priv->sleep_time);
}
/*private void
loop (GstElement *element (check null))
{
Self *self = SELF (element);
GstBuffer *buf;
do {
buf = gst_pad_pull (self->_priv->sinkpad);
g_print("identity2: loop ******* (%s:%s)i \n",GST_DEBUG_PAD_NAME(self->_priv->sinkpad));
handoff (self);
gst_pad_push (self->_priv->srcpad, buf);
if (self->_priv->sleep_time)
usleep (self->_priv->sleep_time);
} while (!GST_ELEMENT_IS_COTHREAD_STOPPING(element));
}*/
}
%{
GstPluginDesc plugin_desc = {
GST_VERSION_MAJOR,
GST_VERSION_MINOR,
"identity2",
gst_identity2_plugin_init
};
%}

View file

@ -1 +0,0 @@
indexmpeg

View file

@ -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)

View file

@ -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., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, 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;
}

View file

@ -1,6 +0,0 @@
cdparanoia
cdplayer
seek
spider_seek
vorbisfile

View file

@ -1,7 +0,0 @@
examples = seek scrubby #cdplayer cdparanoia
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)

View file

@ -1,215 +0,0 @@
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdlib.h>
#include <gst/gst.h>
#include <string.h>
static void
get_position_info (GstElement * cdparanoia)
{
GstFormat track_format;
const GstFormat *formats;
GstPad *pad;
track_format = gst_format_get_by_nick ("track");
g_assert (track_format != 0);
pad = gst_element_get_pad (cdparanoia, "src");
formats = gst_pad_get_formats (pad);
while (*formats) {
const GstFormatDefinition *definition;
GstFormat format;
gint64 position;
gboolean res;
definition = gst_format_get_details (*formats);
format = *formats;
res = gst_pad_query (pad, GST_QUERY_POSITION, &format, &position);
if (format == GST_FORMAT_TIME) {
position /= GST_SECOND;
g_print ("%s: %" G_GINT64_FORMAT ":%02" G_GINT64_FORMAT,
definition->nick, position / 60, position % 60);
} else {
g_print ("%s: %" G_GINT64_FORMAT, definition->nick, position);
}
formats++;
if (*formats) {
g_print (", ");
}
}
g_print ("\r");
}
static void
get_track_info (GstElement * cdparanoia)
{
GstFormat track_format;
gint64 total_tracks = 0, total_time = 0;
GstPad *pad;
const GstFormat *formats;
gint i;
gint64 time_count = 0;
track_format = gst_format_get_by_nick ("track");
g_assert (track_format != 0);
pad = gst_element_get_pad (cdparanoia, "src");
formats = gst_pad_get_formats (pad);
/* we loop over all supported formats and report the total
* number of them */
while (*formats) {
const GstFormatDefinition *definition;
gint64 total;
GstFormat format;
gboolean res;
definition = gst_format_get_details (*formats);
format = *formats;
res = gst_pad_query (pad, GST_QUERY_TOTAL, &format, &total);
if (res) {
if (format == GST_FORMAT_TIME) {
total /= GST_SECOND;
g_print ("%s total: %" G_GINT64_FORMAT ":%02" G_GINT64_FORMAT "\n",
definition->nick, total / 60, total % 60);
} else
g_print ("%s total: %" G_GINT64_FORMAT "\n", definition->nick, total);
if (format == track_format)
total_tracks = total;
else if (format == GST_FORMAT_TIME)
total_time = total;
} else
g_print ("failed to get %s total\n", definition->nick);
formats++;
}
/* then we loop over all the tracks to get more info.
* since pad_convert always works from 0, the time from track 1 needs
* to be substracted from track 2 */
for (i = 0; i <= total_tracks; i++) {
gint64 time;
gboolean res;
if (i < total_tracks) {
GstFormat format;
format = GST_FORMAT_TIME;
res = gst_pad_convert (pad, track_format, i, &format, &time);
time /= GST_SECOND;
} else {
time = total_time;
res = TRUE;
}
if (res) {
/* for the first track (i==0) we wait until we have the
* time of the next track */
if (i > 0) {
gint64 length = time - time_count;
g_print ("track %d: %" G_GINT64_FORMAT ":%02" G_GINT64_FORMAT
" -> %" G_GINT64_FORMAT ":%02" G_GINT64_FORMAT ", length: %"
G_GINT64_FORMAT ":%02" G_GINT64_FORMAT "\n",
i - 1,
time_count / 60, time_count % 60,
time / 60, time % 60, length / 60, length % 60);
}
} else {
g_print ("could not get time for track %d\n", i);
}
time_count = time;
}
}
int
main (int argc, char **argv)
{
GstElement *pipeline;
GstElement *cdparanoia;
GstElement *audiosink;
GstPad *pad;
GstFormat track_format;
GstEvent *event;
gint count;
gboolean res;
gst_init (&argc, &argv);
pipeline = gst_pipeline_new ("pipeline");
cdparanoia = gst_element_factory_make ("cdparanoia", "cdparanoia");
g_assert (cdparanoia);
g_object_set (G_OBJECT (cdparanoia), "paranoia_mode", 0, NULL);
audiosink = gst_element_factory_make (DEFAULT_AUDIOSINK, DEFAULT_AUDIOSINK);
g_assert (audiosink);
gst_bin_add (GST_BIN (pipeline), cdparanoia);
gst_bin_add (GST_BIN (pipeline), audiosink);
gst_element_link_pads (cdparanoia, "src", audiosink, "sink");
g_signal_connect (G_OBJECT (pipeline), "deep_notify",
G_CALLBACK (gst_object_default_deep_notify), NULL);
gst_element_set_state (pipeline, GST_STATE_PAUSED);
/* now we go into probe mode */
get_track_info (cdparanoia);
track_format = gst_format_get_by_nick ("track");
g_assert (track_format != 0);
pad = gst_element_get_pad (cdparanoia, "src");
g_assert (pad);
g_print ("playing from track 3\n");
/* seek to track3 */
event = gst_event_new_seek (track_format |
GST_SEEK_METHOD_SET | GST_SEEK_FLAG_FLUSH, 3);
res = gst_pad_send_event (pad, event);
if (!res)
g_warning ("seek failed");
gst_element_set_state (pipeline, GST_STATE_PLAYING);
count = 0;
while (count++ < 500) {
get_position_info (cdparanoia);
g_usleep (G_USEC_PER_SEC / 2);
}
gst_element_set_state (pipeline, GST_STATE_PAUSED);
g_print ("\nplaying from second 25 to second 29\n");
/* seek to some seconds */
event = gst_event_new_segment_seek (GST_FORMAT_TIME |
GST_SEEK_METHOD_SET |
GST_SEEK_FLAG_FLUSH, 25 * GST_SECOND, 29 * 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 (count++ < 500) {
get_position_info (cdparanoia);
g_usleep (G_USEC_PER_SEC / 2);
}
g_print ("\n");
/* shutdown everything again */
gst_element_set_state (pipeline, GST_STATE_NULL);
return 0;
}

View file

@ -1,292 +0,0 @@
#include <stdlib.h>
#include <glib.h>
#include <gtk/gtk.h>
#include <gst/gst.h>
#include <string.h>
static GList *seekable_elements = NULL;
static GstElement *pipeline;
static GtkAdjustment *adjustment;
static gboolean stats = FALSE;
static guint64 duration;
static guint update_id;
#define UPDATE_INTERVAL 500
static GstElement *
make_cdaudio_pipeline (void)
{
GstElement *cdaudio;
cdaudio = gst_element_factory_make ("cdaudio", "cdaudio");
g_assert (cdaudio != NULL);
seekable_elements = g_list_prepend (seekable_elements, cdaudio);
return cdaudio;
}
static gchar *
format_value (GtkScale * scale, gdouble value)
{
gint64 real;
gint64 seconds;
gint64 subseconds;
real = value * duration / 100;
seconds = (gint64) real / GST_SECOND;
subseconds = (gint64) real / (GST_SECOND / 100);
return g_strdup_printf ("%02" G_GINT64_FORMAT ":%02" G_GINT64_FORMAT ":%02"
G_GINT64_FORMAT, seconds / 60, seconds % 60, subseconds % 100);
}
typedef struct
{
const gchar *name;
const GstFormat format;
}
seek_format;
static seek_format seek_formats[] = {
{"tim", GST_FORMAT_TIME},
{"byt", GST_FORMAT_BYTES},
{"buf", GST_FORMAT_BUFFERS},
{"def", GST_FORMAT_DEFAULT},
{NULL, 0},
};
G_GNUC_UNUSED static void
query_durations ()
{
GList *walk = seekable_elements;
while (walk) {
GstElement *element = GST_ELEMENT (walk->data);
gint i = 0;
g_print ("durations %8.8s: ", GST_ELEMENT_NAME (element));
while (seek_formats[i].name) {
gboolean res;
gint64 value;
GstFormat format;
format = seek_formats[i].format;
res = gst_element_query (element, GST_QUERY_TOTAL, &format, &value);
if (res) {
g_print ("%s %13" G_GINT64_FORMAT " | ", seek_formats[i].name, value);
} else {
g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*");
}
i++;
}
g_print (" %s\n", GST_ELEMENT_NAME (element));
walk = g_list_next (walk);
}
}
G_GNUC_UNUSED static void
query_positions ()
{
GList *walk = seekable_elements;
while (walk) {
GstElement *element = GST_ELEMENT (walk->data);
gint i = 0;
g_print ("positions %8.8s: ", GST_ELEMENT_NAME (element));
while (seek_formats[i].name) {
gboolean res;
gint64 value;
GstFormat format;
format = seek_formats[i].format;
res = gst_element_query (element, GST_QUERY_POSITION, &format, &value);
if (res) {
g_print ("%s %13" G_GINT64_FORMAT " | ", seek_formats[i].name, value);
} else {
g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*");
}
i++;
}
g_print (" %s\n", GST_ELEMENT_NAME (element));
walk = g_list_next (walk);
}
}
static gboolean
update_scale (gpointer data)
{
GstClock *clock;
guint64 position = 0;
GstFormat format = GST_FORMAT_TIME;
duration = 0;
clock = gst_pipeline_get_clock (GST_PIPELINE (pipeline));
if (seekable_elements) {
GstElement *element = GST_ELEMENT (seekable_elements->data);
gst_element_query (element, GST_QUERY_TOTAL, &format, &duration);
gst_element_query (element, GST_QUERY_POSITION, &format, &position);
}
if (stats) {
if (clock)
g_print ("clock: %13" G_GUINT64_FORMAT " (%s)\n",
position, gst_object_get_name (GST_OBJECT (clock)));
query_durations ();
query_positions ();
}
if (duration > 0) {
gtk_adjustment_set_value (adjustment, position * 100.0 / duration);
}
return TRUE;
}
static gboolean
start_seek (GtkWidget * widget, GdkEventButton * event, gpointer user_data)
{
gst_element_set_state (pipeline, GST_STATE_PAUSED);
gtk_timeout_remove (update_id);
return FALSE;
}
static gboolean
stop_seek (GtkWidget * widget, GdkEventButton * event, gpointer user_data)
{
gint64 real = gtk_range_get_value (GTK_RANGE (widget)) * duration / 100;
gboolean res;
GstEvent *s_event;
GList *walk = seekable_elements;
while (walk) {
GstElement *seekable = GST_ELEMENT (walk->data);
g_print ("seek to %" G_GINT64_FORMAT " on element %s\n", real,
GST_ELEMENT_NAME (seekable));
s_event =
gst_event_new_seek (GST_FORMAT_TIME | GST_SEEK_METHOD_SET |
GST_SEEK_FLAG_FLUSH, real);
res = gst_element_send_event (seekable, s_event);
walk = g_list_next (walk);
}
gst_element_set_state (pipeline, GST_STATE_PLAYING);
update_id =
gtk_timeout_add (UPDATE_INTERVAL, (GtkFunction) update_scale, pipeline);
return FALSE;
}
static void
play_cb (GtkButton * button, gpointer data)
{
GstState state;
gst_element_get_state (pipeline, &state, NULL, GST_CLOCK_TIME_NONE);
if (state != GST_STATE_PLAYING) {
gst_element_set_state (pipeline, GST_STATE_PLAYING);
update_id =
gtk_timeout_add (UPDATE_INTERVAL, (GtkFunction) update_scale, pipeline);
}
}
static void
pause_cb (GtkButton * button, gpointer data)
{
GstState state;
gst_element_get_state (pipeline, &state, NULL, GST_CLOCK_TIME_NONE);
if (state != GST_STATE_PAUSED) {
gst_element_set_state (pipeline, GST_STATE_PAUSED);
gtk_timeout_remove (update_id);
}
}
static void
stop_cb (GtkButton * button, gpointer data)
{
GstState state;
gst_element_get_state (pipeline, &state, NULL, GST_CLOCK_TIME_NONE);
if (state != GST_STATE_READY) {
gst_element_set_state (pipeline, GST_STATE_READY);
gtk_timeout_remove (update_id);
}
}
int
main (int argc, char **argv)
{
GtkWidget *window, *hbox, *vbox,
*play_button, *pause_button, *stop_button, *hscale;
struct poptOption options[] = {
{"stats", 's', POPT_ARG_NONE | POPT_ARGFLAG_STRIP, &stats, 0,
"Show element stats", NULL},
POPT_TABLEEND
};
gst_init_with_popt_table (&argc, &argv, options);
gtk_init (&argc, &argv);
pipeline = make_cdaudio_pipeline ();
g_signal_connect (pipeline, "deep_notify",
G_CALLBACK (gst_object_default_deep_notify), NULL);
/* initialize gui elements ... */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
hbox = gtk_hbox_new (FALSE, 0);
vbox = gtk_vbox_new (FALSE, 0);
play_button = gtk_button_new_with_label ("play");
pause_button = gtk_button_new_with_label ("pause");
stop_button = gtk_button_new_with_label ("stop");
adjustment =
GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.00, 100.0, 0.1, 1.0, 1.0));
hscale = gtk_hscale_new (adjustment);
gtk_scale_set_digits (GTK_SCALE (hscale), 2);
gtk_range_set_update_policy (GTK_RANGE (hscale), GTK_UPDATE_CONTINUOUS);
gtk_signal_connect (GTK_OBJECT (hscale),
"button_press_event", G_CALLBACK (start_seek), pipeline);
gtk_signal_connect (GTK_OBJECT (hscale),
"button_release_event", G_CALLBACK (stop_seek), pipeline);
gtk_signal_connect (GTK_OBJECT (hscale),
"format_value", G_CALLBACK (format_value), pipeline);
/* do the packing stuff ... */
gtk_window_set_default_size (GTK_WINDOW (window), 96, 96);
gtk_container_add (GTK_CONTAINER (window), vbox);
gtk_container_add (GTK_CONTAINER (vbox), hbox);
gtk_box_pack_start (GTK_BOX (hbox), play_button, FALSE, FALSE, 2);
gtk_box_pack_start (GTK_BOX (hbox), pause_button, FALSE, FALSE, 2);
gtk_box_pack_start (GTK_BOX (hbox), stop_button, FALSE, FALSE, 2);
gtk_box_pack_start (GTK_BOX (vbox), hscale, TRUE, TRUE, 2);
/* connect things ... */
g_signal_connect (G_OBJECT (play_button), "clicked", G_CALLBACK (play_cb),
pipeline);
g_signal_connect (G_OBJECT (pause_button), "clicked", G_CALLBACK (pause_cb),
pipeline);
g_signal_connect (G_OBJECT (stop_button), "clicked", G_CALLBACK (stop_cb),
pipeline);
g_signal_connect (G_OBJECT (window), "delete_event", gtk_main_quit, NULL);
/* show the gui. */
gtk_widget_show_all (window);
gtk_main ();
gst_element_set_state (pipeline, GST_STATE_NULL);
return 0;
}

View file

@ -1,107 +0,0 @@
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdlib.h>
#include <gst/gst.h>
#include <string.h>
static GstElement *bin;
static void
unlinked (GstPad * pad, GstPad * peerpad, GstElement * pipeline)
{
gst_element_set_state (pipeline, GST_STATE_PAUSED);
gst_bin_remove (GST_BIN (pipeline), bin);
gst_element_set_state (bin, GST_STATE_READY);
gst_element_set_state (pipeline, GST_STATE_PLAYING);
}
static void
new_pad (GstElement * elem, GstPad * newpad, GstElement * pipeline)
{
GstScheduler *sched;
GstClock *clock;
g_print ("new pad %s\n", gst_pad_get_name (newpad));
gst_element_set_state (pipeline, GST_STATE_PAUSED);
gst_bin_add (GST_BIN (pipeline), bin);
sched = gst_element_get_scheduler (GST_ELEMENT (pipeline));
clock = gst_scheduler_get_clock (sched);
gst_scheduler_set_clock (sched, clock);
gst_pad_link (newpad, gst_element_get_pad (bin, "sink"));
g_signal_connect (G_OBJECT (newpad), "unlinked", G_CALLBACK (unlinked),
pipeline);
gst_element_set_state (pipeline, GST_STATE_PLAYING);
}
int
main (int argc, char **argv)
{
GstElement *pipeline;
GstElement *filesrc;
GstElement *oggdemux;
GstElement *vorbisdec;
GstElement *audioconvert;
GstElement *audiosink;
gst_init (&argc, &argv);
if (argc < 2) {
g_print ("usage: %s <oggfile>\n", argv[0]);
return (-1);
}
pipeline = gst_pipeline_new ("pipeline");
filesrc = gst_element_factory_make ("filesrc", "filesrc");
g_assert (filesrc);
g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL);
oggdemux = gst_element_factory_make ("oggdemux", "oggdemux");
g_assert (oggdemux);
gst_bin_add (GST_BIN (pipeline), filesrc);
gst_bin_add (GST_BIN (pipeline), oggdemux);
gst_element_link_pads (filesrc, "src", oggdemux, "sink");
g_signal_connect (G_OBJECT (oggdemux), "new_pad", G_CALLBACK (new_pad),
pipeline);
bin = gst_bin_new ("bin");
vorbisdec = gst_element_factory_make ("vorbisdec", "vorbisdec");
g_assert (vorbisdec);
audioconvert = gst_element_factory_make ("audioconvert", "audioconvert");
g_assert (audioconvert);
audiosink = gst_element_factory_make (DEFAULT_AUDIOSINK, DEFAULT_AUDIOSINK);
g_assert (audiosink);
gst_bin_add (GST_BIN (bin), vorbisdec);
gst_bin_add (GST_BIN (bin), audioconvert);
gst_bin_add (GST_BIN (bin), audiosink);
gst_element_link_pads (vorbisdec, "src", audioconvert, "sink");
gst_element_link_pads (audioconvert, "src", audiosink, "sink");
gst_element_add_ghost_pad (bin, gst_element_get_pad (vorbisdec, "sink"),
"sink");
g_object_ref (G_OBJECT (bin));
g_signal_connect (pipeline, "deep_notify",
G_CALLBACK (gst_element_default_deep_notify), NULL);
gst_element_set_state (pipeline, GST_STATE_PLAYING);
while (gst_bin_iterate (GST_BIN (pipeline)))
/* nop */ ;
/* stop probe */
gst_element_set_state (pipeline, GST_STATE_NULL);
return 0;
}

View file

@ -1,558 +0,0 @@
#include <stdlib.h>
#include <glib.h>
#include <gtk/gtk.h>
#include <gst/gst.h>
#include <string.h>
GST_DEBUG_CATEGORY (scrubby_debug);
#define GST_CAT_DEFAULT (scrubby_debug)
static GstElement *pipeline;
static gint64 position;
static gint64 duration;
static GtkAdjustment *adjustment;
static GtkWidget *hscale;
static GtkAdjustment *sadjustment;
static GtkWidget *shscale;
static gboolean verbose = FALSE;
static guint bus_watch = 0;
static guint update_id = 0;
static guint changed_id = 0;
static guint schanged_id = 0;
//#define SOURCE "filesrc"
#define SOURCE "gnomevfssrc"
#define ASINK "alsasink"
//#define ASINK "osssink"
#define VSINK "xvimagesink"
//#define VSINK "ximagesink"
//#define VSINK "aasink"
//#define VSINK "cacasink"
#define RANGE_PREC 10000
#define SEGMENT_LEN 100
#define UPDATE_INTERVAL 500
gdouble prev_range = -1.0;
GstClockTime prev_time = -1;
gdouble cur_range;
GstClockTime cur_time;
GstClockTimeDiff diff;
gdouble cur_speed = 1.0;
typedef struct
{
const gchar *padname;
GstPad *target;
GstElement *bin;
}
dyn_link;
static GstElement *
gst_element_factory_make_or_warn (gchar * type, gchar * name)
{
GstElement *element = gst_element_factory_make (type, name);
if (!element) {
g_warning ("Failed to create element %s of type %s", name, type);
}
return element;
}
static void
dynamic_link (GstPadTemplate * templ, GstPad * newpad, gpointer data)
{
dyn_link *connect = (dyn_link *) data;
if (connect->padname == NULL ||
!strcmp (gst_pad_get_name (newpad), connect->padname)) {
if (connect->bin)
gst_bin_add (GST_BIN (pipeline), connect->bin);
gst_pad_link (newpad, connect->target);
}
}
static void
setup_dynamic_link (GstElement * element, const gchar * padname,
GstPad * target, GstElement * bin)
{
dyn_link *connect;
connect = g_new0 (dyn_link, 1);
connect->padname = g_strdup (padname);
connect->target = target;
connect->bin = bin;
g_signal_connect (G_OBJECT (element), "pad-added", G_CALLBACK (dynamic_link),
connect);
}
static GstElement *
make_wav_pipeline (const gchar * location)
{
GstElement *pipeline;
GstElement *src, *decoder, *audiosink;
pipeline = gst_pipeline_new ("app");
src = gst_element_factory_make_or_warn (SOURCE, "src");
decoder = gst_element_factory_make_or_warn ("wavparse", "decoder");
audiosink = gst_element_factory_make_or_warn (ASINK, "sink");
g_object_set (G_OBJECT (src), "location", location, NULL);
gst_bin_add (GST_BIN (pipeline), src);
gst_bin_add (GST_BIN (pipeline), decoder);
gst_bin_add (GST_BIN (pipeline), audiosink);
gst_element_link (src, decoder);
setup_dynamic_link (decoder, "src", gst_element_get_pad (audiosink, "sink"),
NULL);
return pipeline;
}
static GstElement *
make_playerbin_pipeline (const gchar * location)
{
GstElement *player;
player = gst_element_factory_make ("playbin", "player");
g_assert (player);
g_object_set (G_OBJECT (player), "uri", location, NULL);
return player;
}
static gchar *
format_value (GtkScale * scale, gdouble value)
{
gint64 real;
gint64 seconds;
gint64 subseconds;
real = value * duration / RANGE_PREC;
seconds = (gint64) real / GST_SECOND;
subseconds = (gint64) real / (GST_SECOND / RANGE_PREC);
return g_strdup_printf ("%02" G_GINT64_FORMAT ":%02" G_GINT64_FORMAT ":%02"
G_GINT64_FORMAT, seconds / 60, seconds % 60, subseconds % 100);
}
static gboolean
update_scale (gpointer data)
{
GstFormat format;
position = 0;
duration = 0;
format = GST_FORMAT_TIME;
gst_element_query_position (pipeline, &format, &position);
gst_element_query_duration (pipeline, &format, &duration);
if (position >= duration)
duration = position;
if (duration > 0) {
gtk_adjustment_set_value (adjustment,
position * (gdouble) RANGE_PREC / duration);
gtk_widget_queue_draw (hscale);
}
return TRUE;
}
static void
speed_cb (GtkWidget * widget)
{
GstEvent *s_event;
gboolean res;
GST_DEBUG ("speed change");
cur_speed = gtk_range_get_value (GTK_RANGE (widget));
s_event = gst_event_new_seek (cur_speed,
GST_FORMAT_TIME, 0, GST_SEEK_TYPE_NONE, -1, GST_SEEK_TYPE_NONE, -1);
res = gst_element_send_event (pipeline, s_event);
if (!res)
g_print ("speed change failed\n");
}
static gboolean do_seek (GtkWidget * widget, gboolean flush, gboolean segment);
static void
seek_cb (GtkWidget * widget)
{
if (changed_id) {
GST_DEBUG ("seek because of slider move");
if (do_seek (widget, TRUE, TRUE)) {
g_source_remove (changed_id);
changed_id = 0;
}
}
}
static gboolean
do_seek (GtkWidget * widget, gboolean flush, gboolean segment)
{
gint64 start, stop;
gboolean res = FALSE;
GstEvent *s_event;
gdouble rate;
GTimeVal tv;
gboolean valid;
gdouble new_range;
if (segment)
new_range = gtk_range_get_value (GTK_RANGE (widget));
else {
new_range = (gdouble) RANGE_PREC;
cur_time = -1;
}
valid = prev_time != -1;
GST_DEBUG ("flush %d, segment %d, valid %d", flush, segment, valid);
if (new_range == cur_range)
return FALSE;
prev_time = cur_time;
prev_range = cur_range;
cur_range = new_range;
g_get_current_time (&tv);
cur_time = GST_TIMEVAL_TO_TIME (tv);
if (!valid)
return FALSE;
GST_DEBUG ("cur: %lf, %" GST_TIME_FORMAT, cur_range,
GST_TIME_ARGS (cur_time));
GST_DEBUG ("prev: %lf, %" GST_TIME_FORMAT, prev_range,
GST_TIME_ARGS (prev_time));
diff = cur_time - prev_time;
GST_DEBUG ("diff: %" GST_TIME_FORMAT, GST_TIME_ARGS (diff));
start = prev_range * duration / RANGE_PREC;
/* play 50 milliseconds */
stop = segment ? cur_range * duration / RANGE_PREC : duration;
if (start == stop)
return FALSE;
if (segment)
rate = (stop - start) / (gdouble) diff;
else
rate = cur_speed;
if (start > stop) {
gint64 tmp;
tmp = start;
start = stop;
stop = tmp;
}
GST_DEBUG ("seek to %" GST_TIME_FORMAT " -- %" GST_TIME_FORMAT ", rate %lf"
" on element %s",
GST_TIME_ARGS (start), GST_TIME_ARGS (stop), rate,
GST_ELEMENT_NAME (pipeline));
s_event = gst_event_new_seek (rate,
GST_FORMAT_TIME,
(flush ? GST_SEEK_FLAG_FLUSH : 0) |
(segment ? GST_SEEK_FLAG_SEGMENT : 0),
GST_SEEK_TYPE_SET, start, GST_SEEK_TYPE_SET, stop);
res = gst_element_send_event (pipeline, s_event);
if (!res)
g_print ("seek failed\n");
gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE);
return TRUE;
}
static gboolean
start_seek (GtkWidget * widget, GdkEventButton * event, gpointer user_data)
{
if (update_id) {
g_source_remove (update_id);
update_id = 0;
}
if (changed_id == 0) {
changed_id = gtk_signal_connect (GTK_OBJECT (hscale),
"value_changed", G_CALLBACK (seek_cb), pipeline);
}
GST_DEBUG ("start seek");
return FALSE;
}
static gboolean
stop_seek (GtkWidget * widget, gpointer user_data)
{
update_id =
g_timeout_add (UPDATE_INTERVAL, (GtkFunction) update_scale, pipeline);
GST_DEBUG ("stop seek");
if (changed_id) {
g_source_remove (changed_id);
changed_id = 0;
}
do_seek (hscale, FALSE, FALSE);
return FALSE;
}
static void
play_cb (GtkButton * button, gpointer data)
{
GstState state;
gst_element_get_state (pipeline, &state, NULL, GST_CLOCK_TIME_NONE);
if (state != GST_STATE_PLAYING) {
g_print ("PLAY pipeline\n");
gst_element_set_state (pipeline, GST_STATE_PAUSED);
gst_element_get_state (pipeline, NULL, NULL, GST_CLOCK_TIME_NONE);
gst_element_set_state (pipeline, GST_STATE_PLAYING);
update_id =
g_timeout_add (UPDATE_INTERVAL, (GtkFunction) update_scale, pipeline);
}
}
static void
pause_cb (GtkButton * button, gpointer data)
{
GstState state;
gst_element_get_state (pipeline, &state, NULL, GST_CLOCK_TIME_NONE);
if (state != GST_STATE_PAUSED) {
g_print ("PAUSE pipeline\n");
gst_element_set_state (pipeline, GST_STATE_PAUSED);
g_source_remove (update_id);
}
}
static void
stop_cb (GtkButton * button, gpointer data)
{
GstState state;
gst_element_get_state (pipeline, &state, NULL, GST_CLOCK_TIME_NONE);
if (state != GST_STATE_READY) {
g_print ("READY pipeline\n");
gst_element_set_state (pipeline, GST_STATE_PAUSED);
gst_element_set_state (pipeline, GST_STATE_READY);
gtk_adjustment_set_value (adjustment, 0.0);
g_source_remove (update_id);
}
}
static void
print_message (GstMessage * message)
{
const GstStructure *s;
s = gst_message_get_structure (message);
g_print ("Got Message from element \"%s\"\n",
GST_STR_NULL (GST_ELEMENT_NAME (GST_MESSAGE_SRC (message))));
if (s) {
gchar *sstr;
sstr = gst_structure_to_string (s);
g_print ("%s\n", sstr);
g_free (sstr);
}
}
static gboolean
bus_message (GstBus * bus, GstMessage * message, gpointer data)
{
switch (GST_MESSAGE_TYPE (message)) {
case GST_MESSAGE_EOS:
g_print ("EOS\n");
break;
case GST_MESSAGE_ERROR:
case GST_MESSAGE_WARNING:
print_message (message);
break;
case GST_MESSAGE_SEGMENT_START:
break;
case GST_MESSAGE_SEGMENT_DONE:
GST_DEBUG ("segment_done, doing next seek");
if (!do_seek (hscale, FALSE, update_id == 0)) {
if (changed_id == 0) {
changed_id = gtk_signal_connect (GTK_OBJECT (hscale),
"value_changed", G_CALLBACK (seek_cb), pipeline);
}
}
break;
default:
break;
}
return TRUE;
}
typedef struct
{
gchar *name;
GstElement *(*func) (const gchar * location);
}
Pipeline;
static Pipeline pipelines[] = {
{"wav", make_wav_pipeline},
{"playerbin", make_playerbin_pipeline},
{NULL, NULL},
};
#define NUM_TYPES ((sizeof (pipelines) / sizeof (Pipeline)) - 1)
static void
print_usage (int argc, char **argv)
{
gint i;
g_print ("usage: %s <type> <filename>\n", argv[0]);
g_print (" possible types:\n");
for (i = 0; i < NUM_TYPES; i++) {
g_print (" %d = %s\n", i, pipelines[i].name);
}
}
int
main (int argc, char **argv)
{
GtkWidget *window, *hbox, *vbox, *play_button, *pause_button, *stop_button;
GstBus *bus;
GOptionEntry options[] = {
{"verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose,
"Verbose properties", NULL},
{NULL}
};
gint type;
GOptionContext *ctx;
GError *err = NULL;
ctx = g_option_context_new ("seek");
g_option_context_add_main_entries (ctx, options, NULL);
g_option_context_add_group (ctx, gst_init_get_option_group ());
if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
g_print ("Error initializing: %s\n", err->message);
exit (1);
}
GST_DEBUG_CATEGORY_INIT (scrubby_debug, "scrubby", 0, "scrubby example");
gtk_init (&argc, &argv);
if (argc != 3) {
print_usage (argc, argv);
exit (-1);
}
type = atoi (argv[1]);
if (type < 0 || type >= NUM_TYPES) {
print_usage (argc, argv);
exit (-1);
}
pipeline = pipelines[type].func (argv[2]);
g_assert (pipeline);
/* initialize gui elements ... */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
hbox = gtk_hbox_new (FALSE, 0);
vbox = gtk_vbox_new (FALSE, 0);
play_button = gtk_button_new_with_label ("play");
pause_button = gtk_button_new_with_label ("pause");
stop_button = gtk_button_new_with_label ("stop");
adjustment =
GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, (gdouble) RANGE_PREC, 0.1,
1.0, 1.0));
hscale = gtk_hscale_new (adjustment);
gtk_scale_set_digits (GTK_SCALE (hscale), 2);
gtk_range_set_update_policy (GTK_RANGE (hscale), GTK_UPDATE_CONTINUOUS);
sadjustment =
GTK_ADJUSTMENT (gtk_adjustment_new (1.0, 0.0, 5.0, 0.1, 1.0, 1.0));
shscale = gtk_hscale_new (sadjustment);
gtk_scale_set_digits (GTK_SCALE (shscale), 2);
gtk_range_set_update_policy (GTK_RANGE (shscale), GTK_UPDATE_CONTINUOUS);
schanged_id = gtk_signal_connect (GTK_OBJECT (shscale),
"value_changed", G_CALLBACK (speed_cb), pipeline);
gtk_signal_connect (GTK_OBJECT (hscale),
"button_press_event", G_CALLBACK (start_seek), pipeline);
gtk_signal_connect (GTK_OBJECT (hscale),
"button_release_event", G_CALLBACK (stop_seek), pipeline);
gtk_signal_connect (GTK_OBJECT (hscale),
"format_value", G_CALLBACK (format_value), pipeline);
/* do the packing stuff ... */
gtk_window_set_default_size (GTK_WINDOW (window), 96, 96);
gtk_container_add (GTK_CONTAINER (window), vbox);
gtk_container_add (GTK_CONTAINER (vbox), hbox);
gtk_box_pack_start (GTK_BOX (hbox), play_button, FALSE, FALSE, 2);
gtk_box_pack_start (GTK_BOX (hbox), pause_button, FALSE, FALSE, 2);
gtk_box_pack_start (GTK_BOX (hbox), stop_button, FALSE, FALSE, 2);
gtk_box_pack_start (GTK_BOX (vbox), hscale, TRUE, TRUE, 2);
gtk_box_pack_start (GTK_BOX (vbox), shscale, TRUE, TRUE, 2);
/* connect things ... */
g_signal_connect (G_OBJECT (play_button), "clicked", G_CALLBACK (play_cb),
pipeline);
g_signal_connect (G_OBJECT (pause_button), "clicked", G_CALLBACK (pause_cb),
pipeline);
g_signal_connect (G_OBJECT (stop_button), "clicked", G_CALLBACK (stop_cb),
pipeline);
g_signal_connect (G_OBJECT (window), "delete_event", gtk_main_quit, NULL);
/* show the gui. */
gtk_widget_show_all (window);
if (verbose) {
g_signal_connect (pipeline, "deep_notify",
G_CALLBACK (gst_object_default_deep_notify), NULL);
}
bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
g_assert (bus);
bus_watch = gst_bus_add_watch_full (bus,
G_PRIORITY_LOW, bus_message, pipeline, NULL);
gtk_main ();
g_print ("NULL pipeline\n");
gst_element_set_state (pipeline, GST_STATE_NULL);
g_print ("free pipeline\n");
gst_object_unref (pipeline);
return 0;
}

File diff suppressed because it is too large Load diff

View file

@ -1,6 +0,0 @@
noinst_PROGRAMS = mp2ogg
LDADD = $(GST_LIBS)
AM_CFLAGS = $(GST_CFLAGS)

View file

@ -1,102 +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., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include <gst/gst.h>
/* This example app demonstartes the use of pad query and convert to
* get useful statistics about a plugin. In this case we monitor the
* compression status of mpeg audio to ogg vorbis transcoding.
*/
gint
main (gint argc, gchar * argv[])
{
GstElement *pipeline;
GError *error = NULL;
gchar *description;
GstElement *encoder, *decoder;
GstPad *dec_sink, *enc_src;
gst_init (&argc, &argv);
if (argc < 3) {
g_print ("usage: %s <inputfile> <outputfile>\n", argv[0]);
return -1;
}
description = g_strdup_printf ("filesrc location=\"%s\" ! mad name=decoder ! "
"vorbisenc name=encoder ! filesink location=\"%s\"", argv[1], argv[2]);
pipeline = GST_ELEMENT (gst_parse_launch (description, &error));
if (!pipeline) {
if (error)
g_print ("ERROR: pipeline could not be constructed: %s\n",
error->message);
else
g_print ("ERROR: pipeline could not be constructed\n");
return -1;
}
decoder = gst_bin_get_by_name (GST_BIN (pipeline), "decoder");
encoder = gst_bin_get_by_name (GST_BIN (pipeline), "encoder");
dec_sink = gst_element_get_pad (decoder, "sink");
enc_src = gst_element_get_pad (encoder, "src");
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS) {
g_print ("pipeline doesn't want to play\n");
return -1;
}
while (gst_bin_iterate (GST_BIN (pipeline))) {
gint64 position;
gint64 duration;
gint64 bitrate_enc, bitrate_dec;
GstFormat format;
format = GST_FORMAT_TIME;
/* get the position */
gst_pad_query (enc_src, GST_QUERY_POSITION, &format, &position);
/* get the total duration */
gst_pad_query (enc_src, GST_QUERY_TOTAL, &format, &duration);
format = GST_FORMAT_BYTES;
/* see how many bytes are genereated per 8 seconds (== bitrate) */
gst_pad_convert (enc_src, GST_FORMAT_TIME, 8 * GST_SECOND,
&format, &bitrate_enc);
gst_pad_convert (dec_sink, GST_FORMAT_TIME, 8 * GST_SECOND,
&format, &bitrate_dec);
g_print ("[%2dm %.2ds] of [%2dm %.2ds], "
"src avg bitrate: %" G_GINT64_FORMAT ", dest avg birate: %"
G_GINT64_FORMAT ", ratio [%02.2f] \r",
(gint) (position / (GST_SECOND * 60)),
(gint) (position / (GST_SECOND)) % 60,
(gint) (duration / (GST_SECOND * 60)),
(gint) (duration / (GST_SECOND)) % 60, bitrate_dec, bitrate_enc,
(gfloat) bitrate_dec / bitrate_enc);
}
g_print ("\n");
return 0;
}

View file

@ -1 +0,0 @@
switcher

View file

@ -1,7 +0,0 @@
noinst_PROGRAMS = switcher
switcher_SOURCES = switcher.c
switcher_CFLAGS = $(GST_CFLAGS)
switcher_LDFLAGS = $(GST_LIBS)

View file

@ -1,104 +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., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <gst/gst.h>
static GMainLoop *loop = NULL;
static void
got_eos (GstElement * pipeline)
{
g_main_loop_quit (loop);
}
static gboolean
idle_iterate (GstElement * pipeline)
{
gst_bin_iterate (GST_BIN (pipeline));
return (GST_STATE (GST_ELEMENT (pipeline)) == GST_STATE_PLAYING);
}
static gboolean
switch_timer (GstElement * video_switch)
{
gint nb_sources, active_source;
g_object_get (G_OBJECT (video_switch), "nb_sources", &nb_sources, NULL);
g_object_get (G_OBJECT (video_switch), "active_source", &active_source, NULL);
active_source++;
if (active_source > nb_sources - 1)
active_source = 0;
g_object_set (G_OBJECT (video_switch), "active_source", active_source, NULL);
g_message ("current number of sources : %d, active source %d",
nb_sources, active_source);
return (GST_STATE (GST_ELEMENT (video_switch)) == GST_STATE_PLAYING);
}
int
main (int argc, char *argv[])
{
GstElement *pipeline, *src1, *src2, *video_switch, *video_sink;
/* Initing GStreamer library */
gst_init (&argc, &argv);
loop = g_main_loop_new (NULL, FALSE);
pipeline = gst_pipeline_new ("pipeline");
src1 = gst_element_factory_make ("videotestsrc", "src1");
g_object_set (G_OBJECT (src1), "pattern", 0, NULL);
src2 = gst_element_factory_make ("videotestsrc", "src2");
g_object_set (G_OBJECT (src2), "pattern", 1, NULL);
video_switch = gst_element_factory_make ("switch", "video_switch");
video_sink = gst_element_factory_make (DEFAULT_VIDEOSINK, "video_sink");
gst_bin_add_many (GST_BIN (pipeline), src1, src2, video_switch,
video_sink, NULL);
gst_element_link (src1, video_switch);
gst_element_link (src2, video_switch);
gst_element_link (video_switch, video_sink);
g_signal_connect (G_OBJECT (pipeline), "eos", G_CALLBACK (got_eos), NULL);
gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
g_idle_add ((GSourceFunc) idle_iterate, pipeline);
g_timeout_add (2000, (GSourceFunc) switch_timer, video_switch);
g_main_loop_run (loop);
gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_READY);
/* unref */
gst_object_unref (pipeline);
exit (0);
}

19
tests/Makefile.am Normal file
View file

@ -0,0 +1,19 @@
if BUILD_EXAMPLES
SUBDIRS_EXAMPLES = examples
else
SUBDIRS_EXAMPLES =
endif
if HAVE_CHECK
SUBDIRS_CHECK = check
else
SUBDIRS_CHECK =
endif
SUBDIRS = \
$(SUBDIRS_CHECK) \
$(SUBDIRS_EXAMPLES)
DIST_SUBDIRS = \
check \
examples

View file

@ -1,2 +1,3 @@
.dirstamp
clock-selection
states

View file

@ -1,2 +1,2 @@
.dirstamp
simple_launch_lines
simple-launch-lines

View file

@ -0,0 +1,9 @@
if HAVE_FT2
FT2_SUBDIRS = seek
else
FT2_SUBDIRS =
endif
SUBDIRS = $(FT2_SUBDIRS)
DIST_SUBDIRS = seek

View file

@ -1,7 +1,6 @@
examples = seek scrubby #cdplayer cdparanoia
examples = seek scrubby
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)