Main.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:5k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. // *****************************************************************************
  2. // Author: komarov andrey.
  3. // Email: komar@elecard.net.ru
  4. // This filter is a useful debugging tool. For example, you can verify,
  5. // bit by bit, the results of a transform filter. You can build a graph
  6. // manually by using GraphEdit, and connect the Dump filter to the output
  7. // of a transform filter or any other output pin.
  8. // *****************************************************************************
  9. unit Main;
  10. interface
  11. uses BaseClass, DirectShow9, ActiveX, Windows, classes, Dialogs, Sysutils;
  12. const CLSID_DumpNew : TGUID = '{62E78A56-7B3A-4CF0-B751-712B00C8E578}';
  13. MyPinType: TRegPinTypes =
  14.     (clsMajorType: @MEDIATYPE_NULL;
  15.      clsMinorType: @MEDIASUBTYPE_NULL);
  16. MyPins : array[0..0] of TRegFilterPins =
  17.     ((strName: 'Input'; bRendered: FALSE; bOutput: FALSE; bZero: FALSE; bMany: FALSE;
  18.       oFilter: nil; strConnectsToPin: nil; nMediaTypes: 1; lpMediaType: @MyPinType));
  19. Type
  20.   TDump = class;
  21.   TMyPin = Class (TBCRenderedInputPin)  //TBCBasePin
  22.   private
  23.     FLast: TReferenceTime;
  24.   {$IFDEF DEBUG}
  25.     FDump: TDump;
  26.   {$ENDIF}
  27.     FFile: integer;
  28.   public
  29.     mF:string;
  30.     constructor Create(ObjectName: string; pUnk: IUnKnown; Filter: TBCBaseFilter;
  31.       Lock: TBCCritSec; out hr: HRESULT; Name: WideString; mpFileN:string);
  32.     function CheckMediaType(mt: PAMMediaType): HRESULT; override;
  33.     function Receive(pSample: IMediaSample): HRESULT; override;
  34.     function EndOfStream: HRESULT; override;
  35.     function BreakConnect: HRESULT; override;
  36.     procedure OpenFile;
  37.     Procedure CloseFile;
  38.   end;
  39.   /////////////////// Dump Class ////////////////////
  40.   TDump = class (TBCBaseFilter,IFileSinkFilter)
  41.   private
  42.     xxx: integer;
  43.     yyy: integer;
  44.     FPin: TMyPin;
  45.     FfileName: String;
  46.   protected
  47.     function SetFileName(pszFileName: PWideChar; pmt: PAMMediaType): HRESULT; stdcall;
  48.     function GetCurFile(out ppszFileName: PWideChar; pmt: PAMMediaType): HRESULT; stdcall;
  49.   public
  50.     function Stop: HRESULT; override;
  51.     function Run(tStart: TReferenceTime): HRESULT; override;
  52.     function GetPin(n: Integer): TBCBasePin; override;
  53.     constructor Create(Name: string;           // Object description
  54.                       Unk : IUnKnown;         // IUnknown of delegating object
  55.                       Lock: TBCCritSec;       // Object who maintains lock
  56.                       const clsid: TGUID      // The clsid to be used to serialize this filter
  57.                       );
  58.     function GetPinCount: integer; override;
  59.   end;
  60. implementation
  61. procedure TMyPin.CloseFile;
  62. begin
  63.   FileClose(FFile);
  64. end;
  65. procedure TMyPin.OpenFile;
  66. begin
  67.   FFile := FileCreate(mF);
  68. end;
  69. constructor TMyPin.Create(ObjectName: string;pUnk: IUnKnown; Filter: TBCBaseFilter;
  70.       Lock: TBCCritSec; out hr: HRESULT; Name: WideString; mpFileN:string);
  71. begin
  72.   inherited Create(ObjectName, Filter, Lock, hr, Name);
  73.   mF := mpFileN;
  74.   OpenFile;
  75.   CloseFile;
  76.   FLast := 0;
  77. end;
  78. function TMyPin.BreakConnect: HRESULT;
  79. begin
  80.   result := inherited BreakConnect;
  81. end;
  82. function TDump.Stop: HRESULT;
  83. begin
  84.   FPin.CloseFile;
  85.   result := inherited Stop;
  86. end;
  87. function TMyPin.EndOfStream: HRESULT;
  88. begin
  89.  result := inherited EndOfStream;
  90. end;
  91. function TDump.Run(tStart: TReferenceTime): HRESULT;
  92. begin
  93.   FPin.OpenFile;
  94.   result := inherited Run(tStart);
  95. end;
  96. function TMyPin.Receive(pSample: IMediaSample): HRESULT;
  97. var
  98.   pbData: PBYTE;
  99.   tStart, tStop: TREFERENCETIME;
  100. begin
  101.   pSample.GetTime(tStart,tStop);
  102. {$IFDEF DEBUG}
  103.   DbgLog(FDump,'Komar');
  104. {$ENDIF}
  105.   pSample.GetPointer(pbData);
  106.   FileWrite(FFile, pbData^, pSample.GetActualDataLength);
  107.   result := S_OK;
  108. end;
  109. function TMyPin.CheckMediaType(mt: PAMMediaType): HRESULT;
  110. begin
  111.   result := S_OK;
  112. end;
  113. function TDump.GetPinCount: integer;
  114. begin
  115.   result := 1;
  116. end;
  117. constructor TDump.Create(Name: string;         // Object description
  118.                        Unk : IUnKnown;         // IUnknown of delegating object
  119.                        Lock: TBCCritSec;       // Object who maintains lock
  120.                        const clsid: TGUID      // The clsid to be used to serialize this filter
  121.                        );
  122. begin
  123.   inherited create(Name,Unk,Lock,CLSID_DumpNew);
  124. end;
  125. function TDump.GetPin(n: Integer): TBCBasePin;
  126. var
  127.   hr: HRESULT;
  128. begin
  129.   if (xxx = 0) then
  130.   begin
  131.     xxx := 1;
  132.     FPin := TMyPin.Create('Null input pin', GetOwner, self, TBCCritSec.Create, hr, 'Input', FfileName);//,PINDIR_INPUT);
  133.   end;
  134.   result := FPin;
  135. end;
  136. function TDump.SetFileName(pszFileName: PWideChar; pmt: PAMMediaType): HRESULT;
  137. begin
  138.   if Length(pszFileName) > MAX_PATH then
  139.   begin
  140.     result := ERROR_FILENAME_EXCED_RANGE;
  141.     exit;
  142.   end;
  143.   FFileName := copy(pszFileName, 1, Length(pszFileName));
  144.   if (yyy > 0) then
  145.   begin
  146.     FPin.CloseFile;
  147.     FPin.mF := FFileName;
  148.     FPin.OpenFile;
  149.     FPin.CloseFile;
  150.   end;
  151.   inc(YYY);
  152.   if FfileName = '' then
  153.     Result := E_OUTOFMEMORY
  154.   else
  155.     result:=S_OK;
  156. end;
  157. function TDump.GetCurFile(out ppszFileName: PWideChar; pmt: PAMMediaType): HRESULT;
  158. begin
  159.   ppszFileName := StringToOleStr(copy(FfileName, 1, Length(FfileName)));
  160.   pmt.majortype := MEDIATYPE_NULL;
  161.   pmt.subtype := MEDIASUBTYPE_NULL;
  162.   result := S_OK;
  163. end;
  164. initialization
  165.   TBCClassFactory.CreateFilter(TDump, 'Dump New', CLSID_DumpNew,
  166.     CLSID_LegacyAmFilterCategory, MERIT_DO_NOT_USE, 1, @MyPins);
  167. end.