When seeking in a local flac file (ie. operating pull-based), the decoder
would often just error out after the loop function sees a DECODER_ABORTED
status. This, however, is the read callback's way of telling our loop
function that pull_range failed and streaming should stop, in this case
because of the flush-start event that the seek handler pushed upstream
from the seeking thread. Handle this slightly better by storing the last
flow return from pull_range, so the loop function can evaluate it properly
when it encounters a DECODER_ABORTED and take the right action.
Fixes#578612.
Remove some disabled code in encoder. Try #if 0'ed code and add comments about
why it is disabled. Move idct-method enum to jpeg.c and use in both encoder and
decoder. Add idct-method property to encoder.
We can't wait for the ENTER/LEAVE messages to be be posted because the base
class sometimes calls the start method with the object lock, which would block
the message posting.
Instead, just assume that the message will be posted soon and continue. We'll
have to fix this in the base class.
Previously seekability way always assumed until the first seek actually
failed. Now we assume that all servers are not seekable unless they provide
a Content-Length header. If a seek fails after that we continue to
assume no seekability. Fixes bug #585576.
Emit stream-status messages for the pulse thread.
Don't use our own GCond for signaling but simply use the pulse mainloop
mechanisms for synchronisation.
See #587695
Upper volume limmit was 1000. That appear unneceasrily high. It would also cause
sever distortion if accidentialy used. Now its 10 (~ +15db) which is also in
sync with volume and playbin2.
Since we map the ringbuffer to the pulseaudio internal ringbuffer, flush the
pulseaudio buffer when we are asked to clear the ringbuffer.
This avoids some leftover audio after a seek.
Query the audio format, esp. dvdemux->num_channels, before we use that
variable to allocate the initial buffer. That way we don't accidentally
push a zero-sized buffer as first audio buffer.
Hack around thread-safety issues in GObject and our racy _get_type()
functions (we could easily fix the _get_type() functions, but we still
need to hack around the GObject class races until we require a newer
GLib version, I think).
Some have been replaced by newer ones, others are demoing elements that
don't exist any longer (not in -good anyway), and others have not been
touched in many years and it seem pointless to keep them around.
Removing these files makes sure we don't have any code in our repository
that uses Gtk+ symbols which are to be removed for GNOME3, and as such
will make some script that greps for this kind of stuff give us a clean
bill of code health. Fixes#585757.
A malformed (or simply huge) PNG file can lead to integer overflow in
calculating the size of the output buffer, leading to crashes or buffer
overflows later. Fixes SA35205 security advisory.
Let's be paranoid and make sure we never pass a number that takes up
more than 36 bits to _set_total_samples_estimate(), since libFLAC
expects all the other bits to be zero, and if this is not the case
neighbouring fields in the global stream info header may get messed
up inadvertently, so that flac -d refuses to decode the stream.
See #584455.
When "Content-Type" header is "audio/L16", we need to set the caps on the
outgoing buffers so that downstream elements can have means to detect the
stream type and handle it appropriately. Tested with HTTP stream provided
by pulse-audio's http module (git master).
It was previously sending the bogus buffer which was returned from
the bufferalloc (required for reverse negotiation apparently) instead
of the pending buffer.
This allows to set the Referer header among other things by
adding a "extra-headers" property that takes a GstStructure
with field=string pairs.
Fixes bug #581806.
Store the offset and caps when allocating a buffer during seeking, and then
allocate a new buffer with buffer_alloc before we push it out. This ensures
that in all respects the first buffer decoded during seeking behaves like
all other buffers, including allowing downstream re-negotiation.
The libjpeg api says that we need to set the colorspace before we call
_set_defaults(). Indeed, if we don't do that we end up with some very freaky
non-standard quant table and huffman table indexes.
Don't pass a 0 divisor to gst_util_uint64_scale(), or it will complain
in the single image case where fps=0/1 (are we supposed to differentiate
between no fps=still image and fps=0/1=variable rate here btw?)
First we ignore request to fill the ringbuffer which are less then a segment.
The small request where causing stutter.
Then we disable flushing the stream when running against pa 0.9.12 as this
triggers an assertiong in the sound server and terminates it. It does not happen
with 0.9.10 and 0.9.14.
We can use prebuf = 0 to instruct pulse to not pause the stream on underflows.
This way we can remove the underflow callback. We however have to manually
uncork the stream now when we have no available space in the buffer or when we
are writing too far away from the current read_index.
when we switch streams, the clock will reset to 0. Make sure that the provided
clock doesn't get stuck when this happens by keeping an initial offset. We also
need to make sure that we subtract this offset in samples when writing to the
ringbuffer.
If the caps changes, the sink is reset without transitioning through
a PAUSED->PLAYING state change, resulting in a corked stream. This avoids
the problem by checking that the stream is uncorked when writing samples
to it.
When trying to write out a segment, wait until there is enough free space
for the entire segment. This helps to reduce ripple in the clock reporting,
where the app might query the playback position while only half a segment
has been written (and is therefore reported by _delay(), even though
the ring buffer has not yet been advanced)
In the event handler, gst_flac_dec_sink_event(), two functions are called on
the FLAC stream without checking if it has been initialized:
FLAC__stream_decoder_flush()
FLAC__stream_decoder_process_until_end_of_stream()
Both these FLAC__*() functions modify the internal state of the FLAC stream.
Later, when the buffers start flowing, gst_flac_dec_chain() tries to initialize
the stream. the FLAC__stream_decoder_init_stream() call will fail because the
previous calls to FLAC__*() changed the stream state so it is no longer in the
initialized state.
The flacdec API calls the write callback when performing a seek. We cannot yet
push out a buffer at that time so we must keep it and push it out later.
Flush out the upstream part of the pipeline when doing a seek.
Fixes#574275.
g_atomic_int_(get|set) only work on ints and the flags are
an enum (which on most architectures is stored as an int).
Also the way the flags were accessed atomically would still
leave a possible race condition and we don't do it in any
other mixer track implementation, let alone at any other
place where an integer could be changed from different
threads. Removing the g_atomic_int_(get|set) will only
introduce a new race condition on architectures where
integers could be half-written while reading them
which shouldn't be the case for any modern architecture
and if we really care about this we need to use
g_atomic_int_(get|set) at many other places too.
Apart from that g_atomic_int_(set|get) will result in
aliasing warnings if their argument is explicitely
casted to an int *. Fixes bug #571153.
rather than PA thread.
pa_threaded_mainloop_lock() (a.o.) and by extension get_property should
not be done from a PA thread, but the latter may occur as a result of a
property change notification. Fixes#571204 (though current situation
not ideal, e.g. post message rather than signal).
newer pulseaudio.
Fixes: #567794
* Hook pulsesink's volume property up with the stream volume -- not the
sink volume in PA.
* Read the device description directly from the sink instead of going
via the mixer.
* Properly implement _reset() methods for both sink and source to avoid
deadlocks when shutting down a pipeline.
* Replace all simple pa_threaded_mainloop_wait() by proper loops to
guarantee that we wait for the right event in case multiple events are
fired. While this is not strictly necessary in many cases it
certainly is more correct and makes me sleep better at night.
* Replace CHECK_DEAD_GOTO macros with proper functions
* Extend the number of supported channels to 32 since that is the actual
limit in PA.
* Get rid of _dispose() methods since we don't need them.
* Increase the volume property upper limit of the sink to 1000.
* Reset function pointers after we disconnect a stream/context. Better
fix for bug 556986.
* Reset the state of the element properly if open/prepare fails
* Cork the PA stream when the pipeline is paused. This allows the PA
* daemon to
close audio device on pause and thus save a bit of power.
* Set PA stream properties based on GST tags such as GST_TAG_TITLE,
GST_TAG_ARTIST, and so on.
Signed-off-by: Lennart Poettering <lennart@poettering.net>
Link to properties. Correct titles for examples. Document a few trivial cases. Keep lists in section file and docs/plugins/Makefile.am alphabetically ordered. Fix warnings that gtk-doc points out.
If libsoup-gnome is found use this as it will give us
the GNOME proxy configuration. Otherwise use normal
libsoup.
The GNOME proxy configuration will only be used if
the proxy properties are not set on souphttpsrc
and if the http_proxy environment variable is not
set.
Fixes bug #552140.
Original commit message from CVS:
Patch by: Lennart Poettering <lennart at poettering dot net>
* ext/pulse/pulseprobe.c: (gst_pulseprobe_new),
(gst_pulseprobe_free):
Fix refcount loop, resulting in a thread leak. Fixes bug #567746.
Original commit message from CVS:
* ext/pulse/pulsesink.c:
* ext/pulse/pulsesink.h:
Use a mutex to protect the current stream pointer, and ignore
callbacks for stream objects that have been destroyed already.
Fixes problems with unprepare/prepare cycles caused by the input
caps changing, without reintroducing bug #556986.
Original commit message from CVS:
* ext/pulse/pulsesink.c: (gst_pulsesink_destroy_stream):
Don't wait for the pulse mainloop when destroying the stream.
Fixes a deadlock when the pulsedaemon goes away while pulsesink
is PLAYING. Fixes bug #556986.
Original commit message from CVS:
* ext/jpeg/gstsmokeenc.c: (gst_smokeenc_init),
(gst_smokeenc_getcaps), (gst_smokeenc_setcaps),
(gst_smokeenc_chain), (gst_smokeenc_change_state):
* ext/jpeg/gstsmokeenc.h:
Implement getcaps function.
Set caps on the pad and on all outgoing buffers.
Fixes#565441.
Original commit message from CVS:
* ext/pulse/pulsemixerctrl.c:
And remove temporary comment pointing to the bug ticket.
* gst/avi/gstavimux.c:
Move reoccuring logging to LOG and log instance too.
Original commit message from CVS:
* ext/dv/gstdvdemux.c: (gst_dvdemux_handle_src_event):
Restore previous behaviour of not passing QoS and navigation
events upstream, which presumably wasn't meant to be changed.
Original commit message from CVS:
* ext/dv/gstdvdemux.c: (gst_dvdemux_add_video_pad),
(gst_dvdemux_add_audio_pad), (gst_dvdemux_remove_pads),
(gst_dvdemux_demux_audio), (gst_dvdemux_demux_video),
(gst_dvdemux_chain), (gst_dvdemux_loop),
(gst_dvdemux_change_state):
Add srcpads only when needed and remove them again when going
back to READY. This prevents stalled pipelines if there's no
audio inside the DV stream, which happens for many MXF files.
Original commit message from CVS:
* ext/dv/gstdvdemux.c: (gst_dvdemux_handle_src_event):
Forward all events upstream unless it's something we really
don't handle. This fixes latency configuration of pipelines.
Original commit message from CVS:
* ext/dv/gstdv.c: (plugin_init):
* ext/dv/gstdvdec.c: (gst_dvdec_class_init):
* ext/dv/gstdvdemux.c: (gst_dvdemux_class_init):
Really call dv_init() exactly one time, not one time for
the demuxer and one time for the decoder.