void gss_program_start (GssProgram * program) { GssProgramClass *program_class; GList *g; if (program->state == GSS_PROGRAM_STATE_STARTING || program->state == GSS_PROGRAM_STATE_RUNNING || program->state == GSS_PROGRAM_STATE_STOPPING) { return; } if (!program->enabled || !GSS_OBJECT_SERVER (program) || !GSS_OBJECT_SERVER (program)->enable_programs) { return; } GST_DEBUG_OBJECT (program, "start"); gss_program_set_state (program, GSS_PROGRAM_STATE_STARTING); for (g = program->streams; g; g = g_list_next (g)) { GssStream *stream = GSS_STREAM (g->data); gss_stream_add_resources (stream); } program_class = GSS_PROGRAM_GET_CLASS (program); if (program_class->start) { program_class->start (program); } }
static void gss_program_add_resources (GssProgram * program) { char *s; s = g_strdup_printf ("/%s", GSS_OBJECT_NAME (program)); program->resource = gss_server_add_resource (GSS_OBJECT_SERVER (program), s, GSS_RESOURCE_UI, GSS_TEXT_HTML, gss_program_get_resource, NULL, gss_config_post_resource, program); g_free (s); s = g_strdup_printf ("/%s.frag", GSS_OBJECT_NAME (program)); gss_server_add_resource (GSS_OBJECT_SERVER (program), s, GSS_RESOURCE_UI, GSS_TEXT_PLAIN, gss_program_frag_resource, NULL, NULL, program); g_free (s); s = g_strdup_printf ("/%s.list", GSS_OBJECT_NAME (program)); gss_server_add_resource (GSS_OBJECT_SERVER (program), s, GSS_RESOURCE_UI, GSS_TEXT_PLAIN, gss_program_list_resource, NULL, NULL, program); g_free (s); s = g_strdup_printf ("/%s-snapshot.png", GSS_OBJECT_NAME (program)); gss_server_add_resource (GSS_OBJECT_SERVER (program), s, GSS_RESOURCE_UI, "image/png", gss_program_png_resource, NULL, NULL, program); g_free (s); s = g_strdup_printf ("/%s-snapshot.jpeg", GSS_OBJECT_NAME (program)); gss_server_add_resource (GSS_OBJECT_SERVER (program), s, 0, "image/jpeg", gss_program_jpeg_resource, NULL, NULL, program); g_free (s); }
void gss_server_remove_program (GssServer * server, GssProgram * program) { g_return_if_fail (GSS_IS_SERVER (server)); g_return_if_fail (GSS_IS_PROGRAM (program)); gss_server_remove_resources_by_priv (server, program); server->programs = g_list_remove (server->programs, program); GSS_OBJECT_SERVER (program) = NULL; }
GssRtspStream * gss_rtsp_stream_new (GssStream * stream) { GssRtspStream *rtsp_stream; rtsp_stream = g_new0 (GssRtspStream, 1); rtsp_stream->stream = stream; rtsp_stream->server = GSS_OBJECT_SERVER (stream->program)->rtsp_server; return rtsp_stream; }
void gss_server_add_program_simple (GssServer * server, GssProgram * program) { GssProgramClass *program_class; server->programs = g_list_append (server->programs, program); GSS_OBJECT_SERVER (program) = server; program_class = GSS_PROGRAM_GET_CLASS (program); if (program_class->add_resources) { program_class->add_resources (program); } }
static void gss_server_attach (GssObject * object, GssServer * x_server) { GssServer *server = GSS_SERVER (object); GssResource *r; r = gss_server_add_resource (GSS_OBJECT_SERVER (object), "/admin/server", GSS_RESOURCE_ADMIN, GSS_TEXT_HTML, gss_server_get_resource, NULL, gss_server_post_resource, server); r->name = g_strdup ("Server"); gss_module_set_admin_resource (GSS_MODULE (server), r); }
void gss_server_add_module (GssServer * server, GssModule * module) { GssObjectClass *object_class = GSS_OBJECT_GET_CLASS (module); g_return_if_fail (GSS_IS_SERVER (server)); g_return_if_fail (GSS_IS_MODULE (module)); server->modules = g_list_append (server->modules, module); GSS_OBJECT_SERVER (module) = server; if (object_class->attach) { object_class->attach (GSS_OBJECT (module), server); } }
static gboolean idle_state_enable (gpointer ptr) { GssProgram *program = GSS_PROGRAM (ptr); gboolean enabled; program->state_idle = 0; enabled = (program->enabled && GSS_OBJECT_SERVER (program)->enable_programs); if (program->state == GSS_PROGRAM_STATE_STOPPED && enabled) { gss_program_start (program); } else if (program->state == GSS_PROGRAM_STATE_RUNNING && !enabled) { gss_program_stop (program); } return FALSE; }
void gss_program_set_state (GssProgram * program, GssProgramState state) { #if 0 gboolean enabled; enabled = (program->enabled && GSS_OBJECT_SERVER (program)->enable_programs); #endif program->state = state; #if 0 if ((program->state == GSS_PROGRAM_STATE_STOPPED && enabled) || (program->state == GSS_PROGRAM_STATE_RUNNING && !enabled)) { if (!program->state_idle) { program->state_idle = g_idle_add (idle_state_enable, program); } } #endif }
void gss_vod_setup (GssServer * server) { GDir *dir; dir = g_dir_open (server->archive_dir, 0, NULL); if (dir) { const gchar *name = g_dir_read_name (dir); while (name) { if (g_str_has_suffix (name, ".webm")) { GssProgram *program; GssStream *stream; char *s; program = gss_server_add_program (server, name); program->is_archive = TRUE; stream = gss_stream_new (GSS_STREAM_TYPE_WEBM, 640, 360, 600); gss_program_add_stream (program, stream); s = g_strdup_printf ("%s-%dx%d-%dkbps%s.%s", GSS_OBJECT_NAME (program), stream->width, stream->height, stream->bitrate / 1000, gss_stream_type_get_mod (stream->type), gss_stream_type_get_ext (stream->type)); gst_object_set_name (GST_OBJECT (stream), s); g_free (s); s = g_strdup_printf ("/%s", GSS_OBJECT_NAME (stream)); gss_server_add_resource (GSS_OBJECT_SERVER (program), s, GSS_RESOURCE_HTTP_ONLY, gss_stream_type_get_content_type (stream->type), vod_resource_chunked, NULL, NULL, program); g_free (s); } name = g_dir_read_name (dir); } g_dir_close (dir); } }
void gss_program_add_video_block (GssProgram * program, GssTransaction * t, int max_width) { GString *s = t->s; GList *g; int width = 0; int height = 0; int flash_only = TRUE; if (program->state != GSS_PROGRAM_STATE_RUNNING) { GSS_P ("<img src='/offline.jpg' alt='offline'>\n"); return; } if (program->streams == NULL) { if (program->jpegsink) { gss_html_append_image_printf (s, "/%s-snapshot.jpeg", 0, 0, "snapshot image", GSS_OBJECT_NAME (program)); } else { GSS_P ("<img src='/no-snapshot.jpg' alt='no snapshot'>\n"); } } for (g = program->streams; g; g = g_list_next (g)) { GssStream *stream = g->data; if (stream->width > width) width = stream->width; if (stream->height > height) height = stream->height; if (stream->type != GSS_STREAM_TYPE_FLV_H264BASE_AAC) { flash_only = FALSE; } } if (max_width != 0 && width > max_width) { height = max_width * 9 / 16; width = max_width; } if (GSS_OBJECT_SERVER (program)->enable_html5_video && !flash_only) { GSS_P ("<video controls=\"controls\" autoplay=\"autoplay\" " "id=video width=\"%d\" height=\"%d\">\n", width, height); for (g = g_list_last (program->streams); g; g = g_list_previous (g)) { GssStream *stream = g->data; if (stream->type == GSS_STREAM_TYPE_WEBM) { GSS_P ("<source src=\"%s\" type='video/webm; codecs=\"vp8, vorbis\"'>\n", stream->location); } } for (g = g_list_last (program->streams); g; g = g_list_previous (g)) { GssStream *stream = g->data; if (stream->type == GSS_STREAM_TYPE_OGG_THEORA_VORBIS) { GSS_P ("<source src=\"%s\" type='video/ogg; codecs=\"theora, vorbis\"'>\n", stream->location); } } for (g = g_list_last (program->streams); g; g = g_list_previous (g)) { GssStream *stream = g->data; if (stream->type == GSS_STREAM_TYPE_M2TS_H264BASE_AAC || stream->type == GSS_STREAM_TYPE_M2TS_H264MAIN_AAC) { GSS_P ("<source src=\"/%s.m3u8\" >\n", GSS_OBJECT_NAME (program)); break; } } } if (GSS_OBJECT_SERVER (program)->enable_cortado) { for (g = program->streams; g; g = g_list_next (g)) { GssStream *stream = g->data; if (stream->type == GSS_STREAM_TYPE_OGG_THEORA_VORBIS) { GSS_P ("<applet code=\"com.fluendo.player.Cortado.class\"\n" " archive=\"/cortado.jar\" width=\"%d\" height=\"%d\">\n" " <param name=\"url\" value=\"%s\"></param>\n" "</applet>\n", width, height, stream->location); break; } } } if (GSS_OBJECT_SERVER (program)->enable_flash) { for (g = program->streams; g; g = g_list_next (g)) { GssStream *stream = g->data; if (stream->type == GSS_STREAM_TYPE_FLV_H264BASE_AAC) { if (t->server->enable_osplayer) { GSS_P (" <object width='%d' height='%d' id='flvPlayer' " "type=\"application/x-shockwave-flash\" " "data=\"OSplayer.swf\">\n" " <param name='allowFullScreen' value='true'>\n" " <param name=\"allowScriptAccess\" value=\"always\"> \n" " <param name=\"movie\" value=\"OSplayer.swf\"> \n" " <param name=\"flashvars\" value=\"" "movie=%s" "&btncolor=0x333333" "&accentcolor=0x31b8e9" "&txtcolor=0xdddddd" "&volume=30" "&autoload=on" "&autoplay=off" "&vTitle=TITLE" "&showTitle=yes\">\n", width, height + 24, stream->location); if (program->enable_snapshot) { gss_html_append_image_printf (s, "/%s-snapshot.png", 0, 0, "snapshot image", GSS_OBJECT_NAME (program)); } GSS_P (" </object>\n"); } else if (t->server->enable_flowplayer) { GSS_P ("<a href='%s' style='display:block;width:%dpx;height:%dpx' id='player'>\n", stream->location, width, height); GSS_P ("Click to play video.\n"); #if 0 if (program->enable_snapshot) { gss_html_append_image_printf (s, "/%s-snapshot.png", 0, 0, "snapshot image", GSS_OBJECT_NAME (program)); } #endif GSS_P ("</a>\n"); } break; } } } else { if (program->enable_snapshot) { gss_html_append_image_printf (s, "/%s-snapshot.png", 0, 0, "snapshot image", GSS_OBJECT_NAME (program)); } } if (GSS_OBJECT_SERVER (program)->enable_html5_video && !flash_only) { GSS_A ("</video>\n"); } }