2016-07-15 2 views
0

DS에 초보자가되었습니다. IMediaDet에서 처리 할 수없는 VIDEOINFOHEADER2를 처리 할 수있는 SampleGrabber가 필요했습니다.DirectShow의 SampleGrabber가 잘못된 샘플을 검색합니다.

그래서 Stockgrabber와는 달리 모든 종류의 미디어를 허용하는 DX8.1 샘플에서 SampleGrabber를 가져 왔습니다. 꽤 그대로 샘플 코드를 사용하고, 하나 개의 프레임 모두를 잡는 것은 잘 작동하는 것 같다 : 그래프가 ErrorCode가 등을 반환하지 않고 내장되어 다음과

hr = pSeeking->SetPositions( 
     &Seek, 
     AM_SEEKING_AbsolutePositioning, 
     NULL, 
     AM_SEEKING_NoPositioning); 

를 호출 탐색 콜백 = 2

호출 :

HRESULT 콜백 (*의 IMediaSample pSample는 REFERENCE_TIME * 상영, REFERENCE_TIME * StopTime, BOOL TypeChanged)는

문제는 버퍼이다 : 01,235,올바른 크기 (GetSize() == 691200 = 3 바이트 * 640 * 320) 이지만 내용은 모두 "205"입니다. 그것에 대해 의심스러운

: "콜백"의 매개 변수는 = 834,168, 내가 (GraphEdit로 https://msdn.microsoft.com/en-us/library/windows/desktop/dd390650%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396 에서 그래프를 보여주는 시도했지만 성공하지 못한 = 1251251 StopTime 및 TypeChanged = 1

"응용 프로그램 상영된다 그래프 에디트에서 바쁘다 ").

어디에 문제가있을 수 있습니까?

답변

0

그것을 발견했다.

콜백에서 전달 된 버퍼, memcpy 및 혼동 된 소스 및 대상을 복사했습니다. 매우 창피합니다.

도움 주셔서 감사합니다. (모든 사람이 읽은 후 며칠 내에이 질문을 삭제하려고합니다. 매우 제한된 용도로 사용됩니다).

+0

DirectShow에 관해서는 알지 못합니다. 20 년 이상 전에 도저히 이해하지 못했습니다. 내가 본 유일한 사실은 0xCD 단서뿐입니다. 예, 동의합니다. DirectShow와 관련이없는 것으로 판명되면서 질문을 삭제하십시오. –

+0

나는 할 것이다. 그러나 다시 한 번 지적하자면, 당신의 힌트는 참으로 도움이되었습니다. 고맙습니다! :-) – nji9

1

Windows의 경우 잘못된 메모리 참조를 디버그하는 데 도움이되는 다양한 패턴으로 메모리가 설정됩니다. 205는 16 진수의 0xCD이며 이는 uninitialized heap memory을 의미합니다. 따라서 "오류가있는"데이터를 얻지 못하면 데이터가 쓰여지지 않습니다.

찾기가 어려울 수도 있습니다. 너는 시도 했니? IsFormatSupported

+0

예, 어딘가에 문제가 있어야합니다. GetTimeFormat은 TIME_FORMAT_MEDIA_TIME을 반환합니다. IsFormatSupported on은 false를 반환합니다. 그래서 SetTimeFormat (TIME_FORMAT_FRAME) - S_OK, 을 반환하지만 IsFormatSupported는 여전히 false를보고했습니다. 그런 다음 SetTimeFormat (TIME_FORMAT_SAMPLE)을 시도하여 E_FAIL을 반환합니다. IsFormatSupported는 지금도 여전히 거짓을보고하지만 지금은 앉아 있습니다 - 전에 GetTimeFormat을 수행하면 (여전히 TIME_FORMAT_FRAME (이)라고 말합니다) IsFormatSupported가 true를보고합니다. 보잉! CheckCapabilities after this (시간 형식에 따라 다름) ... (계속) – nji9

+0

... AM_SEEKING_CanSeekAbsolute가 표시됩니다. seek (pSeeking-> SetPositions)을 수행하기 전에이 작업을 수행합니다. 이것이 그래프를 실행하고있는 것으로 의심됩니다. 글쎄, 완전히 혼란스러워 ... – nji9

+0

한 번 더 MSDN의 AddRot 코드를 포함하고 응용 프로그램을 디버깅하는 동안 "서버가 사용 중입니다"라는 메시지를 방지하기 위해 GraphEdit으로 구성된 필터 그래프를 시각화하려고합니다. around : Seek-command 전에 그래프를 작성한 후 수면 (100). 그런 다음 GraphEdit이 응답하고 아무 것도 표시하지 않습니다 ... 빈 (붉은 색) 시트. 이게 무슨 뜻입니까? 필터 그래프가 전혀 작성되지 않았습니까? 그러나 Windows 바탕 화면에서 LAV 코덱의 아이콘이 나타납니다. 제발 도와 줘, 나는 붙어있다. – nji9