mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 04:01:08 +00:00
gst/playback/gstdecodebin2.c: When creating the groups, allow for a 5 second, unlimited buffers preroll phase after w...
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.
This commit is contained in:
parent
28ef3f5ddf
commit
c198d8000c
2 changed files with 39 additions and 3 deletions
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,13 @@
|
||||||
|
2007-06-28 Wim Taymans <wim@fluendo.com>
|
||||||
|
|
||||||
|
* 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.
|
||||||
|
|
||||||
2007-06-27 Tim-Philipp Müller <tim at centricular dot net>
|
2007-06-27 Tim-Philipp Müller <tim at centricular dot net>
|
||||||
|
|
||||||
* gst-libs/gst/tag/tags.c: (gst_tag_freeform_string_to_utf8):
|
* gst-libs/gst/tag/tags.c: (gst_tag_freeform_string_to_utf8):
|
||||||
|
|
|
@ -1457,11 +1457,18 @@ gst_decode_group_new (GstDecodeBin * dbin, gboolean use_queue)
|
||||||
group->endpads = NULL;
|
group->endpads = NULL;
|
||||||
|
|
||||||
if (mq) {
|
if (mq) {
|
||||||
|
/* we first configure the mulitqueue to buffer an unlimited number of
|
||||||
|
* buffers up to 5 seconds or, when no timestamps are present, up to 2 MB of
|
||||||
|
* memory. When this queue overruns, we assume the group is complete and can
|
||||||
|
* be exposed. */
|
||||||
g_object_set (G_OBJECT (mq),
|
g_object_set (G_OBJECT (mq),
|
||||||
"max-size-bytes", 2 * 1024 * 1024,
|
"max-size-bytes", 2 * 1024 * 1024,
|
||||||
"max-size-time", 5 * GST_SECOND, "max-size-buffers", 0, NULL);
|
"max-size-time", 5 * GST_SECOND, "max-size-buffers", 0, NULL);
|
||||||
|
/* will expose the group */
|
||||||
group->overrunsig = g_signal_connect (G_OBJECT (mq), "overrun",
|
group->overrunsig = g_signal_connect (G_OBJECT (mq), "overrun",
|
||||||
G_CALLBACK (multi_queue_overrun_cb), group);
|
G_CALLBACK (multi_queue_overrun_cb), group);
|
||||||
|
/* will hide the group again, this is usually called when the multiqueue is
|
||||||
|
* drained because of EOS. */
|
||||||
group->underrunsig = g_signal_connect (G_OBJECT (mq), "underrun",
|
group->underrunsig = g_signal_connect (G_OBJECT (mq), "underrun",
|
||||||
G_CALLBACK (multi_queue_underrun_cb), group);
|
G_CALLBACK (multi_queue_underrun_cb), group);
|
||||||
|
|
||||||
|
@ -1740,7 +1747,6 @@ sort_end_pads (GstDecodePad * da, GstDecodePad * db)
|
||||||
*
|
*
|
||||||
* Not MT safe, please take the group lock
|
* Not MT safe, please take the group lock
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_decode_group_expose (GstDecodeGroup * group)
|
gst_decode_group_expose (GstDecodeGroup * group)
|
||||||
{
|
{
|
||||||
|
@ -1771,6 +1777,21 @@ gst_decode_group_expose (GstDecodeGroup * group)
|
||||||
|
|
||||||
GST_LOG ("Exposing group %p", group);
|
GST_LOG ("Exposing group %p", group);
|
||||||
|
|
||||||
|
if (group->multiqueue) {
|
||||||
|
/* update runtime limits. At runtime, we try to keep the amount of buffers
|
||||||
|
* in the queues as low as possible (but at least 5 buffers). */
|
||||||
|
g_object_set (G_OBJECT (group->multiqueue),
|
||||||
|
"max-size-bytes", 2 * 1024 * 1024,
|
||||||
|
"max-size-time", 2 * GST_SECOND, "max-size-buffers", 5, NULL);
|
||||||
|
/* we can now disconnect any overrun signal, which is used to expose the
|
||||||
|
* group. */
|
||||||
|
if (group->overrunsig) {
|
||||||
|
GST_LOG ("Disconnecting overrun");
|
||||||
|
g_signal_handler_disconnect (group->multiqueue, group->overrunsig);
|
||||||
|
group->overrunsig = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* re-order pads : video, then audio, then others */
|
/* re-order pads : video, then audio, then others */
|
||||||
group->endpads = g_list_sort (group->endpads, (GCompareFunc) sort_end_pads);
|
group->endpads = g_list_sort (group->endpads, (GCompareFunc) sort_end_pads);
|
||||||
|
|
||||||
|
@ -1938,8 +1959,10 @@ gst_decode_group_free (GstDecodeGroup * group)
|
||||||
|
|
||||||
/* disconnect signal handlers on multiqueue */
|
/* disconnect signal handlers on multiqueue */
|
||||||
if (group->multiqueue) {
|
if (group->multiqueue) {
|
||||||
g_signal_handler_disconnect (group->multiqueue, group->underrunsig);
|
if (group->underrunsig)
|
||||||
g_signal_handler_disconnect (group->multiqueue, group->overrunsig);
|
g_signal_handler_disconnect (group->multiqueue, group->underrunsig);
|
||||||
|
if (group->overrunsig)
|
||||||
|
g_signal_handler_disconnect (group->multiqueue, group->overrunsig);
|
||||||
deactivate_free_recursive (group, group->multiqueue);
|
deactivate_free_recursive (group, group->multiqueue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2065,6 +2088,9 @@ add_fakesink (GstDecodeBin * decode_bin)
|
||||||
if (!decode_bin->fakesink)
|
if (!decode_bin->fakesink)
|
||||||
goto no_fakesink;
|
goto no_fakesink;
|
||||||
|
|
||||||
|
/* enable sync so that we force ASYNC preroll */
|
||||||
|
g_object_set (G_OBJECT (decode_bin->fakesink), "sync", TRUE, NULL);
|
||||||
|
|
||||||
/* hacky, remove sink flag, we don't want our decodebin to become a sink
|
/* hacky, remove sink flag, we don't want our decodebin to become a sink
|
||||||
* just because we add a fakesink element to make us ASYNC */
|
* just because we add a fakesink element to make us ASYNC */
|
||||||
GST_OBJECT_FLAG_UNSET (decode_bin->fakesink, GST_ELEMENT_IS_SINK);
|
GST_OBJECT_FLAG_UNSET (decode_bin->fakesink, GST_ELEMENT_IS_SINK);
|
||||||
|
|
Loading…
Reference in a new issue