📄 baseclass.pas
字号:
constructor Create(Name: String; Unk: IUnKnown; Form: TFormPropertyPage);
destructor Destroy; override;
procedure SetPageDirty;
{ IPropertyPage }
function SetPageSite(const pageSite: IPropertyPageSite): HResult; stdcall;
function Activate(hwndParent: HWnd; const rc: TRect; bModal: BOOL): HResult; stdcall;
function Deactivate: HResult; stdcall;
function GetPageInfo(out pageInfo: TPropPageInfo): HResult; stdcall;
function SetObjects(cObjects: Longint; pUnkList: PUnknownList): HResult; stdcall;
function Show(nCmdShow: Integer): HResult; stdcall;
function Move(const rect: TRect): HResult; stdcall;
function IsPageDirty: HResult; stdcall;
function Apply: HResult; stdcall;
function Help(pszHelpDir: POleStr): HResult; stdcall;
function TranslateAccelerator(msg: PMsg): HResult; stdcall;
end;
TOnConnect = procedure(sender: Tobject; Unknown: IUnknown) of object;
TFormPropertyPage = class(TForm, IUnKnown, IPropertyPage)
private
FPropertyPage: TBCBasePropertyPage;
procedure MyWndProc(var aMsg: TMessage);
public
constructor Create(AOwner: TComponent); override;
published
function OnConnect(Unknown: IUnknown): HRESULT; virtual;
function OnDisconnect: HRESULT; virtual;
function OnApplyChanges: HRESULT; virtual;
property PropertyPage : TBCBasePropertyPage read FPropertyPage implements IUnKnown, IPropertyPage;
end;
TBCBaseDispatch = class{IDispatch}
protected
FTI: ITypeInfo;
public
// IDispatch methods
function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
function GetTypeInfo(const iid: TGUID; info: Cardinal; lcid: LCID; out tinfo): HRESULT; stdcall;
function GetIDsOfNames(const IID: TGUID; Names: Pointer;
NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
end;
TBCMediaControl = class(TBCUnknown, IDispatch)
public
FBaseDisp: TBCBaseDispatch;
constructor Create(name: string; unk: IUnknown);
destructor Destroy; override;
// IDispatch methods
function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
function GetIDsOfNames(const IID: TGUID; Names: Pointer;
NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
end;
TBCMediaEvent = class(TBCUnknown, IDisPatch{,IMediaEventEx})
protected
FBasedisp: TBCBaseDispatch;
public
constructor Create(Name: string; Unk: IUnknown);
destructor destroy; override;
// IDispatch methods
function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
function GetIDsOfNames(const IID: TGUID; Names: Pointer;
NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
end;
TBCMediaPosition = class(TBCUnknown, IDispatch {IMediaPosition})
protected
FBaseDisp: TBCBaseDispatch;
public
constructor Create(Name: String; Unk: IUnknown); overload;
constructor Create(Name: String; Unk: IUnknown; out hr: HRESULT); overload;
destructor Destroy; override;
// IDispatch methods
function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
function GetIDsOfNames(const IID: TGUID; Names: Pointer;
NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
end;
// A utility class that handles IMediaPosition and IMediaSeeking on behalf
// of single-input pin renderers, or transform filters.
//
// Renderers will expose this from the filter; transform filters will
// expose it from the output pin and not the renderer.
//
// Create one of these, giving it your IPin* for your input pin, and delegate
// all IMediaPosition methods to it. It will query the input pin for
// IMediaPosition and respond appropriately.
//
// Call ForceRefresh if the pin connection changes.
//
// This class no longer caches the upstream IMediaPosition or IMediaSeeking
// it acquires it on each method call. This means ForceRefresh is not needed.
// The method is kept for source compatibility and to minimise the changes
// if we need to put it back later for performance reasons.
TBCPosPassThru = class(TBCMediaPosition, IMediaSeeking)
protected
FPin: IPin;
function GetPeer(out MP: IMediaPosition): HRESULT;
function GetPeerSeeking(out MS: IMediaSeeking): HRESULT;
public
constructor Create(name: String; Unk: IUnknown; out hr: HRESULT; Pin: IPin);
function ForceRefresh: HRESULT;{return S_OK;}
// override to return an accurate current position
function GetMediaTime(out StartTime, EndTime: int64): HRESULT; virtual;
// IMediaSeeking methods
function GetCapabilities(out pCapabilities: DWORD): HRESULT; stdcall;
function CheckCapabilities(var pCapabilities: DWORD): HRESULT; stdcall;
function IsFormatSupported(const pFormat: TGUID): HRESULT; stdcall;
function QueryPreferredFormat(out pFormat: TGUID): HRESULT; stdcall;
function GetTimeFormat(out pFormat: TGUID): HRESULT; stdcall;
function IsUsingTimeFormat(const pFormat: TGUID): HRESULT; stdcall;
function SetTimeFormat(const pFormat: TGUID): HRESULT; stdcall;
function GetDuration(out pDuration: int64): HRESULT; stdcall;
function GetStopPosition(out pStop: int64): HRESULT; stdcall;
function GetCurrentPosition(out pCurrent: int64): HRESULT; stdcall;
function ConvertTimeFormat(out pTarget: int64; pTargetFormat: PGUID;
Source: int64; pSourceFormat: PGUID): HRESULT; stdcall;
function SetPositions(var pCurrent: int64; dwCurrentFlags: DWORD;
var pStop: int64; dwStopFlags: DWORD): HRESULT; stdcall;
function GetPositions(out pCurrent, pStop: int64): HRESULT; stdcall;
function GetAvailable(out pEarliest, pLatest: int64): HRESULT; stdcall;
function SetRate(dRate: double): HRESULT; stdcall;
function GetRate(out pdRate: double): HRESULT; stdcall;
function GetPreroll(out pllPreroll: int64): HRESULT; stdcall;
// IMediaPosition properties
function get_Duration(out plength: TRefTime): HResult; stdcall;
function put_CurrentPosition(llTime: TRefTime): HResult; stdcall;
function get_CurrentPosition(out pllTime: TRefTime): HResult; stdcall;
function get_StopTime(out pllTime: TRefTime): HResult; stdcall;
function put_StopTime(llTime: TRefTime): HResult; stdcall;
function get_PrerollTime(out pllTime: TRefTime): HResult; stdcall;
function put_PrerollTime(llTime: TRefTime): HResult; stdcall;
function put_Rate(dRate: double): HResult; stdcall;
function get_Rate(out pdRate: double): HResult; stdcall;
function CanSeekForward(out pCanSeekForward: Longint): HResult; stdcall;
function CanSeekBackward(out pCanSeekBackward: Longint): HResult; stdcall;
end;
TBCRendererPosPassThru = class(TBCPosPassThru)
protected
FPositionLock: TBCCritSec; // Locks access to our position
FStartMedia : Int64; // Start media time last seen
FEndMedia : Int64; // And likewise the end media
FReset : boolean; // Have media times been set
public
// Used to help with passing media times through graph
constructor Create(name: String; Unk: IUnknown; out hr: HRESULT; Pin: IPin); reintroduce;
destructor destroy; override;
function RegisterMediaTime(MediaSample: IMediaSample): HRESULT; overload;
function RegisterMediaTime(StartTime, EndTime: int64): HRESULT; overload;
function GetMediaTime(out StartTime, EndTime: int64): HRESULT; override;
function ResetMediaTime: HRESULT;
function EOS: HRESULT;
end;
// wrapper for event objects
TBCAMEvent = class
protected
FEvent: THANDLE;
public
constructor Create(ManualReset: boolean = false);
destructor destroy; override;
property Handle: THandle read FEvent;
procedure SetEv;
function Wait(Timeout: Cardinal = INFINITE): boolean;
procedure Reset;
function Check: boolean;
end;
TBCTimeoutEvent = TBCAMEvent;
// wrapper for event objects that do message processing
// This adds ONE method to the CAMEvent object to allow sent
// messages to be processed while waiting
TBCAMMsgEvent = class(TBCAMEvent)
public
// Allow SEND messages to be processed while waiting
function WaitMsg(Timeout: DWord = INFINITE): boolean;
end;
// support for a worker thread
// simple thread class supports creation of worker thread, synchronization
// and communication. Can be derived to simplify parameter passing
TThreadProc = function: DWORD of object;
TBCAMThread = class
private
FEventSend: TBCAMEvent;
FEventComplete: TBCAMEvent;
FParam: DWord;
FReturnVal: DWord;
FThreadProc: TThreadProc;
protected
FThread: THandle;
// thread will run this function on startup
// must be supplied by derived class
function ThreadProc: DWord; virtual;
public
FAccessLock: TBCCritSec; // locks access by client threads
FWorkerLock: TBCCritSec; // locks access to shared objects
constructor Create;
destructor Destroy; override;
// thread initially runs this. param is actually 'this'. function
// just gets this and calls ThreadProc
function InitialThreadProc(p: Pointer): DWORD; virtual; stdcall; // WINAPI;
// start thread running - error if already running
function Create_: boolean;
// signal the thread, and block for a response
//
function CallWorker(Param: DWORD): DWORD;
// accessor thread calls this when done with thread (having told thread
// to exit)
procedure Close;
// ThreadExists
// Return True if the thread exists. FALSE otherwise
function ThreadExists: boolean; // const
// wait for the next request
function GetRequest: DWORD;
// is there a request?
function CheckRequest(Param: PDWORD): boolean;
// reply to the request
procedure Reply(v: DWORD);
// If you want to do WaitForMultipleObjects you'll need to include
// this handle in your wait list or you won't be responsive
function GetRequestHandle: THANDLE;
// Find out what the request was
function GetRequestParam: DWORD;
// call CoInitializeEx (COINIT_DISABLE_OLE1DDE) if
// available. S_FALSE means it's not available.
class function CoInitializeHelper: HRESULT;
end;
TBCRenderedInputPin = class(TBCBaseInputPin)
private
procedure DoCompleteHandling;
protected
// Member variables to track state
FAtEndOfStream : boolean; // Set by EndOfStream
FCompleteNotified : boolean; // Set when we notify for EC_COMPLETE
public
constructor Create(ObjectName: string; Filter: TBCBaseFilter;
Lock: TBCCritSec; out hr: HRESULT; Name: WideString);
// Override methods to track end of stream state
function EndOfStream: HRESULT; override; stdcall;
function EndFlush: HRESULT; override; stdcall;
function Active: HRESULT; override;
function Run(Start: TReferenceTime): HRESULT; override;
end;
(* A generic list of pointers to objects.
No storage management or copying is
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -