Benjamin Otte
2007-Jun-27 08:37 UTC
[Swfdec] Branch 'as' - 16 commits - configure.ac libswfdec/Makefile.am libswfdec/swfdec_as_context.c libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame.h libswfdec/swfdec_as_function.c libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_script_function.c libswfdec/swfdec_as_script_function.h libswfdec/swfdec_as_strings.c libswfdec/swfdec_codec_ffmpeg.c libswfdec/swfdec_js.c libswfdec/swfdec_js.h libswfdec/swfdec_js_sound.c libswfdec/swfdec_js_video.c libswfdec/swfdec_js_xml.c libswfdec/swfdec_player.c libswfdec/swfdec_xml_as.c
configure.ac | 2 libswfdec/Makefile.am | 13 libswfdec/swfdec_as_context.c | 3 libswfdec/swfdec_as_frame.c | 43 +-- libswfdec/swfdec_as_frame.h | 7 libswfdec/swfdec_as_function.c | 2 libswfdec/swfdec_as_interpret.c | 103 +++---- libswfdec/swfdec_as_script_function.c | 6 libswfdec/swfdec_as_script_function.h | 7 libswfdec/swfdec_as_strings.c | 5 libswfdec/swfdec_codec_ffmpeg.c | 25 + libswfdec/swfdec_js.c | 472 ---------------------------------- libswfdec/swfdec_js.h | 74 ----- libswfdec/swfdec_js_sound.c | 75 ----- libswfdec/swfdec_js_video.c | 92 ++---- libswfdec/swfdec_js_xml.c | 87 ------ libswfdec/swfdec_player.c | 2 libswfdec/swfdec_xml_as.c | 65 ++++ 18 files changed, 207 insertions(+), 876 deletions(-) New commits: diff-tree 6926ffebd79fd8fb3ab853c39f071925fc8066bd (from cdb3324b8d8fd60ea0420de74b89a9edb1528b11) Author: Benjamin Otte <otte at gnome.org> Date: Wed Jun 27 10:37:06 2007 +0200 Fix Get/SetProperty to use the right struct layout My hacks come back and bite me, I need to seriously change that. diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index 4f84189..b4bcc4f 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -448,6 +448,7 @@ swfdec_as_interpret_eval (SwfdecAsContex /* FIXME: this sucks */ extern struct { + gboolean needs_movie; const char * name; /* GC'd */ void (* get) (SwfdecMovie *movie, SwfdecAsValue *ret); void (* set) (SwfdecMovie *movie, const SwfdecAsValue *val); diff-tree cdb3324b8d8fd60ea0420de74b89a9edb1528b11 (from parents) Merge: e3b1a4d0c6d2d5104085fdb1d8e14269999de4bd 0d598e6df9d7c2e046935505cee577accc7e0613 Author: Benjamin Otte <otte at gnome.org> Date: Wed Jun 27 10:31:53 2007 +0200 Merge branch 'as' of ssh://company at git.freedesktop.org/git/swfdec into as Conflicts: libswfdec/swfdec_as_interpret.c diff --cc libswfdec/swfdec_as_interpret.c index 288c47d,e09b09f..4f84189 @@@ -55,8 -74,9 +55,8 @@@ static void swfdec_action_stop (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { - if (SWFDEC_IS_MOVIE (cx->frame->target)) - SWFDEC_MOVIE (cx->frame->target)->stopped = TRUE; - SwfdecSpriteMovie *movie = swfdec_action_get_target (cx); - if (movie) - movie->playing = FALSE; ++ if (SWFDEC_IS_SPRITE_MOVIE (cx->frame->target)) ++ SWFDEC_SPRITE_MOVIE (cx->frame->target)->playing = FALSE; else SWFDEC_ERROR ("no movie to stop"); } @@@ -64,8 -84,9 +64,8 @@@ static void swfdec_action_play (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { - if (SWFDEC_IS_MOVIE (cx->frame->target)) - SWFDEC_MOVIE (cx->frame->target)->stopped = FALSE; - SwfdecSpriteMovie *movie = swfdec_action_get_target (cx); - if (movie) - movie->playing = TRUE; ++ if (SWFDEC_IS_SPRITE_MOVIE (cx->frame->target)) ++ SWFDEC_SPRITE_MOVIE (cx->frame->target)->playing = TRUE; else SWFDEC_ERROR ("no movie to play"); } @@@ -73,10 -94,10 +73,10 @@@ static void swfdec_action_next_frame (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { - if (SWFDEC_IS_MOVIE (cx->frame->target)) { - SwfdecMovie *movie = SWFDEC_MOVIE (cx->frame->target); - if (movie->frame + 1 < movie->n_frames) { - swfdec_movie_goto (movie, movie->frame + 1); - SwfdecSpriteMovie *movie = swfdec_action_get_target (cx); - if (movie) { ++ if (SWFDEC_IS_SPRITE_MOVIE (cx->frame->target)) { ++ SwfdecSpriteMovie *movie = SWFDEC_SPRITE_MOVIE (cx->frame->target); + if (movie->frame < movie->n_frames) { + swfdec_sprite_movie_goto (movie, movie->frame + 1); } else { SWFDEC_INFO ("can't execute nextFrame, already at last frame"); } @@@ -88,10 -109,10 +88,10 @@@ static void swfdec_action_previous_frame (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { - if (SWFDEC_IS_MOVIE (cx->frame->target)) { - SwfdecMovie *movie = SWFDEC_MOVIE (cx->frame->target); - if (movie->frame > 0) { - swfdec_movie_goto (movie, movie->frame - 1); - SwfdecSpriteMovie *movie = swfdec_action_get_target (cx); - if (movie) { ++ if (SWFDEC_IS_SPRITE_MOVIE (cx->frame->target)) { ++ SwfdecSpriteMovie *movie = SWFDEC_SPRITE_MOVIE (cx->frame->target); + if (movie->frame > 1) { + swfdec_sprite_movie_goto (movie, movie->frame - 1); } else { SWFDEC_INFO ("can't execute previousFrame, already at first frame"); } @@@ -110,10 -132,9 +110,10 @@@ return; } frame = GUINT16_FROM_LE (*((guint16 *) data)); - if (movie) { + if (SWFDEC_IS_SPRITE_MOVIE (cx->frame->target)) { - SwfdecMovie *movie = SWFDEC_MOVIE (cx->frame->target); - swfdec_movie_goto (movie, frame); - movie->stopped = TRUE; ++ SwfdecSpriteMovie *movie = SWFDEC_SPRITE_MOVIE (cx->frame->target); + swfdec_sprite_movie_goto (movie, frame + 1); + movie->playing = FALSE; } else { SWFDEC_ERROR ("no movie to goto on"); } @@@ -127,13 -150,13 +127,14 @@@ return; } - if (movie) { + if (SWFDEC_IS_SPRITE_MOVIE (cx->frame->target)) { - SwfdecMovie *movie = SWFDEC_MOVIE (cx->frame->target); - int frame = swfdec_sprite_get_frame (SWFDEC_SPRITE_MOVIE (movie)->sprite, (const char *) data); - if (frame == -1) ++ SwfdecSpriteMovie *movie = SWFDEC_SPRITE_MOVIE (cx->frame->target); + int frame; + if (movie->sprite == NULL || + (frame = swfdec_sprite_get_frame (movie->sprite, (const char *) data)) == -1) return; - swfdec_movie_goto (movie, frame); - movie->stopped = TRUE; + swfdec_sprite_movie_goto (movie, frame + 1); + movie->playing = FALSE; } else { SWFDEC_ERROR ("no movie to goto on"); } @@@ -186,15 -211,15 +188,15 @@@ bias = swfdec_bits_get_u16 (&bits); } val = swfdec_as_stack_peek (cx->frame->stack, 1); - movie = swfdec_action_get_target (cx); /* now set it */ - if (movie) { + if (SWFDEC_IS_SPRITE_MOVIE (cx->frame->target)) { - SwfdecMovie *movie = SWFDEC_MOVIE (cx->frame->target); - int frame = swfdec_value_to_frame (cx, movie, val); - if (frame >= 0) { ++ SwfdecSpriteMovie *movie = SWFDEC_SPRITE_MOVIE (cx->frame->target); + guint frame = swfdec_value_to_frame (cx, movie, val); + if (frame > 0) { frame += bias; - frame = CLAMP (frame, 0, (int) movie->n_frames - 1); - swfdec_movie_goto (movie, frame); - movie->stopped = !play; + frame = CLAMP (frame, 1, movie->n_frames); + swfdec_sprite_movie_goto (movie, frame); + movie->playing = play; } } else { SWFDEC_ERROR ("no movie to GotoFrame2 on"); @@@ -274,11 -301,10 +276,11 @@@ return; } - movie = SWFDEC_MOVIE (cx->frame->target); ++ movie = SWFDEC_SPRITE_MOVIE (cx->frame->target); frame = GUINT16_FROM_LE (*((guint16 *) data)); jump = data[2]; - if (SWFDEC_MOVIE (movie->swf->movie) == movie) { - SwfdecDecoder *dec = movie->swf->decoder; + if (SWFDEC_MOVIE (movie)->swf->movie == movie) { + SwfdecDecoder *dec = SWFDEC_MOVIE (movie)->swf->decoder; loaded = dec->frames_loaded; g_assert (loaded <= movie->n_frames); } else { diff-tree e3b1a4d0c6d2d5104085fdb1d8e14269999de4bd (from cbf5b3fcecd54d80669ffe7325344c3fc3168597) Author: Benjamin Otte <otte at gnome.org> Date: Wed Jun 27 09:29:01 2007 +0200 hook up Video object code This should be the last leftover code from 0.4 diff --git a/libswfdec/Makefile.am b/libswfdec/Makefile.am index f944d94..14e50fb 100644 --- a/libswfdec/Makefile.am +++ b/libswfdec/Makefile.am @@ -19,14 +19,6 @@ endif lib_LTLIBRARIES = libswfdec- at SWFDEC_MAJORMINOR@.la -foofiles = \ - swfdec_js.c \ - swfdec_js_global.c \ - swfdec_js_mouse.c \ - swfdec_js_movie.c \ - swfdec_js_sound.c \ - swfdec_js_video.c - libswfdec_ at SWFDEC_MAJORMINOR@_la_SOURCES = \ swfdec_as_array.c \ swfdec_as_context.c \ @@ -78,6 +70,7 @@ libswfdec_ at SWFDEC_MAJORMINOR@_la_SOURCES swfdec_html_parser.c \ swfdec_image.c \ swfdec_interval.c \ + swfdec_js_video.c \ swfdec_listener.c \ swfdec_loader.c \ swfdec_loadertarget.c \ diff --git a/libswfdec/swfdec_as_strings.c b/libswfdec/swfdec_as_strings.c index 15d0f69..8fe5c1b 100644 --- a/libswfdec/swfdec_as_strings.c +++ b/libswfdec/swfdec_as_strings.c @@ -215,6 +215,9 @@ const char swfdec_as_strings[] = SWFDEC_AS_CONSTANT_STRING ("setBufferTime") SWFDEC_AS_CONSTANT_STRING ("load") SWFDEC_AS_CONSTANT_STRING ("XML") + SWFDEC_AS_CONSTANT_STRING ("Video") + SWFDEC_AS_CONSTANT_STRING ("attachVideo") + SWFDEC_AS_CONSTANT_STRING ("clear") /* add more here */ ; diff --git a/libswfdec/swfdec_js_video.c b/libswfdec/swfdec_js_video.c index 946ebf7..76d978b 100644 --- a/libswfdec/swfdec_js_video.c +++ b/libswfdec/swfdec_js_video.c @@ -23,78 +23,56 @@ #include "swfdec_video.h" #include "swfdec_debug.h" -#include "swfdec_js.h" #include "swfdec_net_stream.h" #include "swfdec_player_internal.h" -static JSBool -swfdec_js_video_attach_video (JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +static void +swfdec_video_attach_video (SwfdecAsContext *cx, SwfdecAsObject *obj, guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval) { + SwfdecVideoMovie *video = SWFDEC_VIDEO_MOVIE (obj); SwfdecNetStream *stream; - SwfdecVideoMovie *video; - - video = swfdec_scriptable_from_object (cx, obj, SWFDEC_TYPE_VIDEO_MOVIE); - if (video == NULL) - return JS_TRUE; - stream = swfdec_scriptable_from_jsval (cx, argv[0], SWFDEC_TYPE_NET_STREAM); - if (stream != NULL) { - swfdec_video_movie_set_input (video, &stream->input); - return JS_TRUE; + if (!SWFDEC_AS_VALUE_IS_OBJECT (&argv[0]) || + !SWFDEC_IS_NET_STREAM (stream = (SwfdecNetStream *) SWFDEC_AS_VALUE_GET_OBJECT (&argv[0]))) { + SWFDEC_WARNING ("calling attachVideo without a NetStraem object"); + swfdec_video_movie_set_input (video, NULL); + return; } - swfdec_video_movie_set_input (video, NULL); - return JS_TRUE; -} - -static JSBool -swfdec_js_video_clear (JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) -{ - SwfdecVideoMovie *video; - - video = swfdec_scriptable_from_object (cx, obj, SWFDEC_TYPE_VIDEO_MOVIE); - if (video == NULL) - return JS_TRUE; - - swfdec_video_movie_clear (video); - return JS_TRUE; + swfdec_video_movie_set_input (video, &stream->input); } -static JSFunctionSpec video_methods[] = { - { "attachVideo", swfdec_js_video_attach_video, 1, 0, 0 }, - { "clear", swfdec_js_video_clear, 0, 0, 0 }, - {0,0,0,0,0} -}; - static void -swfdec_js_video_finalize (JSContext *cx, JSObject *obj) +swfdec_video_clear (SwfdecAsContext *cx, SwfdecAsObject *obj, guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval) { - SwfdecVideo *video; - - video = JS_GetPrivate (cx, obj); - if (video) { - SWFDEC_SCRIPTABLE (video)->jsobj = NULL; - g_object_unref (video); - } -} + SwfdecVideoMovie *video = SWFDEC_VIDEO_MOVIE (obj); -const JSClass video_class = { - "Video", JSCLASS_HAS_PRIVATE, - JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, - JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, swfdec_js_video_finalize, - JSCLASS_NO_OPTIONAL_MEMBERS -}; - -static JSBool -swfdec_js_video_new (JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) -{ - return JS_TRUE; + swfdec_video_movie_clear (video); } void -swfdec_js_add_video (SwfdecPlayer *player) +swfdec_video_movie_init_context (SwfdecPlayer *player, guint version) { - JS_InitClass (player->jscx, player->jsobj, NULL, - &video_class, swfdec_js_video_new, 0, NULL, video_methods, - NULL, NULL); + SwfdecAsContext *context; + SwfdecAsObject *video, *proto; + SwfdecAsValue val; + + g_return_if_fail (SWFDEC_IS_PLAYER (player)); + + context = SWFDEC_AS_CONTEXT (player); + video = SWFDEC_AS_OBJECT (swfdec_as_object_add_function (context->global, + SWFDEC_AS_STR_Video, 0, NULL, 0)); + if (video == NULL) + return; + proto = swfdec_as_object_new (context); + /* set the right properties on the NetStream object */ + SWFDEC_AS_VALUE_SET_OBJECT (&val, proto); + swfdec_as_object_set_variable (video, SWFDEC_AS_STR_prototype, &val); + /* set the right properties on the NetStream.prototype object */ + SWFDEC_AS_VALUE_SET_OBJECT (&val, video); + swfdec_as_object_set_variable (proto, SWFDEC_AS_STR_constructor, &val); + swfdec_as_object_add_function (proto, SWFDEC_AS_STR_attachMovie, SWFDEC_TYPE_VIDEO_MOVIE, + swfdec_video_attach_video, 1); + swfdec_as_object_add_function (proto, SWFDEC_AS_STR_clear, SWFDEC_TYPE_VIDEO_MOVIE, + swfdec_video_clear, 0); } diff-tree cbf5b3fcecd54d80669ffe7325344c3fc3168597 (from 22dd4563d2051791badd70f034e86b6bf75c75ba) Author: Benjamin Otte <otte at gnome.org> Date: Wed Jun 27 09:28:26 2007 +0200 rename variable in copy/paste code diff --git a/libswfdec/swfdec_xml_as.c b/libswfdec/swfdec_xml_as.c index 846ec69..8be7ae3 100644 --- a/libswfdec/swfdec_xml_as.c +++ b/libswfdec/swfdec_xml_as.c @@ -41,23 +41,23 @@ void swfdec_xml_init_context (SwfdecPlayer *player, guint version) { SwfdecAsContext *context; - SwfdecAsObject *stream, *proto; + SwfdecAsObject *xml, *proto; SwfdecAsValue val; g_return_if_fail (SWFDEC_IS_PLAYER (player)); context = SWFDEC_AS_CONTEXT (player); - stream = SWFDEC_AS_OBJECT (swfdec_as_object_add_function (context->global, + xml = SWFDEC_AS_OBJECT (swfdec_as_object_add_function (context->global, SWFDEC_AS_STR_XML, 0, NULL, 0)); - if (stream == NULL) + if (xml == NULL) return; - swfdec_as_native_function_set_construct_type (SWFDEC_AS_NATIVE_FUNCTION (stream), SWFDEC_TYPE_XML); + swfdec_as_native_function_set_construct_type (SWFDEC_AS_NATIVE_FUNCTION (xml), SWFDEC_TYPE_XML); proto = swfdec_as_object_new (context); /* set the right properties on the NetStream object */ SWFDEC_AS_VALUE_SET_OBJECT (&val, proto); - swfdec_as_object_set_variable (stream, SWFDEC_AS_STR_prototype, &val); + swfdec_as_object_set_variable (xml, SWFDEC_AS_STR_prototype, &val); /* set the right properties on the NetStream.prototype object */ - SWFDEC_AS_VALUE_SET_OBJECT (&val, stream); + SWFDEC_AS_VALUE_SET_OBJECT (&val, xml); swfdec_as_object_set_variable (proto, SWFDEC_AS_STR_constructor, &val); swfdec_as_object_add_function (proto, SWFDEC_AS_STR_load, SWFDEC_TYPE_XML, swfdec_xml_do_load, 1); diff-tree 22dd4563d2051791badd70f034e86b6bf75c75ba (from b591bafc9b65bc077928ed19f19a7a7d0f28c552) Author: Benjamin Otte <otte at gnome.org> Date: Wed Jun 27 09:23:18 2007 +0200 don't name the XML constructor NetStream diff --git a/libswfdec/swfdec_as_strings.c b/libswfdec/swfdec_as_strings.c index 051938e..15d0f69 100644 --- a/libswfdec/swfdec_as_strings.c +++ b/libswfdec/swfdec_as_strings.c @@ -214,6 +214,7 @@ const char swfdec_as_strings[] = SWFDEC_AS_CONSTANT_STRING ("seek") SWFDEC_AS_CONSTANT_STRING ("setBufferTime") SWFDEC_AS_CONSTANT_STRING ("load") + SWFDEC_AS_CONSTANT_STRING ("XML") /* add more here */ ; diff --git a/libswfdec/swfdec_xml_as.c b/libswfdec/swfdec_xml_as.c index 9a94732..846ec69 100644 --- a/libswfdec/swfdec_xml_as.c +++ b/libswfdec/swfdec_xml_as.c @@ -48,7 +48,7 @@ swfdec_xml_init_context (SwfdecPlayer *p context = SWFDEC_AS_CONTEXT (player); stream = SWFDEC_AS_OBJECT (swfdec_as_object_add_function (context->global, - SWFDEC_AS_STR_NetStream, 0, NULL, 0)); + SWFDEC_AS_STR_XML, 0, NULL, 0)); if (stream == NULL) return; swfdec_as_native_function_set_construct_type (SWFDEC_AS_NATIVE_FUNCTION (stream), SWFDEC_TYPE_XML); diff-tree b591bafc9b65bc077928ed19f19a7a7d0f28c552 (from f7040e7c3f3b281d8b48cfd9c6095400c6fe05f2) Author: Benjamin Otte <otte at gnome.org> Date: Tue Jun 26 15:24:21 2007 +0200 remove swfdec_js.[ch] All its functions should be implemented elsewhere by now diff --git a/libswfdec/swfdec_js.c b/libswfdec/swfdec_js.c deleted file mode 100644 index 48e4b2d..0000000 --- a/libswfdec/swfdec_js.c +++ /dev/null @@ -1,472 +0,0 @@ -/* Swfdec - * Copyright (C) 2006 Benjamin Otte <otte at gnome.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif -#include <string.h> -#include <js/jsapi.h> -#include <js/jscntxt.h> /* for setting tracefp when debugging */ -#include <libswfdec/js/jsfun.h> -#include <js/jsdbgapi.h> /* for debugging */ -#include <js/jsopcode.h> /* for debugging */ -#include <js/jsscript.h> /* for debugging */ -#include "swfdec_types.h" -#include "swfdec_player_internal.h" -#include "swfdec_debug.h" -#include "swfdec_js.h" -#include "swfdec_listener.h" -#include "swfdec_root_movie.h" -#include "swfdec_swf_decoder.h" - -static JSRuntime *swfdec_js_runtime; - -/** - * swfdec_js_init: - * @runtime_size: desired runtime size of the JavaScript runtime or 0 for default - * - * Initializes the Javascript part of swfdec. This function must only be called once. - **/ -void -swfdec_js_init (guint runtime_size) -{ - g_assert (runtime_size < G_MAXUINT32); - if (runtime_size == 0) - runtime_size = 8 * 1024 * 1024; /* some default size */ - - swfdec_js_runtime = JS_NewRuntime (runtime_size); - SWFDEC_INFO ("initialized JS runtime with %u bytes", runtime_size); -} - -static void -swfdec_js_error_report (JSContext *cx, const char *message, JSErrorReport *report) -{ - SWFDEC_ERROR ("JS Error: %s", message); - /* FIXME: #ifdef this when not debugging the compiler */ - //g_assert_not_reached (); -} - -static JSClass global_class = { - "global",0, - JS_PropertyStub,JS_PropertyStub,JS_PropertyStub,JS_PropertyStub, - JS_EnumerateStub,JS_ResolveStub,JS_ConvertStub,JS_FinalizeStub -}; - -/** - * swfdec_js_init_player: - * @player: a #SwfdecPlayer - * - * Initializes @player for Javascript processing. - **/ -void -swfdec_js_init_player (SwfdecPlayer *player) -{ - player->jscx = JS_NewContext (swfdec_js_runtime, 8192); - if (player->jscx == NULL) { - SWFDEC_ERROR ("did not get a JS context, trying to live without"); - return; - } - - JS_SetErrorReporter (player->jscx, swfdec_js_error_report); - JS_SetContextPrivate(player->jscx, player); - player->jsobj = JS_NewObject (player->jscx, &global_class, NULL, NULL); - if (player->jsobj == NULL) { - SWFDEC_ERROR ("creating the global object failed"); - swfdec_js_finish_player (player); - return; - } - if (!JS_InitStandardClasses (player->jscx, player->jsobj)) { - SWFDEC_ERROR ("initializing JS standard classes failed"); - } - swfdec_js_add_globals (player); - swfdec_js_add_mouse (player); - swfdec_js_add_movieclip_class (player); - swfdec_js_add_color (player); - swfdec_js_add_sound (player); - swfdec_js_add_video (player); - swfdec_js_add_xml (player); - swfdec_js_add_connection (player); - swfdec_js_add_net_stream (player); -} - -typedef struct _SwfdecJSInterval SwfdecJSInterval; -extern void swfdec_js_interval_free (SwfdecJSInterval *interval); -/** - * swfdec_js_finish_player: - * @player: a #SwfdecPlayer - * - * Shuts down the Javascript processing for @player. - **/ -void -swfdec_js_finish_player (SwfdecPlayer *player) -{ - swfdec_listener_free (player->mouse_listener); - swfdec_listener_free (player->key_listener); - while (player->intervals) - swfdec_js_interval_free (player->intervals->data); - if (player->jscx) { - JS_DestroyContext(player->jscx); - player->jsobj = NULL; - player->jscx = NULL; - } -} - -/** - * swfdec_js_execute_script: - * @s: a @SwfdecPlayer - * @movie: a #SwfdecMovie to pass as argument to the script - * @script: a @JSScript to execute - * @rval: optional location for the script's return value - * - * Executes the given @script for the given @movie. This function is supposed - * to be the single entry point for running JavaScript code inswide swfdec, so - * if you want to execute code, please use this function. - * - * Returns: TRUE if the script was successfully executed - **/ -gboolean -swfdec_js_execute_script (SwfdecPlayer *s, SwfdecMovie *movie, - JSScript *script, jsval *rval) -{ - jsval returnval = JSVAL_VOID; - JSObject *jsobj; - JSBool ret; - - g_return_val_if_fail (s != NULL, FALSE); - g_return_val_if_fail (SWFDEC_IS_MOVIE (movie), FALSE); - g_return_val_if_fail (script != NULL, FALSE); - - if (rval == NULL) - rval = &returnval; - if (!(jsobj = swfdec_scriptable_get_object (SWFDEC_SCRIPTABLE (movie)))) - return FALSE; - ret = JS_ExecuteScript (s->jscx, jsobj, script, rval); - if (!ret) { - SWFDEC_WARNING ("executing script %p for movie %s failed", script, movie->name); - } - - if (ret && returnval != JSVAL_VOID) { - JSString * str = JS_ValueToString (s->jscx, returnval); - if (str) - g_print ("%s\n", JS_GetStringBytes (str)); - } - return ret ? TRUE : FALSE; -} - -/** - * swfdec_js_run: - * @player: a #SwfdecPlayer - * @s: JavaScript commands to execute - * @rval: optional location to store a return value - * - * This is a debugging function for injecting script code into the @player. - * Use it at your own risk. - * - * Returns: TRUE if the script was evaluated successfully. - **/ -gboolean -swfdec_js_run (SwfdecPlayer *player, const char *s, jsval *rval) -{ - gboolean ret; - JSScript *script; - - g_return_val_if_fail (player != NULL, FALSE); - g_return_val_if_fail (s != NULL, FALSE); - - script = JS_CompileScript (player->jscx, player->jsobj, s, strlen (s), "injected-code", 1); - if (script == NULL) - return FALSE; - ret = swfdec_js_execute_script (player, - SWFDEC_MOVIE (player->movies->data), script, rval); - JS_DestroyScript (player->jscx, script); - return ret; -} - -/** - * swfdec_value_to_string: - * @dec: a #JSContext - * @val: a #jsval - * - * Converts the given jsval to its string representation. - * - * Returns: the string representation of @val. - **/ -const char * -swfdec_js_to_string (JSContext *cx, jsval val) -{ - JSString *string; - char *ret; - - g_return_val_if_fail (cx != NULL, NULL); - - string = JS_ValueToString (cx, val); - if (string == NULL || (ret = JS_GetStringBytes (string)) == NULL) - return NULL; - - return ret; -} - -/** - * swfdec_js_slash_to_dot: - * @slash_str: a string ion slash notation - * - * Converts a string in slash notation to a string in dot notation. - * - * Returns: The string converted to dot notation or NULL on failure. - **/ -char * -swfdec_js_slash_to_dot (const char *slash_str) -{ - const char *cur = slash_str; - GString *str = g_string_new (""); - - if (*cur == '/') { - g_string_append (str, "_root"); - if (cur[1] == ':') - cur++; - } else { - goto start; - } - while (cur && (*cur == '/' || *cur == ':')) { - cur++; -start: - if (str->len > 0) - g_string_append_c (str, '.'); - if (cur[0] == '.' && cur[1] == '.') { - g_string_append (str, "_parent"); - cur += 2; - } else { - char *slash = strchr (cur, '/'); - if (slash) { - g_string_append_len (str, cur, slash - cur); - cur = slash; - } else { - slash = strchr (cur, ':'); - if (slash) { - g_string_append_len (str, cur, slash - cur); - cur = slash; - } else { - g_string_append (str, cur); - cur = NULL; - } - } - } - /* cur should now point to the slash */ - } - if (cur) { - if (*cur != '\0') - goto fail; - } - SWFDEC_DEBUG ("parsed slash-notated string \"%s\" into dot notation \"%s\"", - slash_str, str->str); - return g_string_free (str, FALSE); - -fail: - SWFDEC_WARNING ("failed to parse slash-notated string \"%s\" into dot notation", slash_str); - g_string_free (str, TRUE); - return NULL; -} - -static JSBool -swfdec_js_eval_get_property (JSContext *cx, JSObject *obj, - const char *name, guint name_len, jsval *ret) -{ - JSAtom *atom; - JSObject *pobj; - JSProperty *prop; - - atom = js_Atomize (cx, name, name_len, 0); - if (!atom) - return JS_FALSE; - if (obj) { - return OBJ_GET_PROPERTY (cx, obj, (jsid) atom, ret); - } else { - if (cx->fp == NULL || cx->fp->scopeChain == NULL) - return JS_FALSE; - if (!js_FindProperty (cx, (jsid) atom, &obj, &pobj, &prop)) - return JS_FALSE; - if (!prop) - return JS_FALSE; - return OBJ_GET_PROPERTY (cx, obj, (jsid) prop->id, ret); - } -} - -static JSBool -swfdec_js_eval_set_property (JSContext *cx, JSObject *obj, - const char *name, guint name_len, jsval *ret) -{ - JSAtom *atom; - - atom = js_Atomize (cx, name, name_len, 0); - if (!atom) - return JS_FALSE; - if (obj == NULL) { - JSObject *pobj; - JSProperty *prop; - if (cx->fp == NULL || cx->fp->varobj == NULL) - return JS_FALSE; - if (!js_FindProperty (cx, (jsid) atom, &obj, &pobj, &prop)) - return JS_FALSE; - if (pobj) - obj = pobj; - else - obj = cx->fp->varobj; - } - return OBJ_SET_PROPERTY (cx, obj, (jsid) atom, ret); -} - -static gboolean -swfdec_js_eval_internal (JSContext *cx, JSObject *obj, const char *str, - jsval *val, gboolean set) -{ - jsval cur; - char *work = NULL; - - SWFDEC_LOG ("eval called with \"%s\" on %p", str, obj); - if (strchr (str, '/')) { - work = swfdec_js_slash_to_dot (str); - str = work; - } - if (obj == NULL && g_str_has_prefix (str, "this")) { - str += 4; - if (*str == '.') - str++; - if (cx->fp == NULL) - goto out; - obj = cx->fp->thisp; - } - cur = OBJECT_TO_JSVAL (obj); - while (str != NULL && *str != '\0') { - char *dot = strchr (str, '.'); - if (!JSVAL_IS_OBJECT (cur)) - goto out; - if (dot) { - if (!swfdec_js_eval_get_property (cx, obj, str, dot - str, &cur)) - goto out; - str = dot + 1; - } else { - if (set) { - if (!swfdec_js_eval_set_property (cx, obj, str, strlen (str), val)) - goto out; - } else { - if (!swfdec_js_eval_get_property (cx, obj, str, strlen (str), &cur)) - goto out; - } - goto finish; - } - obj = JSVAL_TO_OBJECT (cur); - } - if (obj == NULL) { - if (cx->fp == NULL) - goto out; - g_assert (cx->fp->thisp); - cur = OBJECT_TO_JSVAL (cx->fp->thisp); - } - -finish: - g_free (work); - *val = cur; - return TRUE; -out: - SWFDEC_DEBUG ("error: returning void for %s", str); - g_free (work); - return FALSE; -} - -/** - * swfdec_js_eval: - * @cx: a #JSContext - * @obj: #JSObject to use as a source for evaluating - * @str: The string to evaluate - * - * This function works like the Actionscript eval function used on @obj. - * It handles both slash-style and dot-style notation. - * - * Returns: the value or JSVAL_VOID if no value was found. - **/ -jsval -swfdec_js_eval (JSContext *cx, JSObject *obj, const char *str) -{ - jsval ret; - - g_return_val_if_fail (cx != NULL, JSVAL_VOID); - g_return_val_if_fail (str != NULL, JSVAL_VOID); - - if (!swfdec_js_eval_internal (cx, obj, str, &ret, FALSE)) - ret = JSVAL_VOID; - return ret; -} - -void -swfdec_js_eval_set (JSContext *cx, JSObject *obj, const char *str, - jsval val) -{ - g_return_if_fail (cx != NULL); - g_return_if_fail (str != NULL); - - swfdec_js_eval_internal (cx, obj, str, &val, TRUE); -} - -/** - * swfdec_js_construct_object: - * @cx: the #JSContext - * @clasp: class to use for constructing the object - * @constructor: a jsval possibly referring to a constructor - * @newp: pointer to variable that will take the created object or NULL on - * failure - * - * Constructs a JSObject for the given @constructor, if it really is a - * constructor. - * <note>The object is only constructed, the constructor is not called. - * You can easily do this with JS_Invoke() later.</note> - * - * Returns: %JS_TRUE on success or %JS_FALSE on OOM. - **/ -JSBool -swfdec_js_construct_object (JSContext *cx, const JSClass *clasp, - jsval constructor, JSObject **newp) -{ - JSObject *object; - jsval proto; - - g_return_val_if_fail (newp != NULL, JS_FALSE); - - if (!JSVAL_IS_OBJECT (constructor) || constructor == JSVAL_VOID) - goto fail; - object = JSVAL_TO_OBJECT (constructor); - if (JS_GetClass (object) != &js_FunctionClass) - goto fail; - if (clasp == NULL) - clasp = ((JSFunction *) JS_GetPrivate (cx, object))->clasp; - if (!JS_GetProperty (cx, object, "prototype", &proto)) - return JS_FALSE; - if (!JSVAL_IS_OBJECT (proto)) { - SWFDEC_ERROR ("prototype is not an object"); - } - object = JS_NewObject (cx, clasp, JSVAL_IS_OBJECT (proto) ? JSVAL_TO_OBJECT (proto) : NULL, NULL); - if (object == NULL) - return JS_FALSE; - - *newp = object; - return JS_TRUE; - -fail: - *newp = NULL; - return JS_TRUE; -} diff --git a/libswfdec/swfdec_js.h b/libswfdec/swfdec_js.h deleted file mode 100644 index 303a90e..0000000 --- a/libswfdec/swfdec_js.h +++ /dev/null @@ -1,74 +0,0 @@ -/* Swfdec - * Copyright (C) 2006 Benjamin Otte <otte at gnome.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA - */ - -#ifndef __SWFDEC_JS_H__ -#define __SWFDEC_JS_H__ - -#include <libswfdec/swfdec_player.h> -#include <libswfdec/swfdec_movie.h> -#include <libswfdec/js/jsapi.h> - -G_BEGIN_DECLS - -void swfdec_js_init (guint runtime_size); -void swfdec_js_init_player (SwfdecPlayer * player); -void swfdec_js_finish_player (SwfdecPlayer * player); -gboolean swfdec_js_execute_script (SwfdecPlayer * player, - SwfdecMovie * movie, - JSScript * script, - jsval * rval); -gboolean swfdec_js_run (SwfdecPlayer * player, - const char * s, - jsval * rval); - -void swfdec_js_add_color (SwfdecPlayer * player); -void swfdec_js_add_connection (SwfdecPlayer * player); -void swfdec_js_add_globals (SwfdecPlayer * player); -void swfdec_js_add_mouse (SwfdecPlayer * player); -void swfdec_js_add_movieclip_class (SwfdecPlayer * player); -void swfdec_js_add_net_stream (SwfdecPlayer * player); -void swfdec_js_add_sound (SwfdecPlayer * player); -void swfdec_js_add_video (SwfdecPlayer * player); -void swfdec_js_add_xml (SwfdecPlayer * player); - -void swfdec_js_movie_create_jsobject (SwfdecMovie * movie); -void swfdec_js_movie_remove_jsobject (SwfdecMovie * movie); - -char * swfdec_js_slash_to_dot (const char * slash_str); -jsval swfdec_js_eval (JSContext * cx, - JSObject * obj, - const char * str); -void swfdec_js_eval_set (JSContext * cx, - JSObject * obj, - const char * str, - jsval val); - -JSBool swfdec_js_construct_object (JSContext * cx, - const JSClass * clasp, - jsval constructor, - JSObject ** newp); -/* support functions */ -const char * swfdec_js_to_string (JSContext * cx, - jsval val); -gboolean swfdec_js_is_movieclip (JSContext * cx, - JSObject * object); - -G_END_DECLS - -#endif diff-tree f7040e7c3f3b281d8b48cfd9c6095400c6fe05f2 (from 2a8e3259bd677201c7381d416e7d4fd0c6cfa34e) Author: Benjamin Otte <otte at gnome.org> Date: Tue Jun 26 15:23:36 2007 +0200 remove old (and useless) file diff --git a/libswfdec/swfdec_js_sound.c b/libswfdec/swfdec_js_sound.c deleted file mode 100644 index b9f8d57..0000000 --- a/libswfdec/swfdec_js_sound.c +++ /dev/null @@ -1,75 +0,0 @@ -/* Swfdec - * Copyright (C) 2006 Benjamin Otte <otte at gnome.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "swfdec_js.h" -#include "swfdec_debug.h" -#include "swfdec_movie.h" -#include "swfdec_player_internal.h" - -static JSBool -not_implemented (JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) -{ - SWFDEC_WARNING ("FIXME: implement this sound function"); - return JS_TRUE; -} - -static JSFunctionSpec sound_methods[] = { - { "attachSound", not_implemented, 1, 0, 0 }, - { "getPan", not_implemented, 0, 0, 0 }, - { "getTransform", not_implemented, 0, 0, 0 }, - { "getVolume", not_implemented, 0, 0, 0 }, - { "setPan", not_implemented, 1, 0, 0 }, - { "setTransform", not_implemented, 1, 0, 0 }, - { "setVolume", not_implemented, 1, 0, 0 }, - { "start", not_implemented, 0, 0, 0 }, - { "stop", not_implemented, 0, 0, 0 }, - {0,0,0,0,0} -}; - -static void -swfdec_js_sound_finalize (JSContext *cx, JSObject *obj) -{ -} - -static JSClass sound_class = { - "Sound", JSCLASS_HAS_PRIVATE, - JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, - JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, swfdec_js_sound_finalize, - JSCLASS_NO_OPTIONAL_MEMBERS -}; - -static JSBool -swfdec_js_sound_new (JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) -{ - *rval = OBJECT_TO_JSVAL (obj); - return JS_TRUE; -} - -void -swfdec_js_add_sound (SwfdecPlayer *player) -{ - JS_InitClass (player->jscx, player->jsobj, NULL, - &sound_class, swfdec_js_sound_new, 1, NULL, sound_methods, - NULL, NULL); -} - diff-tree 2a8e3259bd677201c7381d416e7d4fd0c6cfa34e (from 476ce50c3895f9d136f726ee87e714c5db1db1d3) Author: Benjamin Otte <otte at gnome.org> Date: Tue Jun 26 15:22:04 2007 +0200 rename swfdec_js_xml.c -> swfdec_xml_as.c diff --git a/libswfdec/Makefile.am b/libswfdec/Makefile.am index 87adb81..f944d94 100644 --- a/libswfdec/Makefile.am +++ b/libswfdec/Makefile.am @@ -78,7 +78,6 @@ libswfdec_ at SWFDEC_MAJORMINOR@_la_SOURCES swfdec_html_parser.c \ swfdec_image.c \ swfdec_interval.c \ - swfdec_js_xml.c \ swfdec_listener.c \ swfdec_loader.c \ swfdec_loadertarget.c \ @@ -110,7 +109,8 @@ libswfdec_ at SWFDEC_MAJORMINOR@_la_SOURCES swfdec_utils.c \ swfdec_video.c \ swfdec_video_movie.c \ - swfdec_xml.c + swfdec_xml.c \ + swfdec_xml_as.c libswfdec_ at SWFDEC_MAJORMINOR@_la_CFLAGS = \ $(GLOBAL_CFLAGS) $(CAIRO_CFLAGS) $(GLIB_CFLAGS) $(PANGO_CFLAGS) \ diff --git a/libswfdec/swfdec_js_xml.c b/libswfdec/swfdec_js_xml.c deleted file mode 100644 index 9a94732..0000000 --- a/libswfdec/swfdec_js_xml.c +++ /dev/null @@ -1,65 +0,0 @@ -/* Swfdec - * Copyright (C) 2007 Benjamin Otte <otte at gnome.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "swfdec_xml.h" -#include "swfdec_as_native_function.h" -#include "swfdec_as_object.h" -#include "swfdec_debug.h" -#include "swfdec_player_internal.h" - -static void -swfdec_xml_do_load (SwfdecAsContext *cx, SwfdecAsObject *obj, guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval) -{ - SwfdecXml *xml = SWFDEC_XML (obj); - const char *url; - - url = swfdec_as_value_to_string (cx, &argv[0]); - swfdec_xml_load (xml, url); -} - -void -swfdec_xml_init_context (SwfdecPlayer *player, guint version) -{ - SwfdecAsContext *context; - SwfdecAsObject *stream, *proto; - SwfdecAsValue val; - - g_return_if_fail (SWFDEC_IS_PLAYER (player)); - - context = SWFDEC_AS_CONTEXT (player); - stream = SWFDEC_AS_OBJECT (swfdec_as_object_add_function (context->global, - SWFDEC_AS_STR_NetStream, 0, NULL, 0)); - if (stream == NULL) - return; - swfdec_as_native_function_set_construct_type (SWFDEC_AS_NATIVE_FUNCTION (stream), SWFDEC_TYPE_XML); - proto = swfdec_as_object_new (context); - /* set the right properties on the NetStream object */ - SWFDEC_AS_VALUE_SET_OBJECT (&val, proto); - swfdec_as_object_set_variable (stream, SWFDEC_AS_STR_prototype, &val); - /* set the right properties on the NetStream.prototype object */ - SWFDEC_AS_VALUE_SET_OBJECT (&val, stream); - swfdec_as_object_set_variable (proto, SWFDEC_AS_STR_constructor, &val); - swfdec_as_object_add_function (proto, SWFDEC_AS_STR_load, SWFDEC_TYPE_XML, - swfdec_xml_do_load, 1); -} - diff --git a/libswfdec/swfdec_xml_as.c b/libswfdec/swfdec_xml_as.c new file mode 100644 index 0000000..9a94732 --- /dev/null +++ b/libswfdec/swfdec_xml_as.c @@ -0,0 +1,65 @@ +/* Swfdec + * Copyright (C) 2007 Benjamin Otte <otte at gnome.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "swfdec_xml.h" +#include "swfdec_as_native_function.h" +#include "swfdec_as_object.h" +#include "swfdec_debug.h" +#include "swfdec_player_internal.h" + +static void +swfdec_xml_do_load (SwfdecAsContext *cx, SwfdecAsObject *obj, guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval) +{ + SwfdecXml *xml = SWFDEC_XML (obj); + const char *url; + + url = swfdec_as_value_to_string (cx, &argv[0]); + swfdec_xml_load (xml, url); +} + +void +swfdec_xml_init_context (SwfdecPlayer *player, guint version) +{ + SwfdecAsContext *context; + SwfdecAsObject *stream, *proto; + SwfdecAsValue val; + + g_return_if_fail (SWFDEC_IS_PLAYER (player)); + + context = SWFDEC_AS_CONTEXT (player); + stream = SWFDEC_AS_OBJECT (swfdec_as_object_add_function (context->global, + SWFDEC_AS_STR_NetStream, 0, NULL, 0)); + if (stream == NULL) + return; + swfdec_as_native_function_set_construct_type (SWFDEC_AS_NATIVE_FUNCTION (stream), SWFDEC_TYPE_XML); + proto = swfdec_as_object_new (context); + /* set the right properties on the NetStream object */ + SWFDEC_AS_VALUE_SET_OBJECT (&val, proto); + swfdec_as_object_set_variable (stream, SWFDEC_AS_STR_prototype, &val); + /* set the right properties on the NetStream.prototype object */ + SWFDEC_AS_VALUE_SET_OBJECT (&val, stream); + swfdec_as_object_set_variable (proto, SWFDEC_AS_STR_constructor, &val); + swfdec_as_object_add_function (proto, SWFDEC_AS_STR_load, SWFDEC_TYPE_XML, + swfdec_xml_do_load, 1); +} + diff-tree 476ce50c3895f9d136f726ee87e714c5db1db1d3 (from 9b643ffc75f78d2efd849c431e009255605fedca) Author: Benjamin Otte <otte at gnome.org> Date: Tue Jun 26 15:21:08 2007 +0200 hook up (almost useless) XML object again diff --git a/libswfdec/Makefile.am b/libswfdec/Makefile.am index a28e906..87adb81 100644 --- a/libswfdec/Makefile.am +++ b/libswfdec/Makefile.am @@ -25,8 +25,7 @@ foofiles = \ swfdec_js_mouse.c \ swfdec_js_movie.c \ swfdec_js_sound.c \ - swfdec_js_video.c \ - swfdec_js_xml.c + swfdec_js_video.c libswfdec_ at SWFDEC_MAJORMINOR@_la_SOURCES = \ swfdec_as_array.c \ @@ -79,6 +78,7 @@ libswfdec_ at SWFDEC_MAJORMINOR@_la_SOURCES swfdec_html_parser.c \ swfdec_image.c \ swfdec_interval.c \ + swfdec_js_xml.c \ swfdec_listener.c \ swfdec_loader.c \ swfdec_loadertarget.c \ diff --git a/libswfdec/swfdec_as_strings.c b/libswfdec/swfdec_as_strings.c index 326b858..051938e 100644 --- a/libswfdec/swfdec_as_strings.c +++ b/libswfdec/swfdec_as_strings.c @@ -213,6 +213,7 @@ const char swfdec_as_strings[] = SWFDEC_AS_CONSTANT_STRING ("pause") SWFDEC_AS_CONSTANT_STRING ("seek") SWFDEC_AS_CONSTANT_STRING ("setBufferTime") + SWFDEC_AS_CONSTANT_STRING ("load") /* add more here */ ; diff --git a/libswfdec/swfdec_js_xml.c b/libswfdec/swfdec_js_xml.c index 92da66e..9a94732 100644 --- a/libswfdec/swfdec_js_xml.c +++ b/libswfdec/swfdec_js_xml.c @@ -22,66 +22,44 @@ #endif #include "swfdec_xml.h" +#include "swfdec_as_native_function.h" +#include "swfdec_as_object.h" #include "swfdec_debug.h" -#include "swfdec_js.h" #include "swfdec_player_internal.h" -static JSBool -swfdec_js_xml_load (JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +static void +swfdec_xml_do_load (SwfdecAsContext *cx, SwfdecAsObject *obj, guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval) { - SwfdecXml *xml; + SwfdecXml *xml = SWFDEC_XML (obj); const char *url; - xml = swfdec_scriptable_from_object (cx, obj, SWFDEC_TYPE_XML); - if (xml == NULL) - return JS_TRUE; - url = swfdec_js_to_string (cx, argv[0]); - if (url == NULL) - return JS_FALSE; + url = swfdec_as_value_to_string (cx, &argv[0]); swfdec_xml_load (xml, url); - return JS_TRUE; -} - -static JSFunctionSpec xml_methods[] = { - { "load", swfdec_js_xml_load, 1, 0, 0 }, - {0,0,0,0,0} -}; - -static void -swfdec_js_xml_finalize (JSContext *cx, JSObject *obj) -{ - SwfdecXml *conn; - - conn = JS_GetPrivate (cx, obj); - if (conn) { - SWFDEC_SCRIPTABLE (conn)->jsobj = NULL; - g_object_unref (conn); - } -} - -const JSClass xml_class = { - "XML", JSCLASS_HAS_PRIVATE, - JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, - JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, swfdec_js_xml_finalize, - JSCLASS_NO_OPTIONAL_MEMBERS -}; - -static JSBool -swfdec_js_xml_new (JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) -{ - SwfdecXml *xml = swfdec_xml_new (JS_GetContextPrivate (cx)); - - JS_SetPrivate (cx, obj, xml); - SWFDEC_SCRIPTABLE (xml)->jsobj = obj; - *rval = OBJECT_TO_JSVAL (obj); - return JS_TRUE; } void -swfdec_js_add_xml (SwfdecPlayer *player) +swfdec_xml_init_context (SwfdecPlayer *player, guint version) { - JS_InitClass (player->jscx, player->jsobj, NULL, - &xml_class, swfdec_js_xml_new, 0, NULL, xml_methods, - NULL, NULL); + SwfdecAsContext *context; + SwfdecAsObject *stream, *proto; + SwfdecAsValue val; + + g_return_if_fail (SWFDEC_IS_PLAYER (player)); + + context = SWFDEC_AS_CONTEXT (player); + stream = SWFDEC_AS_OBJECT (swfdec_as_object_add_function (context->global, + SWFDEC_AS_STR_NetStream, 0, NULL, 0)); + if (stream == NULL) + return; + swfdec_as_native_function_set_construct_type (SWFDEC_AS_NATIVE_FUNCTION (stream), SWFDEC_TYPE_XML); + proto = swfdec_as_object_new (context); + /* set the right properties on the NetStream object */ + SWFDEC_AS_VALUE_SET_OBJECT (&val, proto); + swfdec_as_object_set_variable (stream, SWFDEC_AS_STR_prototype, &val); + /* set the right properties on the NetStream.prototype object */ + SWFDEC_AS_VALUE_SET_OBJECT (&val, stream); + swfdec_as_object_set_variable (proto, SWFDEC_AS_STR_constructor, &val); + swfdec_as_object_add_function (proto, SWFDEC_AS_STR_load, SWFDEC_TYPE_XML, + swfdec_xml_do_load, 1); } diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index a83a5e1..aa7de2f 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -1070,6 +1070,7 @@ extern void swfdec_movie_color_init_cont extern void swfdec_net_connection_init_context (SwfdecPlayer *player, guint version); extern void swfdec_net_stream_init_context (SwfdecPlayer *player, guint version); extern void swfdec_sprite_movie_init_context (SwfdecPlayer *player, guint version); +extern void swfdec_xml_init_context (SwfdecPlayer *player, guint version); /** * swfdec_player_initialize: * @player: a #SwfdecPlayer @@ -1104,6 +1105,7 @@ swfdec_player_initialize (SwfdecPlayer * swfdec_movie_color_init_context (player, version); swfdec_net_connection_init_context (player, version); swfdec_net_stream_init_context (player, version); + swfdec_xml_init_context (player, version); if (context->state == SWFDEC_AS_CONTEXT_NEW) { context->state = SWFDEC_AS_CONTEXT_RUNNING; swfdec_as_object_set_constructor (player->roots->data, player->MovieClip, FALSE); diff-tree 9b643ffc75f78d2efd849c431e009255605fedca (from 22f8918b633320b23bcdca9eef19627674de174a) Author: Benjamin Otte <otte at gnome.org> Date: Tue Jun 26 15:10:35 2007 +0200 simplify old target handling code diff --git a/libswfdec/swfdec_as_frame.c b/libswfdec/swfdec_as_frame.c index e503c7c..c8013a4 100644 --- a/libswfdec/swfdec_as_frame.c +++ b/libswfdec/swfdec_as_frame.c @@ -214,15 +214,9 @@ swfdec_as_frame_find_variable (SwfdecAsF } g_assert (SWFDEC_IS_AS_FRAME (cur)); /* we've walked the scope chain down. Now look in the special objects. */ - /* 1) the target set via SetTarget */ - if (frame->target) { - if (swfdec_as_object_get_variable (frame->target, variable, &val)) - return frame->target; - } else { - /* The default target is the original object that called into us */ - if (swfdec_as_object_get_variable (SWFDEC_AS_FRAME (cur)->thisp, variable, &val)) - return SWFDEC_AS_FRAME (cur)->thisp; - } + /* 1) the target */ + if (swfdec_as_object_get_variable (frame->target, variable, &val)) + return frame->target; /* 2) the global object */ if (swfdec_as_object_get_variable (SWFDEC_AS_OBJECT (frame)->context->global, variable, &val)) return SWFDEC_AS_OBJECT (frame)->context->global; @@ -255,14 +249,8 @@ swfdec_as_frame_delete_variable (SwfdecA g_assert (SWFDEC_IS_AS_FRAME (cur)); /* we've walked the scope chain down. Now look in the special objects. */ /* 1) the target set via SetTarget */ - if (frame->target) { - if (swfdec_as_object_delete_variable (frame->target, variable)) - return TRUE; - } else { - /* The default target is the original object that called into us */ - if (swfdec_as_object_delete_variable (SWFDEC_AS_FRAME (cur)->thisp, variable)) - return TRUE; - } + if (swfdec_as_object_delete_variable (frame->target, variable)) + return TRUE; /* 2) the global object */ return swfdec_as_object_delete_variable (SWFDEC_AS_OBJECT (frame)->context->global, variable); } diff-tree 22f8918b633320b23bcdca9eef19627674de174a (from dc96e46427dd1426221899de210486dbd315cc29) Author: Benjamin Otte <otte at gnome.org> Date: Tue Jun 26 15:08:49 2007 +0200 fix setting undefined variables This includes a rework of the target management. Every frame now contains a ->target member that is always set to the current target. It also has an ->original_target member that remembers the original target, so a SetTarget call can correctly reset it. The previous notion of ->var_object has been removed. An ->is_local property has been added. This porperty is used during DefineLocal actions to decide wether to set proeprties on the current frame or on the target. (FIXME: needs checking that those variables really are set on the target) diff --git a/libswfdec/swfdec_as_context.c b/libswfdec/swfdec_as_context.c index 4394198..8e06f31 100644 --- a/libswfdec/swfdec_as_context.c +++ b/libswfdec/swfdec_as_context.c @@ -474,6 +474,7 @@ start: goto start; } g_assert (frame->script); + g_assert (frame->target); script = frame->script; stack = frame->stack; version = SWFDEC_AS_EXTRACT_SCRIPT_VERSION (script->version); @@ -677,7 +678,7 @@ swfdec_as_context_eval_set_property (Swf } obj = swfdec_as_frame_find_variable (cx->frame, name); if (obj == NULL || obj == cx->global) - obj = cx->frame->var_object; + obj = cx->frame->target; } swfdec_as_object_set_variable (obj, name, ret); } diff --git a/libswfdec/swfdec_as_frame.c b/libswfdec/swfdec_as_frame.c index 1664161..e503c7c 100644 --- a/libswfdec/swfdec_as_frame.c +++ b/libswfdec/swfdec_as_frame.c @@ -66,13 +66,10 @@ swfdec_as_frame_mark (SwfdecAsObject *ob swfdec_as_object_mark (SWFDEC_AS_OBJECT (frame->next)); if (frame->scope) swfdec_as_object_mark (SWFDEC_AS_OBJECT (frame->scope)); - if (frame->script) { - swfdec_as_object_mark (frame->var_object); - } if (frame->thisp) swfdec_as_object_mark (frame->thisp); - if (frame->target) - swfdec_as_object_mark (frame->target); + swfdec_as_object_mark (frame->target); + swfdec_as_object_mark (frame->original_target); if (frame->function) swfdec_as_object_mark (SWFDEC_AS_OBJECT (frame->function)); for (i = 0; i < frame->n_registers; i++) { @@ -124,8 +121,6 @@ swfdec_as_frame_new (SwfdecAsContext *co frame->pc = script->buffer->data; frame->stack = stack; frame->scope = SWFDEC_AS_SCOPE (frame); - if (frame->next) - frame->var_object = frame->next->var_object; frame->n_registers = script->n_registers; frame->registers = g_slice_alloc0 (sizeof (SwfdecAsValue) * frame->n_registers); if (script->constant_pool) { @@ -176,8 +171,10 @@ swfdec_as_frame_set_this (SwfdecAsFrame g_return_if_fail (SWFDEC_IS_AS_OBJECT (thisp)); frame->thisp = thisp; - if (frame->var_object == NULL) - frame->var_object = thisp; + if (frame->target == NULL) { + frame->target = thisp; + frame->original_target = thisp; + } } /** @@ -285,7 +282,11 @@ swfdec_as_frame_set_target (SwfdecAsFram g_return_if_fail (SWFDEC_IS_AS_FRAME (frame)); g_return_if_fail (target == NULL || SWFDEC_IS_AS_OBJECT (target)); - frame->target = target; + if (target) { + frame->target = target; + } else { + frame->target = frame->original_target; + } } void diff --git a/libswfdec/swfdec_as_frame.h b/libswfdec/swfdec_as_frame.h index a790e47..1473fa4 100644 --- a/libswfdec/swfdec_as_frame.h +++ b/libswfdec/swfdec_as_frame.h @@ -47,11 +47,12 @@ struct _SwfdecAsFrame { const SwfdecAsValue * argv; /* arguments */ /* debugging */ char * function_name; /* name of function */ - /* normal execution */ + /* script execution */ SwfdecScript * script; /* script being executed */ SwfdecAsScope * scope; /* first object in scope chain (either this frame or a with object) */ - SwfdecAsObject * target; /* target to use instead of last object in scope chain */ - SwfdecAsObject * var_object; /* new variables go here */ + SwfdecAsObject * target; /* target to use as last object in scope chain or for SetVariable */ + SwfdecAsObject * original_target;/* original target (used when resetting target) */ + gboolean is_local; /* TRUE if this frame takes local variables */ SwfdecAsValue * registers; /* the registers */ guint n_registers; /* number of allocated registers */ SwfdecConstantPool * constant_pool; /* constant pool currently in use */ diff --git a/libswfdec/swfdec_as_function.c b/libswfdec/swfdec_as_function.c index 1f3bc2f..aee6b90 100644 --- a/libswfdec/swfdec_as_function.c +++ b/libswfdec/swfdec_as_function.c @@ -89,7 +89,7 @@ swfdec_as_function_call (SwfdecAsFunctio return; if (thisp) swfdec_as_frame_set_this (frame, thisp); - frame->var_object = SWFDEC_AS_OBJECT (frame); + frame->is_local = TRUE; frame->argc = n_args; frame->argv = args; frame->return_value = return_value; diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index 7fc4ae6..288c47d 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -50,33 +50,13 @@ #define swfdec_action_has_register(cx, i) \ ((i) < (cx)->frame->n_registers) -static SwfdecMovie * -swfdec_action_get_target (SwfdecAsContext *context) -{ - SwfdecAsObject *target = context->frame->target; - - if (target == NULL) { - SwfdecAsScope *scope = context->frame->scope; - while (scope->next) - scope = scope->next; - g_assert (SWFDEC_IS_AS_FRAME (scope)); - target = SWFDEC_AS_FRAME (scope)->thisp; - } - if (!SWFDEC_IS_MOVIE (target)) { - SWFDEC_ERROR ("no valid target"); - return NULL; - } - return SWFDEC_MOVIE (target); -} - /*** ALL THE ACTION IS HERE ***/ static void swfdec_action_stop (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { - SwfdecMovie *movie = swfdec_action_get_target (cx); - if (movie) - movie->stopped = TRUE; + if (SWFDEC_IS_MOVIE (cx->frame->target)) + SWFDEC_MOVIE (cx->frame->target)->stopped = TRUE; else SWFDEC_ERROR ("no movie to stop"); } @@ -84,9 +64,8 @@ swfdec_action_stop (SwfdecAsContext *cx, static void swfdec_action_play (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { - SwfdecMovie *movie = swfdec_action_get_target (cx); - if (movie) - movie->stopped = FALSE; + if (SWFDEC_IS_MOVIE (cx->frame->target)) + SWFDEC_MOVIE (cx->frame->target)->stopped = FALSE; else SWFDEC_ERROR ("no movie to play"); } @@ -94,8 +73,8 @@ swfdec_action_play (SwfdecAsContext *cx, static void swfdec_action_next_frame (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { - SwfdecMovie *movie = swfdec_action_get_target (cx); - if (movie) { + if (SWFDEC_IS_MOVIE (cx->frame->target)) { + SwfdecMovie *movie = SWFDEC_MOVIE (cx->frame->target); if (movie->frame + 1 < movie->n_frames) { swfdec_movie_goto (movie, movie->frame + 1); } else { @@ -109,8 +88,8 @@ swfdec_action_next_frame (SwfdecAsContex static void swfdec_action_previous_frame (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { - SwfdecMovie *movie = swfdec_action_get_target (cx); - if (movie) { + if (SWFDEC_IS_MOVIE (cx->frame->target)) { + SwfdecMovie *movie = SWFDEC_MOVIE (cx->frame->target); if (movie->frame > 0) { swfdec_movie_goto (movie, movie->frame - 1); } else { @@ -124,7 +103,6 @@ swfdec_action_previous_frame (SwfdecAsCo static void swfdec_action_goto_frame (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { - SwfdecMovie *movie = swfdec_action_get_target (cx); guint frame; if (len != 2) { @@ -132,7 +110,8 @@ swfdec_action_goto_frame (SwfdecAsContex return; } frame = GUINT16_FROM_LE (*((guint16 *) data)); - if (movie) { + if (SWFDEC_IS_SPRITE_MOVIE (cx->frame->target)) { + SwfdecMovie *movie = SWFDEC_MOVIE (cx->frame->target); swfdec_movie_goto (movie, frame); movie->stopped = TRUE; } else { @@ -143,14 +122,13 @@ swfdec_action_goto_frame (SwfdecAsContex static void swfdec_action_goto_label (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { - SwfdecMovie *movie = swfdec_action_get_target (cx); - if (!memchr (data, 0, len)) { SWFDEC_ERROR ("GotoLabel action does not specify a string"); return; } - if (SWFDEC_IS_SPRITE_MOVIE (movie)) { + if (SWFDEC_IS_SPRITE_MOVIE (cx->frame->target)) { + SwfdecMovie *movie = SWFDEC_MOVIE (cx->frame->target); int frame = swfdec_sprite_get_frame (SWFDEC_SPRITE_MOVIE (movie)->sprite, (const char *) data); if (frame == -1) return; @@ -197,7 +175,6 @@ swfdec_action_goto_frame2 (SwfdecAsConte guint bias; gboolean play; SwfdecAsValue *val; - SwfdecMovie *movie; swfdec_bits_init_data (&bits, data, len); if (swfdec_bits_getbits (&bits, 6)) { @@ -209,9 +186,9 @@ swfdec_action_goto_frame2 (SwfdecAsConte bias = swfdec_bits_get_u16 (&bits); } val = swfdec_as_stack_peek (cx->frame->stack, 1); - movie = swfdec_action_get_target (cx); /* now set it */ - if (movie) { + if (SWFDEC_IS_SPRITE_MOVIE (cx->frame->target)) { + SwfdecMovie *movie = SWFDEC_MOVIE (cx->frame->target); int frame = swfdec_value_to_frame (cx, movie, val); if (frame >= 0) { frame += bias; @@ -252,7 +229,6 @@ static void swfdec_action_wait_for_frame2 (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { jsval val; - SwfdecMovie *movie; if (len != 1) { SWFDEC_ERROR ("WaitForFrame2 needs a 1-byte data"); @@ -260,8 +236,8 @@ swfdec_action_wait_for_frame2 (SwfdecAsC } val = cx->fp->sp[-1]; cx->fp->sp--; - movie = swfdec_action_get_target (cx); - if (movie) { + if (SWFDEC_IS_SPRITE_MOVIE (cx->frame->target)) + SwfdecMovie *movie = SWFDEC_MOVIE (cx->frame->target); int frame = swfdec_value_to_frame (cx, movie, val); guint jump = data[2]; guint loaded; @@ -293,12 +269,12 @@ swfdec_action_wait_for_frame (SwfdecAsCo SWFDEC_ERROR ("WaitForFrame action length invalid (is %u, should be 3", len); return; } - movie = swfdec_action_get_target (cx); - if (movie == NULL) { + if (!SWFDEC_IS_SPRITE_MOVIE (cx->frame->target)) { SWFDEC_ERROR ("no movie for WaitForFrame"); return; } + movie = SWFDEC_MOVIE (cx->frame->target); frame = GUINT16_FROM_LE (*((guint16 *) data)); jump = data[2]; if (SWFDEC_MOVIE (movie->swf->movie) == movie) { @@ -489,7 +465,7 @@ swfdec_action_get_property (SwfdecAsCont val = swfdec_as_stack_peek (cx->frame->stack, 1); swfdec_as_interpret_eval (cx, NULL, val); if (SWFDEC_AS_VALUE_IS_UNDEFINED (val)) { - obj = SWFDEC_AS_OBJECT (swfdec_action_get_target (cx)); + obj = cx->frame->target; } else if (SWFDEC_AS_VALUE_IS_OBJECT (val)) { obj = SWFDEC_AS_VALUE_GET_OBJECT (val); } else { @@ -519,7 +495,7 @@ swfdec_action_set_property (SwfdecAsCont val = swfdec_as_stack_peek (cx->frame->stack, 3); swfdec_as_interpret_eval (cx, NULL, val); if (SWFDEC_AS_VALUE_IS_UNDEFINED (val)) { - obj = cx->frame->var_object; + obj = cx->frame->target; } else if (SWFDEC_AS_VALUE_IS_OBJECT (val)) { obj = SWFDEC_AS_VALUE_GET_OBJECT (val); } else { @@ -881,7 +857,6 @@ swfdec_action_increment (SwfdecAsContext static void swfdec_action_get_url (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { - SwfdecMovie *movie; SwfdecBits bits; char *url, *target; @@ -897,9 +872,8 @@ swfdec_action_get_url (SwfdecAsContext * if (swfdec_bits_left (&bits)) { SWFDEC_WARNING ("leftover bytes in GetURL action"); } - movie = swfdec_action_get_target (cx); - if (movie) - swfdec_movie_load (movie, url, target); + if (SWFDEC_IS_MOVIE (cx->frame->target)) + swfdec_movie_load (SWFDEC_MOVIE (cx->frame->target), url, target); else SWFDEC_WARNING ("no movie to load"); g_free (url); @@ -911,7 +885,6 @@ swfdec_action_get_url2 (SwfdecAsContext { const char *target, *url; guint method; - SwfdecMovie *movie; if (len != 1) { SWFDEC_ERROR ("GetURL2 requires 1 byte of data, not %u", len); @@ -933,9 +906,8 @@ swfdec_action_get_url2 (SwfdecAsContext if (data[0] & 1) { SWFDEC_FIXME ("implement LoadVariables"); } - movie = swfdec_action_get_target (cx); - if (movie) - swfdec_movie_load (movie, url, target); + if (SWFDEC_IS_MOVIE (cx->frame->target)) + swfdec_movie_load (SWFDEC_MOVIE (cx->frame->target), url, target); else SWFDEC_WARNING ("no movie to load"); } @@ -1289,8 +1261,7 @@ swfdec_action_start_drag (SwfdecAsContex swfdec_as_stack_ensure_size (stack, 3); if (swfdec_as_interpret_eval (cx, NULL, swfdec_as_stack_peek (stack, 1)) == SWFDEC_AS_STR_EMPTY) { - SWFDEC_AS_VALUE_SET_OBJECT (swfdec_as_stack_peek (stack, 1), - SWFDEC_AS_OBJECT (swfdec_action_get_target (cx))); + SWFDEC_AS_VALUE_SET_OBJECT (swfdec_as_stack_peek (stack, 1), cx->frame->target); } if (swfdec_as_value_to_number (cx, swfdec_as_stack_peek (stack, 3))) { swfdec_as_stack_ensure_size (stack, 7); @@ -1494,12 +1465,13 @@ swfdec_action_define_function (SwfdecAsC } /* see function-scope tests */ if (cx->version > 5) { - fun = swfdec_as_script_function_new (frame->scope ? frame->scope : SWFDEC_AS_SCOPE (frame)); + /* FIXME: or original target? */ + fun = swfdec_as_script_function_new (frame->scope ? frame->scope : SWFDEC_AS_SCOPE (frame), frame->target); } else { SwfdecAsScope *scope = frame->scope ? frame->scope : SWFDEC_AS_SCOPE (frame); while (scope->next) scope = scope->next; - fun = swfdec_as_script_function_new (scope); + fun = swfdec_as_script_function_new (scope, frame->target); } if (fun == NULL) return; @@ -1582,7 +1554,7 @@ swfdec_action_define_function (SwfdecAsC /* FIXME: really varobj? Not eval or sth like that? */ function_name = swfdec_as_context_get_string (cx, function_name); SWFDEC_AS_VALUE_SET_OBJECT (&funval, SWFDEC_AS_OBJECT (fun)); - swfdec_as_object_set_variable (frame->var_object, function_name, &funval); + swfdec_as_object_set_variable (frame->target, function_name, &funval); swfdec_as_object_unroot (SWFDEC_AS_OBJECT (fun)); } @@ -1673,10 +1645,16 @@ swfdec_action_target_path (SwfdecAsConte static void swfdec_action_define_local (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { + SwfdecAsObject *target; const char *name; name = swfdec_as_value_to_string (cx, swfdec_as_stack_peek (cx->frame->stack, 2)); - swfdec_as_object_set_variable (cx->frame->var_object, name, + if (cx->frame->is_local) { + target = SWFDEC_AS_OBJECT (cx->frame); + } else { + target = cx->frame->target; + } + swfdec_as_object_set_variable (target, name, swfdec_as_stack_peek (cx->frame->stack, 1)); swfdec_as_stack_pop_n (cx->frame->stack, 2); } @@ -1685,10 +1663,16 @@ static void swfdec_action_define_local2 (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { SwfdecAsValue val = { 0, }; + SwfdecAsObject *target; const char *name; name = swfdec_as_value_to_string (cx, swfdec_as_stack_pop (cx->frame->stack)); - swfdec_as_object_set_variable (cx->frame->var_object, name, &val); + if (cx->frame->is_local) { + target = SWFDEC_AS_OBJECT (cx->frame); + } else { + target = cx->frame->target; + } + swfdec_as_object_set_variable (target, name, &val); } static void diff --git a/libswfdec/swfdec_as_script_function.c b/libswfdec/swfdec_as_script_function.c index 2144816..3140143 100644 --- a/libswfdec/swfdec_as_script_function.c +++ b/libswfdec/swfdec_as_script_function.c @@ -38,6 +38,8 @@ swfdec_as_script_function_call (SwfdecAs frame = swfdec_as_frame_new (SWFDEC_AS_OBJECT (function)->context, script->script); SWFDEC_AS_SCOPE (frame)->next = script->scope; frame->function = function; + frame->target = script->target; + frame->original_target = script->target; return frame; } @@ -85,13 +87,14 @@ swfdec_as_script_function_init (SwfdecAs } SwfdecAsFunction * -swfdec_as_script_function_new (SwfdecAsScope *scope) +swfdec_as_script_function_new (SwfdecAsScope *scope, SwfdecAsObject *target) { SwfdecAsValue val; SwfdecAsFunction *fun; SwfdecAsObject *proto; g_return_val_if_fail (SWFDEC_IS_AS_SCOPE (scope), NULL); + g_return_val_if_fail (SWFDEC_IS_AS_OBJECT (target), NULL); fun = swfdec_as_function_create (SWFDEC_AS_OBJECT (scope)->context, SWFDEC_TYPE_AS_SCRIPT_FUNCTION, sizeof (SwfdecAsScriptFunction)); @@ -105,6 +108,7 @@ swfdec_as_script_function_new (SwfdecAsS SWFDEC_AS_VALUE_SET_OBJECT (&val, proto); swfdec_as_object_set_variable (SWFDEC_AS_OBJECT (fun), SWFDEC_AS_STR_prototype, &val); SWFDEC_AS_SCRIPT_FUNCTION (fun)->scope = scope; + SWFDEC_AS_SCRIPT_FUNCTION (fun)->target = target; return fun; } diff --git a/libswfdec/swfdec_as_script_function.h b/libswfdec/swfdec_as_script_function.h index 1034416..9f47919 100644 --- a/libswfdec/swfdec_as_script_function.h +++ b/libswfdec/swfdec_as_script_function.h @@ -42,7 +42,8 @@ struct _SwfdecAsScriptFunction { /* for script script_functions */ SwfdecScript * script; /* script being executed or NULL when native */ - SwfdecAsScope * scope; /* scope this script_function was defined in or NULL */ + SwfdecAsScope * scope; /* scope this script_function was defined in */ + SwfdecAsObject * target; /* target this object was defined in */ }; struct _SwfdecAsScriptFunctionClass { @@ -51,8 +52,8 @@ struct _SwfdecAsScriptFunctionClass { GType swfdec_as_script_function_get_type (void); -/* FIXME: verify what scope a script_function gets that is defined inside a With statement */ -SwfdecAsFunction * swfdec_as_script_function_new (SwfdecAsScope * scope); +SwfdecAsFunction * swfdec_as_script_function_new (SwfdecAsScope * scope, + SwfdecAsObject * target); G_END_DECLS diff-tree dc96e46427dd1426221899de210486dbd315cc29 (from parents) Merge: fad705a672d2685cd5572f1bbe4fa9e17776441f 5cdaada235a5bf34316aa5faa3a3b4fc1d2b515c Author: Benjamin Otte <otte at gnome.org> Date: Tue Jun 26 13:41:25 2007 +0200 Merge branch 'master' into as diff-tree 5cdaada235a5bf34316aa5faa3a3b4fc1d2b515c (from 00d9cad4c135dba8df2cffea271d0ad5935440b1) Author: Benjamin Otte <otte at gnome.org> Date: Tue Jun 26 13:35:15 2007 +0200 Check for libswscale, too diff --git a/configure.ac b/configure.ac index 1766eaf..f366094 100644 --- a/configure.ac +++ b/configure.ac @@ -196,7 +196,7 @@ AC_ARG_ENABLE(ffmpeg, enable_ffmpeg="yes") if test "$enable_ffmpeg" = "yes"; then - PKG_CHECK_MODULES(FFMPEG, libavcodec, HAVE_FFMPEG=yes, HAVE_FFMPEG=no) + PKG_CHECK_MODULES(FFMPEG, libavcodec libswscale, HAVE_FFMPEG=yes, HAVE_FFMPEG=no) AC_SUBST(FFMPEG_CFLAGS) AC_SUBST(FFMPEG_LIBS) if test "x$HAVE_FFMPEG" = xyes; then diff-tree 00d9cad4c135dba8df2cffea271d0ad5935440b1 (from 27f2f8fe232d392ddf50e97116724f507cc05a43) Author: Benjamin Otte <otte at gnome.org> Date: Tue Jun 26 13:35:01 2007 +0200 initialize the struct with 0ed members Avoids SEGV when assuming the swscaler context is empty. diff --git a/libswfdec/swfdec_codec_ffmpeg.c b/libswfdec/swfdec_codec_ffmpeg.c index 8b7463c..c80f117 100644 --- a/libswfdec/swfdec_codec_ffmpeg.c +++ b/libswfdec/swfdec_codec_ffmpeg.c @@ -280,7 +280,7 @@ swfdec_video_decoder_ffmpeg_new (SwfdecV if (ctx == NULL) return NULL; - codec = g_new (SwfdecVideoDecoderFFMpeg, 1); + codec = g_new0 (SwfdecVideoDecoderFFMpeg, 1); codec->decoder.decode = swfdec_video_decoder_ffmpeg_decode; codec->decoder.free = swfdec_video_decoder_ffmpeg_free; codec->ctx = ctx; diff-tree 27f2f8fe232d392ddf50e97116724f507cc05a43 (from ed66672b6bd13a613aaf875d2f898cc2f16a47b9) Author: Benjamin Otte <otte at gnome.org> Date: Tue Jun 26 12:32:15 2007 +0200 add support for VP6 to ffmpeg diff --git a/libswfdec/swfdec_codec_ffmpeg.c b/libswfdec/swfdec_codec_ffmpeg.c index 5dc8f3c..8b7463c 100644 --- a/libswfdec/swfdec_codec_ffmpeg.c +++ b/libswfdec/swfdec_codec_ffmpeg.c @@ -270,6 +270,9 @@ swfdec_video_decoder_ffmpeg_new (SwfdecV case SWFDEC_VIDEO_FORMAT_SCREEN: id = CODEC_ID_FLASHSV; break; + case SWFDEC_VIDEO_FORMAT_VP6: + id = CODEC_ID_VP6F; + break; default: return NULL; } diff-tree ed66672b6bd13a613aaf875d2f898cc2f16a47b9 (from 8e04b92f5880361d5a34ad4f6674de3c88ad4377) Author: Benjamin Otte <otte at gnome.org> Date: Tue Jun 26 12:29:42 2007 +0200 update the ffmpeg code to something newer than Debian stable diff --git a/libswfdec/swfdec_codec_ffmpeg.c b/libswfdec/swfdec_codec_ffmpeg.c index 8f333e8..5dc8f3c 100644 --- a/libswfdec/swfdec_codec_ffmpeg.c +++ b/libswfdec/swfdec_codec_ffmpeg.c @@ -22,6 +22,7 @@ #endif #include <string.h> #include <avcodec.h> +#include <swscale.h> #include "swfdec_codec_audio.h" #include "swfdec_codec_video.h" @@ -124,7 +125,7 @@ swfdec_audio_decoder_ffmpeg_push (Swfdec outbuf = swfdec_buffer_new_and_alloc (AVCODEC_MAX_AUDIO_FRAME_SIZE); for (amount = 0; amount < buffer->length; amount += len) { - len = avcodec_decode_audio (ffmpeg->ctx, (short *) outbuf->data, &out_size, buffer->data + amount, buffer->length - amount); + len = avcodec_decode_audio2 (ffmpeg->ctx, (short *) outbuf->data, &out_size, buffer->data + amount, buffer->length - amount); if (len < 0) { SWFDEC_ERROR ("Error %d while decoding", len); @@ -205,6 +206,7 @@ typedef struct { SwfdecVideoDecoder decoder; AVCodecContext * ctx; /* out context (d'oh) */ AVFrame * frame; /* the frame we use for decoding */ + struct SwsContext * sws; /* the format conversion */ } SwfdecVideoDecoderFFMpeg; SwfdecBuffer * @@ -221,12 +223,19 @@ swfdec_video_decoder_ffmpeg_decode (Swfd SWFDEC_WARNING ("error decoding frame"); return NULL; } + if (codec->sws == NULL) { + codec->sws = sws_getContext (codec->ctx->width, codec->ctx->height, codec->ctx->pix_fmt, + codec->ctx->width, codec->ctx->height, PIX_FMT_RGB32, 0, NULL, NULL, NULL); + if (codec->sws == NULL) { + SWFDEC_ERROR ("Could not get conversion context"); + return NULL; + } + } ret = swfdec_buffer_new_and_alloc (codec->ctx->width * codec->ctx->height * 4); avpicture_fill (&picture, ret->data, PIX_FMT_RGB32, codec->ctx->width, codec->ctx->height); - img_convert (&picture, PIX_FMT_RGB32, - (AVPicture *) codec->frame, codec->ctx->pix_fmt, - codec->ctx->width, codec->ctx->height); + sws_scale (codec->sws, codec->frame->data, codec->frame->linesize, 0, codec->ctx->height, + picture.data, picture.linesize); *width = codec->ctx->width; *height = codec->ctx->height; *rowstride = codec->ctx->width * 4; @@ -238,6 +247,9 @@ swfdec_video_decoder_ffmpeg_free (Swfdec { SwfdecVideoDecoderFFMpeg *codec = (SwfdecVideoDecoderFFMpeg *) dec; + if (codec->sws) { + sws_freeContext (codec->sws); + }; avcodec_close (codec->ctx); av_free (codec->ctx); av_free (codec->frame);
Possibly Parallel Threads
- Branch 'as' - 7 commits - libswfdec/Makefile.am libswfdec/swfdec_as_context.c libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame.h libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_object.c libswfdec/swfdec_as_object.h libswfdec/swfdec_as_strings.c
- Branch 'as' - 5 commits - libswfdec/Makefile.am libswfdec/swfdec_as_strings.c libswfdec/swfdec_js_net_stream.c libswfdec/swfdec_movie.c libswfdec/swfdec_net_connection.c libswfdec/swfdec_net_stream_as.c libswfdec/swfdec_net_stream.c
- 11 commits - libswfdec/Makefile.am libswfdec/swfdec_connection.c libswfdec/swfdec_connection.h libswfdec/swfdec_flv_decoder.c libswfdec/swfdec_js.c libswfdec/swfdec_js_connection.c libswfdec/swfdec_js.h libswfdec/swfdec_js_net_stream.c
- Branch 'as' - 4 commits - libswfdec/Makefile.am libswfdec/swfdec_as_context.c libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_interpret.h libswfdec/swfdec_as_object.c libswfdec/swfdec_as_types.c libswfdec/swfdec_as_types.h
- 9 commits - libswfdec/js libswfdec/Makefile.am libswfdec/swfdec_audio_stream.c libswfdec/swfdec_audio_stream.h libswfdec/swfdec_cache.c libswfdec/swfdec_cached.c libswfdec/swfdec_cached.h libswfdec/swfdec_edittext_movie.c libswfdec/swfdec_image.c