2012-01-06 22 views
4

DSPACK 구성 요소 라이브러리로 작성된 Delphi6 DirectShow 필터 (푸시 소스 비디오 필터)가 있습니다. 필자는 FillBuffer() 호출에서 대상 미디어 샘플에 수정 된 비트 맵을 출력하기 전에 비트 맵을 수정하는 간단한 코드에 대해 정말로 애처로운 문제를 겪고 있습니다. 코드는 아래와 같습니다.TBitmap에 대한 변경 사항은 Delphi 6 DirectShow 필터의 렌더링 된 이미지에 나타나지 않고 많은 소프트 페이지 오류를 생성합니다.

위에서 볼 수 있듯이 Byte 포인터를 사용하여 24 비트 비트 맵의 ​​RGB 값을 통과하는 간단한 루프가 두 개 있습니다. 이 코드는 DirectShow가 아닌 ​​테스트 응용 프로그램에있을 때 잘 동작했습니다. 그러나, 내 DirectShow 필터에서 사용되는 값에 관계없이 렌더링 된 비트 맵에서 변경 내용을 볼 수 없습니다. 심지어 모든 Byte를 0으로 설정하는 테스트 라인을 볼 수 있습니다. 나는 이미지를 수정하지 않은 채로 보았습니다. 팬텀 또는 손상된 비트 맵 객체가 없는지 확인하기 위해 비트 맵에 간단한 문장을 인쇄하는 줄을 추가했습니다. 문장 은 렌더링 된 비트 맵에으로 표시됩니다.

이 코드가 실행될 때 작업 관리자가보고 한대로 초당 페이지 수는입니다. 이 코드를 비활성화하면 소프트 페이지 오류가 사라집니다. 무엇이 코드를 그렇게 할 수 있습니까? 나는 루프를 추적하고 각 라인 이후에 Byte 값이 값을 변경하는 것을 보았지만 이미지는 영향을받지 않습니다.

마지막으로, Scanline을 사용하지 않고 픽셀 접근을하는 빠른 방법을 알고 있다면 알고 싶습니다. 나는 TBitmap.Scanline을 추적하고 FreeImage를 호출합니다. 내가 할 수 있다면 메모리 할당을 최소화하고 싶습니다. Synopse의 빠른 jpeg 디코더를 사용하고 TBitmap32 개체와 함께 작동하지 않기 때문에 GR32.TBitmap32를 사용할 수 없습니다.

UPDATE : 문제는 내가 주사선 속성에 액세스하기 전에 pf24Bit에 비트 맵의 ​​PixelFormat 속성을 설정하지 않은 것이 었습니다. 자세한 내용은이 스레드를 참조하십시오 : Pixel modifying code runs quick in main app, really slow in Delphi 6 DirectShow filter with other problems

procedure brightnessTurboBoost(var clip: TBitmap; rangeExpansionPowerOf2: integer; shiftValue: Byte); 
var 
    p0: PByte; 
    x,y: Integer; 
begin 
    if (rangeExpansionPowerOf2 = 0) and (shiftValue = 0) then 
     exit; // These parameter settings will not change the pixel values. 

    for y := 0 to clip.Height-1 do 
    begin 
     p0 := clip.scanline[y]; 

     // Can't just do the whole buffer as a big block of bytes since the 
     // individual scan lines may be padded for CPU alignment. 
     for x := 0 to (clip.Width - 1) * 3 do 
     begin 
      if rangeExpansionPowerOf2 >= 1 then 
       p0^ := IntToByte((p0^ shl rangeExpansionPowerOf2) + shiftValue) 
      else 
       p0^ := IntToByte(p0^ + shiftValue); 

// Test wiping the image (didn't work, still see image). 
// p0^ := 0; 
      Inc(p0); 
     end; 
    end; 

    clip.Canvas.TextOut(10, 10, 'HELLO THERE IS THERE ANYONE THERE?'); 
end; 
+0

@iamjoosy, DIB 스캔 라인? DWORD 경계에 있습니다. – OnTheFly

+2

페이지 결함은 정상입니다. 이것이 가상 메모리가 물리적 메모리에 의해 뒷받침되는 방법입니다. –

+0

@DavidHeffernan. 내가 본 전화 번호가 아니야. 코드에 표시된 루프가 켜지면 약 50,000의 작업 관리자에 PF 델타가 표시됩니다. 그리고 렌더링 된 이미지에서 픽셀 수정을 보지 못하는 문제가 여전히 있습니다. 내가 도울 수 없지만 문제가 관련 있다고 생각합니다. –

답변

1

그래서 당신은 TBitmap에 뒤로보다 IMediaSample 버퍼 데이터를 복사하는 방법을 정확하게? 실제로 가장 가능성있는 것은 다른 것보다 훨씬 가능성이 높습니다. 복사본을 변경하고 변경 사항을 다운 스트림으로 전달하는 버퍼로 되돌려 보내지 않는 것입니다. 또한 처리의 부작용으로 페이지 폴트를 치는 경우 (이미지 데이터를 앞뒤로 변환하는 동안 과도한 내부 메모리 할당 등).

+0

하지만 어떻게 든 잘못된 비트 맵 변수 (복사본 또는 일부 등)를 수정했다면 TextOut() 메서드의 결과가 표시되지 않겠습니까? 렌더링 된 비트 맵에서 해당 호출에 표시된 문장을 확실히 봅니다. –

+0

그래서 'TextOut' 변경 사항을 볼 수는 있지만'Scanline' 속성을 통해 변경된 내용은 아닌 것 같습니까? –

+0

예. 당신은이 스레드에서 내 원래 게시물에 추가 할 다른 스레드에서 실제 문제를 해결했습니다 : http : // stackoverflow.com/questions/8751210/pixel-modifying-code-runs-quick-in-main-app-really-slow-in-delphi-6-directshow –