Commit 0b326924 authored by Maarten Lankhorst's avatar Maarten Lankhorst Committed by Alexandre Julliard

include: Update aviriff header.

parent 1281b749
...@@ -28,12 +28,11 @@ ...@@ -28,12 +28,11 @@
#include "pin.h" #include "pin.h"
#include "uuids.h" #include "uuids.h"
#include "vfw.h"
#include "aviriff.h" #include "aviriff.h"
#include "vfwmsgs.h" #include "vfwmsgs.h"
#include "amvideo.h" #include "amvideo.h"
#include "fourcc.h"
#include "wine/unicode.h" #include "wine/unicode.h"
#include "wine/debug.h" #include "wine/debug.h"
...@@ -42,6 +41,12 @@ ...@@ -42,6 +41,12 @@
#include "parser.h" #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); WINE_DEFAULT_DEBUG_CHANNEL(quartz);
typedef struct StreamData typedef struct StreamData
...@@ -140,15 +145,15 @@ static HRESULT AVISplitter_Sample(LPVOID iface, IMediaSample * pSample) ...@@ -140,15 +145,15 @@ static HRESULT AVISplitter_Sample(LPVOID iface, IMediaSample * pSample)
switch (This->CurrentChunk.fcc) switch (This->CurrentChunk.fcc)
{ {
case ckidJUNK: case ckidAVIPADDING:
case aviFCC('i','d','x','1'): /* Index is not handled */ case ckidAVIOLDINDEX: /* Index is not handled */
/* silently ignore */ /* silently ignore */
if (S_FALSE == AVISplitter_NextChunk(&This->CurrentChunkOffset, &This->CurrentChunk, &tStart, &tStop, pbSrcStream, FALSE)) if (S_FALSE == AVISplitter_NextChunk(&This->CurrentChunkOffset, &This->CurrentChunk, &tStart, &tStop, pbSrcStream, FALSE))
bMoreData = FALSE; bMoreData = FALSE;
continue; continue;
case ckidLIST: case FOURCC_LIST:
/* We only handle the 'rec ' list which contains the stream data */ /* 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. /* 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. */ * 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) ...@@ -194,7 +199,7 @@ static HRESULT AVISplitter_Sample(LPVOID iface, IMediaSample * pSample)
if (streamId > This->Parser.cStreams) 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; hr = E_FAIL;
break; break;
} }
...@@ -448,7 +453,7 @@ static HRESULT AVISplitter_ProcessStreamList(AVISplitterImpl * This, const BYTE ...@@ -448,7 +453,7 @@ static HRESULT AVISplitter_ProcessStreamList(AVISplitterImpl * This, const BYTE
case ckidSTREAMHANDLERDATA: case ckidSTREAMHANDLERDATA:
FIXME("process stream handler data\n"); FIXME("process stream handler data\n");
break; break;
case ckidJUNK: case ckidAVIPADDING:
TRACE("JUNK chunk ignored\n"); TRACE("JUNK chunk ignored\n");
break; break;
default: default:
...@@ -491,24 +496,24 @@ static HRESULT AVISplitter_InputPin_PreConnect(IPin * iface, IPin * pConnectPin) ...@@ -491,24 +496,24 @@ static HRESULT AVISplitter_InputPin_PreConnect(IPin * iface, IPin * pConnectPin)
hr = IAsyncReader_SyncRead(This->pReader, pos, sizeof(list), (BYTE *)&list); hr = IAsyncReader_SyncRead(This->pReader, pos, sizeof(list), (BYTE *)&list);
pos += sizeof(list); pos += sizeof(list);
if (list.fcc != ckidRIFF) if (list.fcc != FOURCC_RIFF)
{ {
ERR("Input stream not a RIFF file\n"); ERR("Input stream not a RIFF file\n");
return E_FAIL; return E_FAIL;
} }
if (list.fccListType != ckidAVI) if (list.fccListType != formtypeAVI)
{ {
ERR("Input stream not an AVI RIFF file\n"); ERR("Input stream not an AVI RIFF file\n");
return E_FAIL; return E_FAIL;
} }
hr = IAsyncReader_SyncRead(This->pReader, pos, sizeof(list), (BYTE *)&list); 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); ERR("Expected LIST chunk, but got %.04s\n", (LPSTR)&list.fcc);
return E_FAIL; return E_FAIL;
} }
if (list.fccListType != ckidHEADERLIST) if (list.fccListType != listtypeAVIHEADER)
{ {
ERR("Header list expected. Got: %.04s\n", (LPSTR)&list.fccListType); ERR("Header list expected. Got: %.04s\n", (LPSTR)&list.fccListType);
return E_FAIL; return E_FAIL;
...@@ -529,7 +534,7 @@ static HRESULT AVISplitter_InputPin_PreConnect(IPin * iface, IPin * pConnectPin) ...@@ -529,7 +534,7 @@ static HRESULT AVISplitter_InputPin_PreConnect(IPin * iface, IPin * pConnectPin)
/* AVIMAINHEADER includes the structure that is pCurrentChunk at the moment */ /* AVIMAINHEADER includes the structure that is pCurrentChunk at the moment */
memcpy(&pAviSplit->AviHeader, pCurrentChunk, sizeof(pAviSplit->AviHeader)); memcpy(&pAviSplit->AviHeader, pCurrentChunk, sizeof(pAviSplit->AviHeader));
break; break;
case ckidLIST: case FOURCC_LIST:
pList = (RIFFLIST *)pCurrentChunk; pList = (RIFFLIST *)pCurrentChunk;
switch (pList->fccListType) switch (pList->fccListType)
{ {
...@@ -541,7 +546,7 @@ static HRESULT AVISplitter_InputPin_PreConnect(IPin * iface, IPin * pConnectPin) ...@@ -541,7 +546,7 @@ static HRESULT AVISplitter_InputPin_PreConnect(IPin * iface, IPin * pConnectPin)
break; break;
} }
break; break;
case ckidJUNK: case ckidAVIPADDING:
/* ignore */ /* ignore */
break; break;
default: default:
...@@ -559,18 +564,18 @@ static HRESULT AVISplitter_InputPin_PreConnect(IPin * iface, IPin * pConnectPin) ...@@ -559,18 +564,18 @@ static HRESULT AVISplitter_InputPin_PreConnect(IPin * iface, IPin * pConnectPin)
pos += sizeof(RIFFCHUNK) + list.cb; pos += sizeof(RIFFCHUNK) + list.cb;
hr = IAsyncReader_SyncRead(This->pReader, pos, sizeof(list), (BYTE *)&list); 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; pos += sizeof(RIFFCHUNK) + list.cb;
hr = IAsyncReader_SyncRead(This->pReader, pos, sizeof(list), (BYTE *)&list); 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); ERR("Expected LIST, but got %.04s\n", (LPSTR)&list.fcc);
return E_FAIL; return E_FAIL;
} }
if (list.fccListType != ckidAVIMOVIE) if (list.fccListType != listtypeAVIMOVIE)
{ {
ERR("Expected AVI movie list, but got %.04s\n", (LPSTR)&list.fccListType); ERR("Expected AVI movie list, but got %.04s\n", (LPSTR)&list.fccListType);
return E_FAIL; return E_FAIL;
......
/*
* 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')
...@@ -27,8 +27,6 @@ ...@@ -27,8 +27,6 @@
#include "vfwmsgs.h" #include "vfwmsgs.h"
#include "mmsystem.h" #include "mmsystem.h"
#include "fourcc.h"
#include "wine/unicode.h" #include "wine/unicode.h"
#include "wine/debug.h" #include "wine/debug.h"
...@@ -328,7 +326,7 @@ static HRESULT WAVEParser_InputPin_PreConnect(IPin * iface, IPin * pConnectPin) ...@@ -328,7 +326,7 @@ static HRESULT WAVEParser_InputPin_PreConnect(IPin * iface, IPin * pConnectPin)
hr = IAsyncReader_SyncRead(This->pReader, pos, sizeof(list), (BYTE *)&list); hr = IAsyncReader_SyncRead(This->pReader, pos, sizeof(list), (BYTE *)&list);
pos += sizeof(list); pos += sizeof(list);
if (list.fcc != ckidRIFF) if (list.fcc != FOURCC_RIFF)
{ {
ERR("Input stream not a RIFF file\n"); ERR("Input stream not a RIFF file\n");
return E_FAIL; return E_FAIL;
......
/* /*
* Copyright (C) 2003 Robert Shearman * Copyright (C) 2003 Robert Shearman
* Copyright (C) 2008 Maarten Lankhorst
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
...@@ -29,6 +30,10 @@ typedef struct _rifflist ...@@ -29,6 +30,10 @@ typedef struct _rifflist
FOURCC fccListType; FOURCC fccListType;
} RIFFLIST, * LPRIFFLIST; } 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 RIFFROUND(cb) ((cb) + ((cb)&1))
#define RIFFNEXT(pChunk) (LPRIFFCHUNK)((LPBYTE)(pChunk)+sizeof(RIFFCHUNK)+RIFFROUND(((LPRIFFCHUNK)pChunk)->cb)) #define RIFFNEXT(pChunk) (LPRIFFCHUNK)((LPBYTE)(pChunk)+sizeof(RIFFCHUNK)+RIFFROUND(((LPRIFFCHUNK)pChunk)->cb))
...@@ -40,6 +45,7 @@ typedef struct _rifflist ...@@ -40,6 +45,7 @@ typedef struct _rifflist
#define AVIF_WASCAPTUREFILE 0x00010000 #define AVIF_WASCAPTUREFILE 0x00010000
#define AVIF_COPYRIGHTED 0x00020000 #define AVIF_COPYRIGHTED 0x00020000
#define ckidMAINAVIHEADER FCC('a','v','i','h')
typedef struct _avimainheader typedef struct _avimainheader
{ {
FOURCC fcc; FOURCC fcc;
...@@ -57,6 +63,8 @@ typedef struct _avimainheader ...@@ -57,6 +63,8 @@ typedef struct _avimainheader
DWORD dwReserved[4]; DWORD dwReserved[4];
} AVIMAINHEADER; } AVIMAINHEADER;
#define ckidODML FCC('o','d','m','l')
#define ckidAVIEXTHEADER FCC('d','m','l','h')
typedef struct _aviextheader typedef struct _aviextheader
{ {
FOURCC fcc; FOURCC fcc;
...@@ -65,11 +73,23 @@ typedef struct _aviextheader ...@@ -65,11 +73,23 @@ typedef struct _aviextheader
DWORD dwFuture[61]; DWORD dwFuture[61];
} AVIEXTHEADER; } AVIEXTHEADER;
#define ckidSTREAMLIST FCC('s','t','r','l')
/* flags for dwFlags member of AVISTREAMHEADER */ /* flags for dwFlags member of AVISTREAMHEADER */
#define AVISF_DISABLED 0x00000001 #define AVISF_DISABLED 0x00000001
#define AVISF_VIDEO_PALCHANGES 0x00010000 #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 typedef struct _avistreamheader
{ {
FOURCC fcc; FOURCC fcc;
...@@ -96,6 +116,11 @@ typedef struct _avistreamheader ...@@ -96,6 +116,11 @@ typedef struct _avistreamheader
} rcFrame; } rcFrame;
} AVISTREAMHEADER; } 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 */ /* flags for dwFlags member of _avioldindex_entry */
#define AVIIF_LIST 0x00000001 #define AVIIF_LIST 0x00000001
#define AVIIF_KEYFRAME 0x00000010 #define AVIIF_KEYFRAME 0x00000010
...@@ -112,7 +137,7 @@ typedef struct _avioldindex ...@@ -112,7 +137,7 @@ typedef struct _avioldindex
DWORD dwFlags; DWORD dwFlags;
DWORD dwOffset; DWORD dwOffset;
DWORD dwSize; DWORD dwSize;
} aIndex[0]; } aIndex[ANYSIZE_ARRAY];
} AVIOLDINDEX; } AVIOLDINDEX;
typedef union _timecode typedef union _timecode
...@@ -158,7 +183,137 @@ typedef struct _avimetaindex ...@@ -158,7 +183,137 @@ typedef struct _avimetaindex
DWORD nEntriesInUse; DWORD nEntriesInUse;
DWORD dwChunkId; DWORD dwChunkId;
DWORD dwReserved[3]; DWORD dwReserved[3];
DWORD adwIndex[0]; DWORD adwIndex[ANYSIZE_ARRAY];
} AVIMETAINDEX; } 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;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment