Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/gst/mpegdemux/mpegtspacketizer.c b/gst/mpegdemux/mpegtspacketizer.c
- index b986fa6..43b32c3 100644
- --- a/gst/mpegdemux/mpegtspacketizer.c
- +++ b/gst/mpegdemux/mpegtspacketizer.c
- @@ -1831,6 +1831,57 @@ error:
- return NULL;
- }
- +GstStructure *
- +mpegts_packetizer_parse_dsmcc (MpegTSPacketizer * packetizer,
- + MpegTSPacketizerSection * section)
- +{
- + GstStructure *dsmcc = NULL;
- + guint8 *data, *end;
- + guint16 table_id_extension;
- + guint8 section_number, last_section_number;
- + guint8 tmp;
- + gchar* struct_name;
- +
- + GST_DEBUG("dsmcc");
- + /* fixed header + CRC == 16 */
- + if (GST_BUFFER_SIZE (section->buffer) < 16) {
- + GST_WARNING ("PID %d invalid dsmcc size %d",
- + section->pid, section->section_length);
- + goto error;
- + }
- +
- + data = GST_BUFFER_DATA (section->buffer);
- + end = data + GST_BUFFER_SIZE (section->buffer);
- +
- + section->table_id = *data++;
- + section->section_length = GST_READ_UINT16_BE (data) & 0x0FFF;
- + data += 2;
- +
- + table_id_extension = GST_READ_UINT16_BE (data);
- + data += 2;
- +
- + tmp = *data++;
- + section->version_number = (tmp >> 1) & 0x1F;
- + section->current_next_indicator = tmp & 0x01;
- +
- + section_number = *data++;
- + last_section_number = *data++;
- +
- + struct_name = g_strdup ("dsmcc");
- + dsmcc = gst_structure_new (struct_name,
- + "table-id", G_TYPE_UINT, section->table_id,
- + "section-number", G_TYPE_UINT, section_number,
- + "last-section-number", G_TYPE_UINT, last_section_number,
- + "version-number", G_TYPE_UINT, section->version_number, NULL);
- + g_free (struct_name);
- +
- + return dsmcc;
- +error:
- + if (dsmcc)
- + gst_structure_free (dsmcc);
- + return NULL;
- +}
- +
- static gboolean
- remove_all (gpointer key, gpointer value, gpointer user_data)
- {
- diff --git a/gst/mpegdemux/mpegtspacketizer.h b/gst/mpegdemux/mpegtspacketizer.h
- index 97e15cf..bb7d3bf 100644
- --- a/gst/mpegdemux/mpegtspacketizer.h
- +++ b/gst/mpegdemux/mpegtspacketizer.h
- @@ -131,6 +131,8 @@ GstStructure *mpegts_packetizer_parse_sdt (MpegTSPacketizer *packetizer,
- MpegTSPacketizerSection *section);
- GstStructure *mpegts_packetizer_parse_eit (MpegTSPacketizer *packetizer,
- MpegTSPacketizerSection *section);
- +GstStructure *mpegts_packetizer_parse_dsmcc (MpegTSPacketizer *packetizer,
- + MpegTSPacketizerSection *section);
- G_END_DECLS
- diff --git a/gst/mpegdemux/mpegtsparse.c b/gst/mpegdemux/mpegtsparse.c
- index 976935f..807121c 100644
- --- a/gst/mpegdemux/mpegtsparse.c
- +++ b/gst/mpegdemux/mpegtsparse.c
- @@ -804,14 +804,15 @@ mpegts_parse_is_psi (MpegTSParse * parse, MpegTSPacketizerPacket * packet)
- 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
- 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65,
- 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71,
- - 0x72, 0x73, 0x7E, 0x7F, TABLE_ID_UNSET
- + 0x72, 0x73, 0x7E, 0x7F, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, TABLE_ID_UNSET
- };
- if (g_hash_table_lookup (parse->psi_pids,
- GINT_TO_POINTER ((gint) packet->pid)) != NULL)
- retval = TRUE;
- /* check is it is a pes pid */
- if (g_hash_table_lookup (parse->pes_pids,
- - GINT_TO_POINTER ((gint) packet->pid)) != NULL)
- + GINT_TO_POINTER ((gint) packet->pid)) != NULL &&
- + (*(packet->data) < 0x3A || *(packet->data) > 0x3E)) // hack to allow dsmcc pids as psi pids
- return FALSE;
- if (!retval) {
- if (packet->payload_unit_start_indicator) {
- @@ -1064,6 +1065,15 @@ mpegts_parse_apply_eit (MpegTSParse * parse,
- gst_structure_copy (eit_info)));
- }
- +static void
- +mpegts_parse_apply_dsmcc (MpegTSParse * parse,
- + guint16 dsmcc_pid, GstStructure * dsmcc_info)
- +{
- + gst_element_post_message (GST_ELEMENT_CAST (parse),
- + gst_message_new_element (GST_OBJECT (parse),
- + gst_structure_copy (dsmcc_info)));
- +}
- +
- static gboolean
- mpegts_parse_handle_psi (MpegTSParse * parse, MpegTSPacketizerSection * section)
- {
- @@ -1094,6 +1104,17 @@ mpegts_parse_handle_psi (MpegTSParse * parse, MpegTSPacketizerSection * section)
- res = FALSE;
- break;
- + case 0x3A:
- + case 0x3B:
- + case 0x3C:
- + case 0x3D:
- + case 0x3E:
- + structure = mpegts_packetizer_parse_dsmcc (parse->packetizer, section);
- + if (structure)
- + mpegts_parse_apply_dsmcc (parse, section->pid, structure);
- + else
- + res = FALSE;
- + break;
- case 0x40:
- /* NIT, actual network */
- case 0x41:
Add Comment
Please, Sign In to add comment