summaryrefslogtreecommitdiff
path: root/gst/mpegtsmux/tsmux
diff options
context:
space:
mode:
authorMathieu Duponchelle <mathieu@centricular.com>2019-05-23 00:03:18 +0200
committerMathieu Duponchelle <mduponchelle1@gmail.com>2019-05-30 13:53:05 +0000
commit5d41740ff6c67bee1584f13c7d188d04d85fa4ea (patch)
tree469d9b684816dbaa734cdacf5397b26b0a29d193 /gst/mpegtsmux/tsmux
parent09749192d83609c903499656fcb683ac494741ae (diff)
downloadgstreamer-plugins-bad-5d41740ff6c67bee1584f13c7d188d04d85fa4ea.tar.gz
tsmux: maintain packet counters in a global array
We can have multiple TsMuxPacketInfo objects for the same PID with user-provided sections, for example ATSC requires multiple tables with the same PID.
Diffstat (limited to 'gst/mpegtsmux/tsmux')
-rw-r--r--gst/mpegtsmux/tsmux/tsmux.c16
-rw-r--r--gst/mpegtsmux/tsmux/tsmux.h3
-rw-r--r--gst/mpegtsmux/tsmux/tsmuxcommon.h3
3 files changed, 11 insertions, 11 deletions
diff --git a/gst/mpegtsmux/tsmux/tsmux.c b/gst/mpegtsmux/tsmux/tsmux.c
index ad5c2d527..290da032d 100644
--- a/gst/mpegtsmux/tsmux/tsmux.c
+++ b/gst/mpegtsmux/tsmux/tsmux.c
@@ -821,7 +821,7 @@ tsmux_write_adaptation_field (guint8 * buf,
}
static gboolean
-tsmux_write_ts_header (guint8 * buf, TsMuxPacketInfo * pi,
+tsmux_write_ts_header (TsMux * mux, guint8 * buf, TsMuxPacketInfo * pi,
guint * payload_len_out, guint * payload_offset_out, guint stream_avail)
{
guint8 *tmp;
@@ -835,7 +835,7 @@ tsmux_write_ts_header (guint8 * buf, TsMuxPacketInfo * pi,
buf[0] = TSMUX_SYNC_BYTE;
TS_DEBUG ("PID 0x%04x, counter = 0x%01x, %u bytes avail", pi->pid,
- pi->packet_count & 0x0f, stream_avail);
+ mux->pid_packet_counts[pi->pid] & 0x0f, stream_avail);
/* 3 bits:
* transport_error_indicator
@@ -893,10 +893,10 @@ tsmux_write_ts_header (guint8 * buf, TsMuxPacketInfo * pi,
g_assert (payload_len <= stream_avail);
/* Packet with payload, increment the continuity counter */
- pi->packet_count++;
+ mux->pid_packet_counts[pi->pid]++;
}
- adaptation_flag |= pi->packet_count & 0x0f;
+ adaptation_flag |= mux->pid_packet_counts[pi->pid] & 0x0f;
/* Write the byte of transport_scrambling_control, adaptation_field_control
* + continuity counter out */
@@ -960,7 +960,7 @@ tsmux_section_write_packet (GstMpegtsSectionType * type,
/* Wee need room for a pointer byte */
section->pi.stream_avail++;
- if (!tsmux_write_ts_header (packet, &section->pi, &len, &offset,
+ if (!tsmux_write_ts_header (mux, packet, &section->pi, &len, &offset,
section->pi.stream_avail))
goto fail;
@@ -969,7 +969,7 @@ tsmux_section_write_packet (GstMpegtsSectionType * type,
payload_len = len - 1;
} else {
- if (!tsmux_write_ts_header (packet, &section->pi, &len, &offset,
+ if (!tsmux_write_ts_header (mux, packet, &section->pi, &len, &offset,
section->pi.stream_avail))
goto fail;
payload_len = len;
@@ -1218,7 +1218,7 @@ pad_stream (TsMux * mux, TsMuxStream * stream, gint64 cur_ts)
if ((new_pcr =
write_new_pcr (mux, stream, get_current_pcr (mux,
cur_ts)) != -1))
- tsmux_write_ts_header (map.data, &stream->pi, &payload_len,
+ tsmux_write_ts_header (mux, map.data, &stream->pi, &payload_len,
&payload_offs, 0);
else
tsmux_write_null_ts_header (map.data);
@@ -1297,7 +1297,7 @@ tsmux_write_stream_packet (TsMux * mux, TsMuxStream * stream)
gst_buffer_map (buf, &map, GST_MAP_READ);
- if (!tsmux_write_ts_header (map.data, pi, &payload_len, &payload_offs,
+ if (!tsmux_write_ts_header (mux, map.data, pi, &payload_len, &payload_offs,
pi->stream_avail))
goto fail;
diff --git a/gst/mpegtsmux/tsmux/tsmux.h b/gst/mpegtsmux/tsmux/tsmux.h
index c622e89ef..ba6db6303 100644
--- a/gst/mpegtsmux/tsmux/tsmux.h
+++ b/gst/mpegtsmux/tsmux/tsmux.h
@@ -186,6 +186,9 @@ struct TsMux {
guint64 bitrate;
guint64 n_bytes;
+
+ /* For the per-PID continuity counter */
+ guint8 pid_packet_counts[8192];
};
/* create/free new muxer session */
diff --git a/gst/mpegtsmux/tsmux/tsmuxcommon.h b/gst/mpegtsmux/tsmux/tsmuxcommon.h
index 2e7b35399..9f10499ca 100644
--- a/gst/mpegtsmux/tsmux/tsmuxcommon.h
+++ b/gst/mpegtsmux/tsmux/tsmuxcommon.h
@@ -135,9 +135,6 @@ struct TsMuxPacketInfo {
gboolean packet_start_unit_indicator;
- /* continuity counter */
- guint8 packet_count;
-
/* payload bytes available
* (including PES header if applicable) */
guint stream_avail;