ext/faad/gstfaad.c: Fix negotiation.
authorDavid Schleef <ds@schleef.org>
Sat, 6 Mar 2004 00:42:20 +0000 (00:42 +0000)
committerDavid Schleef <ds@schleef.org>
Sat, 6 Mar 2004 00:42:20 +0000 (00:42 +0000)
Original commit message from CVS:
* ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_srcgetcaps),
(gst_faad_chain): Fix negotiation.
* ext/librfb/gstrfbsrc.c: (gst_rfbsrc_handle_src_event): Add
key and button events.
* gst-libs/gst/floatcast/floatcast.h: Fix a minor bug in this
dung heap of code.
* gst-libs/gst/gconf/gstreamer-gconf-uninstalled.pc.in: gstgconf
depends on gconf
* gst-libs/gst/gconf/gstreamer-gconf.pc.in: same
* gst-libs/gst/play/play.c: (gst_play_pipeline_setup),
(gst_play_video_fixate), (gst_play_audio_fixate): Add a fixate
function to encourage better negotiation, particularly between
audioconvert and osssink.
* gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_chain):
* gst/qtdemux/qtdemux.c: (qtdemux_parse_trak):  Make some debugging
more important.
* gst/typefind/gsttypefindfunctions.c:  Fix mistake in flash
typefinding.
* gst/vbidec/vbiscreen.c:  Add glib header
* pkgconfig/gstreamer-play.pc.in:  Depends on gst-interfaces.

ChangeLog
ext/faad/gstfaad.c
gst-libs/gst/floatcast/floatcast.h
gst-libs/gst/play/play.c
gst/qtdemux/qtdemux.c
gst/vbidec/vbiscreen.c
pkgconfig/gstreamer-gconf-uninstalled.pc.in
pkgconfig/gstreamer-gconf.pc.in
pkgconfig/gstreamer-play.pc.in

index 2a44d76..4c0a2cf 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,26 @@
+2004-03-05  David Schleef  <ds@schleef.org>
+
+       * ext/faad/gstfaad.c: (gst_faad_init), (gst_faad_srcgetcaps),
+       (gst_faad_chain): Fix negotiation.
+       * ext/librfb/gstrfbsrc.c: (gst_rfbsrc_handle_src_event): Add
+       key and button events.
+       * gst-libs/gst/floatcast/floatcast.h: Fix a minor bug in this
+       dung heap of code.
+       * gst-libs/gst/gconf/gstreamer-gconf-uninstalled.pc.in: gstgconf
+       depends on gconf
+       * gst-libs/gst/gconf/gstreamer-gconf.pc.in: same
+       * gst-libs/gst/play/play.c: (gst_play_pipeline_setup),
+       (gst_play_video_fixate), (gst_play_audio_fixate): Add a fixate
+       function to encourage better negotiation, particularly between
+       audioconvert and osssink.
+       * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_chain):
+       * gst/qtdemux/qtdemux.c: (qtdemux_parse_trak):  Make some debugging
+       more important.
+       * gst/typefind/gsttypefindfunctions.c:  Fix mistake in flash
+       typefinding.
+       * gst/vbidec/vbiscreen.c:  Add glib header
+       * pkgconfig/gstreamer-play.pc.in:  Depends on gst-interfaces.
+
 2004-03-06  Christophe Fergeau  <teuf@users.sourceforge.net>
 
        * ext/mad/gstmad.c: Fix detection of Xing headers
index bb804cb..6e27297 100644 (file)
@@ -148,11 +148,7 @@ gst_faad_init (GstFaad *faad)
   gst_element_add_pad (GST_ELEMENT (faad), faad->srcpad);
   gst_pad_set_link_function (faad->srcpad, gst_faad_srcconnect);
 
-  /* This was originally intended as a getcaps() function, but
-   * in the end, we needed a srcconnect() function, so this is
-   * not really useful. However, srcconnect() uses it, so it is
-   * still there... */
-  /*gst_pad_set_getcaps_function (faad->srcpad, gst_faad_srcgetcaps);*/
+  gst_pad_set_getcaps_function (faad->srcpad, gst_faad_srcgetcaps);
 }
 
 static GstPadLinkReturn
@@ -244,7 +240,7 @@ gst_faad_srcgetcaps (GstPad  *pad)
     return caps;
   }
 
-  return GST_PAD_TEMPLATE_CAPS (GST_PAD_PAD_TEMPLATE (pad));
+  return gst_caps_copy (GST_PAD_TEMPLATE_CAPS (GST_PAD_PAD_TEMPLATE (pad)));
 }
 
 static GstPadLinkReturn
@@ -357,12 +353,16 @@ gst_faad_chain (GstPad  *pad,
                 &samplerate, &channels);
     faad->samplerate = samplerate;
     faad->channels = channels;
+
+    gst_pad_renegotiate (faad->srcpad);
+#if 0
     if (gst_faad_srcconnect (faad->srcpad,
                             gst_pad_get_allowed_caps (faad->srcpad)) <= 0) {
       GST_ELEMENT_ERROR (faad, CORE, NEGOTIATION, (NULL), (NULL));
       gst_buffer_unref (buf);
       return;
     }
+#endif
   }
 
   out = faacDecDecode (faad->handle, &info,
@@ -379,12 +379,19 @@ gst_faad_chain (GstPad  *pad,
       info.channels != faad->channels) {
     faad->samplerate = info.samplerate;
     faad->channels = info.channels;
+    gst_pad_renegotiate (faad->srcpad);
+#if 0
     if (gst_faad_srcconnect (faad->srcpad,
                             gst_pad_get_allowed_caps (faad->srcpad)) <= 0) {
       GST_ELEMENT_ERROR (faad, CORE, NEGOTIATION, (NULL), (NULL));
       gst_buffer_unref (buf);
       return;
     }
+#endif
+  }
+
+  if (info.samples == 0) {
+    return;
   }
 
   /* FIXME: did it handle the whole buffer? */
index 99577d9..ae87a43 100644 (file)
@@ -52,8 +52,8 @@ G_BEGIN_DECLS
 
 #else
        /* use a standard c cast, but do rounding correctly */
-       #define gst_cast_float(x)       ((x)>=0?(gint)((x)+0.5):(gint)((x)-0.5))
-       #define gst_cast_double(x)      ((x)>=0?(gint)((x)+0.5):(gint)((x)-0.5))
+       #define gst_cast_float(x)       ((gint)floor((x)+0.5))
+       #define gst_cast_double(x)      ((gint)floor((x)+0.5))
 
 #endif
 
index 081af99..f46fbab 100644 (file)
@@ -67,6 +67,9 @@ static GstPipelineClass *parent_class = NULL;
 /*                                                         */
 /* ======================================================= */
 
+static GstCaps * gst_play_video_fixate (GstPad *pad, const GstCaps *caps, gpointer user_data);
+static GstCaps * gst_play_audio_fixate (GstPad *pad, const GstCaps *caps, gpointer user_data);
+
 static GQuark
 gst_play_error_quark (void)
 {
@@ -275,6 +278,8 @@ gst_play_pipeline_setup (GstPlay *play, GError **error)
   /* Software scaling of video stream */
   GST_PLAY_MAKE_OR_ERROR (video_scaler, "videoscale", "video_scaler", error);
   g_hash_table_insert (play->priv->elements, "video_scaler", video_scaler);
+  g_signal_connect (gst_element_get_pad(video_scaler, "src"), "fixate",
+      G_CALLBACK (gst_play_video_fixate), play);
   
   /* Placeholder for future video sink bin */
   GST_PLAY_MAKE_OR_ERROR (video_sink, "fakesink", "video_sink", error);
@@ -315,6 +320,8 @@ gst_play_pipeline_setup (GstPlay *play, GError **error)
   /* Volume control */
   GST_PLAY_MAKE_OR_ERROR (volume, "volume", "volume", error);
   g_hash_table_insert (play->priv->elements, "volume", volume);
+  g_signal_connect (gst_element_get_pad(volume, "src"), "fixate",
+      G_CALLBACK (gst_play_audio_fixate), play);
     
   /* Placeholder for future audio sink bin */
   GST_PLAY_MAKE_OR_ERROR (audio_sink, "fakesink", "audio_sink", error);
@@ -434,6 +441,65 @@ gst_play_get_length_callback (GstPlay *play)
     return TRUE;
 }
 
+static GstCaps *
+gst_play_video_fixate (GstPad *pad, const GstCaps *caps, gpointer user_data)
+{
+  GstStructure *structure;
+  GstCaps *newcaps;
+
+  GST_DEBUG ("video fixate %p %" GST_PTR_FORMAT, pad, caps);
+
+  if (gst_caps_get_size (caps) > 1) return NULL;
+
+  newcaps = gst_caps_copy (caps);
+  structure = gst_caps_get_structure (newcaps, 0);
+
+  if (gst_caps_structure_fixate_field_nearest_int (structure, "width", 320)) {
+    return newcaps;
+  }
+  if (gst_caps_structure_fixate_field_nearest_int (structure, "height", 240)) {
+    return newcaps;
+  }
+  if (gst_caps_structure_fixate_field_nearest_double (structure, "framerate",
+        30.0)) {
+    return newcaps;
+  }
+
+  /* failed to fixate */
+  gst_caps_free (newcaps);
+  return NULL;
+}
+
+static GstCaps *
+gst_play_audio_fixate (GstPad *pad, const GstCaps *caps, gpointer user_data)
+{
+  GstCaps *newcaps;
+  GstStructure *structure;
+
+  GST_DEBUG ("audio fixate %p %" GST_PTR_FORMAT, pad, caps);
+
+  newcaps = gst_caps_new_full (gst_structure_copy (
+        gst_caps_get_structure (caps, 0)), NULL); 
+  structure = gst_caps_get_structure (newcaps, 0);
+
+  if (gst_caps_structure_fixate_field_nearest_int (structure, "rate", 44100)) {
+    return newcaps;
+  }
+  if (gst_caps_structure_fixate_field_nearest_int (structure, "depth", 16)) {
+    return newcaps;
+  }
+  if (gst_caps_structure_fixate_field_nearest_int (structure, "width", 16)) {
+    return newcaps;
+  }
+  if (gst_caps_structure_fixate_field_nearest_int (structure, "channels", 2)) {
+    return newcaps;
+  }
+
+  gst_caps_free (newcaps);
+
+  return NULL;
+}
+
 static void
 gst_play_state_change (GstElement *element, GstElementState old,
                        GstElementState state)
index d33d18e..5ce3807 100644 (file)
@@ -1445,7 +1445,9 @@ static void qtdemux_parse_trak(GstQTDemux *qtdemux, GNode *trak)
     
     stream->caps = qtdemux_video_caps(qtdemux,
         QTDEMUX_FOURCC_GET(stsd->data+offset+4), stsd->data);
-    GST_LOG("caps %s\n",gst_caps_to_string(stream->caps));
+    GST_INFO("type " GST_FOURCC_FORMAT " caps %" GST_PTR_FORMAT "\n",
+        GST_FOURCC_ARGS (QTDEMUX_FOURCC_GET(stsd->data+offset+4)),
+        stream->caps);
   }else if(stream->subtype == FOURCC_soun){
     int version;
 
@@ -1480,7 +1482,8 @@ static void qtdemux_parse_trak(GstQTDemux *qtdemux, GNode *trak)
 
     stream->caps = qtdemux_audio_caps(qtdemux,
         QTDEMUX_FOURCC_GET(stsd->data+16+4), (QTDEMUX_GUINT32_GET(stsd->data) > offset) ? stsd->data + offset : NULL);
-    GST_LOG("caps %s\n",gst_caps_to_string(stream->caps));
+    GST_INFO("type " GST_FOURCC_FORMAT " caps %" GST_PTR_FORMAT "\n",
+        GST_FOURCC_ARGS(QTDEMUX_FOURCC_GET(stsd->data+16+4)), stream->caps);
   }else{
     GST_LOG("unknown subtype\n");
     return;
index 4ce0404..bcce79e 100644 (file)
@@ -24,6 +24,7 @@
 #include "config.h"
 #endif
 
+#include <glib.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdarg.h>
index 1255a6b..0d4d5cb 100644 (file)
@@ -6,7 +6,7 @@ includedir=${pcfiledir}/../gst-libs
 
 Name: GStreamer GConf Library, uninstalled
 Description: Streaming media framework, GConf support library, not installed
-Requires: gstreamer-@GST_MAJORMINOR@ >= @VERSION@
+Requires: gstreamer-@GST_MAJORMINOR@ >= @VERSION@ gconf-2.0
 Version: @VERSION@
 
 Libs: ${libdir}/libgstgconf-@GST_MAJORMINOR@.la
index 2cbf807..e1801c5 100644 (file)
@@ -5,7 +5,7 @@ includedir=@includedir@/gstreamer-@GST_MAJORMINOR@
 
 Name: GStreamer GConf Library
 Description: Streaming media framework, GConf support library
-Requires: gstreamer-@GST_MAJORMINOR@
+Requires: gstreamer-@GST_MAJORMINOR@ gconf-2.0
 Version: @VERSION@
 
 Libs: -L${libdir} -lgstgconf-@GST_MAJORMINOR@
index 99dc6e7..9d6a202 100644 (file)
@@ -5,7 +5,7 @@ includedir=@includedir@/gstreamer-@GST_MAJORMINOR@
 
 Name: GStreamer Play Library
 Description: Streaming-media framework, play libraries
-Requires: gstreamer-@GST_MAJORMINOR@
+Requires: gstreamer-@GST_MAJORMINOR@ gstreamer-interfaces-@GST_MAJORMINOR@
 Version: @VERSION@
 
 Libs: -L${libdir} -lgstplay-@GST_MAJORMINOR@ -lgstcontrol-@GST_MAJORMINOR@