diff options
Diffstat (limited to 'gst/mpegtsdemux/mpegtspacketizer.c')
-rw-r--r-- | gst/mpegtsdemux/mpegtspacketizer.c | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/gst/mpegtsdemux/mpegtspacketizer.c b/gst/mpegtsdemux/mpegtspacketizer.c index 25d75cfa8..d88fd1919 100644 --- a/gst/mpegtsdemux/mpegtspacketizer.c +++ b/gst/mpegtsdemux/mpegtspacketizer.c @@ -1,7 +1,7 @@ /* - * mpegtspacketizer.c - + * mpegtspacketizer.c - * Copyright (C) 2007, 2008 Alessandro Decina, Zaheer Merali - * + * * Authors: * Zaheer Merali <zaheerabbas at merali dot org> * Alessandro Decina <alessandro@nnva.org> @@ -78,6 +78,7 @@ static gchar *get_encoding_and_convert (const gchar * text, guint length); #define MAX_CONTINUITY 15 #define VERSION_NUMBER_UNSET 255 #define TABLE_ID_UNSET 0xFF +#define PACKET_SYNC_BYTE 0x47 static gint mpegts_packetizer_stream_subtable_compare (gconstpointer a, gconstpointer b) @@ -396,7 +397,7 @@ mpegts_packetizer_parse_descriptors (MpegTSPacketizer2 * packetizer, /* include length */ desc = g_string_new_len ((gchar *) data - 2, length + 2); data += length; - /* G_TYPE_GSTING is a GBoxed type and is used so properly marshalled from python */ + /* G_TYPE_GSTRING is a GBoxed type and is used so properly marshalled from python */ g_value_init (&value, G_TYPE_GSTRING); g_value_take_boxed (&value, desc); g_value_array_append (descriptors, &value); @@ -521,6 +522,8 @@ mpegts_packetizer_parse_pmt (MpegTSPacketizer2 * packetizer, program_number = GST_READ_UINT16_BE (data); data += 2; + GST_DEBUG ("Parsing %d Program Map Table", program_number); + tmp = *data++; section->version_number = (tmp >> 1) & 0x1F; section->current_next_indicator = tmp & 0x01; @@ -565,6 +568,7 @@ mpegts_packetizer_parse_pmt (MpegTSPacketizer2 * packetizer, * bytes) plus the CRC */ while (data <= end - 4 - 5) { stream_type = *data++; + GST_DEBUG ("Stream type 0x%02x found", stream_type); pid = GST_READ_UINT16_BE (data) & 0x1FFF; data += 2; @@ -2159,13 +2163,14 @@ mpegts_try_discover_packet_size (MpegTSPacketizer2 * packetizer) /* find first sync byte */ pos = -1; for (i = 0; i < MPEGTS_MAX_PACKETSIZE; i++) { - if (dest[i] == 0x47) { + if (dest[i] == PACKET_SYNC_BYTE) { for (j = 0; j < 4; j++) { guint packetsize = psizes[j]; /* check each of the packet size possibilities in turn */ - if (dest[i] == 0x47 && dest[i + packetsize] == 0x47 && - dest[i + packetsize * 2] == 0x47 && - dest[i + packetsize * 3] == 0x47) { + if (dest[i] == PACKET_SYNC_BYTE + && dest[i + packetsize] == PACKET_SYNC_BYTE + && dest[i + packetsize * 2] == PACKET_SYNC_BYTE + && dest[i + packetsize * 3] == PACKET_SYNC_BYTE) { packetizer->know_packet_size = TRUE; packetizer->packet_size = packetsize; packetizer->caps = gst_caps_new_simple ("video/mpegts", @@ -2200,10 +2205,10 @@ mpegts_try_discover_packet_size (MpegTSPacketizer2 * packetizer) GST_DEBUG ("Flushing out %d bytes", pos); gst_adapter_flush (packetizer->adapter, pos); packetizer->offset += pos; - } else if (!packetizer->know_packet_size) { - /* drop invalid data and move to the next possible packets */ - gst_adapter_flush (packetizer->adapter, MPEGTS_MAX_PACKETSIZE); } + } else { + /* drop invalid data and move to the next possible packets */ + GST_DEBUG ("Could not determine packet size"); } return packetizer->know_packet_size; @@ -2235,6 +2240,7 @@ mpegts_packetizer_next_packet (MpegTSPacketizer2 * packetizer, while ((avail = packetizer->adapter->size) >= packetizer->packet_size) { packet->buffer = gst_adapter_take_buffer (packetizer->adapter, packetizer->packet_size); + /* M2TS packets don't start with the sync byte, all other variants do */ if (packetizer->packet_size == MPEGTS_M2TS_PACKETSIZE) { packet->data_start = GST_BUFFER_DATA (packet->buffer) + 4; @@ -2347,7 +2353,6 @@ mpegts_packetizer_push_section (MpegTSPacketizer2 * packetizer, sub_buf = gst_buffer_create_sub (packet->buffer, data - GST_BUFFER_DATA (packet->buffer), packet->data_end - data); - stream = packetizer->streams[packet->pid]; if (stream == NULL) { stream = mpegts_packetizer_stream_new (); @@ -2356,7 +2361,7 @@ mpegts_packetizer_push_section (MpegTSPacketizer2 * packetizer, if (packet->payload_unit_start_indicator) { table_id = *data++; - /* subtable_extension should be read from 4th and 5th bytes only if + /* subtable_extension should be read from 4th and 5th bytes only if * section_syntax_indicator is 1 */ if ((data[0] & 0x80) == 0) subtable_extension = 0; @@ -2481,7 +2486,7 @@ _init_local (void) * @is_multibyte: Location where information whether it's a multibyte encoding * or not is stored * @returns: Name of encoding or NULL of encoding could not be detected. - * + * * The returned string should be freed with g_free () when no longer needed. */ static gchar * |