changeset 30667:6ca16928b1cc

Get the proper codec id when a WAVE_FORMAT_EXTENSIBLE extension exists in a wave file.
author tack
date Mon, 22 Feb 2010 14:27:32 +0000
parents b20827f16dd0
children 46e7233f1faa
files libmpdemux/aviprint.c libmpdemux/demux_audio.c libmpdemux/ms_hdr.h
diffstat 3 files changed, 19 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/libmpdemux/aviprint.c	Mon Feb 22 14:24:53 2010 +0000
+++ b/libmpdemux/aviprint.c	Mon Feb 22 14:27:32 2010 +0000
@@ -89,6 +89,12 @@
       mp_msg(MSGT_HEADER, verbose_level, "mp3.nFramesPerBlock=%d\n",h2->nFramesPerBlock);
       mp_msg(MSGT_HEADER, verbose_level, "mp3.nCodecDelay=%d\n",h2->nCodecDelay);
   }
+  else if (h->wFormatTag == 0xfffe && h->cbSize >= 22) {
+      WAVEFORMATEXTENSIBLE *h2 = (WAVEFORMATEXTENSIBLE *)h;
+      mp_msg(MSGT_HEADER, verbose_level, "ex.wValidBitsPerSample=%d\n", h2->wValidBitsPerSample);
+      mp_msg(MSGT_HEADER, verbose_level, "ex.dwChannelMask=0x%X\n", h2->dwChannelMask);
+      mp_msg(MSGT_HEADER, verbose_level, "ex.SubFormat=%d (0x%X)\n", h2->SubFormat, h2->SubFormat);
+  }
   else if (h->cbSize > 0)
   {
     int i;
--- a/libmpdemux/demux_audio.c	Mon Feb 22 14:24:53 2010 +0000
+++ b/libmpdemux/demux_audio.c	Mon Feb 22 14:27:32 2010 +0000
@@ -416,6 +416,8 @@
       }
       stream_read(s,(char*)((char*)(w)+sizeof(WAVEFORMATEX)),w->cbSize);
       l -= w->cbSize;
+      if (w->wFormatTag & 0xfffe && w->cbSize >= 22)
+          sh_audio->format = ((WAVEFORMATEXTENSIBLE *)w)->SubFormat;
     }
 
     if( mp_msg_test(MSGT_DEMUX,MSGL_V) ) print_wave_header(w, MSGL_V);
--- a/libmpdemux/ms_hdr.h	Mon Feb 22 14:24:53 2010 +0000
+++ b/libmpdemux/ms_hdr.h	Mon Feb 22 14:27:32 2010 +0000
@@ -34,6 +34,17 @@
 } WAVEFORMATEX, *PWAVEFORMATEX, *NPWAVEFORMATEX, *LPWAVEFORMATEX;
 #endif /* _WAVEFORMATEX_ */
 
+#ifndef _WAVEFORMATEXTENSIBLE_
+#define _WAVEFORMATEXTENSIBLE_
+typedef struct __attribute__((__packed__)) _WAVEFORMATEXTENSIBLE {
+    WAVEFORMATEX   wf;
+    unsigned short wValidBitsPerSample;
+    unsigned int   dwChannelMask;
+    unsigned int   SubFormat; // Only interested in first 32 bits of guid
+    unsigned int   _guid_remainder[3];
+} WAVEFORMATEXTENSIBLE;
+#endif /* _WAVEFORMATEXTENSIBLE_ */
+
 #ifndef _MPEGLAYER3WAVEFORMAT_
 #define _MPEGLAYER3WAVEFORMAT_
 typedef struct __attribute__((__packed__)) mpeglayer3waveformat_tag {