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;
}
示例#4
0
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
}
示例#10
0
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");
  }

}