summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVivia Nikolaidou <vivia@ahiru.eu>2021-08-16 18:15:42 +0300
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>2021-09-20 09:31:08 +0000
commitfcad4cc646a23e4e621ec5e8485958ab78d98090 (patch)
tree9f5292d4a4cc376ab6cda5010dda9df3ee95b148
parentf74a2bd303a55501067ee3e6b1def3bbd3807880 (diff)
downloadgstreamer-plugins-bad-fcad4cc646a23e4e621ec5e8485958ab78d98090.tar.gz
mpegtspacketizer: memcmp potentially seen_before data
Theoretically the version number is incremented every time there's a new section, but in a world of streaming we can't easily make that assumption. An example of a broken use case is when we're cat-ing two mpeg-ts files together, which is equivalent of capturing a DVB stream while switching channels. A set-top box would know that we switched the channels and reset the demuxer, but in practice this might not happen. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2468>
-rw-r--r--gst/mpegtsdemux/mpegtspacketizer.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/gst/mpegtsdemux/mpegtspacketizer.c b/gst/mpegtsdemux/mpegtspacketizer.c
index 4e961feb0..fe9ff2ef2 100644
--- a/gst/mpegtsdemux/mpegtspacketizer.c
+++ b/gst/mpegtsdemux/mpegtspacketizer.c
@@ -157,7 +157,7 @@ find_subtable (GSList * subtables, guint8 table_id, guint16 subtable_extension)
static gboolean
seen_section_before (MpegTSPacketizerStream * stream, guint8 table_id,
guint16 subtable_extension, guint8 version_number, guint8 section_number,
- guint8 last_section_number)
+ guint8 last_section_number, guint8 * data_start, gsize to_read)
{
MpegTSPacketizerStreamSubtable *subtable;
@@ -178,7 +178,17 @@ seen_section_before (MpegTSPacketizerStream * stream, guint8 table_id,
return FALSE;
}
/* Finally return whether we saw that section or not */
- return MPEGTS_BIT_IS_SET (subtable->seen_section, section_number);
+ if (!MPEGTS_BIT_IS_SET (subtable->seen_section, section_number)) {
+ GST_DEBUG ("Different section_number");
+ return FALSE;
+ }
+
+ if (stream->section_data) {
+ /* Everything else is the same, fall back to memcmp */
+ return (memcmp (stream->section_data, data_start, to_read) != 0);
+ }
+
+ return FALSE;
}
static MpegTSPacketizerStreamSubtable *
@@ -1192,7 +1202,8 @@ section_start:
* * same section_number was seen
*/
if (seen_section_before (stream, table_id, subtable_extension,
- version_number, section_number, last_section_number)) {
+ version_number, section_number, last_section_number, data_start,
+ to_read)) {
GST_DEBUG
("PID 0x%04x Already processed table_id:0x%02x subtable_extension:0x%04x, version_number:%d, section_number:%d",
packet->pid, table_id, subtable_extension, version_number,