summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordi Mas <jordimash@gmail.com>2009-03-05 08:52:11 +0100
committerEdward Hervey <bilboed@bilboed.com>2009-03-05 08:52:11 +0100
commitc7458545f301554d14cbdc04b6b1a216b0719a81 (patch)
treedd21f4cdd1c37ca84ee2ecce0c615cfb7d20d540
parent8dcbe4f7e866258483639e9153936bcaf7b81bf0 (diff)
downloadgst-libav-c7458545f301554d14cbdc04b6b1a216b0719a81.tar.gz
gstffmpegmux: Expose the 'preload' and 'maxdelay' properties, add dvd mux mapping.
Fixes #570975
-rw-r--r--ext/ffmpeg/gstffmpegcodecmap.c11
-rw-r--r--ext/ffmpeg/gstffmpegmux.c74
2 files changed, 85 insertions, 0 deletions
diff --git a/ext/ffmpeg/gstffmpegcodecmap.c b/ext/ffmpeg/gstffmpegcodecmap.c
index ce608f9..7717ef1 100644
--- a/ext/ffmpeg/gstffmpegcodecmap.c
+++ b/ext/ffmpeg/gstffmpegcodecmap.c
@@ -2385,6 +2385,17 @@ gst_ffmpeg_formatid_get_codecids (const gchar * format_name,
*video_codec_list = mpeg_video_list;
*audio_codec_list = mpeg_audio_list;
+ } else if (!strcmp (format_name, "dvd")) {
+ static enum CodecID mpeg_video_list[] = { CODEC_ID_MPEG2VIDEO,
+ CODEC_ID_NONE
+ };
+ static enum CodecID mpeg_audio_list[] = { CODEC_ID_MP2,
+ CODEC_ID_MP3,
+ CODEC_ID_NONE
+ };
+
+ *video_codec_list = mpeg_video_list;
+ *audio_codec_list = mpeg_audio_list;
} else if (!strcmp (format_name, "mpegts")) {
static enum CodecID mpegts_video_list[] = { CODEC_ID_MPEG1VIDEO,
CODEC_ID_MPEG2VIDEO,
diff --git a/ext/ffmpeg/gstffmpegmux.c b/ext/ffmpeg/gstffmpegmux.c
index f68288c..9b8ce73 100644
--- a/ext/ffmpeg/gstffmpegmux.c
+++ b/ext/ffmpeg/gstffmpegmux.c
@@ -60,6 +60,8 @@ struct _GstFFMpegMux
/*< private > */
/* event_function is the collectpads default eventfunction */
GstPadEventFunction event_function;
+ int preload;
+ int max_delay;
};
typedef struct _GstFFMpegMuxClassParams
@@ -100,6 +102,13 @@ enum
/* FILL ME */
};
+enum
+{
+ PROP_0,
+ PROP_PRELOAD,
+ PROP_MAXDELAY
+};
+
/* A number of function prototypes are given so we can refer to them later. */
static void gst_ffmpegmux_class_init (GstFFMpegMuxClass * klass);
static void gst_ffmpegmux_base_init (gpointer g_class);
@@ -118,6 +127,11 @@ static gboolean gst_ffmpegmux_sink_event (GstPad * pad, GstEvent * event);
static GstStateChangeReturn gst_ffmpegmux_change_state (GstElement * element,
GstStateChange transition);
+static void gst_ffmpegmux_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec);
+static void gst_ffmpegmux_get_property (GObject * object, guint prop_id,
+ GValue * value, GParamSpec * pspec);
+
#define GST_FFMUX_PARAMS_QDATA g_quark_from_static_string("ffmux-params")
static GstElementClass *parent_class = NULL;
@@ -182,6 +196,19 @@ gst_ffmpegmux_class_init (GstFFMpegMuxClass * klass)
parent_class = g_type_class_peek_parent (klass);
+ gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_ffmpegmux_set_property);
+ gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_ffmpegmux_get_property);
+
+ g_object_class_install_property (gobject_class, PROP_PRELOAD,
+ g_param_spec_int ("preload", "preload",
+ "Set the initial demux-decode delay (in microseconds)", 0, G_MAXINT,
+ 0, G_PARAM_READWRITE));
+
+ g_object_class_install_property (gobject_class, PROP_MAXDELAY,
+ g_param_spec_int ("maxdelay", "maxdelay",
+ "Set the maximum demux-decode delay (in microseconds)", 0, G_MAXINT,
+ 0, G_PARAM_READWRITE));
+
gstelement_class->request_new_pad = gst_ffmpegmux_request_new_pad;
gstelement_class->change_state = gst_ffmpegmux_change_state;
gobject_class->finalize = gst_ffmpegmux_finalize;
@@ -211,9 +238,54 @@ gst_ffmpegmux_init (GstFFMpegMux * ffmpegmux, GstFFMpegMuxClass * g_class)
ffmpegmux->videopads = 0;
ffmpegmux->audiopads = 0;
+ ffmpegmux->preload = 0;
+ ffmpegmux->max_delay = 0;
}
static void
+gst_ffmpegmux_set_property (GObject * object, guint prop_id,
+ const GValue * value, GParamSpec * pspec)
+{
+ GstFFMpegMux *src;
+
+ src = (GstFFMpegMux *) object;
+
+ switch (prop_id) {
+ case PROP_PRELOAD:
+ src->preload = g_value_get_int (value);
+ break;
+ case PROP_MAXDELAY:
+ src->max_delay = g_value_get_int (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gst_ffmpegmux_get_property (GObject * object, guint prop_id, GValue * value,
+ GParamSpec * pspec)
+{
+ GstFFMpegMux *src;
+
+ src = (GstFFMpegMux *) object;
+
+ switch (prop_id) {
+ case PROP_PRELOAD:
+ g_value_set_int (value, src->preload);
+ break;
+ case PROP_MAXDELAY:
+ g_value_set_int (value, src->max_delay);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+
+static void
gst_ffmpegmux_finalize (GObject * object)
{
GstFFMpegMux *ffmpegmux = (GstFFMpegMux *) object;
@@ -309,6 +381,8 @@ gst_ffmpegmux_setcaps (GstPad * pad, GstCaps * caps)
collect_pad = (GstFFMpegMuxPad *) gst_pad_get_element_private (pad);
st = ffmpegmux->context->streams[collect_pad->padnum];
+ ffmpegmux->context->preload = ffmpegmux->preload;
+ ffmpegmux->context->max_delay = ffmpegmux->max_delay;
/* for the format-specific guesses, we'll go to
* our famous codec mapper */