[longomatch] video-editor: use a simplar API similar to the video encoder
- From: Andoni Morales Alastruey <amorales src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [longomatch] video-editor: use a simplar API similar to the video encoder
- Date: Fri, 16 Aug 2013 16:22:39 +0000 (UTC)
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]