diff options
-rw-r--r-- | src/lib.c | 33 |
1 files changed, 31 insertions, 2 deletions
@@ -3,6 +3,9 @@ #include "lib.h" +static void +stp_shutdown_client (TranscodeClientCtx *ctx); + gboolean stp_on_gst_bus_message (GstBus *bus, GstMessage *msg, @@ -37,12 +40,15 @@ stp_on_gst_bus_message (GstBus *bus, return TRUE; } +/* When the incoming stream reaches EOS, we call this + * which initiates a shutdown for all clients and then + * the server itself */ void stp_cleanup_transcode_server_ctx (TranscodeServerCtx *ctx) { g_print (">>> Doing server cleanup\n"); - g_list_foreach (ctx->clients, (GFunc)stp_cleanup_transcode_client_ctx, NULL); + g_list_foreach (ctx->clients, (GFunc)stp_shutdown_client, NULL); g_list_free (ctx->clients); /* Cleanup gstreamer pipeline */ @@ -62,7 +68,7 @@ pad_blocked_cleanup_cb (GstPad *srcpad, GstElement *sinkbin = GST_ELEMENT (gst_element_get_parent (ctx->appsink)); g_print ("."); - /* Remove the probe, XXX: hence unblocking the pipeline? */ + /* Remove the probe */ gst_pad_remove_probe (srcpad, GST_PAD_PROBE_INFO_ID (info)); tee = gst_pad_get_parent_element (srcpad); @@ -81,6 +87,10 @@ pad_blocked_cleanup_cb (GstPad *srcpad, return GST_PAD_PROBE_OK; } +/* When a client leaves or is kicked, we set the response status + * and then call cleanup here. This involves removing the appsink + * branch for the client from the pipeline, and then freeing the + * context. */ void stp_cleanup_transcode_client_ctx (TranscodeClientCtx *ctx) { @@ -104,6 +114,25 @@ stp_cleanup_transcode_client_ctx (TranscodeClientCtx *ctx) g_print ("."); } +/* When shutting down a client due to a server shutdown, we + * don't need to bother with removing the appsink branch of + * the pipeline, and the response is set by the "eos" callback + * on the appsink, so we just free the context */ +static void +stp_shutdown_client (TranscodeClientCtx *ctx) +{ + TranscodeServerCtx *server_ctx = ctx->server_ctx; + + g_print (">>> Doing client cleanup on server shutdown\n"); + + g_source_remove (ctx->timeout_handler_id); + + server_ctx->clients = g_list_remove (server_ctx->clients, ctx); + + gst_object_unref (ctx->appsink); + g_free (ctx); +} + /* Returns a copy of the streamheader GstBuffer */ GstBuffer* stp_get_streamheader_from_caps (GstCaps *caps) |