diff --git a/gst/mpegtsmux/tsmux/tsmux.c b/gst/mpegtsmux/tsmux/tsmux.c index 6fa9e0d122..233a2530e5 100644 --- a/gst/mpegtsmux/tsmux/tsmux.c +++ b/gst/mpegtsmux/tsmux/tsmux.c @@ -1042,22 +1042,27 @@ tsmux_write_stream_packet (TsMux * mux, TsMuxStream * stream) g_return_val_if_fail (stream != NULL, FALSE); if (tsmux_stream_is_pcr (stream)) { - gint64 cur_pts = tsmux_stream_get_pts (stream); + gint64 cur_ts; gboolean write_pat; gboolean write_si; GList *cur; + if (tsmux_stream_get_dts (stream) != G_MININT64) + cur_ts = tsmux_stream_get_dts (stream); + else + cur_ts = tsmux_stream_get_pts (stream); + cur_pcr = 0; - if (cur_pts != G_MININT64) { - TS_DEBUG ("TS for PCR stream is %" G_GINT64_FORMAT, cur_pts); + if (cur_ts != G_MININT64) { + TS_DEBUG ("TS for PCR stream is %" G_GINT64_FORMAT, cur_ts); } /* FIXME: The current PCR needs more careful calculation than just * writing a fixed offset */ - if (cur_pts != G_MININT64) { + if (cur_ts != G_MININT64) { /* CLOCK_BASE >= TSMUX_PCR_OFFSET */ - cur_pts += CLOCK_BASE; - cur_pcr = (cur_pts - TSMUX_PCR_OFFSET) * + cur_ts += CLOCK_BASE; + cur_pcr = (cur_ts - TSMUX_PCR_OFFSET) * (TSMUX_SYS_CLOCK_FREQ / TSMUX_CLOCK_FREQ); } @@ -1077,13 +1082,13 @@ tsmux_write_stream_packet (TsMux * mux, TsMuxStream * stream) /* check if we need to rewrite pat */ if (mux->last_pat_ts == G_MININT64 || mux->pat_changed) write_pat = TRUE; - else if (cur_pts >= mux->last_pat_ts + mux->pat_interval) + else if (cur_ts >= mux->last_pat_ts + mux->pat_interval) write_pat = TRUE; else write_pat = FALSE; if (write_pat) { - mux->last_pat_ts = cur_pts; + mux->last_pat_ts = cur_ts; if (!tsmux_write_pat (mux)) return FALSE; } @@ -1091,13 +1096,13 @@ tsmux_write_stream_packet (TsMux * mux, TsMuxStream * stream) /* check if we need to rewrite sit */ if (mux->last_si_ts == G_MININT64 || mux->si_changed) write_si = TRUE; - else if (cur_pts >= mux->last_si_ts + mux->si_interval) + else if (cur_ts >= mux->last_si_ts + mux->si_interval) write_si = TRUE; else write_si = FALSE; if (write_si) { - mux->last_si_ts = cur_pts; + mux->last_si_ts = cur_ts; if (!tsmux_write_si (mux)) return FALSE; } @@ -1109,13 +1114,13 @@ tsmux_write_stream_packet (TsMux * mux, TsMuxStream * stream) if (program->last_pmt_ts == G_MININT64 || program->pmt_changed) write_pmt = TRUE; - else if (cur_pts >= program->last_pmt_ts + program->pmt_interval) + else if (cur_ts >= program->last_pmt_ts + program->pmt_interval) write_pmt = TRUE; else write_pmt = FALSE; if (write_pmt) { - program->last_pmt_ts = cur_pts; + program->last_pmt_ts = cur_ts; if (!tsmux_write_pmt (mux, program)) return FALSE; } diff --git a/gst/mpegtsmux/tsmux/tsmuxstream.c b/gst/mpegtsmux/tsmux/tsmuxstream.c index ff68dff8ae..602f4e7908 100644 --- a/gst/mpegtsmux/tsmux/tsmuxstream.c +++ b/gst/mpegtsmux/tsmux/tsmuxstream.c @@ -307,10 +307,9 @@ tsmux_stream_consume (TsMuxStream * stream, guint len) if (stream->cur_buffer_consumed == 0 && stream->cur_buffer->size != 0) return; - if (GST_CLOCK_STIME_IS_VALID (stream->cur_buffer->pts)) { + if (GST_CLOCK_STIME_IS_VALID (stream->cur_buffer->pts)) stream->last_pts = stream->cur_buffer->pts; - stream->last_dts = stream->cur_buffer->dts; - } else if (GST_CLOCK_STIME_IS_VALID (stream->cur_buffer->dts)) + if (GST_CLOCK_STIME_IS_VALID (stream->cur_buffer->dts)) stream->last_dts = stream->cur_buffer->dts; if (stream->cur_buffer_consumed == stream->cur_buffer->size) { @@ -716,8 +715,10 @@ tsmux_stream_add_data (TsMuxStream * stream, guint8 * data, guint len, packet->pts = pts; packet->dts = dts; - if (stream->bytes_avail == 0) + if (stream->bytes_avail == 0) { stream->last_pts = pts; + stream->last_dts = dts; + } stream->bytes_avail += len; stream->buffers = g_list_append (stream->buffers, packet); @@ -1087,10 +1088,27 @@ tsmux_stream_is_pcr (TsMuxStream * stream) * * Returns: the PTS of the last buffer in @stream. */ -guint64 +gint64 tsmux_stream_get_pts (TsMuxStream * stream) { g_return_val_if_fail (stream != NULL, GST_CLOCK_STIME_NONE); return stream->last_pts; } + +/** + * tsmux_stream_get_dts: + * @stream: a #TsMuxStream + * + * Return the DTS of the last buffer that has had bytes written and + * which _had_ a DTS in @stream. + * + * Returns: the DTS of the last buffer in @stream. + */ +gint64 +tsmux_stream_get_dts (TsMuxStream * stream) +{ + g_return_val_if_fail (stream != NULL, GST_CLOCK_STIME_NONE); + + return stream->last_dts; +} diff --git a/gst/mpegtsmux/tsmux/tsmuxstream.h b/gst/mpegtsmux/tsmux/tsmuxstream.h index 7edfb61ec2..a6c5f9fea8 100644 --- a/gst/mpegtsmux/tsmux/tsmuxstream.h +++ b/gst/mpegtsmux/tsmux/tsmuxstream.h @@ -256,7 +256,8 @@ gint tsmux_stream_bytes_avail (TsMuxStream *stream); gboolean tsmux_stream_initialize_pes_packet (TsMuxStream *stream); gboolean tsmux_stream_get_data (TsMuxStream *stream, guint8 *buf, guint len); -guint64 tsmux_stream_get_pts (TsMuxStream *stream); +gint64 tsmux_stream_get_pts (TsMuxStream *stream); +gint64 tsmux_stream_get_dts (TsMuxStream *stream); G_END_DECLS