[Swfdec] 5 commits - configure.ac doc/Makefile.am
doc/swfdec-sections.txt libswfdec/swfdec_js_net_stream.c
libswfdec/swfdec_loader.c libswfdec/swfdec_loader.h
libswfdec/swfdec_net_stream.c
Benjamin Otte
company at kemper.freedesktop.org
Tue Mar 20 15:47:26 PDT 2007
configure.ac | 2
doc/Makefile.am | 1
doc/swfdec-sections.txt | 3 +
libswfdec/swfdec_js_net_stream.c | 32 ++++++++++++++-
libswfdec/swfdec_loader.c | 81 ++++++++++++++++++++++++++++++++++++++-
libswfdec/swfdec_loader.h | 5 ++
libswfdec/swfdec_net_stream.c | 5 ++
7 files changed, 125 insertions(+), 4 deletions(-)
New commits:
diff-tree badb4883c0eff1236bf7698b759b04355fa9999c (from 6eeb97209e5b60af1dd930ad7063810c73c21654)
Author: Benjamin Otte <otte at gnome.org>
Date: Tue Mar 20 23:46:58 2007 +0100
implement swfdec_loader_get_loaded to query the already loaded amount of bytes
diff --git a/doc/swfdec-sections.txt b/doc/swfdec-sections.txt
index 26a98ab..f8a4514 100644
--- a/doc/swfdec-sections.txt
+++ b/doc/swfdec-sections.txt
@@ -22,8 +22,9 @@ swfdec_loader_new_from_file
swfdec_loader_push
swfdec_loader_eof
swfdec_loader_error
-swfdec_loader_get_size
swfdec_loader_set_size
+swfdec_loader_get_size
+swfdec_loader_get_loaded
swfdec_loader_get_filename
swfdec_loader_get_data_type
<SUBSECTION Standard>
diff --git a/libswfdec/swfdec_loader.c b/libswfdec/swfdec_loader.c
index 1fd0e65..69c460f 100644
--- a/libswfdec/swfdec_loader.c
+++ b/libswfdec/swfdec_loader.c
@@ -76,7 +76,8 @@ enum {
PROP_ERROR,
PROP_EOF,
PROP_DATA_TYPE,
- PROP_SIZE
+ PROP_SIZE,
+ PROP_LOADED
};
G_DEFINE_ABSTRACT_TYPE (SwfdecLoader, swfdec_loader, G_TYPE_OBJECT)
@@ -100,6 +101,9 @@ swfdec_loader_get_property (GObject *obj
case PROP_SIZE:
g_value_set_ulong (value, loader->size);
break;
+ case PROP_LOADED:
+ g_value_set_ulong (value, swfdec_loader_get_loaded (loader));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
break;
@@ -163,6 +167,9 @@ swfdec_loader_class_init (SwfdecLoaderCl
g_object_class_install_property (object_class, PROP_SIZE,
g_param_spec_ulong ("size", "size", "amount of bytes in loader",
0, G_MAXULONG, 0, G_PARAM_READWRITE));
+ g_object_class_install_property (object_class, PROP_SIZE,
+ g_param_spec_ulong ("loaded", "loaded", "bytes already loaded",
+ 0, G_MAXULONG, 0, G_PARAM_READWRITE));
}
static void
@@ -420,6 +427,7 @@ swfdec_loader_push (SwfdecLoader *loader
g_return_if_fail (buffer != NULL);
swfdec_buffer_queue_push (loader->queue, buffer);
+ g_object_notify (G_OBJECT (loader), "loaded");
swfdec_loader_parse (loader);
}
@@ -437,8 +445,7 @@ swfdec_loader_eof (SwfdecLoader *loader)
loader->eof = TRUE;
if (loader->size == 0) {
- gulong bytes = swfdec_buffer_queue_get_offset (loader->queue) +
- swfdec_buffer_queue_get_depth (loader->queue);
+ gulong bytes = swfdec_loader_get_loaded (loader);
if (bytes)
swfdec_loader_set_size (loader, bytes);
}
@@ -568,6 +575,24 @@ swfdec_loader_get_size (SwfdecLoader *lo
}
/**
+ * swfdec_loader_get_loaded:
+ * @loader: a #SwfdecLoader
+ *
+ * Gets the amount of bytes that have already been pushed into @loader and are
+ * available to Swfdec.
+ *
+ * Returns: Amount of bytes in @loader
+ **/
+gulong
+swfdec_loader_get_loaded (SwfdecLoader *loader)
+{
+ g_return_val_if_fail (SWFDEC_IS_LOADER (loader), 0);
+
+ return swfdec_buffer_queue_get_depth (loader->queue) +
+ swfdec_buffer_queue_get_offset (loader->queue);
+}
+
+/**
* swfdec_loader_data_type_get_extension:
* @type: a #SwfdecLoaderDataType
*
diff --git a/libswfdec/swfdec_loader.h b/libswfdec/swfdec_loader.h
index 9afec81..482c810 100644
--- a/libswfdec/swfdec_loader.h
+++ b/libswfdec/swfdec_loader.h
@@ -79,6 +79,7 @@ void swfdec_loader_error (SwfdecLoader
void swfdec_loader_set_size (SwfdecLoader * loader,
gulong size);
gulong swfdec_loader_get_size (SwfdecLoader * loader);
+gulong swfdec_loader_get_loaded (SwfdecLoader * loader);
char * swfdec_loader_get_filename (SwfdecLoader * loader);
SwfdecLoaderDataType
swfdec_loader_get_data_type (SwfdecLoader * loader);
diff-tree 6eeb97209e5b60af1dd930ad7063810c73c21654 (from 0f3acdb9630e4443894956dac6cfb0b8609a649a)
Author: Benjamin Otte <otte at gnome.org>
Date: Tue Mar 20 22:46:28 2007 +0100
API was broken by adding new members to SwfdecLoader struct, so update libversion
diff --git a/configure.ac b/configure.ac
index e640a78..2159631 100644
--- a/configure.ac
+++ b/configure.ac
@@ -33,7 +33,7 @@ else
fi
AC_DEFINE_UNQUOTED(SWFDEC_LEVEL_DEFAULT, $DEFAULT_DEBUG_LEVEL, [Default debug level used])
-SWFDEC_LIBVERSION="1:2:0"
+SWFDEC_LIBVERSION="2:0:0"
AC_SUBST(SWFDEC_LIBVERSION)
AM_PROG_LIBTOOL
diff-tree 0f3acdb9630e4443894956dac6cfb0b8609a649a (from 1fa988074827d10c989f3e301abcda86f513daf2)
Author: Benjamin Otte <otte at gnome.org>
Date: Tue Mar 20 22:39:22 2007 +0100
add swfdec_loader_[gs]et_size
diff --git a/doc/Makefile.am b/doc/Makefile.am
index afe0261..ba9c4cb 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -54,6 +54,7 @@ CFILE_GLOB=$(top_srcdir)/libswfdec/*.c
IGNORE_HFILES= \
js \
jpeg \
+ swfdec_amf.h \
swfdec_audio_internal.h \
swfdec_audio_event.h \
swfdec_audio_flv.h \
diff --git a/doc/swfdec-sections.txt b/doc/swfdec-sections.txt
index e0bb55f..26a98ab 100644
--- a/doc/swfdec-sections.txt
+++ b/doc/swfdec-sections.txt
@@ -22,6 +22,8 @@ swfdec_loader_new_from_file
swfdec_loader_push
swfdec_loader_eof
swfdec_loader_error
+swfdec_loader_get_size
+swfdec_loader_set_size
swfdec_loader_get_filename
swfdec_loader_get_data_type
<SUBSECTION Standard>
diff --git a/libswfdec/swfdec_loader.c b/libswfdec/swfdec_loader.c
index 9087748..1fd0e65 100644
--- a/libswfdec/swfdec_loader.c
+++ b/libswfdec/swfdec_loader.c
@@ -75,7 +75,8 @@ enum {
PROP_0,
PROP_ERROR,
PROP_EOF,
- PROP_DATA_TYPE
+ PROP_DATA_TYPE,
+ PROP_SIZE
};
G_DEFINE_ABSTRACT_TYPE (SwfdecLoader, swfdec_loader, G_TYPE_OBJECT)
@@ -96,6 +97,9 @@ swfdec_loader_get_property (GObject *obj
case PROP_DATA_TYPE:
g_value_set_enum (value, loader->data_type);
break;
+ case PROP_SIZE:
+ g_value_set_ulong (value, loader->size);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
break;
@@ -116,6 +120,10 @@ swfdec_loader_set_property (GObject *obj
if (g_value_get_boolean (value) && !loader->eof)
swfdec_loader_eof (loader);
break;
+ case PROP_SIZE:
+ if (loader->size == 0 && g_value_get_ulong (value) > 0)
+ swfdec_loader_set_size (loader, g_value_get_ulong (value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
break;
@@ -152,6 +160,9 @@ swfdec_loader_class_init (SwfdecLoaderCl
g_object_class_install_property (object_class, PROP_DATA_TYPE,
g_param_spec_enum ("data-type", "data type", "the data's type as identified by Swfdec",
SWFDEC_TYPE_LOADER_DATA_TYPE, SWFDEC_LOADER_DATA_UNKNOWN, G_PARAM_READABLE));
+ g_object_class_install_property (object_class, PROP_SIZE,
+ g_param_spec_ulong ("size", "size", "amount of bytes in loader",
+ 0, G_MAXULONG, 0, G_PARAM_READWRITE));
}
static void
@@ -221,6 +232,7 @@ swfdec_file_loader_load (SwfdecLoader *l
swfdec_loader_error (ret, error->message);
g_error_free (error);
} else {
+ swfdec_loader_set_size (ret, buffer->length);
swfdec_loader_push (ret, buffer);
swfdec_loader_eof (ret);
}
@@ -324,6 +336,7 @@ swfdec_loader_new_from_file (const char
g_free (cur);
}
SWFDEC_FILE_LOADER (loader)->dir = g_path_get_dirname (loader->url);
+ swfdec_loader_set_size (loader, buf->length);
swfdec_loader_push (loader, buf);
swfdec_loader_eof (loader);
return loader;
@@ -423,6 +436,12 @@ swfdec_loader_eof (SwfdecLoader *loader)
g_return_if_fail (loader->eof == FALSE);
loader->eof = TRUE;
+ if (loader->size == 0) {
+ gulong bytes = swfdec_buffer_queue_get_offset (loader->queue) +
+ swfdec_buffer_queue_get_depth (loader->queue);
+ if (bytes)
+ swfdec_loader_set_size (loader, bytes);
+ }
g_object_notify (G_OBJECT (loader), "eof");
swfdec_loader_parse (loader);
}
@@ -514,6 +533,41 @@ swfdec_loader_set_data_type (SwfdecLoade
}
/**
+ * swfdec_loader_set_size:
+ * @loader: a #SwfdecLoader
+ * @size: the amount of bytes in this loader
+ *
+ * Sets the size of bytes in this loader. This function may only be called once.
+ **/
+void
+swfdec_loader_set_size (SwfdecLoader *loader, gulong size)
+{
+ g_return_if_fail (SWFDEC_IS_LOADER (loader));
+ g_return_if_fail (loader->size == 0);
+ g_return_if_fail (size > 0);
+
+ loader->size = size;
+ g_object_notify (G_OBJECT (loader), "size");
+}
+
+/**
+ * swfdec_loader_get_size:
+ * @loader: a #SwfdecLoader
+ *
+ * Queries the amount of bytes inside @loader. If the size is unknown, 0 is
+ * returned.
+ *
+ * Returns: the total number of bytes for this loader or 0 if unknown
+ **/
+gulong
+swfdec_loader_get_size (SwfdecLoader *loader)
+{
+ g_return_val_if_fail (SWFDEC_IS_LOADER (loader), 0);
+
+ return loader->size;
+}
+
+/**
* swfdec_loader_data_type_get_extension:
* @type: a #SwfdecLoaderDataType
*
diff --git a/libswfdec/swfdec_loader.h b/libswfdec/swfdec_loader.h
index fc4983c..9afec81 100644
--- a/libswfdec/swfdec_loader.h
+++ b/libswfdec/swfdec_loader.h
@@ -49,6 +49,7 @@ struct _SwfdecLoader
char * url; /* the URL for this loader in UTF-8 - must be set on creation */
/*< private >*/
+ gulong size; /* number of bytes in stream or 0 if unknown */
gboolean eof; /* if we're in EOF already */
char * error; /* if there's an error (from parsing the loader) */
gpointer target; /* SwfdecLoaderTarget that gets notified about loading progress */
@@ -75,6 +76,9 @@ void swfdec_loader_push (SwfdecLoader
void swfdec_loader_eof (SwfdecLoader * loader);
void swfdec_loader_error (SwfdecLoader * loader,
const char * error);
+void swfdec_loader_set_size (SwfdecLoader * loader,
+ gulong size);
+gulong swfdec_loader_get_size (SwfdecLoader * loader);
char * swfdec_loader_get_filename (SwfdecLoader * loader);
SwfdecLoaderDataType
swfdec_loader_get_data_type (SwfdecLoader * loader);
diff-tree 1fa988074827d10c989f3e301abcda86f513daf2 (from b5cf5799383500fc93aca5aaf2b6e58602c677c7)
Author: Benjamin Otte <otte at gnome.org>
Date: Tue Mar 20 22:39:16 2007 +0100
emit a Buffer.Full when we're full and in eof
diff --git a/libswfdec/swfdec_net_stream.c b/libswfdec/swfdec_net_stream.c
index 09239e2..2bc6b23 100644
--- a/libswfdec/swfdec_net_stream.c
+++ b/libswfdec/swfdec_net_stream.c
@@ -254,11 +254,16 @@ swfdec_net_stream_loader_target_parse (S
}
out:
if (loader->eof) {
+ guint first, last;
swfdec_flv_decoder_eof (stream->flvdecoder);
recheck = TRUE;
swfdec_net_stream_onstatus (stream, "NetStream.Buffer.Flush", "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, "NetStream.Buffer.Full", "status");
+ }
}
if (recheck) {
if (stream->buffering) {
diff-tree b5cf5799383500fc93aca5aaf2b6e58602c677c7 (from 6363187dd9b03c0c32bbce14ba5de298deb3533d)
Author: Benjamin Otte <otte at gnome.org>
Date: Tue Mar 20 22:37:37 2007 +0100
add time property
diff --git a/libswfdec/swfdec_js_net_stream.c b/libswfdec/swfdec_js_net_stream.c
index 908f4b2..2b91bfb 100644
--- a/libswfdec/swfdec_js_net_stream.c
+++ b/libswfdec/swfdec_js_net_stream.c
@@ -84,7 +84,35 @@ static JSFunctionSpec net_stream_methods
{ "pause", swfdec_js_net_stream_pause, 0, 0, 0 },
{ "play", swfdec_js_net_stream_play, 1, 0, 0 },
{ "setBufferTime", swfdec_js_net_stream_set_buffer_time, 1, 0, 0 },
- {0,0,0,0,0}
+ { NULL }
+};
+
+static JSBool
+swfdec_js_net_stream_time (JSContext *cx, JSObject *obj, jsval id, jsval *vp)
+{
+ SwfdecNetStream *stream;
+ guint msecs;
+
+ stream = swfdec_scriptable_from_object (cx, obj, SWFDEC_TYPE_NET_STREAM);
+ if (stream == NULL)
+ return JS_TRUE;
+
+ if (stream->flvdecoder == NULL ||
+ !swfdec_flv_decoder_get_video_info (stream->flvdecoder, &msecs, NULL)) {
+ *vp = INT_TO_JSVAL (0);
+ return JS_TRUE;
+ }
+ if (msecs >= stream->current_time)
+ msecs = 0;
+ else
+ msecs = stream->current_time - msecs;
+
+ return JS_NewNumberValue (cx, msecs / 1000., vp);
+}
+
+static JSPropertySpec net_stream_props[] = {
+ { "time", -1, JSPROP_PERMANENT|JSPROP_READONLY, swfdec_js_net_stream_time, NULL },
+ { NULL }
};
static void
@@ -131,7 +159,7 @@ void
swfdec_js_add_net_stream (SwfdecPlayer *player)
{
JS_InitClass (player->jscx, player->jsobj, NULL,
- &net_stream_class, swfdec_js_net_stream_new, 0, NULL, net_stream_methods,
+ &net_stream_class, swfdec_js_net_stream_new, 0, net_stream_props, net_stream_methods,
NULL, NULL);
}
More information about the Swfdec
mailing list