www.pudn.com > CAPMCI.rar > Vfw.pas
unit VFW;
{ just the AVIFile stuff (didn't have time to do the whole thing...) }
interface
uses Windows, Ole2;
const
streamtypeVIDEO = $73646976 ; // DWORD( 'v', 'i', 'd', 's' )
streamtypeAUDIO = $73647561; // DWORD( 'a', 'u', 'd', 's' )
streamtypeMIDI = $7364696D; // DWORD( 'm', 'i', 'd', 's' )
streamtypeTEXT = $73747874; // DWORD( 't', 'x', 't', 's' )
comptypeDIB = $20424944; // DWORD( 'D', 'I', 'B', ' ' )
AVIIF_KEYFRAME = $10;
type
LONG = Longint;
PVOID = Pointer;
PAviStreamInfoA = ^TAviStreamInfoA;
TAviStreamInfoA = record
fccType : DWORD;
fccHandler : DWORD;
dwFlags : DWORD; // Contains AVITF_* flags
dwCaps : DWORD;
wPriority : WORD;
wLanguage : WORD;
dwScale : DWORD;
dwRate : DWORD; // dwRate / dwScale == samples/second
dwStart : DWORD;
dwLength : DWORD; // In units above...
dwInitialFrames : DWORD;
dwSuggestedBufferSize : DWORD;
dwQuality : DWORD;
dwSampleSize : DWORD;
rcFrame : TRECT;
dwEditCount : DWORD;
dwFormatChangeCount : DWORD;
szName : array[0..63] of AnsiChar;
end;
TAviStreamInfo = TAviStreamInfoA;
PAviStreamInfoW = ^TAviStreamInfoW;
TAviStreamInfoW = record
fccType : DWORD;
fccHandler : DWORD;
dwFlags : DWORD; // Contains AVITF_* flags
dwCaps : DWORD;
wPriority : WORD;
wLanguage : WORD;
dwScale : DWORD;
dwRate : DWORD; // dwRate / dwScale == samples/second
dwStart : DWORD;
dwLength : DWORD; // In units above...
dwInitialFrames : DWORD;
dwSuggestedBufferSize : DWORD;
dwQuality : DWORD;
dwSampleSize : DWORD;
rcFrame : TRECT;
dwEditCount : DWORD;
dwFormatChangeCount : DWORD;
szName : array[0..63] of WideChar;
end;
Const
AVISTREAMINFO_DISABLED = $00000001;
AVISTREAMINFO_FORMATCHANGES = $00010000;
Type
PAviFileInfoA = ^TAviFileInfoA;
TAviFileInfoA = record
dwMaxBytesPerSec : DWORD; // max. transfer rate
dwFlags : DWORD; // the ever-present flags
dwCaps : DWORD;
dwStreams : DWORD;
dwSuggestedBufferSize : DWORD;
dwWidth : DWORD;
dwHeight : DWORD;
dwScale : DWORD;
dwRate : DWORD; // dwRate / dwScale == samples/second
dwLength : DWORD;
dwEditCount : DWORD;
// descriptive string for file type?
szFileType : array[0..63] of Char;
end;
TAviFileInfo = TAviFileInfoA;
PAviFileInfoW = ^TAviFileInfoW;
TAviFileInfoW = record
dwMaxBytesPerSec : DWORD; // max. transfer rate
dwFlags : DWORD; // the ever-present flags
dwCaps : DWORD;
dwStreams : DWORD;
dwSuggestedBufferSize : DWORD;
dwWidth : DWORD;
dwHeight : DWORD;
dwScale : DWORD;
dwRate : DWORD; // dwRate / dwScale == samples/second
dwLength : DWORD;
dwEditCount : DWORD;
// descriptive string for file type?
szFileType : array[0..63] of WideChar;
end;
Const
// Flags for dwFlags
AVIFILEINFO_HASINDEX = $00000010;
AVIFILEINFO_MUSTUSEINDEX = $00000020;
AVIFILEINFO_ISINTERLEAVED = $00000100;
AVIFILEINFO_WASCAPTUREFILE = $00010000;
AVIFILEINFO_COPYRIGHTED = $00020000;
// Flags for dwCaps
AVIFILECAPS_CANREAD = $00000001;
AVIFILECAPS_CANWRITE = $00000002;
AVIFILECAPS_ALLKEYFRAMES = $00000010;
AVIFILECAPS_NOCOMPRESSION = $00000020;
// defines for uiFlags
ICMF_CHOOSE_KEYFRAME = $0001; // show KeyFrame Every box
ICMF_CHOOSE_DATARATE = $0002; // show DataRate box
ICMF_CHOOSE_PREVIEW = $0004; // allow expanded preview dialog
ICMF_CHOOSE_ALLCOMPRESSORS = $0008; // don't only show those that
Type
TAVISaveCallBack = function(Percentage : Integer): Boolean stdcall;
AVISaveCallBack = ^TAVISaveCallBack;
Type
PAviCompressOptions = ^TAviCompressOptions;
TAviCompressOptions = record
fccType : DWORD; // stream type, for consistency
fccHandler : DWORD; // compressor
dwKeyFrameEvery : DWORD; // keyframe rate
dwQuality : DWORD; // compress quality 0-10,000
dwBytesPerSecond : DWORD; // bytes per second
dwFlags : DWORD; // flags... see aviopts.h
lpFormat : PVOID; // save format
cbFormat : DWORD;
lpParms : PVOID; // compressor options
cbParms : DWORD;
dwInterleaveEvery : DWORD; // for non-video streams only
end;
//
// Defines for the dwFlags field of the AVICOMPRESSOPTIONS struct
// Each of these flags determines if the appropriate field in the structure
// (dwInterleaveEvery, dwBytesPerSecond, and dwKeyFrameEvery) is payed
// attention to. See the autodoc in avisave.c for details.
//
Const
AVICOMPRESSF_INTERLEAVE = $00000001; // interleave
AVICOMPRESSF_DATARATE = $00000002; // use a data rate
AVICOMPRESSF_KEYFRAMES = $00000004; // use keyframes
AVICOMPRESSF_VALID = $00000008; // has valid data?
// #include "aviiface.h": All necessary stuff from "aviiface.h" follows
Type
// IAVIStream interface
IAVIStream = class(IUnknown)
function Create(lParam1, lParam2: LPARAM): HResult; virtual; stdcall; abstract;
function Info(var psi: TAVIStreamInfoW; lSize: LONG): HResult; virtual; stdcall; abstract;
function FindSample(lPos, lFlags: LONG): LONG; virtual; stdcall; abstract;
function ReadFormat(lPos: LONG; lpFormat: PVOID; var lpcbFormat: LONG): HResult; virtual; stdcall; abstract;
function SetFormat(lPos: LONG; lpFormat: PVOID; lpcbFormat: LONG): HResult; virtual; stdcall; abstract;
function Read(lStart, lSamples: LONG; lpBuffer: PVOID; cbBuffer: LONG; var plBytes: LONG; var plSamples: LONG): HResult; virtual; stdcall; abstract;
function Write(lStart, lSamples: LONG; lpBuffer: PVOID; cbBuffer: LONG; dwFlags: DWORD; var plSampWritten: LONG; var plBytesWritten: LONG): HResult; virtual; stdcall; abstract;
function Delete(lStart, lSamples: LONG): HResult; virtual; stdcall; abstract;
function ReadData(fcc: DWORD; lp: PVOID; var lpcb: LONG): HResult; virtual; stdcall; abstract;
function WriteData(fcc: DWORD; lp: PVOID; cb: LONG): HResult; virtual; stdcall; abstract;
function SetInfo(var lpInfo: TAVIStreamInfoW; cbInfo: LONG): HResult; virtual; stdcall; abstract;
end;
PAVIStream = ^IAVIStream;
// IAVIEditStream interface
IAVIEditStream = class(IUnknown)
function Info(var pfi: TAVIFileInfoW; lSize: LONG): HResult; virtual; stdcall; abstract;
function Cut(var plStart:LONG; var plLength:Long; var ppResult :PAVISTREAM ): HResult; virtual; stdcall; abstract;
function Copy(var plLength:Long; var ppResult :PAVISTREAM ): HResult; virtual; stdcall; abstract;
function Paste(var plLength:Long; pstream :PAVISTREAM; lStart : LONG; lEnd : LONG ): HResult; virtual; stdcall; abstract;
function Clone(var ppResult :PAVISTREAM ): HResult; virtual; stdcall; abstract;
function SetInfo(var lpInfo: TAVIStreamInfoW; cbInfo: LONG): HResult; virtual; stdcall; abstract;
end;
PAVIEditStream = ^IAVIEditStream;
// IAVIFile interface
IAVIFile = class(IUnknown)
function Open(szFile:LPCSTR; mode:UINT): HResult; virtual; stdcall; abstract;
function Info(var pfi: TAviFileInfo; lSize:LONG): HResult; virtual; stdcall; abstract;
function GetStream(var ppStream: PAVISTREAM; fccType:DWORD; lParam:LONG): HResult; virtual; stdcall; abstract;
function CreateStream(var ppStream: PAVISTREAM; psi:TAVISTREAMINFO): HResult; virtual; stdcall; abstract;
function Save(szFile:LPCSTR; var lpOptions:TAVICOMPRESSOPTIONS;lpfnCallback:AVISAVECALLBACK): HResult; virtual; stdcall; abstract;
function WriteData(ckid:DWORD; lpData:PVOID;cbData:LONG): HResult; virtual; stdcall; abstract;
function ReadData(ckid:DWORD; lpData:PVOID;var lpcbData:LONG): HResult; virtual; stdcall; abstract;
function EndRecord: HResult; virtual; stdcall; abstract;
end;
PAVIFile = ^IAVIFile;
// IGetFrame interface
type
IGetFrame = class(IUnknown)
function GetFrame(lPos: LONG): PVOID; virtual; stdcall; abstract;
function SetFormat(lpbi: PBITMAPINFOHEADER;lpBits:PVOID; x:Integer; y:Integer; dx:Integer; dy:Integer ): HResult; virtual; stdcall; abstract;
end;
PGetFrame = ^IGetFrame;
Const
// AVI interface IDs
IID_IAVIFile: TGUID = (
D1:$00020020;D2:$0;D3:$0;D4:($C0,$0,$0,$0,$0,$0,$0,$46));
IID_IAVIStream: TGUID = (
D1:$00020021;D2:$0;D3:$0;D4:($C0,$0,$0,$0,$0,$0,$0,$46));
IID_IAVIStreaming: TGUID = (
D1:$00020022;D2:$0;D3:$0;D4:($C0,$0,$0,$0,$0,$0,$0,$46));
IID_IGetFrame: TGUID = (
D1:$00020023;D2:$0;D3:$0;D4:($C0,$0,$0,$0,$0,$0,$0,$46));
IID_IAVIEditStream: TGUID = (
D1:$00020024;D2:$0;D3:$0;D4:($C0,$0,$0,$0,$0,$0,$0,$46));
// AVI class IDs
CLSID_AVISimpleUnMarshal: TGUID = (
D1:$00020009;D2:$0;D3:$0;D4:($C0,$0,$0,$0,$0,$0,$0,$46));
CLSID_AVIFile: TGUID = (
D1:$00020000;D2:$0;D3:$0;D4:($C0,$0,$0,$0,$0,$0,$0,$46));
AVIFILEHANDLER_CANREAD = $0001;
AVIFILEHANDLER_CANWRITE = $0002;
AVIFILEHANDLER_CANACCEPTNONRGB = $0004;
//
// functions
//
procedure AVIFileInit; stdcall;
procedure AVIFileExit; stdcall;
function AVIFileAddRef (pfile: PAVIFILE): ULONG; stdcall;
function AVIFileRelease(pfile: PAVIFILE): ULONG; stdcall;
function AVIFileOpen(var ppfile: PAVIFile; szFile: LPCSTR; uMode: UINT;
lpHandler: PCLSID): HResult; stdcall;
function AVIFileInfo(pfile: PAVIFile; var pfi: TAVIFileInfo; lSize : Long): HResult; stdcall;
function AVIFileGetStream(pfile: PAVIFile; var ppavi: PAVISTREAM;
fccType : DWORD; lParam : LONG): HResult; stdcall;
function AVIFileCreateStream(pfile: PAVIFile; var ppavi: PAVISTREAM;
var psi: TAVIStreamInfoA): HResult; stdcall;
function AVIFileWriteData(pfile: PAVIFile; ckid: DWORD; lpData: PVOID;
cbData: LONG): HResult; stdcall;
function AVIFileReadData(ckid: DWORD; lpData: PVOID;
var lpcbData: LONG): HResult; stdcall;
function AVIFileEndRecord(pfile: PAVIFile): HResult; stdcall;
function AVIStreamAddRef (pavi: PAVISTREAM): ULONG; stdcall;
function AVIStreamRelease (pavi: PAVISTREAM): ULONG; stdcall;
function AVIStreamInfo(pavi: PAVISTREAM; var psi: TAVISTREAMINFO; lSize:LONG): HResult; stdcall;
function AVIStreamFindSample(pavi: PAVISTREAM; lPos: LONG; lFlags:LONG): LONG; stdcall;
function AVIStreamReadFormat(pavi: PAVISTREAM; lPos:LONG;lpFormat:PVOID;var lpcbFormat:LONG): HResult; stdcall;
function AVIStreamSetFormat(pavi: PAVIStream; lPos: LONG; lpFormat: PVOID;
cbFormat: LONG): HResult; stdcall;
function AVIStreamReadData(pavi: PAVIStream; fcc: DWORD; lp: PVOID;var lpcb: LONG): HResult; stdcall;
function AVIStreamWriteData(pavi: PAVIStream; fcc: DWORD; lp: PVOID;cb: LONG): HResult; stdcall;
function AVIStreamRead(pavi: PAVIStream; lStart: LONG;lSamples: LONG;lpBuffer: PVOID;
cbBuffer: LONG;var plBytes: LONG;var plSamples: LONG): HResult; stdcall;
function AVIStreamWrite(pavi: PAVIStream; lStart, lSamples: LONG;
lpBuffer: PVOID; cbBuffer: LONG; dwFlags: DWORD;
var plSampWritten: LONG; var plBytesWritten: LONG)
: HResult; stdcall;
function AVIStreamStart(pavi: PAVIStream): LONG; stdcall;
function AVIStreamLength(pavi: PAVIStream): LONG; stdcall;
function AVIStreamTimeToSample(pavi: PAVIStream; lTime: LONG): LONG; stdcall;
function AVIStreamSampleToTime(pavi: PAVIStream; lSample: LONG): LONG; stdcall;
function AVIStreamBeginStreaming(pavi: PAVIStream; lStart: LONG; lEnd: LONG; lRate: LONG): LONG; stdcall;
function AVIStreamEndStreaming(pavi: PAVIStream): LONG; stdcall;
//
// helper functions for using IGetFrame
//
function AVIStreamGetFrameOpen(pavi : PAVISTREAM; lpbiWanted : PBITMAPINFOHEADER ):PGETFRAME; stdcall;
function AVIStreamGetFrame(pg: PGETFRAME; lPos: LONG): PVOID; stdcall;
function AVIStreamGetFrameClose(pg: PGETFRAME): HResult; stdcall;
// Shortcut function
function AVIStreamOpenFromFile(var ppavi: PAVISTREAM; szFile: LPCSTR;
fccType: DWORD; lParam: LONG; mode :UINT; pclsidHandler: PCLSID): HResult; stdcall;
// Use to create disembodied streams
function AVIStreamCreate(var ppavi: PAVISTREAM; lParam1: LONG; lParam2 :LONG; pclsidHandler: PCLSID): HResult; stdcall;
Const
//
// flags for AVIStreamFindSample
//
FIND_DIR = $0000000F; // direction
FIND_NEXT = $00000001; // go forward
FIND_PREV = $00000004; // go backward
FIND_TYPE = $000000F0; // type mask
FIND_KEY = $00000010; // find key frame.
FIND_ANY = $00000020; // find any (non-empty) sample
FIND_FORMAT = $00000040; // find format change
FIND_RET = $0000F000; // return mask
FIND_POS = $00000000; // return logical position
FIND_LENGTH = $00001000; // return logical size
FIND_OFFSET = $00002000; // return physical position
FIND_SIZE = $00003000; // return physical size
FIND_INDEX = $00004000; // return physical index position
function AVISaveV(szFile : LPCSTR;pclsidHandler:PCLSID;
lpfnCallback :AVISAVECALLBACK; nStreams: INTEGER;
var ppavi: PAVISTREAM; var plpOptions: PAVICOMPRESSOPTIONS):HResult; stdcall;
function AVISaveOptions(hwnd : HWND;uiFlags:UINT; nStreams : INTEGER;
var pavi : PAVISTREAM; var plpOptions : PAVICOMPRESSOPTIONS ):Boolean; stdcall;
function AVISaveOptionsFree(nStreams : INTEGER; var plpOptions : PAVICOMPRESSOPTIONS ):Boolean; stdcall;
const
AVIERR_OK = 0;
AVIIF_LIST = $01;
AVIIF_TWOCC = $02;
implementation
procedure AVIFileInit; stdcall; external 'avifil32.dll' name 'AVIFileInit';
procedure AVIFileExit; stdcall; external 'avifil32.dll' name 'AVIFileExit';
function AVIFileAddRef (pfile: PAVIFILE): ULONG;
external 'avifil32.dll' name 'AVIFileAddRef';
function AVIFileRelease(pfile: PAVIFILE): ULONG;
external 'avifil32.dll' name 'AVIFileRelease';
function AVIFileOpen(var ppfile: PAVIFILE; szFile: LPCSTR; uMode: UINT;
lpHandler: PCLSID): HResult;
external 'avifil32.dll' name 'AVIFileOpenA';
function AVIFileInfo(pfile: PAVIFile; var pfi: TAVIFileInfo;
lSize : Long): HResult; stdcall;
external 'avifil32.dll' name 'AVIFileInfo';
function AVIFileGetStream(pfile: PAVIFile; var ppavi: PAVIStream;
fccType : DWORD; lParam : LONG): HResult;
external 'avifil32.dll' name 'AVIFileGetStream';
function AVIFileCreateStream(pfile: PAVIFile; var ppavi: PAVIStream;
var psi: TAVIStreamInfoA): HResult;
external 'avifil32.dll' name 'AVIFileCreateStreamA';
function AVIFileWriteData(pfile: PAVIFile; ckid: DWORD; lpData: PVOID;
cbData: LONG): HResult;
external 'avifil32.dll' name 'AVIFileWriteData';
function AVIFileReadData(ckid: DWORD; lpData: PVOID;
var lpcbData: LONG): HResult;
external 'avifil32.dll' name 'AVIFileReadData';
function AVIFileEndRecord(pfile: PAVIFile): HResult;
external 'avifil32.dll' name 'AVIFileEndRecord';
function AVIStreamAddRef (pavi: PAVISTREAM): ULONG;
external 'avifil32.dll' name 'AVIStreamAddRef';
function AVIStreamRelease (pavi: PAVISTREAM): ULONG;
external 'avifil32.dll' name 'AVIStreamRelease';
function AVIStreamInfo(pavi: PAVISTREAM; var psi: TAVISTREAMINFO; lSize:LONG): HResult;
external 'avifil32.dll' name 'AVIStreamInfo';
function AVIStreamFindSample(pavi: PAVISTREAM; lPos: LONG; lFlags:LONG): LONG;
external 'avifil32.dll' name 'AVIStreamFindSample';
function AVIStreamReadFormat(pavi: PAVISTREAM; lPos:LONG;lpFormat:PVOID;var lpcbFormat:LONG): HResult;
external 'avifil32.dll' name 'AVIStreamReadFormat';
function AVIStreamSetFormat(pavi: PAVIStream; lPos: LONG; lpFormat: PVOID;
cbFormat: LONG): HResult;
external 'avifil32.dll' name 'AVIStreamSetFormat';
function AVIStreamReadData(pavi: PAVIStream; fcc: DWORD; lp: PVOID;var lpcb: LONG): HResult;
external 'avifil32.dll' name 'AVIStreamReadData';
function AVIStreamWriteData(pavi: PAVIStream; fcc: DWORD; lp: PVOID;cb: LONG): HResult;
external 'avifil32.dll' name 'AVIStreamWriteData';
function AVIStreamRead(pavi: PAVIStream; lStart: LONG;lSamples: LONG;lpBuffer: PVOID;
cbBuffer: LONG;var plBytes: LONG;var plSamples: LONG): HResult;
external 'avifil32.dll' name 'AVIStreamRead';
function AVIStreamWrite(pavi: PAVIStream; lStart, lSamples: LONG;
lpBuffer: PVOID; cbBuffer: LONG; dwFlags: DWORD;
var plSampWritten: LONG; var plBytesWritten: LONG): HResult;
external 'avifil32.dll' name 'AVIStreamWrite';
function AVIStreamStart(pavi: PAVIStream): LONG;
external 'avifil32.dll' name 'AVIStreamStart';
function AVIStreamLength(pavi: PAVIStream): LONG;
external 'avifil32.dll' name 'AVIStreamLength';
function AVIStreamTimeToSample(pavi: PAVIStream; lTime: LONG): LONG;
external 'avifil32.dll' name 'AVIStreamTimeToSample';
function AVIStreamSampleToTime(pavi: PAVIStream; lSample: LONG): LONG;
external 'avifil32.dll' name 'AVIStreamSampleToTime';
function AVIStreamBeginStreaming(pavi: PAVIStream; lStart: LONG; lEnd: LONG; lRate: LONG): LONG; stdcall;
external 'avifil32.dll' name 'AVIStreamBeginStreaming';
function AVIStreamEndStreaming(pavi: PAVIStream): LONG;
external 'avifil32.dll' name 'AVIStreamEndStreaming';
function AVIStreamGetFrameOpen(pavi : PAVISTREAM; lpbiWanted : PBITMAPINFOHEADER ):PGETFRAME;
external 'avifil32.dll' name 'AVIStreamGetFrameOpen';
function AVIStreamGetFrame(pg: PGETFRAME; lPos: LONG): PVOID;
external 'avifil32.dll' name 'AVIStreamGetFrame';
function AVIStreamGetFrameClose(pg: PGETFRAME): HResult;
external 'avifil32.dll' name 'AVIStreamGetFrameClose';
function AVIStreamOpenFromFile(var ppavi: PAVISTREAM; szFile: LPCSTR;
fccType: DWORD; lParam: LONG; mode :UINT; pclsidHandler: PCLSID): HResult;
external 'avifil32.dll' name 'AVIStreamOpenFromFile';
function AVIStreamCreate(var ppavi: PAVISTREAM; lParam1: LONG; lParam2 :LONG; pclsidHandler: PCLSID): HResult;
external 'avifil32.dll' name 'AVIStreamCreate';
function AVISaveV(szFile : LPCSTR;pclsidHandler:PCLSID;
lpfnCallback :AVISAVECALLBACK; nStreams: INTEGER;
var ppavi: PAVISTREAM; var plpOptions: PAVICOMPRESSOPTIONS):HResult; stdcall;
external 'avifil32.dll' name 'AVISaveV';
function AVISaveOptions(hwnd : HWND;uiFlags:UINT; nStreams : INTEGER;
var pavi : PAVISTREAM; var plpOptions : PAVICOMPRESSOPTIONS ):Boolean; stdcall;
external 'avifil32.dll' name 'AVISaveOptions';
function AVISaveOptionsFree(nStreams : INTEGER; var plpOptions : PAVICOMPRESSOPTIONS ):Boolean; stdcall;
external 'avifil32.dll' name 'AVISaveOptionsFree';
end.