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

Delphi控件源码

开发平台:

Delphi

  1. //------------------------------------------------------------------------------
  2. //
  3. // Desc: DirectShow sample code - header file for application using async
  4. //       filter.
  5. //
  6. // Portions created by Microsoft are
  7. // Copyright (c) 1992 - 2000, Microsoft Corporation.  All rights reserved.
  8. //------------------------------------------------------------------------------
  9. unit UMemFile;
  10. interface
  11. uses
  12.   Windows, SysUtils, DSUtil, BaseClass, DirectShow9, MMSystem, Math,
  13.   UAsyncIO, UAsyncRdr;
  14. type
  15.   //
  16.   //  Define an internal filter that wraps the base CBaseReader stuff
  17.   //
  18.   TBCMemFileStream = class(TBCAsyncStream)
  19.   private
  20.     FLock: TBCCritSec;
  21.     FData: PByte;
  22.     FLength: LONGLONG;
  23.     FPosition: LONGLONG;
  24.     FKBPerSec: DWord;
  25.     FTimeStart: DWord;
  26.   public
  27.     constructor Create(AData: PByte; ALength: LONGLONG;
  28.       AKBPerSec: DWord = Infinite);
  29.     destructor Destroy; override;
  30.     function SetPointer(APos: LONGLONG): HResult; override;
  31.     function Read(ABuffer: PByte; ABytesToRead: DWord;
  32.       AAlign: Boolean; out ABytesRead: DWord): HResult; override;
  33.     function Size(out ASizeAvailable: LONGLONG): LONGLONG; override;
  34.     function Alignment: DWord; override;
  35.     procedure Lock; override;
  36.     procedure Unlock; override;
  37.   end;
  38.   TBCMemFileReader = class(TBCAsyncReader)
  39.   public
  40.     //  We're not going to be CoCreate'd so we don't need registration
  41.     //  stuff etc
  42.     function Register: HResult; override; stdcall;
  43.     function UnRegister: HResult; override; stdcall;
  44.     // constructor and destructor
  45.     constructor Create(AStream: TBCMemFileStream; Amt: PAMMediaType;
  46.       out hr: HResult);
  47.   end;
  48. implementation
  49. // --- TBCMemFileStream ---
  50. constructor TBCMemFileStream.Create(AData: PByte; ALength: LONGLONG;
  51.   AKBPerSec: DWord = Infinite);
  52. begin
  53.   FData     := AData;
  54.   FLength   := ALength;
  55.   FPosition := 0;
  56.   FKBPerSec := AKBPerSec;
  57.   FTimeStart:= timeGetTime;
  58.   FLock := TBCCritSec.Create;
  59.   Inherited Create;
  60. end;
  61. destructor TBCMemFileStream.Destroy;
  62. begin
  63.   if Assigned(FLock) then
  64.     FreeAndNil(FLock);
  65.   Inherited Destroy;
  66. end;
  67. function TBCMemFileStream.SetPointer(APos: LONGLONG): HResult;
  68. begin
  69.   if (APos < 0) or (APos > FLength) then
  70.     Result := S_FALSE
  71.   else
  72.     begin
  73.       FPosition := APos;
  74.       Result := S_OK;
  75.     end;
  76. end;
  77. function TBCMemFileStream.Read(ABuffer: PByte; ABytesToRead: DWord;
  78.   AAlign: Boolean; out ABytesRead: DWord): HResult;
  79. var
  80.   _ReadLength, _Time, _TimeToArrive: DWord;
  81.   _Buffer: PByte;
  82. begin
  83.   FLock.Lock;
  84.   try
  85.     //  Wait until the bytes are here!
  86.     _Time := timeGetTime;
  87.     if (FPosition + ABytesToRead > FLength) then
  88.       _ReadLength := FLength - FPosition
  89.     else
  90.       _ReadLength := ABytesToRead;
  91.     if FKBPerSec = 0 then
  92.       _TimeToArrive :=  0
  93.     else
  94.       _TimeToArrive := (FPosition + _ReadLength) div FKBPerSec;
  95.     if (_Time - FTimeStart < _TimeToArrive) then
  96.       Sleep(_TimeToArrive - _Time + FTimeStart);
  97.     _Buffer := FData;
  98.     Inc(_Buffer, FPosition);
  99.     CopyMemory(ABuffer, _Buffer, _ReadLength);
  100.     Inc(FPosition, _ReadLength);
  101.     ABytesRead := _ReadLength;
  102.     Result := S_OK;
  103.   finally
  104.     FLock.UnLock;
  105.   end;
  106. end;
  107. function TBCMemFileStream.Size(out ASizeAvailable: LONGLONG): LONGLONG;
  108. var
  109.   _CurrentAvailable: LONGLONG;
  110. begin
  111.   _CurrentAvailable :=
  112.       Int32x32To64((timeGetTime - FTimeStart), FKBPerSec);
  113.   ASizeAvailable := Min(FLength, _CurrentAvailable);
  114.   Result := FLength;
  115. end;
  116. function TBCMemFileStream.Alignment: DWord;
  117. begin
  118.   Result := 1;
  119. end;
  120. procedure TBCMemFileStream.Lock;
  121. begin
  122.   FLock.Lock;
  123. end;
  124. procedure TBCMemFileStream.Unlock;
  125. begin
  126.   FLock.UnLock;
  127. end;
  128. // --- TBCMemFileReader ---
  129. constructor TBCMemFileReader.Create(AStream: TBCMemFileStream;
  130.   Amt: PAMMediaType; out hr: HResult);
  131. begin
  132.   Inherited Create('Mem reader', nil, AStream, hr);
  133.   CopyMemory(@Fmt, Amt, SizeOf(TAMMediaType));
  134. end;
  135. function TBCMemFileReader.Register: HResult;
  136. begin
  137.   Result := S_OK;
  138. end;
  139. function TBCMemFileReader.UnRegister: HResult;
  140. begin
  141.   Result := S_OK;
  142. end;
  143. end.