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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? main.pas

?? 為Delphi2005做了改動(dòng) DSPack 2.3.3 (Sep 2004). DSPack is a set of Components and class to write Multimedia
?? PAS
字號(hào):
unit main;
{$DEFINE DEBUG}
interface
uses BaseClass, ActiveX, DirectShow9, Windows, DSUtil;

const

  CLSID_WavDest : TGUID = '{3C78B8E2-6C4D-11d1-ADE2-0000F8754B99}';

type

  TWavDestOutputPin = class(TBCTransformOutputPin)
  public
    constructor Create(Filter: TBCTransformFilter; out hr: HRESULT);
    function EnumMediaTypes(out ppEnum: IEnumMediaTypes): HRESULT; override; stdcall;
    function CheckMediaType(pmt: PAMMediaType): HRESULT; override;
  end;

  TWavDestFilter = class(TBCTransformFilter)
  private
    FWavData: Cardinal;
    FHeader : Cardinal;
  public
    constructor Create(Unk: IUnKnown; out hr: HRESULT);
    constructor CreateFromFactory(Factory: TBCClassFactory; const Controller: IUnknown); override;

    function Copy(Source, dest: IMediaSample): HRESULT;

    function Transform(pIn, pOut: IMediaSample): HRESULT; overload; override;
    function Receive(Sample: IMediaSample): HRESULT; override;

    function CheckInputType(mtIn: PAMMediaType): HRESULT; override;
    function CheckTransform(mtIn, mtOut: PAMMediaType): HRESULT; override;
    function GetMediaType(Position: integer; out MediaType: PAMMediaType): HRESULT; override;

    function DecideBufferSize(Alloc: IMemAllocator; Properties: PAllocatorProperties): HRESULT; override;

    function StartStreaming: HRESULT; override;
    function StopStreaming: HRESULT; override;

    function CompleteConnect(direction: TPINDIRECTION; ReceivePin: IPin): HRESULT; override;
  end;


implementation


{ TWavDestOutputPin }

function TWavDestOutputPin.CheckMediaType(pmt: PAMMediaType): HRESULT;
begin
  if IsEqualGUID(pmt.majortype, MEDIATYPE_Stream) and IsEqualGUID(pmt.subtype, MEDIASUBTYPE_WAVE) then
       result := S_OK
  else result := S_FALSE;
end;

constructor TWavDestOutputPin.Create(Filter: TBCTransformFilter;
  out hr: HRESULT);
begin
  inherited Create('WavDest output pin', Filter, hr, 'Out');
end;

function TWavDestOutputPin.EnumMediaTypes(
  out ppEnum: IEnumMediaTypes): HRESULT;
begin
  result := inherited EnumMediaTypes(ppEnum);
end;

{ TWavDestFilter }

function TWavDestFilter.CheckInputType(mtIn: PAMMediaType): HRESULT;
begin
  if IsEqualGUID(mtIn.formattype, FORMAT_WaveFormatEx) then
       result := S_OK
  else result := S_FALSE;
end;

function TWavDestFilter.CheckTransform(mtIn,
  mtOut: PAMMediaType): HRESULT;
begin
  result := CheckInputType(mtIn);
  if FAILED(result) then exit;
  result := NOERROR;
end;

function TWavDestFilter.CompleteConnect(direction: TPINDIRECTION;
  ReceivePin: IPin): HRESULT;
begin
  result := S_OK;
end;

function TWavDestFilter.Copy(Source, dest: IMediaSample): HRESULT;
var
  SourceBuffer, DestBuffer: PBYTE;
  SourceSize: LongInt;
  TimeStart, TimeEnd: TReferenceTime;
  MediaStart, MediaEnd: int64;
  MediaType: PAMMEDIATYPE;
  DataLength: Integer;
begin
  // Copy the sample data
  SourceSize := Source.GetActualDataLength;

{$ifdef DEBUG}
  ASSERT(Dest.GetSize >= SourceSize);
{$endif}

  Source.GetPointer(SourceBuffer);
  Dest.GetPointer(DestBuffer);

  CopyMemory(DestBuffer, SourceBuffer, SourceSize);

  // Copy the sample times

  if (NOERROR = Source.GetTime(TimeStart, TimeEnd)) then
    Dest.SetTime(@TimeStart, @TimeEnd);

  if (Source.GetMediaTime(MediaStart,MediaEnd) = NOERROR) then
    Dest.SetMediaTime(@MediaStart, @MediaEnd);

  // Copy the media type
  Source.GetMediaType(MediaType);
  Dest.SetMediaType(MediaType^);
  DeleteMediaType(MediaType);

  // Copy the actual data length
  DataLength := Source.GetActualDataLength;
  Dest.SetActualDataLength(DataLength);
  result := NOERROR;
end;

constructor TWavDestFilter.Create(Unk: IUnKnown; out hr: HRESULT);
var
  pOut: TWavDestOutputPin;
  pIn : TBCTransformInputPin;
begin
  inherited Create('WavDest filter', Unk, CLSID_WavDest);
  ASSERT(FOutput = nil);
  if SUCCEEDED(hr) then
  begin
      // Create an output pin so we can have control over the connection
      // media type.
      pOut := TWavDestOutputPin.Create(self, hr);
      if(pOut <> nil) then
        begin
          if SUCCEEDED(hr) then
               FOutput := pOut
          else pOut.Free;
        end
      else
        hr := E_OUTOFMEMORY;
      //
      // NOTE!: If we've created our own output pin we must also create
      // the input pin ourselves because the CTransformFilter base class
      // will create an extra output pin if the input pin wasn't created.
      //
      pIn := TBCTransformInputPin.Create('Transform input pin',
                                          self,  // Owner filter
                                          hr,    // Result code
                                          'In'); // Pin name
      // a failed return code should delete the object
      if (pIn <> nil) then
        begin
          if SUCCEEDED(hr) then
               FInput := pIn
          else pIn.Free;
        end
      else
        hr := E_OUTOFMEMORY;
  end;
end;

constructor TWavDestFilter.CreateFromFactory(Factory: TBCClassFactory; const Controller: IUnknown);
var hr: HRESULT;
begin
  Create(Controller, hr);
end;

function TWavDestFilter.DecideBufferSize(Alloc: IMemAllocator;
  Properties: PAllocatorProperties): HRESULT;
var
  InProps, Actual: TALLOCATORPROPERTIES;
  InAlloc: IMemAllocator;
begin
  // Is the input pin connected
  if not FInput.IsConnected then
    begin
      result := E_UNEXPECTED;
      exit;
    end;

  ASSERT(Alloc <> nil);
  ASSERT(Properties <> nil);

  Properties.cBuffers := 1;
  Properties.cbAlign  := 1;

  // Get input pin's allocator size and use that
  result := FInput.GetAllocator(InAlloc);
  if SUCCEEDED(result) then
  begin
    result := InAlloc.GetProperties(InProps);
    if SUCCEEDED(result) then
      Properties.cbBuffer := InProps.cbBuffer;
    InAlloc := nil;
  end;

  if FAILED(result) then exit;

  ASSERT(Properties.cbBuffer <> 0);

  // Ask the allocator to reserve us some sample memory, NOTE the function
  // can succeed (that is return NOERROR) but still not have allocated the
  // memory that we requested, so we must check we got whatever we wanted

  result := Alloc.SetProperties(Properties^, Actual);
  if FAILED(result) then exit;

  ASSERT(Actual.cBuffers = 1);

  if (Properties.cBuffers > Actual.cBuffers) or
     (Properties.cbBuffer > Actual.cbBuffer) then
  result := E_FAIL else
  result := NOERROR;
end;

function TWavDestFilter.GetMediaType(Position: integer;
  out MediaType: PAMMediaType): HRESULT;
begin
  ASSERT((Position = 0) or (Position = 1));
  if(Position = 0) then
  begin
    MediaType.majortype := MEDIATYPE_Stream;
    MediaType.Subtype   := MEDIASUBTYPE_WAVE;
    result := S_OK;
    exit;
  end;
  result := VFW_S_NO_MORE_ITEMS;
end;

function TWavDestFilter.Receive(Sample: IMediaSample): HRESULT;
var Old: Cardinal;
begin
  Old := FWavData;
  result := inherited Receive(Sample);
  // don't update the count if Deliver() downstream fails.
  if(result <> S_OK) then FWavData := Old;
end;

function TWavDestFilter.StartStreaming: HRESULT;
begin
  // leave space for the header
  FHeader := sizeof(TRIFFLIST) +
               sizeof(TRIFFCHUNK) +
               FInput.AMMEdiaType.cbFormat +
               sizeof(TRIFFCHUNK);

  FWavData := 0;
  result := S_OK;
end;

function TWavDestFilter.StopStreaming: HRESULT;
type TByteDynArray = array of Byte;
var
  Stream: IStream;
  DwnstrmInputPin: IPin;
  pb: PByte;
  RiffWave: PRIFFLIST;
  RiffFmt, RiffData : PRIFFCHUNK;
  li, newposition: Int64;
begin
    if not FOutput.IsConnected then
      begin
        result := E_FAIL;
        exit;
      end;

    DwnstrmInputPin := FOutput.GetConnected;

    if (DwnstrmInputPin = nil) then
      begin
        result := E_FAIL;
        exit;
      end;

    result := DwnstrmInputPin.QueryInterface(IStream, Stream);
    if SUCCEEDED(result) then
    begin
        GetMem(pb, FHeader);

        RiffWave := PRIFFLIST(pb);
        RiffFmt  := PRIFFCHUNK(Cardinal(RiffWave) + SizeOf(TRIFFLIST));
        RiffData := PRIFFCHUNK((Cardinal(RiffFmt) + SizeOf(TRIFFCHUNK)) + FInput.ammediatype.cbFormat);

        RiffData.fcc := FCC('data');
        RiffData.cb := FWavData;

        RiffFmt.fcc := FCC('fmt ');
        RiffFmt.cb  := FInput.AMMediaType.cbFormat;
        CopyMemory(Pointer(Cardinal(RiffFmt) + SizeOf(TRIFFCHUNK)), FInput.AMMediaType.pbFormat, RiffFmt.cb);

        RiffWave.fcc := FCC('RIFF');
        RiffWave.cb  := FWavData + FHeader - sizeof(TRIFFCHUNK);
        RiffWave.fccListType := FCC('WAVE');

        ZeroMemory(@li, sizeof(li));

        newposition := 0;
        result := Stream.Seek(li, STREAM_SEEK_SET, newposition);
        if SUCCEEDED(result) then
          result := Stream.Write(pb, FHeader, nil);
        Stream := nil;
        freemem(pb);
    end;
end;

function TWavDestFilter.Transform(pIn, pOut: IMediaSample): HRESULT;
var
  rtStart, rtEnd: TReferenceTime;
  Actual: Cardinal;
begin
  // First just copy the data to the output sample
  result := Copy(pIn, pOut);
  if FAILED(result) then exit;

  // Prepare it for writing
  Actual := pOut.GetActualDataLength;

  if (FWavData + FHeader + Actual) < (FWavData + FHeader ) then
    begin // overflow
      result := E_FAIL;
      exit;
    end;

  rtStart := FWavData + FHeader;
  rtEnd   := rtStart + Actual;
  FWavData := FWavData + Actual;

  ASSERT(pOut.SetTime(@rtStart, @rtEnd) = S_OK);

  result := S_OK;
end;

initialization
  TBCClassFactory.CreateFilter(TWavDestFilter, 'WAV Dest', CLSID_WavDest,
    CLSID_LegacyAmFilterCategory, MERIT_DO_NOT_USE, 0, nil);
end.

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕视频一区| 色噜噜狠狠成人网p站| 日韩欧美你懂的| 久草热8精品视频在线观看| 日韩午夜小视频| 国产在线乱码一区二区三区| 精品少妇一区二区三区在线视频 | 亚洲一区二区三区中文字幕在线| 色婷婷av一区| 日韩综合在线视频| 欧美不卡在线视频| 国产成人综合自拍| 亚洲视频香蕉人妖| 欧美日韩国产一二三| 麻豆久久一区二区| 国产欧美日韩精品一区| 91免费观看国产| 午夜久久久久久电影| 欧美tk—视频vk| 97精品国产97久久久久久久久久久久| 亚洲精品视频自拍| 欧美一区二区视频观看视频 | 国产欧美一区在线| 色婷婷综合久久| 九九国产精品视频| 亚洲视频1区2区| 日韩欧美国产一区二区三区| 国产成人精品一区二区三区四区 | 蜜桃视频在线一区| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 亚洲一区二区三区三| 日韩免费看的电影| 91在线观看高清| 久久成人免费电影| 亚洲综合色视频| 国产午夜精品在线观看| 在线观看国产一区二区| 国产最新精品精品你懂的| 亚洲男人天堂av| 久久久国产午夜精品| 欧美伊人久久久久久久久影院 | 亚洲国产综合在线| 久久久久久久久久电影| 欧美私模裸体表演在线观看| 国产精品一级二级三级| 日韩成人av影视| 亚洲视频一二三| 久久久精品黄色| 欧美一卡二卡三卡四卡| 色婷婷国产精品| 成人一区二区三区在线观看| 日本欧美一区二区| 亚洲女爱视频在线| 国产性色一区二区| 日韩精品一区二区在线| 欧洲精品在线观看| av在线这里只有精品| 精品一区二区免费视频| 亚洲国产精品一区二区久久| 国产精品电影院| 国产亚洲一本大道中文在线| 欧美一级xxx| 欧美日韩中文一区| 色欧美日韩亚洲| 91色婷婷久久久久合中文| 成人午夜伦理影院| 国产不卡视频一区| 国产精品一线二线三线| 久久丁香综合五月国产三级网站| 亚洲午夜精品久久久久久久久| 日韩理论电影院| 亚洲色欲色欲www| 国产精品萝li| 国产精品女主播在线观看| 久久众筹精品私拍模特| 精品久久久久久久久久久久久久久久久 | 日韩美女天天操| 日韩一区二区三区电影在线观看| 欧美日韩aaa| 欧美精品一二三区| 7777精品伊人久久久大香线蕉完整版 | 国产在线播精品第三| 精品亚洲免费视频| 极品少妇一区二区| 久久国产成人午夜av影院| 麻豆国产精品一区二区三区 | 国产欧美1区2区3区| 国产精品网站在线观看| 久久精品一区二区| 国产精品乱码久久久久久| 国产精品污污网站在线观看 | 国产亚洲人成网站| 亚洲天堂免费看| 亚洲国产综合在线| 强制捆绑调教一区二区| 久久97超碰色| www.日韩av| 欧洲精品一区二区| 日韩欧美精品三级| 国产精品蜜臀av| 一区二区三区久久| 性久久久久久久久久久久| 美女视频一区在线观看| 国内精品伊人久久久久av一坑| 国产成+人+日韩+欧美+亚洲| av在线不卡免费看| 精品视频999| 亚洲精品一区二区三区精华液| 欧美激情一区二区三区四区| 亚洲欧洲日产国产综合网| 亚洲动漫第一页| 国产一区二区在线电影| 91日韩在线专区| 91精品国产色综合久久| 欧美韩国一区二区| 亚洲成人动漫在线观看| 国产精品1区二区.| 欧美三日本三级三级在线播放| 欧美xxxxx裸体时装秀| 国产精品福利一区二区三区| 视频一区视频二区中文| 成人免费视频播放| 欧美一二三四在线| 中文字幕亚洲视频| 男人的j进女人的j一区| 成人av电影免费在线播放| 欧美精品第一页| 国产精品美女久久久久久久网站| 舔着乳尖日韩一区| 99re6这里只有精品视频在线观看| 欧美久久久久免费| 一区二区中文视频| 精品一区免费av| 欧美在线观看视频一区二区| 国产女同互慰高潮91漫画| 日韩电影免费在线看| 色综合久久中文综合久久牛| 精品国产一区二区亚洲人成毛片 | 国产欧美精品一区二区色综合| 亚洲一二三区在线观看| 国产成人自拍网| 欧美一区二区三区四区久久| 亚洲精品乱码久久久久久久久 | 亚洲h动漫在线| 99久久精品国产麻豆演员表| 精品国产三级a在线观看| 亚洲成a天堂v人片| 91色|porny| 国产精品理论片| 国产不卡免费视频| 精品国产成人在线影院| 日日夜夜免费精品| 欧美综合在线视频| 亚洲国产成人私人影院tom| 国产精品网站导航| 免费高清在线视频一区·| 99riav一区二区三区| 久久久美女毛片| 极品少妇xxxx偷拍精品少妇| 9191久久久久久久久久久| 亚洲精品中文字幕乱码三区| 成人免费视频免费观看| 国产日韩欧美高清在线| 国产乱子伦视频一区二区三区| 日韩欧美电影一区| 免费国产亚洲视频| 欧美成人vps| 久久97超碰色| 久久久久久久久久久久久女国产乱 | 精品国产乱码久久久久久久| 日本不卡的三区四区五区| 欧美高清www午色夜在线视频| 亚洲制服丝袜在线| 欧美日韩免费视频| 午夜精品免费在线| 中文字幕 久热精品 视频在线 | 欧美日韩一区小说| 亚洲一区二区3| 欧美精品在线观看播放| 日韩成人av影视| 精品免费99久久| 国产一区二区三区日韩| 欧美高清在线视频| 99国产精品久久久久| 亚洲精品老司机| 欧美猛男男办公室激情| 美腿丝袜在线亚洲一区| 精品久久国产字幕高潮| 国产成人在线观看| 亚洲私人影院在线观看| 欧美日韩久久一区二区| 毛片一区二区三区| 国产精品三级av| 欧美色网站导航| 狠狠色丁香久久婷婷综合丁香| 国产日产精品1区| 91成人免费在线视频| 蜜臀精品一区二区三区在线观看| 久久先锋影音av| 色综合久久88色综合天天|