diff --git a/ChangeLog b/ChangeLog index 735bd585ea..5c3eb26df9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,41 @@ +2003-12-21 Ronald Bultje + + * configure.ac: + Improve mpeg2enc detection. This is for distributions that do + ship mjpegtools, but without mpeg2enc. Also does object check + for might there ever be ABI incompatibility. + * ext/mpeg2enc/gstmpeg2enc.cc: + Add Andrew as second maintainer (he's helping me), and also add + an error if no caps was set. This happens if I pull before capsnego + and that's something I should solve sometime else. + * gst/matroska/matroska-demux.c: + (gst_matroska_demux_parse_blockgroup): + Fix time parsing. + * gst/matroska/matroska-mux.c: (gst_matroska_mux_audio_pad_link), + (gst_matroska_mux_track_header): + Add caps to templates. + * gst/mpegaudioparse/gstmpegaudioparse.c: (mp3_sink_factory): + Add mpegversion=1 to prevent confusion with MPEG/AAC. + * gst/mpegstream/gstmpegdemux.c: + Remove layer since it causes warnings about unfixed caps. + * gst/videotestsrc/gstvideotestsrc.c: (gst_videotestsrc_get): + Fix obvious typo (we error out if caps were set, we should of + course error out if *no* caps were set). + * sys/oss/gstosselement.c: (gst_osselement_convert): + Fix format conversion, we confused bits/bytes. + * sys/oss/gstosselement.h: + Improve documentation for 'bps'. + * sys/v4l/TODO: + Remove stuff about plugins that need removing - this was done + ages ago. + * sys/v4l/gstv4lmjpegsrc.c: (gst_v4lmjpegsrc_init), + (gst_v4lmjpegsrc_src_convert), (gst_v4lmjpegsrc_src_query): + * sys/v4l/gstv4lsrc.c: (gst_v4lsrc_init), (gst_v4lsrc_src_convert), + (gst_v4lsrc_src_query): + * sys/v4l2/gstv4l2src.c: (gst_v4l2src_init), + (gst_v4l2src_src_convert), (gst_v4l2src_src_query): + Add get_query_types(), get_formats() and query() functions. + 2003-12-21 Thomas Vander Stichele * ChangeLog: moved to gstreamer/docs/random/old/ChangeLog.gst-plugins diff --git a/configure.ac b/configure.ac index 2557072ab2..6055d3b81a 100644 --- a/configure.ac +++ b/configure.ac @@ -1076,16 +1076,52 @@ GST_CHECK_FEATURE(MPEG2DEC, [mpeg2dec], mpeg2dec, [ dnl *** mpeg2enc *** translit(dnm, m, l) AM_CONDITIONAL(USE_MPEG2ENC, true) GST_CHECK_FEATURE(MPEG2ENC, [mpeg2enc], mpeg2enc, [ - PKG_CHECK_MODULES(MPEG2ENC, mjpegtools >= 1.6.1.92, - HAVE_MPEG2ENC="yes", HAVE_MPEG2ENC="no") - MPEG2ENC_LIBS="$MPEG2ENC_LIBS -lmpeg2encpp" - AC_SUBST(MPEG2ENC_CFLAGS) - AC_SUBST(MPEG2ENC_LIBS) + HAVE_MPEG2ENC="no" + dnl we require a c++ compiler for this one + if [ test x$HAVE_CXX = xyes ]; then + dnl libmpeg2enc was first included in mjpegtools-1.6.2-rc3 (1.6.1.92) + dnl since many distros include mjpegtools specifically without mplex + dnl and mpeg2enc, we check for mpeg2enc on its own, too. + PKG_CHECK_MODULES(MPEG2ENC, mjpegtools >= 1.6.1.92, [ + dnl switch over to c++ to test things + AC_LANG_CPLUSPLUS + OLD_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $MPEG2ENC_CFLAGS" + AC_CHECK_HEADER(mpeg2encoder.hh, [ + MPEG2ENC_LIBS="$MPEG2ENC_LIBS -lmpeg2encpp -lm -lpthread" + OLD_LIBS="$LIBS" + LIBS="$LIBS $MPEG2ENC_LIBS" + AC_MSG_CHECKING([for valid mpeg2enc objects]) + AC_TRY_RUN([ +#include +#include + +int +main (int argc, + char *argv[]) +{ + MPEG2EncOptions *options = new MPEG2EncOptions (); + MPEG2Encoder encoder (*options); + return 0; +} + ],[ + HAVE_MPEG2ENC="yes" + AC_SUBST(MPEG2ENC_CFLAGS) + AC_SUBST(MPEG2ENC_LIBS) + AC_MSG_RESULT(yes) + ], AC_MSG_RESULT(no)) + LIBS="$OLD_LIBS" + ]) + CPPFLAGS="$OLD_CPPFLAGS" + AC_LANG_C + ]) + fi ]) dnl *** mplex *** translit(dnm, m, l) AM_CONDITIONAL(USE_MPLEX, true) GST_CHECK_FEATURE(MPLEX, [mplex], mplex, [HAVE_MPLEX=$HAVE_CXX]) +]) dnl *** pango *** translit(dnm, m, l) AM_CONDITIONAL(USE_PANGO, true) diff --git a/ext/mpeg2enc/gstmpeg2enc.cc b/ext/mpeg2enc/gstmpeg2enc.cc index 5e5e028dfa..ecf101a397 100644 --- a/ext/mpeg2enc/gstmpeg2enc.cc +++ b/ext/mpeg2enc/gstmpeg2enc.cc @@ -135,7 +135,8 @@ gst_mpeg2enc_base_init (GstMpeg2encClass *klass) "mpeg2enc video encoder", "Codec/Video/Encoder", "High-quality MPEG-1/2 video encoder", - "Ronald Bultje ", + "Andrew Stevens \n" + "Ronald Bultje " }; GstElementClass *element_class = GST_ELEMENT_CLASS (klass); @@ -209,11 +210,15 @@ gst_mpeg2enc_loop (GstElement *element) if (!enc->encoder) { GstCaps *caps; + if (!(caps = GST_PAD_CAPS (enc->sinkpad))) { + gst_element_error (element, + "No format given by previous element"); + return; + } + /* create new encoder with these settings */ - enc->encoder = new GstMpeg2Encoder (enc->options, - enc->sinkpad, - GST_PAD_CAPS (enc->sinkpad), - enc->srcpad); + enc->encoder = new GstMpeg2Encoder (enc->options, enc->sinkpad, + caps, enc->srcpad); /* and set caps on other side */ caps = enc->encoder->getFormat (); diff --git a/gst/mpegaudioparse/gstmpegaudioparse.c b/gst/mpegaudioparse/gstmpegaudioparse.c index 0ce2942d45..2dc68932c0 100644 --- a/gst/mpegaudioparse/gstmpegaudioparse.c +++ b/gst/mpegaudioparse/gstmpegaudioparse.c @@ -60,11 +60,12 @@ mp3_sink_factory (void) "sink", GST_PAD_SINK, GST_PAD_ALWAYS, - gst_caps_new ( + GST_CAPS_NEW ( "mp3parse_sink", "audio/mpeg", - NULL), - NULL); + "mpegversion", GST_PROPS_INT (1) + ) + ); }; /* GstMPEGAudioParse signals and args */ diff --git a/sys/v4l2/gstv4l2src.c b/sys/v4l2/gstv4l2src.c index c006dbc595..cd98162f5f 100644 --- a/sys/v4l2/gstv4l2src.c +++ b/sys/v4l2/gstv4l2src.c @@ -51,56 +51,67 @@ enum { ARG_USE_FIXED_FPS }; +GST_FORMATS_FUNCTION (GstPad *, gst_v4l2src_get_formats, + GST_FORMAT_TIME, GST_FORMAT_DEFAULT); +GST_QUERY_TYPE_FUNCTION (GstPad *, gst_v4l2src_get_query_types, + GST_QUERY_POSITION); /* init functions */ -static void gst_v4l2src_class_init (GstV4l2SrcClass *klass); -static void gst_v4l2src_base_init (GstV4l2SrcClass *klass); -static void gst_v4l2src_init (GstV4l2Src *v4l2src); +static void gst_v4l2src_class_init (GstV4l2SrcClass *klass); +static void gst_v4l2src_base_init (GstV4l2SrcClass *klass); +static void gst_v4l2src_init (GstV4l2Src *v4l2src); /* signal functions */ -static void gst_v4l2src_open (GstElement *element, - const gchar *device); -static void gst_v4l2src_close (GstElement *element, - const gchar *device); +static void gst_v4l2src_open (GstElement *element, + const gchar *device); +static void gst_v4l2src_close (GstElement *element, + const gchar *device); -/* pad/buffer functions */ -static gboolean gst_v4l2src_srcconvert (GstPad *pad, - GstFormat src_format, - gint64 src_value, - GstFormat *dest_format, - gint64 *dest_value); -static GstPadLinkReturn gst_v4l2src_srcconnect (GstPad *pad, - GstCaps *caps); -static GstCaps * gst_v4l2src_getcaps (GstPad *pad, - GstCaps *caps); -static GstData * gst_v4l2src_get (GstPad *pad); +/* pad/info functions */ +static gboolean gst_v4l2src_src_convert (GstPad *pad, + GstFormat src_format, + gint64 src_value, + GstFormat *dest_format, + gint64 *dest_value); +static gboolean gst_v4l2src_src_query (GstPad *pad, + GstQueryType type, + GstFormat *format, + gint64 *value); + +/* buffer functions */ +static GstPadLinkReturn + gst_v4l2src_srcconnect (GstPad *pad, + GstCaps *caps); +static GstCaps *gst_v4l2src_getcaps (GstPad *pad, + GstCaps *caps); +static GstData *gst_v4l2src_get (GstPad *pad); /* get/set params */ -static void gst_v4l2src_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec); -static void gst_v4l2src_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec); +static void gst_v4l2src_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); +static void gst_v4l2src_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); /* state handling */ -static GstElementStateReturn gst_v4l2src_change_state (GstElement *element); +static GstElementStateReturn + gst_v4l2src_change_state (GstElement *element); /* set_clock function for A/V sync */ -static void gst_v4l2src_set_clock (GstElement *element, - GstClock *clock); - +static void gst_v4l2src_set_clock (GstElement *element, + GstClock *clock); /* bufferpool functions */ -static GstBuffer * gst_v4l2src_buffer_new (GstBufferPool *pool, - guint64 offset, - guint size, - gpointer user_data); -static void gst_v4l2src_buffer_free (GstBufferPool *pool, - GstBuffer *buf, - gpointer user_data); +static GstBuffer *gst_v4l2src_buffer_new (GstBufferPool *pool, + guint64 offset, + guint size, + gpointer user_data); +static void gst_v4l2src_buffer_free (GstBufferPool *pool, + GstBuffer *buf, + gpointer user_data); static GstPadTemplate *src_template; @@ -220,8 +231,14 @@ gst_v4l2src_init (GstV4l2Src *v4l2src) gst_pad_set_get_function(v4l2src->srcpad, gst_v4l2src_get); gst_pad_set_link_function(v4l2src->srcpad, gst_v4l2src_srcconnect); - gst_pad_set_convert_function (v4l2src->srcpad, gst_v4l2src_srcconvert); gst_pad_set_getcaps_function (v4l2src->srcpad, gst_v4l2src_getcaps); + gst_pad_set_convert_function (v4l2src->srcpad, gst_v4l2src_src_convert); + gst_pad_set_formats_function (v4l2src->srcpad, + gst_v4l2src_get_formats); + gst_pad_set_query_function (v4l2src->srcpad, + gst_v4l2src_src_query); + gst_pad_set_query_type_function (v4l2src->srcpad, + gst_v4l2src_get_query_types); v4l2src->bufferpool = gst_buffer_pool_new(NULL, NULL, gst_v4l2src_buffer_new, @@ -290,13 +307,12 @@ gst_v4l2src_get_fps (GstV4l2Src *v4l2src) return 0.; } - static gboolean -gst_v4l2src_srcconvert (GstPad *pad, - GstFormat src_format, - gint64 src_value, - GstFormat *dest_format, - gint64 *dest_value) +gst_v4l2src_src_convert (GstPad *pad, + GstFormat src_format, + gint64 src_value, + GstFormat *dest_format, + gint64 *dest_value) { GstV4l2Src *v4l2src; gdouble fps; @@ -334,6 +350,41 @@ gst_v4l2src_srcconvert (GstPad *pad, return TRUE; } +static gboolean +gst_v4l2src_src_query (GstPad *pad, + GstQueryType type, + GstFormat *format, + gint64 *value) +{ + GstV4l2Src *v4l2src = GST_V4L2SRC (gst_pad_get_parent (pad)); + gboolean res = TRUE; + gdouble fps; + + if ((fps = gst_v4l2src_get_fps(v4l2src)) == 0) + return FALSE; + + switch (type) { + case GST_QUERY_POSITION: + switch (*format) { + case GST_FORMAT_TIME: + *value = v4l2src->handled * GST_SECOND / fps; + break; + case GST_FORMAT_DEFAULT: + *value = v4l2src->handled; + break; + default: + res = FALSE; + break; + } + break; + default: + res = FALSE; + break; + } + + return res; +} + static GstCaps * gst_v4l2src_v4l2fourcc_to_caps (guint32 fourcc,