Sophie

Sophie

distrib > Mandriva > current > i586 > media > contrib-release-src > by-pkgid > a3955f91821ca388a36ba4be595b4b93 > files > 3

gstreamer0.10-plugins-bad-0.10.18-3mdv2010.1.src.rpm

From d7ab75abb8dca1f1b09509a98ce5edb441c5e3fd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sebastian=20P=C3=B6lsterl?= <sebp@k-d-w.org>
Date: Fri, 2 Apr 2010 19:52:25 +0200
Subject: [PATCH] mpegtspacketizer: Additionally use the CRC to check if tables are duplicates

The current code just uses table id, subtable extension and version number to
check if the section has been seen before. However, this comparison is not
sufficient, causing actually new tables being dismissed.

Fixes bug #614479.
---
 gst/mpegdemux/mpegtspacketizer.c |   18 ++++++++++++++----
 gst/mpegdemux/mpegtspacketizer.h |    2 ++
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/gst/mpegdemux/mpegtspacketizer.c b/gst/mpegdemux/mpegtspacketizer.c
index 198e3dd..cefa30d 100644
--- a/gst/mpegdemux/mpegtspacketizer.c
+++ b/gst/mpegdemux/mpegtspacketizer.c
@@ -103,6 +103,7 @@ mpegts_packetizer_stream_subtable_new (guint8 table_id,
   subtable->version_number = VERSION_NUMBER_UNSET;
   subtable->table_id = table_id;
   subtable->subtable_extension = subtable_extension;
+  subtable->crc = 0;
   return subtable;
 }
 
@@ -264,7 +265,7 @@ mpegts_packetizer_parse_section_header (MpegTSPacketizer * packetizer,
     MpegTSPacketizerStream * stream, MpegTSPacketizerSection * section)
 {
   guint8 tmp;
-  guint8 *data;
+  guint8 *data, *crc_data;
   MpegTSPacketizerStreamSubtable *subtable;
   GSList *subtable_list = NULL;
 
@@ -302,21 +303,30 @@ mpegts_packetizer_parse_section_header (MpegTSPacketizer * packetizer,
   tmp = *data++;
   section->version_number = (tmp >> 1) & 0x1F;
   section->current_next_indicator = tmp & 0x01;
+
   if (!section->current_next_indicator)
     goto not_applicable;
 
-  if (section->version_number == subtable->version_number)
+  /* CRC is at the end of the section */
+  crc_data =
+      GST_BUFFER_DATA (section->buffer) + GST_BUFFER_SIZE (section->buffer) - 4;
+  section->crc = GST_READ_UINT32_BE (crc_data);
+
+  if (section->version_number == subtable->version_number &&
+      section->crc == subtable->crc)
     goto not_applicable;
+
   subtable->version_number = section->version_number;
+  subtable->crc = section->crc;
   stream->section_table_id = section->table_id;
 
   return TRUE;
 
 not_applicable:
   GST_LOG
-      ("not applicable pid %d table_id %d subtable_extension %d, current_next %d version %d",
+      ("not applicable pid %d table_id %d subtable_extension %d, current_next %d version %d, crc 0x%x",
       section->pid, section->table_id, section->subtable_extension,
-      section->current_next_indicator, section->version_number);
+      section->current_next_indicator, section->version_number, section->crc);
   section->complete = FALSE;
   gst_buffer_unref (section->buffer);
   return TRUE;
diff --git a/gst/mpegdemux/mpegtspacketizer.h b/gst/mpegdemux/mpegtspacketizer.h
index 6a06906..4d6ea1f 100644
--- a/gst/mpegdemux/mpegtspacketizer.h
+++ b/gst/mpegdemux/mpegtspacketizer.h
@@ -103,6 +103,7 @@ typedef struct
   guint section_length;
   guint8 version_number;
   guint8 current_next_indicator;
+  guint32 crc;
 } MpegTSPacketizerSection; 
 
 typedef struct
@@ -113,6 +114,7 @@ typedef struct
    * section_syntax_indicator is 0, sub_table_extension will be set to 0 */
   guint16 subtable_extension;
   guint8 version_number;
+  guint32 crc;
 } MpegTSPacketizerStreamSubtable;
 
 typedef enum {
-- 
1.7.0.4