changeset 13006:8639d064d3a1

DTS support via lavc and libdts Patch by Aurelien Jacobs ( aurel at gnuage dot org ) dts in wav by me
author rtognimp
date Thu, 12 Aug 2004 12:36:08 +0000
parents 8d37cc41a272
children 2a91140108fe
files Makefile configure etc/codecs.conf libmpdemux/demux_audio.c libmpdemux/demuxer.c
diffstat 5 files changed, 94 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile	Thu Aug 12 10:22:04 2004 +0000
+++ b/Makefile	Thu Aug 12 12:36:08 2004 +0000
@@ -32,7 +32,7 @@
 
 VO_LIBS = $(AA_LIB) $(X_LIB) $(SDL_LIB) $(GGI_LIB) $(MP1E_LIB) $(MLIB_LIB) $(SVGA_LIB) $(DIRECTFB_LIB) $(CACA_LIB)
 AO_LIBS = $(ARTS_LIB) $(ESD_LIB) $(JACK_LIB) $(NAS_LIB) $(SGIAUDIO_LIB)
-CODEC_LIBS = $(AV_LIB) $(FAME_LIB) $(MAD_LIB) $(VORBIS_LIB) $(THEORA_LIB) $(FAAD_LIB) $(LIBLZO_LIB) $(DECORE_LIB) $(XVID_LIB) $(PNG_LIB) $(Z_LIB) $(JPEG_LIB) $(ALSA_LIB) $(XMMS_LIB)
+CODEC_LIBS = $(AV_LIB) $(FAME_LIB) $(MAD_LIB) $(VORBIS_LIB) $(THEORA_LIB) $(FAAD_LIB) $(LIBLZO_LIB) $(DECORE_LIB) $(XVID_LIB) $(DTS_LIB) $(PNG_LIB) $(Z_LIB) $(JPEG_LIB) $(ALSA_LIB) $(XMMS_LIB)
 COMMON_LIBS = libmpcodecs/libmpcodecs.a mp3lib/libMP3.a liba52/liba52.a libmpeg2/libmpeg2.a $(W32_LIB) $(DS_LIB) libaf/libaf.a libmpdemux/libmpdemux.a input/libinput.a postproc/libswscale.a osdep/libosdep.a $(DVDREAD_LIB) $(CODEC_LIBS) $(FREETYPE_LIB) $(TERMCAP_LIB) $(CDPARANOIA_LIB) $(MPLAYER_NETWORK_LIB) $(WIN32_LIB) $(GIF_LIB) $(MACOSX_FRAMEWORKS) $(SMBSUPPORT_LIB) $(FRIBIDI_LIB) $(FONTCONFIG_LIB) $(ENCA_LIB)
 
 CFLAGS = $(OPTFLAGS) -Ilibmpdemux -Iloader -Ilibvo $(FREETYPE_INC) $(EXTRA_INC) $(CDPARANOIA_INC) $(SDL_INC) $(X11_INC) $(FRIBIDI_INC) $(DVB_INC) $(XVID_INC) $(FONTCONFIG_INC) $(CACA_INC) # -Wall
--- a/configure	Thu Aug 12 10:22:04 2004 +0000
+++ b/configure	Thu Aug 12 12:36:08 2004 +0000
@@ -214,6 +214,7 @@
   --enable-xmms          build with XMMS inputplugin support [disabled]
   --disable-mp3lib       disable builtin mp3lib [enabled]
   --disable-liba52       disable builtin liba52 [enabled]
+  --enable-libdts        enable libdts support [autodetect]
   --disable-libmpeg2     disable builtin libmpeg2 [enabled]
   
 Video output:
@@ -319,6 +320,8 @@
   --with-xvmclib=PATH      path to adapter specific XvMCxxxxx.so (e.g. NVIDIA)
   --with-xvidlibdir=DIR    libxvidcore (XviD) in DIR 
   --with-xvidincdir=DIR    XviD header in DIR
+  --with-dtslibdir=DIR     libdts library in DIR 
+  --with-dtsincdir=DIR     libdts header in DIR
   --with-livelibdir=DIR    path to LIVE.COM Streaming Media libraries
   --with-xmmsplugindir=DIR path to XMMS plugins
   --with-xmmslibdir=DIR    path to libxmms.so.1
@@ -1217,6 +1220,7 @@
 _theora=auto
 _mp3lib=yes
 _liba52=yes
+_libdts=auto
 _libmpeg2=yes
 _matroska_internal=yes
 _tremor=no
@@ -1394,6 +1398,8 @@
   --disable-mp3lib)	_mp3lib=no	;;
   --enable-liba52)	_liba52=yes	;;
   --disable-liba52)	_liba52=no	;;
+  --enable-libdts)	_libdts=yes     ;;
+  --disable-libdts)	_libdts=no      ;;
   --enable-libmpeg2)	_libmpeg2=yes	;;
   --disable-libmpeg2)	_libmpeg2=no	;;
   --enable-internal-matroska)  _matroska_internal=yes ;;
@@ -1657,6 +1663,12 @@
   --with-xvidincdir=*)
     _inc_xvid=-I`echo $ac_option | cut -d '=' -f 2 | sed 's,:, -I,g'`
     ;;
+  --with-dtslibdir=*)
+    _ld_libdts=-L`echo $ac_option | cut -d '=' -f 2 | sed 's,:, -L,g'`
+    ;;
+  --with-dtsincdir=*)
+    _inc_libdts=-I`echo $ac_option | cut -d '=' -f 2 | sed 's,:, -I,g'`
+    ;;
   --with-sdl-config=*)
     _sdlconfig=`echo $ac_option | cut -d '=' -f 2`
     ;;
@@ -4852,6 +4864,26 @@
 fi
 echores "$_liba52"
 
+echocheck "libdts support"
+if test "$_libdts" = auto ; then
+  _libdts=no
+  cat > $TMPC << EOF
+#include <stdint.h>
+#include <dts.h>
+int main(void) { dts_init (0); return 0; }
+EOF
+  cc_check $_inc_libdts $_ld_libdts -ldts -lm && _libdts=yes
+fi
+if test "$_libdts" = yes ; then
+  _def_libdts='#define CONFIG_DTS 1'
+  _ld_libdts="$_ld_libdts -ldts -lm"
+  _codecmodules="libdts $_codecmodules"
+else
+  _def_libdts='#undef CONFIG_DTS'
+  _nocodecmodules="libdts $_nocodecmodules"
+fi
+echores "$_libdts"
+
 echocheck "libmpeg2 support"
 if test "$_libmpeg2" = yes ; then
   _def_libmpeg2='#define USE_LIBMPEG2 1'
@@ -6192,6 +6224,9 @@
 XVID = $_xvid
 XVID_INC = $_inc_xvid
 XVID_LIB = $_ld_xvid
+CONFIG_DTS = $_libdts
+DTS_INC = $_inc_libdts
+DTS_LIB = $_ld_libdts
 DECORE_LIB = $_ld_decore $_ld_mp3lame
 MENCODER = $_mencoder
 ENCORE_LIB =  $_ld_encore $_ld_mp3lame
@@ -6533,6 +6568,7 @@
 /* Use codec libs included in mplayer CVS / source dist: */
 $_def_mp3lib
 $_def_liba52
+$_def_libdts
 $_def_libmpeg2
 
 /* Use libfame encoder filter */
--- a/etc/codecs.conf	Thu Aug 12 10:22:04 2004 +0000
+++ b/etc/codecs.conf	Thu Aug 12 12:36:08 2004 +0000
@@ -2216,6 +2216,13 @@
   driver libac3
   dll "libac3"
 
+audiocodec ffdts
+  info "DTS"
+  status working
+  format 0x2001
+  driver ffmpeg
+  dll "dts"
+
 audiocodec voxware
   info "VoxWare"
   status working
@@ -2254,6 +2261,12 @@
   fourcc dnet
   driver hwac3
 
+audiocodec hwdts
+  info "DTS through SPDIF"
+  status working
+  format 0x2001
+  driver hwac3
+
 audiocodec vorbis
   info "OggVorbis Audio Decoder"
   status working
--- a/libmpdemux/demux_audio.c	Thu Aug 12 10:22:04 2004 +0000
+++ b/libmpdemux/demux_audio.c	Thu Aug 12 12:36:08 2004 +0000
@@ -206,6 +206,46 @@
     demuxer->movi_start = stream_tell(s);
     demuxer->movi_end = s->end_pos;
 //    printf("wav: %X .. %X\n",(int)demuxer->movi_start,(int)demuxer->movi_end);
+    // Check if it contains dts audio
+    if((w->wFormatTag == 0x01) && (w->nChannels == 2) && (w->nSamplesPerSec == 44100)) {
+	unsigned char buf[16384]; // vlc uses 16384*4 (4 dts frames)
+	unsigned int i;
+	stream_read(s, buf, sizeof(buf));
+	for (i = 0; i < sizeof(buf); i += 2) {
+	    // DTS, 14 bit, LE
+	    if((buf[i] == 0xff) && (buf[i+1] == 0x1f) && (buf[i+2] == 0x00) &&
+	       (buf[i+3] == 0xe8) && ((buf[i+4] & 0xfe) == 0xf0) && (buf[i+5] == 0x07)) {
+		sh_audio->format = 0x2001;
+		mp_msg(MSGT_DEMUX,MSGL_V,"[demux_audio] DTS audio in wav, 14 bit, LE\n");
+		break;
+	    }
+	    // DTS, 14 bit, BE
+	    if((buf[i] == 0x1f) && (buf[i+1] == 0xff) && (buf[i+2] == 0xe8) &&
+	       (buf[i+3] == 0x00) && (buf[i+4] == 0x07) && ((buf[i+5] & 0xfe) == 0xf0)) {
+		sh_audio->format = 0x2001;
+		mp_msg(MSGT_DEMUX,MSGL_V,"[demux_audio] DTS audio in wav, 14 bit, BE\n");
+		break;
+	    }
+	    // DTS, 16 bit, BE
+	    if((buf[i] == 0x7f) && (buf[i+1] == 0xfe) && (buf[i+2] == 0x80) &&
+	       (buf[i+3] == 0x01)) {
+		sh_audio->format = 0x2001;
+		mp_msg(MSGT_DEMUX,MSGL_V,"[demux_audio] DTS audio in wav, 16 bit, BE\n");
+		break;
+	    }
+	    // DTS, 16 bit, LE
+	    if((buf[i] == 0xfe) && (buf[i+1] == 0x7f) && (buf[i+2] == 0x01) &&
+	       (buf[i+3] == 0x80)) {
+		sh_audio->format = 0x2001;
+		mp_msg(MSGT_DEMUX,MSGL_V,"[demux_audio] DTS audio in wav, 16 bit, LE\n");
+		break;
+	    }
+	}
+	if (sh_audio->format == 0x2001)
+	    mp_msg(MSGT_DEMUX,MSGL_DBG2,"[demux_audio] DTS sync offset = %u\n", i);
+
+    }
+    stream_seek(s,demuxer->movi_start);
   } break;
   case fLaC:
 	    sh_audio->format = mmioFOURCC('f', 'L', 'a', 'C');
--- a/libmpdemux/demuxer.c	Thu Aug 12 10:22:04 2004 +0000
+++ b/libmpdemux/demuxer.c	Thu Aug 12 12:36:08 2004 +0000
@@ -1308,7 +1308,8 @@
     switch(d_audio->id & 0xE0){  // 1110 0000 b  (high 3 bit: type  low 5: id)
       case 0x00: sh_audio->format=0x50;break; // mpeg
       case 0xA0: sh_audio->format=0x10001;break;  // dvd pcm
-      case 0x80: sh_audio->format=0x2000;break; // ac3
+      case 0x80: if((d_audio->id & 0xF8) == 0x88) sh_audio->format=0x2001;//dts
+                 else sh_audio->format=0x2000;break; // ac3
       default: sh_audio=NULL; // unknown type
     }
    }
@@ -1328,7 +1329,8 @@
     switch(d_audio->id & 0xE0){  // 1110 0000 b  (high 3 bit: type  low 5: id)
       case 0x00: sh_audio->format=0x50;break; // mpeg
       case 0xA0: sh_audio->format=0x10001;break;  // dvd pcm
-      case 0x80: sh_audio->format=0x2000;break; // ac3
+      case 0x80: if((d_audio->id & 0xF8) == 0x88) sh_audio->format=0x2001;//dts
+                 else sh_audio->format=0x2000;break; // ac3
       default: sh_audio=NULL; // unknown type
     }
    }