亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? filter.pas

?? 為Delphi2005做了改動 DSPack 2.3.3 (Sep 2004). DSPack is a set of Components and class to write Multimedia
?? PAS
字號:
unit Filter;

   (*********************************************************************
    * The contents of this file are used with permission, subject to    *
    * the Mozilla Public License Version 1.1 (the "License"); you may   *
    * not use this file except in compliance with the License. You may  *
    * obtain a copy of the License at                                   *
    * http://www.mozilla.org/MPL/MPL-1.1.html                           *
    *                                                                   *
    * Software distributed under the License is distributed on an       *
    * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or    *
    * implied. See the License for the specific language governing      *
    * rights and limitations under the License.                         *
    *                                                                   *
    * (C) 2004 Martin Offenwanger: coder@dsplayer.de                    *
    *********************************************************************)
{
@author(Martin Offenwanger: coder@dsplayer.de)
@created(Apr 22, 2004)
@lastmod(Sep 09, 2004)
}

interface

uses
  WorkerThread, ICYParser, ActiveX, Classes, DirectShow9, BaseClass, Windows,
  Config, StringQueue, Forms;

type
  TAsyncEx = class(TBCBaseFilter, IFileSourceFilter, IAsyncExControl)
  private
    // the actual playback location "supported: URL, File, stream"
    FFileName: string;
    // all loaded filtes will be wrapped into a Filestream
    FFilestream: TFileStream;
    // Basepin Object
    FPin: TBCBasePin;
    FLock: TBCCritSec;
    FStreamsize: int64;
    // Pin state flag
    FPinActive: boolean;
    // Prebuffer loop flag
    Fexitloop: boolean;
    // Ripper Flag
    FRipstream: boolean;
    FPath: string;
    FFile: string;
    function GetOutPin: IPin;
    // creates a Filter pin if streamEnabled=true (URL or IStream)
    procedure CreateFilterPin(AStream: IStream; StreamEnabled: boolean = false;
      URLPin: boolean = false); overload;
    // helper function
    function ParseUrl(Url: string; out host: string; out port: string;
      out Location: string): boolean;
  public
    constructor CreateFromFactory(Factory: TBCClassFactory;
      const Controller: IUnknown); override;
    destructor Destroy; override;
    function GetPin(n: Integer): TBCBasePin; override;
    function GetPinCount: Integer; override;
    function Run(tStart: TReferenceTime): HRESULT; override; stdcall;
    function NonDelegatingRelease: Integer; override; stdcall;
    // IFileSourceFilter
    function Load(pszFileName: PWCHAR;
      const pmt: PAMMediaType): HRESULT; stdcall;
    function GetCurFile(out ppszFileName: PWideChar;
      pmt: PAMMediaType): HRESULT; stdcall;
    // IDSPlayerAsyncSourceControl
    function SetLoadFromStream(Stream: IStream; Length: int64): HRESULT;
      stdcall;
    function SetConnectToIp(Host: PChar; Port: PChar; Location: PChar;
      PreBuffersize: integer; MetaData: LongBool): HRESULT; stdcall;
    function SetConnectToURL(URL: PChar; PreBuffersize: integer;
      MetaData: LongBool): HRESULT; stdcall;
    function SetBuffersize(BufferSize: integer): HRESULT; stdcall;
    function GetBuffersize(out BufferSize: integer): HRESULT; stdcall;
    function SetRipStream(Ripstream: LongBool; Path: PChar;
      Filename: PChar): HRESULT; stdcall;
    function GetRipStream(out Ripstream: LongBool;
      out FileO: PChar): HRESULT; stdcall;
    function SetCallBack(CallBack: IAsyncExCallBack): HRESULT; stdcall;
    function FreeCallback(): HRESULT; stdcall;
    function ExitAllLoops(): HRESULT; stdcall;
    // properties
    property OutPin: IPin read GetOutPin;
  end;

implementation

uses
  SysUtils, StreamOutPin;

function TAsyncEx.ExitAllLoops(): HRESULT; stdcall;
begin
   //     FLock.Lock;
        GFExit := true;
   //     FLock.UnLock;
end;

function TAsyncEx.Run(tStart: TReferenceTime): HRESULT; stdcall;
begin
  if (FGRaph <> nil) and (FPin <> nil) and (GFConnected) then
  begin
    TStreamOutPin(FPin).setActiveGraph(FGRaph);
    RESULT := S_OK;
  end
  else
    RESULT := E_FAIL;
end;

// IDSPlayerAsyncSourceControl begin

function TAsyncEx.SetConnectToURL(URL: PChar; PreBuffersize: integer; MetaData:
  LongBool): HRESULT; stdcall;
var
  Host, Port, Location, URLO: string;
begin
  FLock.lock;
  URLO := copy(URL, 1, length(URL));
  if not ParseUrl(URLO, Host, Port, Location) then
  begin
    result := E_FAIL;
    exit;
  end;
  FLock.unlock;
  result := SetConnectToIp(PChar(Host), PChar(Port), PChar(Location),
    PreBuffersize, MetaData);
end;

function TAsyncEx.SetConnectToIp(Host: PChar; Port: PChar; Location: PChar;
  PreBuffersize: integer; MetaData: LongBool): HRESULT; stdcall;
var
  Datawritten: boolean;
  Application: TApplication;
  i: integer;
  Buffer: string;
  Avdata: int64;
begin
  if GFExit then
  begin
    Result := E_FAIL;
    exit;
  end;
  if GFConnected then
  begin
    Result := E_FAIL;
    exit;
  end;
  try
    FLock.Lock;
    GFPreBufferSize := PreBuffersize;
    GFStringQueue := TStringQueue.Create;
    Datawritten := false;
    Application := TApplication.Create(nil);
    i := 0;
    Avdata := 0;
    Buffer := '';
    GFFileName := 'N/A';
    if GFExit then
    begin
      Result := E_FAIL;
      exit;
    end;
    if GFConnected then
    begin
      Result := E_FAIL;
      exit;
    end;
    CreateFilterPin(TStreamAdapter.Create(nil, soOwned), true, true);
    if FPin <> nil then
      TStreamOutPin(FPin).DoConnect(copy(Host, 0, system.length(Host)),
        copy(Port, 0, system.length(Port)),
        copy(Location, 0, system.length(Location)),
        MetaData);
    SetRipStream(FRipstream, PChar(FPath), PChar(FFile));

    while not Datawritten do
    begin
      if GFExit then
      begin
        Result := E_FAIL;
        FLock.UnLock;
        exit;
      end;
      if g_threadedShoutcastStream = nil then
      begin
        Result := E_FAIL;
        FLock.UnLock;
        exit;
      end;
      if GFStringQueue = nil then
      begin
        Result := E_FAIL;
        FLock.UnLock;
        exit;
      end;
      Sleep(1);
      if GFConnected then
      begin
        Result := E_FAIL;
        FLock.UnLock;
        exit;
      end;

      if (GFFilterCallBack <> nil) and
        (PreBuffersize > 0) and
        (g_threadedShoutcastStream <> nil) then
        GFFilterCallBack.AsyncExFilterState(false, true, false,
          false, (trunc((Avdata * 100) / PreBuffersize)));

      Application.ProcessMessages;

      if GFExit then
      begin
        result := E_FAIL;
        Application.Destroy;
        FLock.UnLock;
        exit;
      end
      else if GFStringQueue = nil then
      begin
        Result := E_FAIL;
        Application.Destroy;
        FLock.UnLock;
        exit;
      end;
      if GFStringQueue.getcount > i then
      begin
        Buffer := Buffer + GFStringQueue.getitem(i);
        inc(i);
      end;
      if (PreBuffersize <= Avdata) then
        Datawritten := true
      else
        Avdata := system.length(Buffer);
    end;
    Application.Destroy;
    Result := S_OK;
  except
    result := E_FAIL;
  end;
  FLock.UnLock;
end;

function TAsyncEx.SetBuffersize(BufferSize: integer): HRESULT; stdcall;
begin
  Result := S_OK;
  { if the buffersize is too small and when the min buffersize is not available
    the min buffersize will be automaticly set in TAsyncIO.SyncRead.
    Reason: at this point the min buffersize might not known }
  if GFMinBuffersize < BufferSize then
    // copy the value is slower but more savety to prevent crashes
    GFBufferSize := strtoint(copy(inttostr(BufferSize), 1,
      length(inttostr(BufferSize))));
end;

function TAsyncEx.GetBuffersize(out BufferSize: integer): HRESULT; stdcall;
begin
  Result := S_OK;
  // copy the value is slower but more safety, to prevent crashes
  BufferSize := strtoint(copy(inttostr(GFBufferSize), 1,
    length(inttostr(GFBufferSize))));
end;

function TAsyncEx.SetRipStream(Ripstream: LongBool; Path: PChar;
  Filename: PChar): HRESULT; stdcall;
begin
  FRipstream := Ripstream;
  FPath := copy(Path, 1, length(Path));
  FFile := copy(
    FFilename, 1, length(Filename));
  RESULT := S_OK;
  if g_threadedShoutcastStream <> nil then
  begin
    g_threadedShoutcastStream.SetRipStream(Ripstream, Path, FFile);
    RESULT := S_OK;
  end;
end;

// TAsyncEx.GetRipStream is not implemented yet

function TAsyncEx.GetRipStream(out Ripstream: LongBool;
  out FileO: PChar): HRESULT; stdcall;
var
  fileL: string;
  {*l_ripstream: boolean;*}
begin
  fileL := '';
  {*l_ripstream := false;*}
  RESULT := E_FAIL;
  {*  if g_shoutCastStream <> nil then
      begin
                g_shoutCastStream.get_ripStream(l_ripstream,l_file);
                Ripstream := l_ripstream;
                FileO := copy(l_file,1,length(l_file));
                RESULT := S_OK;
      end;   *}
end;

function TAsyncEx.SetLoadFromStream(Stream: IStream; Length: int64): HRESULT; stdcall;
begin
  FStreamsize := Length;
  CreateFilterPin(Stream, true);
//  CreateFilterPin(TStreamAdapter.Create(@Stream, soOwned), true);
  GFFileName := 'In TStream Mode is Filename not available';
  Result := S_OK;
end;

function TAsyncEx.SetCallBack(CallBack: IAsyncExCallBack): HRESULT; stdcall;
begin
  GFFilterCallBack := CallBack;
  Result := S_OK;
end;

function TAsyncEx.FreeCallback(): HRESULT; stdcall;
begin
  if Assigned(GFFilterCallBack) then
  begin
    GFFilterCallBack.AsyncExICYNotice(ICYName, 'N/A');
    GFFilterCallBack.AsyncExICYNotice(ICYGenre, 'N/A');
    GFFilterCallBack.AsyncExICYNotice(ICYURL, 'N/A');
    GFFilterCallBack.AsyncExICYNotice(ICYBitrate, 'N/A');
    GFFilterCallBack.AsyncExFilterState(false, false, false, false, 0);
    GFFilterCallBack := nil;
  end;
  result := S_OK;
end;
// IDSPlayerAsyncSourceControl end

// IFileSourceFilter begin

function TAsyncEx.Load(pszFileName: PWCHAR;
  const pmt: PAMMediaType): HRESULT; stdcall;
begin
  if Length(pszFileName) > MAX_PATH then
  begin
    result := ERROR_FILENAME_EXCED_RANGE;
    exit;
  end;
  FFileName := GCFFilterID + ' (' + ExtractFileName(pszFileName) + ')';
  FFilestream := TFileStream.Create(pszFileName, fmOpenRead or
    fmShareDenyWrite);
  FStreamsize := FFilestream.Size;
  CreateFilterPin(TStreamAdapter.Create(FFilestream, soOwned), true);
  GFFileName := pszFileName;
  if FFileName = pszFileName then
    Result := E_OUTOFMEMORY
  else
    result := S_OK;
end;

function TAsyncEx.GetCurFile(out ppszFileName: PWideChar;
  pmt: PAMMediaType): HRESULT;
begin
  // no need to set a Mediatype at this point
  ppszFileName := StringToOleStr(copy(FFileName, 1, Length(FFileName)));
  result := S_OK;
end;
// IFileSourceFilter end

constructor TAsyncEx.CreateFromFactory(Factory: TBCClassFactory;
  const Controller: IUnknown);
begin
  inherited CreateFromFactory(Factory, Controller);
  FLock := TBCCritSec.Create;
  FFilestream := nil;
  FFile := '';
  g_threadedShoutcastStream := nil;
  GFFilterCallBack := nil;
  // 300kb as default
  GFBufferSize := 300 * 1000;
  GFMinBuffersize := 0;
  GFStringQueue := nil;
  GFConnected := false;
  GFStreamLength := 0;
  GFFileName := '';
  GFMayjorType := '';
  Fexitloop := false;
  GFExit := false;
  // create the Filter Pin without Stream (blank pin)
  CreateFilterPin(TStreamAdapter.Create(TMemoryStream.Create, soOwned), false);
end;

procedure TAsyncEx.CreateFilterPin(AStream: IStream;
  streamEnabled: boolean = false; URLPin: boolean = false);
var
  Hr: HRESULT;
begin
  inherited Create(GCFFilterID, nil, TBCCritSec.Create, GUID_NULL, Hr);
  if streamEnabled then
  begin
    if URLPin then
      // create a URL stream pin
      FPin := TStreamOutPin.Create(GCFPinID, Self, FLock, Hr,
        GCFPinID, nil, true, 0, true, true)
    else
      // create a filestream pin
      FPin := TStreamOutPin.Create(GCFPinID, Self, FLock, Hr,
        GCFPinID, AStream, true, FStreamsize, true);
    // maintain a ref on the pin
    FPin.NonDelegatingAddRef;
    // destructor flag
    FPinActive := true;
  end
  else
  begin
    FPin := nil;
    FPinActive := false;
  end;
end;

destructor TAsyncEx.Destroy;
begin
  GFExit := true;

  if FFilestream <> nil then
  begin
    FFilestream.Destroy;
    FFilestream := nil;
  end;

  if g_threadedShoutcastStream <> nil then
  begin
    g_threadedShoutcastStream.Destroy;
    g_threadedShoutcastStream := nil;
  end;

  if GFStringQueue <> nil then
  begin
    GFStringQueue.Destroy;
    GFStringQueue := nil;
  end;
  if FPinActive then
    TStreamOutPin(FPin).FreeAllObjects;

  FLock.Destroy;
end;

function TAsyncEx.GetOutPin: IPin;
begin
  if FPin <> nil then
    Result := FPin;
end;

function TAsyncEx.GetPin(n: Integer): TBCBasePin;
begin
  if n = 0 then
    Result := FPin
  else
    Result := nil;
end;

function TAsyncEx.GetPinCount: Integer;
begin
  if FPin <> nil then
    Result := 1
  else
    Result := 0;
end;

function TAsyncEx.NonDelegatingRelease: Integer;
begin
  Result := inherited NonDelegatingRelease;
  if Result = 1 then
    // the pin has a ref on us, "if FPin <> nil" then release it
    if FPin <> nil then
      FPin.NonDelegatingRelease;
end;

// helper functions

function TAsyncEx.ParseUrl(URL: string; out Host: string; out Port: string;
  out Location: string): boolean;
var
  Pos1: integer;
  Pos2: integer;
  Temp: string;
begin
  result := false;
  if length(URL) = 0 then
    exit;
  // check for http string
  Pos1 := pos('http://', URL);
  if Pos1 = 0 then
    exit;
  result := true;
  Temp := copy(URL, Pos1 + length('http://'), length(URL) - Pos1);
  // look for port offset
  Pos1 := pos(':', Temp);
  // check if a port is given
  if Pos1 = 0 then
  begin
    // no port.. , set def. port and location
    Host := Temp;
    Port := '80';
    Location := '/';
    exit;
  end;
  Host := copy(Temp, 1, Pos1 - 1);
  // look for location offset
  Pos2 := pos('/', Temp);
  // check if location is given
  if Pos2 = 0 then
  begin
    // no location.. , set def. location
    Temp := copy(Temp, Pos1 + 1, length(Temp) - Pos1);
    Port := Temp;
    Location := '/';
    exit;
  end;
  Port := copy(Temp, Pos1 + 1, Pos2 - Pos1 - 1);
  Location := copy(Temp, Pos2, length(Temp) - Pos2 + 1);
end;

initialization
  TBCClassFactory.CreateFilter(TAsyncEx, GCFFilterID, CLSID_AsyncEx,
    CLSID_LegacyAmFilterCategory, MERIT_DO_NOT_USE, 1, @Pins);

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩你懂的| 国产亚洲综合性久久久影院| 欧美人体做爰大胆视频| 精品区一区二区| 中文字幕日韩精品一区| 丝袜脚交一区二区| 丁香亚洲综合激情啪啪综合| 在线播放国产精品二区一二区四区| 久久精品夜色噜噜亚洲a∨| 亚洲午夜在线电影| 成人动漫中文字幕| 精品欧美黑人一区二区三区| 亚洲一线二线三线视频| 国产精品99久久久| 这里只有精品免费| 一二三区精品福利视频| 国产高清不卡一区二区| 日韩一区二区在线看| 亚洲一级二级在线| 91视频观看视频| 久久久久国产精品人| 热久久久久久久| 欧美午夜视频网站| 亚洲欧美日韩在线播放| 成人一区二区视频| 久久精品一区二区| 国产尤物一区二区| 精品国精品自拍自在线| 奇米亚洲午夜久久精品| 9191成人精品久久| 日韩综合小视频| 欧美日韩二区三区| 午夜欧美在线一二页| 久久综合久久99| 日韩中文字幕一区二区三区| 欧美三级电影精品| 亚洲伊人伊色伊影伊综合网| 在线观看不卡一区| 悠悠色在线精品| 在线视频一区二区三区| 亚洲一区二区三区在线| 色88888久久久久久影院野外 | 麻豆专区一区二区三区四区五区| 欧美性三三影院| 午夜精品福利视频网站| 欧美日韩中文字幕一区二区| 亚洲国产欧美在线| 欧美二区三区91| 奇米精品一区二区三区四区| 日韩久久久久久| 激情五月婷婷综合网| 久久久99免费| 91免费视频大全| 午夜在线电影亚洲一区| 欧美一区二区在线免费观看| 久久99精品国产麻豆婷婷洗澡| 久久综合网色—综合色88| 丁香啪啪综合成人亚洲小说| 成人免费在线观看入口| 欧美视频中文一区二区三区在线观看| 午夜视频一区二区| 日韩小视频在线观看专区| 国产精品996| 一区二区三区在线观看欧美 | 国产成人99久久亚洲综合精品| 国产精品三级av在线播放| 色哦色哦哦色天天综合| 丝袜国产日韩另类美女| 久久久亚洲精品一区二区三区| 成人h动漫精品| 亚洲国产精品一区二区www| 日韩女优视频免费观看| av色综合久久天堂av综合| 天堂成人国产精品一区| 国产人久久人人人人爽| 91黄视频在线| 国产一区二三区| 亚洲在线视频网站| 久久伊99综合婷婷久久伊| 91麻豆精品在线观看| 免费三级欧美电影| 国产精品成人免费在线| 日韩一级精品视频在线观看| 99天天综合性| 国精产品一区一区三区mba视频 | 91精品在线观看入口| 国产不卡免费视频| 日韩国产欧美视频| 中文字幕一区免费在线观看| 91精品国产91久久久久久一区二区| 国产成人丝袜美腿| 日韩影视精彩在线| 亚洲色图在线播放| 久久久国际精品| 69p69国产精品| 色成年激情久久综合| 国产成人免费av在线| 日韩黄色片在线观看| 中文字幕综合网| 国产欧美视频一区二区| 91精品国产综合久久福利软件| 不卡欧美aaaaa| 国产乱码一区二区三区| 日韩精品欧美成人高清一区二区| 中文字幕亚洲视频| 中文字幕精品在线不卡| 精品国产一区二区在线观看| 91精品在线免费观看| 欧美性生活大片视频| 色综合天天在线| 不卡的看片网站| 大尺度一区二区| 国产精品一品视频| 韩国女主播一区| 久草中文综合在线| 久久99精品久久久久久国产越南| 偷偷要91色婷婷| 亚洲国产精品久久人人爱蜜臀| 亚洲免费av在线| 专区另类欧美日韩| 亚洲欧洲日韩av| 亚洲视频精选在线| 一级做a爱片久久| 依依成人综合视频| 亚洲国产成人91porn| 亚洲一二三四区| 性感美女极品91精品| 香蕉av福利精品导航| 日韩国产在线观看一区| 日本一道高清亚洲日美韩| 日韩不卡一区二区| 美女任你摸久久| 国精产品一区一区三区mba视频| 国内不卡的二区三区中文字幕 | 成人av网在线| 97久久精品人人做人人爽50路| 91一区二区三区在线观看| 色狠狠av一区二区三区| 欧美日韩亚洲国产综合| 7777精品伊人久久久大香线蕉 | 国产成人综合亚洲91猫咪| 国产成人精品免费| 91色|porny| 欧美精品丝袜中出| 久久欧美中文字幕| 亚洲视频免费在线观看| 天堂资源在线中文精品| 麻豆精品久久久| 粉嫩aⅴ一区二区三区四区五区| 99精品国产视频| 制服丝袜日韩国产| 国产日韩精品视频一区| 亚洲一区免费观看| 精品中文av资源站在线观看| 成人app软件下载大全免费| 在线精品国精品国产尤物884a| 日韩一级片网址| 中文字幕在线观看一区| 五月天丁香久久| 成人深夜福利app| 欧美三级视频在线| 国产视频在线观看一区二区三区| 亚洲视频一区二区免费在线观看| 日本成人中文字幕在线视频| 成人国产视频在线观看| 3atv在线一区二区三区| 欧美国产日韩一二三区| 午夜精彩视频在线观看不卡| 福利电影一区二区| 91精品国产综合久久久久久| 国产精品女人毛片| 美日韩一区二区三区| 色婷婷综合久久久中文字幕| 日韩一区二区三区视频在线 | 欧美日韩国产中文| 欧美国产日韩精品免费观看| 天天操天天色综合| 99久久精品国产导航| 久久蜜桃一区二区| 视频一区在线视频| 欧美专区日韩专区| 国产精品免费aⅴ片在线观看| 奇米色777欧美一区二区| 欧美怡红院视频| 中文字幕制服丝袜成人av| 国产一区二区三区四区五区入口 | 欧美日韩一区二区欧美激情| 国产精品毛片a∨一区二区三区| 另类欧美日韩国产在线| 精品视频一区 二区 三区| 亚洲欧美日本在线| 成人午夜私人影院| 久久精品欧美一区二区三区不卡| 男人的j进女人的j一区| 欧美久久婷婷综合色| 一区二区三区国产精品| 99在线视频精品| 国产精品久久久久桃色tv| 国产suv一区二区三区88区| 久久久综合网站|