Initial commit
[fillmore] / src / marina / marina / clip.c
diff --git a/src/marina/marina/clip.c b/src/marina/marina/clip.c
new file mode 100644 (file)
index 0000000..155620d
--- /dev/null
@@ -0,0 +1,2749 @@
+/* clip.c generated by valac, the Vala compiler
+ * generated from clip.vala, do not modify */
+
+/* Copyright 2009 Yorba Foundation
+ *
+ * This software is licensed under the GNU Lesser General Public License
+ * (version 2.1 or later).  See the COPYING file in this distribution. 
+ */
+
+#include <glib.h>
+#include <glib-object.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gst/gst.h>
+#include <gdk-pixbuf/gdk-pixdata.h>
+#include <gst/base/gstbasesink.h>
+#include <gdk/gdk.h>
+#include <stdio.h>
+#include <gobject/gvaluecollector.h>
+
+
+#define MODEL_TYPE_MEDIA_TYPE (model_media_type_get_type ())
+
+#define MODEL_TYPE_GAP (model_gap_get_type ())
+#define MODEL_GAP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_GAP, ModelGap))
+#define MODEL_GAP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_GAP, ModelGapClass))
+#define MODEL_IS_GAP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_GAP))
+#define MODEL_IS_GAP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_GAP))
+#define MODEL_GAP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_GAP, ModelGapClass))
+
+typedef struct _ModelGap ModelGap;
+typedef struct _ModelGapClass ModelGapClass;
+typedef struct _ModelGapPrivate ModelGapPrivate;
+typedef struct _ModelParamSpecGap ModelParamSpecGap;
+
+#define MODEL_TYPE_CLIP_FILE (model_clip_file_get_type ())
+#define MODEL_CLIP_FILE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_CLIP_FILE, ModelClipFile))
+#define MODEL_CLIP_FILE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_CLIP_FILE, ModelClipFileClass))
+#define MODEL_IS_CLIP_FILE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_CLIP_FILE))
+#define MODEL_IS_CLIP_FILE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_CLIP_FILE))
+#define MODEL_CLIP_FILE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_CLIP_FILE, ModelClipFileClass))
+
+typedef struct _ModelClipFile ModelClipFile;
+typedef struct _ModelClipFileClass ModelClipFileClass;
+typedef struct _ModelClipFilePrivate ModelClipFilePrivate;
+#define _g_free0(var) (var = (g_free (var), NULL))
+#define _gst_caps_unref0(var) ((var == NULL) ? NULL : (var = (gst_caps_unref (var), NULL)))
+#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
+
+#define LOGGING_TYPE_FACILITY (logging_facility_get_type ())
+
+#define LOGGING_TYPE_LEVEL (logging_level_get_type ())
+#define _gst_structure_free0(var) ((var == NULL) ? NULL : (var = (gst_structure_free (var), NULL)))
+
+#define TYPE_FRACTION (fraction_get_type ())
+typedef struct _Fraction Fraction;
+
+#define MODEL_TYPE_FETCHER (model_fetcher_get_type ())
+#define MODEL_FETCHER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_FETCHER, ModelFetcher))
+#define MODEL_FETCHER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_FETCHER, ModelFetcherClass))
+#define MODEL_IS_FETCHER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_FETCHER))
+#define MODEL_IS_FETCHER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_FETCHER))
+#define MODEL_FETCHER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_FETCHER, ModelFetcherClass))
+
+typedef struct _ModelFetcher ModelFetcher;
+typedef struct _ModelFetcherClass ModelFetcherClass;
+typedef struct _ModelFetcherPrivate ModelFetcherPrivate;
+#define _gst_object_unref0(var) ((var == NULL) ? NULL : (var = (gst_object_unref (var), NULL)))
+#define _g_error_free0(var) ((var == NULL) ? NULL : (var = (g_error_free (var), NULL)))
+
+#define MODEL_TYPE_CLIP_FETCHER (model_clip_fetcher_get_type ())
+#define MODEL_CLIP_FETCHER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_CLIP_FETCHER, ModelClipFetcher))
+#define MODEL_CLIP_FETCHER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_CLIP_FETCHER, ModelClipFetcherClass))
+#define MODEL_IS_CLIP_FETCHER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_CLIP_FETCHER))
+#define MODEL_IS_CLIP_FETCHER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_CLIP_FETCHER))
+#define MODEL_CLIP_FETCHER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_CLIP_FETCHER, ModelClipFetcherClass))
+
+typedef struct _ModelClipFetcher ModelClipFetcher;
+typedef struct _ModelClipFetcherClass ModelClipFetcherClass;
+typedef struct _ModelClipFetcherPrivate ModelClipFetcherPrivate;
+
+#define MODEL_TYPE_THUMBNAIL_FETCHER (model_thumbnail_fetcher_get_type ())
+#define MODEL_THUMBNAIL_FETCHER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_THUMBNAIL_FETCHER, ModelThumbnailFetcher))
+#define MODEL_THUMBNAIL_FETCHER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_THUMBNAIL_FETCHER, ModelThumbnailFetcherClass))
+#define MODEL_IS_THUMBNAIL_FETCHER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_THUMBNAIL_FETCHER))
+#define MODEL_IS_THUMBNAIL_FETCHER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_THUMBNAIL_FETCHER))
+#define MODEL_THUMBNAIL_FETCHER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_THUMBNAIL_FETCHER, ModelThumbnailFetcherClass))
+
+typedef struct _ModelThumbnailFetcher ModelThumbnailFetcher;
+typedef struct _ModelThumbnailFetcherClass ModelThumbnailFetcherClass;
+typedef struct _ModelThumbnailFetcherPrivate ModelThumbnailFetcherPrivate;
+
+#define TYPE_THUMBNAIL_SINK (thumbnail_sink_get_type ())
+#define THUMBNAIL_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_THUMBNAIL_SINK, ThumbnailSink))
+#define THUMBNAIL_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_THUMBNAIL_SINK, ThumbnailSinkClass))
+#define IS_THUMBNAIL_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_THUMBNAIL_SINK))
+#define IS_THUMBNAIL_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_THUMBNAIL_SINK))
+#define THUMBNAIL_SINK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_THUMBNAIL_SINK, ThumbnailSinkClass))
+
+typedef struct _ThumbnailSink ThumbnailSink;
+typedef struct _ThumbnailSinkClass ThumbnailSinkClass;
+
+#define TYPE_SINGLE_DECODE_BIN (single_decode_bin_get_type ())
+#define SINGLE_DECODE_BIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_SINGLE_DECODE_BIN, SingleDecodeBin))
+#define SINGLE_DECODE_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_SINGLE_DECODE_BIN, SingleDecodeBinClass))
+#define IS_SINGLE_DECODE_BIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_SINGLE_DECODE_BIN))
+#define IS_SINGLE_DECODE_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_SINGLE_DECODE_BIN))
+#define SINGLE_DECODE_BIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_SINGLE_DECODE_BIN, SingleDecodeBinClass))
+
+typedef struct _SingleDecodeBin SingleDecodeBin;
+typedef struct _SingleDecodeBinClass SingleDecodeBinClass;
+
+#define MODEL_TYPE_CLIP (model_clip_get_type ())
+#define MODEL_CLIP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_CLIP, ModelClip))
+#define MODEL_CLIP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_CLIP, ModelClipClass))
+#define MODEL_IS_CLIP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_CLIP))
+#define MODEL_IS_CLIP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_CLIP))
+#define MODEL_CLIP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_CLIP, ModelClipClass))
+
+typedef struct _ModelClip ModelClip;
+typedef struct _ModelClipClass ModelClipClass;
+typedef struct _ModelClipPrivate ModelClipPrivate;
+
+#define MODEL_TYPE_FETCHER_COMPLETION (model_fetcher_completion_get_type ())
+#define MODEL_FETCHER_COMPLETION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MODEL_TYPE_FETCHER_COMPLETION, ModelFetcherCompletion))
+#define MODEL_FETCHER_COMPLETION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MODEL_TYPE_FETCHER_COMPLETION, ModelFetcherCompletionClass))
+#define MODEL_IS_FETCHER_COMPLETION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MODEL_TYPE_FETCHER_COMPLETION))
+#define MODEL_IS_FETCHER_COMPLETION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MODEL_TYPE_FETCHER_COMPLETION))
+#define MODEL_FETCHER_COMPLETION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MODEL_TYPE_FETCHER_COMPLETION, ModelFetcherCompletionClass))
+
+typedef struct _ModelFetcherCompletion ModelFetcherCompletion;
+typedef struct _ModelFetcherCompletionClass ModelFetcherCompletionClass;
+typedef struct _ModelFetcherCompletionPrivate ModelFetcherCompletionPrivate;
+typedef struct _ModelParamSpecFetcherCompletion ModelParamSpecFetcherCompletion;
+
+typedef enum  {
+       MODEL_MEDIA_TYPE_AUDIO,
+       MODEL_MEDIA_TYPE_VIDEO
+} ModelMediaType;
+
+struct _ModelGap {
+       GTypeInstance parent_instance;
+       volatile int ref_count;
+       ModelGapPrivate * priv;
+       gint64 start;
+       gint64 end;
+};
+
+struct _ModelGapClass {
+       GTypeClass parent_class;
+       void (*finalize) (ModelGap *self);
+};
+
+struct _ModelParamSpecGap {
+       GParamSpec parent_instance;
+};
+
+struct _ModelClipFile {
+       GObject parent_instance;
+       ModelClipFilePrivate * priv;
+       char* filename;
+       GstCaps* video_caps;
+       GstCaps* audio_caps;
+       GdkPixbuf* thumbnail;
+};
+
+struct _ModelClipFileClass {
+       GObjectClass parent_class;
+};
+
+struct _ModelClipFilePrivate {
+       gint64 _length;
+       gboolean online;
+};
+
+typedef enum  {
+       LOGGING_FACILITY_SIGNAL_HANDLERS,
+       LOGGING_FACILITY_DEVELOPER_WARNINGS,
+       LOGGING_FACILITY_GRAPH,
+       LOGGING_FACILITY_LOADING,
+       LOGGING_FACILITY_IMPORT,
+       LOGGING_FACILITY_SINGLEDECODEBIN
+} LoggingFacility;
+
+typedef enum  {
+       LOGGING_LEVEL_CRITICAL,
+       LOGGING_LEVEL_HIGH,
+       LOGGING_LEVEL_MEDIUM,
+       LOGGING_LEVEL_LOW,
+       LOGGING_LEVEL_INFO,
+       LOGGING_LEVEL_VERBOSE
+} LoggingLevel;
+
+struct _Fraction {
+       gint numerator;
+       gint denominator;
+};
+
+struct _ModelFetcher {
+       GObject parent_instance;
+       ModelFetcherPrivate * priv;
+       GstElement* filesrc;
+       GstElement* decodebin;
+       GstPipeline* pipeline;
+       ModelClipFile* clipfile;
+       char* error_string;
+};
+
+struct _ModelFetcherClass {
+       GObjectClass parent_class;
+       void (*on_pad_added) (ModelFetcher* self, GstPad* pad);
+       void (*on_state_change) (ModelFetcher* self, GstBus* bus, GstMessage* message);
+};
+
+struct _ModelClipFetcher {
+       ModelFetcher parent_instance;
+       ModelClipFetcherPrivate * priv;
+};
+
+struct _ModelClipFetcherClass {
+       ModelFetcherClass parent_class;
+};
+
+struct _ModelThumbnailFetcher {
+       ModelFetcher parent_instance;
+       ModelThumbnailFetcherPrivate * priv;
+};
+
+struct _ModelThumbnailFetcherClass {
+       ModelFetcherClass parent_class;
+};
+
+struct _ModelThumbnailFetcherPrivate {
+       ThumbnailSink* thumbnail_sink;
+       GstElement* colorspace;
+       gint64 seek_position;
+       gboolean done_seek;
+       gboolean have_thumbnail;
+};
+
+struct _ModelClip {
+       GObject parent_instance;
+       ModelClipPrivate * priv;
+       ModelClipFile* clipfile;
+       ModelMediaType type;
+       gboolean is_recording;
+       char* name;
+};
+
+struct _ModelClipClass {
+       GObjectClass parent_class;
+};
+
+struct _ModelClipPrivate {
+       gint64 _start;
+       gint64 _media_start;
+       gint64 _duration;
+       gboolean connected;
+};
+
+struct _ModelFetcherCompletion {
+       GTypeInstance parent_instance;
+       volatile int ref_count;
+       ModelFetcherCompletionPrivate * priv;
+};
+
+struct _ModelFetcherCompletionClass {
+       GTypeClass parent_class;
+       void (*finalize) (ModelFetcherCompletion *self);
+       void (*complete) (ModelFetcherCompletion* self, ModelFetcher* fetcher);
+};
+
+struct _ModelParamSpecFetcherCompletion {
+       GParamSpec parent_instance;
+};
+
+
+static gpointer model_gap_parent_class = NULL;
+static gpointer model_clip_file_parent_class = NULL;
+static gpointer model_fetcher_parent_class = NULL;
+static gpointer model_clip_fetcher_parent_class = NULL;
+static gpointer model_thumbnail_fetcher_parent_class = NULL;
+static gpointer model_clip_parent_class = NULL;
+static gpointer model_fetcher_completion_parent_class = NULL;
+
+GType model_media_type_get_type (void);
+gpointer model_gap_ref (gpointer instance);
+void model_gap_unref (gpointer instance);
+GParamSpec* model_param_spec_gap (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
+void model_value_set_gap (GValue* value, gpointer v_object);
+void model_value_take_gap (GValue* value, gpointer v_object);
+gpointer model_value_get_gap (const GValue* value);
+GType model_gap_get_type (void);
+enum  {
+       MODEL_GAP_DUMMY_PROPERTY
+};
+ModelGap* model_gap_new (gint64 start, gint64 end);
+ModelGap* model_gap_construct (GType object_type, gint64 start, gint64 end);
+gboolean model_gap_is_empty (ModelGap* self);
+ModelGap* model_gap_intersect (ModelGap* self, ModelGap* g);
+static void model_gap_finalize (ModelGap* obj);
+GType model_clip_file_get_type (void);
+#define MODEL_CLIP_FILE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MODEL_TYPE_CLIP_FILE, ModelClipFilePrivate))
+enum  {
+       MODEL_CLIP_FILE_DUMMY_PROPERTY,
+       MODEL_CLIP_FILE_LENGTH
+};
+void model_clip_file_set_length (ModelClipFile* self, gint64 value);
+ModelClipFile* model_clip_file_new (const char* filename, gint64 length);
+ModelClipFile* model_clip_file_construct (GType object_type, const char* filename, gint64 length);
+gboolean model_clip_file_is_online (ModelClipFile* self);
+GType logging_facility_get_type (void);
+GType logging_level_get_type (void);
+void logging_emit (GObject* object, LoggingFacility facility, LoggingLevel level, const char* message);
+void model_clip_file_set_online (ModelClipFile* self, gboolean o);
+void model_clip_file_set_thumbnail (ModelClipFile* self, GdkPixbuf* b);
+gboolean model_clip_file_has_caps_structure (ModelClipFile* self, ModelMediaType m);
+gboolean model_clip_file_is_of_type (ModelClipFile* self, ModelMediaType t);
+static gboolean model_clip_file_get_caps_structure (ModelClipFile* self, ModelMediaType m, GstStructure** s);
+GType fraction_get_type (void);
+Fraction* fraction_dup (const Fraction* self);
+void fraction_free (Fraction* self);
+gboolean model_clip_file_get_frame_rate (ModelClipFile* self, Fraction* rate);
+gboolean model_clip_file_get_dimensions (ModelClipFile* self, gint* w, gint* h);
+gboolean model_clip_file_get_sample_rate (ModelClipFile* self, gint* rate);
+gboolean model_clip_file_get_video_format (ModelClipFile* self, guint32* fourcc);
+gboolean model_clip_file_get_num_channels (ModelClipFile* self, gint* channels);
+gboolean model_clip_file_get_num_channels_string (ModelClipFile* self, char** s);
+gint64 model_clip_file_get_length (ModelClipFile* self);
+static void model_clip_file_finalize (GObject* obj);
+static void model_clip_file_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec);
+static void model_clip_file_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec);
+GType model_fetcher_get_type (void);
+enum  {
+       MODEL_FETCHER_DUMMY_PROPERTY
+};
+void model_fetcher_on_pad_added (ModelFetcher* self, GstPad* pad);
+static void model_fetcher_real_on_pad_added (ModelFetcher* self, GstPad* pad);
+void model_fetcher_on_state_change (ModelFetcher* self, GstBus* bus, GstMessage* message);
+static void model_fetcher_real_on_state_change (ModelFetcher* self, GstBus* bus, GstMessage* message);
+void model_fetcher_do_error (ModelFetcher* self, const char* _error_);
+void model_fetcher_on_warning (ModelFetcher* self, GstBus* bus, GstMessage* message);
+void model_fetcher_on_error (ModelFetcher* self, GstBus* bus, GstMessage* message);
+ModelFetcher* model_fetcher_construct (GType object_type);
+static void model_fetcher_finalize (GObject* obj);
+GType model_clip_fetcher_get_type (void);
+enum  {
+       MODEL_CLIP_FETCHER_DUMMY_PROPERTY
+};
+static void _model_clip_file_set_online_model_clip_fetcher_clipfile_online (ModelClipFetcher* _sender, gboolean online, gpointer self);
+GstElement* make_element (const char* name, GError** error);
+static void _model_fetcher_on_pad_added_gst_element_pad_added (GstElement* _sender, GstPad* pad, gpointer self);
+static void _model_fetcher_on_state_change_gst_bus_message (GstBus* _sender, GstMessage* message, gpointer self);
+static void _model_fetcher_on_error_gst_bus_message (GstBus* _sender, GstMessage* message, gpointer self);
+static void _model_fetcher_on_warning_gst_bus_message (GstBus* _sender, GstMessage* message, gpointer self);
+ModelClipFetcher* model_clip_fetcher_new (const char* filename, GError** error);
+ModelClipFetcher* model_clip_fetcher_construct (GType object_type, const char* filename, GError** error);
+char* model_clip_fetcher_get_filename (ModelClipFetcher* self);
+static void model_clip_fetcher_real_on_pad_added (ModelFetcher* base, GstPad* pad);
+static GstPad* model_clip_fetcher_get_pad (ModelClipFetcher* self, const char* prefix);
+static void model_clip_fetcher_real_on_state_change (ModelFetcher* base, GstBus* bus, GstMessage* message);
+GType model_thumbnail_fetcher_get_type (void);
+GType thumbnail_sink_get_type (void);
+#define MODEL_THUMBNAIL_FETCHER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MODEL_TYPE_THUMBNAIL_FETCHER, ModelThumbnailFetcherPrivate))
+enum  {
+       MODEL_THUMBNAIL_FETCHER_DUMMY_PROPERTY
+};
+SingleDecodeBin* single_decode_bin_new (GstCaps* caps, const char* name, const char* uri, GError** error);
+SingleDecodeBin* single_decode_bin_construct (GType object_type, GstCaps* caps, const char* name, const char* uri, GError** error);
+GType single_decode_bin_get_type (void);
+ThumbnailSink* thumbnail_sink_new (void);
+ThumbnailSink* thumbnail_sink_construct (GType object_type);
+static void model_thumbnail_fetcher_on_have_thumbnail (ModelThumbnailFetcher* self, GdkPixbuf* buf);
+static void _model_thumbnail_fetcher_on_have_thumbnail_thumbnail_sink_have_thumbnail (ThumbnailSink* _sender, GdkPixbuf* b, gpointer self);
+ModelThumbnailFetcher* model_thumbnail_fetcher_new (ModelClipFile* f, gint64 time, GError** error);
+ModelThumbnailFetcher* model_thumbnail_fetcher_construct (GType object_type, ModelClipFile* f, gint64 time, GError** error);
+static void model_thumbnail_fetcher_real_on_pad_added (ModelFetcher* base, GstPad* pad);
+static void model_thumbnail_fetcher_real_on_state_change (ModelFetcher* base, GstBus* bus, GstMessage* message);
+static void model_thumbnail_fetcher_finalize (GObject* obj);
+GType model_clip_get_type (void);
+#define MODEL_CLIP_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MODEL_TYPE_CLIP, ModelClipPrivate))
+enum  {
+       MODEL_CLIP_DUMMY_PROPERTY,
+       MODEL_CLIP_START,
+       MODEL_CLIP_MEDIA_START,
+       MODEL_CLIP_DURATION,
+       MODEL_CLIP_END
+};
+void model_clip_set_media_start_duration (ModelClip* self, gint64 media_start, gint64 duration);
+void model_clip_set_start (ModelClip* self, gint64 value);
+static void model_clip_on_clipfile_updated (ModelClip* self, ModelClipFile* f);
+static void _model_clip_on_clipfile_updated_model_clip_file_updated (ModelClipFile* _sender, gpointer self);
+ModelClip* model_clip_new (ModelClipFile* clipfile, ModelMediaType t, const char* name, gint64 start, gint64 media_start, gint64 duration, gboolean is_recording);
+ModelClip* model_clip_construct (GType object_type, ModelClipFile* clipfile, ModelMediaType t, const char* name, gint64 start, gint64 media_start, gint64 duration, gboolean is_recording);
+void model_clip_gnonlin_connect (ModelClip* self);
+void model_clip_gnonlin_disconnect (ModelClip* self);
+gint64 model_clip_get_media_start (ModelClip* self);
+gint64 model_clip_get_duration (ModelClip* self);
+gint64 model_clip_get_start (ModelClip* self);
+gboolean model_clip_overlap_pos (ModelClip* self, gint64 start, gint64 length);
+gboolean time_in_range (gint64 time, gint64 center, gint64 delta);
+gint64 model_clip_get_end (ModelClip* self);
+gint64 model_clip_snap (ModelClip* self, ModelClip* other, gint64 pad);
+gboolean model_clip_snap_coord (ModelClip* self, gint64* s, gint64 span);
+ModelClip* model_clip_copy (ModelClip* self);
+gboolean model_clip_is_trimmed (ModelClip* self);
+void model_clip_set_duration (ModelClip* self, gint64 value);
+void model_clip_trim (ModelClip* self, gint64 delta, GdkWindowEdge edge);
+void model_clip_save (ModelClip* self, FILE* f, gint id);
+static void model_clip_finalize (GObject* obj);
+static void model_clip_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec);
+static void model_clip_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec);
+gpointer model_fetcher_completion_ref (gpointer instance);
+void model_fetcher_completion_unref (gpointer instance);
+GParamSpec* model_param_spec_fetcher_completion (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
+void model_value_set_fetcher_completion (GValue* value, gpointer v_object);
+void model_value_take_fetcher_completion (GValue* value, gpointer v_object);
+gpointer model_value_get_fetcher_completion (const GValue* value);
+GType model_fetcher_completion_get_type (void);
+enum  {
+       MODEL_FETCHER_COMPLETION_DUMMY_PROPERTY
+};
+ModelFetcherCompletion* model_fetcher_completion_new (void);
+ModelFetcherCompletion* model_fetcher_completion_construct (GType object_type);
+void model_fetcher_completion_complete (ModelFetcherCompletion* self, ModelFetcher* fetcher);
+static void model_fetcher_completion_real_complete (ModelFetcherCompletion* self, ModelFetcher* fetcher);
+static void model_fetcher_completion_finalize (ModelFetcherCompletion* obj);
+
+
+static void g_cclosure_user_marshal_VOID__INT64 (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data);
+
+GType model_media_type_get_type (void) {
+       static volatile gsize model_media_type_type_id__volatile = 0;
+       if (g_once_init_enter (&model_media_type_type_id__volatile)) {
+               static const GEnumValue values[] = {{MODEL_MEDIA_TYPE_AUDIO, "MODEL_MEDIA_TYPE_AUDIO", "audio"}, {MODEL_MEDIA_TYPE_VIDEO, "MODEL_MEDIA_TYPE_VIDEO", "video"}, {0, NULL, NULL}};
+               GType model_media_type_type_id;
+               model_media_type_type_id = g_enum_register_static ("ModelMediaType", values);
+               g_once_init_leave (&model_media_type_type_id__volatile, model_media_type_type_id);
+       }
+       return model_media_type_type_id__volatile;
+}
+
+
+#line 20 "clip.vala"
+ModelGap* model_gap_construct (GType object_type, gint64 start, gint64 end) {
+#line 447 "clip.c"
+       ModelGap* self;
+       self = (ModelGap*) g_type_create_instance (object_type);
+#line 21 "clip.vala"
+       self->start = start;
+#line 22 "clip.vala"
+       self->end = end;
+#line 454 "clip.c"
+       return self;
+}
+
+
+#line 20 "clip.vala"
+ModelGap* model_gap_new (gint64 start, gint64 end) {
+#line 20 "clip.vala"
+       return model_gap_construct (MODEL_TYPE_GAP, start, end);
+#line 463 "clip.c"
+}
+
+
+#line 25 "clip.vala"
+gboolean model_gap_is_empty (ModelGap* self) {
+#line 469 "clip.c"
+       gboolean result = FALSE;
+#line 25 "clip.vala"
+       g_return_val_if_fail (MODEL_IS_GAP (self), FALSE);
+#line 473 "clip.c"
+       result = self->start >= self->end;
+#line 26 "clip.vala"
+       return result;
+#line 477 "clip.c"
+}
+
+
+#line 29 "clip.vala"
+ModelGap* model_gap_intersect (ModelGap* self, ModelGap* g) {
+#line 483 "clip.c"
+       ModelGap* result = NULL;
+#line 29 "clip.vala"
+       g_return_val_if_fail (MODEL_IS_GAP (self), NULL);
+#line 29 "clip.vala"
+       g_return_val_if_fail (MODEL_IS_GAP (g), NULL);
+#line 489 "clip.c"
+       result = model_gap_new (MAX (self->start, g->start), MIN (self->end, g->end));
+#line 30 "clip.vala"
+       return result;
+#line 493 "clip.c"
+}
+
+
+static void model_value_gap_init (GValue* value) {
+       value->data[0].v_pointer = NULL;
+}
+
+
+static void model_value_gap_free_value (GValue* value) {
+       if (value->data[0].v_pointer) {
+               model_gap_unref (value->data[0].v_pointer);
+       }
+}
+
+
+static void model_value_gap_copy_value (const GValue* src_value, GValue* dest_value) {
+       if (src_value->data[0].v_pointer) {
+               dest_value->data[0].v_pointer = model_gap_ref (src_value->data[0].v_pointer);
+       } else {
+               dest_value->data[0].v_pointer = NULL;
+       }
+}
+
+
+static gpointer model_value_gap_peek_pointer (const GValue* value) {
+       return value->data[0].v_pointer;
+}
+
+
+static gchar* model_value_gap_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
+       if (collect_values[0].v_pointer) {
+               ModelGap* object;
+               object = collect_values[0].v_pointer;
+               if (object->parent_instance.g_class == NULL) {
+                       return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
+               } else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
+                       return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
+               }
+               value->data[0].v_pointer = model_gap_ref (object);
+       } else {
+               value->data[0].v_pointer = NULL;
+       }
+       return NULL;
+}
+
+
+static gchar* model_value_gap_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
+       ModelGap** object_p;
+       object_p = collect_values[0].v_pointer;
+       if (!object_p) {
+               return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
+       }
+       if (!value->data[0].v_pointer) {
+               *object_p = NULL;
+       } else if (collect_flags && G_VALUE_NOCOPY_CONTENTS) {
+               *object_p = value->data[0].v_pointer;
+       } else {
+               *object_p = model_gap_ref (value->data[0].v_pointer);
+       }
+       return NULL;
+}
+
+
+GParamSpec* model_param_spec_gap (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) {
+       ModelParamSpecGap* spec;
+       g_return_val_if_fail (g_type_is_a (object_type, MODEL_TYPE_GAP), NULL);
+       spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
+       G_PARAM_SPEC (spec)->value_type = object_type;
+       return G_PARAM_SPEC (spec);
+}
+
+
+gpointer model_value_get_gap (const GValue* value) {
+       g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, MODEL_TYPE_GAP), NULL);
+       return value->data[0].v_pointer;
+}
+
+
+void model_value_set_gap (GValue* value, gpointer v_object) {
+       ModelGap* old;
+       g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, MODEL_TYPE_GAP));
+       old = value->data[0].v_pointer;
+       if (v_object) {
+               g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, MODEL_TYPE_GAP));
+               g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
+               value->data[0].v_pointer = v_object;
+               model_gap_ref (value->data[0].v_pointer);
+       } else {
+               value->data[0].v_pointer = NULL;
+       }
+       if (old) {
+               model_gap_unref (old);
+       }
+}
+
+
+void model_value_take_gap (GValue* value, gpointer v_object) {
+       ModelGap* old;
+       g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, MODEL_TYPE_GAP));
+       old = value->data[0].v_pointer;
+       if (v_object) {
+               g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, MODEL_TYPE_GAP));
+               g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
+               value->data[0].v_pointer = v_object;
+       } else {
+               value->data[0].v_pointer = NULL;
+       }
+       if (old) {
+               model_gap_unref (old);
+       }
+}
+
+
+static void model_gap_class_init (ModelGapClass * klass) {
+       model_gap_parent_class = g_type_class_peek_parent (klass);
+       MODEL_GAP_CLASS (klass)->finalize = model_gap_finalize;
+}
+
+
+static void model_gap_instance_init (ModelGap * self) {
+       self->ref_count = 1;
+}
+
+
+static void model_gap_finalize (ModelGap* obj) {
+       ModelGap * self;
+       self = MODEL_GAP (obj);
+}
+
+
+GType model_gap_get_type (void) {
+       static volatile gsize model_gap_type_id__volatile = 0;
+       if (g_once_init_enter (&model_gap_type_id__volatile)) {
+               static const GTypeValueTable g_define_type_value_table = { model_value_gap_init, model_value_gap_free_value, model_value_gap_copy_value, model_value_gap_peek_pointer, "p", model_value_gap_collect_value, "p", model_value_gap_lcopy_value };
+               static const GTypeInfo g_define_type_info = { sizeof (ModelGapClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) model_gap_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ModelGap), 0, (GInstanceInitFunc) model_gap_instance_init, &g_define_type_value_table };
+               static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) };
+               GType model_gap_type_id;
+               model_gap_type_id = g_type_register_fundamental (g_type_fundamental_next (), "ModelGap", &g_define_type_info, &g_define_type_fundamental_info, 0);
+               g_once_init_leave (&model_gap_type_id__volatile, model_gap_type_id);
+       }
+       return model_gap_type_id__volatile;
+}
+
+
+gpointer model_gap_ref (gpointer instance) {
+       ModelGap* self;
+       self = instance;
+       g_atomic_int_inc (&self->ref_count);
+       return instance;
+}
+
+
+void model_gap_unref (gpointer instance) {
+       ModelGap* self;
+       self = instance;
+       if (g_atomic_int_dec_and_test (&self->ref_count)) {
+               MODEL_GAP_GET_CLASS (self)->finalize (self);
+               g_type_free_instance ((GTypeInstance *) self);
+       }
+}
+
+
+#line 58 "clip.vala"
+ModelClipFile* model_clip_file_construct (GType object_type, const char* filename, gint64 length) {
+#line 658 "clip.c"
+       ModelClipFile * self;
+       char* _tmp0_;
+#line 58 "clip.vala"
+       g_return_val_if_fail (filename != NULL, NULL);
+#line 58 "clip.vala"
+       self = (ModelClipFile*) g_object_new (object_type, NULL);
+#line 59 "clip.vala"
+       self->filename = (_tmp0_ = g_strdup (filename), _g_free0 (self->filename), _tmp0_);
+#line 60 "clip.vala"
+       model_clip_file_set_length (self, length);
+#line 61 "clip.vala"
+       self->priv->online = FALSE;
+#line 671 "clip.c"
+       return self;
+}
+
+
+#line 58 "clip.vala"
+ModelClipFile* model_clip_file_new (const char* filename, gint64 length) {
+#line 58 "clip.vala"
+       return model_clip_file_construct (MODEL_TYPE_CLIP_FILE, filename, length);
+#line 680 "clip.c"
+}
+
+
+#line 64 "clip.vala"
+gboolean model_clip_file_is_online (ModelClipFile* self) {
+#line 686 "clip.c"
+       gboolean result = FALSE;
+#line 64 "clip.vala"
+       g_return_val_if_fail (MODEL_IS_CLIP_FILE (self), FALSE);
+#line 690 "clip.c"
+       result = self->priv->online;
+#line 65 "clip.vala"
+       return result;
+#line 694 "clip.c"
+}
+
+
+#line 68 "clip.vala"
+void model_clip_file_set_online (ModelClipFile* self, gboolean o) {
+#line 68 "clip.vala"
+       g_return_if_fail (MODEL_IS_CLIP_FILE (self));
+#line 69 "clip.vala"
+       logging_emit (G_OBJECT (self), LOGGING_FACILITY_SIGNAL_HANDLERS, LOGGING_LEVEL_INFO, "set_online");
+#line 70 "clip.vala"
+       self->priv->online = o;
+#line 71 "clip.vala"
+       g_signal_emit_by_name (self, "updated");
+#line 708 "clip.c"
+}
+
+
+#line 74 "clip.vala"
+void model_clip_file_set_thumbnail (ModelClipFile* self, GdkPixbuf* b) {
+#line 714 "clip.c"
+       GdkPixbuf* _tmp0_;
+#line 74 "clip.vala"
+       g_return_if_fail (MODEL_IS_CLIP_FILE (self));
+#line 74 "clip.vala"
+       g_return_if_fail (GDK_IS_PIXBUF (b));
+#line 79 "clip.vala"
+       self->thumbnail = (_tmp0_ = gdk_pixbuf_scale_simple (b, 64, 44, GDK_INTERP_BILINEAR), _g_object_unref0 (self->thumbnail), _tmp0_);
+#line 722 "clip.c"
+}
+
+
+#line 82 "clip.vala"
+gboolean model_clip_file_has_caps_structure (ModelClipFile* self, ModelMediaType m) {
+#line 728 "clip.c"
+       gboolean result = FALSE;
+#line 82 "clip.vala"
+       g_return_val_if_fail (MODEL_IS_CLIP_FILE (self), FALSE);
+#line 83 "clip.vala"
+       if (m == MODEL_MEDIA_TYPE_AUDIO) {
+#line 734 "clip.c"
+               gboolean _tmp0_ = FALSE;
+#line 84 "clip.vala"
+               if (self->audio_caps == NULL) {
+#line 84 "clip.vala"
+                       _tmp0_ = TRUE;
+#line 740 "clip.c"
+               } else {
+#line 84 "clip.vala"
+                       _tmp0_ = gst_caps_get_size (self->audio_caps) < 1;
+#line 744 "clip.c"
+               }
+#line 84 "clip.vala"
+               if (_tmp0_) {
+#line 748 "clip.c"
+                       result = FALSE;
+#line 85 "clip.vala"
+                       return result;
+#line 752 "clip.c"
+               }
+       } else {
+#line 86 "clip.vala"
+               if (m == MODEL_MEDIA_TYPE_VIDEO) {
+#line 757 "clip.c"
+                       gboolean _tmp1_ = FALSE;
+#line 87 "clip.vala"
+                       if (self->video_caps == NULL) {
+#line 87 "clip.vala"
+                               _tmp1_ = TRUE;
+#line 763 "clip.c"
+                       } else {
+#line 87 "clip.vala"
+                               _tmp1_ = gst_caps_get_size (self->video_caps) < 1;
+#line 767 "clip.c"
+                       }
+#line 87 "clip.vala"
+                       if (_tmp1_) {
+#line 771 "clip.c"
+                               result = FALSE;
+#line 88 "clip.vala"
+                               return result;
+#line 775 "clip.c"
+                       }
+               }
+       }
+       result = TRUE;
+#line 90 "clip.vala"
+       return result;
+#line 782 "clip.c"
+}
+
+
+#line 93 "clip.vala"
+gboolean model_clip_file_is_of_type (ModelClipFile* self, ModelMediaType t) {
+#line 788 "clip.c"
+       gboolean result = FALSE;
+#line 93 "clip.vala"
+       g_return_val_if_fail (MODEL_IS_CLIP_FILE (self), FALSE);
+#line 94 "clip.vala"
+       if (t == MODEL_MEDIA_TYPE_VIDEO) {
+#line 794 "clip.c"
+               result = self->video_caps != NULL;
+#line 95 "clip.vala"
+               return result;
+#line 798 "clip.c"
+       }
+       result = self->audio_caps != NULL;
+#line 96 "clip.vala"
+       return result;
+#line 803 "clip.c"
+}
+
+
+static gpointer _gst_structure_copy0 (gpointer self) {
+       return self ? gst_structure_copy (self) : NULL;
+}
+
+
+#line 99 "clip.vala"
+static gboolean model_clip_file_get_caps_structure (ModelClipFile* self, ModelMediaType m, GstStructure** s) {
+#line 814 "clip.c"
+       gboolean result = FALSE;
+#line 99 "clip.vala"
+       g_return_val_if_fail (MODEL_IS_CLIP_FILE (self), FALSE);
+#line 818 "clip.c"
+       if (s != NULL) {
+               *s = NULL;
+       }
+#line 100 "clip.vala"
+       if (!model_clip_file_has_caps_structure (self, m)) {
+#line 824 "clip.c"
+               result = FALSE;
+#line 101 "clip.vala"
+               return result;
+#line 828 "clip.c"
+       }
+#line 102 "clip.vala"
+       if (m == MODEL_MEDIA_TYPE_AUDIO) {
+#line 832 "clip.c"
+               GstStructure* _tmp0_;
+#line 103 "clip.vala"
+               *s = (_tmp0_ = _gst_structure_copy0 (gst_caps_get_structure (self->audio_caps, (guint) 0)), _gst_structure_free0 (*s), _tmp0_);
+#line 836 "clip.c"
+       } else {
+#line 104 "clip.vala"
+               if (m == MODEL_MEDIA_TYPE_VIDEO) {
+#line 840 "clip.c"
+                       GstStructure* _tmp1_;
+#line 105 "clip.vala"
+                       *s = (_tmp1_ = _gst_structure_copy0 (gst_caps_get_structure (self->video_caps, (guint) 0)), _gst_structure_free0 (*s), _tmp1_);
+#line 844 "clip.c"
+               }
+       }
+       result = TRUE;
+#line 107 "clip.vala"
+       return result;
+#line 850 "clip.c"
+}
+
+
+#line 110 "clip.vala"
+gboolean model_clip_file_get_frame_rate (ModelClipFile* self, Fraction* rate) {
+#line 856 "clip.c"
+       gboolean result = FALSE;
+       GstStructure* structure;
+       GstStructure* _tmp2_;
+       gboolean _tmp1_;
+       GstStructure* _tmp0_ = NULL;
+#line 110 "clip.vala"
+       g_return_val_if_fail (MODEL_IS_CLIP_FILE (self), FALSE);
+#line 864 "clip.c"
+       structure = NULL;
+#line 112 "clip.vala"
+       if (!(_tmp1_ = model_clip_file_get_caps_structure (self, MODEL_MEDIA_TYPE_VIDEO, &_tmp0_), structure = (_tmp2_ = _tmp0_, _gst_structure_free0 (structure), _tmp2_), _tmp1_)) {
+#line 868 "clip.c"
+               result = FALSE;
+               _gst_structure_free0 (structure);
+#line 113 "clip.vala"
+               return result;
+#line 873 "clip.c"
+       }
+       result = gst_structure_get_fraction (structure, "framerate", &(*rate).numerator, &(*rate).denominator);
+       _gst_structure_free0 (structure);
+#line 114 "clip.vala"
+       return result;
+#line 879 "clip.c"
+}
+
+
+#line 117 "clip.vala"
+gboolean model_clip_file_get_dimensions (ModelClipFile* self, gint* w, gint* h) {
+#line 885 "clip.c"
+       gboolean result = FALSE;
+       GstStructure* s;
+       GstStructure* _tmp2_;
+       gboolean _tmp1_;
+       GstStructure* _tmp0_ = NULL;
+       gboolean _tmp3_ = FALSE;
+#line 117 "clip.vala"
+       g_return_val_if_fail (MODEL_IS_CLIP_FILE (self), FALSE);
+#line 894 "clip.c"
+       s = NULL;
+#line 120 "clip.vala"
+       if (!(_tmp1_ = model_clip_file_get_caps_structure (self, MODEL_MEDIA_TYPE_VIDEO, &_tmp0_), s = (_tmp2_ = _tmp0_, _gst_structure_free0 (s), _tmp2_), _tmp1_)) {
+#line 898 "clip.c"
+               result = FALSE;
+               _gst_structure_free0 (s);
+#line 121 "clip.vala"
+               return result;
+#line 903 "clip.c"
+       }
+#line 123 "clip.vala"
+       if (gst_structure_get_int (s, "width", w)) {
+#line 123 "clip.vala"
+               _tmp3_ = gst_structure_get_int (s, "height", h);
+#line 909 "clip.c"
+       } else {
+#line 123 "clip.vala"
+               _tmp3_ = FALSE;
+#line 913 "clip.c"
+       }
+       result = _tmp3_;
+       _gst_structure_free0 (s);
+#line 123 "clip.vala"
+       return result;
+#line 919 "clip.c"
+}
+
+
+#line 126 "clip.vala"
+gboolean model_clip_file_get_sample_rate (ModelClipFile* self, gint* rate) {
+#line 925 "clip.c"
+       gboolean result = FALSE;
+       GstStructure* s;
+       GstStructure* _tmp2_;
+       gboolean _tmp1_;
+       GstStructure* _tmp0_ = NULL;
+#line 126 "clip.vala"
+       g_return_val_if_fail (MODEL_IS_CLIP_FILE (self), FALSE);
+#line 933 "clip.c"
+       s = NULL;
+#line 128 "clip.vala"
+       if (!(_tmp1_ = model_clip_file_get_caps_structure (self, MODEL_MEDIA_TYPE_AUDIO, &_tmp0_), s = (_tmp2_ = _tmp0_, _gst_structure_free0 (s), _tmp2_), _tmp1_)) {
+#line 937 "clip.c"
+               result = FALSE;
+               _gst_structure_free0 (s);
+#line 129 "clip.vala"
+               return result;
+#line 942 "clip.c"
+       }
+       result = gst_structure_get_int (s, "rate", rate);
+       _gst_structure_free0 (s);
+#line 131 "clip.vala"
+       return result;
+#line 948 "clip.c"
+}
+
+
+#line 134 "clip.vala"
+gboolean model_clip_file_get_video_format (ModelClipFile* self, guint32* fourcc) {
+#line 954 "clip.c"
+       gboolean result = FALSE;
+       GstStructure* s;
+       GstStructure* _tmp2_;
+       gboolean _tmp1_;
+       GstStructure* _tmp0_ = NULL;
+#line 134 "clip.vala"
+       g_return_val_if_fail (MODEL_IS_CLIP_FILE (self), FALSE);
+#line 962 "clip.c"
+       s = NULL;
+#line 137 "clip.vala"
+       if (!(_tmp1_ = model_clip_file_get_caps_structure (self, MODEL_MEDIA_TYPE_VIDEO, &_tmp0_), s = (_tmp2_ = _tmp0_, _gst_structure_free0 (s), _tmp2_), _tmp1_)) {
+#line 966 "clip.c"
+               result = FALSE;
+               _gst_structure_free0 (s);
+#line 138 "clip.vala"
+               return result;
+#line 971 "clip.c"
+       }
+       result = gst_structure_get_fourcc (s, "format", fourcc);
+       _gst_structure_free0 (s);
+#line 140 "clip.vala"
+       return result;
+#line 977 "clip.c"
+}
+
+
+#line 143 "clip.vala"
+gboolean model_clip_file_get_num_channels (ModelClipFile* self, gint* channels) {
+#line 983 "clip.c"
+       gboolean result = FALSE;
+       GstStructure* s;
+       GstStructure* _tmp2_;
+       gboolean _tmp1_;
+       GstStructure* _tmp0_ = NULL;
+#line 143 "clip.vala"
+       g_return_val_if_fail (MODEL_IS_CLIP_FILE (self), FALSE);
+#line 991 "clip.c"
+       s = NULL;
+#line 145 "clip.vala"
+       if (!(_tmp1_ = model_clip_file_get_caps_structure (self, MODEL_MEDIA_TYPE_AUDIO, &_tmp0_), s = (_tmp2_ = _tmp0_, _gst_structure_free0 (s), _tmp2_), _tmp1_)) {
+#line 995 "clip.c"
+               result = FALSE;
+               _gst_structure_free0 (s);
+#line 146 "clip.vala"
+               return result;
+#line 1000 "clip.c"
+       }
+       result = gst_structure_get_int (s, "channels", channels);
+       _gst_structure_free0 (s);
+#line 149 "clip.vala"
+       return result;
+#line 1006 "clip.c"
+}
+
+
+#line 152 "clip.vala"
+gboolean model_clip_file_get_num_channels_string (ModelClipFile* self, char** s) {
+#line 1012 "clip.c"
+       gboolean result = FALSE;
+       gint i = 0;
+#line 152 "clip.vala"
+       g_return_val_if_fail (MODEL_IS_CLIP_FILE (self), FALSE);
+#line 1017 "clip.c"
+       if (s != NULL) {
+               *s = NULL;
+       }
+#line 154 "clip.vala"
+       if (!model_clip_file_get_num_channels (self, &i)) {
+#line 1023 "clip.c"
+               result = FALSE;
+#line 155 "clip.vala"
+               return result;
+#line 1027 "clip.c"
+       }
+#line 157 "clip.vala"
+       if (i == 1) {
+#line 1031 "clip.c"
+               char* _tmp0_;
+#line 158 "clip.vala"
+               *s = (_tmp0_ = g_strdup ("Mono"), _g_free0 (*s), _tmp0_);
+#line 1035 "clip.c"
+       } else {
+#line 159 "clip.vala"
+               if (i == 2) {
+#line 1039 "clip.c"
+                       char* _tmp1_;
+#line 160 "clip.vala"
+                       *s = (_tmp1_ = g_strdup ("Stereo"), _g_free0 (*s), _tmp1_);
+#line 1043 "clip.c"
+               } else {
+#line 161 "clip.vala"
+                       if ((i % 2) == 0) {
+#line 1047 "clip.c"
+                               char* _tmp2_;
+#line 162 "clip.vala"
+                               *s = (_tmp2_ = g_strdup_printf ("Surround %d.1", i - 1), _g_free0 (*s), _tmp2_);
+#line 1051 "clip.c"
+                       } else {
+                               char* _tmp3_;
+#line 164 "clip.vala"
+                               *s = (_tmp3_ = g_strdup_printf ("%d", i), _g_free0 (*s), _tmp3_);
+#line 1056 "clip.c"
+                       }
+               }
+       }
+       result = TRUE;
+#line 165 "clip.vala"
+       return result;
+#line 1063 "clip.c"
+}
+
+
+gint64 model_clip_file_get_length (ModelClipFile* self) {
+       gint64 result;
+       g_return_val_if_fail (MODEL_IS_CLIP_FILE (self), 0LL);
+#line 39 "clip.vala"
+       if (!self->priv->online) {
+#line 40 "clip.vala"
+               g_warning ("clip.vala:40: retrieving length while clip offline");
+#line 1074 "clip.c"
+       }
+       result = self->priv->_length;
+#line 42 "clip.vala"
+       return result;
+#line 1079 "clip.c"
+}
+
+
+void model_clip_file_set_length (ModelClipFile* self, gint64 value) {
+       g_return_if_fail (MODEL_IS_CLIP_FILE (self));
+#line 46 "clip.vala"
+       self->priv->_length = value;
+#line 1087 "clip.c"
+       g_object_notify ((GObject *) self, "length");
+}
+
+
+static void model_clip_file_class_init (ModelClipFileClass * klass) {
+       model_clip_file_parent_class = g_type_class_peek_parent (klass);
+       g_type_class_add_private (klass, sizeof (ModelClipFilePrivate));
+       G_OBJECT_CLASS (klass)->get_property = model_clip_file_get_property;
+       G_OBJECT_CLASS (klass)->set_property = model_clip_file_set_property;
+       G_OBJECT_CLASS (klass)->finalize = model_clip_file_finalize;
+       g_object_class_install_property (G_OBJECT_CLASS (klass), MODEL_CLIP_FILE_LENGTH, g_param_spec_int64 ("length", "length", "length", G_MININT64, G_MAXINT64, 0, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE | G_PARAM_WRITABLE));
+       g_signal_new ("updated", MODEL_TYPE_CLIP_FILE, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
+}
+
+
+static void model_clip_file_instance_init (ModelClipFile * self) {
+       self->priv = MODEL_CLIP_FILE_GET_PRIVATE (self);
+       self->thumbnail = NULL;
+}
+
+
+static void model_clip_file_finalize (GObject* obj) {
+       ModelClipFile * self;
+       self = MODEL_CLIP_FILE (obj);
+       _g_free0 (self->filename);
+       _gst_caps_unref0 (self->video_caps);
+       _gst_caps_unref0 (self->audio_caps);
+       _g_object_unref0 (self->thumbnail);
+       G_OBJECT_CLASS (model_clip_file_parent_class)->finalize (obj);
+}
+
+
+GType model_clip_file_get_type (void) {
+       static volatile gsize model_clip_file_type_id__volatile = 0;
+       if (g_once_init_enter (&model_clip_file_type_id__volatile)) {
+               static const GTypeInfo g_define_type_info = { sizeof (ModelClipFileClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) model_clip_file_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ModelClipFile), 0, (GInstanceInitFunc) model_clip_file_instance_init, NULL };
+               GType model_clip_file_type_id;
+               model_clip_file_type_id = g_type_register_static (G_TYPE_OBJECT, "ModelClipFile", &g_define_type_info, 0);
+               g_once_init_leave (&model_clip_file_type_id__volatile, model_clip_file_type_id);
+       }
+       return model_clip_file_type_id__volatile;
+}
+
+
+static void model_clip_file_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec) {
+       ModelClipFile * self;
+       self = MODEL_CLIP_FILE (object);
+       switch (property_id) {
+               case MODEL_CLIP_FILE_LENGTH:
+               g_value_set_int64 (value, model_clip_file_get_length (self));
+               break;
+               default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+               break;
+       }
+}
+
+
+static void model_clip_file_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec) {
+       ModelClipFile * self;
+       self = MODEL_CLIP_FILE (object);
+       switch (property_id) {
+               case MODEL_CLIP_FILE_LENGTH:
+               model_clip_file_set_length (self, g_value_get_int64 (value));
+               break;
+               default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+               break;
+       }
+}
+
+
+#line 177 "clip.vala"
+static void model_fetcher_real_on_pad_added (ModelFetcher* self, GstPad* pad) {
+#line 1162 "clip.c"
+       g_return_if_fail (MODEL_IS_FETCHER (self));
+       g_critical ("Type `%s' does not implement abstract method `model_fetcher_on_pad_added'", g_type_name (G_TYPE_FROM_INSTANCE (self)));
+       return;
+}
+
+
+#line 177 "clip.vala"
+void model_fetcher_on_pad_added (ModelFetcher* self, GstPad* pad) {
+#line 177 "clip.vala"
+       MODEL_FETCHER_GET_CLASS (self)->on_pad_added (self, pad);
+#line 1173 "clip.c"
+}
+
+
+#line 178 "clip.vala"
+static void model_fetcher_real_on_state_change (ModelFetcher* self, GstBus* bus, GstMessage* message) {
+#line 1179 "clip.c"
+       g_return_if_fail (MODEL_IS_FETCHER (self));
+       g_critical ("Type `%s' does not implement abstract method `model_fetcher_on_state_change'", g_type_name (G_TYPE_FROM_INSTANCE (self)));
+       return;
+}
+
+
+#line 178 "clip.vala"
+void model_fetcher_on_state_change (ModelFetcher* self, GstBus* bus, GstMessage* message) {
+#line 178 "clip.vala"
+       MODEL_FETCHER_GET_CLASS (self)->on_state_change (self, bus, message);
+#line 1190 "clip.c"
+}
+
+
+#line 182 "clip.vala"
+void model_fetcher_do_error (ModelFetcher* self, const char* _error_) {
+#line 1196 "clip.c"
+       char* _tmp0_;
+#line 182 "clip.vala"
+       g_return_if_fail (MODEL_IS_FETCHER (self));
+#line 182 "clip.vala"
+       g_return_if_fail (_error_ != NULL);
+#line 183 "clip.vala"
+       self->error_string = (_tmp0_ = g_strdup (_error_), _g_free0 (self->error_string), _tmp0_);
+#line 184 "clip.vala"
+       gst_element_set_state (GST_ELEMENT (self->pipeline), GST_STATE_NULL);
+#line 1206 "clip.c"
+}
+
+
+#line 187 "clip.vala"
+void model_fetcher_on_warning (ModelFetcher* self, GstBus* bus, GstMessage* message) {
+#line 1212 "clip.c"
+       GError* _error_;
+       char* text;
+       char* _tmp3_;
+       char* _tmp2_ = NULL;
+       GError* _tmp1_;
+       GError* _tmp0_ = NULL;
+#line 187 "clip.vala"
+       g_return_if_fail (MODEL_IS_FETCHER (self));
+#line 187 "clip.vala"
+       g_return_if_fail (GST_IS_BUS (bus));
+#line 187 "clip.vala"
+       g_return_if_fail (GST_IS_MESSAGE (message));
+#line 188 "clip.vala"
+       logging_emit (G_OBJECT (self), LOGGING_FACILITY_SIGNAL_HANDLERS, LOGGING_LEVEL_INFO, "on_warning");
+#line 1227 "clip.c"
+       _error_ = NULL;
+       text = NULL;
+#line 191 "clip.vala"
+       (gst_message_parse_warning (message, &_tmp0_, &_tmp2_), _error_ = (_tmp1_ = _tmp0_, _g_error_free0 (_error_), _tmp1_));
+#line 191 "clip.vala"
+       text = (_tmp3_ = _tmp2_, _g_free0 (text), _tmp3_);
+#line 192 "clip.vala"
+       g_warning ("clip.vala:192: %s", text);
+#line 1236 "clip.c"
+       _g_error_free0 (_error_);
+       _g_free0 (text);
+}
+
+
+#line 195 "clip.vala"
+void model_fetcher_on_error (ModelFetcher* self, GstBus* bus, GstMessage* message) {
+#line 1244 "clip.c"
+       GError* _error_;
+       char* text;
+       char* _tmp3_;
+       char* _tmp2_ = NULL;
+       GError* _tmp1_;
+       GError* _tmp0_ = NULL;
+#line 195 "clip.vala"
+       g_return_if_fail (MODEL_IS_FETCHER (self));
+#line 195 "clip.vala"
+       g_return_if_fail (GST_IS_BUS (bus));
+#line 195 "clip.vala"
+       g_return_if_fail (GST_IS_MESSAGE (message));
+#line 196 "clip.vala"
+       logging_emit (G_OBJECT (self), LOGGING_FACILITY_SIGNAL_HANDLERS, LOGGING_LEVEL_INFO, "on_error");
+#line 1259 "clip.c"
+       _error_ = NULL;
+       text = NULL;
+#line 199 "clip.vala"
+       (gst_message_parse_error (message, &_tmp0_, &_tmp2_), _error_ = (_tmp1_ = _tmp0_, _g_error_free0 (_error_), _tmp1_));
+#line 199 "clip.vala"
+       text = (_tmp3_ = _tmp2_, _g_free0 (text), _tmp3_);
+#line 200 "clip.vala"
+       model_fetcher_do_error (self, text);
+#line 1268 "clip.c"
+       _g_error_free0 (_error_);
+       _g_free0 (text);
+}
+
+
+#line 169 "clip.vala"
+ModelFetcher* model_fetcher_construct (GType object_type) {
+#line 1276 "clip.c"
+       ModelFetcher * self;
+#line 169 "clip.vala"
+       self = (ModelFetcher*) g_object_new (object_type, NULL);
+#line 1280 "clip.c"
+       return self;
+}
+
+
+static void model_fetcher_class_init (ModelFetcherClass * klass) {
+       model_fetcher_parent_class = g_type_class_peek_parent (klass);
+       MODEL_FETCHER_CLASS (klass)->on_pad_added = model_fetcher_real_on_pad_added;
+       MODEL_FETCHER_CLASS (klass)->on_state_change = model_fetcher_real_on_state_change;
+       G_OBJECT_CLASS (klass)->finalize = model_fetcher_finalize;
+       g_signal_new ("ready", MODEL_TYPE_FETCHER, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, MODEL_TYPE_FETCHER);
+}
+
+
+static void model_fetcher_instance_init (ModelFetcher * self) {
+}
+
+
+static void model_fetcher_finalize (GObject* obj) {
+       ModelFetcher * self;
+       self = MODEL_FETCHER (obj);
+       _gst_object_unref0 (self->filesrc);
+       _gst_object_unref0 (self->decodebin);
+       _gst_object_unref0 (self->pipeline);
+       _g_object_unref0 (self->clipfile);
+       _g_free0 (self->error_string);
+       G_OBJECT_CLASS (model_fetcher_parent_class)->finalize (obj);
+}
+
+
+GType model_fetcher_get_type (void) {
+       static volatile gsize model_fetcher_type_id__volatile = 0;
+       if (g_once_init_enter (&model_fetcher_type_id__volatile)) {
+               static const GTypeInfo g_define_type_info = { sizeof (ModelFetcherClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) model_fetcher_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ModelFetcher), 0, (GInstanceInitFunc) model_fetcher_instance_init, NULL };
+               GType model_fetcher_type_id;
+               model_fetcher_type_id = g_type_register_static (G_TYPE_OBJECT, "ModelFetcher", &g_define_type_info, G_TYPE_FLAG_ABSTRACT);
+               g_once_init_leave (&model_fetcher_type_id__volatile, model_fetcher_type_id);
+       }
+       return model_fetcher_type_id__volatile;
+}
+
+
+#line 68 "clip.vala"
+static void _model_clip_file_set_online_model_clip_fetcher_clipfile_online (ModelClipFetcher* _sender, gboolean online, gpointer self) {
+#line 1324 "clip.c"
+       model_clip_file_set_online (self, online);
+}
+
+
+static gpointer _gst_object_ref0 (gpointer self) {
+       return self ? gst_object_ref (self) : NULL;
+}
+
+
+#line 177 "clip.vala"
+static void _model_fetcher_on_pad_added_gst_element_pad_added (GstElement* _sender, GstPad* pad, gpointer self) {
+#line 1336 "clip.c"
+       model_fetcher_on_pad_added (self, pad);
+}
+
+
+#line 178 "clip.vala"
+static void _model_fetcher_on_state_change_gst_bus_message (GstBus* _sender, GstMessage* message, gpointer self) {
+#line 1343 "clip.c"
+       model_fetcher_on_state_change (self, _sender, message);
+}
+
+
+#line 195 "clip.vala"
+static void _model_fetcher_on_error_gst_bus_message (GstBus* _sender, GstMessage* message, gpointer self) {
+#line 1350 "clip.c"
+       model_fetcher_on_error (self, _sender, message);
+}
+
+
+#line 187 "clip.vala"
+static void _model_fetcher_on_warning_gst_bus_message (GstBus* _sender, GstMessage* message, gpointer self) {
+#line 1357 "clip.c"
+       model_fetcher_on_warning (self, _sender, message);
+}
+
+
+#line 207 "clip.vala"
+ModelClipFetcher* model_clip_fetcher_construct (GType object_type, const char* filename, GError** error) {
+#line 1364 "clip.c"
+       GError * _inner_error_;
+       ModelClipFetcher * self;
+       ModelClipFile* _tmp1_;
+       ModelClipFile* *_tmp0_;
+       GstElement* _tmp2_;
+       GstElement* _tmp4_;
+       GstElement* *_tmp3_;
+       GstElement* _tmp5_;
+       GstElement* _tmp7_;
+       GstElement* *_tmp6_;
+       GstPipeline* _tmp9_;
+       GstPipeline* *_tmp8_;
+       GstBus* bus;
+       char* _tmp11_;
+       char* *_tmp10_;
+#line 207 "clip.vala"
+       g_return_val_if_fail (filename != NULL, NULL);
+#line 1382 "clip.c"
+       _inner_error_ = NULL;
+#line 207 "clip.vala"
+       self = (ModelClipFetcher*) model_fetcher_construct (object_type);
+#line 208 "clip.vala"
+       _tmp0_ = &MODEL_FETCHER (self)->clipfile;
+#line 208 "clip.vala"
+       (*_tmp0_) = (_tmp1_ = model_clip_file_new (filename, 0), _g_object_unref0 ((*_tmp0_)), _tmp1_);
+#line 210 "clip.vala"
+       g_signal_connect_object (self, "clipfile-online", (GCallback) _model_clip_file_set_online_model_clip_fetcher_clipfile_online, MODEL_FETCHER (self)->clipfile, 0);
+#line 212 "clip.vala"
+       _tmp2_ = make_element ("filesrc", &_inner_error_);
+#line 1394 "clip.c"
+       if (_inner_error_ != NULL) {
+               g_propagate_error (error, _inner_error_);
+               g_object_unref (self);
+               return NULL;
+       }
+#line 212 "clip.vala"
+       _tmp3_ = &MODEL_FETCHER (self)->filesrc;
+#line 212 "clip.vala"
+       (*_tmp3_) = (_tmp4_ = _tmp2_, _gst_object_unref0 ((*_tmp3_)), _tmp4_);
+#line 213 "clip.vala"
+       g_object_set (G_OBJECT (MODEL_FETCHER (self)->filesrc), "location", filename, NULL);
+#line 215 "clip.vala"
+       _tmp5_ = make_element ("decodebin", &_inner_error_);
+#line 1408 "clip.c"
+       if (_inner_error_ != NULL) {
+               g_propagate_error (error, _inner_error_);
+               g_object_unref (self);
+               return NULL;
+       }
+#line 215 "clip.vala"
+       _tmp6_ = &MODEL_FETCHER (self)->decodebin;
+#line 215 "clip.vala"
+       (*_tmp6_) = (_tmp7_ = GST_ELEMENT (GST_BIN (_tmp5_)), _gst_object_unref0 ((*_tmp6_)), _tmp7_);
+#line 216 "clip.vala"
+       _tmp8_ = &MODEL_FETCHER (self)->pipeline;
+#line 216 "clip.vala"
+       (*_tmp8_) = (_tmp9_ = (GstPipeline*) gst_pipeline_new ("pipeline"), _gst_object_unref0 ((*_tmp8_)), _tmp9_);
+#line 217 "clip.vala"
+       gst_pipeline_set_auto_flush_bus (MODEL_FETCHER (self)->pipeline, FALSE);
+#line 218 "clip.vala"
+       if (MODEL_FETCHER (self)->pipeline == NULL) {
+#line 219 "clip.vala"
+               g_error ("clip.vala:219: can't construct pipeline");
+#line 1428 "clip.c"
+       }
+#line 220 "clip.vala"
+       gst_bin_add_many (GST_BIN (MODEL_FETCHER (self)->pipeline), _gst_object_ref0 (MODEL_FETCHER (self)->filesrc), _gst_object_ref0 (MODEL_FETCHER (self)->decodebin), NULL);
+#line 222 "clip.vala"
+       if (!gst_element_link (MODEL_FETCHER (self)->filesrc, MODEL_FETCHER (self)->decodebin)) {
+#line 223 "clip.vala"
+               g_error ("clip.vala:223: can't link filesrc");
+#line 1436 "clip.c"
+       }
+#line 224 "clip.vala"
+       g_signal_connect_object (MODEL_FETCHER (self)->decodebin, "pad-added", (GCallback) _model_fetcher_on_pad_added_gst_element_pad_added, MODEL_FETCHER (self), 0);
+#line 226 "clip.vala"
+       bus = gst_pipeline_get_bus (MODEL_FETCHER (self)->pipeline);
+#line 228 "clip.vala"
+       gst_bus_add_signal_watch (bus);
+#line 229 "clip.vala"
+       g_signal_connect_object (bus, "message::state-changed", (GCallback) _model_fetcher_on_state_change_gst_bus_message, MODEL_FETCHER (self), 0);
+#line 230 "clip.vala"
+       g_signal_connect_object (bus, "message::error", (GCallback) _model_fetcher_on_error_gst_bus_message, MODEL_FETCHER (self), 0);
+#line 231 "clip.vala"
+       g_signal_connect_object (bus, "message::warning", (GCallback) _model_fetcher_on_warning_gst_bus_message, MODEL_FETCHER (self), 0);
+#line 233 "clip.vala"
+       _tmp10_ = &MODEL_FETCHER (self)->error_string;
+#line 233 "clip.vala"
+       (*_tmp10_) = (_tmp11_ = NULL, _g_free0 ((*_tmp10_)), _tmp11_);
+#line 234 "clip.vala"
+       gst_element_set_state (GST_ELEMENT (MODEL_FETCHER (self)->pipeline), GST_STATE_PLAYING);
+#line 1456 "clip.c"
+       _gst_object_unref0 (bus);
+       return self;
+}
+
+
+#line 207 "clip.vala"
+ModelClipFetcher* model_clip_fetcher_new (const char* filename, GError** error) {
+#line 207 "clip.vala"
+       return model_clip_fetcher_construct (MODEL_TYPE_CLIP_FETCHER, filename, error);
+#line 1466 "clip.c"
+}
+
+
+#line 237 "clip.vala"
+char* model_clip_fetcher_get_filename (ModelClipFetcher* self) {
+#line 1472 "clip.c"
+       char* result = NULL;
+#line 237 "clip.vala"
+       g_return_val_if_fail (MODEL_IS_CLIP_FETCHER (self), NULL);
+#line 1476 "clip.c"
+       result = g_strdup (MODEL_FETCHER (self)->clipfile->filename);
+#line 237 "clip.vala"
+       return result;
+#line 1480 "clip.c"
+}
+
+
+#line 239 "clip.vala"
+static void model_clip_fetcher_real_on_pad_added (ModelFetcher* base, GstPad* pad) {
+#line 1486 "clip.c"
+       ModelClipFetcher * self;
+       GError * _inner_error_;
+       GstPad* fake_pad;
+       GstElement* fake_sink;
+       self = MODEL_CLIP_FETCHER (base);
+#line 239 "clip.vala"
+       g_return_if_fail (GST_IS_PAD (pad));
+#line 1494 "clip.c"
+       _inner_error_ = NULL;
+#line 240 "clip.vala"
+       logging_emit (G_OBJECT (self), LOGGING_FACILITY_SIGNAL_HANDLERS, LOGGING_LEVEL_INFO, "on_pad_added");
+#line 1498 "clip.c"
+       fake_pad = NULL;
+       fake_sink = NULL;
+       {
+               char* _tmp2_;
+               GstCaps* _tmp1_;
+               GstCaps* _tmp0_ = NULL;
+               gboolean _tmp3_;
+#line 244 "clip.vala"
+               if ((_tmp3_ = g_str_has_prefix (_tmp2_ = gst_caps_to_string (_tmp1_ = (g_object_get (pad, "caps", &_tmp0_, NULL), _tmp0_)), "video"), _g_free0 (_tmp2_), _gst_caps_unref0 (_tmp1_), _tmp3_)) {
+#line 1508 "clip.c"
+                       GstElement* _tmp4_;
+                       GstElement* _tmp5_;
+                       GstPad* _tmp6_;
+#line 245 "clip.vala"
+                       _tmp4_ = make_element ("fakesink", &_inner_error_);
+#line 1514 "clip.c"
+                       if (_inner_error_ != NULL) {
+                               goto __catch4_g_error;
+                       }
+#line 245 "clip.vala"
+                       fake_sink = (_tmp5_ = _tmp4_, _gst_object_unref0 (fake_sink), _tmp5_);
+#line 246 "clip.vala"
+                       gst_bin_add (GST_BIN (MODEL_FETCHER (self)->pipeline), _gst_object_ref0 (fake_sink));
+#line 247 "clip.vala"
+                       fake_pad = (_tmp6_ = gst_element_get_static_pad (fake_sink, "sink"), _gst_object_unref0 (fake_pad), _tmp6_);
+#line 249 "clip.vala"
+                       if (!gst_element_sync_state_with_parent (fake_sink)) {
+#line 250 "clip.vala"
+                               g_error ("clip.vala:250: could not sync state with parent");
+#line 1528 "clip.c"
+                       }
+               } else {
+                       GstElement* _tmp7_;
+                       GstElement* _tmp8_;
+                       GstPad* _tmp9_;
+#line 253 "clip.vala"
+                       _tmp7_ = make_element ("fakesink", &_inner_error_);
+#line 1536 "clip.c"
+                       if (_inner_error_ != NULL) {
+                               goto __catch4_g_error;
+                       }
+#line 253 "clip.vala"
+                       fake_sink = (_tmp8_ = _tmp7_, _gst_object_unref0 (fake_sink), _tmp8_);
+#line 254 "clip.vala"
+                       gst_bin_add (GST_BIN (MODEL_FETCHER (self)->pipeline), _gst_object_ref0 (fake_sink));
+#line 255 "clip.vala"
+                       fake_pad = (_tmp9_ = gst_element_get_static_pad (fake_sink, "sink"), _gst_object_unref0 (fake_pad), _tmp9_);
+#line 257 "clip.vala"
+                       if (!gst_element_sync_state_with_parent (fake_sink)) {
+#line 258 "clip.vala"
+                               g_error ("clip.vala:258: could not sync state with parent");
+#line 1550 "clip.c"
+                       }
+               }
+#line 261 "clip.vala"
+               gst_pad_link (pad, fake_pad);
+#line 1555 "clip.c"
+       }
+       goto __finally4;
+       __catch4_g_error:
+       {
+               GError * e;
+               e = _inner_error_;
+               _inner_error_ = NULL;
+               {
+                       _g_error_free0 (e);
+               }
+       }
+       __finally4:
+       if (_inner_error_ != NULL) {
+               _gst_object_unref0 (fake_pad);
+               _gst_object_unref0 (fake_sink);
+               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
+               g_clear_error (&_inner_error_);
+               return;
+       }
+       _gst_object_unref0 (fake_pad);
+       _gst_object_unref0 (fake_sink);
+}
+
+
+#line 267 "clip.vala"
+static GstPad* model_clip_fetcher_get_pad (ModelClipFetcher* self, const char* prefix) {
+#line 1582 "clip.c"
+       GstPad* result = NULL;
+#line 267 "clip.vala"
+       g_return_val_if_fail (MODEL_IS_CLIP_FETCHER (self), NULL);
+#line 267 "clip.vala"
+       g_return_val_if_fail (prefix != NULL, NULL);
+#line 1588 "clip.c"
+       {
+               GList* pad_collection;
+               GList* pad_it;
+#line 268 "clip.vala"
+               pad_collection = MODEL_FETCHER (self)->decodebin->pads;
+#line 1594 "clip.c"
+               for (pad_it = pad_collection; pad_it != NULL; pad_it = pad_it->next) {
+                       GstPad* pad;
+#line 268 "clip.vala"
+                       pad = _gst_object_ref0 ((GstPad*) pad_it->data);
+#line 1599 "clip.c"
+                       {
+                               GstCaps* _tmp1_;
+                               GstCaps* _tmp0_ = NULL;
+                               char* _tmp2_;
+                               char* caps;
+#line 269 "clip.vala"
+                               caps = (_tmp2_ = gst_caps_to_string (_tmp1_ = (g_object_get (pad, "caps", &_tmp0_, NULL), _tmp0_)), _gst_caps_unref0 (_tmp1_), _tmp2_);
+#line 270 "clip.vala"
+                               if (g_str_has_prefix (caps, prefix)) {
+#line 1609 "clip.c"
+                                       result = pad;
+                                       _g_free0 (caps);
+#line 271 "clip.vala"
+                                       return result;
+#line 1614 "clip.c"
+                               }
+                               _gst_object_unref0 (pad);
+                               _g_free0 (caps);
+                       }
+               }
+       }
+       result = NULL;
+#line 274 "clip.vala"
+       return result;
+#line 1624 "clip.c"
+}
+
+
+#line 277 "clip.vala"
+static void model_clip_fetcher_real_on_state_change (ModelFetcher* base, GstBus* bus, GstMessage* message) {
+#line 1630 "clip.c"
+       ModelClipFetcher * self;
+       GstState old_state = 0;
+       GstState new_state = 0;
+       GstState pending = 0;
+       self = MODEL_CLIP_FETCHER (base);
+#line 277 "clip.vala"
+       g_return_if_fail (GST_IS_BUS (bus));
+#line 277 "clip.vala"
+       g_return_if_fail (GST_IS_MESSAGE (message));
+#line 278 "clip.vala"
+       logging_emit (G_OBJECT (self), LOGGING_FACILITY_SIGNAL_HANDLERS, LOGGING_LEVEL_INFO, "on_state_change");
+#line 279 "clip.vala"
+       if (message->src != GST_OBJECT (MODEL_FETCHER (self)->pipeline)) {
+#line 280 "clip.vala"
+               return;
+#line 1646 "clip.c"
+       }
+#line 286 "clip.vala"
+       gst_message_parse_state_changed (message, &old_state, &new_state, &pending);
+#line 287 "clip.vala"
+       if (new_state == old_state) {
+#line 288 "clip.vala"
+               return;
+#line 1654 "clip.c"
+       }
+#line 290 "clip.vala"
+       if (new_state == GST_STATE_PLAYING) {
+#line 1658 "clip.c"
+               GstPad* pad;
+               GstPad* _tmp3_;
+               GstFormat format;
+               gint64 length = 0LL;
+               gboolean _tmp7_ = FALSE;
+#line 291 "clip.vala"
+               pad = model_clip_fetcher_get_pad (self, "video");
+#line 292 "clip.vala"
+               if (pad != NULL) {
+#line 1668 "clip.c"
+                       GstCaps* _tmp2_;
+                       GstCaps* *_tmp1_;
+                       GstCaps* _tmp0_ = NULL;
+#line 293 "clip.vala"
+                       _tmp1_ = &MODEL_FETCHER (self)->clipfile->video_caps;
+#line 293 "clip.vala"
+                       (*_tmp1_) = (_tmp2_ = (g_object_get (pad, "caps", &_tmp0_, NULL), _tmp0_), _gst_caps_unref0 ((*_tmp1_)), _tmp2_);
+#line 1676 "clip.c"
+               }
+#line 296 "clip.vala"
+               pad = (_tmp3_ = model_clip_fetcher_get_pad (self, "audio"), _gst_object_unref0 (pad), _tmp3_);
+#line 297 "clip.vala"
+               if (pad != NULL) {
+#line 1682 "clip.c"
+                       GstCaps* _tmp6_;
+                       GstCaps* *_tmp5_;
+                       GstCaps* _tmp4_ = NULL;
+#line 298 "clip.vala"
+                       _tmp5_ = &MODEL_FETCHER (self)->clipfile->audio_caps;
+#line 298 "clip.vala"
+                       (*_tmp5_) = (_tmp6_ = (g_object_get (pad, "caps", &_tmp4_, NULL), _tmp4_), _gst_caps_unref0 ((*_tmp5_)), _tmp6_);
+#line 1690 "clip.c"
+               }
+#line 301 "clip.vala"
+               format = GST_FORMAT_TIME;
+#line 303 "clip.vala"
+               if (!gst_element_query_duration (GST_ELEMENT (MODEL_FETCHER (self)->pipeline), &format, &length)) {
+#line 303 "clip.vala"
+                       _tmp7_ = TRUE;
+#line 1698 "clip.c"
+               } else {
+#line 304 "clip.vala"
+                       _tmp7_ = format != GST_FORMAT_TIME;
+#line 1702 "clip.c"
+               }
+#line 303 "clip.vala"
+               if (_tmp7_) {
+#line 305 "clip.vala"
+                       model_fetcher_do_error (MODEL_FETCHER (self), "Can't fetch length");
+#line 1708 "clip.c"
+                       _gst_object_unref0 (pad);
+#line 306 "clip.vala"
+                       return;
+#line 1712 "clip.c"
+               }
+#line 308 "clip.vala"
+               model_clip_file_set_length (MODEL_FETCHER (self)->clipfile, length);
+#line 310 "clip.vala"
+               g_signal_emit_by_name (self, "clipfile-online", TRUE);
+#line 311 "clip.vala"
+               gst_element_set_state (GST_ELEMENT (MODEL_FETCHER (self)->pipeline), GST_STATE_NULL);
+#line 1720 "clip.c"
+               _gst_object_unref0 (pad);
+       } else {
+#line 312 "clip.vala"
+               if (new_state == GST_STATE_NULL) {
+#line 313 "clip.vala"
+                       g_signal_emit_by_name (MODEL_FETCHER (self), "ready", MODEL_FETCHER (self));
+#line 1727 "clip.c"
+               }
+       }
+}
+
+
+static void model_clip_fetcher_class_init (ModelClipFetcherClass * klass) {
+       model_clip_fetcher_parent_class = g_type_class_peek_parent (klass);
+       MODEL_FETCHER_CLASS (klass)->on_pad_added = model_clip_fetcher_real_on_pad_added;
+       MODEL_FETCHER_CLASS (klass)->on_state_change = model_clip_fetcher_real_on_state_change;
+       g_signal_new ("clipfile_online", MODEL_TYPE_CLIP_FETCHER, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__BOOLEAN, G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
+}
+
+
+static void model_clip_fetcher_instance_init (ModelClipFetcher * self) {
+}
+
+
+GType model_clip_fetcher_get_type (void) {
+       static volatile gsize model_clip_fetcher_type_id__volatile = 0;
+       if (g_once_init_enter (&model_clip_fetcher_type_id__volatile)) {
+               static const GTypeInfo g_define_type_info = { sizeof (ModelClipFetcherClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) model_clip_fetcher_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ModelClipFetcher), 0, (GInstanceInitFunc) model_clip_fetcher_instance_init, NULL };
+               GType model_clip_fetcher_type_id;
+               model_clip_fetcher_type_id = g_type_register_static (MODEL_TYPE_FETCHER, "ModelClipFetcher", &g_define_type_info, 0);
+               g_once_init_leave (&model_clip_fetcher_type_id__volatile, model_clip_fetcher_type_id);
+       }
+       return model_clip_fetcher_type_id__volatile;
+}
+
+
+static gpointer _g_object_ref0 (gpointer self) {
+       return self ? g_object_ref (self) : NULL;
+}
+
+
+#line 359 "clip.vala"
+static void _model_thumbnail_fetcher_on_have_thumbnail_thumbnail_sink_have_thumbnail (ThumbnailSink* _sender, GdkPixbuf* b, gpointer self) {
+#line 1764 "clip.c"
+       model_thumbnail_fetcher_on_have_thumbnail (self, b);
+}
+
+
+#line 325 "clip.vala"
+ModelThumbnailFetcher* model_thumbnail_fetcher_construct (GType object_type, ModelClipFile* f, gint64 time, GError** error) {
+#line 1771 "clip.c"
+       GError * _inner_error_;
+       ModelThumbnailFetcher * self;
+       ModelClipFile* _tmp1_;
+       ModelClipFile* *_tmp0_;
+       GstCaps* _tmp2_;
+       SingleDecodeBin* _tmp3_;
+       SingleDecodeBin* single_bin;
+       GstPipeline* _tmp5_;
+       GstPipeline* *_tmp4_;
+       ThumbnailSink* _tmp6_;
+       GstElement* _tmp7_;
+       GstElement* _tmp8_;
+       GstBus* bus;
+#line 325 "clip.vala"
+       g_return_val_if_fail (MODEL_IS_CLIP_FILE (f), NULL);
+#line 1787 "clip.c"
+       _inner_error_ = NULL;
+#line 325 "clip.vala"
+       self = (ModelThumbnailFetcher*) model_fetcher_construct (object_type);
+#line 326 "clip.vala"
+       _tmp0_ = &MODEL_FETCHER (self)->clipfile;
+#line 326 "clip.vala"
+       (*_tmp0_) = (_tmp1_ = _g_object_ref0 (f), _g_object_unref0 ((*_tmp0_)), _tmp1_);
+#line 327 "clip.vala"
+       self->priv->seek_position = time;
+#line 329 "clip.vala"
+       single_bin = (_tmp3_ = single_decode_bin_new (_tmp2_ = gst_caps_from_string ("video/x-raw-rgb; video/x-raw-yuv"), "singledecoder", f->filename, &_inner_error_), _gst_caps_unref0 (_tmp2_), _tmp3_);
+#line 1799 "clip.c"
+       if (_inner_error_ != NULL) {
+               g_propagate_error (error, _inner_error_);
+               g_object_unref (self);
+               return NULL;
+       }
+#line 333 "clip.vala"
+       _tmp4_ = &MODEL_FETCHER (self)->pipeline;
+#line 333 "clip.vala"
+       (*_tmp4_) = (_tmp5_ = (GstPipeline*) gst_pipeline_new ("pipeline"), _gst_object_unref0 ((*_tmp4_)), _tmp5_);
+#line 334 "clip.vala"
+       gst_pipeline_set_auto_flush_bus (MODEL_FETCHER (self)->pipeline, FALSE);
+#line 336 "clip.vala"
+       self->priv->thumbnail_sink = (_tmp6_ = thumbnail_sink_new (), _gst_object_unref0 (self->priv->thumbnail_sink), _tmp6_);
+#line 337 "clip.vala"
+       g_signal_connect_object (self->priv->thumbnail_sink, "have-thumbnail", (GCallback) _model_thumbnail_fetcher_on_have_thumbnail_thumbnail_sink_have_thumbnail, self, 0);
+#line 339 "clip.vala"
+       _tmp7_ = make_element ("ffmpegcolorspace", &_inner_error_);
+#line 1817 "clip.c"
+       if (_inner_error_ != NULL) {
+               g_propagate_error (error, _inner_error_);
+               _gst_object_unref0 (single_bin);
+               g_object_unref (self);
+               return NULL;
+       }
+#line 339 "clip.vala"
+       self->priv->colorspace = (_tmp8_ = _tmp7_, _gst_object_unref0 (self->priv->colorspace), _tmp8_);
+#line 341 "clip.vala"
+       gst_bin_add_many (GST_BIN (MODEL_FETCHER (self)->pipeline), _gst_object_ref0 (GST_ELEMENT (single_bin)), _gst_object_ref0 (GST_ELEMENT (self->priv->thumbnail_sink)), _gst_object_ref0 (self->priv->colorspace), NULL);
+#line 343 "clip.vala"
+       g_signal_connect_object (GST_ELEMENT (single_bin), "pad-added", (GCallback) _model_fetcher_on_pad_added_gst_element_pad_added, MODEL_FETCHER (self), 0);
+#line 345 "clip.vala"
+       gst_element_link (self->priv->colorspace, GST_ELEMENT (self->priv->thumbnail_sink));
+#line 347 "clip.vala"
+       bus = gst_pipeline_get_bus (MODEL_FETCHER (self)->pipeline);
+#line 349 "clip.vala"
+       gst_bus_add_signal_watch (bus);
+#line 350 "clip.vala"
+       g_signal_connect_object (bus, "message::state-changed", (GCallback) _model_fetcher_on_state_change_gst_bus_message, MODEL_FETCHER (self), 0);
+#line 351 "clip.vala"
+       g_signal_connect_object (bus, "message::error", (GCallback) _model_fetcher_on_error_gst_bus_message, MODEL_FETCHER (self), 0);
+#line 352 "clip.vala"
+       g_signal_connect_object (bus, "message::warning", (GCallback) _model_fetcher_on_warning_gst_bus_message, MODEL_FETCHER (self), 0);
+#line 354 "clip.vala"
+       self->priv->have_thumbnail = FALSE;
+#line 355 "clip.vala"
+       self->priv->done_seek = FALSE;
+#line 356 "clip.vala"
+       gst_element_set_state (GST_ELEMENT (MODEL_FETCHER (self)->pipeline), GST_STATE_PAUSED);
+#line 1848 "clip.c"
+       _gst_object_unref0 (single_bin);
+       _gst_object_unref0 (bus);
+       return self;
+}
+
+
+#line 325 "clip.vala"
+ModelThumbnailFetcher* model_thumbnail_fetcher_new (ModelClipFile* f, gint64 time, GError** error) {
+#line 325 "clip.vala"
+       return model_thumbnail_fetcher_construct (MODEL_TYPE_THUMBNAIL_FETCHER, f, time, error);
+#line 1859 "clip.c"
+}
+
+
+#line 359 "clip.vala"
+static void model_thumbnail_fetcher_on_have_thumbnail (ModelThumbnailFetcher* self, GdkPixbuf* buf) {
+#line 359 "clip.vala"
+       g_return_if_fail (MODEL_IS_THUMBNAIL_FETCHER (self));
+#line 359 "clip.vala"
+       g_return_if_fail (GDK_IS_PIXBUF (buf));
+#line 360 "clip.vala"
+       logging_emit (G_OBJECT (self), LOGGING_FACILITY_SIGNAL_HANDLERS, LOGGING_LEVEL_INFO, "on_have_thumbnail");
+#line 361 "clip.vala"
+       if (self->priv->done_seek) {
+#line 362 "clip.vala"
+               self->priv->have_thumbnail = TRUE;
+#line 363 "clip.vala"
+               model_clip_file_set_thumbnail (MODEL_FETCHER (self)->clipfile, buf);
+#line 1877 "clip.c"
+       }
+}
+
+
+#line 367 "clip.vala"
+static void model_thumbnail_fetcher_real_on_pad_added (ModelFetcher* base, GstPad* pad) {
+#line 1884 "clip.c"
+       ModelThumbnailFetcher * self;
+       GstCaps* c;
+       char* _tmp0_;
+       gboolean _tmp1_;
+       self = MODEL_THUMBNAIL_FETCHER (base);
+#line 367 "clip.vala"
+       g_return_if_fail (GST_IS_PAD (pad));
+#line 368 "clip.vala"
+       logging_emit (G_OBJECT (self), LOGGING_FACILITY_SIGNAL_HANDLERS, LOGGING_LEVEL_INFO, "on_pad_added");
+#line 369 "clip.vala"
+       c = gst_pad_get_caps (pad);
+#line 371 "clip.vala"
+       if ((_tmp1_ = g_str_has_prefix (_tmp0_ = gst_caps_to_string (c), "video"), _g_free0 (_tmp0_), _tmp1_)) {
+#line 1898 "clip.c"
+               GstPad* _tmp2_;
+#line 372 "clip.vala"
+               gst_pad_link (pad, _tmp2_ = gst_element_get_static_pad (self->priv->colorspace, "sink"));
+#line 1902 "clip.c"
+               _gst_object_unref0 (_tmp2_);
+       }
+       _gst_caps_unref0 (c);
+}
+
+
+#line 376 "clip.vala"
+static void model_thumbnail_fetcher_real_on_state_change (ModelFetcher* base, GstBus* bus, GstMessage* message) {
+#line 1911 "clip.c"
+       ModelThumbnailFetcher * self;
+       GstState new_state = 0;
+       GstState old_state = 0;
+       GstState pending_state = 0;
+       gboolean _tmp0_ = FALSE;
+       self = MODEL_THUMBNAIL_FETCHER (base);
+#line 376 "clip.vala"
+       g_return_if_fail (GST_IS_BUS (bus));
+#line 376 "clip.vala"
+       g_return_if_fail (GST_IS_MESSAGE (message));
+#line 377 "clip.vala"
+       logging_emit (G_OBJECT (self), LOGGING_FACILITY_SIGNAL_HANDLERS, LOGGING_LEVEL_INFO, "on_state_change");
+#line 378 "clip.vala"
+       if (message->src != GST_OBJECT (MODEL_FETCHER (self)->pipeline)) {
+#line 379 "clip.vala"
+               return;
+#line 1928 "clip.c"
+       }
+#line 385 "clip.vala"
+       gst_message_parse_state_changed (message, &old_state, &new_state, &pending_state);
+#line 386 "clip.vala"
+       if (new_state == old_state) {
+#line 387 "clip.vala"
+               _tmp0_ = new_state != GST_STATE_PAUSED;
+#line 1936 "clip.c"
+       } else {
+#line 386 "clip.vala"
+               _tmp0_ = FALSE;
+#line 1940 "clip.c"
+       }
+#line 386 "clip.vala"
+       if (_tmp0_) {
+#line 388 "clip.vala"
+               return;
+#line 1946 "clip.c"
+       }
+#line 390 "clip.vala"
+       if (new_state == GST_STATE_PAUSED) {
+#line 391 "clip.vala"
+               if (!self->priv->done_seek) {
+#line 392 "clip.vala"
+                       self->priv->done_seek = TRUE;
+#line 393 "clip.vala"
+                       gst_element_seek_simple (GST_ELEMENT (MODEL_FETCHER (self)->pipeline), GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, self->priv->seek_position);
+#line 1956 "clip.c"
+               } else {
+#line 395 "clip.vala"
+                       if (self->priv->have_thumbnail) {
+#line 396 "clip.vala"
+                               gst_element_set_state (GST_ELEMENT (MODEL_FETCHER (self)->pipeline), GST_STATE_NULL);
+#line 1962 "clip.c"
+                       }
+               }
+       } else {
+#line 398 "clip.vala"
+               if (new_state == GST_STATE_NULL) {
+#line 399 "clip.vala"
+                       g_signal_emit_by_name (MODEL_FETCHER (self), "ready", MODEL_FETCHER (self));
+#line 1970 "clip.c"
+               }
+       }
+}
+
+
+static void model_thumbnail_fetcher_class_init (ModelThumbnailFetcherClass * klass) {
+       model_thumbnail_fetcher_parent_class = g_type_class_peek_parent (klass);
+       g_type_class_add_private (klass, sizeof (ModelThumbnailFetcherPrivate));
+       MODEL_FETCHER_CLASS (klass)->on_pad_added = model_thumbnail_fetcher_real_on_pad_added;
+       MODEL_FETCHER_CLASS (klass)->on_state_change = model_thumbnail_fetcher_real_on_state_change;
+       G_OBJECT_CLASS (klass)->finalize = model_thumbnail_fetcher_finalize;
+}
+
+
+static void model_thumbnail_fetcher_instance_init (ModelThumbnailFetcher * self) {
+       self->priv = MODEL_THUMBNAIL_FETCHER_GET_PRIVATE (self);
+}
+
+
+static void model_thumbnail_fetcher_finalize (GObject* obj) {
+       ModelThumbnailFetcher * self;
+       self = MODEL_THUMBNAIL_FETCHER (obj);
+       _gst_object_unref0 (self->priv->thumbnail_sink);
+       _gst_object_unref0 (self->priv->colorspace);
+       G_OBJECT_CLASS (model_thumbnail_fetcher_parent_class)->finalize (obj);
+}
+
+
+GType model_thumbnail_fetcher_get_type (void) {
+       static volatile gsize model_thumbnail_fetcher_type_id__volatile = 0;
+       if (g_once_init_enter (&model_thumbnail_fetcher_type_id__volatile)) {
+               static const GTypeInfo g_define_type_info = { sizeof (ModelThumbnailFetcherClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) model_thumbnail_fetcher_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ModelThumbnailFetcher), 0, (GInstanceInitFunc) model_thumbnail_fetcher_instance_init, NULL };
+               GType model_thumbnail_fetcher_type_id;
+               model_thumbnail_fetcher_type_id = g_type_register_static (MODEL_TYPE_FETCHER, "ModelThumbnailFetcher", &g_define_type_info, 0);
+               g_once_init_leave (&model_thumbnail_fetcher_type_id__volatile, model_thumbnail_fetcher_type_id);
+       }
+       return model_thumbnail_fetcher_type_id__volatile;
+}
+
+
+#line 488 "clip.vala"
+static void _model_clip_on_clipfile_updated_model_clip_file_updated (ModelClipFile* _sender, gpointer self) {
+#line 2013 "clip.c"
+       model_clip_on_clipfile_updated (self, _sender);
+}
+
+
+#line 473 "clip.vala"
+ModelClip* model_clip_construct (GType object_type, ModelClipFile* clipfile, ModelMediaType t, const char* name, gint64 start, gint64 media_start, gint64 duration, gboolean is_recording) {
+#line 2020 "clip.c"
+       ModelClip * self;
+       ModelClipFile* _tmp0_;
+       char* _tmp1_;
+#line 473 "clip.vala"
+       g_return_val_if_fail (MODEL_IS_CLIP_FILE (clipfile), NULL);
+#line 473 "clip.vala"
+       g_return_val_if_fail (name != NULL, NULL);
+#line 473 "clip.vala"
+       self = (ModelClip*) g_object_new (object_type, NULL);
+#line 475 "clip.vala"
+       self->is_recording = is_recording;
+#line 476 "clip.vala"
+       self->clipfile = (_tmp0_ = _g_object_ref0 (clipfile), _g_object_unref0 (self->clipfile), _tmp0_);
+#line 477 "clip.vala"
+       self->type = t;
+#line 478 "clip.vala"
+       self->name = (_tmp1_ = g_strdup (name), _g_free0 (self->name), _tmp1_);
+#line 479 "clip.vala"
+       self->priv->connected = model_clip_file_is_online (clipfile);
+#line 480 "clip.vala"
+       model_clip_set_media_start_duration (self, media_start, duration);
+#line 481 "clip.vala"
+       model_clip_set_start (self, start);
+#line 482 "clip.vala"
+       g_signal_connect_object (clipfile, "updated", (GCallback) _model_clip_on_clipfile_updated_model_clip_file_updated, self, 0);
+#line 2046 "clip.c"
+       return self;
+}
+
+
+#line 473 "clip.vala"
+ModelClip* model_clip_new (ModelClipFile* clipfile, ModelMediaType t, const char* name, gint64 start, gint64 media_start, gint64 duration, gboolean is_recording) {
+#line 473 "clip.vala"
+       return model_clip_construct (MODEL_TYPE_CLIP, clipfile, t, name, start, media_start, duration, is_recording);
+#line 2055 "clip.c"
+}
+
+
+#line 485 "clip.vala"
+void model_clip_gnonlin_connect (ModelClip* self) {
+#line 485 "clip.vala"
+       g_return_if_fail (MODEL_IS_CLIP (self));
+#line 485 "clip.vala"
+       self->priv->connected = TRUE;
+#line 2065 "clip.c"
+}
+
+
+#line 486 "clip.vala"
+void model_clip_gnonlin_disconnect (ModelClip* self) {
+#line 486 "clip.vala"
+       g_return_if_fail (MODEL_IS_CLIP (self));
+#line 486 "clip.vala"
+       self->priv->connected = FALSE;
+#line 2075 "clip.c"
+}
+
+
+#line 488 "clip.vala"
+static void model_clip_on_clipfile_updated (ModelClip* self, ModelClipFile* f) {
+#line 488 "clip.vala"
+       g_return_if_fail (MODEL_IS_CLIP (self));
+#line 488 "clip.vala"
+       g_return_if_fail (MODEL_IS_CLIP_FILE (f));
+#line 489 "clip.vala"
+       logging_emit (G_OBJECT (self), LOGGING_FACILITY_SIGNAL_HANDLERS, LOGGING_LEVEL_INFO, "on_clipfile_updated");
+#line 490 "clip.vala"
+       if (model_clip_file_is_online (f)) {
+#line 491 "clip.vala"
+               if (!self->priv->connected) {
+#line 492 "clip.vala"
+                       self->priv->connected = TRUE;
+#line 496 "clip.vala"
+                       model_clip_set_media_start_duration (self, model_clip_get_media_start (self), model_clip_get_duration (self));
+#line 498 "clip.vala"
+                       model_clip_set_start (self, model_clip_get_start (self));
+#line 2097 "clip.c"
+               }
+       } else {
+#line 501 "clip.vala"
+               if (self->priv->connected) {
+#line 502 "clip.vala"
+                       self->priv->connected = FALSE;
+#line 2104 "clip.c"
+               }
+       }
+#line 505 "clip.vala"
+       g_signal_emit_by_name (self, "updated", self);
+#line 2109 "clip.c"
+}
+
+
+#line 508 "clip.vala"
+gboolean model_clip_overlap_pos (ModelClip* self, gint64 start, gint64 length) {
+#line 2115 "clip.c"
+       gboolean result = FALSE;
+       gboolean _tmp0_ = FALSE;
+#line 508 "clip.vala"
+       g_return_val_if_fail (MODEL_IS_CLIP (self), FALSE);
+#line 509 "clip.vala"
+       if (start < (model_clip_get_start (self) + model_clip_get_duration (self))) {
+#line 510 "clip.vala"
+               _tmp0_ = model_clip_get_start (self) < (start + length);
+#line 2124 "clip.c"
+       } else {
+#line 509 "clip.vala"
+               _tmp0_ = FALSE;
+#line 2128 "clip.c"
+       }
+       result = _tmp0_;
+#line 509 "clip.vala"
+       return result;
+#line 2133 "clip.c"
+}
+
+
+#line 513 "clip.vala"
+gint64 model_clip_snap (ModelClip* self, ModelClip* other, gint64 pad) {
+#line 2139 "clip.c"
+       gint64 result = 0LL;
+#line 513 "clip.vala"
+       g_return_val_if_fail (MODEL_IS_CLIP (self), 0LL);
+#line 513 "clip.vala"
+       g_return_val_if_fail (MODEL_IS_CLIP (other), 0LL);
+#line 514 "clip.vala"
+       if (time_in_range (model_clip_get_start (self), model_clip_get_start (other), pad)) {
+#line 2147 "clip.c"
+               result = model_clip_get_start (other);
+#line 515 "clip.vala"
+               return result;
+#line 2151 "clip.c"
+       } else {
+#line 516 "clip.vala"
+               if (time_in_range (model_clip_get_start (self), model_clip_get_end (other), pad)) {
+#line 2155 "clip.c"
+                       result = model_clip_get_end (other);
+#line 517 "clip.vala"
+                       return result;
+#line 2159 "clip.c"
+               } else {
+#line 518 "clip.vala"
+                       if (time_in_range (model_clip_get_end (self), model_clip_get_start (other), pad)) {
+#line 2163 "clip.c"
+                               result = model_clip_get_start (other) - model_clip_get_duration (self);
+#line 519 "clip.vala"
+                               return result;
+#line 2167 "clip.c"
+                       } else {
+#line 520 "clip.vala"
+                               if (time_in_range (model_clip_get_end (self), model_clip_get_end (other), pad)) {
+#line 2171 "clip.c"
+                                       result = model_clip_get_end (other) - model_clip_get_duration (self);
+#line 521 "clip.vala"
+                                       return result;
+#line 2175 "clip.c"
+                               }
+                       }
+               }
+       }
+       result = model_clip_get_start (self);
+#line 523 "clip.vala"
+       return result;
+#line 2183 "clip.c"
+}
+
+
+#line 526 "clip.vala"
+gboolean model_clip_snap_coord (ModelClip* self, gint64* s, gint64 span) {
+#line 2189 "clip.c"
+       gboolean result = FALSE;
+#line 526 "clip.vala"
+       g_return_val_if_fail (MODEL_IS_CLIP (self), FALSE);
+#line 527 "clip.vala"
+       if (time_in_range (*s, model_clip_get_start (self), span)) {
+#line 528 "clip.vala"
+               *s = model_clip_get_start (self);
+#line 2197 "clip.c"
+               result = TRUE;
+#line 529 "clip.vala"
+               return result;
+#line 2201 "clip.c"
+       } else {
+#line 530 "clip.vala"
+               if (time_in_range (*s, model_clip_get_end (self), span)) {
+#line 531 "clip.vala"
+                       *s = model_clip_get_end (self);
+#line 2207 "clip.c"
+                       result = TRUE;
+#line 532 "clip.vala"
+                       return result;
+#line 2211 "clip.c"
+               }
+       }
+       result = FALSE;
+#line 534 "clip.vala"
+       return result;
+#line 2217 "clip.c"
+}
+
+
+#line 537 "clip.vala"
+ModelClip* model_clip_copy (ModelClip* self) {
+#line 2223 "clip.c"
+       ModelClip* result = NULL;
+#line 537 "clip.vala"
+       g_return_val_if_fail (MODEL_IS_CLIP (self), NULL);
+#line 2227 "clip.c"
+       result = model_clip_new (self->clipfile, self->type, self->name, model_clip_get_start (self), model_clip_get_media_start (self), model_clip_get_duration (self), FALSE);
+#line 538 "clip.vala"
+       return result;
+#line 2231 "clip.c"
+}
+
+
+#line 541 "clip.vala"
+gboolean model_clip_is_trimmed (ModelClip* self) {
+#line 2237 "clip.c"
+       gboolean result = FALSE;
+#line 541 "clip.vala"
+       g_return_val_if_fail (MODEL_IS_CLIP (self), FALSE);
+#line 542 "clip.vala"
+       if (!model_clip_file_is_online (self->clipfile)) {
+#line 2243 "clip.c"
+               result = FALSE;
+#line 543 "clip.vala"
+               return result;
+#line 2247 "clip.c"
+       }
+       result = model_clip_get_duration (self) != model_clip_file_get_length (self->clipfile);
+#line 544 "clip.vala"
+       return result;
+#line 2252 "clip.c"
+}
+
+
+#line 547 "clip.vala"
+void model_clip_trim (ModelClip* self, gint64 delta, GdkWindowEdge edge) {
+#line 547 "clip.vala"
+       g_return_if_fail (MODEL_IS_CLIP (self));
+#line 548 "clip.vala"
+       switch (edge) {
+#line 2262 "clip.c"
+               case GDK_WINDOW_EDGE_WEST:
+               {
+#line 550 "clip.vala"
+                       if ((model_clip_get_media_start (self) + delta) < 0) {
+#line 551 "clip.vala"
+                               delta = -model_clip_get_media_start (self);
+#line 2269 "clip.c"
+                       }
+#line 554 "clip.vala"
+                       if ((model_clip_get_duration (self) - delta) < 0) {
+#line 555 "clip.vala"
+                               delta = model_clip_get_duration (self);
+#line 2275 "clip.c"
+                       }
+#line 558 "clip.vala"
+                       model_clip_set_start (self, model_clip_get_start (self) + delta);
+#line 559 "clip.vala"
+                       model_clip_set_media_start_duration (self, model_clip_get_media_start (self) + delta, model_clip_get_duration (self) - delta);
+#line 560 "clip.vala"
+                       break;
+#line 2283 "clip.c"
+               }
+               case GDK_WINDOW_EDGE_EAST:
+               {
+#line 562 "clip.vala"
+                       model_clip_set_duration (self, model_clip_get_duration (self) + delta);
+#line 563 "clip.vala"
+                       break;
+#line 2291 "clip.c"
+               }
+       }
+}
+
+
+#line 567 "clip.vala"
+void model_clip_set_media_start_duration (ModelClip* self, gint64 media_start, gint64 duration) {
+#line 2299 "clip.c"
+       gboolean _tmp0_ = FALSE;
+#line 567 "clip.vala"
+       g_return_if_fail (MODEL_IS_CLIP (self));
+#line 568 "clip.vala"
+       if (media_start < 0) {
+#line 569 "clip.vala"
+               media_start = (gint64) 0;
+#line 2307 "clip.c"
+       }
+#line 572 "clip.vala"
+       if (duration < 0) {
+#line 573 "clip.vala"
+               duration = (gint64) 0;
+#line 2313 "clip.c"
+       }
+#line 576 "clip.vala"
+       if (model_clip_file_is_online (self->clipfile)) {
+#line 576 "clip.vala"
+               _tmp0_ = (media_start + duration) > model_clip_file_get_length (self->clipfile);
+#line 2319 "clip.c"
+       } else {
+#line 576 "clip.vala"
+               _tmp0_ = FALSE;
+#line 2323 "clip.c"
+       }
+#line 576 "clip.vala"
+       if (_tmp0_) {
+#line 578 "clip.vala"
+               media_start = model_clip_file_get_length (self->clipfile) - duration;
+#line 2329 "clip.c"
+       }
+#line 581 "clip.vala"
+       self->priv->_media_start = media_start;
+#line 582 "clip.vala"
+       self->priv->_duration = duration;
+#line 584 "clip.vala"
+       if (self->priv->connected) {
+#line 585 "clip.vala"
+               g_signal_emit_by_name (self, "media-start-changed", self->priv->_media_start);
+#line 586 "clip.vala"
+               g_signal_emit_by_name (self, "duration-changed", self->priv->_duration);
+#line 2341 "clip.c"
+       }
+#line 589 "clip.vala"
+       g_signal_emit_by_name (self, "moved", self);
+#line 2345 "clip.c"
+}
+
+
+#line 592 "clip.vala"
+void model_clip_save (ModelClip* self, FILE* f, gint id) {
+#line 592 "clip.vala"
+       g_return_if_fail (MODEL_IS_CLIP (self));
+#line 592 "clip.vala"
+       g_return_if_fail (f != NULL);
+#line 593 "clip.vala"
+       fprintf (f, "      <clip id=\"%d\" name=\"%s\" start=\"%" G_GINT64_FORMAT "\" " "media-start=\"%" G_GINT64_FORMAT "\" duration=\"%" G_GINT64_FORMAT "\"/>\n", id, self->name, model_clip_get_start (self), model_clip_get_media_start (self), model_clip_get_duration (self));
+#line 2357 "clip.c"
+}
+
+
+gint64 model_clip_get_start (ModelClip* self) {
+       gint64 result;
+       g_return_val_if_fail (MODEL_IS_CLIP (self), 0LL);
+       result = self->priv->_start;
+#line 414 "clip.vala"
+       return result;
+#line 2367 "clip.c"
+}
+
+
+void model_clip_set_start (ModelClip* self, gint64 value) {
+       g_return_if_fail (MODEL_IS_CLIP (self));
+#line 418 "clip.vala"
+       self->priv->_start = value;
+#line 419 "clip.vala"
+       if (self->priv->connected) {
+#line 420 "clip.vala"
+               g_signal_emit_by_name (self, "start-changed", self->priv->_start);
+#line 2379 "clip.c"
+       }
+#line 422 "clip.vala"
+       g_signal_emit_by_name (self, "moved", self);
+#line 2383 "clip.c"
+       g_object_notify ((GObject *) self, "start");
+}
+
+
+gint64 model_clip_get_media_start (ModelClip* self) {
+       gint64 result;
+       g_return_val_if_fail (MODEL_IS_CLIP (self), 0LL);
+       result = self->priv->_media_start;
+#line 429 "clip.vala"
+       return result;
+#line 2394 "clip.c"
+}
+
+
+gint64 model_clip_get_duration (ModelClip* self) {
+       gint64 result;
+       g_return_val_if_fail (MODEL_IS_CLIP (self), 0LL);
+       result = self->priv->_duration;
+#line 436 "clip.vala"
+       return result;
+#line 2404 "clip.c"
+}
+
+
+void model_clip_set_duration (ModelClip* self, gint64 value) {
+       g_return_if_fail (MODEL_IS_CLIP (self));
+#line 440 "clip.vala"
+       if (value < 0) {
+#line 442 "clip.vala"
+               value = (gint64) 0;
+#line 2414 "clip.c"
+       }
+#line 445 "clip.vala"
+       if (!self->is_recording) {
+#line 446 "clip.vala"
+               if ((value + self->priv->_media_start) > model_clip_file_get_length (self->clipfile)) {
+#line 448 "clip.vala"
+                       value = model_clip_file_get_length (self->clipfile) - model_clip_get_media_start (self);
+#line 2422 "clip.c"
+               }
+       }
+#line 452 "clip.vala"
+       self->priv->_duration = value;
+#line 453 "clip.vala"
+       if (self->priv->connected) {
+#line 454 "clip.vala"
+               g_signal_emit_by_name (self, "duration-changed", self->priv->_duration);
+#line 2431 "clip.c"
+       }
+#line 456 "clip.vala"
+       g_signal_emit_by_name (self, "moved", self);
+#line 2435 "clip.c"
+       g_object_notify ((GObject *) self, "duration");
+}
+
+
+gint64 model_clip_get_end (ModelClip* self) {
+       gint64 result;
+       g_return_val_if_fail (MODEL_IS_CLIP (self), 0LL);
+       result = model_clip_get_start (self) + model_clip_get_duration (self);
+#line 463 "clip.vala"
+       return result;
+#line 2446 "clip.c"
+}
+
+
+static void model_clip_class_init (ModelClipClass * klass) {
+       model_clip_parent_class = g_type_class_peek_parent (klass);
+       g_type_class_add_private (klass, sizeof (ModelClipPrivate));
+       G_OBJECT_CLASS (klass)->get_property = model_clip_get_property;
+       G_OBJECT_CLASS (klass)->set_property = model_clip_set_property;
+       G_OBJECT_CLASS (klass)->finalize = model_clip_finalize;
+       g_object_class_install_property (G_OBJECT_CLASS (klass), MODEL_CLIP_START, g_param_spec_int64 ("start", "start", "start", G_MININT64, G_MAXINT64, 0, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE | G_PARAM_WRITABLE));
+       g_object_class_install_property (G_OBJECT_CLASS (klass), MODEL_CLIP_MEDIA_START, g_param_spec_int64 ("media-start", "media-start", "media-start", G_MININT64, G_MAXINT64, 0, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE));
+       g_object_class_install_property (G_OBJECT_CLASS (klass), MODEL_CLIP_DURATION, g_param_spec_int64 ("duration", "duration", "duration", G_MININT64, G_MAXINT64, 0, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE | G_PARAM_WRITABLE));
+       g_object_class_install_property (G_OBJECT_CLASS (klass), MODEL_CLIP_END, g_param_spec_int64 ("end", "end", "end", G_MININT64, G_MAXINT64, 0, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE));
+       g_signal_new ("moved", MODEL_TYPE_CLIP, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, MODEL_TYPE_CLIP);
+       g_signal_new ("updated", MODEL_TYPE_CLIP, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, MODEL_TYPE_CLIP);
+       g_signal_new ("media_start_changed", MODEL_TYPE_CLIP, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_user_marshal_VOID__INT64, G_TYPE_NONE, 1, G_TYPE_INT64);
+       g_signal_new ("duration_changed", MODEL_TYPE_CLIP, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_user_marshal_VOID__INT64, G_TYPE_NONE, 1, G_TYPE_INT64);
+       g_signal_new ("start_changed", MODEL_TYPE_CLIP, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_user_marshal_VOID__INT64, G_TYPE_NONE, 1, G_TYPE_INT64);
+       g_signal_new ("removed", MODEL_TYPE_CLIP, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, MODEL_TYPE_CLIP);
+}
+
+
+static void model_clip_instance_init (ModelClip * self) {
+       self->priv = MODEL_CLIP_GET_PRIVATE (self);
+}
+
+
+static void model_clip_finalize (GObject* obj) {
+       ModelClip * self;
+       self = MODEL_CLIP (obj);
+       _g_object_unref0 (self->clipfile);
+       _g_free0 (self->name);
+       G_OBJECT_CLASS (model_clip_parent_class)->finalize (obj);
+}
+
+
+GType model_clip_get_type (void) {
+       static volatile gsize model_clip_type_id__volatile = 0;
+       if (g_once_init_enter (&model_clip_type_id__volatile)) {
+               static const GTypeInfo g_define_type_info = { sizeof (ModelClipClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) model_clip_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ModelClip), 0, (GInstanceInitFunc) model_clip_instance_init, NULL };
+               GType model_clip_type_id;
+               model_clip_type_id = g_type_register_static (G_TYPE_OBJECT, "ModelClip", &g_define_type_info, 0);
+               g_once_init_leave (&model_clip_type_id__volatile, model_clip_type_id);
+       }
+       return model_clip_type_id__volatile;
+}
+
+
+static void model_clip_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec) {
+       ModelClip * self;
+       self = MODEL_CLIP (object);
+       switch (property_id) {
+               case MODEL_CLIP_START:
+               g_value_set_int64 (value, model_clip_get_start (self));
+               break;
+               case MODEL_CLIP_MEDIA_START:
+               g_value_set_int64 (value, model_clip_get_media_start (self));
+               break;
+               case MODEL_CLIP_DURATION:
+               g_value_set_int64 (value, model_clip_get_duration (self));
+               break;
+               case MODEL_CLIP_END:
+               g_value_set_int64 (value, model_clip_get_end (self));
+               break;
+               default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+               break;
+       }
+}
+
+
+static void model_clip_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec) {
+       ModelClip * self;
+       self = MODEL_CLIP (object);
+       switch (property_id) {
+               case MODEL_CLIP_START:
+               model_clip_set_start (self, g_value_get_int64 (value));
+               break;
+               case MODEL_CLIP_DURATION:
+               model_clip_set_duration (self, g_value_get_int64 (value));
+               break;
+               default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+               break;
+       }
+}
+
+
+#line 601 "clip.vala"
+ModelFetcherCompletion* model_fetcher_completion_construct (GType object_type) {
+#line 2537 "clip.c"
+       ModelFetcherCompletion* self;
+       self = (ModelFetcherCompletion*) g_type_create_instance (object_type);
+       return self;
+}
+
+
+#line 601 "clip.vala"
+ModelFetcherCompletion* model_fetcher_completion_new (void) {
+#line 601 "clip.vala"
+       return model_fetcher_completion_construct (MODEL_TYPE_FETCHER_COMPLETION);
+#line 2548 "clip.c"
+}
+
+
+#line 604 "clip.vala"
+static void model_fetcher_completion_real_complete (ModelFetcherCompletion* self, ModelFetcher* fetcher) {
+#line 604 "clip.vala"
+       g_return_if_fail (MODEL_IS_FETCHER_COMPLETION (self));
+#line 604 "clip.vala"
+       g_return_if_fail (MODEL_IS_FETCHER (fetcher));
+#line 2558 "clip.c"
+}
+
+
+#line 604 "clip.vala"
+void model_fetcher_completion_complete (ModelFetcherCompletion* self, ModelFetcher* fetcher) {
+#line 604 "clip.vala"
+       MODEL_FETCHER_COMPLETION_GET_CLASS (self)->complete (self, fetcher);
+#line 2566 "clip.c"
+}
+
+
+static void model_value_fetcher_completion_init (GValue* value) {
+       value->data[0].v_pointer = NULL;
+}
+
+
+static void model_value_fetcher_completion_free_value (GValue* value) {
+       if (value->data[0].v_pointer) {
+               model_fetcher_completion_unref (value->data[0].v_pointer);
+       }
+}
+
+
+static void model_value_fetcher_completion_copy_value (const GValue* src_value, GValue* dest_value) {
+       if (src_value->data[0].v_pointer) {
+               dest_value->data[0].v_pointer = model_fetcher_completion_ref (src_value->data[0].v_pointer);
+       } else {
+               dest_value->data[0].v_pointer = NULL;
+       }
+}
+
+
+static gpointer model_value_fetcher_completion_peek_pointer (const GValue* value) {
+       return value->data[0].v_pointer;
+}
+
+
+static gchar* model_value_fetcher_completion_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
+       if (collect_values[0].v_pointer) {
+               ModelFetcherCompletion* object;
+               object = collect_values[0].v_pointer;
+               if (object->parent_instance.g_class == NULL) {
+                       return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
+               } else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
+                       return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
+               }
+               value->data[0].v_pointer = model_fetcher_completion_ref (object);
+       } else {
+               value->data[0].v_pointer = NULL;
+       }
+       return NULL;
+}
+
+
+static gchar* model_value_fetcher_completion_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
+       ModelFetcherCompletion** object_p;
+       object_p = collect_values[0].v_pointer;
+       if (!object_p) {
+               return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
+       }
+       if (!value->data[0].v_pointer) {
+               *object_p = NULL;
+       } else if (collect_flags && G_VALUE_NOCOPY_CONTENTS) {
+               *object_p = value->data[0].v_pointer;
+       } else {
+               *object_p = model_fetcher_completion_ref (value->data[0].v_pointer);
+       }
+       return NULL;
+}
+
+
+GParamSpec* model_param_spec_fetcher_completion (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) {
+       ModelParamSpecFetcherCompletion* spec;
+       g_return_val_if_fail (g_type_is_a (object_type, MODEL_TYPE_FETCHER_COMPLETION), NULL);
+       spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
+       G_PARAM_SPEC (spec)->value_type = object_type;
+       return G_PARAM_SPEC (spec);
+}
+
+
+gpointer model_value_get_fetcher_completion (const GValue* value) {
+       g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, MODEL_TYPE_FETCHER_COMPLETION), NULL);
+       return value->data[0].v_pointer;
+}
+
+
+void model_value_set_fetcher_completion (GValue* value, gpointer v_object) {
+       ModelFetcherCompletion* old;
+       g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, MODEL_TYPE_FETCHER_COMPLETION));
+       old = value->data[0].v_pointer;
+       if (v_object) {
+               g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, MODEL_TYPE_FETCHER_COMPLETION));
+               g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
+               value->data[0].v_pointer = v_object;
+               model_fetcher_completion_ref (value->data[0].v_pointer);
+       } else {
+               value->data[0].v_pointer = NULL;
+       }
+       if (old) {
+               model_fetcher_completion_unref (old);
+       }
+}
+
+
+void model_value_take_fetcher_completion (GValue* value, gpointer v_object) {
+       ModelFetcherCompletion* old;
+       g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, MODEL_TYPE_FETCHER_COMPLETION));
+       old = value->data[0].v_pointer;
+       if (v_object) {
+               g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, MODEL_TYPE_FETCHER_COMPLETION));
+               g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
+               value->data[0].v_pointer = v_object;
+       } else {
+               value->data[0].v_pointer = NULL;
+       }
+       if (old) {
+               model_fetcher_completion_unref (old);
+       }
+}
+
+
+static void model_fetcher_completion_class_init (ModelFetcherCompletionClass * klass) {
+       model_fetcher_completion_parent_class = g_type_class_peek_parent (klass);
+       MODEL_FETCHER_COMPLETION_CLASS (klass)->finalize = model_fetcher_completion_finalize;
+       MODEL_FETCHER_COMPLETION_CLASS (klass)->complete = model_fetcher_completion_real_complete;
+}
+
+
+static void model_fetcher_completion_instance_init (ModelFetcherCompletion * self) {
+       self->ref_count = 1;
+}
+
+
+static void model_fetcher_completion_finalize (ModelFetcherCompletion* obj) {
+       ModelFetcherCompletion * self;
+       self = MODEL_FETCHER_COMPLETION (obj);
+}
+
+
+GType model_fetcher_completion_get_type (void) {
+       static volatile gsize model_fetcher_completion_type_id__volatile = 0;
+       if (g_once_init_enter (&model_fetcher_completion_type_id__volatile)) {
+               static const GTypeValueTable g_define_type_value_table = { model_value_fetcher_completion_init, model_value_fetcher_completion_free_value, model_value_fetcher_completion_copy_value, model_value_fetcher_completion_peek_pointer, "p", model_value_fetcher_completion_collect_value, "p", model_value_fetcher_completion_lcopy_value };
+               static const GTypeInfo g_define_type_info = { sizeof (ModelFetcherCompletionClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) model_fetcher_completion_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ModelFetcherCompletion), 0, (GInstanceInitFunc) model_fetcher_completion_instance_init, &g_define_type_value_table };
+               static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) };
+               GType model_fetcher_completion_type_id;
+               model_fetcher_completion_type_id = g_type_register_fundamental (g_type_fundamental_next (), "ModelFetcherCompletion", &g_define_type_info, &g_define_type_fundamental_info, 0);
+               g_once_init_leave (&model_fetcher_completion_type_id__volatile, model_fetcher_completion_type_id);
+       }
+       return model_fetcher_completion_type_id__volatile;
+}
+
+
+gpointer model_fetcher_completion_ref (gpointer instance) {
+       ModelFetcherCompletion* self;
+       self = instance;
+       g_atomic_int_inc (&self->ref_count);
+       return instance;
+}
+
+
+void model_fetcher_completion_unref (gpointer instance) {
+       ModelFetcherCompletion* self;
+       self = instance;
+       if (g_atomic_int_dec_and_test (&self->ref_count)) {
+               MODEL_FETCHER_COMPLETION_GET_CLASS (self)->finalize (self);
+               g_type_free_instance ((GTypeInstance *) self);
+       }
+}
+
+
+
+static void g_cclosure_user_marshal_VOID__INT64 (GClosure * closure, GValue * return_value, guint n_param_values, const GValue * param_values, gpointer invocation_hint, gpointer marshal_data) {
+       typedef void (*GMarshalFunc_VOID__INT64) (gpointer data1, gint64 arg_1, gpointer data2);
+       register GMarshalFunc_VOID__INT64 callback;
+       register GCClosure * cc;
+       register gpointer data1, data2;
+       cc = (GCClosure *) closure;
+       g_return_if_fail (n_param_values == 2);
+       if (G_CCLOSURE_SWAP_DATA (closure)) {
+               data1 = closure->data;
+               data2 = param_values->data[0].v_pointer;
+       } else {
+               data1 = param_values->data[0].v_pointer;
+               data2 = closure->data;
+       }
+       callback = (GMarshalFunc_VOID__INT64) (marshal_data ? marshal_data : cc->callback);
+       callback (data1, g_value_get_int64 (param_values + 1), data2);
+}
+
+
+