diff -ru gnome-mplayer-1.0.4-orig/ChangeLog gnome-mplayer-1.0.4/ChangeLog --- gnome-mplayer-1.0.4-orig/ChangeLog 2011-07-01 12:37:25.000000000 -0400 +++ gnome-mplayer-1.0.4/ChangeLog 2011-07-09 21:02:50.000000000 -0400 @@ -1,3 +1,6 @@ +Development + Raise event on incomplete QuickTime file, and mark it for retry + Fix compile issue with alsa is not being used 1.0.4 Remove vdpau failure detection as it doesn't work Quit mplayer on vdpau restart, mplayer doesn't want to die diff -ru gnome-mplayer-1.0.4-orig/src/gui.c gnome-mplayer-1.0.4/src/gui.c --- gnome-mplayer-1.0.4-orig/src/gui.c 2011-06-27 10:59:45.000000000 -0400 +++ gnome-mplayer-1.0.4/src/gui.c 2011-07-09 21:04:12.000000000 -0400 @@ -5073,7 +5073,7 @@ gtk_spin_button_set_value(GTK_SPIN_BUTTON(config_volume), gm_pref_store_get_int(gm_store, VOLUME)); gm_pref_store_free(gm_store); gtk_entry_set_width_chars(GTK_ENTRY(config_volume), 6); - gtk_entry_set_editable(GTK_ENTRY(config_volume), FALSE); + gtk_editable_set_editable(GTK_EDITABLE(config_volume), FALSE); gtk_entry_set_alignment(GTK_ENTRY(config_volume), 1); gtk_widget_show(config_volume); i++; @@ -6052,6 +6052,11 @@ g_strlcpy(idledata->media_info, text, 1024); g_thread_create(get_cover_art, metadata, FALSE, NULL); break; + + case ATTRIBUTE_RETRY_ON_FULL_CACHE: + idledata->retry_on_full_cache = gmtk_media_player_get_attribute_boolean (GMTK_MEDIA_PLAYER(media), ATTRIBUTE_RETRY_ON_FULL_CACHE); + break; + default: if (verbose) { printf("Unhandled attribute change %i\n", attribute); diff -ru gnome-mplayer-1.0.4-orig/src/libgmtk/gmtk_media_player.c gnome-mplayer-1.0.4/src/libgmtk/gmtk_media_player.c --- gnome-mplayer-1.0.4-orig/src/libgmtk/gmtk_media_player.c 2011-06-28 12:19:18.000000000 -0400 +++ gnome-mplayer-1.0.4/src/libgmtk/gmtk_media_player.c 2011-07-09 21:04:50.000000000 -0400 @@ -69,15 +69,27 @@ if (event && event->event_name != NULL && (event->player->restart == FALSE || event->event_data_int == ATTRIBUTE_AF_EXPORT_FILENAME)) { - if (g_strcasecmp(event->event_name, "position-changed") == 0 || - g_strcasecmp(event->event_name, "cache-percent-changed") == 0) { - g_signal_emit_by_name(event->player, event->event_name, event->event_data_double); - } else if (g_strcasecmp(event->event_name, "size_allocate") == 0) { - g_signal_emit_by_name(event->player, event->event_name, event->event_allocation); - } else { - g_signal_emit_by_name(event->player, event->event_name, event->event_data_int); - } + switch (event->type) { + case EVENT_TYPE_INT: + g_signal_emit_by_name(event->player, event->event_name, event->event_data_int); + break; + + case EVENT_TYPE_DOUBLE: + g_signal_emit_by_name(event->player, event->event_name, event->event_data_double); + break; + + case EVENT_TYPE_BOOLEAN: + g_signal_emit_by_name(event->player, event->event_name, event->event_data_boolean); + break; + + case EVENT_TYPE_ALLOCATION: + g_signal_emit_by_name(event->player, event->event_name, event->event_allocation); + break; + + default: + printf("undefined event %s\n", event->event_name); + } g_free(event->event_name); } if (event) @@ -93,6 +105,7 @@ event = g_new0(GmtkMediaPlayerEvent, 1); event->player = player; + event->type = EVENT_TYPE_INT; event->event_name = g_strdup(name); event->event_data_int = value; g_idle_add(signal_event, event); @@ -104,17 +117,31 @@ event = g_new0(GmtkMediaPlayerEvent, 1); event->player = player; + event->type = EVENT_TYPE_DOUBLE; event->event_name = g_strdup(name); event->event_data_double = value; g_idle_add(signal_event, event); } +void create_event_boolean(GmtkMediaPlayer * player, const gchar * name, gboolean value) +{ + GmtkMediaPlayerEvent *event; + + event = g_new0(GmtkMediaPlayerEvent, 1); + event->player = player; + event->type = EVENT_TYPE_BOOLEAN; + event->event_name = g_strdup(name); + event->event_data_boolean = value; + g_idle_add(signal_event, event); +} + void create_event_allocation(GmtkMediaPlayer * player, const gchar * name, GtkAllocation * allocation) { GmtkMediaPlayerEvent *event; event = g_new0(GmtkMediaPlayerEvent, 1); event->player = player; + event->type = EVENT_TYPE_ALLOCATION; event->event_name = g_strdup(name); event->event_allocation = allocation; g_idle_add(signal_event, event); @@ -300,6 +327,7 @@ player->channel_in = NULL; player->channel_out = NULL; player->channel_err = NULL; + player->retry_on_full_cache = FALSE; } static void gmtk_media_player_dispose(GObject * object) @@ -993,6 +1021,10 @@ ret = player->hardware_ac3; break; + case ATTRIBUTE_RETRY_ON_FULL_CACHE: + ret = player->retry_on_full_cache; + break; + default: if (player->debug) printf("Unsupported Attribute\n"); @@ -1788,6 +1820,7 @@ player->title_is_menu = FALSE; player->enable_divx = TRUE; player->disable_xvmc = FALSE; + player->retry_on_full_cache = FALSE; g_mutex_lock(player->thread_running); @@ -2477,6 +2510,11 @@ error_msg = g_strdup_printf(_("Compressed SWF format not supported")); } + if (strstr(mplayer_output->str, "MOV: missing header (moov/cmov) chunk") != NULL) { + player->retry_on_full_cache = TRUE; + create_event_boolean(player, "attribute-changed", ATTRIBUTE_RETRY_ON_FULL_CACHE); + } + if (strstr(mplayer_output->str, "Title: ") != 0) { buf = strstr(mplayer_output->str, "Title:"); buf = strstr(mplayer_output->str, "Title: ") + strlen("Title: "); diff -ru gnome-mplayer-1.0.4-orig/src/libgmtk/gmtk_media_player.h gnome-mplayer-1.0.4/src/libgmtk/gmtk_media_player.h --- gnome-mplayer-1.0.4-orig/src/libgmtk/gmtk_media_player.h 2011-06-28 09:29:18.000000000 -0400 +++ gnome-mplayer-1.0.4/src/libgmtk/gmtk_media_player.h 2011-07-09 21:04:50.000000000 -0400 @@ -170,7 +170,8 @@ ATTRIBUTE_ENABLE_FRAME_DROP, ATTRIBUTE_TITLE, ATTRIBUTE_ARTIST, - ATTRIBUTE_ALBUM + ATTRIBUTE_ALBUM, + ATTRIBUTE_RETRY_ON_FULL_CACHE } GmtkMediaPlayerMediaAttributes; typedef enum { @@ -201,6 +202,13 @@ COMMAND_SWITCH_FRAME_DROP } GmtkMediaPlayerCommand; +typedef enum { + EVENT_TYPE_INT, + EVENT_TYPE_DOUBLE, + EVENT_TYPE_BOOLEAN, + EVENT_TYPE_ALLOCATION +} GmtkMediaPlayerEventType; + typedef struct _GmtkMediaPlayer GmtkMediaPlayer; typedef struct _GmtkMediaPlayerClass GmtkMediaPlayerClass; @@ -222,9 +230,11 @@ typedef struct _GmtkMediaPlayerEvent { GmtkMediaPlayer *player; + GmtkMediaPlayerEventType type; gchar *event_name; gint event_data_int; gdouble event_data_double; + gboolean event_data_boolean; GtkAllocation *event_allocation; } GmtkMediaPlayerEvent; @@ -304,6 +314,7 @@ gchar *album; gboolean enable_divx; gboolean disable_xvmc; + gboolean retry_on_full_cache; gboolean deinterlace; gboolean frame_drop; diff -ru gnome-mplayer-1.0.4-orig/src/main.c gnome-mplayer-1.0.4/src/main.c --- gnome-mplayer-1.0.4-orig/src/main.c 2011-06-27 10:59:45.000000000 -0400 +++ gnome-mplayer-1.0.4/src/main.c 2011-07-09 21:04:12.000000000 -0400 @@ -534,6 +534,7 @@ idledata->width = width; idledata->height = height; + idledata->retry_on_full_cache = FALSE; idledata->cachepercent = -1.0; g_strlcpy(idledata->info, uri, 1024); set_media_info(idledata);