Aric Stewart : wineqtdecoder: Read the header of unknown incoming streams to try to identify common formats .

Alexandre Julliard julliard at winehq.org
Thu Mar 29 15:48:58 CDT 2012


Module: wine
Branch: master
Commit: cc6b7592ee8490e17e0a4af3bde90a824268ffb6
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=cc6b7592ee8490e17e0a4af3bde90a824268ffb6

Author: Aric Stewart <aric at codeweavers.com>
Date:   Wed Mar 28 10:18:49 2012 -0500

wineqtdecoder: Read the header of unknown incoming streams to try to identify common formats.

---

 dlls/wineqtdecoder/qtdatahandler.c |   29 +++++++++++++++++++++++++++++
 1 files changed, 29 insertions(+), 0 deletions(-)

diff --git a/dlls/wineqtdecoder/qtdatahandler.c b/dlls/wineqtdecoder/qtdatahandler.c
index 4cca607..4d3b0a3 100644
--- a/dlls/wineqtdecoder/qtdatahandler.c
+++ b/dlls/wineqtdecoder/qtdatahandler.c
@@ -325,6 +325,22 @@ static pascal ComponentResult myDataHGetFileTypeOrdering ( DataHandler dh,
     return noErr;
 }
 
+typedef struct {
+    const CFStringRef fname;
+    const int sig_length;
+    const BYTE sig[10];
+} signature;
+
+static const signature stream_sigs[] = {
+    {CFSTR("video.asf"),4,{0x30,0x26,0xb2,0x75}},
+    {CFSTR("video.mov"),8,{0x00,0x00,0x00,0x14,0x66,0x74,0x79,0x70}},
+    {CFSTR("video.mp4"),8,{0x00,0x00,0x00,0x18,0x66,0x74,0x79,0x70}},
+    {CFSTR("video.m4v"),8,{0x00,0x00,0x00,0x1c,0x66,0x74,0x79,0x70}},
+    {CFSTR("video.flv"),4,{0x46,0x4C,0x56,0x01}},
+    {CFSTR("video.mpg"),3,{0x00,0x00,0x01}},
+    {CFSTR("avideo.rm"),4,{0x2E,0x52,0x4D,0x46}}
+};
+
 static pascal ComponentResult myDataHGetFileName ( DataHandler dh, Str255 str)
 {
     Handle storage = GetComponentInstanceStorage(dh);
@@ -342,7 +358,20 @@ static pascal ComponentResult myDataHGetFileName ( DataHandler dh, Str255 str)
     else if(IsEqualIID(&data->dataRef.streamSubtype, &MEDIASUBTYPE_QTMovie))
         CFStringGetPascalString(CFSTR("video.mov"),str,256,kCFStringEncodingMacRoman);
     else
+    {
+        BYTE header[10] = {0,0,0,0,0,0,0,0,0,0};
+        int i;
+        IAsyncReader_SyncRead(data->dataRef.pReader, 0, 8, header);
+
+        for (i=0; i < sizeof(stream_sigs)/sizeof(signature); i++)
+            if (memcmp(header, stream_sigs[i].sig, stream_sigs[i].sig_length)==0)
+            {
+                CFStringGetPascalString(stream_sigs[i].fname,str,256,kCFStringEncodingMacRoman);
+                return noErr;
+            }
+
         return badComponentSelector;
+    }
 
     return noErr;
 }




More information about the wine-cvs mailing list