summaryrefslogtreecommitdiffstats
path: root/libmpdemux/demux_audio.c
diff options
context:
space:
mode:
authorrtognimp <rtognimp@b3059339-0415-0410-9bf9-f77b7e298cf2>2004-08-12 12:36:08 +0000
committerrtognimp <rtognimp@b3059339-0415-0410-9bf9-f77b7e298cf2>2004-08-12 12:36:08 +0000
commit9c48cc012a8e51c72fa4570e436cc25a2bc7ada3 (patch)
treecad888f89804561d92e5c45af6cbefda9bfa043b /libmpdemux/demux_audio.c
parent7b3bcd07517592dc6fb6acc00b202ddf77159aa7 (diff)
downloadmpv-9c48cc012a8e51c72fa4570e436cc25a2bc7ada3.tar.bz2
mpv-9c48cc012a8e51c72fa4570e436cc25a2bc7ada3.tar.xz
DTS support via lavc and libdts
Patch by Aurelien Jacobs ( aurel at gnuage dot org ) dts in wav by me git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@13007 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux/demux_audio.c')
-rw-r--r--libmpdemux/demux_audio.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/libmpdemux/demux_audio.c b/libmpdemux/demux_audio.c
index 171f5f1535..4207265684 100644
--- a/libmpdemux/demux_audio.c
+++ b/libmpdemux/demux_audio.c
@@ -206,6 +206,46 @@ int demux_audio_open(demuxer_t* demuxer) {
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');