This now keeps track of everything that is going on, creates
a tree of chains and groups to allow "demuxer after demuxer" scenarios
and allows chained Oggs with multiple streams (needs oggdemux or playbin2 fixes).
Also document everything in detail and give a general overview of what
decodebin2 is doing at the top of the sources.
Fixes bug #596183, #563828 and #591677.
Pad blocks should never be done on external pads as outside elements
might want to use their own pad blocks on them and this will lead to
conflicts and deadlocks.
When we are probing for streams, we want to set the queue size in such a way
that we can scan a maximum amount of data without consuming too much memory.
Therefore, remove the time limit on the queue and only stop scanning after 2MB
of data.
See #584104.
The 2s limit is way too small for a lot of files (which have an interleave
in time of between 3 and 5s). Instead, leave it to the initial 5s value
and reduce the other limits (allowing us to stay memory-efficient).
When we make a group connected to a demuxer, keep an extra dynamic refcount for
the group which is only decremented when no_more_pads or a multiqueue overrun is
detected. This way we avoid a race between exposing the group while more dynamic
refs are added from new pads.
Fixes#575588.
Disconnect the notify::caps signal in our callback (it'll be re-added
if we're not, in fact, finished getting complete caps). Ensures that
caps changes mid-stream (e.g. from an mp3 that changes from
stereo->mono mid-file) don't cause us to try to add a new pad.
Original commit message from CVS:
* gst/playback/gstdecodebin.c:
* gst/playback/gstdecodebin2.c:
Add basic docs to decodebin and link to decodebin from decodebin2.
Original commit message from CVS:
* gst/playback/gstdecodebin2.c:
If the top-level type of the stream is plain text, don't try to decode
it, matching behaviour of decodebin.
* gst/playback/gstplaysink.c:
If we fail to generate a text chain (e.g. due to missing optional
plugins), don't crash.
Original commit message from CVS:
* gst/playback/gstdecodebin2.c: (gst_decode_pad_activate):
Remove bogus assert, the decodepad could have been created inside an
already existing group.
Original commit message from CVS:
2008-10-08 Andy Wingo <wingo@pobox.com>
* gst/playback/gstdecodebin2.c (expose_pad): Fix typo: unset
target instead of setting it.
(gst_decode_pad_activate, gst_decode_pad_unblock): This is now the
API for a decode pad. The bugfix is that we set the group in
activate(), not when the pad was created because it might be NULL
then.
(gst_decode_group_control_source_pad, gst_decode_group_expose):
Update to use the API.
Original commit message from CVS:
2008-10-08 Andy Wingo <wingo@pobox.com>
* gst/playback/gstdecodebin2.c (struct _GstDecodePad): Change to
be a subclass of GstGhostPad.
(analyze_new_pad): So, when emitting the signals that determine
how we do autoplugging, already create the ghost pad and use it as
the pad in the signal arguments. This allows applications to make
a connection between the pad passed in e.g. autoplug-continue, and
the pad passed in new-decoded-pad.
(connect_pad, expose_pad): Update to receive the ghosted decode
pad in the args, retargetting it as necessary if we have to plug
the target pad through a multiqueue.
(gst_decode_group_control_source_pad): Adapt to receive an
already-ghosted pad that just needs activation, blocking, and
drain notification.
(sort_end_pads): Adapt for decode pads actually being pads.
(gst_decode_group_expose): Adapt for decode pads actually being
pads. Rewrite the decode pad names so they appear in order. Adds a
new error case if we couldn't set the name.
(gst_decode_group_free, gst_decode_group_hide): Adapt cleanup
logic.
(gst_decode_pad_set_blocked, gst_decode_pad_add_drained_check):
New API for the decode pad, needed because we shouldn't do these
things inside gst_decode_pad_new(), but after.
(gst_decode_pad_new): Change to actually make the real pad, and
delay the blocking/drainage bits.
Original commit message from CVS:
* gst/playback/gstdecodebin2.c:
Ensure decodebin2 emits 'drained' signal once, and only once, when all
pads are drained.
Original commit message from CVS:
* gst/playback/gstdecodebin2.c:
(gst_decode_group_control_source_pad), (gst_decode_group_expose):
Check for NULL cases and log them, creating ghostpads can, for example,
fail when the pad returns wrong caps.
* gst/playback/gstplaybin2.c: (perform_eos):
When pushing out the EOS event, collect the return value and warn when
something failed.
Original commit message from CVS:
* gst/playback/gstdecodebin.c: (gst_decode_bin_class_init):
* gst/playback/gstdecodebin2.c: (gst_decode_bin_class_init):
* gst/playback/gstplay-marshal.list:
* gst/playback/gsturidecodebin.c: (gst_uri_decode_bin_class_init):
Use correct marshallers. GstCaps are a boxed type and no GObject
subclass.
Original commit message from CVS:
* gst/playback/gstdecodebin2.c: (connect_pad):
When autoplugging fails, set the element back to NULL before
unreffing it.
Original commit message from CVS:
* gst/playback/gstdecodebin2.c: (gst_decode_bin_class_init),
(gst_decode_bin_init), (gst_decode_bin_dispose),
(gst_decode_bin_set_sink_caps), (gst_decode_bin_get_sink_caps),
(gst_decode_bin_set_property), (gst_decode_bin_get_property),
(analyze_new_pad), (connect_pad), (expose_pad),
(gst_decode_group_new), (gst_decode_group_control_demuxer_pad),
(gst_decode_group_expose), (gst_decode_group_free),
(do_async_start), (do_async_done), (gst_decode_bin_change_state):
Remove fakesink hack, we can now implement this more elegantly.
Added property to bypass typefinding.
Removed underrun callback and demuxer pad probe, we now use the srcpad
probe to expose groups.
API::sink-caps property
* gst/playback/gstplaybin2.c: (no_more_pads_cb):
Guard against multiple emissions of the no_more_pads signal, which
happens when we are dealing with chained oggs.
* gst/playback/gsturidecodebin.c: (remove_decoders),
(make_decoder), (type_found), (setup_streaming), (source_new_pad),
(setup_source):
For streams, use our own typefind element and plug our queue after it.
We will need this to determine the type of buffering to use for the
queue soon.
Original commit message from CVS:
* gst/playback/gstdecodebin2.c: (gst_decode_bin_dispose),
(gst_decode_bin_set_caps), (gst_decode_bin_get_caps),
(gst_decode_bin_set_subs_encoding),
(gst_decode_bin_get_subs_encoding),
(gst_decode_bin_autoplug_factories), (connect_pad), (are_raw_caps),
(deactivate_free_recursive):
Protect caps property with the object lock.
Protect encoding property with the object lock.
Keep list of elements we added that have the subtitle-encoding property.
Distribute the subtitle-encoding to all of the elements when it
changes.
Original commit message from CVS:
* gst/playback/gstdecodebin2.c: (analyze_new_pad), (connect_pad):
Expose the right pad in the right place with the right element.
Original commit message from CVS:
* gst/playback/Makefile.am:
Group decodebin2 and uridecodebin into the same plugin so that they
can share the GEnumType.
* gst/playback/gstdecodebin2.c: (_gst_array_accumulator),
(_gst_select_accumulator), (gst_decode_bin_class_init),
(gst_decode_bin_init), (gst_decode_bin_autoplug_sort),
(gst_decode_bin_autoplug_select), (gst_decode_bin_autoplug_add),
(analyze_new_pad), (connect_pad), (gst_decode_bin_plugin_init):
Add signal to sort factories instead of the more awkward autoplug-select
signal.
Modify autoplug_select so that we can try, skip or expose the
autopluggin of an element on a pad.
* gst/playback/gstfactorylists.c: (compare_ranks),
(decoders_filter), (sinks_filter), (gst_factory_list_is_type),
(element_filter), (gst_factory_list_get_elements),
(gst_factory_list_debug), (gst_factory_list_filter):
* gst/playback/gstfactorylists.h:
Simplify the API, allow getting elements based on mask.
* gst/playback/gstplay-marshal.list:
Add some more marshallers.
* gst/playback/gstplaybin2.c: (init_group), (gst_play_bin_init),
(gst_play_bin_finalize), (pad_removed_cb), (autoplug_factories_cb),
(autoplug_select_cb), (activate_group):
Add support for managing non-raw sinks by providing a custom element and
sink list to decodebin2.
Try to plug non-raw sinks when decodebin2 using autoplug-select of
decodebin2.
* gst/playback/gstplaysink.c: (gen_video_chain), (gen_audio_chain),
(gst_play_sink_set_mode), (gst_play_sink_request_pad):
* gst/playback/gstplaysink.h:
Add support for raw and non-raw sinks.
Add support to force sinks selected by playbin2.
Don't plug raw converters for non-raw sinks.
* gst/playback/gsturidecodebin.c: (_gst_array_accumulator),
(_gst_select_accumulator), (gst_uri_decode_bin_class_init),
(proxy_autoplug_select_signal), (gst_uri_decode_bin_plugin_init),
(plugin_init):
Use right accumulators.
Proxy new signal.
Original commit message from CVS:
* gst/playback/gstdecodebin2.c: (gst_decode_bin_class_init),
(gst_decode_group_check_if_drained), (source_pad_event_probe),
(remove_fakesink):
Add drained signal fired when decodebin finishes decoding the data.
Remove deprecated STATE_DIRTY message.
* gst/playback/gsturidecodebin.c: (gst_uri_decode_bin_class_init),
(unknown_type_cb), (new_decoded_pad_cb), (pad_removed_cb),
(analyse_source), (proxy_drained_signal), (make_decoder),
(source_new_pad), (value_list_append_structure_list),
(handle_redirect_message), (handle_message):
Proxy the new drained signal.
Handle pad removed from decodebin.
Handle redirect messages by sorting multiple redirections based on the
connection speed.
Original commit message from CVS:
* docs/design/design-decodebin.txt:
* gst/playback/gstdecodebin2.c: (analyze_new_pad):
Update some more docs and comments.
Original commit message from CVS:
* gst/playback/gstdecodebin.c: (close_pad_link), (type_found):
* gst/playback/gstdecodebin2.c: (analyze_new_pad):
Post nice/more useful error message if we don't have a decoder for
the primary type.
Original commit message from CVS:
* gst/playback/gstdecodebin2.c: (gst_decode_group_expose):
Be a bit more useful, unblock the pads after we fired the no-more-pads
signal so that we can use the signal to inspect and connect all pads
without having to keep extra state outside of decodebin.
Original commit message from CVS:
* gst/playback/gstdecodebin2.c: (gst_decode_bin_class_init),
(gst_decode_bin_dispose), (gst_decode_bin_set_caps),
(gst_decode_bin_set_subs_encoding),
(gst_decode_bin_get_subs_encoding), (gst_decode_bin_set_property),
(gst_decode_bin_get_property), (analyze_new_pad):
Move subtitle encoding property to decodebin2 so that it can set the
property value on all elements that it autoplugs and that require it.
Make caps refcounting more consistent in get/set.
* gst/playback/gsturidecodebin.c: (_gst_boolean_accumulator),
(gst_uri_decode_bin_class_init), (gst_uri_decode_bin_init),
(gst_uri_decode_bin_finalize), (gst_uri_decode_bin_set_property),
(gst_uri_decode_bin_get_property), (proxy_unknown_type_signal),
(proxy_autoplug_continue_signal),
(proxy_autoplug_factories_signal), (proxy_autoplug_select_signal),
(make_decoder):
Proxy properties and relevant signals from the internal decodebin.
Make properties MT safe.
Original commit message from CVS:
Inspired by patch of: René Stadler <mail at renestadler dot de>
* gst/playback/gstdecodebin2.c: (gst_decode_bin_class_init),
(gst_decode_bin_autoplug_continue),
(gst_decode_bin_autoplug_factories),
(gst_decode_bin_autoplug_select), (analyze_new_pad), (connect_pad),
(find_compatibles):
* gst/playback/gstplay-marshal.list:
Remove the autoplug-sort signal and replace it with a binding friendly
autoplug-select signal.
Add an autoplug-factories signal that can be used to generate a list of
factories to try to autoplug.
Add the GstPad to the autoplugging signal args as it might be needed to
make a good factory selection.
Fix up the marshallers for this. Fixes#407282.
Original commit message from CVS:
* gst/playback/gstdecodebin.c: (new_pad), (type_found):
Make the window for a race in typefind and shutting down smaller until
we figure out the right locking here. Avoids #485753 usually.
* gst/playback/gstdecodebin2.c: (type_found), (pad_added_group_cb):
Remove unneeded lock causing a race in typefind and shutting down.
Fixes#485753.
* gst/playback/gstplaybin.c: (gst_play_bin_change_state):
Also remove sinks when going to NULL because we might not complete the
state change to PAUSED, causing the PAUSED->READY state change not to
happen.
Original commit message from CVS:
* gst/playback/gstdecodebin.c: (type_found),
(gst_decode_bin_change_state):
* gst/playback/gstdecodebin2.c: (type_found),
(gst_decode_bin_change_state):
Don't disconnect the have_type signal because we never reconnect it
later on. Instead keep a variable to see if we already detected a type.
Original commit message from CVS:
* gst/playback/gstdecodebin.c: (add_fakesink), (type_found):
* gst/playback/gstdecodebin2.c: (gst_decode_bin_init),
(type_found):
Unlink the signal handler when we found the type, we're not going to do
anything sensible with more type_found signals anyway.
Original commit message from CVS:
* gst/playback/gstdecodebin2.c: (gst_decode_group_new),
(gst_decode_group_expose), (gst_decode_group_free), (add_fakesink):
When creating the groups, allow for a 5 second, unlimited buffers
preroll phase after which we expose the group.
When the group is exposed, use a small number of buffers up to a 2
second limit. Also disconnect the overrun signal from multiqueue when we
exposed the group because it is not needed anymore.
Original commit message from CVS:
* gst/playback/gstdecodebin2.c: (analyze_new_pad):
When handling a delayed-caps notification case, mark
the group as dynamic so that the nbdynamic count is
incremented and decremented correctly. Fixes: #449156
Patch by: Wim Taymans <wim@fluendo.com>
Original commit message from CVS:
* gst/playback/gstdecodebin2.c: (gst_decode_bin_factory_filter),
(analyze_new_pad), (connect_pad), (expose_pad), (caps_notify_cb),
(caps_notify_group_cb), (gst_decode_group_new),
(gst_decode_group_free):
Add support for delayed caps fixation when autoplugging.
Optimize cases where a multiqueue is not needed/wanted, like right after
anything that is not a demuxer.
Original commit message from CVS:
* gst/playback/gstdecodebin2.c: (gst_decode_bin_factory_filter):
Make decodebin2 autoplug depayloaders too.
* gst/playback/gsturidecodebin.c: (source_new_pad):
Set the newly created decoder in a usable state when autoplugging a
dynamic source such as RTSP.
Original commit message from CVS:
* gst/playback/gstdecodebin.c: (type_found), (plugin_init):
* gst/playback/gstdecodebin2.c: (plugin_init):
Better error message for text files.
Original commit message from CVS:
Patch by: Tommi Myöhänen <ext-tommi dot myohanen at nokia dot com>
* gst/playback/gstdecodebin2.c: (connect_pad), (expose_pad),
(deactivate_free_recursive):
Decodebin2 doesn't unref pads it obtains in some occasions:
- multiqueue src pads, when either connecting further or exposing
- sink pads of new autoplugged elements
- peer pads when recursively freeing elements
Fixes#425455.
Original commit message from CVS:
* docs/plugins/Makefile.am:
* docs/plugins/gst-plugins-base-plugins-docs.sgml:
* docs/plugins/gst-plugins-base-plugins-sections.txt:
* docs/plugins/inspect/plugin-decodebin2.xml:
* gst/playback/gstdecodebin2.c: (gst_decode_bin_class_init):
Add documentation for decodebin2 that indicates that the API
is still unstable.
Original commit message from CVS:
* gst/playback/gstdecodebin2.c: (gst_decode_bin_dispose),
(multi_queue_underrun_cb), (gst_decode_group_check_if_drained),
(sort_end_pads), (gst_decode_group_expose),
(gst_decode_group_hide):
Don't free groups from the streaming threads. Just put them aside and
free them in dispose.
Original commit message from CVS:
* gst/playback/gstdecodebin2.c: (connect_element),
(pad_added_group_cb), (gst_decode_group_check_if_blocked),
(sort_end_pads), (gst_decode_group_expose):
Handle dynamic pads within groups.
Sort pads before exposing them in order to make playbin happy.
There still is a race with the multiqueue filling up. This should be
solved separately.
Fixes#398721
Original commit message from CVS:
* gst/playback/gstdecodebin.c: (add_fakesink),
(gst_decode_bin_change_state):
* gst/playback/gstdecodebin2.c: (add_fakesink),
(gst_decode_bin_change_state):
Don't error out if there is no fakesink in the READY to NULL state
change, since when decodebin is re-used, we're only adding the
fakesink element in READY to PAUSED.
* tests/check/elements/decodebin.c:
(new_decoded_pad_plug_fakesink_cb), (GST_START_TEST),
(decodebin_suite):
Minimal unit test to make sure we can use the same decodebin
instance twice (at least with audiotestsrc input).
Original commit message from CVS:
* gst/playback/gstdecodebin2.c: (gst_decode_bin_dispose):
Cast lock macro parameters to make sure we're actually accessing the
lock member at the right class level. Free list itself in _dispose()
as well and NULL it in case dispose gets called multiple times.
Original commit message from CVS:
* gst/playback/gstdecodebin2.c:
(gst_decode_bin_dispose),(gst_decode_bin_finalize):
Free GstDecodeGroups no longer used.
(gst_decode_group_expose):
Don't unlock too many times !
(deactivate_free_recursive):
Free iterator once we're done with it.
Fix for recursively deactivating elements (stop at ghostpads).
Original commit message from CVS:
* gst/playback/gstdecodebin2.c: (gst_decode_bin_finalize),
(gst_decode_group_new), (gst_decode_group_free):
Set queues to bigger sizes to cope with HD contents.
Fix some mutex freeing and add comment about MT safe methods.
Original commit message from CVS:
* gst/playback/gstdecodebin2.c: (gst_decode_bin_finalize):
Don't leak mutex.
* tests/check/elements/playbin.c:
(test_sink_usage_video_only_stream),
(test_suburi_error_unknowntype), (test_suburi_error_invalidfile),
(test_suburi_error_wrongproto), (test_missing_urisource_handler),
(test_missing_suburisource_handler),
(test_missing_primary_decoder), (playbin_suite):
Run all tests once with decodebin and once with decodebin2.
One test does not pass yet with decodebin2.
Original commit message from CVS:
* gst/playback/gstdecodebin2.c: (gst_decode_group_new),
(get_current_group), (group_demuxer_event_probe),
(gst_decode_group_expose), (deactivate_free_recursive),
(gst_decode_group_free):
Cleanups.
Don't forget to emit 'no-more-pads' once a group is exposed.
Cleanup elements from a DecodeGroup once we remove it.
Protect call to gst_decode_group_expose() with the decodebin lock.
Original commit message from CVS:
* gst/playback/Makefile.am:
* gst/playback/gstdecodebin.c: (close_pad_link):
* gst/playback/gstdecodebin2.c: (analyze_new_pad):
* gst/playback/gstplaybasebin.c: (gst_play_base_bin_class_init),
(gst_play_base_bin_handle_message_func), (unknown_type):
Let decodebin be the element to post missing-plugin messages for
missing decoders (rather than playbin); make playbin implement
GstBin::handle_message so we can suppress missing-plugin messages
for types we're not handling on purpose (don't want to bring up an
installer in those cases).
Original commit message from CVS:
* ext/ogg/gstoggdemux.c: (gst_ogg_pad_stream_out):
* ext/vorbis/vorbisdec.c: (vorbis_handle_data_packet):
* gst/playback/gstdecodebin2.c:
(gst_decode_group_check_if_blocked):
Printf format and missing argument fixes.
Original commit message from CVS:
* gst/playback/gstdecodebin.c: (gst_decode_bin_change_state):
* gst/playback/gstdecodebin2.c: (gst_decode_bin_change_state):
Refuse to change state to READY when we failed to create any of the
required elements in our instance init function.