When we start and we need to produce the first sample, go to the next sample
that will be written into the ringbuffer instead of trying to go to sample 0.
We relied on rather small ringbuffer sizes to correctly go to the current
sample, which breaks whith large buffers.
Fixes#600945
There's not much point in using GST_DEBUG_FUNCPTR with GObject
virtual functions such as get_property, set_propery, finalize and
dispose, since they'll never be used by anyone anyway. Saves a
few bytes and possibly a sixteenth of a polar bear.
The old one did the mistake of not actually advancing the ringbuffer, it just
adjusted the segbase, introducing the whole lenght of the ringbuffer as an
extra delay in the pipeline.
Also make sure that the resync can never go back in time, producing the same
timestamps that has already been produced, as this can cause severe problems
for sinks and other synching mechanisms.
Fixes#594256
Original commit message from CVS:
* gst-libs/gst/audio/gstbaseaudiosrc.c:
Make GstAudioSrcSlaveMethod get_type() function non-static
as it's public now.
* win32/common/libgstaudio.def:
* win32/common/libgstnetbuffer.def:
Add some missing functions to the list of exported symbols.
Original commit message from CVS:
* gst-libs/gst/audio/gstbaseaudiosink.c:
(gst_base_audio_sink_slave_method_get_type),
(gst_base_audio_sink_class_init):
* gst-libs/gst/audio/gstbaseaudiosink.h:
* gst-libs/gst/audio/gstbaseaudiosrc.c:
(gst_base_audio_src_slave_method_get_type),
(gst_base_audio_src_class_init):
* gst-libs/gst/audio/gstbaseaudiosrc.h:
API: Add GST_TYPE_BASE_AUDIO_(SRC|SINK)_SLAVE_METHOD to the
public API. This is needed for the C++ bindings to be able
to use this base classes. Fixes bug #564200, #564206.
Original commit message from CVS:
* gst-libs/gst/audio/gstbaseaudiosrc.c:
(gst_base_audio_src_get_offset), (gst_base_audio_src_create):
Avoid nasty int overflows after about 12 hours and 25 minutes when these
code paths are triggered.
A free beer to Håvard Graff for finding this!
Original commit message from CVS:
* gst-libs/gst/audio/gstbaseaudiosrc.c:
(gst_base_audio_src_create):
Fix debug statements (space between '%' and actual format).
Original commit message from CVS:
* gst-libs/gst/audio/gstbaseaudiosrc.c:
(gst_base_audio_src_create):
When not slaved to another clock also subtract the base_time from our
internal clock time to get the running time.
Original commit message from CVS:
* gst-libs/gst/audio/gstbaseaudiosrc.c:
(gst_base_audio_src_class_init):
Add a gtk-doc chunk for the new properties to have a Since: indication.
Original commit message from CVS:
* gst-libs/gst/audio/gstbaseaudiosrc.c:
(gst_base_audio_src_class_init), (gst_base_audio_src_dispose),
(gst_base_audio_src_get_property), (gst_base_audio_src_setcaps),
(gst_base_audio_src_change_state):
Provide readable actual-buffer-time and actual-latency-time properties
that reflect the configured ringbuffer values. Fixes#524724.
Original commit message from CVS:
* gst-libs/gst/audio/gstaudioclock.c: (gst_audio_clock_init),
(gst_audio_clock_reset), (gst_audio_clock_get_internal_time):
* gst-libs/gst/audio/gstaudioclock.h:
Add method to inform the clock that the time starts from 0 again. We use
this info to calculate a clock offset so that the time we report in
internal_time is monotonically increasing, as required by the clock base
class. Fixes#521761.
API: GstAudioClock::gst_audio_clock_reset()
* gst-libs/gst/audio/gstbaseaudiosink.c:
(gst_base_audio_sink_skew_slaving),
(gst_base_audio_sink_change_state):
* gst-libs/gst/audio/gstbaseaudiosrc.c:
(gst_base_audio_src_create), (gst_base_audio_src_change_state):
Reset reported time when we (re)create the ringbuffer.
Original commit message from CVS:
* ext/gnomevfs/gstgnomevfssrc.c: (gst_gnome_vfs_src_init),
(gst_gnome_vfs_src_finalize),
(gst_gnome_vfs_src_received_headers_callback),
(gst_gnome_vfs_src_create), (gst_gnome_vfs_src_stop):
* ext/gnomevfs/gstgnomevfssrc.h:
Set the ICY caps on the srcpad from where they get picked up by the base
class now and set on the outgoing buffers.
* gst-libs/gst/audio/gstbaseaudiosrc.c:
(gst_base_audio_src_create):
* sys/v4l/v4lsrc_calls.c: (gst_v4lsrc_buffer_new):
BaseSrc now sets the caps on outgoing buffers automatically.
Original commit message from CVS:
* gst-libs/gst/audio/gstbaseaudiosink.h:
Clarify some docs.
* gst-libs/gst/audio/gstbaseaudiosrc.c: (slave_method_get_type),
(gst_base_audio_src_class_init), (gst_base_audio_src_init),
(gst_base_audio_src_set_slave_method),
(gst_base_audio_src_get_slave_method),
(gst_base_audio_src_set_property),
(gst_base_audio_src_get_property), (gst_base_audio_src_create):
* gst-libs/gst/audio/gstbaseaudiosrc.h:
Add property and methods for selecting the clock slave method in the
source, like in the sink.
We only implement "none" and "re-timestamp" for now.
API: gst_base_audio_src_set_slave_method()
API: gst_base_audio_src_get_slave_method()
Original commit message from CVS:
* gst-libs/gst/audio/gstbaseaudiosink.c:
(gst_base_audio_sink_class_init):
* gst-libs/gst/audio/gstbaseaudiosrc.c:
(gst_base_audio_src_class_init):
* gst/playback/gstplayback.c: (plugin_init):
* gst/volume/gstvolume.c: (plugin_init):
Work around missing bits of thread-safety on older GLibs some
more to avoid assertions when starting up multiple playbin
objects concurrently (see #512382).
Original commit message from CVS:
* gst-libs/gst/audio/gstbaseaudiosrc.c:
(gst_base_audio_src_create):
Fix duration when no clock was provided. Fixes#520300.
Original commit message from CVS:
* gst-libs/gst/audio/gstbaseaudiosink.c:
(gst_base_audio_sink_class_init):
* gst-libs/gst/audio/gstbaseaudiosrc.c:
(gst_base_audio_src_class_init):
Ref audio clock class from a thread-safe context to make sure
we're not bit by GObjects lack of thread-safety here (#349410),
however unlikely that may be in practice.
Original commit message from CVS:
* gst-libs/gst/audio/gstbaseaudiosrc.c:
(gst_base_audio_src_create), (gst_base_audio_src_change_state):
Add debug info.
When going from PLAYING to PAUSED, pause the ringbuffer before calling
the parent state change function, just like the audiosink, because the
parent waits for the element to finish its processing before completing
the state change. This makes going to PAUSED a lot snappier.
When going from READY to PAUSED, don't allow the ringbuffer to start
yet.
Original commit message from CVS:
* docs/libs/gst-plugins-base-libs-sections.txt:
* gst-libs/gst/audio/gstbaseaudiosink.c: (slave_method_get_type),
(gst_base_audio_sink_set_provide_clock),
(gst_base_audio_sink_get_provide_clock),
(gst_base_audio_sink_set_slave_method),
(gst_base_audio_sink_get_slave_method),
(gst_base_audio_sink_set_property),
(gst_base_audio_sink_get_property), (gst_base_audio_sink_drain),
(gst_base_audio_sink_none_slaving),
(gst_base_audio_sink_handle_slaving):
* gst-libs/gst/audio/gstbaseaudiosink.h:
Expose methods for some object properties so that subclasses can more
easily configure them.
Added slave method none, that completely disables slaving to the
internal clock.
API: gst_base_audio_sink_set_provide_clock()
API: gst_base_audio_sink_get_provide_clock()
API: gst_base_audio_sink_set_slave_method()
API: gst_base_audio_sink_get_slave_method()
* gst-libs/gst/audio/gstbaseaudiosrc.c:
(gst_base_audio_src_set_provide_clock),
(gst_base_audio_src_get_provide_clock),
(gst_base_audio_src_set_property),
(gst_base_audio_src_get_property), (gst_base_audio_src_create):
* gst-libs/gst/audio/gstbaseaudiosrc.h:
Expose methods for some object properties so that subclasses can more
easily configure them.
API: gst_base_audio_src_set_provide_clock()
API: gst_base_audio_src_get_provide_clock()
Original commit message from CVS:
* gst-libs/gst/audio/gstbaseaudiosrc.c:
(gst_base_audio_src_create):
Also handle the case where there is no clock set on the audio source,
like in the unit tests.
Original commit message from CVS:
* gst-libs/gst/audio/gstbaseaudiosrc.c:
(gst_base_audio_src_class_init), (gst_base_audio_src_init),
(gst_base_audio_src_provide_clock),
(gst_base_audio_src_set_property),
(gst_base_audio_src_get_property), (gst_base_audio_src_create):
* gst-libs/gst/audio/gstbaseaudiosrc.h:
Allow othe clocks than the internal clock to be used for the pipeline.
Add property to disable clock provide.
API: GstBaseAudioSrc::provide-clock
Original commit message from CVS:
* ext/cdparanoia/gstcdparanoiasrc.c:
(gst_cd_paranoia_src_read_sector):
* gst-libs/gst/audio/gstbaseaudiosrc.c:
(gst_base_audio_src_create):
Small cleanups.
* ext/theora/theoradec.c: (theora_dec_sink_event):
Fix typo.
* gst-libs/gst/rtp/gstbasertpdepayload.c:
(gst_base_rtp_depayload_set_gst_timestamp):
Add some FIXME
* gst/playback/gstdecodebin.c: (queue_underrun_cb):
And some debug info when a FIXME path is hit.
Original commit message from CVS:
* gst-libs/gst/audio/gstbaseaudiosrc.c: (_do_init),
(gst_base_audio_src_create):
* po/POTFILES.in:
When posting a warning message because samples were dropped, post
something more intelligible than he default error message for clock
errors which is just confusing in this context (#432984).
Original commit message from CVS:
2007-01-12 Andy Wingo <wingo@pobox.com>
* gst-libs/gst/audio/gstbaseaudiosink.c
(gst_base_audio_sink_fixate): Implement, stolen from baseaudiosrc.
(gst_base_audio_sink_activate_pull): Remove the handwavey nego
stuff, as the base class handles this now. Actually tell the ring
buffer to start.
(gst_base_audio_sink_callback): Cast the ring buffer correctly.
How did this work before? Maybe I'm not as awesome a programmer as
I think.
* gst-libs/gst/audio/gstbaseaudiosrc.c
(gst_base_audio_src_fixate): Rework as a basesrc vmethod instead
of a pad function.
Original commit message from CVS:
* gst-libs/gst/audio/gstbaseaudiosink.c:
(gst_base_audio_sink_render):
Add some more info in a WARNING.
* gst-libs/gst/audio/gstbaseaudiosrc.c:
(gst_base_audio_src_create):
Handle PAUSE in create function, use new -core addition to
wait for playing. Fixes pausing and resuming capture from an
audiosrc.
* gst-libs/gst/audio/gstringbuffer.c: (gst_ring_buffer_commit),
(gst_ring_buffer_read):
Constify some more.
Caller supports interrupted reads now.
Original commit message from CVS:
* gst-libs/gst/audio/gstbaseaudiosink.c:
(gst_base_audio_sink_get_time), (gst_base_audio_sink_callback):
* gst-libs/gst/audio/gstbaseaudiosrc.c:
(gst_base_audio_src_get_time), (gst_base_audio_src_fixate),
(gst_base_audio_src_get_times), (gst_base_audio_src_get_offset),
(gst_base_audio_src_create), (gst_base_audio_src_change_state):
Do the delay calculation in the source/sink base classes as this is
specific for the capture/playback mode.
Try to fixate a bit better, like round depth up to a multiple of 8
bigger than width.
Handle underruns correctly by marking DISCONT on buffers and adjusting
timestamps to handle the gap.
Set offset/offset_end correctly on buffers.
* gst-libs/gst/audio/gstringbuffer.c: (gst_ring_buffer_pause),
(gst_ring_buffer_samples_done), (gst_ring_buffer_commit),
(gst_ring_buffer_read):
Remove resync and underrun recovery from the ringbuffer.
Fix ringbuffer read code on under/overrun.
Original commit message from CVS:
* gst-libs/gst/audio/gstbaseaudiosrc.c:
(gst_base_audio_src_set_clock),
(gst_base_audio_src_check_get_range), (gst_base_audio_src_create):
Don't try to post an error message when setting the clock fails
as this can happen when adding an element to a bin which will then
deadlock. Fixes#347296.
Original commit message from CVS:
* gst-libs/gst/audio/gstbaseaudiosink.c:
(gst_base_audio_sink_class_init),
(gst_base_audio_sink_provide_clock):
Use gobject_class instead of G_OBJECT_CLASS (klass)
* gst-libs/gst/audio/gstbaseaudiosrc.c:
(gst_base_audio_src_class_init), (gst_base_audio_src_init),
(gst_base_audio_src_set_clock), (gst_base_audio_src_provide_clock),
(gst_base_audio_src_get_time),
(gst_base_audio_src_check_get_range), (gst_base_audio_src_create),
(gst_base_audio_src_create_ringbuffer):
Fix latency and buffer-time constants and properties ala basesink.
Implement pull based scheduling. Fixes#346527.
Set default blocksize in GstBaseSrc to 0, we default to pushing out
one segment.
Refuse slaving to another clock instead of silently not working.
Only provide a clock when we are actually able to do so.
Various small cleanups and compiler hints.
Original commit message from CVS:
* gst-libs/gst/audio/gstbaseaudiosrc.c: (gst_base_audio_src_init),
(gst_base_audio_src_get_time), (gst_base_audio_src_create):
GstBaseAudioSrc must be live or it does not work.
* gst-libs/gst/audio/gstaudiosrc.c: (gst_audio_src_init):
Don't set live to TRUE as this is the default in the parentclass.
Original commit message from CVS:
* gst-libs/gst/audio/gstbaseaudiosrc.c:
(gst_base_audio_src_get_time), (gst_base_audio_src_create),
(gst_base_audio_src_change_state):
Fix audio sources, forgot to make the ringbuffer
startable...
Original commit message from CVS:
* gst-libs/gst/audio/gstbaseaudiosrc.c:
(gst_base_audio_src_get_time), (gst_base_audio_src_create),
(gst_base_audio_src_change_state):
unparent instead of unref the ringbuffer.
Original commit message from CVS:
* gst-libs/gst/audio/gstbaseaudiosink.c:
(gst_base_audio_sink_setcaps), (gst_base_audio_sink_event),
(gst_base_audio_sink_preroll), (gst_base_audio_sink_render):
Improve debugging.
Post error when caps cannot be parsed.
Resync on discontinuity in the stream.
Clip samples to segment boundaries.
return WRONG_STATE sooner when we are flushing.
* gst-libs/gst/audio/gstbaseaudiosrc.c: (gst_base_audio_src_init),
(gst_base_audio_src_get_time), (gst_base_audio_src_create):
Make audiosrc operate in TIME.
Set TIMESTAMP and DURATION on buffers.