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_eit (GstMpegTsSection * section) { const GstMpegTsEIT *eit = gst_mpegts_section_get_eit (section); guint i, len; g_assert (eit); g_printf (" service_id : 0x%04x\n", section->subtable_extension); g_printf (" transport_stream_id : 0x%04x\n", eit->transport_stream_id); g_printf (" original_network_id : 0x%04x\n", eit->original_network_id); g_printf (" segment_last_section_number:0x%02x, last_table_id:0x%02x\n", eit->segment_last_section_number, eit->last_table_id); g_printf (" actual_stream : %s, present_following : %s\n", eit->actual_stream ? "TRUE" : "FALSE", eit->present_following ? "TRUE" : "FALSE"); len = eit->events->len; g_printf (" %d Event(s):\n", len); for (i = 0; i < len; i++) { gchar *tmp = (gchar *) "<NO TIME>"; GstMpegTsEITEvent *event = g_ptr_array_index (eit->events, i); if (event->start_time) tmp = gst_date_time_to_iso8601_string (event->start_time); g_printf (" event_id:0x%04x, start_time:%s, duration:%" GST_TIME_FORMAT "\n", event->event_id, tmp, GST_TIME_ARGS (event->duration * GST_SECOND)); g_printf (" running_status:0x%02x (%s), free_CA_mode:%d (%s)\n", event->running_status, enum_name (GST_TYPE_MPEG_TS_RUNNING_STATUS, event->running_status), event->free_CA_mode, event->free_CA_mode ? "MAYBE SCRAMBLED" : "NOT SCRAMBLED"); if (event->start_time) g_free (tmp); dump_descriptors (event->descriptors, 9); } }