⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 swfdec_net_stream.c

📁 Swfdec is a decoder/renderer for Macromedia Flash animations. The decoding and rendering engine is
💻 C
📖 第 1 页 / 共 2 页
字号:
  SwfdecNetStream *stream = SWFDEC_NET_STREAM (target);  guint first, last;  swfdec_flv_decoder_eof (stream->flvdecoder);  swfdec_net_stream_onstatus (stream, SWFDEC_AS_STR_NetStream_Buffer_Flush,      SWFDEC_AS_STR_status);  swfdec_net_stream_video_goto (stream, stream->current_time);  stream->buffering = FALSE;  if (swfdec_flv_decoder_get_video_info (stream->flvdecoder, &first, &last) &&      stream->current_time + stream->buffer_time <= last) {    swfdec_net_stream_onstatus (stream, SWFDEC_AS_STR_NetStream_Buffer_Full,	SWFDEC_AS_STR_status);  }  swfdec_net_stream_loader_target_recheck (stream);}static voidswfdec_net_stream_loader_target_init (SwfdecLoaderTargetInterface *iface){  iface->get_player = swfdec_net_stream_loader_target_get_player;  iface->parse = swfdec_net_stream_loader_target_parse;  iface->eof = swfdec_net_stream_loader_target_eof;  iface->error = swfdec_net_stream_loader_target_error;}/*** SWFDEC VIDEO MOVIE INPUT ***/static voidswfdec_net_stream_input_connect (SwfdecVideoMovieInput *input, SwfdecVideoMovie *movie){  SwfdecNetStream *stream = SWFDEC_NET_STREAM ((guchar *) input - G_STRUCT_OFFSET (SwfdecNetStream, input));  stream->movies = g_list_prepend (stream->movies, movie);  g_object_ref (stream);}static voidswfdec_net_stream_input_disconnect (SwfdecVideoMovieInput *input, SwfdecVideoMovie *movie){  SwfdecNetStream *stream = SWFDEC_NET_STREAM ((guchar *) input - G_STRUCT_OFFSET (SwfdecNetStream, input));  stream->movies = g_list_remove (stream->movies, movie);  g_object_unref (stream);}/*** SWFDEC_NET_STREAM ***/G_DEFINE_TYPE_WITH_CODE (SwfdecNetStream, swfdec_net_stream, SWFDEC_TYPE_AS_OBJECT,    G_IMPLEMENT_INTERFACE (SWFDEC_TYPE_LOADER_TARGET, swfdec_net_stream_loader_target_init))static voidswfdec_net_stream_dispose (GObject *object){  SwfdecNetStream *stream = SWFDEC_NET_STREAM (object);  swfdec_net_stream_set_playing (stream, FALSE);  if (stream->surface) {    cairo_surface_destroy (stream->surface);    stream->surface = NULL;  }  if (stream->decoder) {    swfdec_video_decoder_free (stream->decoder);    stream->decoder = NULL;  }  swfdec_net_stream_set_loader (stream, NULL);  g_assert (stream->movies == NULL);  G_OBJECT_CLASS (swfdec_net_stream_parent_class)->dispose (object);}static gbooleanswfdec_net_stream_get_variable (SwfdecAsObject *object, SwfdecAsObject *orig,    const char *variable, SwfdecAsValue *val, guint *flags){  SwfdecNetStream *stream;  if (SWFDEC_AS_OBJECT_CLASS (swfdec_net_stream_parent_class)->get (object, orig, variable, val, flags))    return TRUE;  stream = SWFDEC_NET_STREAM (object);  /* FIXME: need case insensitive comparisons? */  if (variable == SWFDEC_AS_STR_time) {    guint msecs;    if (stream->flvdecoder == NULL ||	!swfdec_flv_decoder_get_video_info (stream->flvdecoder, &msecs, NULL)) {      SWFDEC_AS_VALUE_SET_INT (val, 0);    } else {      if (msecs >= stream->current_time)	msecs = 0;      else 	msecs = stream->current_time - msecs;    }    SWFDEC_AS_VALUE_SET_NUMBER (val, msecs / 1000.);    *flags = 0;    return TRUE;  } else if (variable == SWFDEC_AS_STR_bytesLoaded) {    if (stream->loader == NULL)      SWFDEC_AS_VALUE_SET_INT (val, 0);    else      SWFDEC_AS_VALUE_SET_INT (val, swfdec_loader_get_loaded (stream->loader));    *flags = 0;    return TRUE;  } else if (variable == SWFDEC_AS_STR_bytesTotal) {    guint bytes;    if (stream->loader == NULL) {      bytes = 0;    } else {       bytes = swfdec_loader_get_size (stream->loader);      if (bytes == 0)	bytes = swfdec_loader_get_loaded (stream->loader);    }    SWFDEC_AS_VALUE_SET_INT (val, bytes);    *flags = 0;    return TRUE;  }  return FALSE;}static voidswfdec_net_stream_mark (SwfdecAsObject *object){  SwfdecNetStream *stream = SWFDEC_NET_STREAM (object);  swfdec_as_object_mark (SWFDEC_AS_OBJECT (stream->conn));  SWFDEC_AS_OBJECT_CLASS (swfdec_net_stream_parent_class)->mark (object);}static voidswfdec_net_stream_class_init (SwfdecNetStreamClass *klass){  GObjectClass *object_class = G_OBJECT_CLASS (klass);  SwfdecAsObjectClass *asobject_class = SWFDEC_AS_OBJECT_CLASS (klass);  object_class->dispose = swfdec_net_stream_dispose;  asobject_class->get = swfdec_net_stream_get_variable;  asobject_class->mark = swfdec_net_stream_mark;}static voidswfdec_net_stream_init (SwfdecNetStream *stream){  stream->input.connect = swfdec_net_stream_input_connect;  stream->input.disconnect = swfdec_net_stream_input_disconnect;  stream->buffer_time = 100; /* msecs */}SwfdecNetStream *swfdec_net_stream_new (SwfdecNetConnection *conn){  SwfdecAsContext *context;  SwfdecNetStream *stream;    g_return_val_if_fail (SWFDEC_IS_NET_CONNECTION (conn), NULL);  context = SWFDEC_AS_OBJECT (conn)->context;  if (!swfdec_as_context_use_mem (context, sizeof (SwfdecNetStream)))    return NULL;  stream = g_object_new (SWFDEC_TYPE_NET_STREAM, NULL);  swfdec_as_object_add (SWFDEC_AS_OBJECT (stream), context, sizeof (SwfdecNetStream));  stream->conn = conn;  return stream;}voidswfdec_net_stream_set_url (SwfdecNetStream *stream, const char *url){  SwfdecLoader *loader;  g_return_if_fail (SWFDEC_IS_NET_STREAM (stream));  g_return_if_fail (url != NULL);  /* FIXME: use the connection once connections are implemented */  loader = swfdec_player_load (SWFDEC_PLAYER (SWFDEC_AS_OBJECT (stream)->context), url);  swfdec_net_stream_set_loader (stream, loader);  g_object_unref (loader);}voidswfdec_net_stream_set_loader (SwfdecNetStream *stream, SwfdecLoader *loader){  g_return_if_fail (SWFDEC_IS_NET_STREAM (stream));  g_return_if_fail (loader == NULL || SWFDEC_IS_LOADER (loader));  if (stream->loader) {    swfdec_loader_set_target (stream->loader, NULL);    swfdec_loader_close (stream->loader);    g_object_unref (stream->loader);  }  if (stream->flvdecoder) {    g_object_unref (stream->flvdecoder);    stream->flvdecoder = NULL;  }  stream->loader = loader;  stream->buffering = TRUE;  if (loader) {    g_object_ref (loader);    swfdec_loader_set_target (loader, SWFDEC_LOADER_TARGET (stream));  }  swfdec_net_stream_set_playing (stream, TRUE);}voidswfdec_net_stream_set_playing (SwfdecNetStream *stream, gboolean playing){  g_return_if_fail (SWFDEC_IS_NET_STREAM (stream));  stream->playing = playing;  swfdec_net_stream_update_playing (stream);}gbooleanswfdec_net_stream_get_playing (SwfdecNetStream *stream){  g_return_val_if_fail (SWFDEC_IS_NET_STREAM (stream), FALSE);  return stream->playing;}voidswfdec_net_stream_set_buffer_time (SwfdecNetStream *stream, double secs){  g_return_if_fail (SWFDEC_IS_NET_STREAM (stream));  /* FIXME: is this correct? */  if (secs <= 0)    return;  stream->buffer_time = secs * 1000;}doubleswfdec_net_stream_get_buffer_time (SwfdecNetStream *stream){  g_return_val_if_fail (SWFDEC_IS_NET_STREAM (stream), 0.1);  return (double) stream->buffer_time / 1000.0;}voidswfdec_net_stream_seek (SwfdecNetStream *stream, double secs){  guint first, last, msecs;  g_return_if_fail (SWFDEC_IS_NET_STREAM (stream));  if (stream->flvdecoder == NULL)    return;  if (!isfinite (secs) || secs < 0) {    SWFDEC_ERROR ("seeking to %g doesn't work", secs);    return;  }  if (!swfdec_flv_decoder_get_video_info (stream->flvdecoder, &first, &last)) {    SWFDEC_ERROR ("FIXME: implement seeking in audio only NetStream");    return;  }  msecs = secs * 1000;  msecs += first;  if (msecs > last)    msecs = last;  swfdec_flv_decoder_get_video (stream->flvdecoder, msecs, TRUE, NULL, &msecs, NULL);  swfdec_net_stream_video_goto (stream, msecs);  /* FIXME: this needs to be implemented correctly, but requires changes to audio handling:   * - creating a new audio stream will cause attachAudio scripts to lose information    * - implementing seek on audio stream requires a SwfdecAudio::changed signal so audio   *   backends can react correctly.   */  if (stream->audio) {    SWFDEC_WARNING ("FIXME: restarting audio after seek");    swfdec_audio_remove (stream->audio);    g_object_unref (stream->audio);    stream->audio = swfdec_audio_flv_new (SWFDEC_PLAYER (SWFDEC_AS_OBJECT (stream)->context), 	stream->flvdecoder, stream->current_time);  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -