flvdemux: Use GstFlowCombiner

Use the flow combiner to have the standard combination results and avoid
repeating the same code

https://bugzilla.gnome.org/show_bug.cgi?id=709224
This commit is contained in:
Thiago Santos 2014-05-26 19:19:45 -03:00
parent c7c25071e3
commit 3b887887be
2 changed files with 40 additions and 63 deletions

View file

@ -1031,6 +1031,7 @@ gst_flv_demux_parse_tag_audio (GstFlvDemux * demux, GstBuffer * buffer)
/* We need to set caps before adding */ /* We need to set caps before adding */
gst_element_add_pad (GST_ELEMENT (demux), gst_element_add_pad (GST_ELEMENT (demux),
gst_object_ref (demux->audio_pad)); gst_object_ref (demux->audio_pad));
gst_flow_combiner_add_pad (demux->flowcombiner, demux->audio_pad);
/* We only emit no more pads when we have audio and video. Indeed we can /* We only emit no more pads when we have audio and video. Indeed we can
* not trust the FLV header to tell us if there will be only audio or * not trust the FLV header to tell us if there will be only audio or
@ -1170,27 +1171,20 @@ gst_flv_demux_parse_tag_audio (GstFlvDemux * demux, GstBuffer * buffer)
/* Push downstream */ /* Push downstream */
ret = gst_pad_push (demux->audio_pad, outbuf); ret = gst_pad_push (demux->audio_pad, outbuf);
if (G_UNLIKELY (ret != GST_FLOW_OK)) {
if (demux->segment.rate < 0.0 && ret == GST_FLOW_EOS && if (G_UNLIKELY (ret != GST_FLOW_OK) &&
demux->segment.position > demux->segment.stop) { demux->segment.rate < 0.0 && ret == GST_FLOW_EOS &&
/* In reverse playback we can get a GST_FLOW_EOS when demux->segment.position > demux->segment.stop) {
* we are at the end of the segment, so we just need to jump /* In reverse playback we can get a GST_FLOW_EOS when
* back to the previous section. */ * we are at the end of the segment, so we just need to jump
GST_DEBUG_OBJECT (demux, "downstream has reached end of segment"); * back to the previous section. */
demux->audio_done = TRUE; GST_DEBUG_OBJECT (demux, "downstream has reached end of segment");
ret = GST_FLOW_OK; demux->audio_done = TRUE;
} else { ret = GST_FLOW_OK;
if (ret == GST_FLOW_NOT_LINKED) { goto beach;
demux->audio_linked = FALSE;
} else
GST_WARNING_OBJECT (demux, "failed pushing a %" G_GUINT64_FORMAT
" bytes audio buffer: %s", demux->tag_data_size,
gst_flow_get_name (ret));
goto beach;
}
} }
demux->audio_linked = TRUE; ret = gst_flow_combiner_update_flow (demux->flowcombiner, ret);
beach: beach:
gst_buffer_unmap (buffer, &map); gst_buffer_unmap (buffer, &map);
@ -1420,6 +1414,7 @@ gst_flv_demux_parse_tag_video (GstFlvDemux * demux, GstBuffer * buffer)
/* We need to set caps before adding */ /* We need to set caps before adding */
gst_element_add_pad (GST_ELEMENT (demux), gst_element_add_pad (GST_ELEMENT (demux),
gst_object_ref (demux->video_pad)); gst_object_ref (demux->video_pad));
gst_flow_combiner_add_pad (demux->flowcombiner, demux->video_pad);
/* We only emit no more pads when we have audio and video. Indeed we can /* We only emit no more pads when we have audio and video. Indeed we can
* not trust the FLV header to tell us if there will be only audio or * not trust the FLV header to tell us if there will be only audio or
@ -1564,27 +1559,19 @@ gst_flv_demux_parse_tag_video (GstFlvDemux * demux, GstBuffer * buffer)
/* Push downstream */ /* Push downstream */
ret = gst_pad_push (demux->video_pad, outbuf); ret = gst_pad_push (demux->video_pad, outbuf);
if (G_UNLIKELY (ret != GST_FLOW_OK)) { if (G_UNLIKELY (ret != GST_FLOW_OK) &&
if (demux->segment.rate < 0.0 && ret == GST_FLOW_EOS && demux->segment.rate < 0.0 && ret == GST_FLOW_EOS &&
demux->segment.position > demux->segment.stop) { demux->segment.position > demux->segment.stop) {
/* In reverse playback we can get a GST_FLOW_EOS when /* In reverse playback we can get a GST_FLOW_EOS when
* we are at the end of the segment, so we just need to jump * we are at the end of the segment, so we just need to jump
* back to the previous section. */ * back to the previous section. */
GST_DEBUG_OBJECT (demux, "downstream has reached end of segment"); GST_DEBUG_OBJECT (demux, "downstream has reached end of segment");
demux->video_done = TRUE; demux->video_done = TRUE;
ret = GST_FLOW_OK; ret = GST_FLOW_OK;
} else { goto beach;
if (ret == GST_FLOW_NOT_LINKED)
demux->video_linked = FALSE;
else
GST_WARNING_OBJECT (demux, "failed pushing a %" G_GUINT64_FORMAT
" bytes video buffer: %s", demux->tag_data_size,
gst_flow_get_name (ret));
goto beach;
}
} }
demux->video_linked = TRUE; ret = gst_flow_combiner_update_flow (demux->flowcombiner, ret);
beach: beach:
gst_buffer_unmap (buffer, &map); gst_buffer_unmap (buffer, &map);
@ -1811,10 +1798,6 @@ gst_flv_demux_cleanup (GstFlvDemux * demux)
demux->audio_need_discont = TRUE; demux->audio_need_discont = TRUE;
demux->video_need_discont = TRUE; demux->video_need_discont = TRUE;
/* By default we consider them as linked */
demux->audio_linked = TRUE;
demux->video_linked = TRUE;
demux->has_audio = FALSE; demux->has_audio = FALSE;
demux->has_video = FALSE; demux->has_video = FALSE;
demux->push_tags = FALSE; demux->push_tags = FALSE;
@ -1862,12 +1845,14 @@ gst_flv_demux_cleanup (GstFlvDemux * demux)
} }
if (demux->audio_pad) { if (demux->audio_pad) {
gst_flow_combiner_remove_pad (demux->flowcombiner, demux->audio_pad);
gst_element_remove_pad (GST_ELEMENT (demux), demux->audio_pad); gst_element_remove_pad (GST_ELEMENT (demux), demux->audio_pad);
gst_object_unref (demux->audio_pad); gst_object_unref (demux->audio_pad);
demux->audio_pad = NULL; demux->audio_pad = NULL;
} }
if (demux->video_pad) { if (demux->video_pad) {
gst_flow_combiner_remove_pad (demux->flowcombiner, demux->video_pad);
gst_element_remove_pad (GST_ELEMENT (demux), demux->video_pad); gst_element_remove_pad (GST_ELEMENT (demux), demux->video_pad);
gst_object_unref (demux->video_pad); gst_object_unref (demux->video_pad);
demux->video_pad = NULL; demux->video_pad = NULL;
@ -1947,13 +1932,8 @@ gst_flv_demux_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
parse: parse:
if (G_UNLIKELY (ret != GST_FLOW_OK)) { if (G_UNLIKELY (ret != GST_FLOW_OK)) {
if (ret == GST_FLOW_NOT_LINKED && (demux->audio_linked GST_DEBUG_OBJECT (demux, "got flow return %s", gst_flow_get_name (ret));
|| demux->video_linked)) { goto beach;
ret = GST_FLOW_OK;
} else {
GST_DEBUG_OBJECT (demux, "got flow return %s", gst_flow_get_name (ret));
goto beach;
}
} }
if (G_UNLIKELY (demux->flushing)) { if (G_UNLIKELY (demux->flushing)) {
@ -2127,13 +2107,6 @@ parse:
} }
beach: beach:
if (G_UNLIKELY (ret == GST_FLOW_NOT_LINKED)) {
/* If either audio or video is linked we return GST_FLOW_OK */
if (demux->audio_linked || demux->video_linked) {
ret = GST_FLOW_OK;
}
}
return ret; return ret;
/* ERRORS */ /* ERRORS */
@ -2242,13 +2215,8 @@ gst_flv_demux_pull_tag (GstPad * pad, GstFlvDemux * demux)
demux->state = FLV_STATE_TAG_TYPE; demux->state = FLV_STATE_TAG_TYPE;
if (G_UNLIKELY (ret == GST_FLOW_NOT_LINKED)) { if (G_UNLIKELY (ret == GST_FLOW_NOT_LINKED)) {
/* If either audio or video is linked we return GST_FLOW_OK */ GST_WARNING_OBJECT (demux, "parsing this tag returned not-linked and "
if (demux->audio_linked || demux->video_linked) { "neither video nor audio are linked");
ret = GST_FLOW_OK;
} else {
GST_WARNING_OBJECT (demux, "parsing this tag returned not-linked and "
"neither video nor audio are linked");
}
} }
beach: beach:
@ -3382,6 +3350,11 @@ gst_flv_demux_dispose (GObject * object)
demux->taglist = NULL; demux->taglist = NULL;
} }
if (demux->flowcombiner) {
gst_flow_combiner_free (demux->flowcombiner);
demux->flowcombiner = NULL;
}
if (demux->new_seg_event) { if (demux->new_seg_event) {
gst_event_unref (demux->new_seg_event); gst_event_unref (demux->new_seg_event);
demux->new_seg_event = NULL; demux->new_seg_event = NULL;
@ -3472,6 +3445,7 @@ gst_flv_demux_init (GstFlvDemux * demux)
demux->adapter = gst_adapter_new (); demux->adapter = gst_adapter_new ();
demux->taglist = gst_tag_list_new_empty (); demux->taglist = gst_tag_list_new_empty ();
demux->flowcombiner = gst_flow_combiner_new ();
gst_segment_init (&demux->segment, GST_FORMAT_TIME); gst_segment_init (&demux->segment, GST_FORMAT_TIME);
demux->own_index = FALSE; demux->own_index = FALSE;

View file

@ -22,6 +22,7 @@
#include <gst/gst.h> #include <gst/gst.h>
#include <gst/base/gstadapter.h> #include <gst/base/gstadapter.h>
#include <gst/base/gstflowcombiner.h>
#include "gstindex.h" #include "gstindex.h"
G_BEGIN_DECLS G_BEGIN_DECLS
@ -74,6 +75,8 @@ struct _GstFlvDemux
GstAdapter *adapter; GstAdapter *adapter;
GstFlowCombiner *flowcombiner;
GstSegment segment; GstSegment segment;
GstEvent *new_seg_event; GstEvent *new_seg_event;