[longomatch] video-editor: use a simplar API similar to the video encoder



commit b755046bee008616b01196683d0d9dc89aaf723f
Author: Andoni Morales Alastruey <ylatuya gmail com>
Date:   Fri Aug 16 18:17:50 2013 +0200

    video-editor: use a simplar API similar to the video encoder

 LongoMatch.Multimedia/Editor/GstVideoSplitter.cs   |  232 +-----
 .../Services/RenderingJobsManager.cs               |    4 +-
 libcesarplayer/Makefile.am                         |    5 +-
 libcesarplayer/gst-video-editor.c                  |  866 ++++----------------
 libcesarplayer/gst-video-editor.h                  |   23 +-
 libcesarplayer/test-editor.c                       |   17 +-
 6 files changed, 219 insertions(+), 928 deletions(-)
---
diff --git a/LongoMatch.Multimedia/Editor/GstVideoSplitter.cs 
b/LongoMatch.Multimedia/Editor/GstVideoSplitter.cs
index 42bdbf4..f15c297 100644
--- a/LongoMatch.Multimedia/Editor/GstVideoSplitter.cs
+++ b/LongoMatch.Multimedia/Editor/GstVideoSplitter.cs
@@ -51,132 +51,6 @@ namespace LongoMatch.Video.Editor {
                        };
                }
 
-               #region Properties
-
-               [GLib.Property("enable-audio")]
-               public bool EnableAudio {
-                       get {
-                               GLib.Value val = GetProperty("enable-audio");
-                               bool ret = (bool) val;
-                               val.Dispose();
-                               return ret;
-                       }
-                       set {
-                               GLib.Value val = new GLib.Value(value);
-                               SetProperty("enable-audio", val);
-                               val.Dispose();
-                       }
-               }
-
-               [GLib.Property("enable-title")]
-               public bool EnableTitle {
-                       get {
-                               GLib.Value val = GetProperty("enable-title");
-                               bool ret = (bool) val;
-                               val.Dispose();
-                               return ret;
-                       }
-                       set {
-                               GLib.Value val = new GLib.Value(value);
-                               SetProperty("enable-title", val);
-                               val.Dispose();
-                       }
-               }
-
-               [GLib.Property("video_quality")]
-               public int VideoQuality {
-                       get {
-                               GLib.Value val = GetProperty("video_quality");
-                               int ret = (int) val;
-                               val.Dispose();
-                               return ret;
-                       }
-                       set {
-                               GLib.Value val = new GLib.Value(value);
-                               SetProperty("video_quality", val);
-                               val.Dispose();
-                       }
-               }
-
-               [GLib.Property("audio_bitrate")]
-               public int AudioQuality {
-                       get {
-                               GLib.Value val = GetProperty("audio_quality");
-                               int ret = (int) val;
-                               val.Dispose();
-                               return ret;
-                       }
-                       set {
-                               GLib.Value val = new GLib.Value(value);
-                               SetProperty("audio_quality", val);
-                               val.Dispose();
-                       }
-               }
-
-               [GLib.Property("width")]
-               public int Width {
-                       get {
-                               GLib.Value val = GetProperty("width");
-                               int ret = (int) val;
-                               val.Dispose();
-                               return ret;
-                       }
-                       set {
-                               GLib.Value val = new GLib.Value(value);
-                               SetProperty("width", val);
-                               val.Dispose();
-                       }
-               }
-
-               [GLib.Property("height")]
-               public int Height {
-                       get {
-                               GLib.Value val = GetProperty("height");
-                               int ret = (int) val;
-                               val.Dispose();
-                               return ret;
-                       }
-                       set {
-                               GLib.Value val = new GLib.Value(value);
-                               SetProperty("height", val);
-                               val.Dispose();
-                       }
-               }
-
-               [GLib.Property("output_file")]
-               public string OutputFile {
-                       get {
-                               GLib.Value val = GetProperty("output_file");
-                               string ret = (string) val;
-                               val.Dispose();
-                               return ret;
-                       }
-                       set {
-                               GLib.Value val = new GLib.Value(value);
-                               SetProperty("output_file", val);
-                               val.Dispose();
-                       }
-               }
-               
-               [GLib.Property("title-size")]
-               public int TitleSize {
-                       get {
-                               GLib.Value val = GetProperty("title-size");
-                               int ret = (int) val;
-                               val.Dispose();
-                               return ret;
-                       }
-                       set {
-                               GLib.Value val = new GLib.Value(value);
-                               SetProperty("title-size", val);
-                               val.Dispose();
-                       }
-               }
-
-               #endregion
-
-
-
                #region GSignals
 #pragma warning disable 0169
                [GLib.CDeclCallback]
@@ -336,42 +210,6 @@ namespace LongoMatch.Video.Editor {
                }
 
                [DllImport("libcesarplayer.dll")]
-               static extern void gst_video_editor_set_video_encoder(IntPtr raw, out IntPtr error_ptr, int 
type);
-
-               public void SetVideoEncoder(out string error, VideoEncoderType codec) {
-                       IntPtr error_ptr = IntPtr.Zero;
-                       gst_video_editor_set_video_encoder(Handle,out error_ptr,(int)codec);
-                       if(error_ptr != IntPtr.Zero)
-                               error = GLib.Marshaller.Utf8PtrToString(error_ptr);
-                       else
-                               error = null;
-               }
-
-               [DllImport("libcesarplayer.dll")]
-               static extern void gst_video_editor_set_audio_encoder(IntPtr raw, out IntPtr error_ptr, int 
type);
-
-               public void SetAudioEncoder(out string error, AudioEncoderType codec) {
-                       IntPtr error_ptr = IntPtr.Zero;
-                       gst_video_editor_set_audio_encoder(Handle,out error_ptr,(int)codec);
-                       if(error_ptr != IntPtr.Zero)
-                               error = GLib.Marshaller.Utf8PtrToString(error_ptr);
-                       else
-                               error = null;
-               }
-
-               [DllImport("libcesarplayer.dll")]
-               static extern void gst_video_editor_set_video_muxer(IntPtr raw, out IntPtr error_ptr, int 
type);
-
-               public void SetVideoMuxer(out string error, VideoMuxerType muxer) {
-                       IntPtr error_ptr = IntPtr.Zero;
-                       gst_video_editor_set_video_muxer(Handle,out error_ptr,(int)muxer);
-                       if(error_ptr != IntPtr.Zero)
-                               error = GLib.Marshaller.Utf8PtrToString(error_ptr);
-                       else
-                               error = null;
-               }
-
-               [DllImport("libcesarplayer.dll")]
                static extern void gst_video_editor_init_backend(out int argc, IntPtr argv);
 
                public static int InitBackend(string argv) {
@@ -380,48 +218,36 @@ namespace LongoMatch.Video.Editor {
                        return argc;
                }
 
-               public EncodingSettings EncodingSettings{
-                       set{
-                               /* FIXME: This should only be possible with the editor in the NULL state.
-                                * For now keep this exact order setting the properties in the editor,
-                                * otherwise it won't work */
-                               VideoQuality = (int) value.EncodingQuality.VideoQuality;
-                               AudioQuality = (int) value.EncodingQuality.AudioQuality;
-                               Height = (int) value.VideoStandard.Height;
-                               Width = (int) value.VideoStandard.Width;
-                               AudioEncoder = value.EncodingProfile.AudioEncoder;
-                               VideoEncoder = value.EncodingProfile.VideoEncoder;
-                               OutputFile = value.OutputFile;
-                               EnableAudio = false;
-                               VideoMuxer = value.EncodingProfile.Muxer;
-                               TitleSize = 14;
-                       }
-               }
-
-               private AudioEncoderType AudioEncoder {
-                       set {
-                               string error;
-                               SetAudioEncoder(out error,value);
-                               if(error != null)
-                                       throw new Exception(error);
-                       }
-               }
-
-               private VideoEncoderType VideoEncoder {
-                       set {
-                               string error;
-                               SetVideoEncoder(out error, value);
-                               if(error != null)
-                                       throw new Exception(error);
-                       }
-               }
-
-               private VideoMuxerType VideoMuxer {
+               [DllImport("libcesarplayer.dll")]
+               static extern bool gst_video_editor_set_encoding_format(IntPtr raw,
+                                                                       string output_file,
+                                                                       VideoEncoderType video_codec,
+                                                                       AudioEncoderType audio_codec,
+                                                                       VideoMuxerType muxer,
+                                                                       uint video_quality,
+                                                                       uint audio_quality,
+                                                                       uint width,
+                                                                       uint height,
+                                                                       uint fps_n,
+                                                                       uint fps_d,
+                                                                       bool enable_audio,
+                                                                       bool enable_video);
+               
+               public EncodingSettings EncodingSettings {
                        set {
-                               string error;
-                               SetVideoMuxer(out error,value);
-                               if(error != null)
-                                       throw new Exception(error);
+                               gst_video_editor_set_encoding_format (Handle,
+                                                                     value.OutputFile,
+                                                                     value.EncodingProfile.VideoEncoder,
+                                                                     value.EncodingProfile.AudioEncoder,
+                                                                     value.EncodingProfile.Muxer,
+                                                                     value.EncodingQuality.VideoQuality,
+                                                                     value.EncodingQuality.AudioQuality,
+                                                                     value.VideoStandard.Width,
+                                                                     value.VideoStandard.Height,
+                                                                     value.Framerate_n,
+                                                                     value.Framerate_d,
+                                                                     value.EnableAudio,
+                                                                     value.EnableTitle);
                        }
                }
 
diff --git a/LongoMatch.Services/Services/RenderingJobsManager.cs 
b/LongoMatch.Services/Services/RenderingJobsManager.cs
index 15f7de4..b8f3bac 100644
--- a/LongoMatch.Services/Services/RenderingJobsManager.cs
+++ b/LongoMatch.Services/Services/RenderingJobsManager.cs
@@ -167,6 +167,7 @@ namespace LongoMatch.Services
                
                private void LoadEditionJob(EditionJob job) {
                        videoEditor = multimediaToolkit.GetVideoEditor();
+                       videoEditor.EncodingSettings = job.EncodingSettings;
                        videoEditor.Progress += OnProgress;
                        
                        foreach(PlayListPlay segment in job.Playlist) {
@@ -175,9 +176,6 @@ namespace LongoMatch.Services
                        }
                        
                        try {
-                               videoEditor.EncodingSettings = job.EncodingSettings;
-                               videoEditor.EnableTitle = job.OverlayTitle;
-                               videoEditor.EnableAudio = job.EnableAudio;
                                videoEditor.Start();
                        }
                        catch(Exception ex) {
diff --git a/libcesarplayer/Makefile.am b/libcesarplayer/Makefile.am
index a946493..48a5bda 100644
--- a/libcesarplayer/Makefile.am
+++ b/libcesarplayer/Makefile.am
@@ -60,7 +60,7 @@ EXTRA_DIST = \
        baconvideowidget-marshal.list
 
 
-noinst_PROGRAMS = test-capturer test-encoder test-discoverer test-remuxer
+noinst_PROGRAMS = test-capturer test-encoder test-discoverer test-remuxer test-editor
 
 test_capturer_SOURCES = test-capturer.c
 test_capturer_LDADD =  libcesarplayer.la $(CESARPLAYER_LIBS)
@@ -73,3 +73,6 @@ test_discoverer_LDADD =  libcesarplayer.la $(CESARPLAYER_LIBS)
 
 test_remuxer_SOURCES = test-remuxer.c
 test_remuxer_LDADD =  libcesarplayer.la $(CESARPLAYER_LIBS)
+
+test_editor_SOURCES = test-editor.c
+test_editor_LDADD =  libcesarplayer.la $(CESARPLAYER_LIBS)
diff --git a/libcesarplayer/gst-video-editor.c b/libcesarplayer/gst-video-editor.c
index 29620e2..79b27c3 100644
--- a/libcesarplayer/gst-video-editor.c
+++ b/libcesarplayer/gst-video-editor.c
@@ -24,15 +24,11 @@
 #include <stdio.h>
 #include <gst/gst.h>
 #include "gst-video-editor.h"
+#include "video-utils.h"
 
 
-#define DEFAULT_VIDEO_ENCODER "vp8enc"
-#define DEFAULT_AUDIO_ENCODER "vorbisenc"
-#define DEFAULT_VIDEO_MUXER "matroskamux"
-#define LAME_CAPS "audio/x-raw-int, rate=44100, channels=2, endianness=1234, signed=true, width=16, depth=16"
-#define VORBIS_CAPS "audio/x-raw-float, rate=44100, channels=2, endianness=1234, signed=true, width=32, 
depth=32"
-#define FAAC_CAPS "audio/x-raw-int, rate=44100, channels=2, endianness=1234, signed=true, width=16, depth=16"
-#define AC3_CAPS "audio/x-raw-int, rate=44100, channels=2, endianness=1234, signed=true, width=16, depth=16"
+#define AUDIO_INT_CAPS "audio/x-raw-int, rate=44100, channels=2"
+#define AUDIO_FLOAT "audio/x-raw-float, rate=44100, channels=2"
 
 #define TIMEOUT 50
 
@@ -49,14 +45,6 @@ enum
 enum
 {
   PROP_0,
-  PROP_ENABLE_AUDIO,
-  PROP_ENABLE_TITLE,
-  PROP_VIDEO_BITRATE,
-  PROP_AUDIO_BITRATE,
-  PROP_HEIGHT,
-  PROP_WIDTH,
-  PROP_OUTPUT_FILE,
-  PROP_TITLE_SIZE
 };
 
 struct GstVideoEditorPrivate
@@ -73,11 +61,16 @@ struct GstVideoEditorPrivate
   gboolean audio_enabled;
   gboolean title_enabled;
   gchar *output_file;
-  gint audio_bitrate;
-  gint video_bitrate;
-  gint width;
-  gint height;
-  gint title_size;
+  guint audio_quality;
+  guint video_quality;
+  guint width;
+  guint height;
+  guint fps_n;
+  guint fps_d;
+  guint title_size;
+  VideoEncoderType video_encoder_type;
+  AudioEncoderType audio_encoder_type;
+  VideoMuxerType muxer_type;
 
   /* Bins */
   GstElement *main_pipeline;
@@ -97,7 +90,6 @@ struct GstVideoEditorPrivate
   GstElement *capsfilter;
   GstElement *queue;
   GstElement *video_encoder;
-  VideoEncoderType video_encoder_type;
 
   /* Audio */
   GstElement *audioidentity;
@@ -124,14 +116,8 @@ static void new_decoded_pad_cb (GstElement * object, GstPad * arg0,
     gpointer user_data);
 static void gve_bus_message_cb (GstBus * bus, GstMessage * message,
     gpointer data);
-static void gst_video_editor_get_property (GObject * object,
-    guint property_id, GValue * value, GParamSpec * pspec);
-static void gst_video_editor_set_property (GObject * object,
-    guint property_id, const GValue * value, GParamSpec * pspec);
 static gboolean gve_query_timeout (GstVideoEditor * gve);
-static void gve_apply_new_caps (GstVideoEditor * gve);
 static void gve_apply_title_size (GstVideoEditor * gve, gint size);
-static void gve_rewrite_headers (GstVideoEditor * gve);
 G_DEFINE_TYPE (GstVideoEditor, gst_video_editor, G_TYPE_OBJECT);
 
 
@@ -152,8 +138,8 @@ gst_video_editor_init (GstVideoEditor * object)
 
   priv->output_file = "new_video.avi";
 
-  priv->audio_bitrate = 128000;
-  priv->video_bitrate = 5000;
+  priv->audio_quality = 50;
+  priv->video_quality = 50;
   priv->height = 540;
   priv->width = 720;
   priv->title_size = 20;
@@ -213,42 +199,8 @@ gst_video_editor_class_init (GstVideoEditorClass * klass)
   g_type_class_add_private (object_class, sizeof (GstVideoEditorPrivate));
 
   /* GObject */
-  object_class->set_property = gst_video_editor_set_property;
-  object_class->get_property = gst_video_editor_get_property;
   object_class->finalize = gst_video_editor_finalize;
 
-  /* Properties */
-  g_object_class_install_property (object_class, PROP_ENABLE_AUDIO,
-      g_param_spec_boolean ("enable-audio", NULL,
-          NULL, TRUE, G_PARAM_READWRITE));
-
-  g_object_class_install_property (object_class, PROP_ENABLE_TITLE,
-      g_param_spec_boolean ("enable-title", NULL,
-          NULL, TRUE, G_PARAM_READWRITE));
-
-  g_object_class_install_property (object_class, PROP_VIDEO_BITRATE,
-      g_param_spec_int ("video_bitrate", NULL,
-          NULL, 100, G_MAXINT, 10000, G_PARAM_READWRITE));
-
-  g_object_class_install_property (object_class, PROP_AUDIO_BITRATE,
-      g_param_spec_int ("audio_bitrate", NULL,
-          NULL, 12000, G_MAXINT, 128000, G_PARAM_READWRITE));
-
-  g_object_class_install_property (object_class, PROP_HEIGHT,
-      g_param_spec_int ("height", NULL, NULL,
-          240, 1080, 480, G_PARAM_READWRITE));
-
-  g_object_class_install_property (object_class, PROP_WIDTH,
-      g_param_spec_int ("width", NULL, NULL, 320,
-          1920, 720, G_PARAM_READWRITE));
-
-  g_object_class_install_property (object_class, PROP_TITLE_SIZE,
-      g_param_spec_int ("title-size", NULL, NULL,
-          1, 100, 20, G_PARAM_READWRITE));
-
-  g_object_class_install_property (object_class, PROP_OUTPUT_FILE,
-      g_param_spec_string ("output_file", NULL, NULL, "", G_PARAM_READWRITE));
-
   /* Signals */
   gve_signals[SIGNAL_ERROR] =
       g_signal_new ("error",
@@ -268,213 +220,11 @@ gst_video_editor_class_init (GstVideoEditorClass * klass)
 
 /* =========================================== */
 /*                                             */
-/*                Properties                   */
-/*                                             */
-/* =========================================== */
-
-static void
-gst_video_editor_set_enable_audio (GstVideoEditor * gve, gboolean audio_enabled)
-{
-  GstState cur_state;
-
-  gst_element_get_state (gve->priv->main_pipeline, &cur_state, NULL, 0);
-
-  if (cur_state > GST_STATE_READY) {
-    GST_WARNING ("Could not enable/disable audio. Pipeline is playing");
-    return;
-  }
-
-  if (!gve->priv->audio_enabled && audio_enabled) {
-    /* Audio needs to be enabled and is disabled */
-    gst_bin_add_many (GST_BIN (gve->priv->main_pipeline),
-        gve->priv->gnl_audio_composition, gve->priv->aencode_bin, NULL);
-    gst_element_link (gve->priv->aencode_bin, gve->priv->muxer);
-    gst_element_set_state (gve->priv->gnl_audio_composition, cur_state);
-    gst_element_set_state (gve->priv->aencode_bin, cur_state);
-    gve_rewrite_headers (gve);
-    gve->priv->audio_enabled = TRUE;
-    GST_INFO ("Audio enabled");
-  } else if (gve->priv->audio_enabled && !audio_enabled) {
-    /* Audio is enabled and needs to be disabled) */
-    gst_element_unlink_many (gve->priv->gnl_audio_composition,
-        gve->priv->aencode_bin, gve->priv->muxer, NULL);
-    gst_element_set_state (gve->priv->gnl_audio_composition, GST_STATE_NULL);
-    gst_element_set_state (gve->priv->aencode_bin, GST_STATE_NULL);
-    gst_object_ref (gve->priv->gnl_audio_composition);
-    gst_object_ref (gve->priv->aencode_bin);
-    gst_bin_remove_many (GST_BIN (gve->priv->main_pipeline),
-        gve->priv->gnl_audio_composition, gve->priv->aencode_bin, NULL);
-    gve_rewrite_headers (gve);
-    gve->priv->audio_enabled = FALSE;
-    GST_INFO ("Audio disabled");
-  }
-}
-
-static void
-gst_video_editor_set_enable_title (GstVideoEditor * gve, gboolean title_enabled)
-{
-  gve->priv->title_enabled = title_enabled;
-  g_object_set (G_OBJECT (gve->priv->textoverlay), "silent",
-      !gve->priv->title_enabled, NULL);
-}
-
-static void
-gst_video_editor_set_video_bit_rate (GstVideoEditor * gve, gint bitrate)
-{
-  GstState cur_state;
-
-  gve->priv->video_bitrate = bitrate;
-  gst_element_get_state (gve->priv->video_encoder, &cur_state, NULL, 0);
-  if (cur_state <= GST_STATE_READY) {
-    if (gve->priv->video_encoder_type == VIDEO_ENCODER_THEORA ||
-        gve->priv->video_encoder_type == VIDEO_ENCODER_H264)
-      g_object_set (gve->priv->video_encoder, "bitrate", bitrate, NULL);
-    else
-      g_object_set (gve->priv->video_encoder, "bitrate", bitrate * 1000, NULL);
-    GST_INFO_OBJECT (gve, "Encoding video bitrate changed to :%d (kbps)\n", bitrate);
-  }
-}
-
-static void
-gst_video_editor_set_audio_bit_rate (GstVideoEditor * gve, gint bitrate)
-{
-  GstState cur_state;
-
-  gve->priv->audio_bitrate = bitrate;
-  gst_element_get_state (gve->priv->audioencoder, &cur_state, NULL, 0);
-  if (cur_state <= GST_STATE_READY) {
-    g_object_set (gve->priv->audioencoder, "bitrate", bitrate, NULL);
-    GST_INFO_OBJECT (gve, "Encoding audio bitrate changed to :%d (bps)\n", bitrate);
-  }
-}
-
-static void
-gst_video_editor_set_width (GstVideoEditor * gve, gint width)
-{
-  gve->priv->width = width;
-  gve_apply_new_caps (gve);
-}
-
-static void
-gst_video_editor_set_height (GstVideoEditor * gve, gint height)
-{
-  gve->priv->height = height;
-  gve_apply_new_caps (gve);
-}
-
-static void
-gst_video_editor_set_title_size (GstVideoEditor * gve, gint size)
-{
-  gve->priv->title_size = size;
-  gve_apply_title_size (gve, size);
-}
-
-static void
-gst_video_editor_set_output_file (GstVideoEditor * gve, const char *output_file)
-{
-  GstState cur_state;
-
-  gve->priv->output_file = g_strdup (output_file);
-  gst_element_get_state (gve->priv->file_sink, &cur_state, NULL, 0);
-  if (cur_state <= GST_STATE_READY) {
-    gst_element_set_state (gve->priv->file_sink, GST_STATE_NULL);
-    g_object_set (gve->priv->file_sink, "location", gve->priv->output_file,
-        NULL);
-    GST_INFO_OBJECT (gve, "Ouput File changed to :%s\n", gve->priv->output_file);
-  }
-}
-
-static void
-gst_video_editor_set_property (GObject * object, guint property_id,
-    const GValue * value, GParamSpec * pspec)
-{
-  GstVideoEditor *gve;
-
-  gve = GST_VIDEO_EDITOR (object);
-
-  switch (property_id) {
-    case PROP_ENABLE_AUDIO:
-      gst_video_editor_set_enable_audio (gve, g_value_get_boolean (value));
-      break;
-    case PROP_ENABLE_TITLE:
-      gst_video_editor_set_enable_title (gve, g_value_get_boolean (value));
-      break;
-    case PROP_VIDEO_BITRATE:
-      gst_video_editor_set_video_bit_rate (gve, g_value_get_int (value));
-      break;
-    case PROP_AUDIO_BITRATE:
-      gst_video_editor_set_audio_bit_rate (gve, g_value_get_int (value));
-      break;
-    case PROP_WIDTH:
-      gst_video_editor_set_width (gve, g_value_get_int (value));
-      break;
-    case PROP_HEIGHT:
-      gst_video_editor_set_height (gve, g_value_get_int (value));
-      break;
-    case PROP_TITLE_SIZE:
-      gst_video_editor_set_title_size (gve, g_value_get_int (value));
-      break;
-    case PROP_OUTPUT_FILE:
-      gst_video_editor_set_output_file (gve, g_value_get_string (value));
-      break;
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-      break;
-  }
-}
-
-static void
-gst_video_editor_get_property (GObject * object, guint property_id,
-    GValue * value, GParamSpec * pspec)
-{
-  GstVideoEditor *gve;
-
-  gve = GST_VIDEO_EDITOR (object);
-
-  switch (property_id) {
-    case PROP_ENABLE_AUDIO:
-      g_value_set_boolean (value, gve->priv->audio_enabled);
-      break;
-    case PROP_ENABLE_TITLE:
-      g_value_set_boolean (value, gve->priv->title_enabled);
-      break;
-    case PROP_AUDIO_BITRATE:
-      g_value_set_int (value, gve->priv->audio_bitrate);
-      break;
-    case PROP_VIDEO_BITRATE:
-      g_value_set_int (value, gve->priv->video_bitrate);
-      break;
-    case PROP_WIDTH:
-      g_value_set_int (value, gve->priv->width);
-      break;
-    case PROP_HEIGHT:
-      g_value_set_int (value, gve->priv->height);
-      break;
-    case PROP_OUTPUT_FILE:
-      g_value_set_string (value, gve->priv->output_file);
-      break;
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-      break;
-  }
-}
-
-/* =========================================== */
-/*                                             */
 /*               Private Methods               */
 /*                                             */
 /* =========================================== */
 
 static void
-gve_rewrite_headers (GstVideoEditor * gve)
-{
-  gst_element_set_state (gve->priv->muxer, GST_STATE_NULL);
-  gst_element_set_state (gve->priv->file_sink, GST_STATE_NULL);
-  gst_element_set_state (gve->priv->file_sink, GST_STATE_READY);
-  gst_element_set_state (gve->priv->muxer, GST_STATE_READY);
-}
-
-static void
 gve_set_tick_timeout (GstVideoEditor * gve, guint msecs)
 {
   g_return_if_fail (msecs > 0);
@@ -485,29 +235,12 @@ gve_set_tick_timeout (GstVideoEditor * gve, guint msecs)
 }
 
 static void
-gve_apply_new_caps (GstVideoEditor * gve)
-{
-  GstCaps *caps;
-
-  caps = gst_caps_new_simple ("video/x-raw-yuv",
-      "width", G_TYPE_INT, gve->priv->width,
-      "height", G_TYPE_INT, gve->priv->height,
-      "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1,
-      "framerate", GST_TYPE_FRACTION, 25, 1, NULL);
-
-  GST_INFO_OBJECT(gve, "Changed caps: %s", gst_caps_to_string(caps));
-  g_object_set (G_OBJECT (gve->priv->capsfilter), "caps", caps, NULL);
-  gst_caps_unref (caps);
-}
-
-static void
 gve_apply_title_size (GstVideoEditor * gve, gint size)
 {
   gchar *font;
 
   font = g_strdup_printf ("sans bold %d", size);
-  g_object_set (G_OBJECT (gve->priv->textoverlay), "font-desc", font,
-        "auto-resize", TRUE, "wrap-mode", 0, NULL);
+  g_object_set (G_OBJECT (gve->priv->textoverlay), "font-desc", font, NULL);
   g_free (font);
 }
 
@@ -529,14 +262,24 @@ gve_set_overlay_title (GstVideoEditor *gve, gchar *title)
   }
 }
 
+GQuark
+gst_video_editor_error_quark (void)
+{
+  static GQuark q;              /* 0 */
+
+  if (G_UNLIKELY (q == 0)) {
+    q = g_quark_from_static_string ("gve-error-quark");
+  }
+  return q;
+}
+
 static void
 gve_create_video_encode_bin (GstVideoEditor * gve)
 {
   GstPad *sinkpad = NULL;
   GstPad *srcpad = NULL;
-
-  if (gve->priv->vencode_bin != NULL)
-    return;
+  GError *error = NULL;
+  GstCaps *caps;
 
   gve->priv->vencode_bin = gst_element_factory_make ("bin", "vencodebin");
   gve->priv->identity = gst_element_factory_make ("identity", "identity");
@@ -548,15 +291,31 @@ gve_create_video_encode_bin (GstVideoEditor * gve)
   gve->priv->textoverlay =
       gst_element_factory_make ("textoverlay", "textoverlay");
   gve->priv->queue = gst_element_factory_make ("queue", "video-encode-queue");
-  gve->priv->video_encoder =
-      gst_element_factory_make (DEFAULT_VIDEO_ENCODER, "video-encoder");
+  gve->priv->video_encoder = lgm_create_video_encoder (
+      gve->priv->video_encoder_type, gve->priv->video_quality,
+      GVE_ERROR, &error);
+  if (error) {
+    g_signal_emit (gve, gve_signals[SIGNAL_ERROR], 0, error->message);
+    g_error_free (error);
+    return;
+  }
 
+  caps = gst_caps_new_simple ("video/x-raw-yuv",
+      "width", G_TYPE_INT, (gint) gve->priv->width,
+      "height", G_TYPE_INT, (gint) gve->priv->height,
+      "pixel-aspect-ratio", GST_TYPE_FRACTION, 1, 1,
+      "framerate", GST_TYPE_FRACTION,
+      (gint) gve->priv->fps_n, (gint) gve->priv->fps_d, NULL);
+  g_object_set (G_OBJECT (gve->priv->capsfilter), "caps", caps, NULL);
+  gst_caps_unref (caps);
   g_object_set (G_OBJECT (gve->priv->identity), "single-segment", TRUE, NULL);
-  g_object_set (G_OBJECT (gve->priv->textoverlay), "font-desc",
-      "sans bold 20", "valignment", 2, "halignment", 2, NULL);
+  g_object_set (G_OBJECT (gve->priv->textoverlay),
+      "valignment", 2, "halignment", 2, "auto-resize", TRUE, "wrap-mode", 0, NULL);
+  gve_apply_title_size (gve, gve->priv->title_size);
+  if (!gve->priv->title_enabled) {
+    g_object_set (G_OBJECT (gve->priv->textoverlay), "silent", TRUE, NULL);
+  }
   g_object_set (G_OBJECT (gve->priv->videoscale), "add-borders", TRUE, NULL);
-  g_object_set (G_OBJECT (gve->priv->video_encoder), "bitrate",
-      gve->priv->video_bitrate, NULL);
 
   /*Add and link elements */
   gst_bin_add_many (GST_BIN (gve->priv->vencode_bin),
@@ -594,6 +353,8 @@ gve_create_audio_encode_bin (GstVideoEditor * gve)
 {
   GstPad *sinkpad = NULL;
   GstPad *srcpad = NULL;
+  GError *error = NULL;
+  GstCaps *caps;
 
   if (gve->priv->aencode_bin != NULL)
     return;
@@ -608,16 +369,20 @@ gve_create_audio_encode_bin (GstVideoEditor * gve)
   gve->priv->audiocapsfilter =
       gst_element_factory_make ("capsfilter", "audiocapsfilter");
   gve->priv->audioqueue = gst_element_factory_make ("queue", "audio-queue");
-  gve->priv->audioencoder =
-      gst_element_factory_make (DEFAULT_AUDIO_ENCODER, "audio-encoder");
-
+  gve->priv->audioencoder = lgm_create_audio_encoder (
+      gve->priv->audio_encoder_type, gve->priv->audio_quality, GVE_ERROR,
+      &error);
+  if (error) {
+    g_signal_emit (gve, gve_signals[SIGNAL_ERROR], 0, error->message);
+    g_error_free (error);
+    return;
+  }
 
   g_object_set (G_OBJECT (gve->priv->audioidentity), "single-segment", TRUE,
       NULL);
-  g_object_set (G_OBJECT (gve->priv->audiocapsfilter), "caps",
-      gst_caps_from_string (VORBIS_CAPS), NULL);
-  g_object_set (G_OBJECT (gve->priv->audioencoder), "bitrate",
-      gve->priv->audio_bitrate, NULL);
+  caps = gst_caps_from_string (AUDIO_INT_CAPS ";" AUDIO_FLOAT);
+  g_object_set (G_OBJECT (gve->priv->audiocapsfilter), "caps", caps, NULL);
+  gst_caps_unref (caps);
 
   /*Add and link elements */
   gst_bin_add_many (GST_BIN (gve->priv->aencode_bin),
@@ -649,17 +414,6 @@ gve_create_audio_encode_bin (GstVideoEditor * gve)
   g_object_unref (sinkpad);
 }
 
-GQuark
-gst_video_editor_error_quark (void)
-{
-  static GQuark q;              /* 0 */
-
-  if (G_UNLIKELY (q == 0)) {
-    q = g_quark_from_static_string ("gve-error-quark");
-  }
-  return q;
-}
-
 /* =========================================== */
 /*                                             */
 /*                Callbacks                    */
@@ -683,7 +437,6 @@ new_decoded_pad_cb (GstElement * object, GstPad * pad, gpointer user_data)
   str = gst_caps_get_structure (caps, 0);
 
   if (g_strrstr (gst_structure_get_name (str), "video")) {
-    gst_element_set_state (gve->priv->vencode_bin, GST_STATE_PLAYING);
     videopad =
         gst_element_get_compatible_pad (gve->priv->vencode_bin, pad, NULL);
     /* only link once */
@@ -698,8 +451,8 @@ new_decoded_pad_cb (GstElement * object, GstPad * pad, gpointer user_data)
     g_object_unref (videopad);
   }
 
-  else if (g_strrstr (gst_structure_get_name (str), "audio")) {
-    gst_element_set_state (gve->priv->aencode_bin, GST_STATE_PLAYING);
+  else if (g_strrstr (gst_structure_get_name (str), "audio")
+      && gve->priv->audio_enabled) {
     audiopad =
         gst_element_get_compatible_pad (gve->priv->aencode_bin, pad, NULL);
     /* only link once */
@@ -887,39 +640,38 @@ gst_video_editor_add_segment (GstVideoEditor * gve, gchar * file,
       "media-duration", duration,
       "start", gve->priv->duration,
       "duration", final_duration, "caps", filter, NULL);
-  if (gve->priv->segments == 0) {
-    gve_set_overlay_title (gve, title);
-  }
   gst_bin_add (GST_BIN (gve->priv->gnl_video_composition), gnl_filesource);
   gve->priv->gnl_video_filesources =
       g_list_append (gve->priv->gnl_video_filesources, gnl_filesource);
 
   /* Audio */
-  if (hasAudio && rate == 1) {
-    element_name =
-        g_strdup_printf ("gnlaudiofilesource%d", gve->priv->segments);
-    gnl_filesource = gst_element_factory_make ("gnlfilesource", element_name);
-    g_object_set (G_OBJECT (gnl_filesource), "location", file, NULL);
-  } else {
-    /* If the file doesn't contain audio, something must be playing */
-    /* We use an audiotestsrc mutted and with a low priority */
-    element_name =
-        g_strdup_printf ("gnlaudiofakesource%d", gve->priv->segments);
-    gnl_filesource = gst_element_factory_make ("gnlsource", element_name);
-    element_name = g_strdup_printf ("audiotestsource%d", gve->priv->segments);
-    audiotestsrc = gst_element_factory_make ("audiotestsrc", element_name);
-    g_object_set (G_OBJECT (audiotestsrc), "volume", (double) 0, NULL);
-    gst_bin_add (GST_BIN (gnl_filesource), audiotestsrc);
+  if (gve->priv->audio_enabled) {
+    if (hasAudio && rate == 1) {
+      element_name =
+          g_strdup_printf ("gnlaudiofilesource%d", gve->priv->segments);
+      gnl_filesource = gst_element_factory_make ("gnlfilesource", element_name);
+      g_object_set (G_OBJECT (gnl_filesource), "location", file, NULL);
+    } else {
+      /* If the file doesn't contain audio, something must be playing */
+      /* We use an audiotestsrc mutted and with a low priority */
+      element_name =
+          g_strdup_printf ("gnlaudiofakesource%d", gve->priv->segments);
+      gnl_filesource = gst_element_factory_make ("gnlsource", element_name);
+      element_name = g_strdup_printf ("audiotestsource%d", gve->priv->segments);
+      audiotestsrc = gst_element_factory_make ("audiotestsrc", element_name);
+      g_object_set (G_OBJECT (audiotestsrc), "volume", (double) 0, NULL);
+      gst_bin_add (GST_BIN (gnl_filesource), audiotestsrc);
+    }
+    filter = gst_caps_from_string ("audio/x-raw-float;audio/x-raw-int");
+    g_object_set (G_OBJECT (gnl_filesource),
+        "media-start", start,
+        "media-duration", duration,
+        "start", gve->priv->duration,
+        "duration", final_duration, "caps", filter, NULL);
+    gst_bin_add (GST_BIN (gve->priv->gnl_audio_composition), gnl_filesource);
+    gve->priv->gnl_audio_filesources =
+        g_list_append (gve->priv->gnl_audio_filesources, gnl_filesource);
   }
-  filter = gst_caps_from_string ("audio/x-raw-float;audio/x-raw-int");
-  g_object_set (G_OBJECT (gnl_filesource),
-      "media-start", start,
-      "media-duration", duration,
-      "start", gve->priv->duration,
-      "duration", final_duration, "caps", filter, NULL);
-  gst_bin_add (GST_BIN (gve->priv->gnl_audio_composition), gnl_filesource);
-  gve->priv->gnl_audio_filesources =
-      g_list_append (gve->priv->gnl_audio_filesources, gnl_filesource);
 
   GST_INFO ("New segment: start={%" GST_TIME_FORMAT "} duration={%"
       GST_TIME_FORMAT "} ", GST_TIME_ARGS (gve->priv->duration),
@@ -979,24 +731,26 @@ gst_video_editor_add_image_segment (GstVideoEditor * gve, gchar * file,
       g_list_append (gve->priv->gnl_video_filesources, gnl_filesource);
 
   /* Audio */
-  element_name =
-      g_strdup_printf ("gnlaudiofakesource%d", gve->priv->segments);
-  gnl_filesource = gst_element_factory_make ("gnlsource", element_name);
-  g_free (element_name);
-  element_name = g_strdup_printf ("audiotestsource%d", gve->priv->segments);
-  audiotestsrc = gst_element_factory_make ("audiotestsrc", element_name);
-  g_free (element_name);
-  g_object_set (G_OBJECT (audiotestsrc), "volume", (double) 0, NULL);
-  gst_bin_add (GST_BIN (gnl_filesource), audiotestsrc);
-  filter = gst_caps_from_string ("audio/x-raw-float;audio/x-raw-int");
-  g_object_set (G_OBJECT (gnl_filesource),
-      "media-start", start,
-      "media-duration", duration,
-      "start", gve->priv->duration,
-      "duration", duration, "caps", filter, NULL);
-  gst_bin_add (GST_BIN (gve->priv->gnl_audio_composition), gnl_filesource);
-  gve->priv->gnl_audio_filesources =
-      g_list_append (gve->priv->gnl_audio_filesources, gnl_filesource);
+  if (gve->priv->audio_enabled) {
+    element_name =
+        g_strdup_printf ("gnlaudiofakesource%d", gve->priv->segments);
+    gnl_filesource = gst_element_factory_make ("gnlsource", element_name);
+    g_free (element_name);
+    element_name = g_strdup_printf ("audiotestsource%d", gve->priv->segments);
+    audiotestsrc = gst_element_factory_make ("audiotestsrc", element_name);
+    g_free (element_name);
+    g_object_set (G_OBJECT (audiotestsrc), "volume", (double) 0, NULL);
+    gst_bin_add (GST_BIN (gnl_filesource), audiotestsrc);
+    filter = gst_caps_from_string ("audio/x-raw-float;audio/x-raw-int");
+    g_object_set (G_OBJECT (gnl_filesource),
+        "media-start", start,
+        "media-duration", duration,
+        "start", gve->priv->duration,
+        "duration", duration, "caps", filter, NULL);
+    gst_bin_add (GST_BIN (gve->priv->gnl_audio_composition), gnl_filesource);
+    gve->priv->gnl_audio_filesources =
+        g_list_append (gve->priv->gnl_audio_filesources, gnl_filesource);
+  }
 
   GST_INFO ("New segment: start={%" GST_TIME_FORMAT "} duration={%"
       GST_TIME_FORMAT "} ", GST_TIME_ARGS (gve->priv->duration),
@@ -1054,338 +808,50 @@ gst_video_editor_clear_segments_list (GstVideoEditor * gve)
   gve->priv->active_segment = 0;
 }
 
-
 void
-gst_video_editor_set_video_encoder (GstVideoEditor * gve, gchar ** err,
-    VideoEncoderType codec)
+gst_video_editor_start (GstVideoEditor * gve)
 {
-  GstElement *encoder = NULL;
-  GstState cur_state;
-  GstPad *srcpad;
-  GstPad *oldsrcpad;
-  gchar *encoder_name = "";
-  gchar *error;
+  GError *error = NULL;
 
   g_return_if_fail (GST_IS_VIDEO_EDITOR (gve));
 
-  gst_element_get_state (gve->priv->main_pipeline, &cur_state, NULL, 0);
-
-  if (cur_state > GST_STATE_READY)
-    goto wrong_state;
-
-  switch (codec) {
-    case VIDEO_ENCODER_H264:
-      encoder_name = "x264enc";
-      encoder = gst_element_factory_make (encoder_name, encoder_name);
-      g_object_set (G_OBJECT (encoder), "pass", 17, NULL);       //Variable Bitrate-Pass 1
-      g_object_set (G_OBJECT (encoder), "speed-preset", 4, NULL);//"Faster" preset
-      break;
-    case VIDEO_ENCODER_XVID:
-      encoder_name = "xvidenc";
-      encoder = gst_element_factory_make (encoder_name, encoder_name);
-      g_object_set (G_OBJECT (encoder), "pass", 1, NULL);       //Variable Bitrate-Pass 1
-      break;
-    case VIDEO_ENCODER_MPEG4:
-      encoder_name = "ffenc_mpeg4";
-      encoder = gst_element_factory_make (encoder_name, encoder_name);
-      g_object_set (G_OBJECT (encoder), "pass", 512, NULL);     //Variable Bitrate-Pass 1
-      break;
-    case VIDEO_ENCODER_MPEG2:
-      encoder_name = "mpeg2enc";
-      encoder = gst_element_factory_make (encoder_name, encoder_name);
-      g_object_set (G_OBJECT (encoder), "format", 9, NULL);     //DVD compilant
-      g_object_set (G_OBJECT (encoder), "framerate", 3, NULL);  //25 FPS (PAL/SECAM)    
-      break;
-    case VIDEO_ENCODER_THEORA:
-      encoder_name = "theoraenc";
-      encoder = gst_element_factory_make (encoder_name, encoder_name);
-      break;
-    case VIDEO_ENCODER_VP8:
-      encoder_name = "vp8enc";
-      encoder = gst_element_factory_make (encoder_name, encoder_name);
-      g_object_set (G_OBJECT (encoder), "speed", 1, NULL);
-      g_object_set (G_OBJECT (encoder), "threads", 4, NULL);
-      break;
-  }
-
-  if (!encoder)
-    goto no_encoder;
-
-  GST_INFO_OBJECT(gve, "Changing video encoder: %s", encoder_name);
-
-  if (!g_strcmp0
-      (gst_element_get_name (gve->priv->video_encoder), encoder_name))
-    goto same_encoder;
-
-  gve->priv->video_encoder_type = codec;
-
-  /*Remove old encoder element */
-  gst_element_unlink (gve->priv->queue, gve->priv->video_encoder);
-  gst_element_unlink (gve->priv->vencode_bin, gve->priv->muxer);
-  gst_element_set_state (gve->priv->video_encoder, GST_STATE_NULL);
-  gst_bin_remove (GST_BIN (gve->priv->vencode_bin), gve->priv->video_encoder);
-
-  /*Add new encoder element */
-  gve->priv->video_encoder = encoder;
-  if (codec == VIDEO_ENCODER_THEORA || codec == VIDEO_ENCODER_H264)
-    g_object_set (G_OBJECT (gve->priv->video_encoder), "bitrate",
-        gve->priv->video_bitrate, NULL);
-  else
-    g_object_set (G_OBJECT (gve->priv->video_encoder), "bitrate",
-        gve->priv->video_bitrate * 1000, NULL);
-  
-  /*Add first to the encoder bin */
-  gst_bin_add (GST_BIN (gve->priv->vencode_bin), gve->priv->video_encoder);
-  gst_element_link (gve->priv->queue, gve->priv->video_encoder);
-  /*Remove old encoder bin's src pad */
-  oldsrcpad = gst_element_get_static_pad (gve->priv->vencode_bin, "src");
-  gst_pad_set_active (oldsrcpad, FALSE);
-  gst_element_remove_pad (gve->priv->vencode_bin, oldsrcpad);
-  /*Create new encoder bin's src pad */
-  srcpad = gst_element_get_static_pad (gve->priv->video_encoder, "src");
-  gst_pad_set_active (srcpad, TRUE);
-  gst_element_add_pad (gve->priv->vencode_bin,
-      gst_ghost_pad_new ("src", srcpad));
-  gst_element_link (gve->priv->vencode_bin, gve->priv->muxer);
-
-  gve_rewrite_headers (gve);
-  return;
+  GST_INFO_OBJECT(gve, "Starting");
 
-wrong_state:
-  {
-    GST_WARNING
-        ("The video encoder cannot be changed for a state <= GST_STATE_READY");
-    return;
-  }
-no_encoder:
-  {
-    error =
-        g_strdup_printf
-        ("The %s encoder element is not avalaible. Check your GStreamer installation",
-        encoder_name);
-    GST_ERROR (error);
-    *err = g_strdup (error);
-    g_free (error);
-    return;
-  }
-same_encoder:
-  {
-    GST_WARNING
-        ("The video encoder is not changed because it is already in use.");
-    gst_object_unref (encoder);
+  /* Create elements */
+  gve->priv->muxer = lgm_create_muxer (gve->priv->muxer_type, GVE_ERROR,
+      &error);
+  if (error) {
+    g_signal_emit (gve, gve_signals[SIGNAL_ERROR], 0, error->message);
+    g_error_free (error);
     return;
   }
-}
-
-void
-gst_video_editor_set_audio_encoder (GstVideoEditor * gve, gchar ** err,
-    AudioEncoderType codec)
-{
-  GstElement *encoder = NULL;
-  GstState cur_state;
-  GstPad *srcpad;
-  GstPad *oldsrcpad;
-  gchar *encoder_name = "";
-  gchar *error;
+  gve->priv->file_sink = gst_element_factory_make ("filesink", "filesink");
+  gve_create_video_encode_bin (gve);
 
-  g_return_if_fail (GST_IS_VIDEO_EDITOR (gve));
+  /* Set elements properties */
+  g_object_set (G_OBJECT (gve->priv->file_sink), "location",
+      gve->priv->output_file, NULL);
 
-  gst_element_get_state (gve->priv->main_pipeline, &cur_state, NULL, 0);
+  /* Link elements */
+  gst_bin_add_many (GST_BIN (gve->priv->main_pipeline),
+      gve->priv->gnl_video_composition,
+      gve->priv->vencode_bin,
+      gve->priv->muxer, gve->priv->file_sink, NULL);
 
-  if (cur_state > GST_STATE_READY)
-    goto wrong_state;
+  gst_element_link_many (gve->priv->vencode_bin,
+      gve->priv->muxer, gve->priv->file_sink, NULL);
 
-  switch (codec) {
-    case AUDIO_ENCODER_AAC:
-      encoder_name = "faac";
-      encoder = gst_element_factory_make (encoder_name, encoder_name);
-      g_object_set (G_OBJECT (gve->priv->audiocapsfilter), "caps",
-          gst_caps_from_string (FAAC_CAPS), NULL);
-      break;
-    case AUDIO_ENCODER_MP3:
-      encoder_name = "lame";
-      encoder = gst_element_factory_make (encoder_name, encoder_name);
-      g_object_set (G_OBJECT (encoder), "vbr", 4, NULL);        //Variable Bitrate
-      g_object_set (G_OBJECT (gve->priv->audiocapsfilter), "caps",
-          gst_caps_from_string (LAME_CAPS), NULL);
-      break;
-    case AUDIO_ENCODER_VORBIS:
-      encoder_name = "vorbisenc";
-      encoder = gst_element_factory_make (encoder_name, encoder_name);
-      g_object_set (G_OBJECT (gve->priv->audiocapsfilter), "caps",
-          gst_caps_from_string (VORBIS_CAPS), NULL);
-      break;
-    default:
-      gst_video_editor_set_enable_audio (gve, FALSE);
-      break;
-  }
-  if (!encoder)
-    goto no_encoder;
-
-  GST_INFO_OBJECT(gve, "Changing audio encoder: %s", encoder_name);
-
-  if (!g_strcmp0 (gst_element_get_name (gve->priv->audioencoder), encoder_name))
-    goto same_encoder;
-
-  /*Remove old encoder element */
-  gst_element_unlink (gve->priv->audioqueue, gve->priv->audioencoder);
-  if (gve->priv->audio_enabled)
-    gst_element_unlink (gve->priv->aencode_bin, gve->priv->muxer);
-  gst_element_set_state (gve->priv->audioencoder, GST_STATE_NULL);
-  gst_bin_remove (GST_BIN (gve->priv->aencode_bin), gve->priv->audioencoder);
-
-  /*Add new encoder element */
-  gve->priv->audioencoder = encoder;
-  if (codec == AUDIO_ENCODER_MP3)
-    g_object_set (G_OBJECT (gve->priv->audioencoder), "bitrate",
-        gve->priv->audio_bitrate / 1000, NULL);
-  else
-    g_object_set (G_OBJECT (gve->priv->audioencoder), "bitrate",
-        gve->priv->audio_bitrate, NULL);
-  /*Add first to the encoder bin */
-  gst_bin_add (GST_BIN (gve->priv->aencode_bin), gve->priv->audioencoder);
-  gst_element_link (gve->priv->audioqueue, gve->priv->audioencoder);
-  /*Remove old encoder bin's src pad */
-  oldsrcpad = gst_element_get_static_pad (gve->priv->aencode_bin, "src");
-  gst_pad_set_active (oldsrcpad, FALSE);
-  gst_element_remove_pad (gve->priv->aencode_bin, oldsrcpad);
-  /*Create new encoder bin's src pad */
-  srcpad = gst_element_get_static_pad (gve->priv->audioencoder, "src");
-  gst_pad_set_active (srcpad, TRUE);
-  gst_element_add_pad (gve->priv->aencode_bin,
-      gst_ghost_pad_new ("src", srcpad));
-  if (gve->priv->audio_enabled)
+  if (gve->priv->audio_enabled) {
+    gst_bin_add (GST_BIN (gve->priv->main_pipeline),
+      gve->priv->gnl_audio_composition);
+    gve_create_audio_encode_bin (gve);
+    gst_bin_add (GST_BIN (gve->priv->main_pipeline),
+        gve->priv->aencode_bin);
     gst_element_link (gve->priv->aencode_bin, gve->priv->muxer);
-  gve_rewrite_headers (gve);
-  return;
-
-wrong_state:
-  {
-    GST_WARNING
-        ("The audio encoder cannot be changed for a state <= GST_STATE_READY");
-    return;
-  }
-no_encoder:
-  {
-    error =
-        g_strdup_printf
-        ("The %s encoder element is not avalaible. Check your GStreamer installation",
-        encoder_name);
-    GST_ERROR (error);
-    *err = g_strdup (error);
-    g_free (error);
-    return;
-  }
-same_encoder:
-  {
-    GST_WARNING
-        ("The audio encoder is not changed because it is already in use.");
-    gst_object_unref (encoder);
-    return;
+    g_print ("ADDing audio encode bin and linking to muxer\n");
   }
-}
-
-void
-gst_video_editor_set_video_muxer (GstVideoEditor * gve, gchar ** err,
-    VideoMuxerType muxerType)
-{
-  GstElement *muxer = NULL;
-  GstState cur_state;
-  gchar *muxer_name = "";
-  gchar *error;
-
-  g_return_if_fail (GST_IS_VIDEO_EDITOR (gve));
-
-  gst_element_get_state (gve->priv->main_pipeline, &cur_state, NULL, 0);
-
-  if (cur_state > GST_STATE_READY)
-    goto wrong_state;
 
-  switch (muxerType) {
-    case VIDEO_MUXER_MATROSKA:
-      muxer_name = "matroskamux";
-      muxer = gst_element_factory_make ("matroskamux", muxer_name);
-      break;
-    case VIDEO_MUXER_AVI:
-      muxer_name = "avimux";
-      muxer = gst_element_factory_make ("avimux", muxer_name);
-      break;
-    case VIDEO_MUXER_OGG:
-      muxer_name = "oggmux";
-      muxer = gst_element_factory_make ("oggmux", muxer_name);
-      break;
-    case VIDEO_MUXER_MP4:
-      muxer_name = "qtmux";
-      muxer = gst_element_factory_make ("qtmux", muxer_name);
-      g_object_set (muxer, "faststart", TRUE, NULL);
-      break;
-    case VIDEO_MUXER_MPEG_PS:
-      muxer_name = "ffmux_dvd";
-      //We don't want to mux anything yet as ffmux_dvd is buggy
-      //FIXME: Until we don't have audio save the mpeg-ps stream without mux.
-      muxer = gst_element_factory_make ("ffmux_dvd", muxer_name);
-      break;
-    case VIDEO_MUXER_WEBM:
-      muxer_name = "webmmux";
-      muxer = gst_element_factory_make ("webmmux", muxer_name);
-      break;
-  }
-
-  if (!muxer)
-    goto no_muxer;
-
-  GST_INFO_OBJECT(gve, "Changing muxer: %s", muxer_name);
-
-  if (!g_strcmp0 (gst_element_get_name (gve->priv->muxer), muxer_name))
-    goto same_muxer;
-
-  gst_element_unlink (gve->priv->vencode_bin, gve->priv->muxer);
-  if (gve->priv->audio_enabled)
-    gst_element_unlink (gve->priv->aencode_bin, gve->priv->muxer);
-  gst_element_unlink (gve->priv->muxer, gve->priv->file_sink);
-  gst_element_set_state (gve->priv->muxer, GST_STATE_NULL);
-  gst_bin_remove (GST_BIN (gve->priv->main_pipeline), gve->priv->muxer);
-  gst_bin_add (GST_BIN (gve->priv->main_pipeline), muxer);
-  gst_element_link_many (gve->priv->vencode_bin, muxer,
-      gve->priv->file_sink, NULL);
-  if (gve->priv->audio_enabled)
-    gst_element_link (gve->priv->aencode_bin, muxer);
-  gve->priv->muxer = muxer;
-  gve_rewrite_headers (gve);
-  return;
-
-wrong_state:
-  {
-    GST_WARNING
-        ("The video muxer cannot be changed for a state <= GST_STATE_READY");
-    return;
-  }
-no_muxer:
-  {
-    error =
-        g_strdup_printf
-        ("The %s muxer element is not avalaible. Check your GStreamer installation",
-        muxer_name);
-    GST_ERROR (error);
-    *err = g_strdup (error);
-    g_free (error);
-    return;
-  }
-same_muxer:
-  {
-    GST_WARNING
-        ("Not changing the video muxer as the new one is the same in use.");
-    gst_object_unref (muxer);
-    return;
-  }
-}
-
-void
-gst_video_editor_start (GstVideoEditor * gve)
-{
-  g_return_if_fail (GST_IS_VIDEO_EDITOR (gve));
-
-  GST_INFO_OBJECT(gve, "Starting");
+  gve_set_overlay_title (gve, (gchar *) g_list_nth_data (gve->priv->titles, 0));
   gst_element_set_state (gve->priv->main_pipeline, GST_STATE_PLAYING);
   g_signal_emit (gve, gve_signals[SIGNAL_PERCENT_COMPLETED], 0, (gfloat) 0);
 }
@@ -1410,6 +876,28 @@ gst_video_editor_init_backend (int *argc, char ***argv)
   gst_init (argc, argv);
 }
 
+void
+gst_video_editor_set_encoding_format (GstVideoEditor * gve,
+    gchar *output_file,
+    VideoEncoderType video_codec, AudioEncoderType audio_codec,
+    VideoMuxerType muxer, guint video_quality, guint audio_quality,
+    guint width, guint height, guint fps_n, guint fps_d,
+    gboolean enable_audio, gboolean enable_title)
+{
+  gve->priv->output_file = g_strdup (output_file);
+  gve->priv->video_encoder_type = video_codec;
+  gve->priv->audio_encoder_type = audio_codec;
+  gve->priv->muxer_type = muxer;
+  gve->priv->video_quality = video_quality;
+  gve->priv->audio_quality = audio_quality;
+  gve->priv->width = width;
+  gve->priv->height = height;
+  gve->priv->fps_n = fps_n;
+  gve->priv->fps_d = fps_d;
+  gve->priv->audio_enabled = enable_audio;
+  gve->priv->title_enabled = enable_title;
+}
+
 GstVideoEditor *
 gst_video_editor_new (GError ** err)
 {
@@ -1420,7 +908,7 @@ gst_video_editor_new (GError ** err)
   gve->priv->main_pipeline = gst_pipeline_new ("main_pipeline");
 
   if (!gve->priv->main_pipeline) {
-    g_set_error (err, GVC_ERROR, GST_ERROR_PLUGIN_LOAD,
+    g_set_error (err, GVE_ERROR, GST_ERROR_PLUGIN_LOAD,
         ("Failed to create a GStreamer Bin. "
             "Please check your GStreamer installation."));
     g_object_ref_sink (gve);
@@ -1434,7 +922,7 @@ gst_video_editor_new (GError ** err)
   gve->priv->gnl_audio_composition =
       gst_element_factory_make ("gnlcomposition", "gnl-audio-composition");
   if (!gve->priv->gnl_video_composition || !gve->priv->gnl_audio_composition) {
-    g_set_error (err, GVC_ERROR, GST_ERROR_PLUGIN_LOAD,
+    g_set_error (err, GVE_ERROR, GST_ERROR_PLUGIN_LOAD,
         ("Failed to create a Gnonlin element. "
             "Please check your GStreamer installation."));
     g_object_ref_sink (gve);
@@ -1442,27 +930,6 @@ gst_video_editor_new (GError ** err)
     return NULL;
   }
 
-  gve->priv->muxer =
-      gst_element_factory_make (DEFAULT_VIDEO_MUXER, "videomuxer");
-  gve->priv->file_sink = gst_element_factory_make ("filesink", "filesink");
-  gve_create_video_encode_bin (gve);
-  gve_create_audio_encode_bin (gve);
-
-  /* Set elements properties */
-  g_object_set (G_OBJECT (gve->priv->file_sink), "location",
-      gve->priv->output_file, NULL);
-
-  /* Link elements */
-  gst_bin_add_many (GST_BIN (gve->priv->main_pipeline),
-      gve->priv->gnl_video_composition,
-      gve->priv->gnl_audio_composition,
-      gve->priv->vencode_bin,
-      gve->priv->aencode_bin, gve->priv->muxer, gve->priv->file_sink, NULL);
-
-  gst_element_link_many (gve->priv->vencode_bin,
-      gve->priv->muxer, gve->priv->file_sink, NULL);
-  gst_element_link (gve->priv->aencode_bin, gve->priv->muxer);
-
   /*Connect bus signals */
   /*Wait for a "new-decoded-pad" message to link the composition with
      the encoder tail */
@@ -1475,8 +942,5 @@ gst_video_editor_new (GError ** err)
   gst_bus_add_signal_watch (gve->priv->bus);
   gve->priv->sig_bus_async = g_signal_connect (gve->priv->bus, "message",
       G_CALLBACK (gve_bus_message_cb), gve);
-
-  gst_element_set_state (gve->priv->main_pipeline, GST_STATE_READY);
-
   return gve;
 }
diff --git a/libcesarplayer/gst-video-editor.h b/libcesarplayer/gst-video-editor.h
index e8f32f9..59c3800 100644
--- a/libcesarplayer/gst-video-editor.h
+++ b/libcesarplayer/gst-video-editor.h
@@ -43,7 +43,8 @@ G_BEGIN_DECLS
 #define GST_IS_VIDEO_EDITOR(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_VIDEO_EDITOR))
 #define GST_IS_VIDEO_EDITOR_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_VIDEO_EDITOR))
 #define GST_VIDEO_EDITOR_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_VIDEO_EDITOR, 
GstVideoEditorClass))
-#define GVC_ERROR gst_video_editor_error_quark ()
+#define GVE_ERROR gst_video_editor_error_quark ()
+
 typedef struct _GstVideoEditorClass GstVideoEditorClass;
 typedef struct _GstVideoEditor GstVideoEditor;
 typedef struct GstVideoEditorPrivate GstVideoEditorPrivate;
@@ -70,12 +71,20 @@ EXPORT void gst_video_editor_init_backend (int *argc, char ***argv);
 EXPORT GstVideoEditor *gst_video_editor_new (GError ** err);
 EXPORT void gst_video_editor_start (GstVideoEditor * gve);
 EXPORT void gst_video_editor_cancel (GstVideoEditor * gve);
-EXPORT void gst_video_editor_set_video_encoder (GstVideoEditor * gve,
-    gchar ** err, VideoEncoderType codec);
-EXPORT void gst_video_editor_set_audio_encoder (GstVideoEditor * gve,
-    gchar ** err, AudioEncoderType codec);
-EXPORT void gst_video_editor_set_video_muxer (GstVideoEditor * gve,
-    gchar ** err, VideoMuxerType codec);
+EXPORT void gst_video_editor_set_encoding_format              (GstVideoEditor * gve,
+                                                               gchar *output_file,
+                                                               VideoEncoderType video_codec,
+                                                               AudioEncoderType audio_codec,
+                                                               VideoMuxerType muxer,
+                                                               guint video_quality,
+                                                               guint audio_quality,
+                                                               guint height,
+                                                               guint width,
+                                                               guint fps_n,
+                                                               guint fps_d,
+                                                               gboolean enable_audio,
+                                                               gboolean enable_title
+                                                               );
 EXPORT void gst_video_editor_clear_segments_list (GstVideoEditor * gve);
 EXPORT void gst_video_editor_add_segment (GstVideoEditor * gve,
     gchar * file, gint64 start,
diff --git a/libcesarplayer/test-editor.c b/libcesarplayer/test-editor.c
index 9bfa682..fb6d1dc 100644
--- a/libcesarplayer/test-editor.c
+++ b/libcesarplayer/test-editor.c
@@ -45,6 +45,7 @@ error_cb (GstVideoEditor *remuxer, gchar *error, GstVideoEditor *editor)
 {
     g_print("ERROR: %s\n", error);
     g_main_loop_quit (loop);
+    return FALSE;
 }
 
 int
@@ -79,19 +80,9 @@ main (int argc, char *argv[])
   }
 
   editor = gst_video_editor_new (NULL);
-  gst_video_editor_set_audio_encoder (editor, &err, audio_encoder);
-  if (err != NULL)
-    goto error;
-  gst_video_editor_set_video_encoder (editor, &err, video_encoder);
-  if (err != NULL)
-    goto error;
-  g_object_set (editor, "output_file", output_file,
-      "width", 320, "height", 240, "enable-audio", FALSE,
-      "enable-title", TRUE, "video-bitrate", 1000, "audio-bitrate", 200000,
-      NULL);
-  gst_video_editor_set_video_muxer (editor, &err, video_muxer);
-  if (err != NULL)
-    goto error;
+  gst_video_editor_set_encoding_format (editor, output_file, video_encoder,
+      audio_encoder, video_muxer, 500, 128, 240, 180, 25, 1, TRUE, TRUE);
+
   gst_video_editor_add_segment (editor, input_file, start, stop,
       (gdouble) 1, "Test", TRUE);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]