port to new API
[swfdec.git] / test / crashfinder.c
blob3c4a4a7726bd7db5630d4908cae83cffb7fd19c7
1 /* Swfdec
2 * Copyright (C) 2007 Pekka Lampila <pekka.lampila@iki.fi>
3 * 2007 Benjamin Otte <otte@gnome.org>
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 * Boston, MA 02110-1301 USA
21 #ifdef HAVE_CONFIG_H
22 #include "config.h"
23 #endif
25 #include <libswfdec/swfdec.h>
27 int
28 main (int argc, char **argv)
30 GOptionContext *context;
31 GError *err;
32 SwfdecPlayer *player;
33 SwfdecLoader *loader;
34 guint i;
35 cairo_surface_t *surface;
36 cairo_t *cr;
37 gboolean aborts;
38 glong play_per_file = 30;
39 glong max_per_file = 60;
40 glong max_per_advance = 10;
41 GTimer *timer;
42 char **filenames = NULL;
43 const GOptionEntry entries[] = {
45 "play-time", 'p', 0, G_OPTION_ARG_INT, &play_per_file,
46 "How many seconds will be played from each file (default 30)", NULL
49 "max-per-file", '\0', 0, G_OPTION_ARG_INT, &max_per_file,
50 "Maximum runtime in seconds allowed for each file (default 60)", NULL
53 "max-per-advance", '\0', 0, G_OPTION_ARG_INT, &max_per_advance,
54 "Maximum runtime in seconds allowed for each advance (default 10)", NULL
57 G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_FILENAME_ARRAY, &filenames,
58 NULL, "<INPUT FILE> <OUTPUT FILE>"
61 NULL
65 // init
66 swfdec_init ();
68 // read command line params
69 context = g_option_context_new ("Run a Flash file trying to crash Swfdec");
70 g_option_context_add_main_entries (context, entries, NULL);
72 if (g_option_context_parse (context, &argc, &argv, &err) == FALSE) {
73 g_printerr ("Couldn't parse command-line options: %s\n", err->message);
74 g_error_free (err);
75 return 1;
78 if (filenames == NULL || g_strv_length (filenames) < 1) {
79 g_printerr ("At least one input filename is required\n");
80 return 1;
83 // make them milliseconds
84 play_per_file *= 1000;
85 max_per_file *= 1000;
86 max_per_advance *= 1000;
88 // create surface
89 surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1);
90 cr = cairo_create (surface);
92 aborts = FALSE;
93 for (i = 0; i < g_strv_length (filenames); i++)
95 glong played, advance, elapsed;
97 g_print ("Running: %s\n", filenames[i]);
99 // start timer
100 timer = g_timer_new ();
102 // create player
103 loader = swfdec_file_loader_new (filenames[i]);
104 player = swfdec_player_new (NULL);
106 if (loader->error) {
107 g_printerr ("Error loading %s: %s\n", filenames[i], loader->error);
108 g_object_unref (loader);
109 continue;
112 swfdec_player_set_loader (player, loader);
114 // loop until we have played what we wanted, or timelimit is hit
115 played = 0;
116 elapsed = 0;
117 while (played < play_per_file &&
118 !swfdec_as_context_is_aborted (SWFDEC_AS_CONTEXT (player)))
120 elapsed = (glong)(g_timer_elapsed (timer, NULL) * 1000);
121 if (elapsed >= max_per_file)
122 break;
123 swfdec_player_set_maximum_runtime (player,
124 MIN (max_per_advance, max_per_file - elapsed));
126 advance = swfdec_player_get_next_event (player);
127 if (advance == -1)
128 break;
129 swfdec_player_advance (player, advance);
131 swfdec_player_render (player, cr, 0, 0, 0, 0);
133 played += advance;
136 if (elapsed >= max_per_file ||
137 swfdec_as_context_is_aborted (SWFDEC_AS_CONTEXT (player))) {
138 g_print ("Aborted: %s\n", filenames[i]);
139 aborts = TRUE;
140 } else {
141 g_print ("Finished: %s\n", filenames[i]);
144 // clean up
145 g_object_unref (player);
146 g_timer_destroy (timer);
149 cairo_destroy (cr);
150 cairo_surface_destroy (surface);
152 if (aborts) {
153 return 1;
154 } else {
155 return 0;