ext/xine/: add first version of xine plugin wrapper. Currently only wraps the
authorBenjamin Otte <otte@gnome.org>
Fri, 20 Feb 2004 00:52:07 +0000 (00:52 +0000)
committerBenjamin Otte <otte@gnome.org>
Fri, 20 Feb 2004 00:52:07 +0000 (00:52 +0000)
Original commit message from CVS:
2004-02-20  Benjamin Otte  <otte@gnome.org>

* ext/xine/Makefile.am:
* ext/xine/gstxine.h:
* ext/xine/xine.c:
* ext/xine/xineaudiodec.c:
* ext/xine/xinecaps.c:
add first version of xine plugin wrapper. Currently only wraps the
QDM2 win32 DLL, and even that only in proof-of-concept quality.
* configure.ac:
* ext/Makefile.am:
add xine plugin wrapper, disabled by default. Use --enable-xine to
build. Note that it'll segfault on gst-register if you don't remove
the goom and tvtime post plugins from xine.
* gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_sink_event),
(qtdemux_parse), (qtdemux_parse_trak), (qtdemux_audio_caps):
add extradata parsing for QDM2.
change around debugging prints.

ChangeLog
configure.ac
ext/Makefile.am
gst/qtdemux/qtdemux.c

index 3fae7f2..76a1f9c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2004-02-20  Benjamin Otte  <otte@gnome.org>
+
+       * ext/xine/Makefile.am:
+       * ext/xine/gstxine.h:
+       * ext/xine/xine.c: 
+       * ext/xine/xineaudiodec.c: 
+       * ext/xine/xinecaps.c: 
+         add first version of xine plugin wrapper. Currently only wraps the
+         QDM2 win32 DLL, and even that only in proof-of-concept quality.
+       * configure.ac:
+       * ext/Makefile.am:
+         add xine plugin wrapper, disabled by default. Use --enable-xine to
+         build. Note that it'll segfault on gst-register if you don't remove
+         the goom and tvtime post plugins from xine.
+       * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_sink_event),
+       (qtdemux_parse), (qtdemux_parse_trak), (qtdemux_audio_caps):
+         add extradata parsing for QDM2.
+         change around debugging prints.
+
 2004-02-19  Benjamin Otte  <otte@gnome.org>
 
        * ext/lame/gstlame.c: (gst_lame_chain):
index 3626b82..4631797 100644 (file)
@@ -1320,6 +1320,14 @@ vorbis_synthesis_restart (v);
   CFLAGS="$ac_cflags_save"
 fi
 
+dnl *** xine ***
+translit(dnm, m, l) AM_CONDITIONAL(USE_XINE, true)
+GST_CHECK_FEATURE(XINE, [xine wrapper], xine, [
+  PKG_CHECK_MODULES(XINE, libxine >= 1.0.0, HAVE_XINE=yes, HAVE_XINE=no)
+  AC_SUBST(XINE_CFLAGS)
+  AC_SUBST(XINE_LIBS)
+],disabled)
+
 dnl *** XVID ***
 translit(dnm, m, l) AM_CONDITIONAL(USE_XVID, true)
 GST_CHECK_FEATURE(XVID, [xvid plugins], xvid, [
@@ -1664,6 +1672,7 @@ ext/swfdec/Makefile
 ext/tarkin/Makefile
 ext/theora/Makefile
 ext/vorbis/Makefile
+ext/xine/Makefile
 ext/xvid/Makefile
 gst-libs/Makefile
 gst-libs/gst/Makefile
index 4865588..2f51a46 100644 (file)
@@ -310,6 +310,12 @@ else
 SPEEX_DIR=
 endif
 
+if USE_XINE
+XINE_DIR=xine
+else
+XINE_DIR=
+endif
+
 SUBDIRS=\
        $(A52DEC_DIR) \
        $(AALIB_DIR) \
@@ -361,6 +367,7 @@ SUBDIRS=\
        $(THEORA_DIR) \
        $(IVORBIS_DIR) \
        $(VORBIS_DIR) \
+       $(XINE_DIR) \
        $(XVID_DIR)
 
 DIST_SUBDIRS=\
@@ -415,4 +422,5 @@ DIST_SUBDIRS=\
        tarkin \
        theora \
        vorbis \
+       xine \
        xvid
index 96c1b4f..7cb84f1 100644 (file)
@@ -153,7 +153,7 @@ static QtNodeType *qtdemux_type_get(guint32 fourcc);
 static void qtdemux_node_dump(GstQTDemux *qtdemux, GNode *node);
 static void qtdemux_parse_tree(GstQTDemux *qtdemux);
 static GstCaps *qtdemux_video_caps(GstQTDemux *qtdemux, guint32 fourcc, const guint8 *stsd_data);
-static GstCaps *qtdemux_audio_caps(GstQTDemux *qtdemux, guint32 fourcc);
+static GstCaps *qtdemux_audio_caps(GstQTDemux *qtdemux, guint32 fourcc, const guint8 *data);
 
 static GType gst_qtdemux_get_type (void) 
 {
@@ -284,7 +284,7 @@ static gboolean gst_qtdemux_handle_sink_event (GstQTDemux *qtdemux)
       gst_pad_event_default(qtdemux->sinkpad, event);
       return FALSE;
     case GST_EVENT_FLUSH:
-      g_warning("flush event");
+      //g_warning("flush event");
       break;
     case GST_EVENT_DISCONTINUOUS:
       GST_DEBUG ("discontinuous event\n");
@@ -780,15 +780,15 @@ static void qtdemux_parse(GstQTDemux *qtdemux, GNode *node, void *buffer, int le
   QtNodeType *type;
   void *end;
 
-  //g_print("qtdemux_parse %p %d\n",buffer, length);
+  g_print("qtdemux_parse %p %d\n",buffer, length);
 
   node_length = QTDEMUX_GUINT32_GET(buffer);
   fourcc = QTDEMUX_FOURCC_GET(buffer+4);
 
   type = qtdemux_type_get(fourcc);
   
-  /*g_print("parsing '" GST_FOURCC_FORMAT "', length=%d\n",
-      GST_FOURCC_ARGS(fourcc), node_length);*/
+  g_print("parsing '" GST_FOURCC_FORMAT "', length=%d\n",
+      GST_FOURCC_ARGS(fourcc), node_length);
 
   if(type->flags & QT_CONTAINER){
     void *buf;
@@ -1301,20 +1301,22 @@ static void qtdemux_parse_trak(GstQTDemux *qtdemux, GNode *trak)
     g_print("sample rate:      %g\n", QTDEMUX_FP32_GET(stsd->data+offset + 16));
     stream->rate = QTDEMUX_FP32_GET(stsd->data+offset + 16);
 
+    offset = 52;
     if(version == 0x00010000){
-      g_print("samples/packet:   %d\n", QTDEMUX_GUINT32_GET(stsd->data+offset + 20));
-      stream->samples_per_packet = QTDEMUX_GUINT32_GET(stsd->data+offset + 20);
-      g_print("bytes/packet:     %d\n", QTDEMUX_GUINT32_GET(stsd->data+offset + 24));
-      g_print("bytes/frame:      %d\n", QTDEMUX_GUINT32_GET(stsd->data+offset + 28));
-      stream->bytes_per_frame = QTDEMUX_GUINT32_GET(stsd->data+offset + 28);
-      g_print("bytes/sample:     %d\n", QTDEMUX_GUINT32_GET(stsd->data+offset + 32));
+      g_print("samples/packet:   %d\n", QTDEMUX_GUINT32_GET(stsd->data+offset));
+      stream->samples_per_packet = QTDEMUX_GUINT32_GET(stsd->data+offset);
+      g_print("bytes/packet:     %d\n", QTDEMUX_GUINT32_GET(stsd->data+offset + 4));
+      g_print("bytes/frame:      %d\n", QTDEMUX_GUINT32_GET(stsd->data+offset + 8));
+      stream->bytes_per_frame = QTDEMUX_GUINT32_GET(stsd->data+offset + 8);
+      g_print("bytes/sample:     %d\n", QTDEMUX_GUINT32_GET(stsd->data+offset + 12));
+      offset = 68;
     } else {
       stream->bytes_per_frame = stream->n_channels * QTDEMUX_GUINT16_GET(stsd->data+offset + 10);
       stream->samples_per_packet = 1;
     }
 
     stream->caps = qtdemux_audio_caps(qtdemux,
-        QTDEMUX_FOURCC_GET(stsd->data+16+4));
+        QTDEMUX_FOURCC_GET(stsd->data+16+4), (QTDEMUX_GUINT32_GET(stsd->data) > offset) ? stsd->data + offset : NULL);
     g_print("caps %s\n",gst_caps_to_string(stream->caps));
   }else{
     g_print("unknown subtype\n");
@@ -1597,7 +1599,7 @@ static GstCaps *qtdemux_video_caps(GstQTDemux *qtdemux, guint32 fourcc, const gu
   }
 }
 
-static GstCaps *qtdemux_audio_caps(GstQTDemux *qtdemux, guint32 fourcc)
+static GstCaps *qtdemux_audio_caps(GstQTDemux *qtdemux, guint32 fourcc, const guint8 *data)
 {
   switch(fourcc){
     case GST_MAKE_FOURCC('N','O','N','E'):
@@ -1685,8 +1687,15 @@ static GstCaps *qtdemux_audio_caps(GstQTDemux *qtdemux, guint32 fourcc)
       return gst_caps_from_string ("audio/mpeg, "
          "mpegversion = (int) 4");
     case GST_MAKE_FOURCC('Q','D','M','2'):
-      /* QDesign music version 2 (no constant) */
-      return gst_caps_from_string ("audio/x-qdm2");
+      /* FIXME: QDesign music version 2 (no constant) */
+      if (QTDEMUX_GUINT32_GET (data) <= 100) {
+       gst_util_dump_mem ((guint8*)data, 100);
+       return gst_caps_new_simple ("audio/x-qdm2",
+           "framesize",  G_TYPE_INT, QTDEMUX_GUINT32_GET (data + 52),
+           "bitrate",    G_TYPE_INT, QTDEMUX_GUINT32_GET (data + 40),
+           "blocksize",  G_TYPE_INT, QTDEMUX_GUINT32_GET (data + 44),
+           NULL);
+      }
     case GST_MAKE_FOURCC('q','t','v','r'):
       /* ? */
     case GST_MAKE_FOURCC('Q','D','M','C'):