static void gst_hls_sink2_handle_message (GstBin * bin, GstMessage * message) { GstHlsSink2 *sink = GST_HLS_SINK2_CAST (bin); switch (message->type) { case GST_MESSAGE_ELEMENT: { const GstStructure *s = gst_message_get_structure (message); if (message->src == GST_OBJECT_CAST (sink->splitmuxsink)) { if (gst_structure_has_name (s, "splitmuxsink-fragment-opened")) { g_free (sink->current_location); sink->current_location = g_strdup (gst_structure_get_string (s, "location")); gst_structure_get_clock_time (s, "running-time", &sink->current_running_time_start); } else if (gst_structure_has_name (s, "splitmuxsink-fragment-closed")) { GstClockTime running_time; gchar *entry_location; g_assert (strcmp (sink->current_location, gst_structure_get_string (s, "location")) == 0); gst_structure_get_clock_time (s, "running-time", &running_time); GST_INFO_OBJECT (sink, "COUNT %d", sink->index); if (sink->playlist_root == NULL) { entry_location = g_path_get_basename (sink->current_location); } else { gchar *name = g_path_get_basename (sink->current_location); entry_location = g_build_filename (sink->playlist_root, name, NULL); g_free (name); } gst_m3u8_playlist_add_entry (sink->playlist, entry_location, NULL, running_time - sink->current_running_time_start, sink->index++, FALSE); g_free (entry_location); gst_hls_sink2_write_playlist (sink); g_queue_push_tail (&sink->old_locations, g_strdup (sink->current_location)); while (g_queue_get_length (&sink->old_locations) > g_queue_get_length (sink->playlist->entries)) { gchar *old_location = g_queue_pop_head (&sink->old_locations); g_remove (old_location); g_free (old_location); } } } break; } case GST_MESSAGE_EOS:{ sink->playlist->end_list = TRUE; gst_hls_sink2_write_playlist (sink); break; } default: break; } GST_BIN_CLASS (parent_class)->handle_message (bin, message); }
static void gst_hls_sink_handle_message (GstBin * bin, GstMessage * message) { GstHlsSink *sink = GST_HLS_SINK_CAST (bin); switch (message->type) { case GST_MESSAGE_ELEMENT: { const char *filename; GstClockTime running_time, duration; gboolean discont = FALSE; gchar *entry_location; const GstStructure *structure; structure = gst_message_get_structure (message); if (strcmp (gst_structure_get_name (structure), "GstMultiFileSink")) break; filename = gst_structure_get_string (structure, "filename"); gst_structure_get_clock_time (structure, "running-time", &running_time); duration = running_time - sink->last_running_time; sink->last_running_time = running_time; GST_INFO_OBJECT (sink, "COUNT %d", sink->index); if (sink->playlist_root == NULL) entry_location = g_path_get_basename (filename); else { gchar *name = g_path_get_basename (filename); entry_location = g_build_filename (sink->playlist_root, name, NULL); g_free (name); } gst_m3u8_playlist_add_entry (sink->playlist, entry_location, NULL, duration, sink->index, discont); g_free (entry_location); gst_hls_sink_write_playlist (sink); /* multifilesink is starting a new file. It means that upstream sent a key * unit and we can schedule the next key unit now. */ sink->waiting_fku = FALSE; schedule_next_key_unit (sink); /* multifilesink is an internal implementation detail. If applications * need a notification, we should probably do our own message */ GST_DEBUG_OBJECT (bin, "dropping message %" GST_PTR_FORMAT, message); gst_message_unref (message); message = NULL; break; } case GST_MESSAGE_EOS:{ sink->playlist->end_list = TRUE; gst_hls_sink_write_playlist (sink); break; } default: break; } if (message) GST_BIN_CLASS (parent_class)->handle_message (bin, message); }