summaryrefslogtreecommitdiffstats
path: root/gst
diff options
context:
space:
mode:
authorRonald S. Bultje <rbultje@ronald.bitfreak.net>2003-07-06 20:49:52 +0000
committerRonald S. Bultje <rbultje@ronald.bitfreak.net>2003-07-06 20:49:52 +0000
commit292fec2a0bd1f221a46ad69c5100995d04c01057 (patch)
tree658db299e0e03b2454ff840730569d79539e67c4 /gst
parenta8183e9a3fa87cf4247c7df16207f440ea4069c0 (diff)
New mimetypes gone into effect today - this commit changes all old mimetypes over to the new mimetypes spec as descri...
Original commit message from CVS: New mimetypes gone into effect today - this commit changes all old mimetypes over to the new mimetypes spec as described in the previous commit's document. Note: some plugins will break, some pipelines will break, expect HEAD to be broken or at least not 100% working for a few days, but don't forget to report bugs
Diffstat (limited to 'gst')
-rw-r--r--gst/audiofx/audiowsincband.c2
-rw-r--r--gst/audiofx/audiowsinclimit.c2
-rw-r--r--gst/auparse/gstauparse.c43
-rw-r--r--gst/avi/gstavidemux.c846
-rw-r--r--gst/avi/gstavimux.c406
-rw-r--r--gst/cutter/gstcutter.c30
-rw-r--r--gst/effectv/gstaging.c2
-rw-r--r--gst/effectv/gstdice.c2
-rw-r--r--gst/effectv/gstedge.c2
-rw-r--r--gst/effectv/gsteffectv.c29
-rw-r--r--gst/effectv/gstquark.c2
-rw-r--r--gst/effectv/gstrev.c2
-rw-r--r--gst/effectv/gstshagadelic.c2
-rw-r--r--gst/effectv/gstvertigo.c2
-rw-r--r--gst/effectv/gstwarp.c2
-rw-r--r--gst/flx/gstflxdec.c41
-rw-r--r--gst/goom/gstgoom.c110
-rw-r--r--gst/law/alaw-decode.c4
-rw-r--r--gst/law/alaw-encode.c4
-rw-r--r--gst/law/alaw.c25
-rw-r--r--gst/law/mulaw-decode.c4
-rw-r--r--gst/law/mulaw-encode.c4
-rw-r--r--gst/law/mulaw.c26
-rw-r--r--gst/level/gstlevel.c23
-rw-r--r--gst/median/gstmedian.c19
-rw-r--r--gst/monoscope/gstmonoscope.c172
-rw-r--r--gst/qtdemux/qtdemux.c256
-rw-r--r--gst/rtp/gstrtpL16depay.c8
-rw-r--r--gst/rtp/gstrtpL16enc.c4
-rw-r--r--gst/rtp/gstrtpL16parse.c8
-rw-r--r--gst/rtp/gstrtpL16pay.c4
-rw-r--r--gst/smpte/gstsmpte.c44
-rw-r--r--gst/smpte/gstsmpte.h2
-rw-r--r--gst/videocrop/gstvideocrop.c142
-rw-r--r--gst/videoflip/gstvideoflip.c16
-rw-r--r--gst/videoflip/videoflip.c6
-rw-r--r--gst/wavenc/gstwavenc.c4
-rw-r--r--gst/wavparse/gstwavparse.c55
38 files changed, 1243 insertions, 1112 deletions
diff --git a/gst/audiofx/audiowsincband.c b/gst/audiofx/audiowsincband.c
index 0e57a747..68af7a28 100644
--- a/gst/audiofx/audiowsincband.c
+++ b/gst/audiofx/audiowsincband.c
@@ -194,7 +194,7 @@ gst_bpwsinc_sink_connect (GstPad * pad, GstCaps * caps)
if (!GST_CAPS_IS_FIXED (caps))
return GST_PAD_LINK_DELAYED;
- set_retval = gst_pad_try_set_caps (filter->srcpad, caps);
+ set_retval = gst_pad_try_set_caps (filter->srcpad, gst_caps_ref (caps));
if (set_retval > 0)
{
diff --git a/gst/audiofx/audiowsinclimit.c b/gst/audiofx/audiowsinclimit.c
index 64e104d6..54eb81d3 100644
--- a/gst/audiofx/audiowsinclimit.c
+++ b/gst/audiofx/audiowsinclimit.c
@@ -183,7 +183,7 @@ gst_lpwsinc_sink_connect (GstPad * pad, GstCaps * caps)
if (!GST_CAPS_IS_FIXED (caps))
return GST_PAD_LINK_DELAYED;
- set_retval = gst_pad_try_set_caps(filter->srcpad, caps);
+ set_retval = gst_pad_try_set_caps(filter->srcpad, gst_caps_ref (caps));
if (set_retval > 0)
{
diff --git a/gst/auparse/gstauparse.c b/gst/auparse/gstauparse.c
index d9eeb8e0..82f802f1 100644
--- a/gst/auparse/gstauparse.c
+++ b/gst/auparse/gstauparse.c
@@ -56,7 +56,7 @@ au_type_find (GstBuffer *buf, gpointer private)
/* typefactory for 'au' */
static GstTypeDefinition audefinition = {
"auparse_audio/au",
- "audio/au",
+ "audio/x-au",
".au",
au_type_find,
};
@@ -67,7 +67,7 @@ GST_PAD_TEMPLATE_FACTORY (sink_factory_templ,
GST_PAD_ALWAYS,
GST_CAPS_NEW (
"auparse_sink",
- "audio/au",
+ "audio/x-au",
NULL
)
)
@@ -79,10 +79,8 @@ GST_PAD_TEMPLATE_FACTORY (src_factory_templ,
GST_PAD_ALWAYS,
GST_CAPS_NEW (
"auparse_src",
- "audio/raw",
- "format", GST_PROPS_STRING ("int"),
- "law", GST_PROPS_INT_RANGE (0, 1),
- "endianness", GST_PROPS_INT (G_BYTE_ORDER),
+ "audio/x-raw-int",
+ "endianness", GST_PROPS_INT (G_BIG_ENDIAN),
"signed", GST_PROPS_LIST(
GST_PROPS_BOOLEAN (FALSE),
GST_PROPS_BOOLEAN (TRUE)
@@ -97,6 +95,12 @@ GST_PAD_TEMPLATE_FACTORY (src_factory_templ,
),
"rate", GST_PROPS_INT_RANGE (8000,48000),
"channels", GST_PROPS_INT_RANGE (1, 2)
+ ),
+ GST_CAPS_NEW (
+ "auparse_src_alaw",
+ "audio/x-alaw",
+ "rate", GST_PROPS_INT_RANGE (8000,48000),
+ "channels", GST_PROPS_INT_RANGE (1, 2)
)
)
@@ -250,7 +254,7 @@ gst_auparse_chain (GstPad *pad, GstBuffer *buf)
case 2:
law = 0;
depth = 8;
- sign = TRUE;
+ sign = FALSE;
break;
case 3:
law = 0;
@@ -262,16 +266,21 @@ gst_auparse_chain (GstPad *pad, GstBuffer *buf)
return;
}
- tempcaps = GST_CAPS_NEW ("auparse_src",
- "audio/raw",
- "format", GST_PROPS_STRING ("int"),
- "endianness", GST_PROPS_INT (G_BYTE_ORDER),
- "rate", GST_PROPS_INT (auparse->frequency),
- "channels", GST_PROPS_INT (auparse->channels),
- "law", GST_PROPS_INT (law),
- "depth", GST_PROPS_INT (depth),
- "width", GST_PROPS_INT (depth),
- "signed", GST_PROPS_BOOLEAN (sign));
+ if (law) {
+ tempcaps = GST_CAPS_NEW ("auparse_src",
+ "audio/x-alaw",
+ "rate", GST_PROPS_INT (auparse->frequency),
+ "channels", GST_PROPS_INT (auparse->channels));
+ } else {
+ tempcaps = GST_CAPS_NEW ("auparse_src",
+ "audio/x-raw-int",
+ "endianness", GST_PROPS_INT (G_BIG_ENDIAN),
+ "rate", GST_PROPS_INT (auparse->frequency),
+ "channels", GST_PROPS_INT (auparse->channels),
+ "depth", GST_PROPS_INT (depth),
+ "width", GST_PROPS_INT (depth),
+ "signed", GST_PROPS_BOOLEAN (sign));
+ }
if (gst_pad_try_set_caps (auparse->srcpad, tempcaps) <= 0) {
gst_buffer_unref (buf);
diff --git a/gst/avi/gstavidemux.c b/gst/avi/gstavidemux.c
index 77ff97f6..ad0b1ef3 100644
--- a/gst/avi/gstavidemux.c
+++ b/gst/avi/gstavidemux.c
@@ -68,138 +68,46 @@ GST_PAD_TEMPLATE_FACTORY (sink_templ,
GST_PAD_ALWAYS,
GST_CAPS_NEW (
"avidemux_sink",
- "video/avi",
- "format", GST_PROPS_STRING ("AVI")
- )
-)
-
-GST_PAD_TEMPLATE_FACTORY (src_video_templ,
- "video_%02d",
- GST_PAD_SRC,
- GST_PAD_SOMETIMES,
- GST_CAPS_NEW (
- "avidemux_src_video_avi",
- "video/avi",
- "format", GST_PROPS_LIST (
- GST_PROPS_STRING ("strf_vids"),
- GST_PROPS_STRING ("strf_iavs")
- ),
- "width", GST_PROPS_INT_RANGE (16, 4096),
- "height", GST_PROPS_INT_RANGE (16, 4096)
-
- ),
- GST_CAPS_NEW (
- "avidemux_src_video_raw",
- "video/raw",
- "format", GST_PROPS_LIST (
- GST_PROPS_FOURCC (GST_MAKE_FOURCC('Y','U','Y','2')),
- GST_PROPS_FOURCC (GST_MAKE_FOURCC('I','4','2','0'))
- ),
- "width", GST_PROPS_INT_RANGE (16, 4096),
- "height", GST_PROPS_INT_RANGE (16, 4096)
- ),
- GST_CAPS_NEW (
- "avidemux_src_video_jpeg",
- "video/jpeg",
- "width", GST_PROPS_INT_RANGE (16, 4096),
- "height", GST_PROPS_INT_RANGE (16, 4096)
- ),
- GST_CAPS_NEW (
- "avidemux_src_video_dv",
- "video/dv",
- "format", GST_PROPS_LIST (
- GST_PROPS_STRING ("NTSC"),
- GST_PROPS_STRING ("PAL")
- ),
- "width", GST_PROPS_INT_RANGE (16, 4096),
- "height", GST_PROPS_INT_RANGE (16, 4096)
- ),
- GST_CAPS_NEW (
- "avidemux_src_video_divx",
- "video/divx",
- "width", GST_PROPS_INT_RANGE (16, 4096),
- "height", GST_PROPS_INT_RANGE (16, 4096)
- ),
- GST_CAPS_NEW (
- "avidemux_src_video_xvid",
- "video/xvid",
- "width", GST_PROPS_INT_RANGE (16, 4096),
- "height", GST_PROPS_INT_RANGE (16, 4096)
- )
-)
-
-GST_PAD_TEMPLATE_FACTORY (src_audio_templ,
- "audio_%02d",
- GST_PAD_SRC,
- GST_PAD_SOMETIMES,
- GST_CAPS_NEW (
- "avidemux_src_audio_avi",
"video/avi",
- "format", GST_PROPS_STRING ("strf_auds")
- ),
- GST_CAPS_NEW (
- "avidemux_src_audio_raw",
- "audio/raw",
- "format", GST_PROPS_STRING ("int"),
- "law", GST_PROPS_INT (0),
- "endianness", GST_PROPS_INT (G_LITTLE_ENDIAN),
- "signed", GST_PROPS_LIST (
- GST_PROPS_BOOLEAN (TRUE),
- GST_PROPS_BOOLEAN (FALSE)
- ),
- "width", GST_PROPS_LIST (
- GST_PROPS_INT (8),
- GST_PROPS_INT (16)
- ),
- "depth", GST_PROPS_LIST (
- GST_PROPS_INT (8),
- GST_PROPS_INT (16)
- ),
- "rate", GST_PROPS_INT_RANGE (11025, 44100),
- "channels", GST_PROPS_INT_RANGE (1, 2)
- ),
- GST_CAPS_NEW (
- "avidemux_src_audio_mp3",
- "audio/x-mp3",
- NULL
- ),
- GST_CAPS_NEW (
- "avidemux_src_audio_ac3",
- "audio/a52",
NULL
- ),
- GST_CAPS_NEW (
- "avidemux_src_audio_vorbis",
- "application/x-ogg",
- NULL
)
-)
-
-static void gst_avi_demux_class_init (GstAviDemuxClass *klass);
-static void gst_avi_demux_init (GstAviDemux *avi_demux);
-
-static void gst_avi_demux_loop (GstElement *element);
-
-static gboolean gst_avi_demux_send_event (GstElement *element, GstEvent *event);
-
-static const GstEventMask*
- gst_avi_demux_get_event_mask (GstPad *pad);
-static gboolean gst_avi_demux_handle_src_event (GstPad *pad, GstEvent *event);
-static const GstFormat* gst_avi_demux_get_src_formats (GstPad *pad);
-static const GstQueryType*
- gst_avi_demux_get_src_query_types (GstPad *pad);
-static gboolean gst_avi_demux_handle_src_query (GstPad *pad, GstQueryType type,
- GstFormat *format, gint64 *value);
-static gboolean gst_avi_demux_src_convert (GstPad *pad, GstFormat src_format, gint64 src_value,
- GstFormat *dest_format, gint64 *dest_value);
+);
+
+static void gst_avi_demux_class_init (GstAviDemuxClass *klass);
+static void gst_avi_demux_init (GstAviDemux *avi_demux);
+
+static void gst_avi_demux_loop (GstElement *element);
+
+static gboolean gst_avi_demux_send_event (GstElement *element,
+ GstEvent *event);
+
+static const GstEventMask *
+ gst_avi_demux_get_event_mask (GstPad *pad);
+static gboolean gst_avi_demux_handle_src_event (GstPad *pad,
+ GstEvent *event);
+static const GstFormat *
+ gst_avi_demux_get_src_formats (GstPad *pad);
+static const GstQueryType *
+ gst_avi_demux_get_src_query_types (GstPad *pad);
+static gboolean gst_avi_demux_handle_src_query (GstPad *pad,
+ GstQueryType type,
+ GstFormat *format,
+ gint64 *value);
+static gboolean gst_avi_demux_src_convert (GstPad *pad,
+ GstFormat src_format,
+ gint64 src_value,
+ GstFormat *dest_format,
+ gint64 *dest_value);
static GstElementStateReturn
- gst_avi_demux_change_state (GstElement *element);
-
-static void gst_avi_demux_get_property (GObject *object, guint prop_id,
- GValue *value, GParamSpec *pspec);
+ gst_avi_demux_change_state (GstElement *element);
+static void gst_avi_demux_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec);
+static GstPadTemplate *videosrctempl, *audiosrctempl;
static GstElementClass *parent_class = NULL;
/*static guint gst_avi_demux_signals[LAST_SIGNAL] = { 0 }; */
@@ -280,7 +188,7 @@ avi_type_find (GstBuffer *buf,
new = GST_CAPS_NEW ("avi_type_find",
"video/avi",
- "format", GST_PROPS_STRING ("AVI"));
+ NULL);
return new;
}
@@ -524,7 +432,7 @@ gst_avi_demux_metadata (GstAviDemux *avi_demux, gint len)
type = "Subject";
break;
case GST_RIFF_INFO_ISFT:
- type = "Encoder"; /* "Sotware" */
+ type = "Encoder"; /* "Software" */
break;
case GST_RIFF_INFO_ISHP:
type = "Sharpness";
@@ -577,102 +485,91 @@ gst_avi_demux_streaminfo (GstAviDemux *avi_demux)
/*g_object_notify(G_OBJECT(avi_demux), "streaminfo");*/
}
-static void
-gst_avi_demux_strf_vids (GstAviDemux *avi_demux)
+/* video/audio pad/caps stuff */
+
+#define GST_AVI_VID_CAPS_NEW(name, mimetype, props...) \
+ (strf != NULL) ? \
+ GST_CAPS_NEW (name, \
+ mimetype, \
+ "width", GST_PROPS_INT (width), \
+ "height", GST_PROPS_INT (height), \
+ "framerate", GST_PROPS_FLOAT (framerate), \
+ ##props) \
+ : \
+ GST_CAPS_NEW (name, \
+ mimetype, \
+ "width", GST_PROPS_INT_RANGE (16, 4096), \
+ "height", GST_PROPS_INT_RANGE (16, 4096), \
+ "framerate", GST_PROPS_FLOAT_RANGE (0., G_MAXFLOAT), \
+ ##props)
+
+static GstCaps *
+gst_avi_demux_video_caps (guint32 codec_fcc,
+ gst_riff_strh *strh,
+ gst_riff_strf_vids *strf,
+ GstAviDemux *avi_demux)
{
- gst_riff_strf_vids *strf;
- guint8 *strfdata;
- GstPad *srcpad;
- GstCaps *newcaps = NULL, *capslist = NULL;
- avi_stream_context *stream;
- GstByteStream *bs = avi_demux->bs;
- guint32 got_bytes;
- gchar *codecname;
- GstPropsEntry *entry;
-
- got_bytes = gst_bytestream_peek_bytes (bs, &strfdata, sizeof (gst_riff_strf_vids));
- strf = (gst_riff_strf_vids *) strfdata;
- if (got_bytes != sizeof (gst_riff_strf_vids))
- return;
-
- GST_INFO ( "gst_avi_demux: strf tag found in context vids");
- GST_INFO ( "gst_avi_demux: size %d", GUINT32_FROM_LE (strf->size));
- GST_INFO ( "gst_avi_demux: width %d", GUINT32_FROM_LE (strf->width));
- GST_INFO ( "gst_avi_demux: height %d", GUINT32_FROM_LE (strf->height));
- GST_INFO ( "gst_avi_demux: planes %d", GUINT16_FROM_LE (strf->planes));
- GST_INFO ( "gst_avi_demux: bit_cnt %d", GUINT16_FROM_LE (strf->bit_cnt));
- GST_INFO ( "gst_avi_demux: compression 0x%08x (%s)",
- GUINT32_FROM_LE (strf->compression), gst_riff_id_to_fourcc (strf->compression));
- GST_INFO ( "gst_avi_demux: image_size %d", GUINT32_FROM_LE (strf->image_size));
- GST_INFO ( "gst_avi_demux: xpels_meter %d", GUINT32_FROM_LE (strf->xpels_meter));
- GST_INFO ( "gst_avi_demux: ypels_meter %d", GUINT32_FROM_LE (strf->ypels_meter));
- GST_INFO ( "gst_avi_demux: num_colors %d", GUINT32_FROM_LE (strf->num_colors));
- GST_INFO ( "gst_avi_demux: imp_colors %d", GUINT32_FROM_LE (strf->imp_colors));
-
- srcpad = gst_pad_new_from_template (
- GST_PAD_TEMPLATE_GET (src_video_templ), g_strdup_printf ("video_%02d",
- avi_demux->num_v_streams));
-
- capslist = gst_caps_append(NULL, GST_CAPS_NEW (
- "avidemux_video_src",
- "video/avi",
- "format", GST_PROPS_STRING ("strf_vids"),
- "size", GST_PROPS_INT (GUINT32_FROM_LE (strf->size)),
- "width", GST_PROPS_INT (GUINT32_FROM_LE (strf->width)),
- "height", GST_PROPS_INT (GUINT32_FROM_LE (strf->height)),
- "planes", GST_PROPS_INT (GUINT16_FROM_LE (strf->planes)),
- "bit_cnt", GST_PROPS_INT (GUINT16_FROM_LE (strf->bit_cnt)),
- "compression", GST_PROPS_FOURCC (GUINT32_FROM_LE (strf->compression)),
- "image_size", GST_PROPS_INT (GUINT32_FROM_LE (strf->image_size)),
- "xpels_meter", GST_PROPS_INT (GUINT32_FROM_LE (strf->xpels_meter)),
- "ypels_meter", GST_PROPS_INT (GUINT32_FROM_LE (strf->ypels_meter)),
- "num_colors", GST_PROPS_INT (GUINT32_FROM_LE (strf->num_colors)),
- "imp_colors", GST_PROPS_INT (GUINT32_FROM_LE (strf->imp_colors))
- ));
+ GstCaps *caps = NULL;
+ gchar *codecname = NULL;
+ gint width = -1, height = -1;
+ gdouble framerate = 0.;
+
+ if (strf != NULL) {
+ width = GUINT32_FROM_LE (strf->width);
+ height = GUINT32_FROM_LE (strf->height);
+ }
+ if (strh != NULL) {
+ framerate = 1. * GUINT32_FROM_LE (strh->rate) /
+ GUINT32_FROM_LE (strh->scale); /* fps */
+ }
- /* let's try some gstreamer-like mime-type caps */
- switch (GUINT32_FROM_LE(strf->compression))
- {
+ switch (codec_fcc) {
case GST_MAKE_FOURCC('I','4','2','0'):
case GST_MAKE_FOURCC('Y','U','Y','2'):
- newcaps = GST_CAPS_NEW (
- "avidemux_video_src",
- "video/raw",
- "format", GST_PROPS_FOURCC(GUINT32_FROM_LE(strf->compression)),
- "width", GST_PROPS_INT(strf->width),
- "height", GST_PROPS_INT(strf->height)
+ caps = GST_AVI_VID_CAPS_NEW (
+ "avidemux_video_src_raw",
+ "video/x-raw-yuv",
+ "format", GST_PROPS_FOURCC (codec_fcc)
);
- codecname = g_strdup_printf("Raw Video (%4.4s)",
- (char *) &strf->compression);
+ codecname = g_strdup_printf("Raw Video (" GST_FOURCC_FORMAT ")",
+ GST_FOURCC_ARGS(codec_fcc));
break;
+
case GST_MAKE_FOURCC('M','J','P','G'): /* YUY2 MJPEG */
case GST_MAKE_FOURCC('J','P','E','G'): /* generic (mostly RGB) MJPEG */
case GST_MAKE_FOURCC('P','I','X','L'): /* Miro/Pinnacle fourccs */
case GST_MAKE_FOURCC('V','I','X','L'): /* Miro/Pinnacle fourccs */
- newcaps = GST_CAPS_NEW (
- "avidemux_video_src",
- "video/jpeg",
- "width", GST_PROPS_INT(strf->width),
- "height", GST_PROPS_INT(strf->height)
+ caps = GST_AVI_VID_CAPS_NEW (
+ "avidemux_video_src_jpeg",
+ "video/x-jpeg",
+ NULL
);
- codecname = g_strdup_printf("Motion-JPEG (%4.4s)",
- (char *) &strf->compression);
+ codecname = g_strdup_printf("Motion-JPEG (" GST_FOURCC_FORMAT ")",
+ GST_FOURCC_ARGS(codec_fcc));
break;
+
case GST_MAKE_FOURCC('H','F','Y','U'):
- codecname = g_strdup_printf("HuffYUV (%4.4s)",
- (char *) &strf->compression);
+ caps = GST_AVI_VID_CAPS_NEW (
+ "avidemux_video_src_hfyu",
+ "video/x-huffyuv",
+ NULL
+ );
+ codecname = g_strdup_printf("HuffYUV (" GST_FOURCC_FORMAT ")",
+ GST_FOURCC_ARGS(codec_fcc));
break;
+
case GST_MAKE_FOURCC('M','P','E','G'):
case GST_MAKE_FOURCC('M','P','G','I'):
- newcaps = GST_CAPS_NEW (
- "avidemux_video_src",
+ caps = GST_AVI_VID_CAPS_NEW (
+ "avidemux_video_src_mpeg",
"video/mpeg",
- "width", GST_PROPS_INT(strf->width),
- "height", GST_PROPS_INT(strf->height)
+ "systemstream", GST_PROPS_BOOLEAN (FALSE),
+ "mpegversion", GST_PROPS_BOOLEAN (1)
);
- codecname = g_strdup_printf("MPEG-1 (%4.4s)",
- (char *) &strf->compression);
+ codecname = g_strdup_printf("MPEG-1 (" GST_FOURCC_FORMAT ")",
+ GST_FOURCC_ARGS(codec_fcc));
break;
+
case GST_MAKE_FOURCC('H','2','6','3'):
case GST_MAKE_FOURCC('i','2','6','3'):
case GST_MAKE_FOURCC('L','2','6','3'):
@@ -680,67 +577,174 @@ gst_avi_demux_strf_vids (GstAviDemux *avi_demux)
case GST_MAKE_FOURCC('V','D','O','W'):
case GST_MAKE_FOURCC('V','I','V','O'):
case GST_MAKE_FOURCC('x','2','6','3'):
- codecname = g_strdup_printf("H263-compatible (%4.4s)",
- (char *) &strf->compression);
+ caps = GST_AVI_VID_CAPS_NEW (
+ "avidemux_video_src_263",
+ "video/x-h263",
+ NULL
+ );
+ codecname = g_strdup_printf("H263-compatible (" GST_FOURCC_FORMAT ")",
+ GST_FOURCC_ARGS(codec_fcc));
break;
- case GST_MAKE_FOURCC('d','i','v','x'):
+
case GST_MAKE_FOURCC('D','I','V','3'):
case GST_MAKE_FOURCC('D','I','V','4'):
case GST_MAKE_FOURCC('D','I','V','5'):
+ caps = GST_AVI_VID_CAPS_NEW (
+ "avidemux_video_src_divx3",
+ "video/x-divx",
+ "divxversion", GST_PROPS_INT(3)
+ );
+ codecname = g_strdup_printf("DivX-3.x (" GST_FOURCC_FORMAT ")",
+ GST_FOURCC_ARGS(codec_fcc));
+ break;
+
+ case GST_MAKE_FOURCC('d','i','v','x'):
case GST_MAKE_FOURCC('D','I','V','X'):
case GST_MAKE_FOURCC('D','X','5','0'):
- newcaps = GST_CAPS_NEW (
- "avidemux_video_src",
- "video/divx",
- "width", GST_PROPS_INT(strf->width),
- "height", GST_PROPS_INT(strf->height)
+ caps = GST_AVI_VID_CAPS_NEW (
+ "avidemux_video_src_divx5",
+ "video/x-divx",
+ "divxversion", GST_PROPS_INT(5)
);
- codecname = g_strdup_printf("DivX/MPEG-4 (%4.4s)",
- (char *) &strf->compression);
+ codecname = g_strdup_printf("DivX 4.x/5.x (" GST_FOURCC_FORMAT ")",
+ GST_FOURCC_ARGS(codec_fcc));
break;
+
case GST_MAKE_FOURCC('X','V','I','D'):
case GST_MAKE_FOURCC('x','v','i','d'):
- newcaps = GST_CAPS_NEW (
+ caps = GST_AVI_VID_CAPS_NEW (
"avidemux_video_src",
- "video/xvid",
- "width", GST_PROPS_INT(strf->width),
- "height", GST_PROPS_INT(strf->height)
+ "video/x-xvid",
+ NULL
);
- codecname = g_strdup_printf("XviD/MPEG-4 (%4.4s)",
- (char *) &strf->compression);
+ codecname = g_strdup_printf("XviD (" GST_FOURCC_FORMAT ")",
+ GST_FOURCC_ARGS(codec_fcc));
break;
+
case GST_MAKE_FOURCC('M','P','G','4'):
+ caps = GST_AVI_VID_CAPS_NEW (
+ "avidemux_video_src",
+ "video/x-msmpeg",
+ "msmpegversion", GST_PROPS_INT (41)
+ );
+ codecname = g_strdup_printf("MS MPEG-4.1 (" GST_FOURCC_FORMAT ")",
+ GST_FOURCC_ARGS(codec_fcc));
+ break;
+
case GST_MAKE_FOURCC('M','P','4','2'):
+ caps = GST_AVI_VID_CAPS_NEW (
+ "avidemux_video_src",
+ "video/x-msmpeg",
+ "msmpegversion", GST_PROPS_INT (42)
+ );
+ codecname = g_strdup_printf("MS MPEG-4.2 (" GST_FOURCC_FORMAT ")",
+ GST_FOURCC_ARGS(codec_fcc));
+ break;
+
case GST_MAKE_FOURCC('M','P','4','3'):
- codecname = g_strdup_printf("MS MPEG-4 (%4.4s)",
- (char *) &strf->compression);
+ caps = GST_AVI_VID_CAPS_NEW (
+ "avidemux_video_src",
+ "video/x-msmpeg",
+ "msmpegversion", GST_PROPS_INT (43)
+ );
+ codecname = g_strdup_printf("MS MPEG-4.3 (" GST_FOURCC_FORMAT ")",
+ GST_FOURCC_ARGS(codec_fcc));
+ break;
+
+ case GST_MAKE_FOURCC('3','I','V','1'):
+ case GST_MAKE_FOURCC('3','I','V','2'):
+ caps = GST_AVI_VID_CAPS_NEW (
+ "avidemux_video_src_3ivx",
+ "video/x-3ivx",
+ NULL
+ );
+ codecname = g_strdup_printf("3ivX (" GST_FOURCC_FORMAT ")",
+ GST_FOURCC_ARGS(codec_fcc));
break;
+
case GST_MAKE_FOURCC('D','V','S','D'):
case GST_MAKE_FOURCC('d','v','s','d'):
- newcaps = GST_CAPS_NEW (
+ caps = GST_AVI_VID_CAPS_NEW (
"avidemux_video_src",
- "video/dv",
- "format", GST_PROPS_STRING("NTSC"), /* FIXME??? */
- "width", GST_PROPS_INT(strf->width),
- "height", GST_PROPS_INT(strf->height)
+ "video/x-dv",
+ "systemstream", GST_PROPS_BOOLEAN (FALSE)
+ );
+ codecname = g_strdup_printf("Digital Video (" GST_FOURCC_FORMAT ")",
+ GST_FOURCC_ARGS(codec_fcc));
+ break;
+
+ case GST_MAKE_FOURCC('W','M','V','1'):
+ caps = GST_AVI_VID_CAPS_NEW (
+ "avidemux_video_src_wmv1",
+ "video/x-wmv",
+ "wmvversion", GST_PROPS_INT (1)
+ );
+ codecname = g_strdup_printf("Windows Media Format 1 ("
+ GST_FOURCC_FORMAT ")",
+ GST_FOURCC_ARGS(codec_fcc));
+ break;
+
+ case GST_MAKE_FOURCC('W','M','V','2'):
+ caps = GST_AVI_VID_CAPS_NEW (
+ "avidemux_video_src_wmv2",
+ "video/x-wmv",
+ "wmvversion", GST_PROPS_INT (2)
);
- codecname = g_strdup_printf("Digital Video (%4.4s)",
- (char *) &strf->compression);
+ codecname = g_strdup_printf("Windows Media Format 2 ("
+ GST_FOURCC_FORMAT ")",
+ GST_FOURCC_ARGS(codec_fcc));
break;
+
default:
- codecname = g_strdup_printf("Unknown (%4.4s)",
- (char *) &strf->compression);
+ g_warning ("avidemux: unkown video format " GST_FOURCC_FORMAT,
+ GST_FOURCC_ARGS(codec_fcc));
break;
}
- if (newcaps) capslist = gst_caps_append (capslist, newcaps);
-
/* set video codec info on streaminfo caps */
- entry = gst_props_entry_new("videocodec", GST_PROPS_STRING(codecname));
- gst_props_add_entry(avi_demux->streaminfo->properties, entry);
- g_free(codecname);
+ if (strf != NULL && codecname != NULL) {
+ GstPropsEntry *entry;
+ entry = gst_props_entry_new("videocodec",
+ GST_PROPS_STRING(codecname));
+ gst_props_add_entry(avi_demux->streaminfo->properties, entry);
+ }
+ if (codecname != NULL) {
+ g_free(codecname);
+ }
+
+ return caps;
+}
+
+static void
+gst_avi_demux_strf_vids (GstAviDemux *avi_demux)
+{
+ gst_riff_strf_vids *strf;
+ gst_riff_strh *strh;
+ guint8 *strfdata;
+ GstPad *srcpad;
+ GstCaps *caps = NULL;
+ avi_stream_context *stream;
+ GstByteStream *bs = avi_demux->bs;
+ guint32 got_bytes;
+ gchar *padname;
+
+ got_bytes = gst_bytestream_peek_bytes (bs, &strfdata, sizeof (gst_riff_strf_vids));
+ strf = (gst_riff_strf_vids *) strfdata;
+ if (got_bytes != sizeof (gst_riff_strf_vids))
+ return;
+
+ padname = g_strdup_printf ("video_%02d", avi_demux->num_v_streams);
+ srcpad = gst_pad_new_from_template (videosrctempl, padname);
+ g_free (padname);
- gst_pad_try_set_caps (srcpad, capslist);
+ /* let's try some gstreamer-like mime-type caps */
+ strh = &avi_demux->stream[avi_demux->num_streams].strh;
+ caps = gst_avi_demux_video_caps (GUINT32_FROM_LE(strf->compression),
+ strh, strf, avi_demux);
+
+ if (caps != NULL) {
+ gst_pad_try_set_caps (srcpad, caps);
+ }
gst_pad_set_formats_function (srcpad, gst_avi_demux_get_src_formats);
gst_pad_set_event_mask_function (srcpad, gst_avi_demux_get_event_mask);
gst_pad_set_event_function (srcpad, gst_avi_demux_handle_src_event);
@@ -757,130 +761,195 @@ gst_avi_demux_strf_vids (GstAviDemux *avi_demux)
gst_element_add_pad (GST_ELEMENT (avi_demux), srcpad);
}
-static void
-gst_avi_demux_strf_auds (GstAviDemux *avi_demux)
+#define GST_AVI_AUD_CAPS_NEW(name, mimetype, props...) \
+ (strf != NULL) ? \
+ GST_CAPS_NEW (name, \
+ mimetype, \
+ "rate", GST_PROPS_INT (rate), \
+ "channels", GST_PROPS_INT (channels), \
+ ##props) \
+ : \
+ GST_CAPS_NEW (name, \
+ mimetype, \
+ "rate", GST_PROPS_INT_RANGE (8000, 96000), \
+ "channels", GST_PROPS_INT_RANGE (1, 2), \
+ ##props)
+
+
+static GstCaps *
+gst_avi_demux_audio_caps (guint16 codec_id,
+ gst_riff_strf_auds *strf,
+ GstAviDemux *avi_demux)
{
- gst_riff_strf_auds *strf;
- guint8 *strfdata;
- GstPad *srcpad;
- GstCaps *newcaps = NULL, *capslist = NULL;
- avi_stream_context *stream;
- GstByteStream *bs = avi_demux->bs;
- guint32 got_bytes;
- gchar *codecname;
- GstPropsEntry *entry;
+ GstCaps *caps = NULL;
+ gchar *codecname = NULL;
+ gint rate = -1, channels = -1;
- got_bytes = gst_bytestream_peek_bytes (bs, &strfdata, sizeof (gst_riff_strf_auds));
- strf = (gst_riff_strf_auds *) strfdata;
- if (got_bytes != sizeof (gst_riff_strf_auds))
- return;
+ if (strf != NULL) {
+ rate = GUINT32_FROM_LE (strf->rate);
+ channels = GUINT16_FROM_LE (strf->channels);
+ }
- GST_INFO ( "gst_avi_demux: strf tag found in context auds");
- GST_INFO ( "gst_avi_demux: format %d", GUINT16_FROM_LE (strf->format));
- GST_INFO ( "gst_avi_demux: channels %d", GUINT16_FROM_LE (strf->channels));
- GST_INFO ( "gst_avi_demux: rate %d", GUINT32_FROM_LE (strf->rate));
- GST_INFO ( "gst_avi_demux: av_bps %d", GUINT32_FROM_LE (strf->av_bps));
- GST_INFO ( "gst_avi_demux: blockalign %d", GUINT16_FROM_LE (strf->blockalign));
- GST_INFO ( "gst_avi_demux: size %d", GUINT16_FROM_LE (strf->size));
+ switch (codec_id) {
+ case GST_RIFF_WAVE_FORMAT_MPEGL3: /* mp3 */
+ caps = GST_AVI_AUD_CAPS_NEW ("avi_demux_audio_src_mp3",
+ "audio/mpeg",
+ "layer", GST_PROPS_INT (3));
+ codecname = g_strdup_printf("MPEG-1 layer 3 audio (0x%04x)",
+ codec_id);
+ break;
- srcpad = gst_pad_new_from_template (
- GST_PAD_TEMPLATE_GET (src_audio_templ), g_strdup_printf ("audio_%02d",
- avi_demux->num_a_streams));
-
- capslist = gst_caps_append(NULL, GST_CAPS_NEW (
- "avidemux_audio_src",
- "video/avi",
- "format", GST_PROPS_STRING ("strf_auds"),
- "fmt", GST_PROPS_INT (GUINT16_FROM_LE (strf->format)),
- "channels", GST_PROPS_INT (GUINT16_FROM_LE (strf->channels)),
- "rate", GST_PROPS_INT (GUINT32_FROM_LE (strf->rate)),
- "av_bps", GST_PROPS_INT (GUINT32_FROM_LE (strf->av_bps)),
- "blockalign", GST_PROPS_INT (GUINT16_FROM_LE (strf->blockalign)),
- "size", GST_PROPS_INT (GUINT16_FROM_LE (strf->size))
- ));
-
- /* let's try some gstreamer-formatted mime types */
- switch (GUINT16_FROM_LE(strf->format))
- {
- case GST_RIFF_WAVE_FORMAT_MPEGL3:
- case GST_RIFF_WAVE_FORMAT_MPEGL12: /* mp3 */
- newcaps = gst_caps_new ("avidemux_audio_src",
- "audio/x-mp3",
- NULL);
- codecname = g_strdup_printf("MPEG/audio (0x%04x)",
- strf->format);
+ case GST_RIFF_WAVE_FORMAT_MPEGL12: /* mp1 or mp2 */
+ caps = GST_AVI_AUD_CAPS_NEW ("avi_demux_audio_src_mp12",
+ "audio/mpeg",
+ "layer", GST_PROPS_INT (2));
+ codecname = g_strdup_printf("MPEG-1 layer 1/2 audio (0x%04x)",
+ codec_id);
break;
- case GST_RIFF_WAVE_FORMAT_PCM: /* PCM/wav */
- newcaps = gst_caps_new ("avidemux_audio_src",
- "audio/raw",
- gst_props_new (
- "format", GST_PROPS_STRING ("int"),
- "law", GST_PROPS_INT (0),
- "endianness", GST_PROPS_INT (G_LITTLE_ENDIAN),
- "signed", GST_PROPS_BOOLEAN ((GUINT16_FROM_LE (strf->size) != 8)),
- "width", GST_PROPS_INT ((GUINT16_FROM_LE (strf->blockalign)*8) /
- GUINT16_FROM_LE (strf->channels)),
- "depth", GST_PROPS_INT (GUINT16_FROM_LE (strf->size)),
- "rate", GST_PROPS_INT (GUINT32_FROM_LE (strf->rate)),
- "channels", GST_PROPS_INT (GUINT16_FROM_LE (strf->channels)),
- NULL
- ));
+
+ case GST_RIFF_WAVE_FORMAT_PCM: /* PCM/wav */ {
+ GstPropsEntry *width = NULL, *depth = NULL, *signedness = NULL;
+
+ if (strf != NULL) {
+ gint ba = GUINT16_FROM_LE (strf->blockalign);
+ gint ch = GUINT16_FROM_LE (strf->channels);
+ gint ws = GUINT16_FROM_LE (strf->size);
+
+ width = gst_props_entry_new ("width",
+ GST_PROPS_INT (ba * 8 / ch));
+ depth = gst_props_entry_new ("depth",
+ GST_PROPS_INT (ws));
+ signedness = gst_props_entry_new ("signed",
+ GST_PROPS_BOOLEAN (ws != 8));
+ } else {
+ signedness = gst_props_entry_new ("signed",
+ GST_PROPS_LIST (
+ GST_PROPS_BOOLEAN (TRUE),
+ GST_PROPS_BOOLEAN (FALSE)));
+ width = gst_props_entry_new ("width",
+ GST_PROPS_LIST (
+ GST_PROPS_INT (8),
+ GST_PROPS_INT (16)));
+ depth = gst_props_entry_new ("depth",
+ GST_PROPS_LIST (
+ GST_PROPS_INT (8),
+ GST_PROPS_INT (16)));
+ }
+
+ caps = GST_AVI_AUD_CAPS_NEW ("avi_demux_audio_src_pcm",
+ "audio/x-raw-int",
+ "endianness",
+ GST_PROPS_INT (G_LITTLE_ENDIAN));
+ gst_props_add_entry (caps->properties, width);
+ gst_props_add_entry (caps->properties, depth);
+ gst_props_add_entry (caps->properties, signedness);
+
codecname = g_strdup_printf("Raw PCM/WAV (0x%04x)",
- strf->format);
+ codec_id);
+ }
break;
+
case GST_RIFF_WAVE_FORMAT_MULAW:
+ if (strf != NULL && strf->size != 8) {
+ g_warning ("invalid depth (%d) of mulaw audio, overwriting.",
+ strf->size);
+ }
+ caps = GST_AVI_AUD_CAPS_NEW ("avidemux_audio_src",
+ "audio/x-mulaw",
+ NULL);
+ codecname = g_strdup_printf("A-law encoded (0x%04x)",
+ codec_id);
+ break;
+
case GST_RIFF_WAVE_FORMAT_ALAW:
- if (strf->size != 8)
- g_warning ("invalid depth (%d) of mulaw/alaw audio, overwriting.", strf->size);
- newcaps = gst_caps_new ("avidemux_audio_src",
- "audio/raw",
- gst_props_new (
- "format", GST_PROPS_STRING ("int"),
- "law", GST_PROPS_INT (GUINT16_FROM_LE(strf->format) == GST_RIFF_WAVE_FORMAT_ALAW ? 2 : 1),
- "endianness", GST_PROPS_INT (G_LITTLE_ENDIAN),
- "width", GST_PROPS_INT (8),
- "depth", GST_PROPS_INT (8),
- "rate", GST_PROPS_INT (GUINT32_FROM_LE (strf->rate)),
- "channels", GST_PROPS_INT (GUINT16_FROM_LE (strf->channels)),
- NULL
- ));
- codecname = g_strdup_printf("%s-law encoded (0x%04x)",
- GUINT16_FROM_LE(strf->format) == GST_RIFF_WAVE_FORMAT_ALAW ? "A" : "Mu", strf->format);
+ if (strf != NULL && strf->size != 8) {
+ g_warning ("invalid depth (%d) of alaw audio, overwriting.",
+ strf->size);
+ }
+ caps = GST_AVI_AUD_CAPS_NEW ("avidemux_audio_src",
+ "audio/x-alaw",
+ NULL);
+ codecname = g_strdup_printf("A-law encoded (0x%04x)",
+ codec_id);
break;
+
case GST_RIFF_WAVE_FORMAT_VORBIS1: /* ogg/vorbis mode 1 */
case GST_RIFF_WAVE_FORMAT_VORBIS2: /* ogg/vorbis mode 2 */
case GST_RIFF_WAVE_FORMAT_VORBIS3: /* ogg/vorbis mode 3 */
case GST_RIFF_WAVE_FORMAT_VORBIS1PLUS: /* ogg/vorbis mode 1+ */
case GST_RIFF_WAVE_FORMAT_VORBIS2PLUS: /* ogg/vorbis mode 2+ */
case GST_RIFF_WAVE_FORMAT_VORBIS3PLUS: /* ogg/vorbis mode 3+ */
- newcaps = gst_caps_new ("avidemux_audio_src",
- "application/x-ogg",
- NULL);
- codecname = g_strdup_printf("Ogg/Vorbis (0x%04x)",
- strf->format);
+ caps = GST_AVI_AUD_CAPS_NEW ("asf_demux_audio_src_vorbis",
+ "audio/x-vorbis",
+ NULL);
+ codecname = g_strdup_printf("Vorbis (0x%04x)",
+ codec_id);
break;
+
case GST_RIFF_WAVE_FORMAT_A52:
- newcaps = gst_caps_new ("avidemux_audio_src",
- "audio/a52",
- NULL);
- codecname = g_strdup_printf("AC3/AC52 (0x%04x)",
- strf->format);
+ caps = GST_AVI_AUD_CAPS_NEW ("asf_demux_audio_src_ac3",
+ "audio/x-ac3",
+ NULL);
+ codecname = g_strdup_printf("AC-3 (0x%04x)",
+ codec_id);
break;
+
default:
- g_warning ("avidemux: unkown audio format %d", GUINT16_FROM_LE(strf->format));
- codecname = g_strdup_printf("Unknown (0x%04x)",
- strf->format);
+ g_warning ("avidemux: unkown audio format 0x%04x",
+ codec_id);
break;
}
- if (newcaps) capslist = gst_caps_append(capslist, newcaps);
+ if (strf != NULL && codecname != NULL) {
+ /* set audio codec in streaminfo */
+ GstPropsEntry *entry;
+ entry = gst_props_entry_new("audiocodec",
+ GST_PROPS_STRING(codecname));
+ gst_props_add_entry(avi_demux->streaminfo->properties, entry);
+ }
+ if (codecname != NULL) {
+ g_free (codecname);
+ }
+
+ return caps;
+}
- /* set audio codec in streaminfo */
- entry = gst_props_entry_new("audiocodec", GST_PROPS_STRING(codecname));
- gst_props_add_entry(avi_demux->streaminfo->properties, entry);
- g_free(codecname);
+static void
+gst_avi_demux_strf_auds (GstAviDemux *avi_demux)
+{
+ gst_riff_strf_auds *strf;
+ guint8 *strfdata;
+ GstPad *srcpad;
+ GstCaps *caps = NULL;
+ avi_stream_context *stream;
+ GstByteStream *bs = avi_demux->bs;
+ guint32 got_bytes;
+ gchar *padname;
+
+ got_bytes = gst_bytestream_peek_bytes (bs, &strfdata, sizeof (gst_riff_strf_auds));
+ strf = (gst_riff_strf_auds *) strfdata;
+ if (got_bytes != sizeof (gst_riff_strf_auds))
+ return;
- gst_pad_try_set_caps(srcpad, capslist);
+ GST_INFO ( "gst_avi_demux: strf tag found in context auds");
+ GST_INFO ( "gst_avi_demux: format %d", GUINT16_FROM_LE (strf->format));
+ GST_INFO ( "gst_avi_demux: channels %d", GUINT16_FROM_LE (strf->channels));
+ GST_INFO ( "gst_avi_demux: rate %d", GUINT32_FROM_LE (strf->rate));
+ GST_INFO ( "gst_avi_demux: av_bps %d", GUINT32_FROM_LE (strf->av_bps));
+ GST_INFO ( "gst_avi_demux: blockalign %d", GUINT16_FROM_LE (strf->blockalign));
+ GST_INFO ( "gst_avi_demux: size %d", GUINT16_FROM_LE (strf->size));
+
+ padname = g_strdup_printf ("audio_%02d",
+ avi_demux->num_a_streams);
+ srcpad = gst_pad_new_from_template (audiosrctempl, padname);
+ g_free (padname);
+
+ caps = gst_avi_demux_audio_caps (GUINT16_FROM_LE (strf->format),
+ strf, avi_demux);
+
+ if (caps != NULL) {
+ gst_pad_try_set_caps(srcpad, caps);
+ }
gst_pad_set_formats_function (srcpad, gst_avi_demux_get_src_formats);
gst_pad_set_event_mask_function (srcpad, gst_avi_demux_get_event_mask);
gst_pad_set_event_function (srcpad, gst_avi_demux_handle_src_event);
@@ -897,16 +966,25 @@ gst_avi_demux_strf_auds (GstAviDemux *avi_demux)
gst_element_add_pad (GST_ELEMENT (avi_demux), srcpad);
}
+static GstCaps *
+gst_avi_demux_iavs_caps (void)
+{
+ return GST_CAPS_NEW ("avi_type_dv",
+ "video/x-dv",
+ "systemstream", GST_PROPS_BOOLEAN (TRUE));
+}
+
static void
gst_avi_demux_strf_iavs (GstAviDemux *avi_demux)
{
gst_riff_strf_iavs *strf;
guint8 *strfdata;
GstPad *srcpad;
- GstCaps *newcaps = NULL, *capslist = NULL;
+ GstCaps *caps = NULL;
avi_stream_context *stream;
GstByteStream *bs = avi_demux->bs;
guint32 got_bytes;
+ gchar *padname;
got_bytes = gst_bytestream_peek_bytes (bs, &strfdata, sizeof (gst_riff_strf_iavs));
strf = (gst_riff_strf_iavs *) strfdata;
@@ -923,33 +1001,16 @@ gst_avi_demux_strf_iavs (GstAviDemux *avi_demux)
GST_INFO ( "gst_avi_demux: DVReserved1 %08x", GUINT32_FROM_LE (strf->DVReserved1));
GST_INFO ( "gst_avi_demux: DVReserved2 %08x", GUINT32_FROM_LE (strf->DVReserved2));
- srcpad = gst_pad_new_from_template (
- GST_PAD_TEMPLATE_GET (src_video_templ), g_strdup_printf ("video_%02d",
- avi_demux->num_v_streams));
-
- capslist = gst_caps_append(NULL, GST_CAPS_NEW (
- "avidemux_video_src",
- "video/avi",
- "format", GST_PROPS_STRING ("strf_iavs"),
- "DVAAuxSrc", GST_PROPS_INT (GUINT32_FROM_LE (strf->DVAAuxSrc)),
- "DVAAuxCtl", GST_PROPS_INT (GUINT32_FROM_LE (strf->DVAAuxCtl)),
- "DVAAuxSrc1", GST_PROPS_INT (GUINT32_FROM_LE (strf->DVAAuxSrc1)),
- "DVAAuxCtl1", GST_PROPS_INT (GUINT32_FROM_LE (strf->DVAAuxCtl1)),
- "DVVAuxSrc", GST_PROPS_INT (GUINT32_FROM_LE (strf->DVVAuxSrc)),
- "DVVAuxCtl", GST_PROPS_INT (GUINT32_FROM_LE (strf->DVVAuxCtl)),
- "DVReserved1", GST_PROPS_INT (GUINT32_FROM_LE (strf->DVReserved1)),
- "DVReserved2", GST_PROPS_INT (GUINT32_FROM_LE (strf->DVReserved2))
- ));
-
- newcaps = gst_caps_new ("avi_type_dv",
- "video/dv",
- gst_props_new (
- "format", GST_PROPS_STRING ("NTSC"), /* FIXME??? */
- NULL));
-
- if (newcaps) capslist = gst_caps_append(capslist, newcaps);
-
- gst_pad_try_set_caps(srcpad, capslist);
+ padname = g_strdup_printf ("video_%02d",
+ avi_demux->num_v_streams);
+ srcpad = gst_pad_new_from_template (videosrctempl, padname);
+ g_free (padname);
+
+ caps = gst_avi_demux_iavs_caps ();
+
+ if (caps != NULL) {
+ gst_pad_try_set_caps(srcpad, caps);
+ }
gst_pad_set_formats_function (srcpad, gst_avi_demux_get_src_formats);
gst_pad_set_event_mask_function (srcpad, gst_avi_demux_get_event_mask);
gst_pad_set_event_function (srcpad, gst_avi_demux_handle_src_event);
@@ -1821,6 +1882,37 @@ plugin_init (GModule *module, GstPlugin *plugin)
{
GstElementFactory *factory;
GstTypeFactory *type;
+ gint i = 0;
+ GstCaps *audcaps = NULL, *vidcaps = NULL, *temp;
+ guint32 vid_list[] = {
+ GST_MAKE_FOURCC('I','4','2','0'),
+ GST_MAKE_FOURCC('Y','U','Y','2'),
+ GST_MAKE_FOURCC('M','J','P','G'),
+ GST_MAKE_FOURCC('D','V','S','D'),
+ GST_MAKE_FOURCC('W','M','V','1'),
+ GST_MAKE_FOURCC('W','M','V','2'),
+ GST_MAKE_FOURCC('M','P','G','4'),
+ GST_MAKE_FOURCC('M','P','4','2'),
+ GST_MAKE_FOURCC('M','P','4','3'),
+ GST_MAKE_FOURCC('H','F','Y','U'),
+ GST_MAKE_FOURCC('D','I','V','3'),
+ GST_MAKE_FOURCC('M','P','E','G'),
+ GST_MAKE_FOURCC('H','2','6','3'),
+ GST_MAKE_FOURCC('D','I','V','X'),
+ GST_MAKE_FOURCC('X','V','I','D'),
+ GST_MAKE_FOURCC('3','I','V','1'),
+ 0 /* end */
+ };
+ gint aud_list[] = {
+ GST_RIFF_WAVE_FORMAT_MPEGL3,
+ GST_RIFF_WAVE_FORMAT_MPEGL12,
+ GST_RIFF_WAVE_FORMAT_PCM,
+ GST_RIFF_WAVE_FORMAT_VORBIS1,
+ GST_RIFF_WAVE_FORMAT_A52,
+ GST_RIFF_WAVE_FORMAT_ALAW,
+ GST_RIFF_WAVE_FORMAT_MULAW,
+ -1 /* end */
+ };
/* this filter needs the riff parser */
if (!gst_library_load ("gstbytestream"))
@@ -1835,9 +1927,28 @@ plugin_init (GModule *module, GstPlugin *plugin)
g_return_val_if_fail (factory != NULL, FALSE);
gst_element_factory_set_rank (factory, GST_ELEMENT_RANK_PRIMARY);
- gst_element_factory_add_pad_template (factory, GST_PAD_TEMPLATE_GET (src_audio_templ));
- gst_element_factory_add_pad_template (factory, GST_PAD_TEMPLATE_GET (src_video_templ));
- gst_element_factory_add_pad_template (factory, GST_PAD_TEMPLATE_GET (sink_templ));
+ for (i = 0; aud_list[i] != -1; i++) {
+ temp = gst_avi_demux_audio_caps (aud_list[i], NULL, NULL);
+ audcaps = gst_caps_append (audcaps, temp);
+ }
+ audiosrctempl = gst_pad_template_new ("audio_%02d",
+ GST_PAD_SRC,
+ GST_PAD_SOMETIMES,
+ audcaps, NULL);
+ for (i = 0; vid_list[i] != 0; i++) {
+ temp = gst_avi_demux_video_caps (vid_list[i], NULL, NULL, NULL);
+ vidcaps = gst_caps_append (vidcaps, temp);
+ }
+ vidcaps = gst_caps_append (vidcaps,
+ gst_avi_demux_iavs_caps ());
+ videosrctempl = gst_pad_template_new ("video_%02d",
+ GST_PAD_SRC,
+ GST_PAD_SOMETIMES,
+ vidcaps, NULL);
+ gst_element_factory_add_pad_template (factory, audiosrctempl);
+ gst_element_factory_add_pad_template (factory, videosrctempl);
+ gst_element_factory_add_pad_template (factory,
+ GST_PAD_TEMPLATE_GET (sink_templ));
type = gst_type_factory_new (&avidefinition);
gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (type));
@@ -1853,4 +1964,3 @@ GstPluginDesc plugin_desc = {
"avidemux",
plugin_init
};
-
diff --git a/gst/avi/gstavimux.c b/gst/avi/gstavimux.c
index 8dfa50fa..6b3a442b 100644
--- a/gst/avi/gstavimux.c
+++ b/gst/avi/gstavimux.c
@@ -84,55 +84,74 @@ GST_PAD_TEMPLATE_FACTORY (video_sink_factory,
GST_PAD_SINK,
GST_PAD_REQUEST,
GST_CAPS_NEW (
- "avimux_sink_video_avi",
- "video/avi",
- "format", GST_PROPS_STRING ("strf_vids")
- ),
- GST_CAPS_NEW (
"avimux_sink_video_yuv",
- "video/raw",
+ "video/x-raw-yuv",
"format", GST_PROPS_LIST (
GST_PROPS_FOURCC (GST_MAKE_FOURCC('Y','U','Y','2')),
- GST_PROPS_FOURCC (GST_MAKE_FOURCC('I','4','2','0')),
- GST_PROPS_FOURCC (GST_MAKE_FOURCC('Y','4','1','P'))
+ GST_PROPS_FOURCC (GST_MAKE_FOURCC('I','4','2','0'))
),
"width", GST_PROPS_INT_RANGE (16, 4096),
"height", GST_PROPS_INT_RANGE (16, 4096)
),
GST_CAPS_NEW (
- "avimux_sink_video_rgb",
- "video/raw",
- "format", GST_PROPS_FOURCC (GST_MAKE_FOURCC('R','G','B',' ')),
+ "avimux_sink_video_jpeg",
+ "video/x-jpeg",
+ "width", GST_PROPS_INT_RANGE (16, 4096),
+ "height", GST_PROPS_INT_RANGE (16, 4096)
+ ),
+ GST_CAPS_NEW (
+ "avimux_sink_video_divx",
+ "video/x-divx",
"width", GST_PROPS_INT_RANGE (16, 4096),
"height", GST_PROPS_INT_RANGE (16, 4096),
- "depth", GST_PROPS_LIST(
- GST_PROPS_INT(16),
- GST_PROPS_INT(16),
- GST_PROPS_INT(24),
- GST_PROPS_INT(32)
- ),
- "bpp", GST_PROPS_LIST(
- GST_PROPS_INT(15),
- GST_PROPS_INT(16),
- GST_PROPS_INT(24),
- GST_PROPS_INT(32)
- )
+ "divxversion", GST_PROPS_INT_RANGE (3, 5)
),
GST_CAPS_NEW (
- "avimux_sink_video_jpeg",
- "video/jpeg",
+ "avimux_sink_video_xvid",
+ "video/x-xvid",
"width", GST_PROPS_INT_RANGE (16, 4096),
"height", GST_PROPS_INT_RANGE (16, 4096)
),
GST_CAPS_NEW (
- "avimux_sink_video_divx",
- "video/divx",
+ "avimux_sink_video_3ivx",
+ "video/x-3ivx",
"width", GST_PROPS_INT_RANGE (16, 4096),
"height", GST_PROPS_INT_RANGE (16, 4096)
),
GST_CAPS_NEW (
- "avimux_sink_video_xvid",
- "video/xvid",
+ "avimux_sink_video_msmpeg",
+ "video/x-msmpeg",
+ "width", GST_PROPS_INT_RANGE (16, 4096),
+ "height", GST_PROPS_INT_RANGE (16, 4096),
+ "msmpegversion", GST_PROPS_INT_RANGE (41, 43)
+ ),
+ GST_CAPS_NEW (
+ "avimux_sink_video_mpeg",
+ "video/mpeg",
+ "width", GST_PROPS_INT_RANGE (16, 4096),
+ "height", GST_PROPS_INT_RANGE (16, 4096),
+ "mpegversion", GST_PROPS_INT (1),
+ "systemstream", GST_PROPS_BOOLEAN (FALSE)
+ ),
+ GST_CAPS_NEW (
+ "avimux_sink_video_h263",
+ "video/x-h263",
+ "width", GST_PROPS_INT_RANGE (16, 4096),
+ "height", GST_PROPS_INT_RANGE (16, 4096)
+ ),
+ GST_CAPS_NEW (
+ "avimux_sink_video_dv",
+ "video/x-dv",
+ "width", GST_PROPS_INT (720),
+ "height", GST_PROPS_LIST (
+ GST_PROPS_INT (576),
+ GST_PROPS_INT (480)
+ ),
+ "systemstream", GST_PROPS_BOOLEAN (FALSE)
+ ),
+ GST_CAPS_NEW (
+ "avimux_sink_video_hfyu",
+ "video/x-huffyuv",
"width", GST_PROPS_INT_RANGE (16, 4096),
"height", GST_PROPS_INT_RANGE (16, 4096)
)
@@ -143,15 +162,8 @@ GST_PAD_TEMPLATE_FACTORY (audio_sink_factory,
GST_PAD_SINK,
GST_PAD_REQUEST,
GST_CAPS_NEW (
- "avimux_sink_audio",
- "video/avi",
- "format", GST_PROPS_STRING ("strf_auds")
- ),
- GST_CAPS_NEW (
- "avimux_sink_audio",
- "audio/raw",
- "format", GST_PROPS_STRING ("int"),
- "law", GST_PROPS_INT (0),
+ "avimux_sink_audio_raw",
+ "audio/x-raw-int",
"endianness", GST_PROPS_INT (G_LITTLE_ENDIAN),
"signed", GST_PROPS_LIST (
GST_PROPS_BOOLEAN (TRUE),
@@ -165,18 +177,27 @@ GST_PAD_TEMPLATE_FACTORY (audio_sink_factory,
GST_PROPS_INT (8),
GST_PROPS_INT (16)
),
- "rate", GST_PROPS_INT_RANGE (1000, 48000),
+ "rate", GST_PROPS_INT_RANGE (1000, 96000),
+ "channels", GST_PROPS_INT_RANGE (1, 2)
+ ),
+ GST_CAPS_NEW (
+ "avimux_sink_audio_mpeg",
+ "audio/mpeg",
+ "layer", GST_PROPS_INT_RANGE (1, 3),
+ "rate", GST_PROPS_INT_RANGE (1000, 96000),
"channels", GST_PROPS_INT_RANGE (1, 2)
),
GST_CAPS_NEW (
- "avimux_sink_audio",
- "audio/x-mp3",
- NULL
+ "avimux_sink_audio_vorbis",
+ "audio/x-vorbis",
+ "rate", GST_PROPS_INT_RANGE (1000, 96000),
+ "channels", GST_PROPS_INT_RANGE (1, 2)
),
GST_CAPS_NEW (
- "avimux_sink_audio",
- "application/x-ogg",
- NULL
+ "avimux_sink_audio_ac3",
+ "audio/x-ac3",
+ "rate", GST_PROPS_INT_RANGE (1000, 96000),
+ "channels", GST_PROPS_INT_RANGE (1, 6)
)
)
@@ -237,7 +258,8 @@ gst_avimux_class_init (GstAviMuxClass *klass)
parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_BIGFILE,
- g_param_spec_boolean("bigfile","Bigfile Support","Whether to capture large or small AVI files",
+ g_param_spec_boolean("bigfile","Bigfile Support",
+ "Support for openDML-2.0 (big) AVI files",
0,G_PARAM_READWRITE));
gstelement_class->request_new_pad = gst_avimux_request_new_pad;
@@ -300,7 +322,7 @@ gst_avimux_init (GstAviMux *avimux)
}
static GstPadLinkReturn
-gst_avimux_sinkconnect (GstPad *pad, GstCaps *vscaps)
+gst_avimux_vidsinkconnect (GstPad *pad, GstCaps *vscaps)
{
GstAviMux *avimux;
GstCaps *caps;
@@ -311,170 +333,188 @@ gst_avimux_sinkconnect (GstPad *pad, GstCaps *vscaps)
if (!GST_CAPS_IS_FIXED (vscaps))
return GST_PAD_LINK_DELAYED;
- GST_DEBUG ("avimux: sinkconnect triggered on %s", gst_pad_get_name (pad));
+ GST_DEBUG ("avimux: video sinkconnect triggered on %s",
+ gst_pad_get_name (pad));
for (caps = vscaps; caps != NULL; caps = vscaps = vscaps->next)
{
const gchar* mimetype = gst_caps_get_mime(caps);
-
- if (!strcmp (mimetype, "video/avi"))
- {
- const gchar* format;
-
- gst_caps_get_string (caps, "format", &format);
-
- if (!strncmp (format, "strf_vids", 9)) {
- avimux->vids.size = sizeof(gst_riff_strf_vids);
- gst_caps_get (caps,
- "width", &avimux->vids.width,
- "height", &avimux->vids.height,
- "planes", &avimux->vids.planes,
- "bit_cnt", &avimux->vids.bit_cnt,
- "compression", &avimux->vids.compression,
- "image_size", &avimux->vids.image_size,
- "xpels_meter", &avimux->vids.xpels_meter,
- "ypels_meter", &avimux->vids.ypels_meter,
- "num_colors", &avimux->vids.num_colors,
- "imp_colors", &avimux->vids.imp_colors,
- NULL);
- avimux->vids_hdr.fcc_handler = avimux->vids.compression;
- avimux->avi_hdr.width = avimux->vids.width;
- avimux->avi_hdr.height = avimux->vids.height;
- goto done;
- }
- else if (!strncmp (format, "strf_auds", 9)) {
- gst_caps_get (caps,
- "format", &avimux->auds.format,
- "channels", &avimux->auds.channels,
- "rate", &avimux->auds.rate,
- "av_bps", &avimux->auds.av_bps,
- "blockalign", &avimux->auds.blockalign,
- "size", &avimux->auds.size,
- NULL);
- avimux->auds_hdr.samplesize = avimux->auds_hdr.scale = avimux->auds.blockalign;
- avimux->auds_hdr.rate = avimux->auds.av_bps;
- goto done;
- }
- }
- else if (!strcmp (mimetype, "video/raw"))
+ gfloat fps = 0.;
+
+ /* global */
+ avimux->vids.size = sizeof(gst_riff_strf_vids);
+ avimux->vids.planes = 1;
+ gst_caps_get (caps, "width", &avimux->vids.width,
+ "height", &avimux->vids.height,
+ "framerate", &fps,
+ NULL);
+ if (fps != 0.)
+ avimux->vids_hdr.scale = avimux->vids_hdr.rate / fps;
+
+ if (!strcmp (mimetype, "video/x-raw-yuv"))
{
guint32 format;
- gint temp;
gst_caps_get_fourcc_int (caps, "format", &format);
+ avimux->vids.compression = format;
switch (format)
{
case GST_MAKE_FOURCC('Y','U','Y','2'):
+ avimux->vids.bit_cnt = 16;
+ break;
case GST_MAKE_FOURCC('I','4','2','0'):
- case GST_MAKE_FOURCC('Y','4','1','P'):
- case GST_MAKE_FOURCC('R','G','B',' '):
- avimux->vids.size = sizeof(gst_riff_strf_vids);
- gst_caps_get (caps, "width", &avimux->vids.width,
- "height", &avimux->vids.height, NULL);
- avimux->vids.planes = 1;
- switch (format)
- {
- case GST_MAKE_FOURCC('Y','U','Y','2'):
- avimux->vids.bit_cnt = 16; /* YUY2 */
- break;
- case GST_MAKE_FOURCC('R','G','B',' '):
- gst_caps_get_int (caps, "bpp", &temp); /* RGB */
- avimux->vids.bit_cnt = temp;
- break;
- case GST_MAKE_FOURCC('Y','4','1','P'):
- case GST_MAKE_FOURCC('I','4','2','0'):
- avimux->vids.bit_cnt = 12; /* Y41P or I420 */
- break;
- }
- gst_caps_get_fourcc_int(caps, "format", &avimux->vids.compression);
- avimux->vids_hdr.fcc_handler = avimux->vids.compression;
- avimux->vids.image_size = avimux->vids.height * avimux->vids.width;
- avimux->avi_hdr.width = avimux->vids.width;
- avimux->avi_hdr.height = avimux->vids.height;
- goto done;
- default:
+ avimux->vids.bit_cnt = 12;
break;
}
+
+ goto done;
}
- else if (!strcmp (mimetype, "video/jpeg") ||
- !strcmp (mimetype, "video/xvid") ||
- !strcmp (mimetype, "video/divx"))
+ else
{
- avimux->vids.size = sizeof(gst_riff_strf_vids);
- gst_caps_get (caps, "width", &avimux->vids.width,
- "height", &avimux->vids.height, NULL);
- avimux->vids.planes = 1;
- avimux->vids.bit_cnt = 24;
+ avimux->vids.bit_cnt = 24;
+ avimux->vids.compression = 0;
- if (!strcmp (mimetype, "video/jpeg"))
+ /* find format */
+ if (!strcmp (mimetype, "video/x-huffyuv")) {
+ avimux->vids.compression = GST_MAKE_FOURCC('H','F','Y','U');
+ } else if (!strcmp (mimetype, "video/x-jpeg")) {
avimux->vids.compression = GST_MAKE_FOURCC('M','J','P','G');
- else if (!strcmp (mimetype, "video/divx"))
- avimux->vids.compression = GST_MAKE_FOURCC('D','I','V','X');
- else if (!strcmp (mimetype, "video/xvid"))
+ } else if (!strcmp (mimetype, "video/x-divx")) {
+ gint divxversion;
+ gst_caps_get_int (caps, "divxversion", &divxversion);
+ switch (divxversion) {
+ case 3:
+ avimux->vids.compression = GST_MAKE_FOURCC('D','I','V','3');
+ break;
+ case 4:
+ avimux->vids.compression = GST_MAKE_FOURCC('D','I','V','X');
+ break;
+ case 5:
+ avimux->vids.compression = GST_MAKE_FOURCC('D','X','5','0');
+ break;
+ }
+ } else if (!strcmp (mimetype, "video/x-xvid")) {
avimux->vids.compression = GST_MAKE_FOURCC('X','V','I','D');
+ } else if (!strcmp (mimetype, "video/x-3ivx")) {
+ avimux->vids.compression = GST_MAKE_FOURCC('3','I','V','2');
+ } else if (!strcmp (mimetype, "video/x-msmpeg")) {
+ gint msmpegversion;
+ gst_caps_get_int (caps, "msmpegversion", &msmpegversion);
+ switch (msmpegversion) {
+ case 41:
+ avimux->vids.compression = GST_MAKE_FOURCC('M','P','G','4');
+ break;
+ case 42:
+ avimux->vids.compression = GST_MAKE_FOURCC('M','P','4','2');
+ break;
+ case 43:
+ avimux->vids.compression = GST_MAKE_FOURCC('M','P','4','3');
+ break;
+ }
+ } else if (!strcmp (mimetype, "video/x-dv")) {
+ avimux->vids.compression = GST_MAKE_FOURCC('D','V','S','D');
+ } else if (!strcmp (mimetype, "video/x-h263")) {
+ avimux->vids.compression = GST_MAKE_FOURCC('H','2','6','3');
+ } else if (!strcmp (mimetype, "video/mpeg")) {
+ avimux->vids.compression = GST_MAKE_FOURCC('M','P','E','G');
+ }
+
+ if (!avimux->vids.compression) {
+ continue;
+ }
- avimux->vids_hdr.fcc_handler = avimux->vids.compression;
- avimux->avi_hdr.width = avimux->vids.width;
- avimux->avi_hdr.height = avimux->vids.height;
- avimux->vids.image_size = avimux->vids.height * avimux->vids.width;
goto done;
}
- else if (!strcmp (mimetype, "audio/raw"))
- {
- gint width;
+ }
+ return GST_PAD_LINK_REFUSED;
+
+done:
+ avimux->vids_hdr.fcc_handler = avimux->vids.compression;
+ avimux->vids.image_size = avimux->vids.height * avimux->vids.width;
+ avimux->avi_hdr.width = avimux->vids.width;
+ avimux->avi_hdr.height = avimux->vids.height;
+ avimux->avi_hdr.us_frame = avimux->vids_hdr.scale;
+ return GST_PAD_LINK_OK;
+}
+static GstPadLinkReturn
+gst_avimux_audsinkconnect (GstPad *pad, GstCaps *vscaps)
+{
+ GstAviMux *avimux;
+ GstCaps *caps;
+
+ avimux = GST_AVIMUX (gst_pad_get_parent (pad));
+
+ /* we are not going to act on variable caps */
+ if (!GST_CAPS_IS_FIXED (vscaps))
+ return GST_PAD_LINK_DELAYED;
+
+ GST_DEBUG ("avimux: audio sinkconnect triggered on %s",
+ gst_pad_get_name (pad));
+
+ for (caps = vscaps; caps != NULL; caps = vscaps = vscaps->next)
+ {
+ const gchar* mimetype = gst_caps_get_mime(caps);
+
+ /* we want these for all */
+ gst_caps_get (caps, "channels", &avimux->auds.channels,
+ "rate", &avimux->auds.rate,
+ NULL);
+
+ if (!strcmp (mimetype, "audio/x-raw-int"))
+ {
avimux->auds.format = GST_RIFF_WAVE_FORMAT_PCM;
- gst_caps_get (caps, "channels", &avimux->auds.channels,
- "rate", &avimux->auds.rate,
- "width", &width,
+
+ gst_caps_get (caps, "width", &avimux->auds.blockalign,
"depth", &avimux->auds.size,
NULL);
- avimux->auds_hdr.rate = avimux->auds.av_bps = width * avimux->auds.rate * avimux->auds.channels / 8;
- avimux->auds_hdr.samplesize = avimux->auds_hdr.scale = avimux->auds.blockalign = width * avimux->auds.channels/8;
+
+ /* set some more info straight */
+ avimux->auds.blockalign /= 8;
+ avimux->auds.blockalign *= avimux->auds.channels;
+ avimux->auds.av_bps = avimux->auds.blockalign * avimux->auds.rate;
goto done;
}
- else if (!strcmp (mimetype, "audio/x-mp3"))
+ else if (!strcmp (mimetype, "audio/mpeg") ||
+ !strcmp (mimetype, "audio/x-vorbis") ||
+ !strcmp (mimetype, "audio/x-ac3"))
{
- gint layer = 3;
+ avimux->auds.format = 0;
- if (GST_CAPS_PROPERTIES(caps) != NULL &&
- gst_caps_has_property(caps, "layer"))
+ if (!strcmp (mimetype, "audio/mpeg")) {
+ gint layer = 3;
gst_caps_get_int(caps, "layer", &layer);
- else
- GST_DEBUG (
- "No layer specified, assuming layer 3");
-
- /* we don't need to do anything here, compressed mp3 contains it all */
- avimux->auds.format = (layer == 3?
- GST_RIFF_WAVE_FORMAT_MPEGL3 :
- GST_RIFF_WAVE_FORMAT_MPEGL12);
- avimux->auds_hdr.scale = avimux->auds_hdr.samplesize =
- avimux->auds.blockalign = 1;
- avimux->auds_hdr.rate = avimux->auds.av_bps = 0;
- avimux->auds.size = 16;
- /* nobody cares about this valus, but is has to be set (regardless of
- * whether the value is correct) */
- avimux->auds.channels = 1;
- /* we'll request this later on from the earlier pads */
- avimux->auds.rate = 0;
- goto done;
- }
- else if (!strcmp (mimetype, "application/x-ogg"))
- {
- avimux->auds.format = GST_RIFF_WAVE_FORMAT_VORBIS1;
- avimux->auds_hdr.scale = avimux->auds_hdr.samplesize =
- avimux->auds.blockalign = 1;
- avimux->auds_hdr.rate = avimux->auds.av_bps = 0;
+ switch (layer) {
+ case 3:
+ avimux->auds.format = GST_RIFF_WAVE_FORMAT_MPEGL3;
+ break;
+ case 1: case 2:
+ avimux->auds.format = GST_RIFF_WAVE_FORMAT_MPEGL12;
+ break;
+ }
+ } else if (!strcmp (mimetype, "audio/x-vorbis")) {
+ avimux->auds.format = GST_RIFF_WAVE_FORMAT_VORBIS3;
+ } else if (!strcmp (mimetype, "audio/x-ac3")) {
+ avimux->auds.format = GST_RIFF_WAVE_FORMAT_A52;
+ }
+
+ avimux->auds.blockalign = 1;
+ avimux->auds.av_bps = 0;
avimux->auds.size = 16;
- /* see above */
- avimux->auds.channels = 1;
- avimux->auds.rate = 0;
+
+ if (!avimux->auds.format) {
+ continue;
+ }
+
goto done;
}
}
return GST_PAD_LINK_REFUSED;
done:
+ avimux->auds_hdr.rate = avimux->auds.blockalign * avimux->auds.rate;
+ avimux->auds_hdr.samplesize = avimux->auds.blockalign;
+ avimux->auds_hdr.scale = avimux->auds.blockalign;
return GST_PAD_LINK_OK;
}
@@ -552,11 +592,13 @@ gst_avimux_request_new_pad (GstElement *element,
if (templ == GST_PAD_TEMPLATE_GET (audio_sink_factory)) {
g_return_val_if_fail(avimux->audiosinkpad == NULL, NULL);
newpad = gst_pad_new_from_template (templ, "audio_00");
+ gst_pad_set_link_function (newpad, gst_avimux_audsinkconnect);
avimux->audiosinkpad = newpad;
}
else if (templ == GST_PAD_TEMPLATE_GET (video_sink_factory)) {
g_return_val_if_fail(avimux->videosinkpad == NULL, NULL);
newpad = gst_pad_new_from_template (templ, "video_00");
+ gst_pad_set_link_function (newpad, gst_avimux_vidsinkconnect);
avimux->videosinkpad = newpad;
}
else {
@@ -568,7 +610,6 @@ gst_avimux_request_new_pad (GstElement *element,
G_CALLBACK(gst_avimux_pad_link), (gpointer)avimux);
g_signal_connect(newpad, "unlinked",
G_CALLBACK(gst_avimux_pad_unlink), (gpointer)avimux);
- gst_pad_set_link_function (newpad, gst_avimux_sinkconnect);
gst_element_add_pad (element, newpad);
gst_pad_set_event_function(newpad, gst_avimux_handle_event);
gst_pad_set_event_mask_function(newpad, gst_avimux_get_event_masks);
@@ -997,25 +1038,12 @@ gst_avimux_stop_file (GstAviMux *avimux)
avimux->avi_hdr.tot_frames = avimux->num_frames;
if (avimux->video_pad_connected) {
avimux->vids_hdr.length = avimux->num_frames;
-
- /* get fps */
- framerate = gst_video_frame_rate(GST_PAD_PEER(avimux->videosinkpad));
- avimux->vids_hdr.scale = 1000000 / framerate;
}
- if (avimux->audio_pad_connected)
- {
- if (avimux->auds_hdr.scale)
- avimux->auds_hdr.length = avimux->audio_size/(avimux->auds.channels*avimux->auds.size/8);
- else
- avimux->auds_hdr.length = 0; /* urm...? FIXME! ;-) */
-
- /* sampling rate, if known - yes this is a hack */
- if (!avimux->auds.rate)
- avimux->auds.rate = gst_video_frame_rate(GST_PAD_PEER(avimux->audiosinkpad));
+ if (avimux->audio_pad_connected) {
+ avimux->auds_hdr.length = avimux->audio_size/avimux->auds.blockalign;
}
/* set rate and everything having to do with that */
- avimux->avi_hdr.us_frame = avimux->vids_hdr.scale;
avimux->avi_hdr.max_bps = 0;
if (avimux->audio_pad_connected) {
/* calculate bps if needed */
diff --git a/gst/cutter/gstcutter.c b/gst/cutter/gstcutter.c
index e902894c..071fdf1c 100644
--- a/gst/cutter/gstcutter.c
+++ b/gst/cutter/gstcutter.c
@@ -58,10 +58,15 @@ GST_PAD_TEMPLATE_FACTORY (cutter_src_factory,
"src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
- GST_CAPS_NEW (
- "test_src",
- "audio/raw",
- "channels", GST_PROPS_INT_RANGE (1, 2)
+ gst_caps_new (
+ "cutter_src_int",
+ "audio/x-raw-int",
+ GST_AUDIO_INT_PAD_TEMPLATE_PROPS
+ ),
+ gst_caps_new (
+ "cutter_src_float",
+ "audio/x-raw-float",
+ GST_AUDIO_INT_PAD_TEMPLATE_PROPS
)
);
@@ -69,10 +74,15 @@ GST_PAD_TEMPLATE_FACTORY (cutter_sink_factory,
"sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
- GST_CAPS_NEW (
- "test_src",
- "audio/raw",
- "channels", GST_PROPS_INT_RANGE (1, 2)
+ gst_caps_new (
+ "cutter_sink_int",
+ "audio/x-raw-int",
+ GST_AUDIO_INT_PAD_TEMPLATE_PROPS
+ ),
+ gst_caps_new (
+ "cutter_sink_float",
+ "audio/x-raw-float",
+ GST_AUDIO_INT_PAD_TEMPLATE_PROPS
)
);
@@ -126,7 +136,7 @@ gst_cutter_link (GstPad *pad, GstCaps *caps)
otherpad = (pad == filter->srcpad ? filter->sinkpad : filter->srcpad);
if (GST_CAPS_IS_FIXED (caps))
- return gst_pad_try_set_caps (otherpad, caps);
+ return gst_pad_try_set_caps (otherpad, gst_caps_ref (caps));
return GST_PAD_LINK_DELAYED;
}
@@ -198,7 +208,7 @@ gst_cutter_init (GstCutter *filter)
gst_pad_set_link_function (filter->sinkpad, gst_cutter_link);
filter->srcpad = gst_pad_new ("src", GST_PAD_SRC);
gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad);
- gst_pad_set_link_function (filter->srcpad, gst_cutter_link);
+ /*gst_pad_set_link_function (filter->srcpad, gst_cutter_link);*/
}
static void
diff --git a/gst/effectv/gstaging.c b/gst/effectv/gstaging.c
index d427a1e3..5967e478 100644
--- a/gst/effectv/gstaging.c
+++ b/gst/effectv/gstaging.c
@@ -169,7 +169,7 @@ gst_agingtv_sinkconnect (GstPad * pad, GstCaps * caps)
filter->aging_mode = 0;
aging_mode_switch (filter);
- return gst_pad_try_set_caps (filter->srcpad, caps);
+ return gst_pad_try_set_caps (filter->srcpad, gst_caps_ref (caps));
}
static void
diff --git a/gst/effectv/gstdice.c b/gst/effectv/gstdice.c
index a9fabd26..50c5b081 100644
--- a/gst/effectv/gstdice.c
+++ b/gst/effectv/gstdice.c
@@ -175,7 +175,7 @@ gst_dicetv_sinkconnect (GstPad * pad, GstCaps * caps)
filter->dicemap = (gchar *) g_malloc (filter->height * filter->width * sizeof(char));
gst_dicetv_create_map (filter);
- return gst_pad_try_set_caps (filter->srcpad, caps);
+ return gst_pad_try_set_caps (filter->srcpad, gst_caps_ref (caps));
}
static void
diff --git a/gst/effectv/gstedge.c b/gst/effectv/gstedge.c
index f169c249..16cf9781 100644
--- a/gst/effectv/gstedge.c
+++ b/gst/effectv/gstedge.c
@@ -153,7 +153,7 @@ gst_edgetv_sinkconnect (GstPad * pad, GstCaps * caps)
filter->map = (guint32 *)g_malloc (filter->map_width * filter->map_height * sizeof(guint32) * 2);
bzero(filter->map, filter->map_width * filter->map_height * sizeof(guint32) * 2);
- return gst_pad_try_set_caps (filter->srcpad, caps);
+ return gst_pad_try_set_caps (filter->srcpad, gst_caps_ref (caps));
}
static void
diff --git a/gst/effectv/gsteffectv.c b/gst/effectv/gsteffectv.c
index d79c0eaa..50979086 100644
--- a/gst/effectv/gsteffectv.c
+++ b/gst/effectv/gsteffectv.c
@@ -23,6 +23,7 @@
#include <string.h>
#include <gst/gst.h>
+#include <gst/video/video.h>
#include "gsteffectv.h"
@@ -55,18 +56,10 @@ gst_effectv_src_factory (void)
"src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
- GST_CAPS_NEW (
+ gst_caps_new (
"effectv_src",
- "video/raw",
- "format", GST_PROPS_FOURCC (GST_STR_FOURCC ("RGB ")),
- "bpp", GST_PROPS_INT (32),
- "depth", GST_PROPS_INT (32),
- "endianness", GST_PROPS_INT (G_BYTE_ORDER),
- "red_mask", GST_PROPS_INT (0xff0000),
- "green_mask", GST_PROPS_INT (0xff00),
- "blue_mask", GST_PROPS_INT (0xff),
- "width", GST_PROPS_INT_RANGE (16, 4096),
- "height", GST_PROPS_INT_RANGE (16, 4096)
+ "video/x-raw-rgb",
+ GST_VIDEO_RGB_PAD_TEMPLATE_PROPS_32
)
);
}
@@ -82,18 +75,10 @@ gst_effectv_sink_factory (void)
"sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
- GST_CAPS_NEW (
+ gst_caps_new (
"effectv_sink",
- "video/raw",
- "format", GST_PROPS_FOURCC (GST_STR_FOURCC ("RGB ")),
- "bpp", GST_PROPS_INT (32),
- "depth", GST_PROPS_INT (32),
- "endianness", GST_PROPS_INT (G_BYTE_ORDER),
- "red_mask", GST_PROPS_INT (0xff0000),
- "green_mask", GST_PROPS_INT (0xff00),
- "blue_mask", GST_PROPS_INT (0xff),
- "width", GST_PROPS_INT_RANGE (16, 4096),
- "height", GST_PROPS_INT_RANGE (16, 4096)
+ "video/x-raw-rgb",
+ GST_VIDEO_RGB_PAD_TEMPLATE_PROPS_32
)
);
}
diff --git a/gst/effectv/gstquark.c b/gst/effectv/gstquark.c
index 12aacb52..b520aa77 100644
--- a/gst/effectv/gstquark.c
+++ b/gst/effectv/gstquark.c
@@ -180,7 +180,7 @@ gst_quarktv_sinkconnect (GstPad * pad, GstCaps * caps)
filter->planetable[i] = NULL;
}
- return gst_pad_try_set_caps (filter->srcpad, caps);
+ return gst_pad_try_set_caps (filter->srcpad, gst_caps_ref (caps));
}
static void
diff --git a/gst/effectv/gstrev.c b/gst/effectv/gstrev.c
index 88b3a8b8..bfb2975b 100644
--- a/gst/effectv/gstrev.c
+++ b/gst/effectv/gstrev.c
@@ -184,7 +184,7 @@ gst_revtv_sinkconnect (GstPad * pad, GstCaps * caps)
gst_caps_get_int (caps, "width", &filter->width);
gst_caps_get_int (caps, "height", &filter->height);
- return gst_pad_try_set_caps (filter->srcpad, caps);
+ return gst_pad_try_set_caps (filter->srcpad, gst_caps_ref (caps));
}
static void
diff --git a/gst/effectv/gstshagadelic.c b/gst/effectv/gstshagadelic.c
index f97fdae6..84d681e9 100644
--- a/gst/effectv/gstshagadelic.c
+++ b/gst/effectv/gstshagadelic.c
@@ -165,7 +165,7 @@ gst_shagadelictv_sinkconnect (GstPad * pad, GstCaps * caps)
gst_shagadelic_initialize (filter);
- return gst_pad_try_set_caps (filter->srcpad, caps);
+ return gst_pad_try_set_caps (filter->srcpad, gst_caps_ref (caps));
}
static void
diff --git a/gst/effectv/gstvertigo.c b/gst/effectv/gstvertigo.c
index 0216690b..d1bd5cc5 100644
--- a/gst/effectv/gstvertigo.c
+++ b/gst/effectv/gstvertigo.c
@@ -199,7 +199,7 @@ gst_vertigotv_sinkconnect (GstPad * pad, GstCaps * caps)
filter->alt_buffer = filter->buffer + area;
filter->phase = 0;
- return gst_pad_try_set_caps (filter->srcpad, caps);
+ return gst_pad_try_set_caps (filter->srcpad, gst_caps_ref (caps));
}
static void
diff --git a/gst/effectv/gstwarp.c b/gst/effectv/gstwarp.c
index d08c2656..c098ab62 100644
--- a/gst/effectv/gstwarp.c
+++ b/gst/effectv/gstwarp.c
@@ -163,7 +163,7 @@ gst_warptv_sinkconnect (GstPad * pad, GstCaps * caps)
gst_warptv_initialize (filter);
- return gst_pad_try_set_caps (filter->srcpad, caps);
+ return gst_pad_try_set_caps (filter->srcpad, gst_caps_ref (caps));
}
static void
diff --git a/gst/flx/gstflxdec.c b/gst/flx/gstflxdec.c
index 0f4fac18..b14a701e 100644
--- a/gst/flx/gstflxdec.c
+++ b/gst/flx/gstflxdec.c
@@ -24,6 +24,7 @@
#include "flx_fmt.h"
#include "gstflxdec.h"
+#include <gst/video/video.h>
#define JIFFIE (GST_SECOND/70)
@@ -64,7 +65,7 @@ GST_PAD_TEMPLATE_FACTORY (sink_factory,
GST_PAD_ALWAYS,
GST_CAPS_NEW (
"flxdec_sink",
- "video/fli",
+ "video/x-fli",
NULL
)
)
@@ -76,16 +77,16 @@ GST_PAD_TEMPLATE_FACTORY (src_video_factory,
GST_PAD_ALWAYS,
GST_CAPS_NEW (
"src_video",
- "video/raw",
- "format", GST_PROPS_FOURCC (GST_MAKE_FOURCC ('R', 'G', 'B', ' ')),
+ "video/x-raw-rgb",
"bpp", GST_PROPS_INT (32),
"depth", GST_PROPS_INT (32),
- "endianness", GST_PROPS_INT (G_LITTLE_ENDIAN),
- "red_mask", GST_PROPS_INT (0x00ff0000),
- "green_mask", GST_PROPS_INT (0x0000ff00),
- "blue_mask", GST_PROPS_INT (0x000000ff),
+ "endianness", GST_PROPS_INT (G_BIG_ENDIAN),
+ "red_mask", GST_PROPS_INT (R_MASK_32),
+ "green_mask", GST_PROPS_INT (G_MASK_32),
+ "blue_mask", GST_PROPS_INT (B_MASK_32),
"width", GST_PROPS_INT_RANGE(320, 1280),
- "height", GST_PROPS_INT_RANGE(200, 1024)
+ "height", GST_PROPS_INT_RANGE(200, 1024),
+ "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT)
)
)
@@ -520,20 +521,18 @@ gst_flxdec_loop (GstElement *element)
}
gst_pad_try_set_caps (flxdec->srcpad,
- gst_caps_new (
+ GST_CAPS_NEW (
"src_video",
- "video/raw",
- gst_props_new (
- "format", GST_PROPS_FOURCC (GST_MAKE_FOURCC ('R', 'G', 'B', ' ')),
- "bpp", GST_PROPS_INT (32),
- "depth", GST_PROPS_INT (32),
- "endianness", GST_PROPS_INT (G_LITTLE_ENDIAN),
- "red_mask", GST_PROPS_INT (0x00ff0000),
- "green_mask", GST_PROPS_INT (0x0000ff00),
- "blue_mask", GST_PROPS_INT (0x000000ff),
- "width", GST_PROPS_INT (flxh->width),
- "height", GST_PROPS_INT (flxh->height),
- NULL)));
+ "video/x-raw-rgb",
+ "bpp", GST_PROPS_INT (32),
+ "depth", GST_PROPS_INT (32),
+ "endianness", GST_PROPS_INT (G_BIG_ENDIAN),
+ "red_mask", GST_PROPS_INT (R_MASK_32),
+ "green_mask", GST_PROPS_INT (G_MASK_32),
+ "blue_mask", GST_PROPS_INT (B_MASK_32),
+ "width", GST_PROPS_INT (flxh->width),
+ "height", GST_PROPS_INT (flxh->height),
+ "framerate", GST_PROPS_FLOAT (GST_SECOND/flxdec->frame_time)));
if (flxh->depth <= 8)
flxdec->converter = flx_colorspace_converter_new(flxh->width, flxh->height);
diff --git a/gst/goom/gstgoom.c b/gst/goom/gstgoom.c
index 72757990..cbafd016 100644
--- a/gst/goom/gstgoom.c
+++ b/gst/goom/gstgoom.c
@@ -22,7 +22,7 @@
#endif
#include <config.h>
#include <gst/gst.h>
-
+#include <gst/video/video.h>
#include "goom_core.h"
#define GST_TYPE_GOOM (gst_goom_get_type())
@@ -45,7 +45,7 @@ struct _GstGOOM {
gint16 datain[2][512];
/* video state */
- gint fps;
+ gfloat fps;
gint width;
gint height;
gint channels;
@@ -78,9 +78,6 @@ enum {
enum {
ARG_0,
- ARG_WIDTH,
- ARG_HEIGHT,
- ARG_FPS,
/* FILL ME */
};
@@ -88,31 +85,21 @@ GST_PAD_TEMPLATE_FACTORY (src_template,
"src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
- GST_CAPS_NEW (
+ gst_caps_new (
"goomsrc",
- "video/raw",
- "format", GST_PROPS_FOURCC (GST_STR_FOURCC ("RGB ")),
- "bpp", GST_PROPS_INT (32),
- "depth", GST_PROPS_INT (32),
- "endianness", GST_PROPS_INT (G_BYTE_ORDER),
- "red_mask", GST_PROPS_INT (0xff0000),
- "green_mask", GST_PROPS_INT (0xff00),
- "blue_mask", GST_PROPS_INT (0xff),
- "width", GST_PROPS_INT_RANGE (16, 4096),
- "height", GST_PROPS_INT_RANGE (16, 4096)
+ "video/x-raw-rgb",
+ GST_VIDEO_RGB_PAD_TEMPLATE_PROPS_32
)
)
GST_PAD_TEMPLATE_FACTORY (sink_template,
- "sink", /* the name of the pads */
+ "sink", /* the name of the pads */
GST_PAD_SINK, /* type of the pad */
- GST_PAD_ALWAYS, /* ALWAYS/SOMETIMES */
+ GST_PAD_ALWAYS, /* ALWAYS/SOMETIMES */
GST_CAPS_NEW (
"goomsink", /* the name of the caps */
- "audio/raw", /* the mime type of the caps */
+ "audio/x-raw-int", /* the mime type of the caps */
/* Properties follow: */
- "format", GST_PROPS_STRING ("int"),
- "law", GST_PROPS_INT (0),
"endianness", GST_PROPS_INT (G_BYTE_ORDER),
"signed", GST_PROPS_BOOLEAN (TRUE),
"width", GST_PROPS_INT (16),
@@ -130,11 +117,6 @@ static void gst_goom_dispose (GObject *object);
static GstElementStateReturn
gst_goom_change_state (GstElement *element);
-static void gst_goom_set_property (GObject *object, guint prop_id,
- const GValue *value, GParamSpec *pspec);
-static void gst_goom_get_property (GObject *object, guint prop_id,
- GValue *value, GParamSpec *pspec);
-
static void gst_goom_chain (GstPad *pad, GstBuffer *buf);
static GstPadLinkReturn gst_goom_sinkconnect (GstPad *pad, GstCaps *caps);
@@ -175,19 +157,7 @@ gst_goom_class_init(GstGOOMClass *klass)
parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
- g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_WIDTH,
- g_param_spec_int ("width","Width","The Width",
- 0, 2048, 320, G_PARAM_READWRITE));
- g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_HEIGHT,
- g_param_spec_int ("height","Height","The height",
- 0, 2048, 320, G_PARAM_READWRITE));
- g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FPS,
- g_param_spec_int ("fps","FPS","Frames per second",
- 1, 100, 25, G_PARAM_READWRITE));
-
gobject_class->dispose = gst_goom_dispose;
- gobject_class->set_property = gst_goom_set_property;
- gobject_class->get_property = gst_goom_get_property;
gstelement_class->change_state = gst_goom_change_state;
}
@@ -212,7 +182,7 @@ gst_goom_init (GstGOOM *goom)
goom->width = 320;
goom->height = 200;
- goom->fps = 25; /* desired frame rate */
+ goom->fps = 25.; /* desired frame rate */
goom->channels = 0;
/* set to something */
goom_init (50, 50);
@@ -251,8 +221,15 @@ gst_goom_srcconnect (GstPad *pad, GstCaps *caps)
return GST_PAD_LINK_DELAYED;
}
- gst_caps_get_int (caps, "width", &goom->width);
- gst_caps_get_int (caps, "height", &goom->height);
+ if (gst_caps_has_property_typed (caps, "width", GST_PROPS_INT_TYPE)) {
+ gst_caps_get_int (caps, "width", &goom->width);
+ }
+ if (gst_caps_has_property_typed (caps, "height", GST_PROPS_INT_TYPE)) {
+ gst_caps_get_int (caps, "height", &goom->height);
+ }
+ if (gst_caps_has_property_typed (caps, "framerate", GST_PROPS_FLOAT_TYPE)) {
+ gst_caps_get_float (caps, "framerate", &goom->fps);
+ }
goom_set_resolution (goom->width, goom->height);
goom->srcnegotiated = TRUE;
@@ -276,7 +253,8 @@ gst_goom_negotiate_default (GstGOOM *goom)
"green_mask", GST_PROPS_INT (0x00ff00),
"blue_mask", GST_PROPS_INT (0x0000ff),
"width", GST_PROPS_INT (goom->width),
- "height", GST_PROPS_INT (goom->height)
+ "height", GST_PROPS_INT (goom->height),
+ "framerate", GST_PROPS_FLOAT (goom->fps)
);
if (gst_pad_try_set_caps (goom->srcpad, caps) <= 0) {
@@ -401,54 +379,6 @@ gst_goom_change_state (GstElement *element)
return GST_STATE_SUCCESS;
}
-static void
-gst_goom_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
-{
- GstGOOM *goom;
-
- /* it's not null if we got it, but it might not be ours */
- g_return_if_fail (GST_IS_GOOM (object));
- goom = GST_GOOM (object);
-
- switch (prop_id) {
- case ARG_WIDTH:
- goom->width = g_value_get_int (value);
- break;
- case ARG_HEIGHT:
- goom->height = g_value_get_int (value);
- break;
- case ARG_FPS:
- goom->fps = g_value_get_int (value);
- break;
- default:
- break;
- }
-}
-
-static void
-gst_goom_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
-{
- GstGOOM *goom;
-
- /* it's not null if we got it, but it might not be ours */
- g_return_if_fail (GST_IS_GOOM (object));
- goom = GST_GOOM (object);
-
- switch (prop_id) {
- case ARG_WIDTH:
- g_value_set_int (value, goom->width);
- break;
- case ARG_HEIGHT:
- g_value_set_int (value, goom->height);
- break;
- case ARG_FPS:
- g_value_set_int (value, goom->fps);
- break;
- default:
- break;
- }
-}
-
static gboolean
plugin_init (GModule *module, GstPlugin *plugin)
{
diff --git a/gst/law/alaw-decode.c b/gst/law/alaw-decode.c
index 8236fa08..94cf6d05 100644
--- a/gst/law/alaw-decode.c
+++ b/gst/law/alaw-decode.c
@@ -86,9 +86,7 @@ alawdec_link (GstPad *pad, GstCaps *caps)
tempcaps = GST_CAPS_NEW (
"alawdec_src_caps",
- "audio/raw",
- "format", GST_PROPS_STRING ("int"),
- "law", GST_PROPS_INT (0),
+ "audio/x-raw-int",
"depth", GST_PROPS_INT (16),
"width", GST_PROPS_INT (16),
"signed", GST_PROPS_BOOLEAN (TRUE),
diff --git a/gst/law/alaw-encode.c b/gst/law/alaw-encode.c
index cff93c51..cd796886 100644
--- a/gst/law/alaw-encode.c
+++ b/gst/law/alaw-encode.c
@@ -126,9 +126,7 @@ alawenc_link (GstPad *pad, GstCaps *caps)
tempcaps = GST_CAPS_NEW (
"alawenc_src_caps",
- "audio/raw",
- "format", GST_PROPS_STRING ("int"),
- "law", GST_PROPS_INT (2),
+ "audio/x-alaw",
"depth", GST_PROPS_INT (8),
"width", GST_PROPS_INT (8),
"signed", GST_PROPS_BOOLEAN (FALSE),
diff --git a/gst/law/alaw.c b/gst/law/alaw.c
index 1e0c5b8b..02479281 100644
--- a/gst/law/alaw.c
+++ b/gst/law/alaw.c
@@ -32,14 +32,11 @@ alaw_factory (void)
return
gst_caps_new (
"test_src",
- "audio/raw",
+ "audio/x-alaw",
gst_props_new (
- "format", GST_PROPS_STRING ("int"),
- "law", GST_PROPS_INT (2),
- "width", GST_PROPS_INT(8),
- "depth", GST_PROPS_INT(8),
- "signed", GST_PROPS_BOOLEAN(FALSE),
- NULL));
+ "rate", GST_PROPS_INT_RANGE (8000, 192000),
+ "channels", GST_PROPS_INT_RANGE (1, 2),
+ NULL));
}
static GstCaps*
@@ -48,14 +45,14 @@ linear_factory (void)
return
gst_caps_new (
"test_sink",
- "audio/raw",
+ "audio/x-raw-int",
gst_props_new (
- "format", GST_PROPS_STRING ("int"),
- "law", GST_PROPS_INT(0),
- "width", GST_PROPS_INT(16),
- "depth", GST_PROPS_INT(16),
- "endianness", GST_PROPS_INT(G_BYTE_ORDER),
- "signed", GST_PROPS_BOOLEAN(TRUE),
+ "width", GST_PROPS_INT(16),
+ "depth", GST_PROPS_INT(16),
+ "endianness", GST_PROPS_INT(G_BYTE_ORDER),
+ "signed", GST_PROPS_BOOLEAN(TRUE),
+ "rate", GST_PROPS_INT_RANGE (8000, 192000),
+ "channels", GST_PROPS_INT_RANGE (1, 2),
NULL));
}
diff --git a/gst/law/mulaw-decode.c b/gst/law/mulaw-decode.c
index a7728665..abce597d 100644
--- a/gst/law/mulaw-decode.c
+++ b/gst/law/mulaw-decode.c
@@ -65,9 +65,7 @@ mulawdec_link (GstPad *pad, GstCaps *caps)
tempcaps = GST_CAPS_NEW (
"sinesrc_src_caps",
- "audio/raw",
- "format", GST_PROPS_STRING ("int"),
- "law", GST_PROPS_INT (0),
+ "audio/x-raw-int",
"depth", GST_PROPS_INT (16),
"width", GST_PROPS_INT (16),
"signed", GST_PROPS_BOOLEAN (TRUE),
diff --git a/gst/law/mulaw-encode.c b/gst/law/mulaw-encode.c
index d1eb8497..ec045db6 100644
--- a/gst/law/mulaw-encode.c
+++ b/gst/law/mulaw-encode.c
@@ -64,9 +64,7 @@ mulawenc_link (GstPad *pad, GstCaps *caps)
tempcaps = GST_CAPS_NEW (
"sinesrc_src_caps",
- "audio/raw",
- "format", GST_PROPS_STRING ("int"),
- "law", GST_PROPS_INT (1),
+ "audio/x-mulaw",
"depth", GST_PROPS_INT (8),
"width", GST_PROPS_INT (8),
"signed", GST_PROPS_BOOLEAN (FALSE),
diff --git a/gst/law/mulaw.c b/gst/law/mulaw.c
index d0c8bbdb..2b6bf7ab 100644
--- a/gst/law/mulaw.c
+++ b/gst/law/mulaw.c
@@ -32,13 +32,13 @@ mulaw_factory (void)
return
gst_caps_new (
"test_src",
- "audio/raw",
+ "audio/x-mulaw",
gst_props_new (
- "format", GST_PROPS_STRING ("int"),
- "law", GST_PROPS_INT (1),
- "width", GST_PROPS_INT(8),
- "depth", GST_PROPS_INT(8),
- "signed", GST_PROPS_BOOLEAN(FALSE),
+ "width", GST_PROPS_INT(8),
+ "depth", GST_PROPS_INT(8),
+ "signed", GST_PROPS_BOOLEAN(FALSE),
+ "rate", GST_PROPS_INT_RANGE (8000, 192000),
+ "channels", GST_PROPS_INT_RANGE (1, 2),
NULL));
}
@@ -48,14 +48,14 @@ linear_factory (void)
return
gst_caps_new (
"test_sink",
- "audio/raw",
+ "audio/x-raw-int",
gst_props_new (
- "format", GST_PROPS_STRING ("int"),
- "law", GST_PROPS_INT(0),
- "width", GST_PROPS_INT(16),
- "depth", GST_PROPS_INT(16),
- "signed", GST_PROPS_BOOLEAN(TRUE),
- "endianness", GST_PROPS_INT(G_BYTE_ORDER),
+ "width", GST_PROPS_INT(16),
+ "depth", GST_PROPS_INT(16),
+ "signed", GST_PROPS_BOOLEAN(TRUE),
+ "endianness", GST_PROPS_INT(G_BYTE_ORDER),
+ "rate", GST_PROPS_INT_RANGE (8000, 192000),
+ "channels", GST_PROPS_INT_RANGE (1, 2),
NULL));
}
diff --git a/gst/level/gstlevel.c b/gst/level/gstlevel.c
index 91ea46d4..ad4f1b15 100644
--- a/gst/level/gstlevel.c
+++ b/gst/level/gstlevel.c
@@ -23,6 +23,7 @@
#include <gst/gst.h>
#include "gstlevel.h"
#include "math.h"
+#include <gst/audio/audio.h>
/* elementfactory information */
static GstElementDetails level_details = {
@@ -58,11 +59,11 @@ level_src_factory (void)
GST_PAD_ALWAYS,
gst_caps_new (
"test_src",
- "audio/raw",
- gst_props_new (
- "channels", GST_PROPS_INT_RANGE (1, 2),
- NULL)),
- NULL);
+ "audio/x-raw-int",
+ GST_AUDIO_INT_PAD_TEMPLATE_PROPS
+ ),
+ NULL
+ );
}
return template;
}
@@ -79,11 +80,11 @@ level_sink_factory (void)
GST_PAD_ALWAYS,
gst_caps_new (
"test_src",
- "audio/raw",
- gst_props_new (
- "channels", GST_PROPS_INT_RANGE (1, 2),
- NULL)),
- NULL);
+ "audio/x-raw-int",
+ GST_AUDIO_INT_PAD_TEMPLATE_PROPS
+ ),
+ NULL
+ );
}
return template;
}
@@ -137,7 +138,7 @@ gst_level_connect (GstPad *pad, GstCaps *caps)
if (GST_CAPS_IS_FIXED (caps))
{
/*if ( !volume_parse_caps (filter, caps) || */
- return gst_pad_try_set_caps (otherpad, caps);
+ return gst_pad_try_set_caps (otherpad, gst_caps_ref (caps));
}
return GST_PAD_LINK_DELAYED;
}
diff --git a/gst/median/gstmedian.c b/gst/median/gstmedian.c
index e1e84b25..3b146b4d 100644
--- a/gst/median/gstmedian.c
+++ b/gst/median/gstmedian.c
@@ -22,6 +22,7 @@
#endif
#include <string.h>
#include <gstmedian.h>
+#include <gst/video/video.h>
/* elementfactory information */
static GstElementDetails median_details = {
@@ -38,10 +39,12 @@ GST_PAD_TEMPLATE_FACTORY (median_src_factory,
"src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
- GST_CAPS_NEW (
+ gst_caps_new (
"median_src",
- "video/raw",
- "format", GST_PROPS_FOURCC (GST_STR_FOURCC ("I420"))
+ "video/x-raw-yuv",
+ GST_VIDEO_YUV_PAD_TEMPLATE_PROPS (
+ GST_PROPS_FOURCC (GST_STR_FOURCC ("I420"))
+ )
)
)
@@ -49,10 +52,12 @@ GST_PAD_TEMPLATE_FACTORY (median_sink_factory,
"sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
- GST_CAPS_NEW (
- "median_src",
- "video/raw",
- "format", GST_PROPS_FOURCC (GST_STR_FOURCC ("I420"))
+ gst_caps_new (
+ "median_src",
+ "video/x-raw-yuv",
+ GST_VIDEO_YUV_PAD_TEMPLATE_PROPS (
+ GST_PROPS_FOURCC (GST_STR_FOURCC ("I420"))
+ )
)
)
diff --git a/gst/monoscope/gstmonoscope.c b/gst/monoscope/gstmonoscope.c
index f6ff75a1..9eb8bb43 100644
--- a/gst/monoscope/gstmonoscope.c
+++ b/gst/monoscope/gstmonoscope.c
@@ -22,7 +22,7 @@
#endif
#include <config.h>
#include <gst/gst.h>
-
+#include <gst/video/video.h>
#include "monoscope.h"
#define GST_TYPE_MONOSCOPE (gst_monoscope_get_type())
@@ -46,7 +46,7 @@ struct _GstMonoscope {
gint16 datain[512];
/* video state */
- gint fps;
+ gfloat fps;
gint width;
gint height;
gboolean first_buffer;
@@ -81,9 +81,6 @@ enum {
enum {
ARG_0,
- ARG_WIDTH,
- ARG_HEIGHT,
- ARG_FPS,
/* FILL ME */
};
@@ -93,16 +90,16 @@ GST_PAD_TEMPLATE_FACTORY (src_template,
GST_PAD_ALWAYS,
GST_CAPS_NEW (
"monoscopesrc",
- "video/raw",
- "format", GST_PROPS_FOURCC (GST_STR_FOURCC ("RGB ")),
+ "video/x-raw-rgb",
"bpp", GST_PROPS_INT (32),
"depth", GST_PROPS_INT (32),
"endianness", GST_PROPS_INT (G_BYTE_ORDER),
- "red_mask", GST_PROPS_INT (0xff0000),
- "green_mask", GST_PROPS_INT (0xff00),
- "blue_mask", GST_PROPS_INT (0xff),
+ "red_mask", GST_PROPS_INT (R_MASK_32),
+ "green_mask", GST_PROPS_INT (G_MASK_32),
+ "blue_mask", GST_PROPS_INT (B_MASK_32),
"width", GST_PROPS_INT_RANGE (16, 4096),
- "height", GST_PROPS_INT_RANGE (16, 4096)
+ "height", GST_PROPS_INT_RANGE (16, 4096),
+ "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT)
)
)
@@ -112,10 +109,8 @@ GST_PAD_TEMPLATE_FACTORY (sink_template,
GST_PAD_ALWAYS, /* ALWAYS/SOMETIMES */
GST_CAPS_NEW (
"monoscopesink", /* the name of the caps */
- "audio/raw", /* the mime type of the caps */
+ "audio/x-raw-int", /* the mime type of the caps */
/* Properties follow: */
- "format", GST_PROPS_STRING ("int"),
- "law", GST_PROPS_INT (0),
"endianness", GST_PROPS_INT (G_BYTE_ORDER),
"signed", GST_PROPS_BOOLEAN (TRUE),
"width", GST_PROPS_INT (16),
@@ -126,18 +121,15 @@ GST_PAD_TEMPLATE_FACTORY (sink_template,
)
-static void gst_monoscope_class_init (GstMonoscopeClass *klass);
-static void gst_monoscope_init (GstMonoscope *monoscope);
-
-static void gst_monoscope_set_property (GObject *object, guint prop_id,
- const GValue *value, GParamSpec *pspec);
-static void gst_monoscope_get_property (GObject *object, guint prop_id,
- GValue *value, GParamSpec *pspec);
+static void gst_monoscope_class_init (GstMonoscopeClass *klass);
+static void gst_monoscope_init (GstMonoscope *monoscope);
-static void gst_monoscope_chain (GstPad *pad, GstBuffer *buf);
+static void gst_monoscope_chain (GstPad *pad, GstBuffer *buf);
static GstPadLinkReturn
- gst_monoscope_sinkconnect (GstPad *pad, GstCaps *caps);
+ gst_monoscope_sinkconnect (GstPad *pad, GstCaps *caps);
+static GstPadLinkReturn
+ gst_monoscope_srcconnect (GstPad *pad, GstCaps *caps);
static GstElementClass *parent_class = NULL;
@@ -173,19 +165,6 @@ gst_monoscope_class_init(GstMonoscopeClass *klass)
gstelement_class = (GstElementClass*) klass;
parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
-
- g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_WIDTH,
- g_param_spec_int ("width","Width","The Width",
- 1, 2048, 256, G_PARAM_READWRITE));
- g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_HEIGHT,
- g_param_spec_int ("height","Height","The height",
- 1, 2048, 128, G_PARAM_READWRITE));
- g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FPS,
- g_param_spec_int ("fps","FPS","Frames per second",
- 1, 100, 25, G_PARAM_READWRITE));
-
- gobject_class->set_property = gst_monoscope_set_property;
- gobject_class->get_property = gst_monoscope_get_property;
}
static void
@@ -201,6 +180,7 @@ gst_monoscope_init (GstMonoscope *monoscope)
gst_pad_set_chain_function (monoscope->sinkpad, gst_monoscope_chain);
gst_pad_set_link_function (monoscope->sinkpad, gst_monoscope_sinkconnect);
+ gst_pad_set_link_function (monoscope->srcpad, gst_monoscope_srcconnect);
monoscope->next_time = 0;
monoscope->peerpool = NULL;
@@ -209,8 +189,7 @@ gst_monoscope_init (GstMonoscope *monoscope)
monoscope->first_buffer = TRUE;
monoscope->width = 256;
monoscope->height = 128;
- monoscope->fps = 25; /* desired frame rate */
-
+ monoscope->fps = 25.; /* desired frame rate */
}
static GstPadLinkReturn
@@ -226,6 +205,50 @@ gst_monoscope_sinkconnect (GstPad *pad, GstCaps *caps)
return GST_PAD_LINK_OK;
}
+static GstPadLinkReturn
+gst_monoscope_negotiate (GstMonoscope *monoscope)
+{
+ GstCaps *caps;
+
+ caps = GST_CAPS_NEW (
+ "monoscopesrc",
+ "video/x-raw-rgb",
+ "bpp", GST_PROPS_INT (32),
+ "depth", GST_PROPS_INT (32),
+ "endianness", GST_PROPS_INT (G_BYTE_ORDER),
+ "red_mask", GST_PROPS_INT (R_MASK_32),
+ "green_mask", GST_PROPS_INT (G_MASK_32),
+ "blue_mask", GST_PROPS_INT (B_MASK_32),
+ "width", GST_PROPS_INT (monoscope->width),
+ "height", GST_PROPS_INT (monoscope->height),
+ "framerate", GST_PROPS_FLOAT (monoscope->fps)
+ );
+
+ return gst_pad_try_set_caps (monoscope->srcpad, caps);
+}
+
+static GstPadLinkReturn
+gst_monoscope_srcconnect (GstPad *pad, GstCaps *caps)
+{
+ GstPadLinkReturn ret;
+ GstMonoscope *monoscope = GST_MONOSCOPE (gst_pad_get_parent (pad));
+
+ if (gst_caps_has_property_typed (caps, "width", GST_PROPS_INT_TYPE)) {
+ gst_caps_get_int (caps, "width", &monoscope->width);
+ }
+ if (gst_caps_has_property_typed (caps, "height", GST_PROPS_INT_TYPE)) {
+ gst_caps_get_int (caps, "height", &monoscope->height);
+ }
+ if (gst_caps_has_property_typed (caps, "framerate", GST_PROPS_FLOAT_TYPE)) {
+ gst_caps_get_float (caps, "framerate", &monoscope->fps);
+ }
+
+ if ((ret = gst_monoscope_negotiate (monoscope)) <= 0)
+ return ret;
+
+ return GST_PAD_LINK_DONE;
+}
+
static void
gst_monoscope_chain (GstPad *pad, GstBuffer *bufin)
{
@@ -257,29 +280,14 @@ gst_monoscope_chain (GstPad *pad, GstBuffer *bufin)
}
if (monoscope->first_buffer) {
- GstCaps *caps;
-
monoscope->visstate = monoscope_init (monoscope->width, monoscope->height);
g_assert(monoscope->visstate != 0);
GST_DEBUG ("making new pad");
-
- caps = GST_CAPS_NEW (
- "monoscopesrc",
- "video/raw",
- "format", GST_PROPS_FOURCC (GST_STR_FOURCC ("RGB ")),
- "bpp", GST_PROPS_INT (32),
- "depth", GST_PROPS_INT (32),
- "endianness", GST_PROPS_INT (G_BYTE_ORDER),
- "red_mask", GST_PROPS_INT (0xff0000),
- "green_mask", GST_PROPS_INT (0x00ff00),
- "blue_mask", GST_PROPS_INT (0x0000ff),
- "width", GST_PROPS_INT (monoscope->width),
- "height", GST_PROPS_INT (monoscope->height)
- );
-
- if (gst_pad_try_set_caps (monoscope->srcpad, caps) <= 0) {
- gst_element_error (GST_ELEMENT (monoscope), "could not set caps");
- return;
+ if (!GST_PAD_CAPS (monoscope->srcpad)) {
+ if (gst_monoscope_negotiate (monoscope) <= 0) {
+ gst_element_error (GST_ELEMENT (monoscope), "could not set caps");
+ return;
+ }
}
monoscope->first_buffer = FALSE;
}
@@ -300,54 +308,6 @@ gst_monoscope_chain (GstPad *pad, GstBuffer *bufin)
}
-static void
-gst_monoscope_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
-{
- GstMonoscope *monoscope;
-
- /* it's not null if we got it, but it might not be ours */
- g_return_if_fail (GST_IS_MONOSCOPE (object));
- monoscope = GST_MONOSCOPE (object);
-
- switch (prop_id) {
- case ARG_WIDTH:
- monoscope->width = g_value_get_int (value);
- break;
- case ARG_HEIGHT:
- monoscope->height = g_value_get_int (value);
- break;
- case ARG_FPS:
- monoscope->fps = g_value_get_int (value);
- break;
- default:
- break;
- }
-}
-
-static void
-gst_monoscope_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
-{
- GstMonoscope *monoscope;
-
- /* it's not null if we got it, but it might not be ours */
- g_return_if_fail (GST_IS_MONOSCOPE (object));
- monoscope = GST_MONOSCOPE (object);
-
- switch (prop_id) {
- case ARG_WIDTH:
- g_value_set_int (value, monoscope->width);
- break;
- case ARG_HEIGHT:
- g_value_set_int (value, monoscope->height);
- break;
- case ARG_FPS:
- g_value_set_int (value, monoscope->fps);
- break;
- default:
- break;
- }
-}
-
static gboolean
plugin_init (GModule *module, GstPlugin *plugin)
{
diff --git a/gst/qtdemux/qtdemux.c b/gst/qtdemux/qtdemux.c
index be187752..4852db93 100644
--- a/gst/qtdemux/qtdemux.c
+++ b/gst/qtdemux/qtdemux.c
@@ -59,6 +59,7 @@ struct _QtDemuxSample {
int size;
guint32 offset;
guint64 timestamp;
+ guint64 duration;
};
struct _QtDemuxStream {
@@ -73,6 +74,7 @@ struct _QtDemuxStream {
int width;
int height;
+ float fps;
double rate;
int n_channels;
};
@@ -125,25 +127,12 @@ GST_PAD_TEMPLATE_FACTORY (sink_templ,
GST_PAD_ALWAYS,
GST_CAPS_NEW (
"qtdemux_sink",
- "video/quicktime",
- NULL
+ "video/quicktime",
+ NULL
)
)
-GST_PAD_TEMPLATE_FACTORY (src_video_templ,
- "video_%02d",
- GST_PAD_SRC,
- GST_PAD_SOMETIMES,
- NULL
-)
-
-GST_PAD_TEMPLATE_FACTORY (src_audio_templ,
- "audio_%02d",
- GST_PAD_SRC,
- GST_PAD_SOMETIMES,
- NULL
-)
-
+static GstPadTemplate *videosrctempl, *audiosrctempl;
static GstElementClass *parent_class = NULL;
static void gst_qtdemux_class_init (GstQTDemuxClass *klass);
@@ -223,6 +212,15 @@ plugin_init (GModule *module, GstPlugin *plugin)
{
GstElementFactory *factory;
GstTypeFactory *type;
+ GstCaps *audiocaps = NULL, *videocaps = NULL, *temp;
+ const guint32 audio_fcc[] = {
+ /* FILLME */
+ 0,
+ }, video_fcc[] = {
+ /* FILLME */
+ 0,
+ };
+ gint i;
if (!gst_library_load ("gstbytestream"))
return FALSE;
@@ -232,9 +230,27 @@ plugin_init (GModule *module, GstPlugin *plugin)
g_return_val_if_fail(factory != NULL, FALSE);
gst_element_factory_set_rank (factory, GST_ELEMENT_RANK_PRIMARY);
+ for (i = 0; audio_fcc[i] != 0; i++) {
+ temp = qtdemux_audio_caps (NULL, audio_fcc[i]);
+ audiocaps = gst_caps_append (audiocaps, temp);
+ }
+ audiosrctempl = gst_pad_template_new ("audio_%02d",
+ GST_PAD_SRC,
+ GST_PAD_SOMETIMES,
+ audiocaps, NULL);
+
+ for (i = 0; video_fcc[i] != 0; i++) {
+ temp = qtdemux_video_caps (NULL, video_fcc[i]);
+ videocaps = gst_caps_append (videocaps, temp);
+ }
+ videosrctempl = gst_pad_template_new ("video_%02d",
+ GST_PAD_SRC,
+ GST_PAD_SOMETIMES,
+ videocaps, NULL);
+
gst_element_factory_add_pad_template (factory, GST_PAD_TEMPLATE_GET (sink_templ));
- gst_element_factory_add_pad_template (factory, GST_PAD_TEMPLATE_GET (src_video_templ));
- gst_element_factory_add_pad_template (factory, GST_PAD_TEMPLATE_GET (src_audio_templ));
+ gst_element_factory_add_pad_template (factory, videosrctempl);
+ gst_element_factory_add_pad_template (factory, audiosrctempl);
type = gst_type_factory_new (&quicktimedefinition);
gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (type));
@@ -484,7 +500,20 @@ static void gst_qtdemux_loop_header (GstElement *element)
}while(TRUE);
if(buf){
+ /* hum... */
+ if(stream->subtype == GST_MAKE_FOURCC('v','i','d','e')){
+ float fps = 1. * GST_SECOND / stream->samples[stream->sample_index].duration;
+ if (fps != stream->fps) {
+ gst_props_remove_entry_by_name(stream->caps->properties, "framerate");
+ gst_props_add_entry(stream->caps->properties,
+ gst_props_entry_new("framerate", GST_PROPS_FLOAT(fps)));
+ stream->fps = fps;
+ gst_pad_try_set_caps(stream->pad, stream->caps);
+ }
+ }
+
GST_BUFFER_TIMESTAMP(buf) = stream->samples[stream->sample_index].timestamp;
+ GST_BUFFER_DURATION(buf) = stream->samples[stream->sample_index].duration;
gst_pad_push(stream->pad, buf);
}
stream->sample_index++;
@@ -554,27 +583,31 @@ gst_qtdemux_src_link(GstPad *pad, GstCaps *caps)
void gst_qtdemux_add_stream(GstQTDemux *qtdemux, QtDemuxStream *stream)
{
if(stream->subtype == GST_MAKE_FOURCC('v','i','d','e')){
- stream->pad = gst_pad_new_from_template (
- GST_PAD_TEMPLATE_GET (src_video_templ), g_strdup_printf ("video_%02d",
- qtdemux->n_video_streams));
+ stream->pad = gst_pad_new_from_template (videosrctempl,
+ g_strdup_printf ("video_%02d", qtdemux->n_video_streams));
+ stream->fps = 1. * GST_SECOND / stream->samples[0].duration;
if(stream->caps){
- stream->caps->properties = gst_props_intersect(
+ GstProps *properties = gst_props_intersect(
stream->caps->properties,
gst_props_new("width",GST_PROPS_INT(stream->width),
- "height",GST_PROPS_INT(stream->height), NULL));
+ "height",GST_PROPS_INT(stream->height),
+ "framerate", GST_PROPS_FLOAT(stream->fps), NULL));
+ if (stream->caps->properties != NULL)
+ gst_props_unref (stream->caps->properties);
+ stream->caps->properties = properties;
}
qtdemux->n_video_streams++;
}else{
- stream->pad = gst_pad_new_from_template (
- GST_PAD_TEMPLATE_GET (src_audio_templ), g_strdup_printf ("audio_%02d",
- qtdemux->n_audio_streams));
+ stream->pad = gst_pad_new_from_template (audiosrctempl,
+ g_strdup_printf ("audio_%02d", qtdemux->n_audio_streams));
if(stream->caps){
- g_print("props were %s\n",gst_props_to_string(stream->caps->properties));
- stream->caps->properties = gst_props_intersect(
+ GstProps *properties = gst_props_intersect(
stream->caps->properties,
gst_props_new("rate",GST_PROPS_INT((int)stream->rate),
"channels",GST_PROPS_INT(stream->n_channels), NULL));
- g_print("props now %s\n",gst_props_to_string(stream->caps->properties));
+ if (stream->caps->properties != NULL)
+ gst_props_unref (stream->caps->properties);
+ stream->caps->properties = properties;
}
qtdemux->n_audio_streams++;
}
@@ -1302,6 +1335,7 @@ static void qtdemux_parse_trak(GstQTDemux *qtdemux, GNode *trak)
stream->width = QTDEMUX_GUINT16_GET(stsd->data+offset+32);
stream->height = QTDEMUX_GUINT16_GET(stsd->data+offset+34);
+ stream->fps = 0.; /* this is filled in later */
g_print("frame count: %u\n", QTDEMUX_GUINT16_GET(stsd->data+offset+48));
@@ -1416,6 +1450,7 @@ done:
time = (GST_SECOND * duration)/stream->timescale;
for(j=0;j<n;j++){
samples[index].timestamp = timestamp;
+ samples[index].duration = time;
timestamp += time;
index++;
}
@@ -1487,6 +1522,7 @@ done2:
size = samples[index+1].sample_index - samples[index].sample_index;
time = (GST_SECOND * duration * samples[index].size)/stream->timescale ;
timestamp += time;
+ samples[index].duration = time;
}
}
}
@@ -1509,43 +1545,87 @@ static GstCaps *qtdemux_video_caps(GstQTDemux *qtdemux, guint32 fourcc)
switch(fourcc){
case GST_MAKE_FOURCC('j','p','e','g'):
/* JPEG */
- return GST_CAPS_NEW("jpeg_caps","video/jpeg",NULL);
+ return GST_CAPS_NEW("jpeg_caps","video/x-jpeg",
+ "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT),
+ "width", GST_PROPS_INT_RANGE (16, 4096),
+ "height", GST_PROPS_INT_RANGE (16, 4096));
case GST_MAKE_FOURCC('m','j','p','a'):
/* Motion-JPEG (format A) */
- return GST_CAPS_NEW("mjpa_caps","video/jpeg",NULL);
+ return GST_CAPS_NEW("mjpa_caps","video/x-jpeg",
+ "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT),
+ "width", GST_PROPS_INT_RANGE (16, 4096),
+ "height", GST_PROPS_INT_RANGE (16, 4096));
case GST_MAKE_FOURCC('m','j','p','b'):
/* Motion-JPEG (format B) */
- return GST_CAPS_NEW("mjpa_caps","video/jpeg",NULL);
+ return GST_CAPS_NEW("mjpb_caps","video/x-jpeg",
+ "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT),
+ "width", GST_PROPS_INT_RANGE (16, 4096),
+ "height", GST_PROPS_INT_RANGE (16, 4096));
case GST_MAKE_FOURCC('S','V','Q','3'):
return GST_CAPS_NEW("SVQ3_caps","video/x-svq",
- "svqversion", GST_PROPS_INT(3),NULL);
+ "svqversion", GST_PROPS_INT(3),
+ "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT),
+ "width", GST_PROPS_INT_RANGE (16, 4096),
+ "height", GST_PROPS_INT_RANGE (16, 4096));
case GST_MAKE_FOURCC('s','v','q','i'):
case GST_MAKE_FOURCC('S','V','Q','1'):
return GST_CAPS_NEW("SVQ1_caps","video/x-svq",
- "svqversion", GST_PROPS_INT(1),NULL);
+ "svqversion", GST_PROPS_INT(1),
+ "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT),
+ "width", GST_PROPS_INT_RANGE (16, 4096),
+ "height", GST_PROPS_INT_RANGE (16, 4096));
case GST_MAKE_FOURCC('r','a','w',' '):
/* uncompressed RGB */
- return GST_CAPS_NEW("raw__caps","video/raw",
- "format",GST_PROPS_FOURCC(GST_MAKE_FOURCC('R','G','B',' ')));
+ return GST_CAPS_NEW("raw__caps","video/x-raw-rgb",
+ "endianness",GST_PROPS_INT(G_BIG_ENDIAN),
+ /*"bpp", GST_PROPS_INT(x),
+ "depth", GST_PROPS_INT(x),
+ "red_mask", GST_PROPS_INT(x),
+ "green_mask", GST_PROPS_INT(x),
+ "blue_mask", GST_PROPS_INT(x), FIXME! */
+ "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT),
+ "width", GST_PROPS_INT_RANGE (16, 4096),
+ "height", GST_PROPS_INT_RANGE (16, 4096));
case GST_MAKE_FOURCC('Y','u','v','2'):
/* uncompressed YUV2 */
- return GST_CAPS_NEW("Yuv2_caps","video/raw",
- "format",GST_PROPS_FOURCC(GST_MAKE_FOURCC('Y','U','V','2')));
+ return GST_CAPS_NEW("Yuv2_caps","video/x-raw-yuv",
+ "format",GST_PROPS_FOURCC(GST_MAKE_FOURCC('Y','U','V','2')),
+ "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT),
+ "width", GST_PROPS_INT_RANGE (16, 4096),
+ "height", GST_PROPS_INT_RANGE (16, 4096));
case GST_MAKE_FOURCC('m','p','e','g'):
/* MPEG */
- return GST_CAPS_NEW("mpeg_caps","video/mpeg",NULL);
+ return GST_CAPS_NEW("mpeg_caps","video/mpeg",
+ "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT),
+ "width", GST_PROPS_INT_RANGE (16, 4096),
+ "height", GST_PROPS_INT_RANGE (16, 4096),
+ "systemstream", GST_PROPS_BOOLEAN(FALSE),
+ "mpegversion", GST_PROPS_INT(1));
case GST_MAKE_FOURCC('g','i','f',' '):
- return GST_CAPS_NEW("gif__caps","image/gif",NULL);
+ return GST_CAPS_NEW("gif__caps","image/gif",
+ "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT),
+ "width", GST_PROPS_INT_RANGE (16, 4096),
+ "height", GST_PROPS_INT_RANGE (16, 4096));
case GST_MAKE_FOURCC('h','2','6','3'):
/* H.263 */
/* ffmpeg uses the height/width props, don't know why */
- return GST_CAPS_NEW("h263_caps","video/h263",NULL);
+ return GST_CAPS_NEW("h263_caps","video/x-h263",
+ "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT),
+ "width", GST_PROPS_INT_RANGE (16, 4096),
+ "height", GST_PROPS_INT_RANGE (16, 4096));
case GST_MAKE_FOURCC('m','p','4','v'):
/* MPEG-4 */
return GST_CAPS_NEW("mp4v_caps", "video/mpeg",
- "mpegversion",GST_PROPS_INT(4));
+ "mpegversion",GST_PROPS_INT(4),
+ "systemstream", GST_PROPS_BOOLEAN(FALSE),
+ "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT),
+ "width", GST_PROPS_INT_RANGE (16, 4096),
+ "height", GST_PROPS_INT_RANGE (16, 4096));
case GST_MAKE_FOURCC('3','I','V','1'):
- return GST_CAPS_NEW("3IV1_caps", "video/3ivx",NULL);
+ return GST_CAPS_NEW("3IV1_caps", "video/x-3ivx",
+ "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT),
+ "width", GST_PROPS_INT_RANGE (16, 4096),
+ "height", GST_PROPS_INT_RANGE (16, 4096));
case GST_MAKE_FOURCC('r','p','z','a'):
case GST_MAKE_FOURCC('c','v','i','d'):
/* Cinepak */
@@ -1564,12 +1644,10 @@ static GstCaps *qtdemux_audio_caps(GstQTDemux *qtdemux, guint32 fourcc)
{
switch(fourcc){
case GST_MAKE_FOURCC('N','O','N','E'):
- return GST_CAPS_NEW("NONE_caps","audio/raw",NULL);
+ return NULL; /*GST_CAPS_NEW("NONE_caps","audio/raw",NULL);*/
case GST_MAKE_FOURCC('r','a','w',' '):
/* FIXME */
- return GST_CAPS_NEW("raw__caps","audio/raw",
- "format",GST_PROPS_STRING("int"),
- "law", GST_PROPS_INT(0),
+ return GST_CAPS_NEW("raw__caps","audio/x-raw-int",
"width",GST_PROPS_INT(8),
"depth",GST_PROPS_INT(8),
"signed",GST_PROPS_BOOLEAN(FALSE),
@@ -1577,9 +1655,7 @@ static GstCaps *qtdemux_audio_caps(GstQTDemux *qtdemux, guint32 fourcc)
"channels",GST_PROPS_INT_RANGE(1,G_MAXINT));
case GST_MAKE_FOURCC('t','w','o','s'):
/* FIXME */
- return GST_CAPS_NEW("twos_caps","audio/raw",
- "format",GST_PROPS_STRING("int"),
- "law", GST_PROPS_INT(0),
+ return GST_CAPS_NEW("twos_caps","audio/x-raw-int",
"width",GST_PROPS_INT(16),
"depth",GST_PROPS_INT(16),
"endianness",GST_PROPS_INT(G_BIG_ENDIAN),
@@ -1588,9 +1664,7 @@ static GstCaps *qtdemux_audio_caps(GstQTDemux *qtdemux, guint32 fourcc)
"channels",GST_PROPS_INT_RANGE(1,G_MAXINT));
case GST_MAKE_FOURCC('s','o','w','t'):
/* FIXME */
- return GST_CAPS_NEW("sowt_caps","audio/raw",
- "format",GST_PROPS_STRING("int"),
- "law", GST_PROPS_INT(0),
+ return GST_CAPS_NEW("sowt_caps","audio/x-raw-int",
"width",GST_PROPS_INT(16),
"depth",GST_PROPS_INT(16),
"endianness",GST_PROPS_INT(G_LITTLE_ENDIAN),
@@ -1598,22 +1672,24 @@ static GstCaps *qtdemux_audio_caps(GstQTDemux *qtdemux, guint32 fourcc)
"rate",GST_PROPS_INT_RANGE(1,G_MAXINT),
"channels",GST_PROPS_INT_RANGE(1,G_MAXINT));
case GST_MAKE_FOURCC('f','l','6','4'):
- return GST_CAPS_NEW("fl64_caps","audio/raw",
- "format",GST_PROPS_STRING("float"),
- "layout",GST_PROPS_STRING("gdouble"),
+ return GST_CAPS_NEW("fl64_caps","audio/x-raw-float",
+ "depth",GST_PROPS_INT (64),
+ "endianness",GST_PROPS_INT (G_BIG_ENDIAN),
+ "intercept",GST_PROPS_FLOAT (0.0),
+ "slope",GST_PROPS_FLOAT (1.0),
"rate",GST_PROPS_INT_RANGE(1,G_MAXINT),
"channels",GST_PROPS_INT_RANGE(1,G_MAXINT));
case GST_MAKE_FOURCC('f','l','3','2'):
- return GST_CAPS_NEW("fl32_caps","audio/raw",
- "format",GST_PROPS_STRING("float"),
- "layout",GST_PROPS_STRING("gfloat"),
+ return GST_CAPS_NEW("fl32_caps","audio/x-raw-float",
+ "depth",GST_PROPS_INT (32),
+ "endianness",GST_PROPS_INT (G_BIG_ENDIAN),
+ "intercept",GST_PROPS_FLOAT (0.0),
+ "slope",GST_PROPS_FLOAT (1.0),
"rate",GST_PROPS_INT_RANGE(1,G_MAXINT),
"channels",GST_PROPS_INT_RANGE(1,G_MAXINT));
case GST_MAKE_FOURCC('i','n','2','4'):
/* FIXME */
- return GST_CAPS_NEW("in24_caps","audio/raw",
- "format",GST_PROPS_STRING("int"),
- "law", GST_PROPS_INT(0),
+ return GST_CAPS_NEW("in24_caps","audio/x-raw-int",
"width",GST_PROPS_INT(24),
"depth",GST_PROPS_INT(32),
"endianness",GST_PROPS_INT(G_BIG_ENDIAN),
@@ -1622,9 +1698,7 @@ static GstCaps *qtdemux_audio_caps(GstQTDemux *qtdemux, guint32 fourcc)
"channels",GST_PROPS_INT_RANGE(1,G_MAXINT));
case GST_MAKE_FOURCC('i','n','3','2'):
/* FIXME */
- return GST_CAPS_NEW("in32_caps","audio/raw",
- "format",GST_PROPS_STRING("int"),
- "law", GST_PROPS_INT(0),
+ return GST_CAPS_NEW("in32_caps","audio/x-raw-int",
"width",GST_PROPS_INT(24),
"depth",GST_PROPS_INT(32),
"endianness",GST_PROPS_INT(G_BIG_ENDIAN),
@@ -1632,42 +1706,70 @@ static GstCaps *qtdemux_audio_caps(GstQTDemux *qtdemux, guint32 fourcc)
"channels",GST_PROPS_INT_RANGE(1,G_MAXINT));
case GST_MAKE_FOURCC('u','l','a','w'):
/* FIXME */
- return GST_CAPS_NEW("ulaw_caps","audio/raw",
- "format",GST_PROPS_STRING("int"),
- "law", GST_PROPS_INT(2),
+ return GST_CAPS_NEW("ulaw_caps","audio/x-mulaw",
"rate",GST_PROPS_INT_RANGE(1,G_MAXINT),
"channels",GST_PROPS_INT_RANGE(1,G_MAXINT));
case GST_MAKE_FOURCC('a','l','a','w'):
/* FIXME */
- return GST_CAPS_NEW("alaw_caps","audio/raw",
- "format",GST_PROPS_STRING("int"),
- "law", GST_PROPS_INT(1),
+ return GST_CAPS_NEW("alaw_caps","audio/x-alaw",
"rate",GST_PROPS_INT_RANGE(1,G_MAXINT),
"channels",GST_PROPS_INT_RANGE(1,G_MAXINT));
case 0x6d730002:
/* Microsoft ADPCM-ACM code 2 */
- return GST_CAPS_NEW("msxx_caps","audio/adpcm",NULL);
+ return GST_CAPS_NEW("msxx_caps","audio/x-adpcm",
+ "layout", GST_PROPS_STRING("microsoft"),
+ "rate",GST_PROPS_INT_RANGE(1,G_MAXINT),
+ "channels",GST_PROPS_INT_RANGE(1,G_MAXINT),
+ NULL);
case 0x6d730011:
/* FIXME DVI/Intel IMA ADPCM/ACM code 17 */
- return GST_CAPS_NEW("msxx_caps","audio/adpcm",NULL);
+ return GST_CAPS_NEW("msxx_caps","audio/x-adpcm",
+ "layout", GST_PROPS_STRING("quicktime"),
+ "rate",GST_PROPS_INT_RANGE(1,G_MAXINT),
+ "channels",GST_PROPS_INT_RANGE(1,G_MAXINT),
+ NULL);
case 0x6d730055:
/* MPEG layer 3, CBR only (pre QT4.1) */
case GST_MAKE_FOURCC('.','m','p','3'):
/* MPEG layer 3, CBR & VBR (QT4.1 and later) */
- return GST_CAPS_NEW("_mp3_caps","audio/x-mp3",NULL);
+ return GST_CAPS_NEW("_mp3_caps","audio/mpeg",
+ "layer", GST_PROPS_INT(3),
+ "rate",GST_PROPS_INT_RANGE(1,G_MAXINT),
+ "channels",GST_PROPS_INT_RANGE(1,G_MAXINT),
+ NULL);
case GST_MAKE_FOURCC('M','A','C','3'):
/* MACE 3:1 */
return GST_CAPS_NEW("MAC3_caps","audio/x-mace",
- "maceversion",GST_PROPS_INT(3), NULL);
+ "maceversion",GST_PROPS_INT(3),
+ "rate",GST_PROPS_INT_RANGE(1,G_MAXINT),
+ "channels",GST_PROPS_INT_RANGE(1,G_MAXINT),
+ NULL);
case GST_MAKE_FOURCC('M','A','C','6'):
/* MACE 6:1 */
return GST_CAPS_NEW("MAC3_caps","audio/x-mace",
- "maceversion",GST_PROPS_INT(6));
+ "maceversion",GST_PROPS_INT(6),
+ "rate",GST_PROPS_INT_RANGE(1,G_MAXINT),
+ "channels",GST_PROPS_INT_RANGE(1,G_MAXINT),
+ NULL);
case GST_MAKE_FOURCC('O','g','g','V'):
/* Ogg Vorbis */
- return GST_CAPS_NEW("OggV_caps","application/x-ogg", NULL);
+ return GST_CAPS_NEW("OggV_caps","application/ogg",
+ "rate",GST_PROPS_INT_RANGE(1,G_MAXINT),
+ "channels",GST_PROPS_INT_RANGE(1,G_MAXINT),
+ NULL);
case GST_MAKE_FOURCC('d','v','c','a'):
/* DV audio */
+ return GST_CAPS_NEW("dvca_caps","audio/x-dv",
+ "rate",GST_PROPS_INT_RANGE(1,G_MAXINT),
+ "channels",GST_PROPS_INT_RANGE(1,G_MAXINT),
+ NULL);
+ case GST_MAKE_FOURCC('m','p','4','a'):
+ /* MPEG-4 AAC */
+ return GST_CAPS_NEW("mp4a_caps", "audio/mpeg",
+ "mpegversion", GST_PROPS_INT(4),
+ "rate", GST_PROPS_INT_RANGE(1, G_MAXINT),
+ "channels", GST_PROPS_INT_RANGE(1, G_MAXINT),
+ "systemstream", GST_PROPS_BOOLEAN(FALSE), NULL);
case GST_MAKE_FOURCC('q','t','v','r'):
/* ? */
case GST_MAKE_FOURCC('Q','D','M','2'):
diff --git a/gst/rtp/gstrtpL16depay.c b/gst/rtp/gstrtpL16depay.c
index 484b7a30..fc3355c0 100644
--- a/gst/rtp/gstrtpL16depay.c
+++ b/gst/rtp/gstrtpL16depay.c
@@ -50,9 +50,7 @@ GST_PAD_TEMPLATE_FACTORY (src_factory,
GST_PAD_ALWAYS,
GST_CAPS_NEW (
"audio_raw",
- "audio/raw",
- "format", GST_PROPS_STRING ("int"),
- "law", GST_PROPS_INT (0),
+ "audio/x-raw-int",
"endianness", GST_PROPS_INT (G_BYTE_ORDER),
"signed", GST_PROPS_BOOLEAN (TRUE),
"width", GST_PROPS_INT (16),
@@ -166,9 +164,7 @@ gst_rtpL16_caps_nego (GstRtpL16Parse *rtpL16parse)
caps = GST_CAPS_NEW (
"audio_raw",
- "audio/raw",
- "format", GST_PROPS_STRING ("int"),
- "law", GST_PROPS_INT (0),
+ "audio/x-raw-int",
"endianness", GST_PROPS_INT (G_BYTE_ORDER),
"signed", GST_PROPS_BOOLEAN (TRUE),
"width", GST_PROPS_INT (16),
diff --git a/gst/rtp/gstrtpL16enc.c b/gst/rtp/gstrtpL16enc.c
index c5a60a68..71e2ac30 100644
--- a/gst/rtp/gstrtpL16enc.c
+++ b/gst/rtp/gstrtpL16enc.c
@@ -53,9 +53,7 @@ GST_PAD_TEMPLATE_FACTORY (sink_factory,
GST_PAD_ALWAYS,
GST_CAPS_NEW (
"audio_raw",
- "audio/raw",
- "format", GST_PROPS_STRING ("int"),
- "law", GST_PROPS_INT (0),
+ "audio/x-raw-int",
"endianness", GST_PROPS_INT (G_BYTE_ORDER),
"signed", GST_PROPS_BOOLEAN (TRUE),
"width", GST_PROPS_INT (16),
diff --git a/gst/rtp/gstrtpL16parse.c b/gst/rtp/gstrtpL16parse.c
index 484b7a30..fc3355c0 100644
--- a/gst/rtp/gstrtpL16parse.c
+++ b/gst/rtp/gstrtpL16parse.c
@@ -50,9 +50,7 @@ GST_PAD_TEMPLATE_FACTORY (src_factory,
GST_PAD_ALWAYS,
GST_CAPS_NEW (
"audio_raw",
- "audio/raw",
- "format", GST_PROPS_STRING ("int"),
- "law", GST_PROPS_INT (0),
+ "audio/x-raw-int",
"endianness", GST_PROPS_INT (G_BYTE_ORDER),
"signed", GST_PROPS_BOOLEAN (TRUE),
"width", GST_PROPS_INT (16),
@@ -166,9 +164,7 @@ gst_rtpL16_caps_nego (GstRtpL16Parse *rtpL16parse)
caps = GST_CAPS_NEW (
"audio_raw",
- "audio/raw",
- "format", GST_PROPS_STRING ("int"),
- "law", GST_PROPS_INT (0),
+ "audio/x-raw-int",
"endianness", GST_PROPS_INT (G_BYTE_ORDER),
"signed", GST_PROPS_BOOLEAN (TRUE),
"width", GST_PROPS_INT (16),
diff --git a/gst/rtp/gstrtpL16pay.c b/gst/rtp/gstrtpL16pay.c
index c5a60a68..71e2ac30 100644
--- a/gst/rtp/gstrtpL16pay.c
+++ b/gst/rtp/gstrtpL16pay.c
@@ -53,9 +53,7 @@ GST_PAD_TEMPLATE_FACTORY (sink_factory,
GST_PAD_ALWAYS,
GST_CAPS_NEW (
"audio_raw",
- "audio/raw",
- "format", GST_PROPS_STRING ("int"),
- "law", GST_PROPS_INT (0),
+ "audio/x-raw-int",
"endianness", GST_PROPS_INT (G_BYTE_ORDER),
"signed", GST_PROPS_BOOLEAN (TRUE),
"width", GST_PROPS_INT (16),
diff --git a/gst/smpte/gstsmpte.c b/gst/smpte/gstsmpte.c
index b6761427..bf042e4c 100644
--- a/gst/smpte/gstsmpte.c
+++ b/gst/smpte/gstsmpte.c
@@ -22,6 +22,7 @@
#endif
#include <string.h>
#include <gstsmpte.h>
+#include <gst/video/video.h>
#include "paint.h"
/* elementfactory information */
@@ -39,10 +40,11 @@ GST_PAD_TEMPLATE_FACTORY (smpte_src_factory,
"src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
- GST_CAPS_NEW (
+ gst_caps_new (
"smpte_src",
- "video/raw",
- "format", GST_PROPS_FOURCC (GST_STR_FOURCC ("I420"))
+ "video/x-raw-yuv",
+ GST_VIDEO_YUV_PAD_TEMPLATE_PROPS(
+ GST_PROPS_FOURCC (GST_STR_FOURCC ("I420")))
)
)
@@ -50,12 +52,11 @@ GST_PAD_TEMPLATE_FACTORY (smpte_sink1_factory,
"sink1",
GST_PAD_SINK,
GST_PAD_ALWAYS,
- GST_CAPS_NEW (
+ gst_caps_new (
"smpte_sink1",
- "video/raw",
- "format", GST_PROPS_FOURCC (GST_STR_FOURCC ("I420")),
- "width", GST_PROPS_INT_RANGE (0, 4096),
- "height", GST_PROPS_INT_RANGE (0, 4096)
+ "video/x-raw-yuv",
+ GST_VIDEO_YUV_PAD_TEMPLATE_PROPS(
+ GST_PROPS_FOURCC (GST_STR_FOURCC ("I420")))
)
)
@@ -63,12 +64,11 @@ GST_PAD_TEMPLATE_FACTORY (smpte_sink2_factory,
"sink2",
GST_PAD_SINK,
GST_PAD_ALWAYS,
- GST_CAPS_NEW (
+ gst_caps_new (
"smpte_sink2",
- "video/raw",
- "format", GST_PROPS_FOURCC (GST_STR_FOURCC ("I420")),
- "width", GST_PROPS_INT_RANGE (0, 4096),
- "height", GST_PROPS_INT_RANGE (0, 4096)
+ "video/x-raw-yuv",
+ GST_VIDEO_YUV_PAD_TEMPLATE_PROPS(
+ GST_PROPS_FOURCC (GST_STR_FOURCC ("I420")))
)
)
@@ -174,8 +174,8 @@ gst_smpte_class_init (GstSMPTEClass *klass)
g_param_spec_enum ("type", "Type", "The type of transition to use",
GST_TYPE_SMPTE_TRANSITION_TYPE, 1, G_PARAM_READWRITE));
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FPS,
- g_param_spec_int ("fps", "FPS", "Frames per second if no input files are given",
- 1, 255, 1, G_PARAM_READWRITE));
+ g_param_spec_float ("fps", "FPS", "Frames per second if no input files are given",
+ 0., G_MAXFLOAT, 25., G_PARAM_READWRITE));
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BORDER,
g_param_spec_int ("border", "Border", "The border width of the transition",
0, G_MAXINT, 0, G_PARAM_READWRITE));
@@ -235,6 +235,7 @@ gst_smpte_sinkconnect (GstPad *pad, GstCaps *caps)
gst_caps_get_int (caps, "width", &smpte->width);
gst_caps_get_int (caps, "height", &smpte->height);
+ gst_caps_get_float (caps, "framerate", &smpte->fps);
gst_smpte_update_mask (smpte, smpte->type, smpte->depth, smpte->width, smpte->height);
@@ -263,10 +264,10 @@ gst_smpte_init (GstSMPTE *smpte)
smpte->width = 320;
smpte->height = 200;
+ smpte->fps = 25.;
smpte->duration = 64;
smpte->position = 0;
smpte->type = 1;
- smpte->fps = 1;
smpte->border = 0;
smpte->depth = 16;
gst_smpte_update_mask (smpte, smpte->type, smpte->depth, smpte->width, smpte->height);
@@ -359,7 +360,8 @@ gst_smpte_loop (GstElement *element)
"video/raw",
"format", GST_PROPS_FOURCC (GST_MAKE_FOURCC ('I','4','2','0')),
"width", GST_PROPS_INT (smpte->width),
- "height", GST_PROPS_INT (smpte->height)
+ "height", GST_PROPS_INT (smpte->height),
+ "framerate", GST_PROPS_FLOAT (smpte->fps)
)))
{
gst_element_error (element, "cannot set caps");
@@ -408,12 +410,12 @@ gst_smpte_set_property (GObject *object, guint prop_id,
smpte->width, smpte->height);
break;
}
- case ARG_FPS:
- smpte->fps = g_value_get_int (value);
- break;
case ARG_BORDER:
smpte->border = g_value_get_int (value);
break;
+ case ARG_FPS:
+ smpte->fps = g_value_get_float (value);
+ break;
case ARG_DEPTH:
{
gint depth = g_value_get_int (value);
@@ -443,7 +445,7 @@ gst_smpte_get_property (GObject *object, guint prop_id,
}
break;
case ARG_FPS:
- g_value_set_int (value, smpte->fps);
+ g_value_set_float (value, smpte->fps);
break;
case ARG_BORDER:
g_value_set_int (value, smpte->border);
diff --git a/gst/smpte/gstsmpte.h b/gst/smpte/gstsmpte.h
index 5c863890..c51d4fbe 100644
--- a/gst/smpte/gstsmpte.h
+++ b/gst/smpte/gstsmpte.h
@@ -44,6 +44,7 @@ struct _GstSMPTE {
gint format;
gint width;
gint height;
+ gfloat fps;
gint duration;
gint position;
@@ -53,7 +54,6 @@ struct _GstSMPTE {
*sinkpad2;
gint type;
- gint fps;
gint border;
gint depth;
GstMask *mask;
diff --git a/gst/videocrop/gstvideocrop.c b/gst/videocrop/gstvideocrop.c
index 53628471..6f10391b 100644
--- a/gst/videocrop/gstvideocrop.c
+++ b/gst/videocrop/gstvideocrop.c
@@ -21,6 +21,7 @@
#include "config.h"
#endif
#include <gst/gst.h>
+#include <gst/video/video.h>
#include <string.h>
@@ -47,8 +48,8 @@ struct _GstVideoCrop {
/* caps */
gint width, height;
- gint crop_x, crop_y;
- gint crop_width, crop_height;
+ gfloat fps;
+ gint crop_left, crop_right, crop_top, crop_bottom;
};
struct _GstVideoCropClass {
@@ -75,10 +76,10 @@ enum {
enum {
ARG_0,
- ARG_X,
- ARG_Y,
- ARG_WIDTH,
- ARG_HEIGHT,
+ ARG_LEFT,
+ ARG_RIGHT,
+ ARG_TOP,
+ ARG_BOTTOM,
/* FILL ME */
};
@@ -86,10 +87,11 @@ GST_PAD_TEMPLATE_FACTORY (video_crop_src_template_factory,
"src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
- GST_CAPS_NEW (
+ gst_caps_new (
"video_crop_src",
- "video/raw",
- "format", GST_PROPS_FOURCC (GST_STR_FOURCC ("I420"))
+ "video/x-raw-yuv",
+ GST_VIDEO_YUV_PAD_TEMPLATE_PROPS(
+ GST_PROPS_FOURCC (GST_STR_FOURCC ("I420")))
)
)
@@ -97,10 +99,11 @@ GST_PAD_TEMPLATE_FACTORY (video_crop_sink_template_factory,
"sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
- GST_CAPS_NEW (
+ gst_caps_new (
"video_crop_sink",
- "video/raw",
- "format", GST_PROPS_FOURCC (GST_STR_FOURCC ("I420"))
+ "video/x-raw-yuv",
+ GST_VIDEO_YUV_PAD_TEMPLATE_PROPS(
+ GST_PROPS_FOURCC (GST_STR_FOURCC ("I420")))
)
)
@@ -157,17 +160,17 @@ gst_video_crop_class_init (GstVideoCropClass *klass)
parent_class = g_type_class_ref(GST_TYPE_ELEMENT);
- g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_X,
- g_param_spec_int ("x", "X", "X offset of image",
+ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LEFT,
+ g_param_spec_int ("left", "Left", "Pixels to crop at left",
0, G_MAXINT, 0, G_PARAM_READWRITE));
- g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_Y,
- g_param_spec_int ("y", "Y", "Y offset of image",
+ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_RIGHT,
+ g_param_spec_int ("right", "Right", "Pixels to crop at right",
0, G_MAXINT, 0, G_PARAM_READWRITE));
- g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_WIDTH,
- g_param_spec_int ("width", "Width", "Width of image",
+ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TOP,
+ g_param_spec_int ("top", "Top", "Pixels to crop at top",
0, G_MAXINT, 0, G_PARAM_READWRITE));
- g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_HEIGHT,
- g_param_spec_int ("height", "Height", "Height of image",
+ g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BOTTOM,
+ g_param_spec_int ("bottom", "Bottom", "Pixels to crop at bottom",
0, G_MAXINT, 0, G_PARAM_READWRITE));
gobject_class->set_property = gst_video_crop_set_property;
@@ -190,10 +193,10 @@ gst_video_crop_init (GstVideoCrop *video_crop)
GST_PAD_TEMPLATE_GET (video_crop_src_template_factory), "src");
gst_element_add_pad (GST_ELEMENT (video_crop), video_crop->srcpad);
- video_crop->crop_x = 0;
- video_crop->crop_y = 0;
- video_crop->crop_width = 128;
- video_crop->crop_height = 128;
+ video_crop->crop_right = 0;
+ video_crop->crop_left = 0;
+ video_crop->crop_top = 0;
+ video_crop->crop_bottom = 0;
GST_FLAG_SET (video_crop, GST_ELEMENT_EVENT_AWARE);
}
@@ -210,17 +213,17 @@ gst_video_crop_set_property (GObject *object, guint prop_id, const GValue *value
video_crop = GST_VIDEO_CROP (object);
switch (prop_id) {
- case ARG_X:
- video_crop->crop_x = g_value_get_int (value);
+ case ARG_LEFT:
+ video_crop->crop_left = g_value_get_int (value);
break;
- case ARG_Y:
- video_crop->crop_y = g_value_get_int (value);
+ case ARG_RIGHT:
+ video_crop->crop_right = g_value_get_int (value);
break;
- case ARG_WIDTH:
- video_crop->crop_width = g_value_get_int (value);
+ case ARG_TOP:
+ video_crop->crop_top = g_value_get_int (value);
break;
- case ARG_HEIGHT:
- video_crop->crop_height = g_value_get_int (value);
+ case ARG_BOTTOM:
+ video_crop->crop_bottom = g_value_get_int (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -238,17 +241,17 @@ gst_video_crop_get_property (GObject *object, guint prop_id, GValue *value, GPar
video_crop = GST_VIDEO_CROP (object);
switch (prop_id) {
- case ARG_X:
- g_value_set_int (value, video_crop->crop_x);
+ case ARG_LEFT:
+ g_value_set_int (value, video_crop->crop_left);
break;
- case ARG_Y:
- g_value_set_int (value, video_crop->crop_y);
+ case ARG_RIGHT:
+ g_value_set_int (value, video_crop->crop_right);
break;
- case ARG_WIDTH:
- g_value_set_int (value, video_crop->crop_width);
+ case ARG_TOP:
+ g_value_set_int (value, video_crop->crop_top);
break;
- case ARG_HEIGHT:
- g_value_set_int (value, video_crop->crop_height);
+ case ARG_BOTTOM:
+ g_value_set_int (value, video_crop->crop_bottom);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -269,11 +272,7 @@ gst_video_crop_sink_connect (GstPad *pad, GstCaps *caps)
gst_caps_get_int (caps, "width", &video_crop->width);
gst_caps_get_int (caps, "height", &video_crop->height);
-
- if (video_crop->crop_width + video_crop->crop_x > video_crop->width)
- video_crop->crop_width = video_crop->width - video_crop->crop_x;
- if (video_crop->crop_height + video_crop->crop_y > video_crop->height)
- video_crop->crop_height = video_crop->height - video_crop->crop_y;
+ gst_caps_get_float (caps, "framerate", &video_crop->fps);
return GST_PAD_LINK_OK;
}
@@ -283,44 +282,48 @@ gst_video_crop_i420 (GstVideoCrop *video_crop, GstBuffer *src_buffer, GstBuffer
{
guint8 *srcY, *srcU, *srcV;
guint8 *destY, *destU, *destV;
- gint width = video_crop->crop_width;
- gint crop_height = video_crop->crop_height;
+ gint out_width = video_crop->width -
+ (video_crop->crop_left + video_crop->crop_right);
+ gint out_height = video_crop->height -
+ (video_crop->crop_top + video_crop->crop_bottom);
gint src_stride = video_crop->width;
- gint frame_size = video_crop->width * video_crop->height;
+ gint src_size = video_crop->width * video_crop->height;
gint j;
- srcY = GST_BUFFER_DATA (src_buffer) + (src_stride * video_crop->crop_y + video_crop->crop_x);
+ srcY = GST_BUFFER_DATA (src_buffer) +
+ (src_stride * video_crop->crop_top + video_crop->crop_left);
destY = GST_BUFFER_DATA (dest_buffer);
/* copy Y plane first */
- for (j = crop_height; j; j--) {
- memcpy (destY, srcY, width);
+ for (j = 0; j < out_height; j++) {
+ memcpy (destY, srcY, out_width);
srcY += src_stride;
- destY += width;
+ destY += out_width;
}
- width >>= 1;
+ out_width >>= 1;
src_stride >>= 1;
- crop_height >>= 1;
+ out_height >>= 1;
destU = destY;
- destV = destU + ((video_crop->crop_width * crop_height) >> 1);
+ destV = destU + ((out_width * out_height) >> 1);
- srcU = GST_BUFFER_DATA (src_buffer) + frame_size + ((src_stride * video_crop->crop_y + video_crop->crop_x) >> 1);
- srcV = srcU + (frame_size >> 2);
+ srcU = GST_BUFFER_DATA (src_buffer) + src_size +
+ ((src_stride * video_crop->crop_top + video_crop->crop_left) >> 1);
+ srcV = srcU + (src_size >> 2);
/* copy U plane */
- for (j = crop_height; j; j--) {
- memcpy (destU, srcU, width);
+ for (j = 0; j < out_height; j++) {
+ memcpy (destU, srcU, out_width);
srcU += src_stride;
- destU += width;
+ destU += out_width;
}
/* copy U plane */
- for (j = crop_height; j; j--) {
- memcpy (destV, srcV, width);
+ for (j = 0; j < out_height; j++) {
+ memcpy (destV, srcV, out_width);
srcV += src_stride;
- destV += width;
+ destV += out_width;
}
}
@@ -329,6 +332,7 @@ gst_video_crop_chain (GstPad *pad, GstBuffer *buffer)
{
GstVideoCrop *video_crop;
GstBuffer *outbuf;
+ gint new_width, new_height;
video_crop = GST_VIDEO_CROP (gst_pad_get_parent (pad));
@@ -343,14 +347,20 @@ gst_video_crop_chain (GstPad *pad, GstBuffer *buffer)
return;
}
+ new_width = video_crop->width -
+ (video_crop->crop_left + video_crop->crop_right);
+ new_height = video_crop->height -
+ (video_crop->crop_top + video_crop->crop_bottom);
+
if (GST_PAD_CAPS (video_crop->srcpad) == NULL) {
if (gst_pad_try_set_caps (video_crop->srcpad,
GST_CAPS_NEW (
"video_crop_caps",
"video/raw",
"format", GST_PROPS_FOURCC (GST_STR_FOURCC ("I420")),
- "width", GST_PROPS_INT (video_crop->crop_width),
- "height", GST_PROPS_INT (video_crop->crop_height)
+ "width", GST_PROPS_INT (new_width),
+ "height", GST_PROPS_INT (new_height),
+ "framerate", GST_PROPS_FLOAT (video_crop->fps)
)) <= 0)
{
gst_element_error (GST_ELEMENT (video_crop), "could not negotiate pads");
@@ -358,7 +368,7 @@ gst_video_crop_chain (GstPad *pad, GstBuffer *buffer)
}
}
- outbuf = gst_buffer_new_and_alloc ((video_crop->crop_width * video_crop->crop_height * 3) / 2);
+ outbuf = gst_buffer_new_and_alloc ((new_width * new_height * 3) / 2);
GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buffer);
gst_video_crop_i420 (video_crop, buffer, outbuf);
diff --git a/gst/videoflip/gstvideoflip.c b/gst/videoflip/gstvideoflip.c
index 6dd26247..efaa6dcd 100644
--- a/gst/videoflip/gstvideoflip.c
+++ b/gst/videoflip/gstvideoflip.c
@@ -133,9 +133,11 @@ gst_videoflip_src_template_factory(void)
static GstPadTemplate *templ = NULL;
if(!templ){
- GstCaps *caps = GST_CAPS_NEW("src","video/raw",
+ /* well, actually RGB too, but since there's no RGB format anyway */
+ GstCaps *caps = GST_CAPS_NEW("src","video/x-raw-yuv",
"width", GST_PROPS_INT_RANGE (0, G_MAXINT),
- "height", GST_PROPS_INT_RANGE (0, G_MAXINT));
+ "height", GST_PROPS_INT_RANGE (0, G_MAXINT),
+ "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT));
caps = gst_caps_intersect(caps, gst_videoflip_get_capslist ());
@@ -150,9 +152,10 @@ gst_videoflip_sink_template_factory(void)
static GstPadTemplate *templ = NULL;
if(!templ){
- GstCaps *caps = GST_CAPS_NEW("sink","video/raw",
+ GstCaps *caps = GST_CAPS_NEW("sink","video/x-raw-yuv",
"width", GST_PROPS_INT_RANGE (0, G_MAXINT),
- "height", GST_PROPS_INT_RANGE (0, G_MAXINT));
+ "height", GST_PROPS_INT_RANGE (0, G_MAXINT),
+ "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT));
caps = gst_caps_intersect(caps, gst_videoflip_get_capslist ());
@@ -214,9 +217,10 @@ gst_videoflip_sink_getcaps (GstPad *pad, GstCaps *caps)
}
gst_caps_unref (peercaps);
- sizecaps = GST_CAPS_NEW("videoflip_size","video/raw",
+ sizecaps = GST_CAPS_NEW("videoflip_size","video/x-raw-yuv",
"width", GST_PROPS_INT_RANGE (0, G_MAXINT),
- "height", GST_PROPS_INT_RANGE (0, G_MAXINT));
+ "height", GST_PROPS_INT_RANGE (0, G_MAXINT),
+ "framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT));
caps = gst_caps_intersect(caps, gst_videoflip_get_capslist ());
gst_caps_unref (sizecaps);
diff --git a/gst/videoflip/videoflip.c b/gst/videoflip/videoflip.c
index 14764019..9255e007 100644
--- a/gst/videoflip/videoflip.c
+++ b/gst/videoflip/videoflip.c
@@ -36,7 +36,6 @@ struct videoflip_format_struct videoflip_formats[] = {
/* planar */
{ "YV12", 12, gst_videoflip_planar411, },
{ "I420", 12, gst_videoflip_planar411, },
- { "IYUV", 12, gst_videoflip_planar411, },
};
int videoflip_n_formats = sizeof(videoflip_formats)/sizeof(videoflip_formats[0]);
@@ -53,8 +52,7 @@ videoflip_get_caps(struct videoflip_format_struct *format)
fourcc = GST_MAKE_FOURCC(format->fourcc[0],format->fourcc[1],format->fourcc[2],format->fourcc[3]);
if(format->bpp){
- caps = GST_CAPS_NEW ("videoflip", "video/raw",
- "format", GST_PROPS_FOURCC (fourcc),
+ caps = GST_CAPS_NEW ("videoflip", "video/x-raw-rgb",
"depth", GST_PROPS_INT(format->bpp),
"bpp", GST_PROPS_INT(format->depth),
"endianness", GST_PROPS_INT(format->endianness),
@@ -62,7 +60,7 @@ videoflip_get_caps(struct videoflip_format_struct *format)
"green_mask", GST_PROPS_INT(format->green_mask),
"blue_mask", GST_PROPS_INT(format->blue_mask));
}else{
- caps = GST_CAPS_NEW ("videoflip", "video/raw",
+ caps = GST_CAPS_NEW ("videoflip", "video/x-raw-yuv",
"format", GST_PROPS_FOURCC (fourcc));
}
diff --git a/gst/wavenc/gstwavenc.c b/gst/wavenc/gstwavenc.c
index 81487867..aca1397e 100644
--- a/gst/wavenc/gstwavenc.c
+++ b/gst/wavenc/gstwavenc.c
@@ -83,9 +83,7 @@ GST_PAD_TEMPLATE_FACTORY (sink_factory,
GST_PAD_ALWAYS,
GST_CAPS_NEW (
"wavenc_raw",
- "audio/raw",
- "format", GST_PROPS_STRING ("int"),
- "law", GST_PROPS_INT (0),
+ "audio/x-raw-int",
"endianness", GST_PROPS_INT (G_LITTLE_ENDIAN),
"signed", GST_PROPS_BOOLEAN (TRUE),
"width", GST_PROPS_LIST (
diff --git a/gst/wavparse/gstwavparse.c b/gst/wavparse/gstwavparse.c
index f8966fc1..52ee103a 100644
--- a/gst/wavparse/gstwavparse.c
+++ b/gst/wavparse/gstwavparse.c
@@ -79,9 +79,7 @@ GST_PAD_TEMPLATE_FACTORY (src_template_factory,
GST_PAD_ALWAYS,
GST_CAPS_NEW (
"wavparse_raw",
- "audio/raw",
- "format", GST_PROPS_STRING ("int"),
- "law", GST_PROPS_INT (0),
+ "audio/x-raw-int",
"endianness", GST_PROPS_INT (G_LITTLE_ENDIAN),
"signed", GST_PROPS_LIST (
GST_PROPS_BOOLEAN (FALSE),
@@ -99,18 +97,21 @@ GST_PAD_TEMPLATE_FACTORY (src_template_factory,
"channels", GST_PROPS_INT_RANGE (1, 2)
),
GST_CAPS_NEW (
- "wavparse_mp3",
- "audio/x-mp3",
- NULL
+ "wavparse_mpeg",
+ "audio/mpeg",
+ "rate", GST_PROPS_INT_RANGE (8000, 48000),
+ "channels", GST_PROPS_INT_RANGE (1, 2),
+ "layer", GST_PROPS_INT_RANGE (1, 3)
),
GST_CAPS_NEW (
"parsewav_law",
- "audio/raw",
- "format", GST_PROPS_STRING ("int"),
- "law", GST_PROPS_INT_RANGE (1, 2),
- "endianness", GST_PROPS_INT (G_LITTLE_ENDIAN),
- "width", GST_PROPS_INT (8),
- "depth", GST_PROPS_INT (8),
+ "audio/x-alaw",
+ "rate", GST_PROPS_INT_RANGE (8000, 48000),
+ "channels", GST_PROPS_INT_RANGE (1, 2)
+ ),
+ GST_CAPS_NEW (
+ "parsewav_law",
+ "audio/x-mulaw",
"rate", GST_PROPS_INT_RANGE (8000, 48000),
"channels", GST_PROPS_INT_RANGE (1, 2)
)
@@ -371,29 +372,26 @@ gst_wavparse_chain (GstPad *pad, GstBuffer *buf)
switch (wavparse->format)
{
case GST_RIFF_WAVE_FORMAT_ALAW:
- case GST_RIFF_WAVE_FORMAT_MULAW:
+ case GST_RIFF_WAVE_FORMAT_MULAW: {
+ gchar *mime = (wavparse->format == GST_RIFF_WAVE_FORMAT_ALAW) ?
+ "audio/x-alaw" : "audio/x-mulaw";
if (!(wavparse->width == 8)) {
- gst_element_error (GST_ELEMENT (wavparse), "wavparse: invalid wave file");
+ g_warning("Ignoring invalid width %d",
+ wavparse->width);
return;
}
caps = GST_CAPS_NEW (
"parsewav_src",
- "audio/raw",
- "format", GST_PROPS_STRING ("int"),
- "law", GST_PROPS_INT (wavparse->format == GST_RIFF_WAVE_FORMAT_ALAW ? 2 : 1),
- "endianness", GST_PROPS_INT (G_LITTLE_ENDIAN),
- "width", GST_PROPS_INT (8),
- "depth", GST_PROPS_INT (8),
+ mime,
"rate", GST_PROPS_INT (wavparse->rate),
"channels", GST_PROPS_INT (wavparse->channels)
);
+ }
break;
case GST_RIFF_WAVE_FORMAT_PCM:
caps = GST_CAPS_NEW (
"parsewav_src",
- "audio/raw",
- "format", GST_PROPS_STRING ("int"),
- "law", GST_PROPS_INT (0),
+ "audio/x-raw-int",
"endianness", GST_PROPS_INT (G_LITTLE_ENDIAN),
"signed", GST_PROPS_BOOLEAN ((wavparse->width > 8) ? TRUE : FALSE),
"width", GST_PROPS_INT (wavparse->width),
@@ -403,13 +401,18 @@ gst_wavparse_chain (GstPad *pad, GstBuffer *buf)
);
break;
case GST_RIFF_WAVE_FORMAT_MPEGL12:
- case GST_RIFF_WAVE_FORMAT_MPEGL3:
+ case GST_RIFF_WAVE_FORMAT_MPEGL3: {
+ gint layer = (wavparse->format == GST_RIFF_WAVE_FORMAT_MPEGL12) ? 2 : 3;
caps = GST_CAPS_NEW (
"parsewav_src",
- "audio/x-mp3",
- NULL
+ "audio/mpeg",
+ "layer", GST_PROPS_INT (layer),
+ "rate", GST_PROPS_INT (wavparse->rate),
+ "channels", GST_PROPS_INT (wavparse->channels)
);
+ }
break;
+
default:
gst_element_error (GST_ELEMENT (wavparse), "wavparse: format %d not handled", wavparse->format);
return;