Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Open sidebar
George Kiagiadakis
gst-plugins-base
Commits
b5f578ca
Commit
b5f578ca
authored
Jun 08, 2002
by
Wim Taymans
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Removed the old seeking example
Original commit message from CVS: Removed the old seeking example
parent
213772ba
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
2 additions
and
1032 deletions
+2
-1032
tests/old/Makefile.am
tests/old/Makefile.am
+1
-1
testsuite/Makefile.am
testsuite/Makefile.am
+1
-1
testsuite/seeking/Makefile.am
testsuite/seeking/Makefile.am
+0
-9
testsuite/seeking/seek1.c
testsuite/seeking/seek1.c
+0
-633
testsuite/seeking/seek2.c
testsuite/seeking/seek2.c
+0
-194
testsuite/seeking/seek3.c
testsuite/seeking/seek3.c
+0
-194
No files found.
tests/old/Makefile.am
View file @
b5f578ca
SUBDIRS
=
seeking
##autoplug
SUBDIRS
=
#
seeking ##autoplug
##DIST_SUBDIRS=##autoplug
##DIST_SUBDIRS=##autoplug
GST_PLUGIN_PATH
=
$(
shell
cd
$(top_builddir)
&&
pwd
)
GST_PLUGIN_PATH
=
$(
shell
cd
$(top_builddir)
&&
pwd
)
...
...
testsuite/Makefile.am
View file @
b5f578ca
SUBDIRS
=
seeking
##autoplug
SUBDIRS
=
#
seeking ##autoplug
##DIST_SUBDIRS=##autoplug
##DIST_SUBDIRS=##autoplug
GST_PLUGIN_PATH
=
$(
shell
cd
$(top_builddir)
&&
pwd
)
GST_PLUGIN_PATH
=
$(
shell
cd
$(top_builddir)
&&
pwd
)
...
...
testsuite/seeking/Makefile.am
deleted
100644 → 0
View file @
213772ba
testprogs
=
seek1
TESTS
=
$(testprogs)
check_PROGRAMS
=
$(testprogs)
# we have nothing but apps here, we can do this safely
LIBS
=
$(GST_LIBS)
$(GTK_LIBS)
CFLAGS
=
$(GST_CFLAGS)
$(GTK_CFLAGS)
testsuite/seeking/seek1.c
deleted
100644 → 0
View file @
213772ba
#include <glib.h>
#include <gtk/gtk.h>
#include <gst/gst.h>
#include <string.h>
static
GList
*
seekable_pads
=
NULL
;
static
GList
*
rate_pads
=
NULL
;
static
GList
*
seekable_elements
=
NULL
;
static
GstElement
*
pipeline
;
static
guint64
duration
,
position
;
static
GtkAdjustment
*
adjustment
;
static
guint
update_id
;
#define SOURCE "gnomevfssrc"
//#define SOURCE "filesrc"
#define UPDATE_INTERVAL 500
#define THREAD
#define PAD_SEEK
typedef
struct
{
const
gchar
*
padname
;
GstPad
*
target
;
GstElement
*
bin
;
}
dyn_connect
;
static
void
dynamic_connect
(
GstPadTemplate
*
templ
,
GstPad
*
newpad
,
gpointer
data
)
{
dyn_connect
*
connect
=
(
dyn_connect
*
)
data
;
if
(
!
strcmp
(
gst_pad_get_name
(
newpad
),
connect
->
padname
))
{
gst_element_set_state
(
pipeline
,
GST_STATE_PAUSED
);
gst_bin_add
(
GST_BIN
(
pipeline
),
connect
->
bin
);
gst_pad_connect
(
newpad
,
connect
->
target
);
gst_element_set_state
(
pipeline
,
GST_STATE_PLAYING
);
seekable_pads
=
g_list_prepend
(
seekable_pads
,
newpad
);
rate_pads
=
g_list_prepend
(
rate_pads
,
newpad
);
}
}
static
void
setup_dynamic_connection
(
GstElement
*
element
,
const
gchar
*
padname
,
GstPad
*
target
,
GstElement
*
bin
)
{
dyn_connect
*
connect
;
connect
=
g_new0
(
dyn_connect
,
1
);
connect
->
padname
=
g_strdup
(
padname
);
connect
->
target
=
target
;
connect
->
bin
=
bin
;
g_signal_connect
(
G_OBJECT
(
element
),
"new_pad"
,
G_CALLBACK
(
dynamic_connect
),
connect
);
}
static
GstElement
*
make_sid_pipeline
(
const
gchar
*
location
)
{
GstElement
*
pipeline
;
GstElement
*
src
,
*
decoder
,
*
audiosink
;
GstPad
*
seekable
;
pipeline
=
gst_pipeline_new
(
"app"
);
src
=
gst_element_factory_make
(
SOURCE
,
"src"
);
decoder
=
gst_element_factory_make
(
"siddec"
,
"decoder"
);
audiosink
=
gst_element_factory_make
(
"osssink"
,
"sink"
);
//g_object_set (G_OBJECT (audiosink), "sync", FALSE, NULL);
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_connect
(
src
,
decoder
);
gst_element_connect
(
decoder
,
audiosink
);
seekable
=
gst_element_get_pad
(
decoder
,
"src"
);
seekable_pads
=
g_list_prepend
(
seekable_pads
,
seekable
);
rate_pads
=
g_list_prepend
(
rate_pads
,
seekable
);
rate_pads
=
g_list_prepend
(
rate_pads
,
gst_element_get_pad
(
decoder
,
"sink"
));
return
pipeline
;
}
static
GstElement
*
make_parse_pipeline
(
const
gchar
*
location
)
{
GstElement
*
pipeline
;
GstElement
*
src
,
*
parser
,
*
fakesink
;
GstPad
*
seekable
;
pipeline
=
gst_pipeline_new
(
"app"
);
src
=
gst_element_factory_make
(
SOURCE
,
"src"
);
parser
=
gst_element_factory_make
(
"mpegparse"
,
"parse"
);
fakesink
=
gst_element_factory_make
(
"fakesink"
,
"sink"
);
g_object_set
(
G_OBJECT
(
fakesink
),
"sync"
,
TRUE
,
NULL
);
g_object_set
(
G_OBJECT
(
src
),
"location"
,
location
,
NULL
);
gst_bin_add
(
GST_BIN
(
pipeline
),
src
);
gst_bin_add
(
GST_BIN
(
pipeline
),
parser
);
gst_bin_add
(
GST_BIN
(
pipeline
),
fakesink
);
gst_element_connect
(
src
,
parser
);
gst_element_connect
(
parser
,
fakesink
);
seekable
=
gst_element_get_pad
(
parser
,
"src"
);
seekable_pads
=
g_list_prepend
(
seekable_pads
,
seekable
);
rate_pads
=
g_list_prepend
(
rate_pads
,
seekable
);
rate_pads
=
g_list_prepend
(
rate_pads
,
gst_element_get_pad
(
parser
,
"sink"
));
return
pipeline
;
}
static
GstElement
*
make_vorbis_pipeline
(
const
gchar
*
location
)
{
GstElement
*
pipeline
;
GstElement
*
src
,
*
decoder
,
*
audiosink
;
GstPad
*
seekable
;
pipeline
=
gst_pipeline_new
(
"app"
);
src
=
gst_element_factory_make
(
SOURCE
,
"src"
);
decoder
=
gst_element_factory_make
(
"vorbisfile"
,
"decoder"
);
audiosink
=
gst_element_factory_make
(
"osssink"
,
"sink"
);
//g_object_set (G_OBJECT (audiosink), "sync", FALSE, NULL);
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_connect
(
src
,
decoder
);
gst_element_connect
(
decoder
,
audiosink
);
seekable
=
gst_element_get_pad
(
decoder
,
"src"
);
seekable_pads
=
g_list_prepend
(
seekable_pads
,
seekable
);
rate_pads
=
g_list_prepend
(
rate_pads
,
seekable
);
rate_pads
=
g_list_prepend
(
rate_pads
,
gst_element_get_pad
(
decoder
,
"sink"
));
return
pipeline
;
}
static
GstElement
*
make_mp3_pipeline
(
const
gchar
*
location
)
{
GstElement
*
pipeline
;
GstElement
*
src
,
*
decoder
,
*
osssink
;
GstPad
*
seekable
;
pipeline
=
gst_pipeline_new
(
"app"
);
src
=
gst_element_factory_make
(
SOURCE
,
"src"
);
decoder
=
gst_element_factory_make
(
"mad"
,
"dec"
);
osssink
=
gst_element_factory_make
(
"osssink"
,
"sink"
);
seekable_elements
=
g_list_prepend
(
seekable_elements
,
osssink
);
g_object_set
(
G_OBJECT
(
src
),
"location"
,
location
,
NULL
);
g_object_set
(
G_OBJECT
(
osssink
),
"fragment"
,
0x00180008
,
NULL
);
gst_bin_add
(
GST_BIN
(
pipeline
),
src
);
gst_bin_add
(
GST_BIN
(
pipeline
),
decoder
);
gst_bin_add
(
GST_BIN
(
pipeline
),
osssink
);
gst_element_connect
(
src
,
decoder
);
gst_element_connect
(
decoder
,
osssink
);
seekable
=
gst_element_get_pad
(
decoder
,
"src"
);
seekable_pads
=
g_list_prepend
(
seekable_pads
,
seekable
);
rate_pads
=
g_list_prepend
(
rate_pads
,
seekable
);
rate_pads
=
g_list_prepend
(
rate_pads
,
gst_element_get_pad
(
decoder
,
"sink"
));
return
pipeline
;
}
static
GstElement
*
make_avi_pipeline
(
const
gchar
*
location
)
{
GstElement
*
pipeline
,
*
audio_bin
,
*
video_bin
;
GstElement
*
src
,
*
demux
,
*
a_decoder
,
*
v_decoder
,
*
audiosink
,
*
videosink
;
GstElement
*
a_queue
=
NULL
,
*
audio_thread
=
NULL
,
*
v_queue
=
NULL
,
*
video_thread
=
NULL
;
GstPad
*
seekable
;
pipeline
=
gst_pipeline_new
(
"app"
);
src
=
gst_element_factory_make
(
SOURCE
,
"src"
);
g_object_set
(
G_OBJECT
(
src
),
"location"
,
location
,
NULL
);
demux
=
gst_element_factory_make
(
"avidemux"
,
"demux"
);
seekable_elements
=
g_list_prepend
(
seekable_elements
,
demux
);
gst_bin_add
(
GST_BIN
(
pipeline
),
src
);
gst_bin_add
(
GST_BIN
(
pipeline
),
demux
);
gst_element_connect
(
src
,
demux
);
audio_bin
=
gst_bin_new
(
"a_decoder_bin"
);
a_decoder
=
gst_element_factory_make
(
"mad"
,
"a_dec"
);
audio_thread
=
gst_thread_new
(
"a_decoder_thread"
);
audiosink
=
gst_element_factory_make
(
"osssink"
,
"a_sink"
);
//g_object_set (G_OBJECT (audiosink), "fragment", 0x00180008, NULL);
a_queue
=
gst_element_factory_make
(
"queue"
,
"a_queue"
);
gst_element_connect
(
a_decoder
,
a_queue
);
gst_element_connect
(
a_queue
,
audiosink
);
gst_bin_add
(
GST_BIN
(
audio_bin
),
a_decoder
);
gst_bin_add
(
GST_BIN
(
audio_bin
),
audio_thread
);
gst_bin_add
(
GST_BIN
(
audio_thread
),
a_queue
);
gst_bin_add
(
GST_BIN
(
audio_thread
),
audiosink
);
gst_element_set_state
(
audio_bin
,
GST_STATE_READY
);
setup_dynamic_connection
(
demux
,
"audio_00"
,
gst_element_get_pad
(
a_decoder
,
"sink"
),
audio_bin
);
seekable
=
gst_element_get_pad
(
a_queue
,
"src"
);
seekable_pads
=
g_list_prepend
(
seekable_pads
,
seekable
);
rate_pads
=
g_list_prepend
(
rate_pads
,
seekable
);
rate_pads
=
g_list_prepend
(
rate_pads
,
gst_element_get_pad
(
a_decoder
,
"sink"
));
video_bin
=
gst_bin_new
(
"v_decoder_bin"
);
//v_decoder = gst_element_factory_make ("identity", "v_dec");
v_decoder
=
gst_element_factory_make
(
"windec"
,
"v_dec"
);
video_thread
=
gst_thread_new
(
"v_decoder_thread"
);
videosink
=
gst_element_factory_make
(
"xvideosink"
,
"v_sink"
);
//videosink = gst_element_factory_make ("fakesink", "v_sink");
//g_object_set (G_OBJECT (videosink), "sync", TRUE, NULL);
v_queue
=
gst_element_factory_make
(
"queue"
,
"v_queue"
);
g_object_set
(
G_OBJECT
(
v_queue
),
"max_level"
,
10
,
NULL
);
gst_element_connect
(
v_decoder
,
v_queue
);
gst_element_connect
(
v_queue
,
videosink
);
gst_bin_add
(
GST_BIN
(
video_bin
),
v_decoder
);
gst_bin_add
(
GST_BIN
(
video_bin
),
video_thread
);
gst_bin_add
(
GST_BIN
(
video_thread
),
v_queue
);
gst_bin_add
(
GST_BIN
(
video_thread
),
videosink
);
gst_element_set_state
(
video_bin
,
GST_STATE_READY
);
setup_dynamic_connection
(
demux
,
"video_00"
,
gst_element_get_pad
(
v_decoder
,
"sink"
),
video_bin
);
seekable
=
gst_element_get_pad
(
v_queue
,
"src"
);
seekable_pads
=
g_list_prepend
(
seekable_pads
,
seekable
);
rate_pads
=
g_list_prepend
(
rate_pads
,
seekable
);
rate_pads
=
g_list_prepend
(
rate_pads
,
gst_element_get_pad
(
v_decoder
,
"sink"
));
return
pipeline
;
}
static
GstElement
*
make_mpeg_pipeline
(
const
gchar
*
location
)
{
GstElement
*
pipeline
,
*
audio_bin
,
*
video_bin
;
GstElement
*
src
,
*
demux
,
*
a_decoder
,
*
v_decoder
,
*
audiosink
,
*
videosink
;
GstElement
*
a_queue
,
*
audio_thread
,
*
v_queue
,
*
video_thread
;
GstPad
*
seekable
;
pipeline
=
gst_pipeline_new
(
"app"
);
src
=
gst_element_factory_make
(
SOURCE
,
"src"
);
g_object_set
(
G_OBJECT
(
src
),
"location"
,
location
,
NULL
);
demux
=
gst_element_factory_make
(
"mpegdemux"
,
"demux"
);
g_object_set
(
G_OBJECT
(
demux
),
"sync"
,
FALSE
,
NULL
);
seekable_elements
=
g_list_prepend
(
seekable_elements
,
demux
);
gst_bin_add
(
GST_BIN
(
pipeline
),
src
);
gst_bin_add
(
GST_BIN
(
pipeline
),
demux
);
gst_element_connect
(
src
,
demux
);
audio_bin
=
gst_bin_new
(
"a_decoder_bin"
);
a_decoder
=
gst_element_factory_make
(
"mad"
,
"a_dec"
);
audio_thread
=
gst_thread_new
(
"a_decoder_thread"
);
a_queue
=
gst_element_factory_make
(
"queue"
,
"a_queue"
);
audiosink
=
gst_element_factory_make
(
"osssink"
,
"a_sink"
);
g_object_set
(
G_OBJECT
(
audiosink
),
"fragment"
,
0x00180008
,
NULL
);
gst_element_connect
(
a_decoder
,
a_queue
);
gst_element_connect
(
a_queue
,
audiosink
);
gst_bin_add
(
GST_BIN
(
audio_bin
),
a_decoder
);
gst_bin_add
(
GST_BIN
(
audio_bin
),
audio_thread
);
gst_bin_add
(
GST_BIN
(
audio_thread
),
a_queue
);
gst_bin_add
(
GST_BIN
(
audio_thread
),
audiosink
);
setup_dynamic_connection
(
demux
,
"audio_00"
,
gst_element_get_pad
(
a_decoder
,
"sink"
),
audio_bin
);
seekable
=
gst_element_get_pad
(
a_queue
,
"src"
);
seekable_pads
=
g_list_prepend
(
seekable_pads
,
seekable
);
rate_pads
=
g_list_prepend
(
rate_pads
,
seekable
);
rate_pads
=
g_list_prepend
(
rate_pads
,
gst_element_get_pad
(
a_decoder
,
"sink"
));
video_bin
=
gst_bin_new
(
"v_decoder_bin"
);
v_decoder
=
gst_element_factory_make
(
"mpeg2dec"
,
"v_dec"
);
video_thread
=
gst_thread_new
(
"v_decoder_thread"
);
v_queue
=
gst_element_factory_make
(
"queue"
,
"v_queue"
);
videosink
=
gst_element_factory_make
(
"xvideosink"
,
"v_sink"
);
gst_element_connect
(
v_decoder
,
v_queue
);
gst_element_connect
(
v_queue
,
videosink
);
gst_bin_add
(
GST_BIN
(
video_bin
),
v_decoder
);
gst_bin_add
(
GST_BIN
(
video_bin
),
video_thread
);
gst_bin_add
(
GST_BIN
(
video_thread
),
v_queue
);
gst_bin_add
(
GST_BIN
(
video_thread
),
videosink
);
setup_dynamic_connection
(
demux
,
"video_00"
,
gst_element_get_pad
(
v_decoder
,
"sink"
),
video_bin
);
seekable
=
gst_element_get_pad
(
v_queue
,
"src"
);
seekable_pads
=
g_list_prepend
(
seekable_pads
,
seekable
);
rate_pads
=
g_list_prepend
(
rate_pads
,
seekable
);
rate_pads
=
g_list_prepend
(
rate_pads
,
gst_element_get_pad
(
v_decoder
,
"sink"
));
return
pipeline
;
}
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
(
"%02lld:%02lld:%02lld"
,
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
},
{
"unt"
,
GST_FORMAT_UNITS
},
{
"buf"
,
GST_FORMAT_BUFFERS
},
{
"def"
,
GST_FORMAT_DEFAULT
},
{
NULL
,
0
},
};
G_GNUC_UNUSED
static
void
query_rates
(
void
)
{
GList
*
walk
=
rate_pads
;
while
(
walk
)
{
GstPad
*
pad
=
GST_PAD
(
walk
->
data
);
gint
i
=
0
;
g_print
(
"rate/sec %8.8s: "
,
GST_PAD_NAME
(
pad
));
while
(
seek_formats
[
i
].
name
)
{
gint64
value
;
GstFormat
format
;
format
=
seek_formats
[
i
].
format
;
if
(
gst_pad_convert
(
pad
,
GST_FORMAT_TIME
,
GST_SECOND
,
&
format
,
&
value
))
{
g_print
(
"%s %13lld | "
,
seek_formats
[
i
].
name
,
value
);
}
else
{
g_print
(
"%s %13.13s | "
,
seek_formats
[
i
].
name
,
"*NA*"
);
}
i
++
;
}
g_print
(
" %s:%s
\n
"
,
GST_DEBUG_PAD_NAME
(
pad
));
walk
=
g_list_next
(
walk
);
}
}
G_GNUC_UNUSED
static
void
query_durations
(
GstPad
*
pad
)
{
gint
i
=
0
;
g_print
(
"durations %8.8s: "
,
GST_PAD_NAME
(
pad
));
while
(
seek_formats
[
i
].
name
)
{
gboolean
res
;
gint64
value
;
GstFormat
format
;
format
=
seek_formats
[
i
].
format
;
res
=
gst_pad_query
(
pad
,
GST_PAD_QUERY_TOTAL
,
&
format
,
&
value
);
if
(
res
)
{
g_print
(
"%s %13lld | "
,
seek_formats
[
i
].
name
,
value
);
if
(
seek_formats
[
i
].
format
==
GST_FORMAT_TIME
)
duration
=
value
;
}
else
{
g_print
(
"%s %13.13s | "
,
seek_formats
[
i
].
name
,
"*NA*"
);
}
i
++
;
}
g_print
(
" %s:%s
\n
"
,
GST_DEBUG_PAD_NAME
(
pad
));
}
G_GNUC_UNUSED
static
void
query_positions
(
GstPad
*
pad
)
{
gint
i
=
0
;
g_print
(
"positions %8.8s: "
,
GST_PAD_NAME
(
pad
));
while
(
seek_formats
[
i
].
name
)
{
gboolean
res
;
gint64
value
;
GstFormat
format
;
format
=
seek_formats
[
i
].
format
;
res
=
gst_pad_query
(
pad
,
GST_PAD_QUERY_POSITION
,
&
format
,
&
value
);
if
(
res
)
{
g_print
(
"%s %13lld | "
,
seek_formats
[
i
].
name
,
value
);
if
(
seek_formats
[
i
].
format
==
GST_FORMAT_TIME
)
position
=
value
;
}
else
{
g_print
(
"%s %13.13s | "
,
seek_formats
[
i
].
name
,
"*NA*"
);
}
i
++
;
}
g_print
(
" %s:%s
\n
"
,
GST_DEBUG_PAD_NAME
(
pad
));
}
static
gboolean
update_scale
(
gpointer
data
)
{
GList
*
walk
=
seekable_pads
;
GstClock
*
clock
;
clock
=
gst_bin_get_clock
(
GST_BIN
(
pipeline
));
g_print
(
"clock: %13llu (%s)
\n
"
,
gst_clock_get_time
(
clock
),
gst_object_get_name
(
GST_OBJECT
(
clock
)));
while
(
walk
)
{
GstPad
*
pad
=
GST_PAD
(
walk
->
data
);
query_durations
(
pad
);
query_positions
(
pad
);
walk
=
g_list_next
(
walk
);
}
query_rates
();
if
(
duration
>
0
)
{
gtk_adjustment_set_value
(
adjustment
,
position
*
100
.
0
/
duration
);
}
return
TRUE
;
}
static
gboolean
iterate
(
gpointer
data
)
{
gboolean
res
;
res
=
gst_bin_iterate
(
GST_BIN
(
data
));
if
(
!
res
)
{
gtk_timeout_remove
(
update_id
);
g_print
(
"stopping iterations
\n
"
);
}
return
res
;
}
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
;
#ifdef PAD_SEEK
GList
*
walk
=
seekable_pads
;
while
(
walk
)
{
GstPad
*
seekable
=
GST_PAD
(
walk
->
data
);
g_print
(
"seek to %lld on pad %s:%s
\n
"
,
real
,
GST_DEBUG_PAD_NAME
(
seekable
));
s_event
=
gst_event_new_seek
(
GST_FORMAT_TIME
|
GST_SEEK_METHOD_SET
|
GST_SEEK_FLAG_FLUSH
,
real
);
res
=
gst_pad_send_event
(
seekable
,
s_event
);
gst_event_free
(
s_event
);
walk
=
g_list_next
(
walk
);
}
#else
GList
*
walk
=
seekable_elements
;
while
(
walk
)
{
GstElement
*
seekable
=
GST_ELEMENT
(
walk
->
data
);
g_print
(
"seek to %lld on element %s
\n
"
,
real
,
gst_element_get_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
);
gst_event_free
(
s_event
);
walk
=
g_list_next
(
walk
);
}
#endif
gst_element_set_state
(
pipeline
,
GST_STATE_PLAYING
);
gtk_idle_add
((
GtkFunction
)
iterate
,
pipeline
);
update_id
=
gtk_timeout_add
(
UPDATE_INTERVAL
,
(
GtkFunction
)
update_scale
,
pipeline
);
return
FALSE
;
}
static
void
play_cb
(
GtkButton
*
button
,
gpointer
data
)
{
if
(
gst_element_get_state
(
pipeline
)
!=
GST_STATE_PLAYING
)
{
gst_element_set_state
(
pipeline
,
GST_STATE_PLAYING
);
gtk_idle_add
((
GtkFunction
)
iterate
,
pipeline
);
update_id
=
gtk_timeout_add
(
UPDATE_INTERVAL
,
(
GtkFunction
)
update_scale
,
pipeline
);
}
}
static
void
pause_cb
(
GtkButton
*
button
,
gpointer
data
)
{
if
(
gst_element_get_state
(
pipeline
)
!=
GST_STATE_PAUSED
)
{
gst_element_set_state
(
pipeline
,
GST_STATE_PAUSED
);
gtk_timeout_remove
(
update_id
);
}
}
static
void
stop_cb
(
GtkButton
*
button
,
gpointer
data
)
{
if
(
gst_element_get_state
(
pipeline
)
!=
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
;
gst_init
(
&
argc
,
&
argv
);
gtk_init
(
&
argc
,
&
argv
);
if
(
argc
!=
3
)
{
g_print
(
"usage: %s <type 0=mp3 1=avi 2=mpeg1 3=mpegparse 4=vorbis> <filename>
\n
"
,
argv
[
0
]);
exit
(
-
1
);
}
if
(
atoi
(
argv
[
1
])
==
0
)
pipeline
=
make_mp3_pipeline
(
argv
[
2
]);
else
if
(
atoi
(
argv
[
1
])
==
1
)
pipeline
=
make_avi_pipeline
(
argv
[
2
]);
else
if
(
atoi
(
argv
[
1
])
==
2
)
pipeline
=
make_mpeg_pipeline
(
argv
[
2
]);
else
if
(
atoi
(
argv
[
1
])
==
3
)
pipeline
=
make_parse_pipeline
(
argv
[
2
]);
else
if
(
atoi
(
argv
[
1
])
==
4
)
pipeline
=
make_vorbis_pipeline
(
argv
[
2
]);
else
if
(
atoi
(
argv
[
1
])
==
5
)
pipeline
=
make_sid_pipeline
(
argv
[
2
]);
/* 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
=