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
This commit is contained in:
Ronald S. Bultje 2003-07-06 20:49:52 +00:00
parent d4d7574625
commit b005531324
24 changed files with 496 additions and 315 deletions

View file

@ -409,34 +409,35 @@ dnl FIXME: add check if this platform can support linking to a
dnl non-PIC libXv, if not then don not use Xv. dnl non-PIC libXv, if not then don not use Xv.
dnl FIXME: perhaps warn user if they have a shared libXv since dnl FIXME: perhaps warn user if they have a shared libXv since
dnl this is an error until XFree86 starts shipping one dnl this is an error until XFree86 starts shipping one
translit(dnm, m, l) AM_CONDITIONAL(USE_XVIDEO, true) translit(dnm, m, l) AM_CONDITIONAL(USE_XFREE, true)
GST_CHECK_FEATURE(XFREE, [X11 XFree86], xvideosink-X, [
GST_CHECK_FEATURE(XVIDEO, [X11 XVideo extensions], xvideosink, [ if test "-DX_DISPLAY_MISSING" = "$X_CFLAGS"; then
if test -z $X_DISPLAY_MISSING; then HAVE_XFREE=no
HAVE_XVIDEO=yes
else else
HAVE_XVIDEO=no HAVE_XFREE=yes
fi fi
]) ])
dnl Check for Xv extension dnl Check for Xv extension
translit(dnm, m, l) AM_CONDITIONAL(USE_XVIDEO, true)
if test x$HAVE_XVIDEO = xyes; then GST_CHECK_FEATURE(XVIDEO, [X11 XVideo extensions], xvideosink-Xv, [
AC_CHECK_LIB(Xv_pic, XvQueryExtension, HAVE_XV="yes", HAVE_XV="no", $X_LIBS $X_PRE_LIBS -lXext -lX11 $X_EXTRA_LIBS) if test x$HAVE_XFREE = xyes; then
AC_CHECK_LIB(Xv_pic, XvQueryExtension,
if test x$HAVE_XV = xyes; then HAVE_XVIDEO="yes", HAVE_XVIDEO="no",
AC_DEFINE(HAVE_XV, 1, [Define if Xv extension is available]) $X_LIBS $X_PRE_LIBS -lXext -lX11 $X_EXTRA_LIBS)
XVIDEO_LIBS="-lXv_pic -lXext" XVIDEO_LIBS="-lXv_pic -lXext"
AC_SUBST(XVIDEO_LIBS)
else dnl try again using something else if we didn't find it first
AC_CHECK_LIB(Xv, XvQueryExtension, HAVE_XVIDEO="yes", HAVE_XVIDEO="no", $X_LIBS $X_PRE_LIBS -lXext -lX11 $X_EXTRA_LIBS) if test x$HAVE_XVIDEO = xno; then
if test x$HAVE_XV = xyes; then AC_CHECK_LIB(Xv, XvQueryExtension,
AC_DEFINE(HAVE_XV, 1, [Define if Xv extension is available]) HAVE_XVIDEO="yes", HAVE_XVIDEO="no",
$X_LIBS $X_PRE_LIBS -lXext -lX11 $X_EXTRA_LIBS)
XVIDEO_LIBS="-lXv -lXext" XVIDEO_LIBS="-lXv -lXext"
AC_SUBST(XVIDEO_LIBS)
fi fi
AC_SUBST(XVIDEO_LIBS)
fi fi
fi ])
dnl Next, check for the optional libraries: dnl Next, check for the optional libraries:
dnl These are all libraries used in building plug-ins dnl These are all libraries used in building plug-ins

View file

@ -1006,7 +1006,7 @@ gst_alsa_src_set_caps (GstAlsaSrc *src, gboolean aggressive)
GstCaps *all_caps, *caps, *walk; GstCaps *all_caps, *caps, *walk;
gint channels, min_channels, max_channels; gint channels, min_channels, max_channels;
gint rate, min_rate, max_rate; gint rate, min_rate, max_rate;
gint i, law, endian, width, depth; gint i, endian, width, depth;
gboolean sign; gboolean sign;
GstAlsa *this = GST_ALSA (src); GstAlsa *this = GST_ALSA (src);
@ -1022,9 +1022,7 @@ gst_alsa_src_set_caps (GstAlsaSrc *src, gboolean aggressive)
} }
/* construct caps */ /* construct caps */
caps = GST_CAPS_NEW ("alsasrc caps", "audio/raw", caps = GST_CAPS_NEW ("alsasrc caps", "audio/x-raw-int",
"format", GST_PROPS_STRING ("int"),
"law", GST_PROPS_INT (0),
"endianness", GST_PROPS_INT (G_BYTE_ORDER), "endianness", GST_PROPS_INT (G_BYTE_ORDER),
"signed", GST_PROPS_BOOLEAN (TRUE), "signed", GST_PROPS_BOOLEAN (TRUE),
"width", GST_PROPS_INT (16), "width", GST_PROPS_INT (16),
@ -1037,13 +1035,12 @@ gst_alsa_src_set_caps (GstAlsaSrc *src, gboolean aggressive)
/* now try to find the best match */ /* now try to find the best match */
walk = all_caps; walk = all_caps;
while (walk) { while (walk) {
gst_caps_get (walk, "law", &law, "signed", &sign, "width", &width, "depth", &depth, NULL); gst_caps_get (walk, "signed", &sign, "width", &width, "depth", &depth, NULL);
if (gst_caps_has_property (walk, "endianness")) { if (gst_caps_has_property (walk, "endianness")) {
gst_caps_get_int (walk, "endianness", &endian); gst_caps_get_int (walk, "endianness", &endian);
} else { } else {
endian = G_BYTE_ORDER; endian = G_BYTE_ORDER;
} }
gst_caps_set (caps, "law", GST_PROPS_INT (law));
gst_caps_set (caps, "endianness", GST_PROPS_INT (endian)); gst_caps_set (caps, "endianness", GST_PROPS_INT (endian));
gst_caps_set (caps, "width", GST_PROPS_INT (width)); gst_caps_set (caps, "width", GST_PROPS_INT (width));
gst_caps_set (caps, "depth", GST_PROPS_INT (depth)); gst_caps_set (caps, "depth", GST_PROPS_INT (depth));
@ -1057,8 +1054,8 @@ gst_alsa_src_set_caps (GstAlsaSrc *src, gboolean aggressive)
gst_caps_set (caps, "rate", GST_PROPS_INT (rate)); gst_caps_set (caps, "rate", GST_PROPS_INT (rate));
for (channels = aggressive ? max_channels : MIN (max_channels, 2); channels >= min_channels; channels--) { for (channels = aggressive ? max_channels : MIN (max_channels, 2); channels >= min_channels; channels--) {
gst_caps_set (caps, "channels", GST_PROPS_INT (channels)); gst_caps_set (caps, "channels", GST_PROPS_INT (channels));
GST_DEBUG ("trying new caps: law %d, %ssigned, endianness: %d, width %d, depth %d, channels %d, rate %d\n", GST_DEBUG ("trying new caps: %ssigned, endianness: %d, width %d, depth %d, channels %d, rate %d\n",
law, sign ? "" : "un", endian, width, depth, channels, rate); sign ? "" : "un", endian, width, depth, channels, rate);
if (gst_pad_try_set_caps (this->pad[0], caps) != GST_PAD_LINK_REFUSED) if (gst_pad_try_set_caps (this->pad[0], caps) != GST_PAD_LINK_REFUSED)
gst_alsa_link (this->pad[0], caps); gst_alsa_link (this->pad[0], caps);
@ -1234,25 +1231,23 @@ found_channel:
static GstAlsaFormat * static GstAlsaFormat *
gst_alsa_get_format (GstCaps *caps) gst_alsa_get_format (GstCaps *caps)
{ {
const gchar *format_name; const gchar *mimetype;
GstAlsaFormat *ret; GstAlsaFormat *ret;
if (!(ret = g_new (GstAlsaFormat, 1))) if (!(ret = g_new (GstAlsaFormat, 1)))
return NULL; return NULL;
/* we have to differentiate between int and float formats */ /* we have to differentiate between int and float formats */
if (!gst_caps_get_string (caps, "format", &format_name)) mimetype = gst_caps_get_mime (caps);
goto error;
if (strncmp (format_name, "int", 3) == 0) { if (strcmp (mimetype, "audio/x-raw-int") == 0) {
gboolean sign; gboolean sign;
gint width, depth, endianness, law; gint width, depth, endianness;
/* extract the needed information from the caps */ /* extract the needed information from the caps */
if (!gst_caps_get (caps, if (!gst_caps_get (caps,
"width", &width, "width", &width,
"depth", &depth, "depth", &depth,
"law", &law,
"signed", &sign, "signed", &sign,
NULL)) NULL))
goto error; goto error;
@ -1268,33 +1263,13 @@ gst_alsa_get_format (GstCaps *caps)
} }
/* find corresponding alsa format */ /* find corresponding alsa format */
switch (law) { ret->format = snd_pcm_build_linear_format (depth, width, sign ? 0 : 1, endianness == G_LITTLE_ENDIAN ? 0 : 1);
case 0: } else if (strcmp (mimetype, "audio/x-raw-float") == 0) {
ret->format = snd_pcm_build_linear_format (depth, width, sign ? 0 : 1, endianness == G_LITTLE_ENDIAN ? 0 : 1); gint depth;
break;
case 1:
if (width == 8 && depth == 8 && sign == FALSE) {
ret->format = SND_PCM_FORMAT_MU_LAW;
break;
} else {
goto error;
}
case 2:
if (width == 8 && depth == 8 && sign == FALSE) {
ret->format = SND_PCM_FORMAT_A_LAW;
break;
} else {
goto error;
}
default:
goto error;
}
} else if (strncmp (format_name, "float", 5) == 0) {
gchar *layout;
gfloat intercept, slope; gfloat intercept, slope;
/* get layout */ /* get layout */
if (!gst_caps_get (caps, "layout", &layout, if (!gst_caps_get (caps, "depth", &depth,
"intercept", &intercept, "intercept", &intercept,
"slope", &slope, "slope", &slope,
NULL)) NULL))
@ -1303,7 +1278,7 @@ gst_alsa_get_format (GstCaps *caps)
goto error; goto error;
} }
/* match layout to format wrt to endianness */ /* match layout to format wrt to endianness */
if (strncmp (layout, "gfloat", 6) == 0) { if (depth == 32) {
if (G_BYTE_ORDER == G_LITTLE_ENDIAN) { if (G_BYTE_ORDER == G_LITTLE_ENDIAN) {
ret->format = SND_PCM_FORMAT_FLOAT_LE; ret->format = SND_PCM_FORMAT_FLOAT_LE;
} else if (G_BYTE_ORDER == G_BIG_ENDIAN) { } else if (G_BYTE_ORDER == G_BIG_ENDIAN) {
@ -1311,7 +1286,7 @@ gst_alsa_get_format (GstCaps *caps)
} else { } else {
ret->format = SND_PCM_FORMAT_FLOAT; ret->format = SND_PCM_FORMAT_FLOAT;
} }
} else if (strncmp (layout, "gdouble", 7) == 0) { } else if (depth == 64) {
if (G_BYTE_ORDER == G_LITTLE_ENDIAN) { if (G_BYTE_ORDER == G_LITTLE_ENDIAN) {
ret->format = SND_PCM_FORMAT_FLOAT64_LE; ret->format = SND_PCM_FORMAT_FLOAT64_LE;
} else if (G_BYTE_ORDER == G_BIG_ENDIAN) { } else if (G_BYTE_ORDER == G_BIG_ENDIAN) {
@ -1322,7 +1297,11 @@ gst_alsa_get_format (GstCaps *caps)
} else { } else {
goto error; goto error;
} }
} } else if (!strcmp (mimetype, "audio/x-alaw")) {
ret->format = SND_PCM_FORMAT_A_LAW;
} else if (!strcmp (mimetype, "audio/x-mulaw")) {
ret->format = SND_PCM_FORMAT_MU_LAW;
}
/* get rate and channels */ /* get rate and channels */
if (!gst_caps_get (caps, "rate", &ret->rate, if (!gst_caps_get (caps, "rate", &ret->rate,
@ -1347,18 +1326,22 @@ gst_alsa_formats_match (GstAlsaFormat *one, GstAlsaFormat *two)
(one->channels == two->channels); (one->channels == two->channels);
} }
/* get props for a spec */ /* get props for a spec */
static GstProps * static GstCaps *
gst_alsa_get_props (snd_pcm_format_t format) gst_alsa_get_caps_internal (snd_pcm_format_t format)
{ {
gchar *name = snd_pcm_format_name (format);
if (format == SND_PCM_FORMAT_A_LAW) { if (format == SND_PCM_FORMAT_A_LAW) {
return gst_props_new ("format", GST_PROPS_STRING ("int"), return GST_CAPS_NEW (name, "audio/x-alaw",
"format", GST_PROPS_STRING ("int"),
"law", GST_PROPS_INT(2), "law", GST_PROPS_INT(2),
"width", GST_PROPS_INT(8), "width", GST_PROPS_INT(8),
"depth", GST_PROPS_INT(8), "depth", GST_PROPS_INT(8),
"signed", GST_PROPS_BOOLEAN (FALSE), "signed", GST_PROPS_BOOLEAN (FALSE),
NULL); NULL);
} else if (format == SND_PCM_FORMAT_MU_LAW) { } else if (format == SND_PCM_FORMAT_MU_LAW) {
return gst_props_new ("format", GST_PROPS_STRING ("int"), return GST_CAPS_NEW (name, "audio/x-mulaw",
"format", GST_PROPS_STRING ("int"),
"law", GST_PROPS_INT(1), "law", GST_PROPS_INT(1),
"width", GST_PROPS_INT(8), "width", GST_PROPS_INT(8),
"depth", GST_PROPS_INT(8), "depth", GST_PROPS_INT(8),
@ -1387,16 +1370,17 @@ gst_alsa_get_props (snd_pcm_format_t format)
break; break;
} }
} }
return props; return GST_CAPS_NEW (name, "audio/x-raw-int", props);
} else if (snd_pcm_format_float (format)) { } else if (snd_pcm_format_float (format)) {
/* no float with non-platform endianness */ /* no float with non-platform endianness */
if (!snd_pcm_format_cpu_endian (format)) if (!snd_pcm_format_cpu_endian (format))
return NULL; return NULL;
return gst_props_new ("format", GST_PROPS_STRING ("float"), return GST_CAPS_NEW (name, "audio/x-raw-float",
"layout", GST_PROPS_STRING (snd_pcm_format_width (format) == 64 ? "gdouble" : "gfloat"), "depth", GST_PROPS_INT (snd_pcm_format_width (format)),
"intercept", GST_PROPS_FLOAT (0), "endianness", GST_PROPS_INT (G_BYTE_ORDER),
"slope", GST_PROPS_FLOAT (1), "intercept", GST_PROPS_FLOAT (0.),
"slope", GST_PROPS_FLOAT (1.),
NULL); NULL);
} }
return NULL; return NULL;
@ -1433,23 +1417,24 @@ gst_alsa_caps (snd_pcm_format_t format, gint rate, gint channels)
if (format != SND_PCM_FORMAT_UNKNOWN) { if (format != SND_PCM_FORMAT_UNKNOWN) {
/* there are some caps set already */ /* there are some caps set already */
GstProps *props = gst_alsa_get_props (format); ret_caps = gst_alsa_get_caps_internal (format);
/* we can never use a format we can't set caps for */
g_assert (props != NULL);
add_channels (props, rate, -1, channels, -1); /* we can never use a format we can't set caps for */
ret_caps = gst_caps_new (g_strdup (snd_pcm_format_name (format)), "audio/raw", props); g_assert (ret_caps != NULL);
g_assert (ret_caps->properties != NULL);
add_channels (ret_caps->properties, rate, -1, channels, -1);
} else { } else {
int i; int i;
GstProps *props; GstCaps *temp;
for (i = 0; i <= SND_PCM_FORMAT_LAST; i++) { for (i = 0; i <= SND_PCM_FORMAT_LAST; i++) {
props = gst_alsa_get_props (i); temp = gst_alsa_get_caps_internal (i);
/* can be NULL, because not all alsa formats can be specified as caps */ /* can be NULL, because not all alsa formats can be specified as caps */
if (props != NULL) { if (temp != NULL && temp->properties != NULL) {
add_channels (props, rate, -1, channels, -1); add_channels (temp->props, rate, -1, channels, -1);
ret_caps = gst_caps_append (ret_caps, gst_caps_new (g_strdup (snd_pcm_format_name (i)), ret_caps = gst_caps_append (ret_caps, temp);
"audio/raw", props));
} }
} }
} }
@ -1485,18 +1470,18 @@ gst_alsa_get_caps (GstPad *pad, GstCaps *caps)
max_channels = -1; max_channels = -1;
} else { } else {
ERROR_CHECK (snd_pcm_hw_params_get_channels_min (hw_params, &min_rate), ERROR_CHECK (snd_pcm_hw_params_get_channels_min (hw_params, &min_rate),
"Coulödn't get minimum channel count for device %s: %s", this->device); "Coulödn't get minimum channel count for device %s: %s", this->device);
ERROR_CHECK (snd_pcm_hw_params_get_channels_max (hw_params, &max_rate), ERROR_CHECK (snd_pcm_hw_params_get_channels_max (hw_params, &max_rate),
"Coulödn't get maximum channel count for device %s: %s", this->device); "Coulödn't get maximum channel count for device %s: %s", this->device);
min_channels = min_rate; min_channels = min_rate;
max_channels = max_rate > GST_ALSA_MAX_CHANNELS ? GST_ALSA_MAX_CHANNELS : max_rate; max_channels = max_rate > GST_ALSA_MAX_CHANNELS ? GST_ALSA_MAX_CHANNELS : max_rate;
} }
ERROR_CHECK (snd_pcm_hw_params_get_rate_min (hw_params, &min_rate, &i), ERROR_CHECK (snd_pcm_hw_params_get_rate_min (hw_params, &min_rate, &i),
"Coulödn't get minimum rate for device %s: %s", this->device); "Coulödn't get minimum rate for device %s: %s", this->device);
min_rate = min_rate < GST_ALSA_MIN_RATE ? GST_ALSA_MIN_RATE : min_rate + i; min_rate = min_rate < GST_ALSA_MIN_RATE ? GST_ALSA_MIN_RATE : min_rate + i;
ERROR_CHECK (snd_pcm_hw_params_get_rate_max (hw_params, &max_rate, &i), ERROR_CHECK (snd_pcm_hw_params_get_rate_max (hw_params, &max_rate, &i),
"Coulödn't get maximum rate for device %s: %s", this->device); "Coulödn't get maximum rate for device %s: %s", this->device);
max_rate = max_rate > GST_ALSA_MAX_RATE ? GST_ALSA_MAX_RATE : max_rate + i; max_rate = max_rate > GST_ALSA_MAX_RATE ? GST_ALSA_MAX_RATE : max_rate + i;
snd_pcm_format_mask_alloca (&mask); snd_pcm_format_mask_alloca (&mask);

View file

@ -60,9 +60,7 @@ GST_PAD_TEMPLATE_FACTORY (cdparanoia_src_factory,
GST_PAD_ALWAYS, GST_PAD_ALWAYS,
GST_CAPS_NEW ( GST_CAPS_NEW (
"cdparanoia_src", "cdparanoia_src",
"audio/raw", "audio/x-raw-int",
"format", GST_PROPS_STRING ("int"),
"law", GST_PROPS_INT (0),
"endianness", GST_PROPS_INT (G_BYTE_ORDER), "endianness", GST_PROPS_INT (G_BYTE_ORDER),
"signed", GST_PROPS_BOOLEAN (TRUE), "signed", GST_PROPS_BOOLEAN (TRUE),
"width", GST_PROPS_INT (16), "width", GST_PROPS_INT (16),

View file

@ -36,7 +36,7 @@ vorbis_caps_factory (void)
return return
gst_caps_new ( gst_caps_new (
"vorbis_vorbis", "vorbis_vorbis",
"application/x-ogg", "application/ogg",
NULL); NULL);
} }
@ -46,10 +46,8 @@ raw_caps_factory (void)
return return
gst_caps_new ( gst_caps_new (
"vorbis_raw", "vorbis_raw",
"audio/raw", "audio/x-raw-int",
gst_props_new ( gst_props_new (
"format", GST_PROPS_STRING ("int"),
"law", GST_PROPS_INT (0),
"endianness", GST_PROPS_INT (G_BYTE_ORDER), "endianness", GST_PROPS_INT (G_BYTE_ORDER),
"signed", GST_PROPS_BOOLEAN (TRUE), "signed", GST_PROPS_BOOLEAN (TRUE),
"width", GST_PROPS_INT (16), "width", GST_PROPS_INT (16),
@ -65,10 +63,12 @@ raw_caps2_factory (void)
return return
gst_caps_new ( gst_caps_new (
"vorbis_raw_float", "vorbis_raw_float",
"audio/raw", "audio/x-raw-float",
gst_props_new ( gst_props_new (
"format", GST_PROPS_STRING ("float"), "depth", GST_PROPS_INT (32),
"layout", GST_PROPS_STRING ("IEEE"), "endianness", GST_PROPS_INT (G_BYTE_ORDER),
"slope", GST_PROPS_FLOAT (1.),
"intercept", GST_PROPS_FLOAT (0.),
"rate", GST_PROPS_INT_RANGE (11025, 48000), "rate", GST_PROPS_INT_RANGE (11025, 48000),
"channels", GST_PROPS_INT (2), "channels", GST_PROPS_INT (2),
NULL)); NULL));
@ -76,7 +76,7 @@ raw_caps2_factory (void)
static GstTypeDefinition vorbisdefinition = { static GstTypeDefinition vorbisdefinition = {
"vorbis_audio/x-ogg", "vorbis_audio/x-ogg",
"application/x-ogg", "application/ogg",
".ogg", ".ogg",
vorbis_type_find, vorbis_type_find,
}; };
@ -98,7 +98,7 @@ vorbis_type_find (GstBuffer *buf, gpointer private)
head = GUINT32_FROM_BE (*((guint32 *)data)); head = GUINT32_FROM_BE (*((guint32 *)data));
if (head == 0x4F676753) { if (head == 0x4F676753) {
return gst_caps_new ("vorbis_type_find", "application/x-ogg", NULL); return gst_caps_new ("vorbis_type_find", "application/ogg", NULL);
} else { } else {
/* checks for existance of vorbis identification header in case /* checks for existance of vorbis identification header in case
* there's an ID3 tag */ * there's an ID3 tag */
@ -110,7 +110,7 @@ vorbis_type_find (GstBuffer *buf, gpointer private)
data[offset+4] == 'b' && data[offset+4] == 'b' &&
data[offset+5] == 'i' && data[offset+5] == 'i' &&
data[offset+6] == 's' ) { data[offset+6] == 's' ) {
return gst_caps_new ("vorbis_type_find", "application/x-ogg", NULL); return gst_caps_new ("vorbis_type_find", "application/ogg", NULL);
} }
} }
} }

View file

@ -148,7 +148,7 @@ gst_vorbisenc_class_init (VorbisEncClass * klass)
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_QUALITY, g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_QUALITY,
g_param_spec_float ("quality", "Quality", g_param_spec_float ("quality", "Quality",
"Specify quality instead of specifying a particular bitrate.", "Specify quality instead of specifying a particular bitrate.",
-1.0, 10.0, QUALITY_DEFAULT, G_PARAM_READWRITE)); 0.0, 1.0, QUALITY_DEFAULT, G_PARAM_READWRITE));
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SERIAL, g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SERIAL,
g_param_spec_int ("serial", "Serial", "Specify a serial number for the stream. (-1 is random)", g_param_spec_int ("serial", "Serial", "Specify a serial number for the stream. (-1 is random)",
-1, G_MAXINT, -1, G_PARAM_READWRITE)); -1, G_MAXINT, -1, G_PARAM_READWRITE));

View file

@ -467,9 +467,7 @@ gst_vorbisfile_new_link (VorbisFile *vorbisfile, gint link)
gst_vorbisfile_update_streaminfo (vorbisfile, link); gst_vorbisfile_update_streaminfo (vorbisfile, link);
caps = GST_CAPS_NEW ("vorbisdec_src", caps = GST_CAPS_NEW ("vorbisdec_src",
"audio/raw", "audio/x-raw-int",
"format", GST_PROPS_STRING ("int"),
"law", GST_PROPS_INT (0),
"endianness", GST_PROPS_INT (G_BYTE_ORDER), "endianness", GST_PROPS_INT (G_BYTE_ORDER),
"signed", GST_PROPS_BOOLEAN (TRUE), "signed", GST_PROPS_BOOLEAN (TRUE),
"width", GST_PROPS_INT (16), "width", GST_PROPS_INT (16),

View file

@ -52,8 +52,6 @@
#define GST_AUDIO_INT_PAD_TEMPLATE_PROPS \ #define GST_AUDIO_INT_PAD_TEMPLATE_PROPS \
gst_props_new (\ gst_props_new (\
"format", GST_PROPS_STRING ("int"),\
"law", GST_PROPS_INT (0),\
"endianness", GST_PROPS_INT (G_BYTE_ORDER),\ "endianness", GST_PROPS_INT (G_BYTE_ORDER),\
"signed", GST_PROPS_LIST (\ "signed", GST_PROPS_LIST (\
GST_PROPS_BOOLEAN (TRUE),\ GST_PROPS_BOOLEAN (TRUE),\
@ -70,8 +68,6 @@
#define GST_AUDIO_INT_MONO_PAD_TEMPLATE_PROPS \ #define GST_AUDIO_INT_MONO_PAD_TEMPLATE_PROPS \
gst_props_new (\ gst_props_new (\
"format", GST_PROPS_STRING ("int"),\
"law", GST_PROPS_INT (0),\
"endianness", GST_PROPS_INT (G_BYTE_ORDER),\ "endianness", GST_PROPS_INT (G_BYTE_ORDER),\
"signed", GST_PROPS_LIST (\ "signed", GST_PROPS_LIST (\
GST_PROPS_BOOLEAN (TRUE),\ GST_PROPS_BOOLEAN (TRUE),\
@ -88,8 +84,8 @@
#define GST_AUDIO_FLOAT_MONO_PAD_TEMPLATE_PROPS \ #define GST_AUDIO_FLOAT_MONO_PAD_TEMPLATE_PROPS \
gst_props_new (\ gst_props_new (\
"format", GST_PROPS_STRING ("float"),\ "depth", GST_PROPS_INT (32),\
"layout", GST_PROPS_STRING ("gfloat"),\ "endianness", GST_PROPS_INT (G_BYTE_ORDER),\
"intercept", GST_PROPS_FLOAT (0.0),\ "intercept", GST_PROPS_FLOAT (0.0),\
"slope", GST_PROPS_FLOAT (1.0),\ "slope", GST_PROPS_FLOAT (1.0),\
"rate", GST_PROPS_INT_RANGE (GST_AUDIO_MIN_RATE, \ "rate", GST_PROPS_INT_RANGE (GST_AUDIO_MIN_RATE, \

View file

@ -20,31 +20,36 @@
#include "video.h" #include "video.h"
#define NUM_UNITS 1000000000
/* This is simply a convenience function, nothing more or less */ /* This is simply a convenience function, nothing more or less */
gdouble gfloat
gst_video_frame_rate (GstPad *pad) gst_video_frame_rate (GstPad *pad)
{ {
GstFormat dest_format = GST_FORMAT_DEFAULT; gfloat fps = 0.;
gint64 dest_value = 0; GstCaps *caps;
gdouble fps;
/* do a convert request on the source pad */ /* get pad caps */
if (!gst_pad_convert(pad, caps = GST_PAD_CAPS (pad);
GST_FORMAT_TIME, GST_SECOND * NUM_UNITS, if (caps == NULL) {
&dest_format, &dest_value)) g_warning ("gstvideo: failed to get caps of pad %s:%s",
{ GST_ELEMENT_NAME (gst_pad_get_parent (pad)),
g_warning("gstvideo: pad %s:%s failed to convert time to unit!\n", GST_PAD_NAME(pad));
GST_ELEMENT_NAME(gst_pad_get_parent (pad)), GST_PAD_NAME(pad));
return 0.; return 0.;
} }
fps = ((gdouble) dest_value) / NUM_UNITS; if (!gst_caps_has_property_typed (caps, "framerate",
GST_PROPS_FLOAT_TYPE)) {
g_warning ("gstvideo: failed to get framerate property of pad %s:%s",
GST_ELEMENT_NAME (gst_pad_get_parent (pad)),
GST_PAD_NAME (pad));
return 0.;
}
GST_DEBUG ("Framerate request on pad %s:%s - %f fps", gst_caps_get_float (caps, "framerate", &fps);
GST_ELEMENT_NAME(gst_pad_get_parent (pad)), GST_PAD_NAME(pad), fps);
GST_DEBUG ("Framerate request on pad %s:%s: %f",
GST_ELEMENT_NAME (gst_pad_get_parent (pad)),
GST_PAD_NAME(pad), fps);
return fps; return fps;
} }
@ -56,28 +61,37 @@ gst_video_get_size (GstPad *pad,
{ {
GstCaps *caps; GstCaps *caps;
g_return_val_if_fail(pad != NULL, FALSE); g_return_val_if_fail (pad != NULL, FALSE);
caps = GST_PAD_CAPS(pad); caps = GST_PAD_CAPS (pad);
if (!caps) {
g_warning("gstvideo: failed to get caps of pad %s:%s", if (caps == NULL) {
GST_ELEMENT_NAME(gst_pad_get_parent (pad)), GST_PAD_NAME(pad)); g_warning ("gstvideo: failed to get caps of pad %s:%s",
GST_ELEMENT_NAME (gst_pad_get_parent (pad)),
GST_PAD_NAME(pad));
return FALSE; return FALSE;
} }
if (!gst_caps_has_property(caps, "width") ||
!gst_caps_has_property(caps, "height")) { if (!gst_caps_has_property_typed (caps, "width",
g_warning("gstvideo: resulting caps doesn't have width/height properties"); GST_PROPS_INT_TYPE) ||
!gst_caps_has_property_typed (caps, "height",
GST_PROPS_FLOAT_TYPE)) {
g_warning ("gstvideo: failed to get size properties on pad %s:%s",
GST_ELEMENT_NAME (gst_pad_get_parent (pad)),
GST_PAD_NAME(pad));
return FALSE; return FALSE;
} }
if (width) if (width)
gst_caps_get_int(caps, "width", width); gst_caps_get_int (caps, "width", width);
if (height) if (height)
gst_caps_get_int(caps, "height", height); gst_caps_get_int (caps, "height", height);
GST_DEBUG ("size request on pad %s:%s: %dx%d", GST_DEBUG ("size request on pad %s:%s: %dx%d",
GST_ELEMENT_NAME(gst_pad_get_parent (pad)), GST_PAD_NAME(pad), GST_ELEMENT_NAME (gst_pad_get_parent (pad)),
width?*width:0, height?*height:0); GST_PAD_NAME (pad),
width ? *width : -1,
height ? *height : -1);
return TRUE; return TRUE;
} }

View file

@ -23,7 +23,155 @@
#include <gst/gst.h> #include <gst/gst.h>
gdouble gst_video_frame_rate (GstPad *pad); #if (G_BYTE_ORDER == G_BIG_ENDIAN)
#define R_MASK_32 0xff000000
#define G_MASK_32 0x00ff0000
#define B_MASK_32 0x0000ff00
#define R_MASK_24 0xff0000
#define G_MASK_24 0x00ff00
#define B_MASK_24 0x0000ff
#else
#define R_MASK_32 0x000000ff
#define G_MASK_32 0x0000ff00
#define B_MASK_32 0x00ff0000
#define R_MASK_24 0x0000ff
#define G_MASK_24 0x00ff00
#define B_MASK_24 0xff0000
#endif
#define R_MASK_16 0xf800
#define G_MASK_16 0x07e0
#define B_MASK_16 0x001f
#define R_MASK_15 0x8c00
#define G_MASK_15 0x03e0
#define B_MASK_15 0x001f
#define SIZE_RANGE GST_PROPS_INT_RANGE (16, 4096)
#define FPS_RANGE GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT)
/* properties for pad templates */
#define GST_VIDEO_RGB_PAD_TEMPLATE_PROPS_24_32 \
gst_props_new ( \
"bpp", GST_PROPS_LIST ( \
GST_PROPS_INT (24), \
GST_PROPS_INT (32) \
), \
"depth", GST_PROPS_LIST ( \
GST_PROPS_INT (24), \
GST_PROPS_INT (32) \
), \
"endianness", GST_PROPS_INT (G_BIG_ENDIAN), \
"red_mask", GST_PROPS_LIST ( \
GST_PROPS_INT (R_MASK_32), \
GST_PROPS_INT (R_MASK_24) \
), \
"green_mask", GST_PROPS_LIST ( \
GST_PROPS_INT (G_MASK_32), \
GST_PROPS_INT (G_MASK_24) \
), \
"blue_mask", GST_PROPS_LIST ( \
GST_PROPS_INT (B_MASK_32), \
GST_PROPS_INT (B_MASK_24) \
), \
"width", SIZE_RANGE, \
"height", SIZE_RANGE, \
"framerate", FPS_RANGE, \
NULL)
#define GST_VIDEO_RGB_PAD_TEMPLATE_PROPS_32 \
gst_props_new ( \
"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", SIZE_RANGE, \
"height", SIZE_RANGE, \
"framerate", FPS_RANGE, \
NULL)
#define GST_VIDEO_RGB_PAD_TEMPLATE_PROPS_24 \
gst_props_new ( \
"bpp", GST_PROPS_INT (24), \
"depth", GST_PROPS_INT (24), \
"endianness", GST_PROPS_INT (G_BIG_ENDIAN), \
"red_mask", GST_PROPS_INT (R_MASK_24), \
"green_mask", GST_PROPS_INT (G_MASK_24), \
"blue_mask", GST_PROPS_INT (B_MASK_24), \
"width", SIZE_RANGE, \
"height", SIZE_RANGE, \
"framerate", FPS_RANGE, \
NULL)
#define GST_VIDEO_RGB_PAD_TEMPLATE_PROPS_15_16 \
gst_props_new ( \
"bpp", GST_PROPS_INT (16), \
"depth", GST_PROPS_LIST ( \
GST_PROPS_INT (15), \
GST_PROPS_INT (16) \
), \
"endianness", GST_PROPS_INT (G_BYTE_ORDER), \
"red_mask", GST_PROPS_LIST ( \
GST_PROPS_INT (R_MASK_15), \
GST_PROPS_INT (R_MASK_16) \
), \
"green_mask", GST_PROPS_LIST ( \
GST_PROPS_INT (G_MASK_15), \
GST_PROPS_INT (G_MASK_16) \
), \
"blue_mask", GST_PROPS_LIST ( \
GST_PROPS_INT (B_MASK_15), \
GST_PROPS_INT (B_MASK_16) \
), \
"width", SIZE_RANGE, \
"height", SIZE_RANGE, \
"framerate", FPS_RANGE, \
NULL)
#define GST_VIDEO_RGB_PAD_TEMPLATE_PROPS_16 \
gst_props_new ( \
"bpp", GST_PROPS_INT (16), \
"depth", GST_PROPS_INT (16), \
"endianness", GST_PROPS_INT (G_BYTE_ORDER), \
"red_mask", GST_PROPS_INT (R_MASK_16), \
"green_mask", GST_PROPS_INT (G_MASK_16), \
"blue_mask", GST_PROPS_INT (B_MASK_16), \
"width", SIZE_RANGE, \
"height", SIZE_RANGE, \
"framerate", FPS_RANGE, \
NULL)
#define GST_VIDEO_RGB_PAD_TEMPLATE_PROPS_15 \
gst_props_new ( \
"bpp", GST_PROPS_INT (15), \
"depth", GST_PROPS_INT (15), \
"endianness", GST_PROPS_INT (G_BYTE_ORDER), \
"red_mask", GST_PROPS_INT (R_MASK_15), \
"green_mask", GST_PROPS_INT (G_MASK_15), \
"blue_mask", GST_PROPS_INT (B_MASK_15), \
"width", SIZE_RANGE, \
"height", SIZE_RANGE, \
"framerate", FPS_RANGE, \
NULL)
#define GST_VIDEO_YUV_PAD_TEMPLATE_PROPS(fourcc) \
gst_props_new (\
"format", fourcc, \
"width", SIZE_RANGE, \
"height", SIZE_RANGE, \
"framerate", FPS_RANGE, \
NULL)
/* functions */
gfloat gst_video_frame_rate (GstPad *pad);
gboolean gst_video_get_size (GstPad *pad, gboolean gst_video_get_size (GstPad *pad,
gint *width, gint *width,
gint *height); gint *height);

View file

@ -58,9 +58,9 @@ GST_PAD_TEMPLATE_FACTORY (gst_adder_src_template_factory,
"src", "src",
GST_PAD_SRC, GST_PAD_SRC,
GST_PAD_ALWAYS, GST_PAD_ALWAYS,
gst_caps_new ("int_src", "audio/raw", gst_caps_new ("int_src", "audio/x-raw-int",
GST_AUDIO_INT_PAD_TEMPLATE_PROPS), GST_AUDIO_INT_PAD_TEMPLATE_PROPS),
gst_caps_new ("float_src", "audio/raw", gst_caps_new ("float_src", "audio/x-raw-float",
GST_AUDIO_FLOAT_MONO_PAD_TEMPLATE_PROPS) GST_AUDIO_FLOAT_MONO_PAD_TEMPLATE_PROPS)
); );
@ -68,9 +68,9 @@ GST_PAD_TEMPLATE_FACTORY (gst_adder_sink_template_factory,
"sink%d", "sink%d",
GST_PAD_SINK, GST_PAD_SINK,
GST_PAD_REQUEST, GST_PAD_REQUEST,
gst_caps_new ("int_sink", "audio/raw", gst_caps_new ("int_sink", "audio/x-raw-int",
GST_AUDIO_INT_PAD_TEMPLATE_PROPS), GST_AUDIO_INT_PAD_TEMPLATE_PROPS),
gst_caps_new ("float_sink", "audio/raw", gst_caps_new ("float_sink", "audio/x-raw-float",
GST_AUDIO_FLOAT_MONO_PAD_TEMPLATE_PROPS) GST_AUDIO_FLOAT_MONO_PAD_TEMPLATE_PROPS)
); );
@ -111,29 +111,27 @@ gst_adder_get_type (void) {
static gboolean static gboolean
gst_adder_parse_caps (GstAdder *adder, GstCaps *caps) gst_adder_parse_caps (GstAdder *adder, GstCaps *caps)
{ {
const gchar *format; const gchar *mimetype;
GstElement *el = GST_ELEMENT (adder); GstElement *el = GST_ELEMENT (adder);
gst_caps_get_string (caps, "format", &format); mimetype = gst_caps_get_mime (caps);
if (adder->format == GST_ADDER_FORMAT_UNSET) { if (adder->format == GST_ADDER_FORMAT_UNSET) {
/* the caps haven't been set yet at all, /* the caps haven't been set yet at all,
* so we need to go ahead and set all * so we need to go ahead and set all
the relevant values. */ the relevant values. */
if (strcmp (format, "int") == 0) { if (strcmp (mimetype, "audio/x-raw-int") == 0) {
GST_DEBUG ("parse_caps sets adder to format int"); GST_DEBUG ("parse_caps sets adder to format int");
adder->format = GST_ADDER_FORMAT_INT; adder->format = GST_ADDER_FORMAT_INT;
gst_caps_get_int (caps, "width", &adder->width); gst_caps_get_int (caps, "width", &adder->width);
gst_caps_get_int (caps, "depth", &adder->depth); gst_caps_get_int (caps, "depth", &adder->depth);
gst_caps_get_int (caps, "law", &adder->law);
gst_caps_get_int (caps, "endianness", &adder->endianness); gst_caps_get_int (caps, "endianness", &adder->endianness);
gst_caps_get_boolean (caps, "signed", &adder->is_signed); gst_caps_get_boolean (caps, "signed", &adder->is_signed);
gst_caps_get_int (caps, "channels", &adder->channels); gst_caps_get_int (caps, "channels", &adder->channels);
gst_caps_get_int (caps, "rate", &adder->rate); gst_caps_get_int (caps, "rate", &adder->rate);
} else if (strcmp (format, "float") == 0) { } else if (strcmp (mimetype, "audio/x-raw-float") == 0) {
GST_DEBUG ("parse_caps sets adder to format float"); GST_DEBUG ("parse_caps sets adder to format float");
adder->format = GST_ADDER_FORMAT_FLOAT; adder->format = GST_ADDER_FORMAT_FLOAT;
gst_caps_get_string (caps, "layout", &adder->layout);
gst_caps_get_float (caps, "intercept", &adder->intercept); gst_caps_get_float (caps, "intercept", &adder->intercept);
gst_caps_get_float (caps, "slope", &adder->slope); gst_caps_get_float (caps, "slope", &adder->slope);
gst_caps_get_int (caps, "channels", &adder->channels); gst_caps_get_int (caps, "channels", &adder->channels);
@ -142,7 +140,7 @@ gst_adder_parse_caps (GstAdder *adder, GstCaps *caps)
} else { } else {
/* otherwise, a previously-linked pad has set all the values. we should /* otherwise, a previously-linked pad has set all the values. we should
barf if some of the attempted new values don't match. */ barf if some of the attempted new values don't match. */
if (strcmp (format, "int") == 0) { if (strcmp (mimetype, "audio/x-raw-int") == 0) {
gint width, channels, rate; gint width, channels, rate;
gboolean is_signed; gboolean is_signed;
@ -179,7 +177,7 @@ gst_adder_parse_caps (GstAdder *adder, GstCaps *caps)
is_signed ? "" : "un"); is_signed ? "" : "un");
return FALSE; return FALSE;
} }
} else if (strcmp (format, "float") == 0) { } else if (strcmp (mimetype, "audio/x-raw-float") == 0) {
gint channels, rate; gint channels, rate;
gst_caps_get_int (caps, "channels", &channels); gst_caps_get_int (caps, "channels", &channels);
@ -200,9 +198,6 @@ gst_adder_parse_caps (GstAdder *adder, GstCaps *caps)
gst_element_error (el, "can't link %d Hz pad with %d Hz adder", gst_element_error (el, "can't link %d Hz pad with %d Hz adder",
rate, adder->rate); rate, adder->rate);
return FALSE; return FALSE;
} else {
/* whoa, we don't know what's trying to link with us ! barf ! */
return FALSE;
} }
} }
} }
@ -526,13 +521,11 @@ gst_adder_loop (GstElement *element)
GstCaps *caps = GstCaps *caps =
gst_caps_new ("default_adder_caps", gst_caps_new ("default_adder_caps",
"audio/raw", "audio/x-raw-int",
gst_props_new ("format", GST_PROPS_STRING ("int"), gst_props_new ("width", GST_PROPS_INT (16),
"width", GST_PROPS_INT (16),
"depth", GST_PROPS_INT (16), "depth", GST_PROPS_INT (16),
"rate", GST_PROPS_INT (44100), "rate", GST_PROPS_INT (44100),
"channels", GST_PROPS_INT (2), "channels", GST_PROPS_INT (2),
"law", GST_PROPS_INT (0),
"endianness", GST_PROPS_INT (G_BYTE_ORDER), "endianness", GST_PROPS_INT (G_BYTE_ORDER),
"signed", GST_PROPS_BOOLEAN (TRUE), "signed", GST_PROPS_BOOLEAN (TRUE),
NULL)); NULL));
@ -623,4 +616,3 @@ GstPluginDesc plugin_desc = {
"adder", "adder",
plugin_init plugin_init
}; };

View file

@ -127,9 +127,7 @@ GST_PAD_TEMPLATE_FACTORY (audio_convert_src_template_factory,
GST_PAD_ALWAYS, GST_PAD_ALWAYS,
GST_CAPS_NEW ( GST_CAPS_NEW (
"audio_convert_src", "audio_convert_src",
"audio/raw", "audio/x-raw-int",
"format", GST_PROPS_STRING ("int"),
"law", GST_PROPS_INT (0),
"endianness", GST_PROPS_LIST ( "endianness", GST_PROPS_LIST (
GST_PROPS_INT (G_LITTLE_ENDIAN), GST_PROPS_INT (G_LITTLE_ENDIAN),
GST_PROPS_INT (G_BIG_ENDIAN) GST_PROPS_INT (G_BIG_ENDIAN)
@ -155,9 +153,7 @@ GST_PAD_TEMPLATE_FACTORY (audio_convert_sink_template_factory,
GST_PAD_ALWAYS, GST_PAD_ALWAYS,
GST_CAPS_NEW ( GST_CAPS_NEW (
"audio_convert_sink", "audio_convert_sink",
"audio/raw", "audio/x-raw-int",
"format", GST_PROPS_STRING ("int"),
"law", GST_PROPS_INT (0),
"endianness", GST_PROPS_LIST ( "endianness", GST_PROPS_LIST (
GST_PROPS_INT (G_LITTLE_ENDIAN), GST_PROPS_INT (G_LITTLE_ENDIAN),
GST_PROPS_INT (G_BIG_ENDIAN) GST_PROPS_INT (G_BIG_ENDIAN)
@ -403,9 +399,7 @@ make_caps (gint endianness, gboolean sign, gint depth, gint width, gint rate, gi
if (width == 1) { if (width == 1) {
return GST_CAPS_NEW ( return GST_CAPS_NEW (
"audio_convert_caps", "audio_convert_caps",
"audio/raw", "audio/x-raw-int",
"format", GST_PROPS_STRING ("int"),
"law", GST_PROPS_INT (0),
"signed", GST_PROPS_BOOLEAN (sign), "signed", GST_PROPS_BOOLEAN (sign),
"depth", GST_PROPS_INT (depth), "depth", GST_PROPS_INT (depth),
"width", GST_PROPS_INT (width * 8), "width", GST_PROPS_INT (width * 8),
@ -415,9 +409,7 @@ make_caps (gint endianness, gboolean sign, gint depth, gint width, gint rate, gi
} else { } else {
return GST_CAPS_NEW ( return GST_CAPS_NEW (
"audio_convert_caps", "audio_convert_caps",
"audio/raw", "audio/x-raw-int",
"format", GST_PROPS_STRING ("int"),
"law", GST_PROPS_INT (0),
"endianness", GST_PROPS_INT (endianness), "endianness", GST_PROPS_INT (endianness),
"signed", GST_PROPS_BOOLEAN (sign), "signed", GST_PROPS_BOOLEAN (sign),
"depth", GST_PROPS_INT (depth), "depth", GST_PROPS_INT (depth),

View file

@ -54,37 +54,23 @@ enum {
/* FILL ME */ /* FILL ME */
}; };
static GstPadTemplate * GST_PAD_TEMPLATE_FACTORY (sink_factory,
sink_template (void) "sink",
{ GST_PAD_SINK,
static GstPadTemplate *template = NULL; GST_PAD_ALWAYS,
gst_caps_new ("audioscale_sink",
"audio/x-raw-int",
GST_AUDIO_INT_PAD_TEMPLATE_PROPS)
);
if (!template) { GST_PAD_TEMPLATE_FACTORY (src_factory,
template = gst_pad_template_new ("sink", "src",
GST_PAD_SINK, GST_PAD_SRC,
GST_PAD_ALWAYS, GST_PAD_ALWAYS,
gst_caps_new gst_caps_new ("audioscale_src",
("audioscale_sink", "audio/x-raw-int",
"audio/raw", GST_AUDIO_INT_PAD_TEMPLATE_PROPS), NULL); GST_AUDIO_INT_PAD_TEMPLATE_PROPS)
} );
return template;
}
static GstPadTemplate *
src_template (void)
{
static GstPadTemplate *template = NULL;
if (!template) {
template = gst_pad_template_new ("src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
gst_caps_new
("audioscale_src",
"audio/raw", GST_AUDIO_INT_PAD_TEMPLATE_PROPS), NULL);
}
return template;
}
#define GST_TYPE_AUDIOSCALE_METHOD (gst_audioscale_method_get_type()) #define GST_TYPE_AUDIOSCALE_METHOD (gst_audioscale_method_get_type())
static GType static GType
@ -211,12 +197,14 @@ gst_audioscale_init (Audioscale *audioscale)
{ {
resample_t *r; resample_t *r;
audioscale->sinkpad = gst_pad_new_from_template (GST_PAD_TEMPLATE_GET (sink_template), "sink"); audioscale->sinkpad = gst_pad_new_from_template (
GST_PAD_TEMPLATE_GET (sink_factory), "sink");
gst_element_add_pad(GST_ELEMENT(audioscale),audioscale->sinkpad); gst_element_add_pad(GST_ELEMENT(audioscale),audioscale->sinkpad);
gst_pad_set_chain_function(audioscale->sinkpad,gst_audioscale_chain); gst_pad_set_chain_function(audioscale->sinkpad,gst_audioscale_chain);
gst_pad_set_link_function (audioscale->sinkpad, gst_audioscale_sinkconnect); gst_pad_set_link_function (audioscale->sinkpad, gst_audioscale_sinkconnect);
audioscale->srcpad = gst_pad_new_from_template (GST_PAD_TEMPLATE_GET (src_template), "src"); audioscale->srcpad = gst_pad_new_from_template (
GST_PAD_TEMPLATE_GET (src_factory), "src");
gst_element_add_pad(GST_ELEMENT(audioscale),audioscale->srcpad); gst_element_add_pad(GST_ELEMENT(audioscale),audioscale->srcpad);
@ -331,6 +319,10 @@ plugin_init (GModule *module, GstPlugin *plugin)
/* create an elementfactory for the audioscale element */ /* create an elementfactory for the audioscale element */
factory = gst_element_factory_new ("audioscale", GST_TYPE_AUDIOSCALE, &audioscale_details); factory = gst_element_factory_new ("audioscale", GST_TYPE_AUDIOSCALE, &audioscale_details);
g_return_val_if_fail(factory != NULL, FALSE); g_return_val_if_fail(factory != NULL, FALSE);
gst_element_factory_add_pad_template (factory,
GST_PAD_TEMPLATE_GET (src_factory));
gst_element_factory_add_pad_template (factory,
GST_PAD_TEMPLATE_GET (sink_factory));
gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (factory)); gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (factory));
/* load support library */ /* load support library */

View file

@ -65,9 +65,7 @@ GST_PAD_TEMPLATE_FACTORY (sinesrc_src_factory,
GST_PAD_ALWAYS, GST_PAD_ALWAYS,
GST_CAPS_NEW ( GST_CAPS_NEW (
"sinesrc_src", "sinesrc_src",
"audio/raw", "audio/x-raw-int",
"format", GST_PROPS_STRING ("int"),
"law", GST_PROPS_INT (0),
"endianness", GST_PROPS_INT (G_BYTE_ORDER), "endianness", GST_PROPS_INT (G_BYTE_ORDER),
"signed", GST_PROPS_BOOLEAN (TRUE), "signed", GST_PROPS_BOOLEAN (TRUE),
"width", GST_PROPS_INT (16), "width", GST_PROPS_INT (16),
@ -423,9 +421,7 @@ gst_sinesrc_force_caps (GstSineSrc *src) {
caps = GST_CAPS_NEW ( caps = GST_CAPS_NEW (
"sinesrc_src_caps", "sinesrc_src_caps",
"audio/raw", "audio/x-raw-int",
"format", GST_PROPS_STRING ("int"),
"law", GST_PROPS_INT (0),
"endianness", GST_PROPS_INT (G_BYTE_ORDER), "endianness", GST_PROPS_INT (G_BYTE_ORDER),
"signed", GST_PROPS_BOOLEAN (TRUE), "signed", GST_PROPS_BOOLEAN (TRUE),
"width", GST_PROPS_INT (16), "width", GST_PROPS_INT (16),

View file

@ -135,11 +135,23 @@ gst_videoscale_src_template_factory(void)
static GstPadTemplate *templ = NULL; static GstPadTemplate *templ = NULL;
if(!templ){ if(!templ){
GstCaps *caps = GST_CAPS_NEW("src","video/raw", GstCaps *caps;
GstCaps *caps1 = GST_CAPS_NEW("src","video/x-raw-yuv",
"width", GST_PROPS_INT_RANGE (0, G_MAXINT), "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));
GstCaps *caps2 = GST_CAPS_NEW("src","video/x-raw-rgb",
"width", 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_videoscale_get_capslist ()); caps = gst_caps_intersect(caps1, gst_videoscale_get_capslist ());
gst_caps_unref (caps1);
caps1 = caps;
caps = gst_caps_intersect(caps2, gst_videoscale_get_capslist ());
gst_caps_unref (caps2);
caps2 = caps;
caps = gst_caps_append(caps1, caps2);
templ = GST_PAD_TEMPLATE_NEW("src", GST_PAD_SRC, GST_PAD_ALWAYS, caps); templ = GST_PAD_TEMPLATE_NEW("src", GST_PAD_SRC, GST_PAD_ALWAYS, caps);
} }
@ -152,11 +164,23 @@ gst_videoscale_sink_template_factory(void)
static GstPadTemplate *templ = NULL; static GstPadTemplate *templ = NULL;
if(!templ){ if(!templ){
GstCaps *caps = GST_CAPS_NEW("sink","video/raw", GstCaps *caps;
GstCaps *caps1 = GST_CAPS_NEW("src","video/x-raw-yuv",
"width", GST_PROPS_INT_RANGE (0, G_MAXINT), "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));
GstCaps *caps2 = GST_CAPS_NEW("src","video/x-raw-rgb",
"width", 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_videoscale_get_capslist ()); caps = gst_caps_intersect(caps1, gst_videoscale_get_capslist ());
gst_caps_unref (caps1);
caps1 = caps;
caps = gst_caps_intersect(caps2, gst_videoscale_get_capslist ());
gst_caps_unref (caps2);
caps2 = caps;
caps = gst_caps_append(caps1, caps2);
templ = GST_PAD_TEMPLATE_NEW("src", GST_PAD_SINK, GST_PAD_ALWAYS, caps); templ = GST_PAD_TEMPLATE_NEW("src", GST_PAD_SINK, GST_PAD_ALWAYS, caps);
} }
@ -190,7 +214,7 @@ gst_videoscale_getcaps (GstPad *pad, GstCaps *caps)
GstVideoscale *videoscale; GstVideoscale *videoscale;
GstCaps *capslist = NULL; GstCaps *capslist = NULL;
GstCaps *peercaps; GstCaps *peercaps;
GstCaps *sizecaps; GstCaps *sizecaps1, *sizecaps2;
int i; int i;
GST_DEBUG ("gst_videoscale_src_link"); GST_DEBUG ("gst_videoscale_src_link");
@ -216,12 +240,22 @@ gst_videoscale_getcaps (GstPad *pad, GstCaps *caps)
} }
gst_caps_unref (peercaps); gst_caps_unref (peercaps);
sizecaps = GST_CAPS_NEW("videoscale_size","video/raw", sizecaps1 = GST_CAPS_NEW("src","video/x-raw-yuv",
"width", GST_PROPS_INT_RANGE (0, G_MAXINT), "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));
sizecaps2 = GST_CAPS_NEW("src","video/x-raw-rgb",
"width", 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_videoscale_get_capslist ()); caps = gst_caps_intersect(sizecaps1, gst_videoscale_get_capslist ());
gst_caps_unref (sizecaps); gst_caps_unref (sizecaps1);
sizecaps1 = caps;
caps = gst_caps_intersect(sizecaps2, gst_videoscale_get_capslist ());
gst_caps_unref (sizecaps2);
sizecaps2 = caps;
caps = gst_caps_append(sizecaps1, sizecaps2);
return caps; return caps;
} }

View file

@ -74,9 +74,7 @@ struct videoscale_format_struct videoscale_formats[] = {
/* planar */ /* planar */
{ "YV12", 12, gst_videoscale_planar411, }, { "YV12", 12, gst_videoscale_planar411, },
{ "I420", 12, gst_videoscale_planar411, }, { "I420", 12, gst_videoscale_planar411, },
{ "IYUV", 12, gst_videoscale_planar411, },
{ "Y800", 8, gst_videoscale_planar400, }, { "Y800", 8, gst_videoscale_planar400, },
{ "Y8 ", 8, gst_videoscale_planar400, },
/* RGB */ /* RGB */
{ "RGB ", 32, gst_videoscale_32bit, 24, G_BIG_ENDIAN, 0x00ff0000, 0x0000ff00, 0x000000ff }, { "RGB ", 32, gst_videoscale_32bit, 24, G_BIG_ENDIAN, 0x00ff0000, 0x0000ff00, 0x000000ff },
{ "RGB ", 32, gst_videoscale_32bit, 24, G_BIG_ENDIAN, 0x000000ff, 0x0000ff00, 0x00ff0000 }, { "RGB ", 32, gst_videoscale_32bit, 24, G_BIG_ENDIAN, 0x000000ff, 0x0000ff00, 0x00ff0000 },
@ -102,8 +100,7 @@ videoscale_get_caps(struct videoscale_format_struct *format)
fourcc = GST_MAKE_FOURCC(format->fourcc[0],format->fourcc[1],format->fourcc[2],format->fourcc[3]); fourcc = GST_MAKE_FOURCC(format->fourcc[0],format->fourcc[1],format->fourcc[2],format->fourcc[3]);
if(format->bpp){ if(format->bpp){
caps = GST_CAPS_NEW ("videoscale", "video/raw", caps = GST_CAPS_NEW ("videoscale", "video/x-raw-rgb",
"format", GST_PROPS_FOURCC (fourcc),
"depth", GST_PROPS_INT(format->bpp), "depth", GST_PROPS_INT(format->bpp),
"bpp", GST_PROPS_INT(format->depth), "bpp", GST_PROPS_INT(format->depth),
"endianness", GST_PROPS_INT(format->endianness), "endianness", GST_PROPS_INT(format->endianness),
@ -111,7 +108,7 @@ videoscale_get_caps(struct videoscale_format_struct *format)
"green_mask", GST_PROPS_INT(format->green_mask), "green_mask", GST_PROPS_INT(format->green_mask),
"blue_mask", GST_PROPS_INT(format->blue_mask)); "blue_mask", GST_PROPS_INT(format->blue_mask));
}else{ }else{
caps = GST_CAPS_NEW ("videoscale", "video/raw", caps = GST_CAPS_NEW ("videoscale", "video/x-raw-yuv",
"format", GST_PROPS_FOURCC (fourcc)); "format", GST_PROPS_FOURCC (fourcc));
} }

View file

@ -86,11 +86,23 @@ videotestsrc_src_template_factory(void)
static GstPadTemplate *templ = NULL; static GstPadTemplate *templ = NULL;
if(!templ){ if(!templ){
GstCaps *caps = GST_CAPS_NEW("src","video/raw", GstCaps *caps;
"width", GST_PROPS_INT_RANGE (0, G_MAXINT), GstCaps *caps1 = GST_CAPS_NEW("src","video/x-raw-yuv",
"height", GST_PROPS_INT_RANGE (0, G_MAXINT)); "width", GST_PROPS_INT_RANGE (0, G_MAXINT),
"height", GST_PROPS_INT_RANGE (0, G_MAXINT),
"framerate", GST_PROPS_FLOAT_RANGE (0, G_MAXFLOAT));
GstCaps *caps2 = GST_CAPS_NEW("src","video/x-raw-rgb",
"width", 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_videotestsrc_get_capslist ()); caps = gst_caps_intersect(caps1, gst_videotestsrc_get_capslist ());
gst_caps_unref (caps1);
caps1 = caps;
caps = gst_caps_intersect(caps2, gst_videotestsrc_get_capslist ());
gst_caps_unref (caps2);
caps2 = caps;
caps = gst_caps_append(caps1, caps2);
templ = GST_PAD_TEMPLATE_NEW("src", GST_PAD_SRC, GST_PAD_ALWAYS, caps); templ = GST_PAD_TEMPLATE_NEW("src", GST_PAD_SRC, GST_PAD_ALWAYS, caps);
} }
@ -158,8 +170,8 @@ gst_videotestsrc_class_init (GstVideotestsrcClass * klass)
g_param_spec_string ("fourcc", "fourcc", "fourcc", g_param_spec_string ("fourcc", "fourcc", "fourcc",
NULL, G_PARAM_READWRITE)); NULL, G_PARAM_READWRITE));
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_RATE, g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_RATE,
g_param_spec_int ("rate", "Rate", "Frame rate", g_param_spec_float ("fps", "FPS", "Frame rate",
1, 100, 30, G_PARAM_READWRITE)); 0., G_MAXFLOAT, 30., G_PARAM_READWRITE));
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TYPE, g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TYPE,
g_param_spec_enum ("pattern", "Pattern", "Type of test pattern to generate", g_param_spec_enum ("pattern", "Pattern", "Type of test pattern to generate",
GST_TYPE_VIDEOTESTSRC_PATTERN, 1, G_PARAM_READWRITE)); GST_TYPE_VIDEOTESTSRC_PATTERN, 1, G_PARAM_READWRITE));
@ -232,6 +244,7 @@ gst_videotestsrc_srcconnect (GstPad * pad, GstCaps * caps)
gst_caps_get_int (caps, "width", &videotestsrc->width); gst_caps_get_int (caps, "width", &videotestsrc->width);
gst_caps_get_int (caps, "height", &videotestsrc->height); gst_caps_get_int (caps, "height", &videotestsrc->height);
gst_caps_get_float (caps, "framerate", &videotestsrc->rate);
videotestsrc->bpp = videotestsrc->fourcc->bitspp; videotestsrc->bpp = videotestsrc->fourcc->bitspp;
@ -305,13 +318,25 @@ gst_videotestsrc_getcaps (GstPad * pad, GstCaps * caps)
} }
if(vts->width){ if(vts->width){
caps2 = GST_CAPS_NEW("ack","video/raw", caps2 = gst_caps_append(
GST_CAPS_NEW("ack","video/x-raw-yuv",
"width",GST_PROPS_INT(vts->width), "width",GST_PROPS_INT(vts->width),
"height",GST_PROPS_INT(vts->height)); "height",GST_PROPS_INT(vts->height),
"framerate", GST_PROPS_FLOAT(vts->rate)),
GST_CAPS_NEW("ack","video/x-raw-rgb",
"width",GST_PROPS_INT(vts->width),
"height",GST_PROPS_INT(vts->height),
"framerate", GST_PROPS_FLOAT(vts->rate)));
}else{ }else{
caps2 = GST_CAPS_NEW("ack","video/raw", caps2 = gst_caps_append(
GST_CAPS_NEW("ack","video/x-raw-yuv",
"width",GST_PROPS_INT_RANGE(16,4096), "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)),
GST_CAPS_NEW("ack","video/x-raw-rgb",
"width",GST_PROPS_INT_RANGE(16,4096),
"height",GST_PROPS_INT_RANGE(16,4096),
"framerate", GST_PROPS_FLOAT_RANGE(0, G_MAXFLOAT)));
} }
/* ref intersection and return it */ /* ref intersection and return it */
@ -341,7 +366,7 @@ gst_videotestsrc_reset (GstVideotestsrc *videotestsrc)
videotestsrc->sync = TRUE; videotestsrc->sync = TRUE;
videotestsrc->width = 640; videotestsrc->width = 640;
videotestsrc->height = 480; videotestsrc->height = 480;
videotestsrc->rate = 30; videotestsrc->rate = 30.;
videotestsrc->timestamp = 0; videotestsrc->timestamp = 0;
videotestsrc->interval = GST_SECOND / videotestsrc->rate; videotestsrc->interval = GST_SECOND / videotestsrc->rate;
} }
@ -453,7 +478,7 @@ gst_videotestsrc_set_property (GObject * object, guint prop_id, const GValue * v
} }
break; break;
case ARG_RATE: case ARG_RATE:
src->rate = g_value_get_int (value); src->rate = g_value_get_float (value);
src->interval = GST_SECOND/src->rate; src->interval = GST_SECOND/src->rate;
break; break;
case ARG_TYPE: case ARG_TYPE:
@ -487,7 +512,7 @@ gst_videotestsrc_get_property (GObject * object, guint prop_id, GValue * value,
g_value_set_string (value, src->forced_format); g_value_set_string (value, src->forced_format);
break; break;
case ARG_RATE: case ARG_RATE:
g_value_set_int (value, src->rate); g_value_set_float (value, src->rate);
break; break;
case ARG_TYPE: case ARG_TYPE:
g_value_set_enum (value, src->type); g_value_set_enum (value, src->type);

View file

@ -65,7 +65,7 @@ struct _GstVideotestsrc {
gint64 timestamp; gint64 timestamp;
gint64 interval; gint64 interval;
gint bpp; gint bpp;
int rate; gfloat rate;
int type; int type;
GstClock *clock; GstClock *clock;

View file

@ -339,8 +339,6 @@ struct fourcc_list_struct fourcc_list[] = {
{"YV12", "YV12", 12, paint_setup_YV12, paint_hline_I420}, {"YV12", "YV12", 12, paint_setup_YV12, paint_hline_I420},
/* I420 */ /* I420 */
{"I420", "I420", 12, paint_setup_I420, paint_hline_I420}, {"I420", "I420", 12, paint_setup_I420, paint_hline_I420},
/* IYUV (same as I420) */
{"IYUV", "IYUV", 12, paint_setup_I420, paint_hline_I420},
/* NV12 */ /* NV12 */
/* NV21 */ /* NV21 */
/* IMC1 */ /* IMC1 */
@ -356,8 +354,6 @@ struct fourcc_list_struct fourcc_list[] = {
/* Y42B */ /* Y42B */
/* Y800 grayscale */ /* Y800 grayscale */
{"Y800", "Y800", 8, paint_setup_Y800, paint_hline_Y800}, {"Y800", "Y800", 8, paint_setup_Y800, paint_hline_Y800},
/* Y8 same as Y800 */
{"Y8 ", "Y8 ", 8, paint_setup_Y800, paint_hline_Y800},
/*{ "IYU2", 24, paint_setup_YVYU, paint_hline_YUY2 }, */ /*{ "IYU2", 24, paint_setup_YVYU, paint_hline_YUY2 }, */
@ -442,8 +438,7 @@ GstCaps *paint_get_caps(struct fourcc_list_struct *format)
if(format->ext_caps){ if(format->ext_caps){
#if GST_VERSION_MINOR > 6 #if GST_VERSION_MINOR > 6
caps = GST_CAPS_NEW ("videotestsrc_filter", caps = GST_CAPS_NEW ("videotestsrc_filter",
"video/raw", "video/x-raw-rgb",
"format", GST_PROPS_FOURCC (fourcc),
"bpp", GST_PROPS_INT(format->bitspp), "bpp", GST_PROPS_INT(format->bitspp),
"endianness", GST_PROPS_INT(G_BIG_ENDIAN), "endianness", GST_PROPS_INT(G_BIG_ENDIAN),
"depth", GST_PROPS_INT(format->depth), "depth", GST_PROPS_INT(format->depth),
@ -480,8 +475,7 @@ GstCaps *paint_get_caps(struct fourcc_list_struct *format)
} }
caps = GST_CAPS_NEW ("videotestsrc_filter", caps = GST_CAPS_NEW ("videotestsrc_filter",
"video/raw", "video/x-raw-rgb",
"format", GST_PROPS_FOURCC (fourcc),
"bpp", GST_PROPS_INT(format->bitspp), "bpp", GST_PROPS_INT(format->bitspp),
"endianness", GST_PROPS_INT(endianness), "endianness", GST_PROPS_INT(endianness),
"depth", GST_PROPS_INT(format->depth), "depth", GST_PROPS_INT(format->depth),
@ -491,7 +485,7 @@ GstCaps *paint_get_caps(struct fourcc_list_struct *format)
#endif #endif
}else{ }else{
caps = GST_CAPS_NEW ("videotestsrc_filter", caps = GST_CAPS_NEW ("videotestsrc_filter",
"video/raw", "video/x-raw-yuv",
"format", GST_PROPS_FOURCC (fourcc)); "format", GST_PROPS_FOURCC (fourcc));
} }

View file

@ -57,27 +57,20 @@ GST_PAD_TEMPLATE_FACTORY (volume_sink_factory,
"sink", "sink",
GST_PAD_SINK, GST_PAD_SINK,
GST_PAD_ALWAYS, GST_PAD_ALWAYS,
GST_CAPS_NEW ( gst_caps_new (
"volume_float_sink", "volume_float_sink",
"audio/raw", "audio/x-raw-float",
"rate", GST_PROPS_INT_RANGE (1, G_MAXINT), GST_AUDIO_FLOAT_MONO_PAD_TEMPLATE_PROPS
"format", GST_PROPS_STRING ("float"),
"layout", GST_PROPS_STRING ("gfloat"),
"intercept", GST_PROPS_FLOAT(0.0),
"slope", GST_PROPS_FLOAT(1.0),
"channels", GST_PROPS_INT (1)
), ),
GST_CAPS_NEW ( GST_CAPS_NEW (
"volume_int_sink", "volume_int_sink",
"audio/raw", "audio/x-raw-int",
"format", GST_PROPS_STRING ("int"), "channels", GST_PROPS_INT_RANGE (1, G_MAXINT),
"channels", GST_PROPS_INT_RANGE (1, G_MAXINT), "rate", GST_PROPS_INT_RANGE (1, G_MAXINT),
"rate", GST_PROPS_INT_RANGE (1, G_MAXINT), "endianness", GST_PROPS_INT (G_BYTE_ORDER),
"law", GST_PROPS_INT (0), "width", GST_PROPS_INT (16),
"endianness", GST_PROPS_INT (G_BYTE_ORDER), "depth", GST_PROPS_INT (16),
"width", GST_PROPS_INT (16), "signed", GST_PROPS_BOOLEAN (TRUE)
"depth", GST_PROPS_INT (16),
"signed", GST_PROPS_BOOLEAN (TRUE)
) )
); );
@ -85,27 +78,20 @@ GST_PAD_TEMPLATE_FACTORY (volume_src_factory,
"src", "src",
GST_PAD_SRC, GST_PAD_SRC,
GST_PAD_ALWAYS, GST_PAD_ALWAYS,
GST_CAPS_NEW ( gst_caps_new (
"volume_float_src", "volume_float_src",
"audio/raw", "audio/x-raw-float",
"rate", GST_PROPS_INT_RANGE (1, G_MAXINT), GST_AUDIO_FLOAT_MONO_PAD_TEMPLATE_PROPS
"format", GST_PROPS_STRING ("float"),
"layout", GST_PROPS_STRING ("gfloat"),
"intercept", GST_PROPS_FLOAT(0.0),
"slope", GST_PROPS_FLOAT(1.0),
"channels", GST_PROPS_INT (1)
), ),
GST_CAPS_NEW ( GST_CAPS_NEW (
"volume_int_src", "volume_int_src",
"audio/raw", "audio/x-raw-int",
"format", GST_PROPS_STRING ("int"), "channels", GST_PROPS_INT_RANGE (1, G_MAXINT),
"channels", GST_PROPS_INT_RANGE (1, G_MAXINT), "rate", GST_PROPS_INT_RANGE (1, G_MAXINT),
"rate", GST_PROPS_INT_RANGE (1, G_MAXINT), "endianness", GST_PROPS_INT (G_BYTE_ORDER),
"law", GST_PROPS_INT (0), "width", GST_PROPS_INT (16),
"endianness", GST_PROPS_INT (G_BYTE_ORDER), "depth", GST_PROPS_INT (16),
"width", GST_PROPS_INT (16), "signed", GST_PROPS_BOOLEAN (TRUE)
"depth", GST_PROPS_INT (16),
"signed", GST_PROPS_BOOLEAN (TRUE)
) )
); );
@ -165,19 +151,19 @@ volume_connect (GstPad *pad, GstCaps *caps)
static gboolean static gboolean
volume_parse_caps (GstVolume *filter, GstCaps *caps) volume_parse_caps (GstVolume *filter, GstCaps *caps)
{ {
const gchar *format; const gchar *mimetype;
g_return_val_if_fail(filter!=NULL,FALSE); g_return_val_if_fail(filter!=NULL,FALSE);
g_return_val_if_fail(caps!=NULL,FALSE); g_return_val_if_fail(caps!=NULL,FALSE);
gst_caps_get_string (caps, "format", &format); mimetype = gst_caps_get_mime (caps);
if (strcmp(format, "int")==0) { if (strcmp(mimetype, "audio/x-raw-int")==0) {
gst_pad_set_chain_function(filter->sinkpad,volume_chain_int16); gst_pad_set_chain_function(filter->sinkpad,volume_chain_int16);
return TRUE; return TRUE;
} }
if (strcmp(format, "float")==0) { if (strcmp(mimetype, "audio/x-raw-float")==0) {
gst_pad_set_chain_function(filter->sinkpad,volume_chain_float); gst_pad_set_chain_function(filter->sinkpad,volume_chain_float);
return TRUE; return TRUE;
} }

View file

@ -34,7 +34,7 @@ else
VCD_DIR= VCD_DIR=
endif endif
if USE_XVIDEO if USE_XFREE
XVIDEO_DIR=xvideo XVIDEO_DIR=xvideo
else else
XVIDEO_DIR= XVIDEO_DIR=

View file

@ -1,3 +1,19 @@
REMOVE list (HEAD)
==================
* xmms (depends on glib-1.2)
* avifile (ffmpeg)
* openquicktime (qtdemux)
* stereo2mono/mono2stereo/int2float/float2int (audioconvert)
* hermes (lcs)
* mjpegtools (jpeg does the same, make it depend on libjpegmmx instead)
* modplug (mikmod)
* vga (unmaintained, not-working)
* videosink (xvideo)
* aviaudiodecoder (useless)
* monkeymedia (licensing issues)
* wavparse/enc goes in same dir
* mulaw/alaw become separate mimetypes
TODO list (short term): TODO list (short term):
======================= =======================
* v4lsrc/v4lmjpegsrc/v4l2src: fix interlacing (not handled at all...) * v4lsrc/v4lmjpegsrc/v4l2src: fix interlacing (not handled at all...)

View file

@ -483,10 +483,11 @@ plugin_init (GModule *module,
g_return_val_if_fail(factory != NULL, FALSE); g_return_val_if_fail(factory != NULL, FALSE);
caps = gst_caps_new ("v4lmjpegsink_caps", caps = gst_caps_new ("v4lmjpegsink_caps",
"video/jpeg", "video/x-jpeg",
gst_props_new ( gst_props_new (
"width", GST_PROPS_INT_RANGE (0, G_MAXINT), "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),
NULL ) NULL )
); );
capslist = gst_caps_append(capslist, caps); capslist = gst_caps_append(capslist, caps);

View file

@ -253,11 +253,11 @@ gst_v4lmjpegsrc_init (GstV4lMjpegSrc *v4lmjpegsrc)
} }
static gdouble static gfloat
gst_v4lmjpegsrc_get_fps (GstV4lMjpegSrc *v4lmjpegsrc) gst_v4lmjpegsrc_get_fps (GstV4lMjpegSrc *v4lmjpegsrc)
{ {
gint norm; gint norm;
gdouble fps; gfloat fps;
if (!v4lmjpegsrc->use_fixed_fps && if (!v4lmjpegsrc->use_fixed_fps &&
v4lmjpegsrc->clock != NULL && v4lmjpegsrc->clock != NULL &&
@ -366,6 +366,7 @@ gst_v4lmjpegsrc_srcconnect (GstPad *pad,
gint max_w = GST_V4LELEMENT(v4lmjpegsrc)->vcap.maxwidth, gint max_w = GST_V4LELEMENT(v4lmjpegsrc)->vcap.maxwidth,
max_h = GST_V4LELEMENT(v4lmjpegsrc)->vcap.maxheight; max_h = GST_V4LELEMENT(v4lmjpegsrc)->vcap.maxheight;
gulong bufsize; gulong bufsize;
gfloat fps = gst_v4lmjpegsrc_get_fps(v4lmjpegsrc);
/* in case the buffers are active (which means that we already /* in case the buffers are active (which means that we already
* did capsnego before and didn't clean up), clean up anyways */ * did capsnego before and didn't clean up), clean up anyways */
@ -381,7 +382,7 @@ gst_v4lmjpegsrc_srcconnect (GstPad *pad,
/* Note: basically, we don't give a damn about the opposite caps here. /* Note: basically, we don't give a damn about the opposite caps here.
* that might seem odd, but it isn't. we know that the opposite caps is * that might seem odd, but it isn't. we know that the opposite caps is
* either NULL or has mime type video/jpeg, and in both cases, we'll set * either NULL or has mime type video/x-jpeg, and in both cases, we'll set
* our own mime type back and it'll work. Other properties are to be set * our own mime type back and it'll work. Other properties are to be set
* by the src, not by the opposite caps */ * by the src, not by the opposite caps */
@ -464,10 +465,11 @@ gst_v4lmjpegsrc_srcconnect (GstPad *pad,
/* we now have an actual width/height - *set it* */ /* we now have an actual width/height - *set it* */
caps = gst_caps_new("v4lmjpegsrc_caps", caps = gst_caps_new("v4lmjpegsrc_caps",
"video/jpeg", "video/x-jpeg",
gst_props_new( gst_props_new(
"width", GST_PROPS_INT(v4lmjpegsrc->end_width), "width", GST_PROPS_INT(v4lmjpegsrc->end_width),
"height", GST_PROPS_INT(v4lmjpegsrc->end_height), "height", GST_PROPS_INT(v4lmjpegsrc->end_height),
"framerate", GST_PROPS_FLOAT(fps),
NULL ) ); NULL ) );
if ((ret_val = gst_pad_try_set_caps(v4lmjpegsrc->srcpad, caps)) == GST_PAD_LINK_REFUSED) if ((ret_val = gst_pad_try_set_caps(v4lmjpegsrc->srcpad, caps)) == GST_PAD_LINK_REFUSED)
return GST_PAD_LINK_REFUSED; return GST_PAD_LINK_REFUSED;
@ -603,11 +605,12 @@ gst_v4lmjpegsrc_getcaps (GstPad *pad,
} }
caps = GST_CAPS_NEW("v4lmjpegsrc_jpeg_caps", caps = GST_CAPS_NEW("v4lmjpegsrc_jpeg_caps",
"video/jpeg", "video/x-jpeg",
"width", GST_PROPS_INT_RANGE(vcap->maxwidth/4, "width", GST_PROPS_INT_RANGE(vcap->maxwidth/4,
vcap->maxwidth), vcap->maxwidth),
"height", GST_PROPS_INT_RANGE(vcap->maxheight/4, "height", GST_PROPS_INT_RANGE(vcap->maxheight/4,
vcap->maxheight), vcap->maxheight),
"framerate", GST_PROPS_FLOAT_RANGE(0, G_MAXFLOAT),
NULL); NULL);
return caps; return caps;
@ -857,10 +860,11 @@ plugin_init (GModule *module, GstPlugin *plugin)
g_return_val_if_fail(factory != NULL, FALSE); g_return_val_if_fail(factory != NULL, FALSE);
caps = gst_caps_new ("v4lmjpegsrc_caps", caps = gst_caps_new ("v4lmjpegsrc_caps",
"video/jpeg", "video/x-jpeg",
gst_props_new ( gst_props_new (
"width", GST_PROPS_INT_RANGE (0, G_MAXINT), "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),
NULL ) NULL )
); );
capslist = gst_caps_append(capslist, caps); capslist = gst_caps_append(capslist, caps);

View file

@ -27,6 +27,7 @@
#include <string.h> #include <string.h>
#include <sys/time.h> #include <sys/time.h>
#include "v4lsrc_calls.h" #include "v4lsrc_calls.h"
#include <gst/video/video.h>
/* elementfactory information */ /* elementfactory information */
static GstElementDetails gst_v4lsrc_details = { static GstElementDetails gst_v4lsrc_details = {
@ -209,11 +210,11 @@ gst_v4lsrc_init (GstV4lSrc *v4lsrc)
} }
static gdouble static gfloat
gst_v4lsrc_get_fps (GstV4lSrc *v4lsrc) gst_v4lsrc_get_fps (GstV4lSrc *v4lsrc)
{ {
gint norm; gint norm;
gdouble fps; gfloat fps;
if (!v4lsrc->use_fixed_fps && if (!v4lsrc->use_fixed_fps &&
v4lsrc->clock != NULL && v4lsrc->clock != NULL &&
@ -286,7 +287,8 @@ gst_v4lsrc_srcconvert (GstPad *pad,
static GstCaps * static GstCaps *
gst_v4lsrc_palette_to_caps (int palette, gst_v4lsrc_palette_to_caps (int palette,
GstPropsEntry *width, GstPropsEntry *width,
GstPropsEntry *height) GstPropsEntry *height,
GstPropsEntry *fps)
{ {
guint32 fourcc; guint32 fourcc;
GstCaps *caps; GstCaps *caps;
@ -316,25 +318,25 @@ gst_v4lsrc_palette_to_caps (int palette,
} }
if (fourcc == GST_MAKE_FOURCC('R','G','B',' ')) { if (fourcc == GST_MAKE_FOURCC('R','G','B',' ')) {
gint depth = 0; gint depth = 0, endianness = 0;
guint32 r_mask = 0, g_mask = 0, b_mask = 0; guint32 r_mask = 0, g_mask = 0, b_mask = 0;
switch (palette) { switch (palette) {
case VIDEO_PALETTE_RGB555: case VIDEO_PALETTE_RGB555:
depth = 15; depth = 15; endianness = G_BYTE_ORDER;
r_mask = 0x7c00; g_mask = 0x03e0; b_mask = 0x001f; r_mask = 0x7c00; g_mask = 0x03e0; b_mask = 0x001f;
break; break;
case VIDEO_PALETTE_RGB565: case VIDEO_PALETTE_RGB565:
depth = 16; depth = 16; endianness = G_BYTE_ORDER;
r_mask = 0xf800; g_mask = 0x07f0; b_mask = 0x001f; r_mask = 0xf800; g_mask = 0x07f0; b_mask = 0x001f;
break; break;
case VIDEO_PALETTE_RGB24: case VIDEO_PALETTE_RGB24:
depth = 24; depth = 24; endianness = G_BIG_ENDIAN;
r_mask = 0xff0000; g_mask = 0x00ff00; b_mask = 0x0000ff; r_mask = R_MASK_24; g_mask = G_MASK_24; b_mask = B_MASK_24;
break; break;
case VIDEO_PALETTE_RGB32: case VIDEO_PALETTE_RGB32:
depth = 32; depth = 32; endianness = G_BIG_ENDIAN;
r_mask = 0x00ff0000; g_mask = 0x0000ff00; b_mask = 0x000000ff; r_mask = R_MASK_32; g_mask = G_MASK_32; b_mask = B_MASK_32;
break; break;
default: default:
g_assert_not_reached(); g_assert_not_reached();
@ -342,8 +344,7 @@ gst_v4lsrc_palette_to_caps (int palette,
} }
caps = GST_CAPS_NEW("v4lsrc_rgb_caps", caps = GST_CAPS_NEW("v4lsrc_rgb_caps",
"video/raw", "video/x-raw-rgb",
"format", GST_PROPS_FOURCC(fourcc),
"bpp", GST_PROPS_INT((depth+1) & ~1), "bpp", GST_PROPS_INT((depth+1) & ~1),
"depth", GST_PROPS_INT(depth), "depth", GST_PROPS_INT(depth),
"endianness", GST_PROPS_INT(G_BYTE_ORDER), "endianness", GST_PROPS_INT(G_BYTE_ORDER),
@ -353,23 +354,26 @@ gst_v4lsrc_palette_to_caps (int palette,
NULL); NULL);
} else { } else {
caps = GST_CAPS_NEW("v4lsrc_yuv_caps", caps = GST_CAPS_NEW("v4lsrc_yuv_caps",
"video/raw", "video/x-raw-yuv",
"format", GST_PROPS_FOURCC(fourcc), "format", GST_PROPS_FOURCC(fourcc),
NULL); NULL);
} }
gst_props_add_entry(caps->properties, width); gst_props_add_entry(caps->properties, width);
gst_props_add_entry(caps->properties, height); gst_props_add_entry(caps->properties, height);
gst_props_add_entry(caps->properties, fps);
return caps; return caps;
} }
#define gst_v4lsrc_palette_to_caps_fixed(palette, width, height) \ #define gst_v4lsrc_palette_to_caps_fixed(palette, width, height, fps) \
gst_v4lsrc_palette_to_caps(palette, \ gst_v4lsrc_palette_to_caps(palette, \
gst_props_entry_new("width", \ gst_props_entry_new("width", \
GST_PROPS_INT(width)), \ GST_PROPS_INT(width)), \
gst_props_entry_new("height", \ gst_props_entry_new("height", \
GST_PROPS_INT(height)) \ GST_PROPS_INT(height)), \
gst_props_entry_new("framerate", \
GST_PROPS_FLOAT(fps)) \
) )
#define gst_v4lsrc_palette_to_caps_range(palette, min_w, max_w, min_h, max_h) \ #define gst_v4lsrc_palette_to_caps_range(palette, min_w, max_w, min_h, max_h) \
gst_v4lsrc_palette_to_caps(palette, \ gst_v4lsrc_palette_to_caps(palette, \
@ -378,7 +382,10 @@ gst_v4lsrc_palette_to_caps (int palette,
max_w)), \ max_w)), \
gst_props_entry_new("height", \ gst_props_entry_new("height", \
GST_PROPS_INT_RANGE(min_h, \ GST_PROPS_INT_RANGE(min_h, \
max_h)) \ max_h)), \
gst_props_entry_new("framerate", \
GST_PROPS_FLOAT_RANGE(0., \
G_MAXFLOAT)) \
) )
#define gst_caps_get_int_range(caps, name, min, max) \ #define gst_caps_get_int_range(caps, name, min, max) \
@ -415,7 +422,11 @@ gst_v4lsrc_srcconnect (GstPad *pad,
guint32 fourcc; guint32 fourcc;
gint depth, w, h; gint depth, w, h;
gst_caps_get_fourcc_int (caps, "format", &fourcc); if (!strcmp(gst_caps_get_mime(caps), "video/x-raw-yuv"))
gst_caps_get_fourcc_int (caps, "format", &fourcc);
else
fourcc = GST_MAKE_FOURCC('R','G','B',' ');
if (gst_caps_has_property(caps, "width")) { if (gst_caps_has_property(caps, "width")) {
if (gst_caps_has_fixed_property(caps, "width")) { if (gst_caps_has_fixed_property(caps, "width")) {
gst_caps_get_int(caps, "width", &w); gst_caps_get_int(caps, "width", &w);
@ -490,7 +501,8 @@ gst_v4lsrc_srcconnect (GstPad *pad,
continue; continue;
/* try to connect the pad/caps with the actual width/height */ /* try to connect the pad/caps with the actual width/height */
newcaps = gst_v4lsrc_palette_to_caps_fixed(palette, w, h); newcaps = gst_v4lsrc_palette_to_caps_fixed(palette, w, h,
gst_v4lsrc_get_fps(v4lsrc));
gst_caps_debug (newcaps, "new caps to set on v4lsrc's src pad"); gst_caps_debug (newcaps, "new caps to set on v4lsrc's src pad");