[Swfdec] 3 commits - libswfdec/swfdec_loader.c
libswfdec/swfdec_script.c libswfdec/swfdec_video.c
Benjamin Otte
company at kemper.freedesktop.org
Thu Feb 8 04:55:33 PST 2007
libswfdec/swfdec_loader.c | 21 +++++++++++++++------
libswfdec/swfdec_script.c | 7 ++++++-
libswfdec/swfdec_video.c | 23 ++++++++++++++++-------
3 files changed, 37 insertions(+), 14 deletions(-)
New commits:
diff-tree e066302f8172f17b68430c6b428a386c41c516c4 (from 39a3a07397847fe45e2c2ef1f1c1b343bfd1690a)
Author: Benjamin Otte <otte at gnome.org>
Date: Thu Feb 8 13:28:04 2007 +0100
Make the filename be the part of the uri that sits before the first '?' and does not contain a '/'
diff --git a/libswfdec/swfdec_loader.c b/libswfdec/swfdec_loader.c
index 557fa1c..756e174 100644
--- a/libswfdec/swfdec_loader.c
+++ b/libswfdec/swfdec_loader.c
@@ -365,19 +365,28 @@ swfdec_loader_eof (SwfdecLoader *loader)
char *
swfdec_loader_get_filename (SwfdecLoader *loader)
{
- char *start, *ret;
+ char *start, *end, *ret;
g_return_val_if_fail (SWFDEC_IS_LOADER (loader), NULL);
/* every loader must set this */
g_return_val_if_fail (loader->url != NULL, NULL);
- start = strrchr (loader->url, '/');
- if (start == NULL) {
- start = loader->url;
+ end = strchr (loader->url, '?');
+ if (end) {
+ char *next = NULL;
+ do {
+ start = next ? next + 1 : loader->url;
+ next = strchr (start, '/');
+ } while (next != NULL && next < end);
} else {
- start++;
+ start = strrchr (loader->url, '/');
+ if (start == NULL) {
+ start = loader->url;
+ } else {
+ start++;
+ }
}
- ret = g_filename_from_utf8 (start, -1, NULL, NULL, NULL);
+ ret = g_filename_from_utf8 (start, end ? end - start : -1, NULL, NULL, NULL);
if (ret == NULL)
ret = g_strdup ("unknown.swf");
diff-tree 39a3a07397847fe45e2c2ef1f1c1b343bfd1690a (from f95a7844826c8edf6e0d9edda090cf89d72b9d7f)
Author: Benjamin Otte <otte at gnome.org>
Date: Thu Feb 8 12:42:53 2007 +0100
Fix crash when trying to use a video stream of a placeholder
If the video is supposed to be loaded via netstream, a placeholder object is
created. Don't play if this is detected. Also don't play if the video uses an
unsupported codec.
diff --git a/libswfdec/swfdec_video.c b/libswfdec/swfdec_video.c
index 7d89860..867259c 100644
--- a/libswfdec/swfdec_video.c
+++ b/libswfdec/swfdec_video.c
@@ -130,14 +130,20 @@ swfdec_video_input_new (SwfdecVideo *vid
{
SwfdecVideoInput *input = g_new0 (SwfdecVideoInput, 1);
+ if (video->n_frames == 0)
+ return NULL;
+ if (video->codec == NULL)
+ return NULL;
+ if (video->codec)
+ input->decoder = swfdec_video_codec_init (video->codec);
+ if (input->decoder == NULL)
+ return NULL;
input->input.get_image = swfdec_video_input_get_image;
input->input.iterate = swfdec_video_input_iterate;
input->input.finalize = swfdec_video_input_finalize;
g_object_ref (video);
input->video = video;
input->current_frame = (guint) -1;
- if (video->codec)
- input->decoder = swfdec_video_codec_init (video->codec);
return &input->input;
}
@@ -154,7 +160,8 @@ swfdec_video_create_movie (SwfdecGraphic
movie->video = SWFDEC_VIDEO (graphic);
g_object_ref (graphic);
- swfdec_video_movie_set_input (movie, input);
+ if (input)
+ swfdec_video_movie_set_input (movie, input);
return SWFDEC_MOVIE (movie);
}
@@ -213,10 +220,12 @@ tag_func_define_video (SwfdecSwfDecoder
SWFDEC_LOG (" deblocking: %d", deblocking);
SWFDEC_LOG (" smoothing: %d", smoothing);
SWFDEC_LOG (" format: %d", (int) video->format);
- video->codec = swfdec_codec_get_video (video->format);
- if (video->codec == NULL) {
- SWFDEC_WARNING ("no codec for format %d", (int) video->format);
- return SWFDEC_STATUS_OK;
+ if (video->format != SWFDEC_VIDEO_FORMAT_UNDEFINED) {
+ video->codec = swfdec_codec_get_video (video->format);
+ if (video->codec == NULL) {
+ SWFDEC_WARNING ("no codec for format %d", (int) video->format);
+ return SWFDEC_STATUS_OK;
+ }
}
return SWFDEC_STATUS_OK;
}
diff-tree f95a7844826c8edf6e0d9edda090cf89d72b9d7f (from 998ea3e494c4d6f2d798085b3df1e4da07b18a68)
Author: Benjamin Otte <otte at gnome.org>
Date: Thu Feb 8 12:16:23 2007 +0100
fix potential segfault when DefineFunction is called inside DefineFunction
the problem is that constant pools may refer to the outermost function which the
old code asserted would not be possible.
diff --git a/libswfdec/swfdec_script.c b/libswfdec/swfdec_script.c
index c416f64..74b9934 100644
--- a/libswfdec/swfdec_script.c
+++ b/libswfdec/swfdec_script.c
@@ -109,7 +109,12 @@ swfdec_constant_pool_get_area (SwfdecScr
return NULL;
start = (guint8 *) g_ptr_array_index (pool, 0) - 5;
buffer = script->buffer;
- g_assert (start >= buffer->data);
+ if (start < buffer->data) {
+ /* DefineFunction inside DefineFunction */
+ g_assert (buffer->parent != NULL);
+ buffer = buffer->parent;
+ g_assert (start >= buffer->data);
+ }
g_assert (start + 3 < buffer->data + buffer->length);
g_assert (*start == 0x88);
len = 3 + (start[1] | start[2] << 8);
More information about the Swfdec
mailing list