mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-07 07:55:41 +00:00
mpegtsmux: Correctly time out and mux anyway in live pipelines
This makes sure that for sparse streams (KLV, DVB subtitles, ...) the muxer does not wait until the next buffer is available for them but times out on the latency deadline and outputs data. For non-live pipelines it will still be necessary for upstream to correctly produce gap events for sparse streams. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6859>
This commit is contained in:
parent
3b595479f9
commit
24be7b5c58
1 changed files with 24 additions and 4 deletions
|
@ -1090,9 +1090,13 @@ new_packet_common_init (GstBaseTsMux * mux, GstBuffer * buf, guint8 * data,
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_base_ts_mux_push_packets (GstBaseTsMux * mux, gboolean force)
|
gst_base_ts_mux_push_packets (GstBaseTsMux * mux, gboolean force)
|
||||||
{
|
{
|
||||||
|
GstSegment *segment =
|
||||||
|
&GST_AGGREGATOR_PAD (GST_AGGREGATOR_SRC_PAD (mux))->segment;
|
||||||
GstBufferList *buffer_list;
|
GstBufferList *buffer_list;
|
||||||
gint align = mux->alignment;
|
gint align = mux->alignment;
|
||||||
gint av, packet_size;
|
gint av, packet_size;
|
||||||
|
GstFlowReturn flow_ret;
|
||||||
|
GstClockTime pts;
|
||||||
|
|
||||||
packet_size = mux->packet_size;
|
packet_size = mux->packet_size;
|
||||||
|
|
||||||
|
@ -1108,8 +1112,16 @@ gst_base_ts_mux_push_packets (GstBaseTsMux * mux, gboolean force)
|
||||||
/* no alignment, just push all available data */
|
/* no alignment, just push all available data */
|
||||||
if (align == 0) {
|
if (align == 0) {
|
||||||
buffer_list = gst_adapter_take_buffer_list (mux->out_adapter, av);
|
buffer_list = gst_adapter_take_buffer_list (mux->out_adapter, av);
|
||||||
return gst_aggregator_finish_buffer_list (GST_AGGREGATOR (mux),
|
flow_ret = gst_aggregator_finish_buffer_list (GST_AGGREGATOR (mux),
|
||||||
buffer_list);
|
buffer_list);
|
||||||
|
|
||||||
|
pts = gst_adapter_prev_pts (mux->out_adapter, NULL);
|
||||||
|
if (GST_CLOCK_TIME_IS_VALID (pts)
|
||||||
|
&& (!GST_CLOCK_TIME_IS_VALID (segment->position)
|
||||||
|
|| segment->position < pts))
|
||||||
|
segment->position = pts;
|
||||||
|
|
||||||
|
return flow_ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
align *= packet_size;
|
align *= packet_size;
|
||||||
|
@ -1122,7 +1134,6 @@ gst_base_ts_mux_push_packets (GstBaseTsMux * mux, gboolean force)
|
||||||
GST_LOG_OBJECT (mux, "aligning to %d bytes", align);
|
GST_LOG_OBJECT (mux, "aligning to %d bytes", align);
|
||||||
while (align <= av) {
|
while (align <= av) {
|
||||||
GstBuffer *buf;
|
GstBuffer *buf;
|
||||||
GstClockTime pts;
|
|
||||||
|
|
||||||
pts = gst_adapter_prev_pts (mux->out_adapter, NULL);
|
pts = gst_adapter_prev_pts (mux->out_adapter, NULL);
|
||||||
buf = gst_adapter_take_buffer (mux->out_adapter, align);
|
buf = gst_adapter_take_buffer (mux->out_adapter, align);
|
||||||
|
@ -1135,7 +1146,6 @@ gst_base_ts_mux_push_packets (GstBaseTsMux * mux, gboolean force)
|
||||||
|
|
||||||
if (av > 0 && force) {
|
if (av > 0 && force) {
|
||||||
GstBuffer *buf;
|
GstBuffer *buf;
|
||||||
GstClockTime pts;
|
|
||||||
guint8 *data;
|
guint8 *data;
|
||||||
guint32 header;
|
guint32 header;
|
||||||
gint dummy;
|
gint dummy;
|
||||||
|
@ -1185,7 +1195,16 @@ gst_base_ts_mux_push_packets (GstBaseTsMux * mux, gboolean force)
|
||||||
gst_buffer_list_add (buffer_list, buf);
|
gst_buffer_list_add (buffer_list, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
return gst_aggregator_finish_buffer_list (GST_AGGREGATOR (mux), buffer_list);
|
flow_ret =
|
||||||
|
gst_aggregator_finish_buffer_list (GST_AGGREGATOR (mux), buffer_list);
|
||||||
|
|
||||||
|
pts = gst_adapter_prev_pts (mux->out_adapter, NULL);
|
||||||
|
if (GST_CLOCK_TIME_IS_VALID (pts)
|
||||||
|
&& (!GST_CLOCK_TIME_IS_VALID (segment->position)
|
||||||
|
|| segment->position < pts))
|
||||||
|
segment->position = pts;
|
||||||
|
|
||||||
|
return flow_ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
|
@ -2802,6 +2821,7 @@ gst_base_ts_mux_class_init (GstBaseTsMuxClass * klass)
|
||||||
gstagg_class->src_event = gst_base_ts_mux_src_event;
|
gstagg_class->src_event = gst_base_ts_mux_src_event;
|
||||||
gstagg_class->start = gst_base_ts_mux_start;
|
gstagg_class->start = gst_base_ts_mux_start;
|
||||||
gstagg_class->stop = gst_base_ts_mux_stop;
|
gstagg_class->stop = gst_base_ts_mux_stop;
|
||||||
|
gstagg_class->get_next_time = gst_aggregator_simple_get_next_time;
|
||||||
|
|
||||||
klass->create_ts_mux = gst_base_ts_mux_default_create_ts_mux;
|
klass->create_ts_mux = gst_base_ts_mux_default_create_ts_mux;
|
||||||
klass->allocate_packet = gst_base_ts_mux_default_allocate_packet;
|
klass->allocate_packet = gst_base_ts_mux_default_allocate_packet;
|
||||||
|
|
Loading…
Reference in a new issue