summaryrefslogtreecommitdiff
path: root/gst/mpegtsmux/mpegtsmux.c
diff options
context:
space:
mode:
Diffstat (limited to 'gst/mpegtsmux/mpegtsmux.c')
-rw-r--r--gst/mpegtsmux/mpegtsmux.c77
1 files changed, 45 insertions, 32 deletions
diff --git a/gst/mpegtsmux/mpegtsmux.c b/gst/mpegtsmux/mpegtsmux.c
index b91d6b515..550fa1635 100644
--- a/gst/mpegtsmux/mpegtsmux.c
+++ b/gst/mpegtsmux/mpegtsmux.c
@@ -331,7 +331,8 @@ static void
mpegtsmux_pad_reset (MpegTsPadData * pad_data)
{
pad_data->pid = 0;
- pad_data->min_dts = GST_CLOCK_TIME_NONE;
+ pad_data->min_dts = GST_CLOCK_STIME_NONE;
+ pad_data->dts = GST_CLOCK_STIME_NONE;
pad_data->prog_id = -1;
#if 0
pad_data->prog_id = -1;
@@ -1035,7 +1036,7 @@ mpegtsmux_clip_inc_running_time (GstCollectPads * pads,
*outbuf = buf;
/* PTS */
- time = GST_BUFFER_TIMESTAMP (buf);
+ time = GST_BUFFER_PTS (buf);
/* invalid left alone and passed */
if (G_LIKELY (GST_CLOCK_TIME_IS_VALID (time))) {
@@ -1046,11 +1047,11 @@ mpegtsmux_clip_inc_running_time (GstCollectPads * pads,
*outbuf = NULL;
goto beach;
} else {
- GST_LOG_OBJECT (cdata->pad, "buffer pts %" GST_TIME_FORMAT " -> %"
+ GST_LOG_OBJECT (cdata->pad, "buffer pts %" GST_TIME_FORMAT " -> %"
GST_TIME_FORMAT " running time",
- GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), GST_TIME_ARGS (time));
+ GST_TIME_ARGS (GST_BUFFER_PTS (buf)), GST_TIME_ARGS (time));
buf = *outbuf = gst_buffer_make_writable (buf);
- GST_BUFFER_TIMESTAMP (*outbuf) = time;
+ GST_BUFFER_PTS (*outbuf) = time;
}
}
@@ -1059,28 +1060,39 @@ mpegtsmux_clip_inc_running_time (GstCollectPads * pads,
/* invalid left alone and passed */
if (G_LIKELY (GST_CLOCK_TIME_IS_VALID (time))) {
- time = gst_segment_to_running_time (&cdata->segment, GST_FORMAT_TIME, time);
- /* may have to decode out-of-segment, so pass INVALID */
- if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (time))) {
- GST_DEBUG_OBJECT (cdata->pad, "running dts outside segment");
- } else {
- GST_LOG_OBJECT (cdata->pad, "buffer dts %" GST_TIME_FORMAT " -> %"
- GST_TIME_FORMAT " running time",
- GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buf)), GST_TIME_ARGS (time));
+ gint sign;
+ gint64 dts;
- if (!GST_CLOCK_TIME_IS_VALID (pad_data->min_dts))
- pad_data->min_dts = time;
+ sign = gst_segment_to_running_time_full (&cdata->segment, GST_FORMAT_TIME,
+ time, &time);
- if (time < pad_data->min_dts) {
- /* Ignore DTS going backward */
- GST_WARNING_OBJECT (cdata->pad, "ignoring DTS going backward");
- time = pad_data->min_dts;
- }
+ GST_LOG_OBJECT (cdata->pad, "buffer dts %" GST_TIME_FORMAT " -> %"
+ GST_STIME_FORMAT " running time", GST_STIME_ARGS (GST_BUFFER_DTS (buf)),
+ GST_STIME_ARGS (time));
- *outbuf = gst_buffer_make_writable (buf);
- GST_BUFFER_DTS (*outbuf) = time;
- pad_data->min_dts = time;
+ if (sign > 0)
+ dts = (gint64) time;
+ else
+ dts = -((gint64) time);
+
+ if (GST_CLOCK_STIME_IS_VALID (pad_data))
+ pad_data->min_dts = dts;
+
+ if (dts < pad_data->min_dts) {
+ /* Ignore DTS going backward */
+ GST_WARNING_OBJECT (cdata->pad, "ignoring DTS going backward");
+ dts = pad_data->min_dts;
}
+
+ *outbuf = gst_buffer_make_writable (buf);
+ if (sign > 0)
+ GST_BUFFER_DTS (*outbuf) = time;
+ else
+ GST_BUFFER_DTS (*outbuf) = GST_CLOCK_TIME_NONE;
+
+ pad_data->dts = pad_data->min_dts = dts;
+ } else {
+ pad_data->dts = GST_CLOCK_STIME_NONE;
}
buf = *outbuf;
@@ -1103,8 +1115,8 @@ mpegtsmux_collected_buffer (GstCollectPads * pads, GstCollectData * data,
GstFlowReturn ret = GST_FLOW_OK;
MpegTsPadData *best = (MpegTsPadData *) data;
TsMuxProgram *prog;
- gint64 pts = -1;
- guint64 dts = -1;
+ gint64 pts = GST_CLOCK_STIME_NONE;
+ gint64 dts = GST_CLOCK_STIME_NONE;
gboolean delta = TRUE, header = FALSE;
StreamData *stream_data;
@@ -1140,7 +1152,7 @@ mpegtsmux_collected_buffer (GstCollectPads * pads, GstCollectData * data,
GstEvent *event;
event = check_pending_key_unit_event (mux->force_key_unit_event,
- &best->collect.segment, GST_BUFFER_TIMESTAMP (buf),
+ &best->collect.segment, GST_BUFFER_PTS (buf),
GST_BUFFER_FLAGS (buf), mux->pending_key_unit_ts);
if (event) {
GstClockTime running_time;
@@ -1186,18 +1198,19 @@ mpegtsmux_collected_buffer (GstCollectPads * pads, GstCollectData * data,
if (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_PTS (buf))) {
pts = GSTTIME_TO_MPEGTIME (GST_BUFFER_PTS (buf));
- GST_DEBUG_OBJECT (mux, "Buffer has PTS %" GST_TIME_FORMAT " pts %"
+ GST_DEBUG_OBJECT (mux, "Buffer has PTS %" GST_TIME_FORMAT " pts %"
G_GINT64_FORMAT, GST_TIME_ARGS (GST_BUFFER_PTS (buf)), pts);
}
- if (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_DTS (buf))) {
- dts = GSTTIME_TO_MPEGTIME (GST_BUFFER_DTS (buf));
- GST_DEBUG_OBJECT (mux, "Buffer has DTS %" GST_TIME_FORMAT " dts %"
- G_GINT64_FORMAT, GST_TIME_ARGS (GST_BUFFER_DTS (buf)), dts);
+ if (GST_CLOCK_STIME_IS_VALID (best->dts)) {
+ dts = GSTTIME_TO_MPEGTIME (best->dts);
+ GST_DEBUG_OBJECT (mux, "Buffer has DTS %s%" GST_TIME_FORMAT " dts %"
+ G_GINT64_FORMAT, best->dts >= 0 ? " " : "-",
+ GST_TIME_ARGS (ABS (best->dts)), dts);
}
/* should not have a DTS without PTS */
- if (pts == -1 && dts != -1) {
+ if (!GST_CLOCK_STIME_IS_VALID (pts) && GST_CLOCK_STIME_IS_VALID (dts)) {
GST_DEBUG_OBJECT (mux, "using DTS for unknown PTS");
pts = dts;
}