[Ffmpeg-cvslog] r7714 - trunk/libavformat/riff.c

bcoudurier subversion
Thu Jan 25 22:56:06 CET 2007


Author: bcoudurier
Date: Thu Jan 25 22:56:06 2007
New Revision: 7714

Modified:
   trunk/libavformat/riff.c

Log:
add waveformatextensible support

Modified: trunk/libavformat/riff.c
==============================================================================
--- trunk/libavformat/riff.c	(original)
+++ trunk/libavformat/riff.c	Thu Jan 25 22:56:06 2007
@@ -422,22 +422,30 @@
         codec->bits_per_sample = 8;
     }else
         codec->bits_per_sample = get_le16(pb);
-    codec->codec_id = wav_codec_get_id(id, codec->bits_per_sample);
-
-    if (size > 16) {  /* We're obviously dealing with WAVEFORMATEX */
-        codec->extradata_size = get_le16(pb);
-        if (codec->extradata_size > 0) {
-            if (codec->extradata_size > size - 18)
-                codec->extradata_size = size - 18;
+    if (size >= 18) {  /* We're obviously dealing with WAVEFORMATEX */
+        int cbSize = get_le16(pb); /* cbSize */
+        size -= 18;
+        cbSize = FFMIN(size, cbSize);
+        if (cbSize >= 22 && id == 0xfffe) { /* WAVEFORMATEXTENSIBLE */
+            codec->bits_per_sample = get_le16(pb);
+            get_le32(pb); /* dwChannelMask */
+            id = get_le32(pb); /* 4 first bytes of GUID */
+            url_fskip(pb, 12); /* skip end of GUID */
+            cbSize -= 22;
+            size -= 22;
+        }
+        codec->extradata_size = cbSize;
+        if (cbSize > 0) {
             codec->extradata = av_mallocz(codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
             get_buffer(pb, codec->extradata, codec->extradata_size);
-        } else
-            codec->extradata_size = 0;
+            size -= cbSize;
+        }
 
         /* It is possible for the chunk to contain garbage at the end */
-        if (size - codec->extradata_size - 18 > 0)
-            url_fskip(pb, size - codec->extradata_size - 18);
+        if (size > 0)
+            url_fskip(pb, size);
     }
+    codec->codec_id = wav_codec_get_id(id, codec->bits_per_sample);
 }
 
 




More information about the ffmpeg-cvslog mailing list