Commit 676a5135 authored by Marcus Meissner's avatar Marcus Meissner Committed by Alexandre Julliard

Updated msvideo / vfw.h, use builtin msvfw32.dll by default, added

aviinfo and aviplay programs.
parent a2ca7b98
......@@ -32,8 +32,8 @@ typedef struct tagWINE_HIC {
DWORD type; /* 08: */
DWORD handler; /* 0C: */
HDRVR32 hdrv; /* 10: */
DWORD private; /* 14: private data passed to drv */
FARPROC32 driverproc; /* 18: */
DWORD private; /* 14:(handled by SendDriverMessage32)*/
FARPROC32 driverproc; /* 18:(handled by SendDriverMessage32)*/
DWORD x1; /* 1c: name? */
WORD x2; /* 20: */
DWORD x3; /* 22: */
......@@ -260,7 +260,7 @@ typedef struct {
WCHAR szDriver[128]; /* 138:driver that contains compressor*/
/* 238: */
} ICINFO32;
DECL_WINELIB_TYPE(ICINFO);
DECL_WINELIB_TYPE(ICINFO)
/* ICINFO.dwFlags */
#define VIDCF_QUALITY 0x0001 /* supports quality */
......@@ -392,6 +392,9 @@ LRESULT VFWAPI ICClose32(HIC32 hic);
#define ICClose WINELIB_NAME(ICClose)
LRESULT VFWAPI ICSendMessage32(HIC32 hic, UINT32 msg, DWORD dw1, DWORD dw2);
#define ICSendMessage WINELIB_NAME(ICSendMessage)
HIC32 VFWAPI ICLocate32(DWORD fccType, DWORD fccHandler, LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut, WORD wFlags);
#define ICLocate WINELIB_NAME(ICLocate)
DWORD VFWAPIV ICDrawBegin32(
HIC32 hic,
DWORD dwFlags,/* flags */
......@@ -414,6 +417,20 @@ DWORD VFWAPIV ICDrawBegin32(
/********************* AVIFILE function declarations *************************/
#define streamtypeVIDEO mmioFOURCC('v', 'i', 'd', 's')
#define streamtypeAUDIO mmioFOURCC('a', 'u', 'd', 's')
#define streamtypeMIDI mmioFOURCC('m', 'i', 'd', 's')
#define streamtypeTEXT mmioFOURCC('t', 'x', 't', 's')
/* Basic chunk types */
#define cktypeDIBbits aviTWOCC('d', 'b')
#define cktypeDIBcompressed aviTWOCC('d', 'c')
#define cktypePALchange aviTWOCC('p', 'c')
#define cktypeWAVEbytes aviTWOCC('w', 'b')
/* Chunk id to use for extra chunks for padding. */
#define ckidAVIPADDING mmioFOURCC('J', 'U', 'N', 'K')
/* AVIFileHdr.dwFlags */
#define AVIF_HASINDEX 0x00000010 /* Index at end of file? */
#define AVIF_MUSTUSEINDEX 0x00000020
......@@ -424,6 +441,21 @@ DWORD VFWAPIV ICDrawBegin32(
#define AVI_HEADERSIZE 2048
typedef struct _MainAVIHeader
{
DWORD dwMicroSecPerFrame;
DWORD dwMaxBytesPerSec;
DWORD dwPaddingGranularity;
DWORD dwFlags;
DWORD dwTotalFrames;
DWORD dwInitialFrames;
DWORD dwStreams;
DWORD dwSuggestedBufferSize;
DWORD dwWidth;
DWORD dwHeight;
DWORD dwReserved[4];
} MainAVIHeader;
/* AVIStreamHeader.dwFlags */
#define AVISF_DISABLED 0x00000001
#define AVISF_VIDEO_PALCHANGES 0x00010000
......@@ -442,7 +474,7 @@ typedef struct {
DWORD dwSuggestedBufferSize;
DWORD dwQuality;
DWORD dwSampleSize;
RECT32 rcFrame;
RECT16 rcFrame; /* word.word - word.word in file */
} AVIStreamHeader;
/* AVIINDEXENTRY.dwFlags */
......@@ -511,9 +543,9 @@ typedef struct _AVISTREAMINFO32W {
DWORD dwFormatChangeCount;
WCHAR szName[64];
} AVISTREAMINFO32W, * LPAVISTREAMINFO32W, *PAVISTREAMINFO32W;
DECL_WINELIB_TYPE_AW(AVISTREAMINFO);
DECL_WINELIB_TYPE_AW(LPAVISTREAMINFO);
DECL_WINELIB_TYPE_AW(PAVISTREAMINFO);
DECL_WINELIB_TYPE_AW(AVISTREAMINFO)
DECL_WINELIB_TYPE_AW(LPAVISTREAMINFO)
DECL_WINELIB_TYPE_AW(PAVISTREAMINFO)
#define AVISTREAMINFO_DISABLED 0x00000001
#define AVISTREAMINFO_FORMATCHANGES 0x00010000
......@@ -557,11 +589,11 @@ typedef struct _AVIFILEINFO32A {
DWORD dwRate;
DWORD dwLength;
DWORD dwEditCount;
CHAR szFileType[64];
CHAR szFileType[64];
} AVIFILEINFO32A, * LPAVIFILEINFO32A, *PAVIFILEINFO32A;
DECL_WINELIB_TYPE_AW(AVIFILEINFO);
DECL_WINELIB_TYPE_AW(PAVIFILEINFO);
DECL_WINELIB_TYPE_AW(LPAVIFILEINFO);
DECL_WINELIB_TYPE_AW(AVIFILEINFO)
DECL_WINELIB_TYPE_AW(PAVIFILEINFO)
DECL_WINELIB_TYPE_AW(LPAVIFILEINFO)
/* AVICOMPRESSOPTIONS.dwFlags. determines presence of fields in below struct */
#define AVICOMPRESSF_INTERLEAVE 0x00000001
......@@ -615,6 +647,9 @@ ICOM_BEGIN(IAVIStream32, IUnknown)
ICOM_END(IAVIStream32)
#undef ICOM_INTERFACE
DECL_WINELIB_TYPE(IAVIStream)
DECL_WINELIB_TYPE(PAVISTREAM)
/* IAVIFile32 interface. In Win32 this interface uses UNICODE only */
#define ICOM_INTERFACE IAVIFile32
typedef struct IAVIFile32 IAVIFile32,*PAVIFILE32;
......@@ -629,6 +664,23 @@ ICOM_BEGIN(IAVIFile32,IUnknown)
ICOM_END(IAVIFile32)
#undef ICOM_INTERFACE
DECL_WINELIB_TYPE(IAVIFile)
DECL_WINELIB_TYPE(PAVIFILE)
/* IGetFrame32 interface */
#define ICOM_INTERFACE IGetFrame32
typedef struct IGetFrame32 IGetFrame32,*PGETFRAME32;
ICOM_BEGIN(IGetFrame32,IUnknown)
ICOM_METHOD1(LPVOID,GetFrame,LONG,);
ICOM_METHOD3(HRESULT,Begin,LONG,,LONG,,LONG,);
ICOM_METHOD (HRESULT,End);
ICOM_METHOD6(HRESULT,SetFormat,LPBITMAPINFOHEADER,,LPVOID,,INT32,,INT32,,INT32,,INT32,);
ICOM_END(IGetFrame32)
#undef ICOM_INTERFACE
DECL_WINELIB_TYPE(IGetFrame)
DECL_WINELIB_TYPE(PGETFRAME)
#define AVIERR_OK 0
#define MAKE_AVIERR(error) MAKE_SCODE(SEVERITY_ERROR,FACILITY_ITF,0x4000+error)
......@@ -652,15 +704,6 @@ ICOM_END(IAVIFile32)
#define AVIERR_USERABORT MAKE_AVIERR(198)
#define AVIERR_ERROR MAKE_AVIERR(199)
void WINAPI AVIFileInit32(void);
#define AVIFileInit WINELIB_NAME(AVIFileInit)
HRESULT WINAPI AVIFileOpen32A(PAVIFILE32 * ppfile,LPCSTR szFile,UINT32 uMode,LPCLSID lpHandler);
#define AVIFileOpen WINELIB_NAME_AW(AVIFileOpen)
HRESULT WINAPI AVIFileCreateStream32A(PAVIFILE32 pfile,PAVISTREAM32 *ppavi,AVISTREAMINFO32A * psi);
HRESULT WINAPI AVIFileCreateStream32W(PAVIFILE32 pfile,PAVISTREAM32 *ppavi,AVISTREAMINFO32W * psi);
#define AVIFileCreateStream WINELIB_NAME_AW(AVIFileCreateStream)
HRESULT WINAPI AVIMakeCompressedStream32(PAVISTREAM32*ppsCompressed,PAVISTREAM32 ppsSource,AVICOMPRESSOPTIONS *lpOptions,CLSID*pclsidHandler);
#define AVIMakeCompressedStream WINELIB_NAME_AW(AVIMakeCompressedStream)
HRESULT WINAPI AVIStreamSetFormat32(PAVISTREAM32 iface,LONG pos,LPVOID format,LONG formatsize);
......@@ -669,10 +712,47 @@ HRESULT WINAPI AVIStreamWrite32(PAVISTREAM32 iface,LONG start,LONG samples,LPVOI
#define AVIStreamWrite WINELIB_NAME(AVIStreamWrite)
ULONG WINAPI AVIStreamRelease32(PAVISTREAM32 iface);
#define AVIStreamRelease WINELIB_NAME(AVIStreamRelease)
LONG WINAPI AVIStreamStart32(PAVISTREAM32 iface);
#define AVIStreamStart WINELIB_NAME(AVIStreamStart)
LONG WINAPI AVIStreamLength32(PAVISTREAM32 iface);
#define AVIStreamLength WINELIB_NAME(AVIStreamLength)
HRESULT WINAPI AVIStreamReadFormat32(PAVISTREAM32 iface,LONG pos,LPVOID format,LONG *formatsize);
#define AVIStreamReadFormat WINELIB_NAME(AVIStreamReadFormat)
HRESULT WINAPI AVIStreamWrite32(PAVISTREAM32 iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,DWORD flags,LONG *sampwritten,LONG *byteswritten);
#define AVIStreamWrite WINELIB_NAME(AVIStreamWrite)
HRESULT WINAPI AVIStreamRead32(PAVISTREAM32 iface,LONG start,LONG samples,LPVOID buffer,LONG buffersize,LONG *bytesread,LONG *samplesread);
#define AVIStreamRead WINELIB_NAME(AVIStreamRead)
HRESULT WINAPI AVIStreamWriteData32(PAVISTREAM32 iface,DWORD fcc,LPVOID lp,LONG size);
#define AVIStreamWriteData WINELIB_NAME(AVIStreamWriteData)
HRESULT WINAPI AVIStreamReadData32(PAVISTREAM32 iface,DWORD fcc,LPVOID lp,LONG *lpread);
#define AVIStreamReadData WINELIB_NAME(AVIStreamReadData)
HRESULT WINAPI AVIStreamInfo32A(PAVISTREAM32 iface,AVISTREAMINFO32A *asi,LONG size);
HRESULT WINAPI AVIStreamInfo32W(PAVISTREAM32 iface,AVISTREAMINFO32W *asi,LONG size);
#define AVIStreamInfo WINELIB_NAME_AW(AVIStreamInfo)
PGETFRAME32 WINAPI AVIStreamGetFrameOpen32(PAVISTREAM32 pavi,LPBITMAPINFOHEADER lpbiWanted);
#define AVIStreamGetFrameOpen WINELIB_NAME(AVIStreamGetFrameOpen)
HRESULT WINAPI AVIStreamGetFrameClose32(PGETFRAME32 pg);
#define AVIStreamGetFrameClose WINELIB_NAME(AVIStreamGetFrameClose)
PGETFRAME32 WINAPI AVIStreamGetFrameOpen32(PAVISTREAM32 pavi,LPBITMAPINFOHEADER lpbiWanted);
#define AVIStreamGetFrameOpen WINELIB_NAME(AVIStreamGetFrameOpen)
LPVOID WINAPI AVIStreamGetFrame32(PGETFRAME32 pg,LONG pos);
#define AVIStreamGetFrame WINELIB_NAME(AVIStreamGetFrame)
void WINAPI AVIFileInit32(void);
#define AVIFileInit WINELIB_NAME(AVIFileInit)
HRESULT WINAPI AVIFileOpen32A(PAVIFILE32 * ppfile,LPCSTR szFile,UINT32 uMode,LPCLSID lpHandler);
#define AVIFileOpen WINELIB_NAME_AW(AVIFileOpen)
HRESULT WINAPI AVIFileCreateStream32A(PAVIFILE32 pfile,PAVISTREAM32 *ppavi,AVISTREAMINFO32A * psi);
HRESULT WINAPI AVIFileCreateStream32W(PAVIFILE32 pfile,PAVISTREAM32 *ppavi,AVISTREAMINFO32W * psi);
#define AVIFileCreateStream WINELIB_NAME_AW(AVIFileCreateStream)
ULONG WINAPI AVIFileRelease32(PAVIFILE32 iface);
#define AVIFileRelease WINELIB_NAME(AVIFileRelease)
HRESULT WINAPI AVIFileInfo32A(PAVIFILE32 pfile,PAVIFILEINFO32A,LONG);
HRESULT WINAPI AVIFileInfo32W(PAVIFILE32 pfile,PAVIFILEINFO32W,LONG);
#define AVIFileInfo WINELIB_NAME_AW(AVIFileInfo)
HRESULT WINAPI AVIFileGetStream32(PAVIFILE32 pfile,PAVISTREAM32*avis,DWORD fccType,LONG lParam);
#define AVIFileGetStream WINELIB_NAME(AVIFileGetStream)
void WINAPI AVIFileExit32(void);
#define AVIFileExit WINELIB_NAME(AVIFileExit)
#endif
......@@ -71,18 +71,8 @@ ICOpen32(DWORD fccType,DWORD fccHandler,UINT32 wMode) {
memcpy(type,&fccType,4);type[4]=0;
memcpy(handler,&fccHandler,4);handler[4]=0;
TRACE(msvideo,"(%s,%s,0x%08lx)\n",type,handler,(DWORD)wMode);
/* FIXME: When do we use 'vids' , when 'vidc'? Unclear */
if (!strcasecmp(type,"vids")) {
sprintf(codecname,"vidc.%s",handler);
fccType = mmioFOURCC('v','i','d','c');
} else
sprintf(codecname,"%s.%s",type,handler);
hdrv=OpenDriver32A(codecname,"drivers32",0);
if (!hdrv)
return 0;
whic = HeapAlloc(GetProcessHeap(),0,sizeof(WINE_HIC));
whic->hdrv = hdrv;
whic->driverproc= GetProcAddress32(GetDriverModuleHandle32(hdrv),"DriverProc");
sprintf(codecname,"%s.%s",type,handler);
/* Well, lParam2 is in fact a LPVIDEO_OPEN_PARMS, but it has the
* same layout as ICOPEN
*/
......@@ -91,7 +81,21 @@ ICOpen32(DWORD fccType,DWORD fccHandler,UINT32 wMode) {
icopen.dwSize = sizeof(ICOPEN);
icopen.dwFlags = wMode;
/* FIXME: do we need to fill out the rest too? */
hdrv=OpenDriver32A(codecname,"drivers32",(LPARAM)&icopen);
if (!hdrv) {
if (!strcasecmp(type,"vids")) {
sprintf(codecname,"vidc.%s",handler);
fccType = mmioFOURCC('v','i','d','c');
}
hdrv=OpenDriver32A(codecname,"drivers32",(LPARAM)&icopen);
return 0;
}
whic = HeapAlloc(GetProcessHeap(),0,sizeof(WINE_HIC));
whic->hdrv = hdrv;
#if 0
whic->driverproc= GetProcAddress32(GetDriverModuleHandle32(hdrv),"DriverProc");
whic->private = whic->driverproc(0,hdrv,DRV_OPEN,0,&icopen);
#endif
return (HIC32)whic;
}
......@@ -105,6 +109,45 @@ ICGetInfo32(HIC32 hic,ICINFO32 *picinfo,DWORD cb) {
return ret;
}
HIC32 VFWAPI
ICLocate32(
DWORD fccType, DWORD fccHandler, LPBITMAPINFOHEADER lpbiIn,
LPBITMAPINFOHEADER lpbiOut, WORD wMode
) {
char type[5],handler[5];
HIC32 hic;
DWORD querymsg;
switch (wMode) {
case ICMODE_FASTCOMPRESS:
case ICMODE_COMPRESS:
querymsg = ICM_COMPRESS_QUERY;
break;
case ICMODE_DECOMPRESS:
case ICMODE_FASTDECOMPRESS:
querymsg = ICM_DECOMPRESS_QUERY;
break;
case ICMODE_DRAW:
querymsg = ICM_DRAW_QUERY;
break;
default:
FIXME(msvideo,"Unknown mode (%d)\n",wMode);
return 0;
}
/* Easy case: handler/type match, we just fire a query and return */
hic = ICOpen32(fccType,fccHandler,wMode);
if (hic) {
if (!ICSendMessage32(hic,querymsg,(DWORD)lpbiIn,(DWORD)lpbiOut))
return hic;
ICClose32(hic);
}
type[4]='\0';memcpy(type,&fccType,4);
handler[4]='\0';memcpy(handler,&fccHandler,4);
FIXME(msvideo,"(%s,%s,%p,%p,0x%04x),unhandled!\n",type,handler,lpbiIn,lpbiOut,wMode);
return 0;
}
DWORD VFWAPIV
ICCompress32(
HIC32 hic,DWORD dwFlags,LPBITMAPINFOHEADER lpbiOutput,LPVOID lpData,
......@@ -147,14 +190,6 @@ ICDecompress32(HIC32 hic,DWORD dwFlags,LPBITMAPINFOHEADER lpbiFormat,LPVOID lpDa
return ICSendMessage32(hic,ICM_DECOMPRESS,(LPARAM)&icd,sizeof(icd));
}
HIC32 WINAPI
ICLocate(DWORD fccType, DWORD fccHandler, LPBITMAPINFOHEADER lpbiIn,
LPBITMAPINFOHEADER lpbiOut, WORD wFlags
) {
FIXME(msvideo,"stub!\n");
return 0;
}
LRESULT VFWAPI
ICSendMessage32(HIC32 hic,UINT32 msg,DWORD lParam1,DWORD lParam2) {
LRESULT ret;
......@@ -206,7 +241,8 @@ ICSendMessage32(HIC32 hic,UINT32 msg,DWORD lParam1,DWORD lParam2) {
default:
FIXME(msvideo,"(0x%08lx,0x%08lx,0x%08lx,0x%08lx)\n",(DWORD)hic,(DWORD)msg,lParam1,lParam2);
}
ret = whic->driverproc(whic->private,whic->hdrv,msg,lParam1,lParam2);
ret = SendDriverMessage32(whic->hdrv,msg,lParam1,lParam2);
/* ret = whic->driverproc(whic->private,whic->hdrv,msg,lParam1,lParam2);*/
TRACE(msvideo," -> 0x%08lx\n",ret);
return ret;
}
......@@ -232,7 +268,11 @@ DWORD VFWAPIV ICDrawBegin32(
}
LRESULT WINAPI ICClose32(HIC32 hic) {
FIXME(msvideo,"(%d),stub!\n",hic);
WINE_HIC *whic = (WINE_HIC*)hic;
TRACE(msvideo,"(%d).\n",hic);
/* FIXME: correct? */
CloseDriver32(whic->hdrv,0,0);
HeapFree(GetProcessHeap(),0,whic);
return 0;
}
......
......@@ -4,7 +4,7 @@ TOPOBJDIR = ../..
SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = none
PROGRAMS = icinfo
PROGRAMS = icinfo aviinfo aviplay
ALL_LIBS = $(WINELIB) $(X_LIBS) $(XLIB) $(LIBS)
RCFLAGS = -w32 -h
WRCEXTRA = -A -p $*
......@@ -12,19 +12,12 @@ WRCEXTRA = -A -p $*
LANGUAGES =
LICENSELANG =
MOSTSRCS = \
icinfo.c
# Some strings need addresses >= 0x10000
STRINGSRCS = \
$(LICENSELANG:%=License_%.c)
RC_SRCS = $(LANGUAGES:%=%.rc)
C_SRCS = $(MOSTSRCS) $(STRINGSRCS)
MOSTSRCS = \
icinfo.c \
aviinfo.c \
aviinfo.c
MOSTOBJS = $(MOSTSRCS:.c=.o)
STRINGOBJS = $(STRINGSRCS:.c=.o) $(RC_SRCS:.rc=.o)
all: check_wrc $(PROGRAMS)
......@@ -33,23 +26,21 @@ depend::
@MAKE_RULES@
# Override resource compiler rules
.rc.s:
$(CPP) $(DEFS) $(OPTIONS) $(DIVINCL) -DRC_INVOKED -P -x c $< | $(WRC) $(WRCFLAGS) $(WRCEXTRA) -o $*.s
icinfo: icinfo.o
$(CC) -o icinfo icinfo.o $(LDOPTIONS) $(ALL_LIBS)
.rc.h:
$(CPP) $(DEFS) $(OPTIONS) $(DIVINCL) -DRC_INVOKED -P -x c $< | $(WRC) $(WRCFLAGS) $(WRCEXTRA) -nH $*.h
icinfo: $(MOSTOBJS) $(STRINGOBJS)
$(CC) -o icinfo $(MOSTOBJS) $(LDOPTIONS) $(ALL_LIBS) $(STRINGOBJS)
aviinfo: aviinfo.o
$(CC) -o aviinfo aviinfo.o $(LDOPTIONS) $(ALL_LIBS)
aviplay: aviplay.o
$(CC) -o aviplay aviplay.o $(LDOPTIONS) $(ALL_LIBS)
install: dummy
$(INSTALL_PROGRAM) clock $(bindir)/clock
$(INSTALL_PROGRAM) icinfo $(bindir)/icinfo
$(INSTALL_PROGRAM) aviinfo $(bindir)/aviinfo
$(INSTALL_PROGRAM) aviplay $(bindir)/aviplay
uninstall: dummy
$(RM) $(bindir)/clock
$(RC_SRCS:.rc=.s): $(WRC)
$(RM) $(bindir)/aviinfo $(bindir)/icinfo $(bindir)/aviplay
dummy:
......
#include <stdio.h>
#include <assert.h>
#include <strings.h>
#include "wintypes.h"
#include "windows.h"
#include "mmsystem.h"
#include "vfw.h"
int PASCAL WinMain (HANDLE hInstance, HANDLE prev, LPSTR cmdline, int show)
{
int n;
HRESULT hres;
HMODULE avifil32 = LoadLibrary("avifil32.dll");
PAVIFILE avif;
PAVISTREAM vids,auds;
AVIFILEINFO afi;
AVISTREAMINFO asi;
void (WINAPI *fnAVIFileInit)(void);
void (WINAPI *fnAVIFileExit)(void);
ULONG (WINAPI *fnAVIFileRelease)(PAVIFILE);
ULONG (WINAPI *fnAVIStreamRelease)(PAVISTREAM);
HRESULT (WINAPI *fnAVIFileOpen)(PAVIFILE * ppfile,LPCTSTR szFile,UINT uMode,LPCLSID lpHandler);
HRESULT (WINAPI *fnAVIFileInfo)(PAVIFILE ppfile,AVIFILEINFO *afi,LONG size);
HRESULT (WINAPI *fnAVIFileGetStream)(PAVIFILE ppfile,PAVISTREAM *afi,DWORD fccType,LONG lParam);
HRESULT (WINAPI *fnAVIStreamInfo)(PAVISTREAM iface,AVISTREAMINFO *afi,LONG size);
#define XX(x) fn##x = (void*)GetProcAddress(avifil32,#x);assert(fn##x);
#ifdef UNICODE
# define XXT(x) fn##x = (void*)GetProcAddress(avifil32,#x##"W");assert(fn##x);
#else
# define XXT(x) fn##x = (void*)GetProcAddress(avifil32,#x##"A");assert(fn##x);
#endif
/* Non character dependend routines: */
XX (AVIFileInit);
XX (AVIFileExit);
XX (AVIFileRelease);
XX (AVIStreamRelease);
XX (AVIFileGetStream);
/* A/W routines: */
XXT(AVIFileOpen);
XXT(AVIFileInfo);
XXT(AVIStreamInfo);
#undef XX
#undef XXT
fnAVIFileInit();
if (-1==GetFileAttributes(cmdline)) {
fprintf(stderr,"Usage: aviinfo <avifilename>\n");
exit(1);
}
hres = fnAVIFileOpen(&avif,cmdline,OF_READ,NULL);
if (hres) {
fprintf(stderr,"AVIFileOpen: 0x%08lx\n",hres);
exit(1);
}
hres = fnAVIFileInfo(avif,&afi,sizeof(afi));
if (hres) {
fprintf(stderr,"AVIFileInfo: 0x%08lx\n",hres);
exit(1);
}
fprintf(stderr,"AVI File Info:\n");
fprintf(stderr,"\tdwMaxBytesPerSec: %ld\n",afi.dwMaxBytesPerSec);
#define FF(x) if (afi.dwFlags & AVIFILEINFO_##x) fprintf(stderr,#x##",");
fprintf(stderr,"\tdwFlags: 0x%lx (",afi.dwFlags);
FF(HASINDEX);FF(MUSTUSEINDEX);FF(ISINTERLEAVED);FF(WASCAPTUREFILE);
FF(COPYRIGHTED);
fprintf(stderr,")\n");
#undef FF
#define FF(x) if (afi.dwCaps & AVIFILECAPS_##x) fprintf(stderr,#x##",");
fprintf(stderr,"\tdwCaps: 0x%lx (",afi.dwCaps);
FF(CANREAD);FF(CANWRITE);FF(ALLKEYFRAMES);FF(NOCOMPRESSION);
fprintf(stderr,")\n");
#undef FF
fprintf(stderr,"\tdwStreams: %ld\n",afi.dwStreams);
fprintf(stderr,"\tdwSuggestedBufferSize: %ld\n",afi.dwSuggestedBufferSize);
fprintf(stderr,"\tdwWidth: %ld\n",afi.dwWidth);
fprintf(stderr,"\tdwHeight: %ld\n",afi.dwHeight);
fprintf(stderr,"\tdwScale: %ld\n",afi.dwScale);
fprintf(stderr,"\tdwRate: %ld\n",afi.dwRate);
fprintf(stderr,"\tdwLength: %ld\n",afi.dwLength);
fprintf(stderr,"\tdwEditCount: %ld\n",afi.dwEditCount);
fprintf(stderr,"\tszFileType: %s\n",afi.szFileType);
for (n = 0;n<afi.dwStreams;n++) {
char buf[5];
PAVISTREAM ast;
hres = fnAVIFileGetStream(avif,&ast,0,n);
if (hres) {
fprintf(stderr,"AVIFileGetStream %d: 0x%08lx\n",n,hres);
exit(1);
}
hres = fnAVIStreamInfo(ast,&asi,sizeof(asi));
if (hres) {
fprintf(stderr,"AVIStreamInfo %d: 0x%08lx\n",n,hres);
exit(1);
}
fprintf(stderr,"Stream %d:\n",n);
buf[4]='\0';memcpy(buf,&(asi.fccType),4);
fprintf(stderr,"\tfccType: %s\n",buf);
memcpy(buf,&(asi.fccHandler),4);
fprintf(stderr,"\tfccHandler: %s\n",buf);
fprintf(stderr,"\tdwFlags: 0x%08lx\n",asi.dwFlags);
fprintf(stderr,"\tdwCaps: 0x%08lx\n",asi.dwCaps);
fprintf(stderr,"\twPriority: %d\n",asi.wPriority);
fprintf(stderr,"\twLanguage: %d\n",asi.wLanguage);
fprintf(stderr,"\tdwScale: %ld\n",asi.dwScale);
fprintf(stderr,"\tdwRate: %ld\n",asi.dwRate);
fprintf(stderr,"\tdwStart: %ld\n",asi.dwStart);
fprintf(stderr,"\tdwLength: %ld\n",asi.dwLength);
fprintf(stderr,"\tdwInitialFrames: %ld\n",asi.dwInitialFrames);
fprintf(stderr,"\tdwSuggestedBufferSize: %ld\n",asi.dwSuggestedBufferSize);
fprintf(stderr,"\tdwQuality: %ld\n",asi.dwQuality);
fprintf(stderr,"\tdwSampleSize: %ld\n",asi.dwSampleSize);
fprintf(stderr,"\tdwEditCount: %ld\n",asi.dwEditCount);
fprintf(stderr,"\tdwFormatChangeCount: %ld\n",asi.dwFormatChangeCount);
fprintf(stderr,"\tszName: %s\n",asi.szName);
switch (asi.fccType) {
case streamtypeVIDEO:
vids = ast;
break;
case streamtypeAUDIO:
auds = ast;
break;
default: {
char type[5];
type[4]='\0';memcpy(type,&(asi.fccType),4);
fprintf(stderr,"Unhandled streamtype %s\n",type);
fnAVIStreamRelease(ast);
break;
}
}
}
fnAVIFileRelease(avif);
fnAVIFileExit();
return 0;
}
/*
* Very simple AVIPLAYER
*
* Copyright 1999 Marcus Meissner
*
* Status:
* - plays .avi streams, video only
* - requires MicroSoft avifil32.dll and builtin msvfw32.dll.
*
* Todo:
* - audio support (including synchronization etc)
* - replace DirectDraw by a 'normal' window, including dithering, controls
* etc.
*
* Bugs:
* - no time scheduling, video plays too fast using DirectDraw/XF86DGA
* - requires DirectDraw with all disadvantages.
*/
#include <stdio.h>
#include <time.h>
#include <assert.h>
#include <strings.h>
#include "wintypes.h"
#include "windows.h"
#include "wingdi.h"
#include "mmsystem.h"
#include "ddraw.h"
#include "vfw.h"
int PASCAL WinMain (HANDLE hInstance, HANDLE prev, LPSTR cmdline, int show)
{
int i,n,pos;
time_t tstart,tend;
LONG cnt;
BITMAPINFOHEADER *bmi;
HRESULT hres;
HMODULE avifil32 = LoadLibrary("avifil32.dll");
PAVIFILE avif;
PAVISTREAM vids=NULL,auds=NULL;
AVIFILEINFO afi;
AVISTREAMINFO asi;
PGETFRAME vidgetframe=NULL;
LPDIRECTDRAW ddraw;
DDSURFACEDESC dsdesc;
LPDIRECTDRAWSURFACE dsurf;
void (WINAPI *fnAVIFileInit)(void);
void (WINAPI *fnAVIFileExit)(void);
ULONG (WINAPI *fnAVIFileRelease)(PAVIFILE);
ULONG (WINAPI *fnAVIStreamRelease)(PAVISTREAM);
HRESULT (WINAPI *fnAVIFileOpen)(PAVIFILE * ppfile,LPCTSTR szFile,UINT uMode,LPCLSID lpHandler);
HRESULT (WINAPI *fnAVIFileInfo)(PAVIFILE ppfile,AVIFILEINFO *afi,LONG size);
HRESULT (WINAPI *fnAVIFileGetStream)(PAVIFILE ppfile,PAVISTREAM *afi,DWORD fccType,LONG lParam);
HRESULT (WINAPI *fnAVIStreamInfo)(PAVISTREAM iface,AVISTREAMINFO *afi,LONG size);
HRESULT (WINAPI *fnAVIStreamReadFormat)(PAVISTREAM iface,LONG pos,LPVOID format,LPLONG size);
PGETFRAME (WINAPI *fnAVIStreamGetFrameOpen)(PAVISTREAM iface,LPBITMAPINFOHEADER wanted);
LPVOID (WINAPI *fnAVIStreamGetFrame)(PGETFRAME pg,LONG pos);
HRESULT (WINAPI *fnAVIStreamGetFrameClose)(PGETFRAME pg);
#define XX(x) fn##x = (void*)GetProcAddress(avifil32,#x);assert(fn##x);
#ifdef UNICODE
# define XXT(x) fn##x = (void*)GetProcAddress(avifil32,#x##"W");assert(fn##x);
#else
# define XXT(x) fn##x = (void*)GetProcAddress(avifil32,#x##"A");assert(fn##x);
#endif
/* non character dependend routines: */
XX (AVIFileInit);
XX (AVIFileExit);
XX (AVIFileRelease);
XX (AVIFileGetStream);
XX (AVIStreamRelease);
XX (AVIStreamReadFormat);
XX (AVIStreamGetFrameOpen);
XX (AVIStreamGetFrame);
XX (AVIStreamGetFrameClose);
/* A/W routines: */
XXT(AVIFileOpen);
XXT(AVIFileInfo);
XXT(AVIStreamInfo);
#undef XX
#undef XXT
fnAVIFileInit();
if (-1==GetFileAttributes(cmdline)) {
fprintf(stderr,"Usage: aviplay <avifilename>\n");
exit(1);
}
hres = fnAVIFileOpen(&avif,cmdline,OF_READ,NULL);
if (hres) {
fprintf(stderr,"AVIFileOpen: 0x%08lx\n",hres);
exit(1);
}
hres = fnAVIFileInfo(avif,&afi,sizeof(afi));
if (hres) {
fprintf(stderr,"AVIFileInfo: 0x%08lx\n",hres);
exit(1);
}
for (n=0;n<afi.dwStreams;n++) {
char buf[5];
PAVISTREAM ast;
hres = fnAVIFileGetStream(avif,&ast,0,n);
if (hres) {
fprintf(stderr,"AVIFileGetStream %d: 0x%08lx\n",n,hres);
exit(1);
}
hres = fnAVIStreamInfo(ast,&asi,sizeof(asi));
if (hres) {
fprintf(stderr,"AVIStreamInfo %d: 0x%08lx\n",n,hres);
exit(1);
}
fprintf(stderr,"[Stream %d: ",n);
buf[4]='\0';memcpy(buf,&(asi.fccType),4);
fprintf(stderr,"%s.",buf);
buf[4]='\0';memcpy(buf,&(asi.fccHandler),4);
fprintf(stderr,"%s, %s]\n",buf,asi.szName);
switch (asi.fccType) {
case streamtypeVIDEO:
vids = ast;
break;
case streamtypeAUDIO:
auds = ast;
break;
default: {
char type[5];
type[4]='\0';memcpy(type,&(asi.fccType),4);
fprintf(stderr,"Unhandled streamtype %s\n",type);
fnAVIStreamRelease(ast);
break;
}
}
}
/********************* begin video setup ***********************************/
if (!vids) {
fprintf(stderr,"No video stream found. Good Bye.\n");
exit(0);
}
cnt = sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD);
bmi = HeapAlloc(GetProcessHeap(),0,cnt);
hres = fnAVIStreamReadFormat(vids,0,bmi,&cnt);
if (hres) {
fprintf(stderr,"AVIStreamReadFormat vids: 0x%08lx\n",hres);
exit(1);
}
bmi->biCompression = 0; /* we want it in raw form, uncompressed */
vidgetframe = fnAVIStreamGetFrameOpen(vids,bmi);
if (!vidgetframe) {
fprintf(stderr,"AVIStreamGetFrameOpen: failed.\n");
exit(1);
}
/********************* end video setup ***********************************/
/********************* begin display setup *******************************/
hres = DirectDrawCreate(NULL,&ddraw,NULL);
if (hres) {
fprintf(stderr,"DirectDrawCreate: 0x%08lx\n",hres);
exit(1);
}
hres = ddraw->lpvtbl->fnSetDisplayMode(ddraw,bmi->biWidth,bmi->biHeight,bmi->biBitCount);
if (hres) {
fprintf(stderr,"ddraw.SetDisplayMode: 0x%08lx (change resolution!)\n",hres);
exit(1);
}
dsdesc.dwSize=sizeof(dsdesc);
dsdesc.dwFlags = DDSD_CAPS;
dsdesc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
hres = ddraw->lpvtbl->fnCreateSurface(ddraw,&dsdesc,&dsurf,NULL);
if (hres) {
fprintf(stderr,"ddraw.CreateSurface: 0x%08lx\n",hres);
exit(1);
}
/********************* end display setup *******************************/
tstart = time(NULL);
pos = 0;
while (1) {
LPVOID decodedframe;
LPBITMAPINFOHEADER lpbmi;
LPVOID decodedbits;
int bytesline;
/* video stuff */
if (!(decodedframe=fnAVIStreamGetFrame(vidgetframe,pos++)))
break;
lpbmi = (LPBITMAPINFOHEADER)decodedframe;
decodedbits = (LPVOID)(((DWORD)decodedframe)+lpbmi->biSize);
dsdesc.dwSize = sizeof(dsdesc);
hres = dsurf->lpvtbl->fnLock(dsurf,NULL,&dsdesc,DDLOCK_WRITEONLY,0);
if (hres) {
fprintf(stderr,"dsurf.Lock: 0x%08lx\n",hres);
exit(1);
}
bytesline = dsdesc.dwWidth * dsdesc.ddpfPixelFormat.x.dwRGBBitCount/8;
/* Argh. AVIs are upside down. */
for (i=0;i<dsdesc.dwHeight;i++) {
memcpy( dsdesc.y.lpSurface+(i*dsdesc.lPitch),
decodedbits+bytesline*(dsdesc.dwHeight-i),
bytesline
);
}
dsurf->lpvtbl->fnUnlock(dsurf,dsdesc.y.lpSurface);
}
tend = time(NULL);
fnAVIStreamGetFrameClose(vidgetframe);
((IUnknown*)dsurf)->lpvtbl->fnRelease((IUnknown*)dsurf);
ddraw->lpvtbl->fnRestoreDisplayMode(ddraw);
((IUnknown*)ddraw)->lpvtbl->fnRelease((IUnknown*)ddraw);
if (vids) fnAVIStreamRelease(vids);
if (auds) fnAVIStreamRelease(auds);
fprintf(stderr,"%d frames at %g frames/s\n",pos,pos*1.0/(tend-tstart));
fnAVIFileRelease(avif);
fnAVIFileExit();
return 0;
}
......@@ -87,7 +87,7 @@ static BUILTIN32_DLL BuiltinDLLs[] =
{ &MPR_Descriptor, TRUE },
{ &MSACM32_Descriptor, FALSE },
{ &MSNET32_Descriptor, FALSE },
{ &MSVFW32_Descriptor, FALSE },
{ &MSVFW32_Descriptor, TRUE },
{ &NTDLL_Descriptor, TRUE },
{ &OLE32_Descriptor, FALSE },
{ &OLEAUT32_Descriptor, FALSE },
......
......@@ -37,7 +37,7 @@ type win32
32 stub ICImageDecompress
33 stdcall ICInfo(long long ptr) ICInfo32
34 stub ICInstall
35 stub ICLocate
35 stdcall ICLocate(long long ptr ptr long) ICLocate32
36 stub ICMThunk32
37 stdcall ICOpen(long long long) ICOpen32
38 stub ICOpenFunction
......
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