From 2dce9af635b66d30d0e3ca16caa1f3e5082f5947 Mon Sep 17 00:00:00 2001 From: Maarten Lankhorst Date: Thu, 10 Apr 2008 15:45:32 -0700 Subject: [PATCH] includes: Update aviriff header file --- dlls/quartz/avisplit.c | 39 ++++++----- dlls/quartz/fourcc.h | 61 ----------------- dlls/quartz/waveparser.c | 4 +- include/aviriff.h | 162 +++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 182 insertions(+), 84 deletions(-) delete mode 100644 dlls/quartz/fourcc.h diff --git a/dlls/quartz/avisplit.c b/dlls/quartz/avisplit.c index 0d9aed7..ee002ce 100644 --- a/dlls/quartz/avisplit.c +++ b/dlls/quartz/avisplit.c @@ -28,12 +28,11 @@ #include "pin.h" #include "uuids.h" +#include "vfw.h" #include "aviriff.h" #include "vfwmsgs.h" #include "amvideo.h" -#include "fourcc.h" - #include "wine/unicode.h" #include "wine/debug.h" @@ -42,6 +41,12 @@ #include "parser.h" +#define TWOCCFromFOURCC(fcc) HIWORD(fcc) + +/* four character codes used in AVI files */ +#define ckidINFO mmioFOURCC('I','N','F','O') +#define ckidREC mmioFOURCC('R','E','C',' ') + WINE_DEFAULT_DEBUG_CHANNEL(quartz); typedef struct StreamData @@ -140,15 +145,15 @@ static HRESULT AVISplitter_Sample(LPVOID iface, IMediaSample * pSample) switch (This->CurrentChunk.fcc) { - case ckidJUNK: - case aviFCC('i','d','x','1'): /* Index is not handled */ + case ckidAVIPADDING: + case ckidAVIOLDINDEX: /* Index is not handled */ /* silently ignore */ if (S_FALSE == AVISplitter_NextChunk(&This->CurrentChunkOffset, &This->CurrentChunk, &tStart, &tStop, pbSrcStream, FALSE)) bMoreData = FALSE; continue; - case ckidLIST: + case FOURCC_LIST: /* We only handle the 'rec ' list which contains the stream data */ - if ((*(DWORD*)(pbSrcStream + BYTES_FROM_MEDIATIME(This->CurrentChunkOffset-tStart) + sizeof(RIFFCHUNK))) == aviFCC('r','e','c',' ')) + if ((*(DWORD*)(pbSrcStream + BYTES_FROM_MEDIATIME(This->CurrentChunkOffset-tStart) + sizeof(RIFFCHUNK))) == ckidREC) { /* FIXME: We only advanced to the first chunk inside the list without keeping track that we are in it. * This is not clean and the parser should be improved for that but it is enough for most AVI files. */ @@ -194,7 +199,7 @@ static HRESULT AVISplitter_Sample(LPVOID iface, IMediaSample * pSample) if (streamId > This->Parser.cStreams) { - ERR("Corrupted AVI file (contains stream id %d, but supposed to only have %d streams)\n", streamId, This->Parser.cStreams); + ERR("Corrupted AVI file (contains stream id (%s) %d, but supposed to only have %d streams)\n", debugstr_an((char *)&This->CurrentChunk.fcc, 4), streamId, This->Parser.cStreams); hr = E_FAIL; break; } @@ -448,7 +453,7 @@ static HRESULT AVISplitter_ProcessStreamList(AVISplitterImpl * This, const BYTE case ckidSTREAMHANDLERDATA: FIXME("process stream handler data\n"); break; - case ckidJUNK: + case ckidAVIPADDING: TRACE("JUNK chunk ignored\n"); break; default: @@ -491,24 +496,24 @@ static HRESULT AVISplitter_InputPin_PreConnect(IPin * iface, IPin * pConnectPin) hr = IAsyncReader_SyncRead(This->pReader, pos, sizeof(list), (BYTE *)&list); pos += sizeof(list); - if (list.fcc != ckidRIFF) + if (list.fcc != FOURCC_RIFF) { ERR("Input stream not a RIFF file\n"); return E_FAIL; } - if (list.fccListType != ckidAVI) + if (list.fccListType != formtypeAVI) { ERR("Input stream not an AVI RIFF file\n"); return E_FAIL; } hr = IAsyncReader_SyncRead(This->pReader, pos, sizeof(list), (BYTE *)&list); - if (list.fcc != ckidLIST) + if (list.fcc != FOURCC_LIST) { ERR("Expected LIST chunk, but got %.04s\n", (LPSTR)&list.fcc); return E_FAIL; } - if (list.fccListType != ckidHEADERLIST) + if (list.fccListType != listtypeAVIHEADER) { ERR("Header list expected. Got: %.04s\n", (LPSTR)&list.fccListType); return E_FAIL; @@ -529,7 +534,7 @@ static HRESULT AVISplitter_InputPin_PreConnect(IPin * iface, IPin * pConnectPin) /* AVIMAINHEADER includes the structure that is pCurrentChunk at the moment */ memcpy(&pAviSplit->AviHeader, pCurrentChunk, sizeof(pAviSplit->AviHeader)); break; - case ckidLIST: + case FOURCC_LIST: pList = (RIFFLIST *)pCurrentChunk; switch (pList->fccListType) { @@ -541,7 +546,7 @@ static HRESULT AVISplitter_InputPin_PreConnect(IPin * iface, IPin * pConnectPin) break; } break; - case ckidJUNK: + case ckidAVIPADDING: /* ignore */ break; default: @@ -559,18 +564,18 @@ static HRESULT AVISplitter_InputPin_PreConnect(IPin * iface, IPin * pConnectPin) pos += sizeof(RIFFCHUNK) + list.cb; hr = IAsyncReader_SyncRead(This->pReader, pos, sizeof(list), (BYTE *)&list); - while (list.fcc == ckidJUNK || (list.fcc == ckidLIST && list.fccListType == ckidINFO)) + while (list.fcc == ckidAVIPADDING || (list.fcc == FOURCC_LIST && list.fccListType == ckidINFO)) { pos += sizeof(RIFFCHUNK) + list.cb; hr = IAsyncReader_SyncRead(This->pReader, pos, sizeof(list), (BYTE *)&list); } - if (list.fcc != ckidLIST) + if (list.fcc != FOURCC_LIST) { ERR("Expected LIST, but got %.04s\n", (LPSTR)&list.fcc); return E_FAIL; } - if (list.fccListType != ckidAVIMOVIE) + if (list.fccListType != listtypeAVIMOVIE) { ERR("Expected AVI movie list, but got %.04s\n", (LPSTR)&list.fccListType); return E_FAIL; diff --git a/dlls/quartz/fourcc.h b/dlls/quartz/fourcc.h deleted file mode 100644 index 317b432..0000000 --- a/dlls/quartz/fourcc.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Common FOURCC - * - * Copyright 2003 Robert Shearman - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#define FromHex(n) (((n) >= 'A') ? ((n) + 10 - 'A') : ((n) - '0')) -#define StreamFromFOURCC(fcc) ((WORD) ((FromHex(LOBYTE(LOWORD(fcc))) << 4) + (FromHex(HIBYTE(LOWORD(fcc)))))) -#define TWOCCFromFOURCC(fcc) HIWORD(fcc) - -#ifndef aviTWOCC -#define aviTWOCC(ch0, ch1) ((WORD)(BYTE)(ch0) | ((WORD)(BYTE)(ch1) << 8)) -#endif - -/* FIXME: endianess? */ -#define aviFCC(ch0, ch1, ch2, ch3) ((DWORD)(BYTE)(ch3) << 24 | (DWORD)(BYTE)(ch2) << 16 | (DWORD)(BYTE)(ch1) << 8 | ((DWORD)(BYTE)(ch0))) - -/* four character codes used in AVI files */ -#define ckidAVI aviFCC('A','V','I',' ') -#define ckidRIFF aviFCC('R','I','F','F') -#define ckidLIST aviFCC('L','I','S','T') -#define ckidJUNK aviFCC('J','U','N','K') -#define ckidINFO aviFCC('I','N','F','O') -#define ckidHEADERLIST aviFCC('h','d','r','l') -#define ckidAVIMOVIE aviFCC('m','o','v','i') -#define ckidSTREAMNAME aviFCC('s','t','r','n') -#define ckidSTREAMHANDLERDATA aviFCC('s','t','r','d') -#ifndef ckidMAINAVIHEADER -# define ckidMAINAVIHEADER aviFCC('a','v','i','h') -# define ckidODML aviFCC('o','d','m','l') -# define ckidAVIEXTHEADER aviFCC('d','m','l','h') -# define ckidSTREAMLIST aviFCC('s','t','r','l') -# define ckidSTREAMHEADER aviFCC('s','t','r','h') -# define ckidSTREAMFORMAT aviFCC('s','t','r','f') -# define ckidAVIOLDINDEX aviFCC('i','d','x','1') -# define ckidAVISUPERINDEX aviFCC('i','n','d','x') -#endif -#ifndef streamtypeVIDEO -#define streamtypeVIDEO aviFCC('v','i','d','s') -#define streamtypeAUDIO aviFCC('a','u','d','s') -#define streamtypeMIDI aviFCC('m','i','d','s') -#define streamtypeTEXT aviFCC('t','x','t','s') -#endif -#define cktypeDIBbits aviTWOCC('d','b') -#define cktypeDIBcompressed aviTWOCC('d','c') -#define cktypePALchange aviTWOCC('p','c') -#define cktypeWAVEbytes aviTWOCC('w','b') diff --git a/dlls/quartz/waveparser.c b/dlls/quartz/waveparser.c index 7f4a96f..965db5c 100644 --- a/dlls/quartz/waveparser.c +++ b/dlls/quartz/waveparser.c @@ -27,8 +27,6 @@ #include "vfwmsgs.h" #include "mmsystem.h" -#include "fourcc.h" - #include "wine/unicode.h" #include "wine/debug.h" @@ -328,7 +326,7 @@ static HRESULT WAVEParser_InputPin_PreConnect(IPin * iface, IPin * pConnectPin) hr = IAsyncReader_SyncRead(This->pReader, pos, sizeof(list), (BYTE *)&list); pos += sizeof(list); - if (list.fcc != ckidRIFF) + if (list.fcc != FOURCC_RIFF) { ERR("Input stream not a RIFF file\n"); return E_FAIL; diff --git a/include/aviriff.h b/include/aviriff.h index 22fca9a..769f560 100644 --- a/include/aviriff.h +++ b/include/aviriff.h @@ -1,5 +1,6 @@ /* * Copyright (C) 2003 Robert Shearman + * Copyright (C) 2008 Maarten Lankhorst * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -29,6 +30,10 @@ typedef struct _rifflist FOURCC fccListType; } RIFFLIST, * LPRIFFLIST; +#define FCC( ch0, ch1, ch2, ch3 ) \ + ( (DWORD)(BYTE)(ch0) | ( (DWORD)(BYTE)(ch1) << 8 ) | \ + ( (DWORD)(BYTE)(ch2) << 16 ) | ( (DWORD)(BYTE)(ch3) << 24 ) ) + #define RIFFROUND(cb) ((cb) + ((cb)&1)) #define RIFFNEXT(pChunk) (LPRIFFCHUNK)((LPBYTE)(pChunk)+sizeof(RIFFCHUNK)+RIFFROUND(((LPRIFFCHUNK)pChunk)->cb)) @@ -40,6 +45,7 @@ typedef struct _rifflist #define AVIF_WASCAPTUREFILE 0x00010000 #define AVIF_COPYRIGHTED 0x00020000 +#define ckidMAINAVIHEADER FCC('a','v','i','h') typedef struct _avimainheader { FOURCC fcc; @@ -57,6 +63,8 @@ typedef struct _avimainheader DWORD dwReserved[4]; } AVIMAINHEADER; +#define ckidODML FCC('o','d','m','l') +#define ckidAVIEXTHEADER FCC('d','m','l','h') typedef struct _aviextheader { FOURCC fcc; @@ -65,11 +73,23 @@ typedef struct _aviextheader DWORD dwFuture[61]; } AVIEXTHEADER; +#define ckidSTREAMLIST FCC('s','t','r','l') /* flags for dwFlags member of AVISTREAMHEADER */ #define AVISF_DISABLED 0x00000001 #define AVISF_VIDEO_PALCHANGES 0x00010000 +#ifndef ckidSTREAMHEADER +#define ckidSTREAMHEADER FCC('s','t','r','h') +#endif + +#ifndef streamtypeVIDEO +#define streamtypeVIDEO FCC('v','i','d','s') +#define streamtypeAUDIO FCC('a','u','d','s') +#define streamtypeMIDI FCC('m','i','d','s') +#define streamtypeTEXT FCC('t','x','t','s') +#endif + typedef struct _avistreamheader { FOURCC fcc; @@ -96,6 +116,11 @@ typedef struct _avistreamheader } rcFrame; } AVISTREAMHEADER; +#ifndef ckidSTREAMFORMAT +#define ckidSTREAMFORMAT FCC('s','t','r','f') +#endif +#define ckidAVIOLDINDEX FCC('i','d','x','1') + /* flags for dwFlags member of _avioldindex_entry */ #define AVIIF_LIST 0x00000001 #define AVIIF_KEYFRAME 0x00000010 @@ -112,7 +137,7 @@ typedef struct _avioldindex DWORD dwFlags; DWORD dwOffset; DWORD dwSize; - } aIndex[0]; + } aIndex[ANYSIZE_ARRAY]; } AVIOLDINDEX; typedef union _timecode @@ -158,7 +183,138 @@ typedef struct _avimetaindex DWORD nEntriesInUse; DWORD dwChunkId; DWORD dwReserved[3]; - DWORD adwIndex[0]; + DWORD adwIndex[ANYSIZE_ARRAY]; } AVIMETAINDEX; -/* FIXME: index structures missing */ +#define ckidAVISUPERINDEX FCC('i','n','d','x') +typedef struct _avisuperindex { + FOURCC fcc; + UINT cb; + WORD wLongsPerEntry; + BYTE bIndexSubType; + BYTE bIndexType; + DWORD nEntriesInUse; + DWORD dwChunkId; + DWORD dwReserved[3]; + struct _avisuperindex_entry { + DWORDLONG qwOffset; + DWORD dwSize; + DWORD dwDuration; + } aIndex[ANYSIZE_ARRAY]; +} AVISUPERINDEX; + +#define AVISTDINDEX_DELTAFRAME (0x80000000) +#define AVISTDINDEX_SIZEMASK (~0x80000000) + +typedef struct _avistdindex_entry { + DWORD dwOffset; + DWORD dwSize; +} AVISTDINDEX_ENTRY; + +typedef struct _avistdindex { + FOURCC fcc; + UINT cb; + WORD wLongsPerEntry; + BYTE bIndexSubType; + BYTE bIndexType; + DWORD nEntriesInUse; + DWORD dwChunkId; + DWORDLONG qwBaseOffset; + DWORD dwReserved_3; + AVISTDINDEX_ENTRY aIndex[ANYSIZE_ARRAY]; +} AVISTDINDEX; + +typedef struct _avitimedindex_entry { + DWORD dwOffset; + DWORD dwSize; + DWORD dwDuration; +} AVITIMEDINDEX_ENTRY; + +typedef struct _avitimedindex { + FOURCC fcc; + UINT cb; + WORD wLongsPerEntry; + BYTE bIndexSubType; + BYTE bIndexType; + DWORD nEntriesInUse; + DWORD dwChunkId; + DWORDLONG qwBaseOffset; + DWORD dwReserved_3; + AVITIMEDINDEX_ENTRY aIndex[ANYSIZE_ARRAY]; + /* DWORD adwTrailingFill[ANYSIZE_ARRAY]; */ +} AVITIMEDINDEX; + +typedef struct _avitimecodeindex { + FOURCC fcc; + UINT cb; + WORD wLongsPerEntry; + BYTE bIndexSubType; + BYTE bIndexType; + DWORD nEntriesInUse; + DWORD dwChunkId; + DWORD dwReserved[3]; + TIMECODEDATA aIndex[ANYSIZE_ARRAY]; +} AVITIMECODEINDEX; + +typedef struct _avitcdlindex_entryA { + DWORD dwTick; + TIMECODE time; + DWORD dwSMPTEflags; + DWORD dwUser; + CHAR szReelId[12]; +} AVITCDLINDEX_ENTRYA; + +typedef struct _avitcdlindex_entryW { + DWORD dwTick; + TIMECODE time; + DWORD dwSMPTEflags; + DWORD dwUser; + WCHAR szReelId[12]; +} AVITCDLINDEX_ENTRYW; + +typedef struct _avitcdlindexA { + FOURCC fcc; + UINT cb; + WORD wLongsPerEntry; + BYTE bIndexSubType; + BYTE bIndexType; + DWORD nEntriesInUse; + DWORD dwChunkId; + DWORD dwReserved[3]; + AVITCDLINDEX_ENTRYA aIndex[ANYSIZE_ARRAY]; + /* DWORD adwTrailingFill[ANYSIZE_ARRAY]; */ +} AVITCDLINDEXA; + +typedef struct _avitcdlindexW { + FOURCC fcc; + UINT cb; + WORD wLongsPerEntry; + BYTE bIndexSubType; + BYTE bIndexType; + DWORD nEntriesInUse; + DWORD dwChunkId; + DWORD dwReserved[3]; + AVITCDLINDEX_ENTRYW aIndex[ANYSIZE_ARRAY]; + /* DWORD adwTrailingFill[ANYSIZE_ARRAY]; */ +} AVITCDLINDEXW; + +#define AVITCDLINDEX_ENTRY WINELIB_NAME_AW(AVITCDLINDEX_ENTRY) +#define AVITCDLINDEX WINELIB_NAME_AW(AVITCDLINDEX) + +typedef struct _avifieldindex_chunk { + FOURCC fcc; + DWORD cb; + WORD wLongsPerEntry; + BYTE bIndexSubType; + BYTE bIndexType; + DWORD nEntriesInUse; + DWORD dwChunkId; + DWORDLONG qwBaseOffset; + DWORD dwReserved3; + struct _avifieldindex_entry { + DWORD dwOffset; + DWORD dwSize; + DWORD dwOffsetField2; + } aIndex[ANYSIZE_ARRAY]; +} AVIFIELDINDEX, * PAVIFIELDINDEX; + -- 1.5.4.1