Guest User

Untitled

a guest
Jun 22nd, 2018
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.45 KB | None | 0 0
  1. diff --git a/gst/mpegdemux/mpegtspacketizer.c b/gst/mpegdemux/mpegtspacketizer.c
  2. index b986fa6..43b32c3 100644
  3. --- a/gst/mpegdemux/mpegtspacketizer.c
  4. +++ b/gst/mpegdemux/mpegtspacketizer.c
  5. @@ -1831,6 +1831,57 @@ error:
  6. return NULL;
  7. }
  8.  
  9. +GstStructure *
  10. +mpegts_packetizer_parse_dsmcc (MpegTSPacketizer * packetizer,
  11. + MpegTSPacketizerSection * section)
  12. +{
  13. + GstStructure *dsmcc = NULL;
  14. + guint8 *data, *end;
  15. + guint16 table_id_extension;
  16. + guint8 section_number, last_section_number;
  17. + guint8 tmp;
  18. + gchar* struct_name;
  19. +
  20. + GST_DEBUG("dsmcc");
  21. + /* fixed header + CRC == 16 */
  22. + if (GST_BUFFER_SIZE (section->buffer) < 16) {
  23. + GST_WARNING ("PID %d invalid dsmcc size %d",
  24. + section->pid, section->section_length);
  25. + goto error;
  26. + }
  27. +
  28. + data = GST_BUFFER_DATA (section->buffer);
  29. + end = data + GST_BUFFER_SIZE (section->buffer);
  30. +
  31. + section->table_id = *data++;
  32. + section->section_length = GST_READ_UINT16_BE (data) & 0x0FFF;
  33. + data += 2;
  34. +
  35. + table_id_extension = GST_READ_UINT16_BE (data);
  36. + data += 2;
  37. +
  38. + tmp = *data++;
  39. + section->version_number = (tmp >> 1) & 0x1F;
  40. + section->current_next_indicator = tmp & 0x01;
  41. +
  42. + section_number = *data++;
  43. + last_section_number = *data++;
  44. +
  45. + struct_name = g_strdup ("dsmcc");
  46. + dsmcc = gst_structure_new (struct_name,
  47. + "table-id", G_TYPE_UINT, section->table_id,
  48. + "section-number", G_TYPE_UINT, section_number,
  49. + "last-section-number", G_TYPE_UINT, last_section_number,
  50. + "version-number", G_TYPE_UINT, section->version_number, NULL);
  51. + g_free (struct_name);
  52. +
  53. + return dsmcc;
  54. +error:
  55. + if (dsmcc)
  56. + gst_structure_free (dsmcc);
  57. + return NULL;
  58. +}
  59. +
  60. static gboolean
  61. remove_all (gpointer key, gpointer value, gpointer user_data)
  62. {
  63. diff --git a/gst/mpegdemux/mpegtspacketizer.h b/gst/mpegdemux/mpegtspacketizer.h
  64. index 97e15cf..bb7d3bf 100644
  65. --- a/gst/mpegdemux/mpegtspacketizer.h
  66. +++ b/gst/mpegdemux/mpegtspacketizer.h
  67. @@ -131,6 +131,8 @@ GstStructure *mpegts_packetizer_parse_sdt (MpegTSPacketizer *packetizer,
  68. MpegTSPacketizerSection *section);
  69. GstStructure *mpegts_packetizer_parse_eit (MpegTSPacketizer *packetizer,
  70. MpegTSPacketizerSection *section);
  71. +GstStructure *mpegts_packetizer_parse_dsmcc (MpegTSPacketizer *packetizer,
  72. + MpegTSPacketizerSection *section);
  73.  
  74. G_END_DECLS
  75.  
  76. diff --git a/gst/mpegdemux/mpegtsparse.c b/gst/mpegdemux/mpegtsparse.c
  77. index 976935f..807121c 100644
  78. --- a/gst/mpegdemux/mpegtsparse.c
  79. +++ b/gst/mpegdemux/mpegtsparse.c
  80. @@ -804,14 +804,15 @@ mpegts_parse_is_psi (MpegTSParse * parse, MpegTSPacketizerPacket * packet)
  81. 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
  82. 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65,
  83. 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71,
  84. - 0x72, 0x73, 0x7E, 0x7F, TABLE_ID_UNSET
  85. + 0x72, 0x73, 0x7E, 0x7F, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, TABLE_ID_UNSET
  86. };
  87. if (g_hash_table_lookup (parse->psi_pids,
  88. GINT_TO_POINTER ((gint) packet->pid)) != NULL)
  89. retval = TRUE;
  90. /* check is it is a pes pid */
  91. if (g_hash_table_lookup (parse->pes_pids,
  92. - GINT_TO_POINTER ((gint) packet->pid)) != NULL)
  93. + GINT_TO_POINTER ((gint) packet->pid)) != NULL &&
  94. + (*(packet->data) < 0x3A || *(packet->data) > 0x3E)) // hack to allow dsmcc pids as psi pids
  95. return FALSE;
  96. if (!retval) {
  97. if (packet->payload_unit_start_indicator) {
  98. @@ -1064,6 +1065,15 @@ mpegts_parse_apply_eit (MpegTSParse * parse,
  99. gst_structure_copy (eit_info)));
  100. }
  101.  
  102. +static void
  103. +mpegts_parse_apply_dsmcc (MpegTSParse * parse,
  104. + guint16 dsmcc_pid, GstStructure * dsmcc_info)
  105. +{
  106. + gst_element_post_message (GST_ELEMENT_CAST (parse),
  107. + gst_message_new_element (GST_OBJECT (parse),
  108. + gst_structure_copy (dsmcc_info)));
  109. +}
  110. +
  111. static gboolean
  112. mpegts_parse_handle_psi (MpegTSParse * parse, MpegTSPacketizerSection * section)
  113. {
  114. @@ -1094,6 +1104,17 @@ mpegts_parse_handle_psi (MpegTSParse * parse, MpegTSPacketizerSection * section)
  115. res = FALSE;
  116.  
  117. break;
  118. + case 0x3A:
  119. + case 0x3B:
  120. + case 0x3C:
  121. + case 0x3D:
  122. + case 0x3E:
  123. + structure = mpegts_packetizer_parse_dsmcc (parse->packetizer, section);
  124. + if (structure)
  125. + mpegts_parse_apply_dsmcc (parse, section->pid, structure);
  126. + else
  127. + res = FALSE;
  128. + break;
  129. case 0x40:
  130. /* NIT, actual network */
  131. case 0x41:
Add Comment
Please, Sign In to add comment