Aric Stewart : wineqtdecoder: Read the header of unknown incoming streams to try to identify common formats .
Module: wine Branch: master Commit: cc6b7592ee8490e17e0a4af3bde90a824268ffb6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=cc6b7592ee8490e17e0a4af3bd... Author: Aric Stewart <aric(a)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; }
participants (1)
-
Alexandre Julliard