Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Víctor Manuel Jáquez Leal
gst-plugins-bad
Commits
b01792e1
Commit
b01792e1
authored
Aug 16, 2005
by
Thomas Vander Stichele
Browse files
remove seeking example, they're in gst-plugins-base
Original commit message from CVS: remove seeking example, they're in gst-plugins-base
parent
ea28d448
Changes
9
Expand all
Hide whitespace changes
Inline
Side-by-side
examples/Makefile.am
View file @
b01792e1
if
HAVE_FT2
FT2_SUBDIRS
=
seeking
else
FT2_SUBDIRS
=
endif
if
HAVE_GTK
GTK_SUBDIRS
=
dynparams level
$(FT2_SUBDIRS)
else
...
...
@@ -17,4 +11,4 @@ GCONF_SUBDIRS=
endif
SUBDIRS
=
$(GTK_SUBDIRS)
$(GCONF_SUBDIRS)
switch
DIST_SUBDIRS
=
capsfilter dynparams
seeking
indexing gstplay switch level
DIST_SUBDIRS
=
capsfilter dynparams indexing gstplay switch level
examples/seeking/.gitignore
deleted
100644 → 0
View file @
ea28d448
cdparanoia
cdplayer
seek
spider_seek
vorbisfile
examples/seeking/Makefile.am
deleted
100644 → 0
View file @
ea28d448
examples
=
seek spider_seek cdplayer cdparanoia vorbisfile playbin chained
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)
examples/seeking/cdparanoia.c
deleted
100644 → 0
View file @
ea28d448
#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_element_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
(
gst_bin_iterate
(
GST_BIN
(
pipeline
)))
{
get_position_info
(
cdparanoia
);
if
(
count
++
>
500
)
break
;
}
gst_element_set_state
(
pipeline
,
GST_STATE_PAUSED
);
g_print
(
"
\n
playing 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
);
while
(
gst_bin_iterate
(
GST_BIN
(
pipeline
)))
{
get_position_info
(
cdparanoia
);
}
g_print
(
"
\n
"
);
/* shutdown everything again */
gst_element_set_state
(
pipeline
,
GST_STATE_NULL
);
return
0
;
}
examples/seeking/cdplayer.c
deleted
100644 → 0
View file @
ea28d448
#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_bin_get_clock
(
GST_BIN
(
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
iterate
(
gpointer
data
)
{
gboolean
res
=
TRUE
;
g_print
(
"iterate
\n
"
);
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
;
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
);
if
(
!
GST_FLAG_IS_SET
(
pipeline
,
GST_BIN_SELF_SCHEDULABLE
))
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
);
if
(
!
GST_FLAG_IS_SET
(
pipeline
,
GST_BIN_SELF_SCHEDULABLE
))
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
;
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_element_default_deep_notify
),
NULL
);
g_signal_connect
(
pipeline
,
"error"
,
G_CALLBACK
(
gst_element_default_error
),
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
;
}
examples/seeking/chained.c
deleted
100644 → 0
View file @
ea28d448
#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
);