📄 swfdec_net_stream.c
字号:
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 + -