adaptivedemux: Add custom flow return for allowing subclasses to specify when a fragment is finished

If it is finished before upstream going EOS.

https://bugzilla.gnome.org/show_bug.cgi?id=767365
This commit is contained in:
Sebastian Dröge 2016-05-25 16:01:24 +03:00
parent 91e398ddd6
commit 43a2ee8948
2 changed files with 21 additions and 6 deletions

View file

@ -157,10 +157,8 @@ enum
PROP_LAST PROP_LAST
}; };
enum GstAdaptiveDemuxFlowReturn /* Internal, so not using GST_FLOW_CUSTOM_SUCCESS_N */
{ #define GST_ADAPTIVE_DEMUX_FLOW_SWITCH (GST_FLOW_CUSTOM_SUCCESS_2 + 1)
GST_ADAPTIVE_DEMUX_FLOW_SWITCH = GST_FLOW_CUSTOM_SUCCESS_2 + 1
};
struct _GstAdaptiveDemuxPrivate struct _GstAdaptiveDemuxPrivate
{ {
@ -2136,6 +2134,8 @@ _src_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
GST_TIME_AS_USECONDS (gst_adaptive_demux_get_monotonic_time (demux)); GST_TIME_AS_USECONDS (gst_adaptive_demux_get_monotonic_time (demux));
if (ret != GST_FLOW_OK) { if (ret != GST_FLOW_OK) {
gboolean finished = FALSE;
if (ret < GST_FLOW_EOS) { if (ret < GST_FLOW_EOS) {
GST_ELEMENT_ERROR (demux, STREAM, FAILED, (NULL), GST_ELEMENT_ERROR (demux, STREAM, FAILED, (NULL),
("stream stopped, reason %s", gst_flow_get_name (ret))); ("stream stopped, reason %s", gst_flow_get_name (ret)));
@ -2147,9 +2147,22 @@ _src_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
gst_flow_get_name (ret)); gst_flow_get_name (ret));
} }
gst_adaptive_demux_stream_fragment_download_finish (stream, ret, NULL); if (ret == (GstFlowReturn) GST_ADAPTIVE_DEMUX_FLOW_SWITCH) {
if (ret == (GstFlowReturn) GST_ADAPTIVE_DEMUX_FLOW_SWITCH)
ret = GST_FLOW_EOS; /* return EOS to make the source stop */ ret = GST_FLOW_EOS; /* return EOS to make the source stop */
} else if (ret == GST_ADAPTIVE_DEMUX_FLOW_END_OF_FRAGMENT) {
/* Behaves like an EOS event from upstream */
ret = klass->finish_fragment (demux, stream);
if (ret == (GstFlowReturn) GST_ADAPTIVE_DEMUX_FLOW_SWITCH) {
ret = GST_FLOW_EOS; /* return EOS to make the source stop */
} else if (ret != GST_FLOW_OK) {
goto error;
}
finished = TRUE;
}
gst_adaptive_demux_stream_fragment_download_finish (stream, ret, NULL);
if (finished)
ret = GST_FLOW_EOS;
} }
error: error:

View file

@ -81,6 +81,8 @@ G_BEGIN_DECLS
g_clear_error (&err); \ g_clear_error (&err); \
} G_STMT_END } G_STMT_END
#define GST_ADAPTIVE_DEMUX_FLOW_END_OF_FRAGMENT GST_FLOW_CUSTOM_SUCCESS_1
typedef struct _GstAdaptiveDemuxStreamFragment GstAdaptiveDemuxStreamFragment; typedef struct _GstAdaptiveDemuxStreamFragment GstAdaptiveDemuxStreamFragment;
typedef struct _GstAdaptiveDemuxStream GstAdaptiveDemuxStream; typedef struct _GstAdaptiveDemuxStream GstAdaptiveDemuxStream;
typedef struct _GstAdaptiveDemux GstAdaptiveDemux; typedef struct _GstAdaptiveDemux GstAdaptiveDemux;