configure.ac: Improve mpeg2enc detection. This is for distributions that do ship mjpegtools, but without mpeg2enc. Al...

Original commit message from CVS:
2003-12-21  Ronald Bultje  <rbultje@ronald.bitfreak.net>

* 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.
diff --git a/ChangeLog b/ChangeLog
index 735bd58..5c3eb26 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,41 @@
+2003-12-21  Ronald Bultje  <rbultje@ronald.bitfreak.net>
+
+	* 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  <thomas at apestaart dot org>
 
 	* ChangeLog: moved to gstreamer/docs/random/old/ChangeLog.gst-plugins
diff --git a/configure.ac b/configure.ac
index 2557072..6055d3b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1076,16 +1076,52 @@
 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 <mpeg2encoder.hh>
+#include <mpeg2encoptions.hh>
+
+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 5e5e028..ecf101a 100644
--- a/ext/mpeg2enc/gstmpeg2enc.cc
+++ b/ext/mpeg2enc/gstmpeg2enc.cc
@@ -135,7 +135,8 @@
     "mpeg2enc video encoder",
     "Codec/Video/Encoder",
     "High-quality MPEG-1/2 video encoder",
-    "Ronald Bultje <rbultje@ronald.bitfreak.net>",
+    "Andrew Stevens <andrew.stevens@nexgo.de>\n"
+    "Ronald Bultje <rbultje@ronald.bitfreak.net>"
   };
   GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
 
@@ -209,11 +210,15 @@
   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 0ce2942..2dc6893 100644
--- a/gst/mpegaudioparse/gstmpegaudioparse.c
+++ b/gst/mpegaudioparse/gstmpegaudioparse.c
@@ -60,11 +60,12 @@
   	"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 c006dbc..cd98162 100644
--- a/sys/v4l2/gstv4l2src.c
+++ b/sys/v4l2/gstv4l2src.c
@@ -51,56 +51,67 @@
 	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_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 @@
 	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 @@
 	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,