diff options
author | Ronald S. Bultje <rbultje@ronald.bitfreak.net> | 2003-07-06 20:49:52 +0000 |
---|---|---|
committer | Ronald S. Bultje <rbultje@ronald.bitfreak.net> | 2003-07-06 20:49:52 +0000 |
commit | 292fec2a0bd1f221a46ad69c5100995d04c01057 (patch) | |
tree | 658db299e0e03b2454ff840730569d79539e67c4 /gst | |
parent | a8183e9a3fa87cf4247c7df16207f440ea4069c0 (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')
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; |