/* * vim: set sts=2 sw=2 et : * * License: LGPL-2.1+ * Copyright (c) 2014 Nirbheek Chauhan * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifndef _SST_LIB #define _SST_LIB #include #include #include typedef struct _TranscodeServerCtx TranscodeServerCtx; typedef struct _TranscodeClientCtx TranscodeClientCtx; enum stp_stream_status { STP_STATUS_NONE, STP_STATUS_STREAMING, STP_STATUS_FLUSHING, STP_STATUS_FINISHED, }; struct _TranscodeServerCtx { SoupMessage *msg; GstElement *pipeline; GstElement *appsrc; /* If the encoding is not chunked, we'll get multiple requests * with separate Content-Length headers on the same path */ SoupEncoding encoding; /* Set to TRUE when the incoming stream ends; let's us know if * we need to set the PUT response on EOS/ERROR on the pipeline, * and whether to reject further data when using a persistent * Content-Length + Content-Range PUT stream. */ enum stp_stream_status status; guint seconds_since_read; /* List of client contexts */ GList *clients; /* Reference to the parent context hash table */ GHashTable *parent_ctx_table; /* Reference to the key in the parent hash table */ char *path; }; struct _TranscodeClientCtx { /* We don't hold refs to any of these */ SoupMessage *msg; GstElement *appsink; GstPad *ghostsinkpad; gboolean keyframe_found; guint timeout_handler_id; gulong finished_handler_id; guint seconds_since_write; /* The transcode server context; we don't hold a ref to this */ TranscodeServerCtx *server_ctx; }; #ifdef ENCODE_DEBUG #define stp_print_status(...) g_print(__VA_ARGS__) #else #define stp_print_status(...) do {} while (0) #endif gboolean invoke_g_hash_table_remove (TranscodeServerCtx *ctx); gboolean invoke_g_free_client_context (TranscodeClientCtx *ctx); void stp_cleanup_transcode_server_ctx (TranscodeServerCtx *ctx); void stp_cleanup_transcode_client_ctx (TranscodeClientCtx *ctx); gboolean stp_on_gst_bus_message (GstBus *bus, GstMessage *msg, TranscodeServerCtx *ctx); gboolean stp_unref_gst_buffer (GstBuffer **buffer, guint idx, gpointer user_data); GstBuffer* stp_get_streamheader_from_caps (GstCaps *caps); GstBuffer* stp_get_gst_buffer (SoupBuffer *chunk); #endif /* _SST_LIB */