mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-19 16:21:17 +00:00
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:
parent
91e398ddd6
commit
43a2ee8948
2 changed files with 21 additions and 6 deletions
|
@ -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:
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue