static gboolean mpegts_base_get_tags_from_eit (MpegTSBase * base, GstMpegtsSection * section) { const GstMpegtsEIT *eit; guint i; MpegTSBaseProgram *program; /* Early exit if it's not from the present/following table_id */ if (section->table_id != GST_MTS_TABLE_ID_EVENT_INFORMATION_ACTUAL_TS_PRESENT && section->table_id != GST_MTS_TABLE_ID_EVENT_INFORMATION_OTHER_TS_PRESENT) return TRUE; eit = gst_mpegts_section_get_eit (section); if (G_UNLIKELY (eit == NULL)) return FALSE; program = mpegts_base_get_program (base, section->subtable_extension); GST_DEBUG ("program_id:0x%04x, table_id:0x%02x, actual_stream:%d, present_following:%d, program:%p", section->subtable_extension, section->table_id, eit->actual_stream, eit->present_following, program); if (program && eit->present_following) { for (i = 0; i < eit->events->len; i++) { GstMpegtsEITEvent *event = g_ptr_array_index (eit->events, i); const GstMpegtsDescriptor *desc; if (event->running_status == RUNNING_STATUS_RUNNING) { program->event_id = event->event_id; if ((desc = gst_mpegts_find_descriptor (event->descriptors, GST_MTS_DESC_DVB_SHORT_EVENT))) { gchar *name; if (gst_mpegts_descriptor_parse_dvb_short_event (desc, NULL, &name, NULL)) { /* FIXME : Is it correct to post an event duration as a GST_TAG_DURATION ??? */ program->tags = gst_tag_list_new (GST_TAG_TITLE, name, GST_TAG_DURATION, event->duration * GST_SECOND, NULL); g_free (name); return TRUE; } } } } } return TRUE; }
static void dump_descriptors (GPtrArray * descriptors, guint spacing) { guint i; for (i = 0; i < descriptors->len; i++) { GstMpegTsDescriptor *desc = g_ptr_array_index (descriptors, i); g_printf ("%*s [descriptor 0x%02x (%s) length:%d]\n", spacing, "", desc->tag, descriptor_name (desc->tag), desc->length); if (DUMP_DESCRIPTORS) dump_memory_content (desc, spacing + 2); switch (desc->tag) { case GST_MTS_DESC_REGISTRATION: { const guint8 *data = desc->data + 2; #define SAFE_CHAR(a) (g_ascii_isprint(a) ? a : '.') g_printf ("%*s Registration : %c%c%c%c [%02x%02x%02x%02x]\n", spacing, "", SAFE_CHAR (data[0]), SAFE_CHAR (data[1]), SAFE_CHAR (data[2]), SAFE_CHAR (data[3]), data[0], data[1], data[2], data[3]); break; } case GST_MTS_DESC_DVB_NETWORK_NAME: { gchar *network_name; if (gst_mpegts_descriptor_parse_dvb_network_name (desc, &network_name)) { g_printf ("%*s Network Name : %s\n", spacing, "", network_name); g_free (network_name); } break; } case GST_MTS_DESC_DVB_CABLE_DELIVERY_SYSTEM: dump_cable_delivery_descriptor (desc, spacing + 2); break; case GST_MTS_DESC_DTG_LOGICAL_CHANNEL: dump_logical_channel_descriptor (desc, spacing + 2); break; case GST_MTS_DESC_DVB_SERVICE: { gchar *service_name, *provider_name; GstMpegTsDVBServiceType service_type; if (gst_mpegts_descriptor_parse_dvb_service (desc, &service_type, &service_name, &provider_name)) { g_printf ("%*s Service Descriptor, type:0x%02x (%s)\n", spacing, "", service_type, enum_name (GST_TYPE_MPEG_TS_DVB_SERVICE_TYPE, service_type)); g_printf ("%*s service_name : %s\n", spacing, "", service_name); g_printf ("%*s provider_name : %s\n", spacing, "", provider_name); g_free (service_name); g_free (provider_name); } break; } case GST_MTS_DESC_ISO_639_LANGUAGE: dump_iso_639_language (desc, spacing + 2); break; case GST_MTS_DESC_DVB_SHORT_EVENT: { gchar *language_code, *event_name, *text; if (gst_mpegts_descriptor_parse_dvb_short_event (desc, &language_code, &event_name, &text)) { g_printf ("%*s Short Event, language_code:%s\n", spacing, "", language_code); g_printf ("%*s event_name : %s\n", spacing, "", event_name); g_printf ("%*s text : %s\n", spacing, "", text); g_free (language_code); g_free (event_name); g_free (text); } } break; default: break; } } }