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

Delphi控件源码

开发平台:

Delphi

  1. unit StreamOutPin;
  2.    (*********************************************************************
  3.     * The contents of this file are used with permission, subject to    *
  4.     * the Mozilla Public License Version 1.1 (the "License"); you may   *
  5.     * not use this file except in compliance with the License. You may  *
  6.     * obtain a copy of the License at                                   *
  7.     * http://www.mozilla.org/MPL/MPL-1.1.html                           *
  8.     *                                                                   *
  9.     * Software distributed under the License is distributed on an       *
  10.     * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or    *
  11.     * implied. See the License for the specific language governing      *
  12.     * rights and limitations under the License.                         *
  13.     *                                                                   *
  14.     * (C) 2004 Martin Offenwanger: coder@dsplayer.de                    *
  15.     *********************************************************************)
  16. {
  17. @author(Martin Offenwanger: coder@dsplayer.de)
  18. @created(Apr 22, 2004)
  19. @lastmod(Sep 09, 2004)
  20. }
  21. interface
  22. uses AsyncReader, BaseClass, DirectShow9, ActiveX, SysUtils;
  23. type
  24.   TStreamOutPin = class(TBCBasePin, IAsyncReader)
  25.   private
  26.     FFilter: TBCBaseFilter;
  27.     FIO: TAsyncIO;
  28.     FURLMode: boolean;
  29.     FQueriedForAsyncReader: boolean;
  30.   protected
  31.     (*** IAsyncReader methods used as a Property ***)
  32.     property IO: TAsyncIO read FIO implements IAsyncReader;
  33.   public
  34.     constructor Create(ObjectName: string; Filter: TBCBaseFilter;
  35.       Lock: TBCCritSec; out hr: HRESULT; Name: WideString; AStream: IStream;
  36.       FwdOnly: boolean = false; const StreamSize: Int64 = 0;
  37.       Loadstream: boolean = false; URLMode: boolean = false);
  38.     // calling the destructor causes crashes, may a bug in BaseClasses
  39.     // or a iusse with release
  40.     destructor Destroy; override;
  41.     // destroy all member objects of the pin with this procedure
  42.     procedure FreeAllObjects;
  43.     // the graph object for full control during buffering URL stream
  44.     procedure setActiveGraph(var f_FilterGraph: IFilterGraph);
  45.     // TBCBasePin Methods
  46.     function CheckMediaType(mt: PAMMediaType): HRESULT; override;
  47.     function CheckConnect(Pin: IPin): HRESULT; override;
  48.     function CompleteConnect(ReceivePin: IPin): HRESULT; override;
  49.     function GetMediaType(Position: Integer;
  50.       out MediaType: PAMMediaType): HRESULT; override;
  51.     function BeginFlush: HRESULT; override; stdcall;
  52.     function EndFlush: HRESULT; override; stdcall;
  53.     function NonDelegatingQueryInterface(const IID: TGUID;
  54.       out Obj): HRESULT; override; stdcall;
  55.     function BreakConnect: HRESULT; override;
  56.     // URL
  57.     procedure DoConnect(Adress: string; Port: string; Location: string;
  58.       MetaData: boolean);
  59.   end;
  60. implementation
  61. uses config;
  62. procedure TStreamOutPin.setActiveGraph(var f_FilterGraph: IFilterGraph);
  63. begin
  64.   FIO.setActiveGraph(f_FilterGraph);
  65. end;
  66. procedure TStreamOutPin.DoConnect(Adress: string; Port: string;
  67.   Location: string; MetaData: boolean);
  68. begin
  69.   FIO.Connect(Adress, Port, Location, MetaData);
  70.   FURLMode := true;
  71. end;
  72. function TStreamOutPin.CheckMediaType(mt: PAMMediaType): HRESULT;
  73. begin
  74.   if FURLMode then
  75.   begin
  76.     if GFStringQueue = nil then
  77.     begin
  78.       Result := S_FALSE;
  79.       exit;
  80.     end;
  81.   end;
  82.   if IsEqualGUID(mt.majortype, MEDIATYPE_Stream) then
  83.   begin
  84.     Result := S_OK;
  85.   end
  86.   else
  87.     Result := S_FALSE;
  88. end;
  89. constructor TStreamOutPin.Create(ObjectName: string; Filter: TBCBaseFilter;
  90.   Lock: TBCCritSec; out hr: HRESULT; Name: WideString; AStream: IStream;
  91.   FwdOnly: boolean = false; const StreamSize: Int64 = 0;
  92.   Loadstream: boolean = false; URLMode: boolean = false);
  93. begin
  94.   FFilter := Filter;
  95.   GFConnected := false;
  96.   FURLMode := false;
  97.   inherited Create(ObjectName, Filter, Lock, hr, Name, PINDIR_OUTPUT);
  98.   if Loadstream then
  99.   begin
  100.     if URLMode then
  101.       FIO := TAsyncIO.Create(AStream, FwdOnly, StreamSize, true)
  102.     else
  103.       FIO := TAsyncIO.Create(AStream, FwdOnly, StreamSize);
  104.     FIO.AddRef;
  105.   end;
  106. end;
  107. destructor TStreamOutPin.Destroy;
  108. begin
  109.   FIO.Release;
  110.   inherited Destroy;
  111. end;
  112. procedure TStreamOutPin.FreeAllObjects;
  113. begin
  114.   FIO.freeAllObjects;
  115. end;
  116. function TStreamOutPin.BeginFlush: HRESULT;
  117. begin
  118.   Result := FIO.BeginFlush;
  119. end;
  120. function TStreamOutPin.EndFlush: HRESULT;
  121. begin
  122.   Result := FIO.EndFlush;
  123. end;
  124. function TStreamOutPin.GetMediaType(Position: Integer;
  125.   out MediaType: PAMMediaType): HRESULT;
  126. begin
  127.   MediaType.majortype := MEDIATYPE_Stream;
  128.   Result := S_OK;
  129.   GFMayjorType := GUIDToString(MEDIATYPE_Stream);
  130.   if (Position >= 0) and (Position <= High(ProposedTypes)) then
  131.     MediaType.subtype := ProposedTypes[Position]^
  132.   else
  133.     Result := VFW_S_NO_MORE_ITEMS;
  134. end;
  135. function TStreamOutPin.CheckConnect(Pin: IPin): HRESULT;
  136. begin
  137.   FQueriedForAsyncReader := false;
  138.   Result := inherited CheckConnect(Pin);
  139. end;
  140. function TStreamOutPin.CompleteConnect(ReceivePin: IPin): HRESULT;
  141. begin
  142.   GFConnected := true;
  143.   if (FQueriedForAsyncReader) then
  144.     Result := inherited CompleteConnect(ReceivePin)
  145.   else
  146.     Result := VFW_E_NO_TRANSPORT;
  147. end;
  148. function TStreamOutPin.NonDelegatingQueryInterface(const IID: TGUID;
  149.   out Obj): HRESULT;
  150. begin
  151.   if IsEqualGUID(IID, IID_IAsyncReader) then
  152.     FQueriedForAsyncReader := true;
  153.   Result := inherited NonDelegatingQueryInterface(IID, Obj);
  154. end;
  155. function TStreamOutPin.BreakConnect: HRESULT;
  156. begin
  157.   FQueriedForAsyncReader := false;
  158.   Result := inherited BreakConnect;
  159. end;
  160. end.