summaryrefslogtreecommitdiff
path: root/gst
diff options
context:
space:
mode:
authorEdward Hervey <edward.hervey@collabora.co.uk>2012-06-02 08:06:24 +0200
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2012-06-26 12:42:04 +0200
commit9ddc201783368cfa420ac3e813422206230e6042 (patch)
tree8e97dc1a4cb6c1d3c5fa9c0787b7f1aa6acb9608 /gst
parent893985ae8c2d6317916444d12f4d008977c67dec (diff)
mpegtbase: Refactor PSI detection
Diffstat (limited to 'gst')
-rw-r--r--gst/mpegtsdemux/mpegtsbase.c87
1 files changed, 42 insertions, 45 deletions
diff --git a/gst/mpegtsdemux/mpegtsbase.c b/gst/mpegtsdemux/mpegtsbase.c
index d2b573117..00c39bcb2 100644
--- a/gst/mpegtsdemux/mpegtsbase.c
+++ b/gst/mpegtsdemux/mpegtsbase.c
@@ -785,7 +785,7 @@ static inline gboolean
mpegts_base_is_psi (MpegTSBase * base, MpegTSPacketizerPacket * packet)
{
gboolean retval = FALSE;
- guint8 *data, table_id, pointer;
+ guint8 *data, table_id = TABLE_ID_UNSET, pointer;
int i;
static const guint8 si_tables[] =
@@ -796,58 +796,55 @@ mpegts_base_is_psi (MpegTSBase * base, MpegTSPacketizerPacket * packet)
0x72, 0x73, 0x7E, 0x7F, TABLE_ID_UNSET
};
- if (MPEGTS_BIT_IS_SET (base->known_psi, packet->pid))
- retval = TRUE;
-
/* check if it is a pes pid */
if (MPEGTS_BIT_IS_SET (base->is_pes, packet->pid))
- return FALSE;
+ goto invalid_pid;
+
+ /* check if it part of the PIDs we know contain PSI */
+ if (!MPEGTS_BIT_IS_SET (base->known_psi, packet->pid))
+ goto invalid_pid;
+
+ if (packet->payload_unit_start_indicator) {
+ data = packet->data;
+ pointer = *data++;
+ data += pointer;
+
+ /* 'pointer' value may be invalid on malformed packet
+ * so we need to avoid out of range */
+ if (!(data < packet->data_end)) {
+ GST_WARNING_OBJECT (base,
+ "Section pointer value exceeds packet size: 0x%x", pointer);
+ return FALSE;
+ }
- if (!retval) {
- if (packet->payload_unit_start_indicator) {
- data = packet->data;
- pointer = *data++;
- data += pointer;
- /* 'pointer' value may be invalid on malformed packet
- * so we need to avoid out of range
- */
- if (!(data < packet->data_end)) {
- GST_WARNING_OBJECT (base,
- "Wrong offset when retrieving table id: 0x%x", pointer);
- return FALSE;
- }
+ table_id = *(packet->data);
+ } else {
+ MpegTSPacketizerStream *stream = (MpegTSPacketizerStream *)
+ base->packetizer->streams[packet->pid];
- table_id = *(packet->data);
- i = 0;
- while (si_tables[i] != TABLE_ID_UNSET) {
- if (G_UNLIKELY (si_tables[i] == table_id)) {
- GST_DEBUG_OBJECT (base, "Packet has table id 0x%x", table_id);
- retval = TRUE;
- break;
- }
- i++;
- }
- } else {
- MpegTSPacketizerStream *stream = (MpegTSPacketizerStream *)
- base->packetizer->streams[packet->pid];
-
- if (stream) {
- i = 0;
- GST_DEBUG_OBJECT (base, "section table id: 0x%x",
- stream->section_table_id);
- while (si_tables[i] != TABLE_ID_UNSET) {
- if (G_UNLIKELY (si_tables[i] == stream->section_table_id)) {
- retval = TRUE;
- break;
- }
- i++;
- }
- }
+ if (stream)
+ table_id = stream->section_table_id;
+ }
+
+ if (G_UNLIKELY (table_id == TABLE_ID_UNSET))
+ goto beach;
+
+ for (i = 0; si_tables[i] != TABLE_ID_UNSET; i++) {
+ if (G_UNLIKELY (si_tables[i] == table_id)) {
+ retval = TRUE;
+ break;
}
}
- GST_LOG_OBJECT (base, "Packet of pid 0x%x is psi: %d", packet->pid, retval);
+beach:
+ GST_DEBUG_OBJECT (base, "Packet of pid 0x%04x (table_id 0x%02x) is psi: %d",
+ packet->pid, table_id, retval);
return retval;
+
+invalid_pid:
+ GST_LOG_OBJECT (base, "Packet of pid 0x%04x doesn't belong to a SI stream",
+ packet->pid);
+ return FALSE;
}
static void