Guest User

Untitled

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