diff --git a/ChangeLog b/ChangeLog index 3fae7f22cd..76a1f9ce4d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,22 @@ +2004-02-20 Benjamin Otte + + * 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 * ext/lame/gstlame.c: (gst_lame_chain): diff --git a/configure.ac b/configure.ac index 3626b82b0d..4631797a26 100644 --- a/configure.ac +++ b/configure.ac @@ -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 diff --git a/ext/Makefile.am b/ext/Makefile.am index 4865588c0c..2f51a46706 100644 --- a/ext/Makefile.am +++ b/ext/Makefile.am @@ -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 diff --git a/gst/qtdemux/qtdemux.c b/gst/qtdemux/qtdemux.c index 96c1b4f6aa..7cb84f1e3a 100644 --- a/gst/qtdemux/qtdemux.c +++ b/gst/qtdemux/qtdemux.c @@ -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'):