2009-08-20 9 views
0

Ich habe das Beispielprojekt ezrgb24 erfolgreich erstellt, das im DirectShow-SDK enthalten ist. Aber ich stieß auf ein verwirrtes Problem, wenn ich es debugge.Warum ist die Puffergröße der Ausgabe IMediaSample kleiner als einer der Eingabe?

Die folgende Copy-Methode wurde von der Transform-Methode aufgerufen.

HRESULT CEZrgb24::Copy(IMediaSample *pSource, IMediaSample *pDest) const 
{ 
    ... 
    // Copy the sample data 
    BYTE *pSourceBuffer, *pDestBuffer; 
    long lSourceSize = pSource->GetActualDataLength(); 

#ifdef DEBUG 
    long lDestSize = pDest->GetSize(); 
    ASSERT(lDestSize >= lSourceSize); 
#endif 

    ... 
} 

Die Anweisung zur Bestätigung ist fehlgeschlagen. Mit graphedit habe ich überprüft, ob der Eingangstyp des Filters RGB24 ist und der Ausgang auch RGB24 ist. Ich kann nicht verstehen, warum die Puffergröße der Ausgabe kleiner als die tatsächliche Datengröße der Eingabe ist. Wer kann mir helfen?

Danke.

---------------------------------------------- ---- 2009/8/20 bearbeitet

O, fand ich die tatsächliche Eingabe Medien Subtye ist von RGB32, aber der Untertyp der Ausgabe ist RGB24. Aber warum der Typ RGB32 sowohl für die CEZrgb24 :: CheckInputType-Methode als auch die CEZrgb24 :: CheckTransform sein kann, gibt nur OK für RGB24 zurück.

---------------------------------------------- ---- 2009/8/21 bearbeitet

Ich schlug das Problem selbst. Ich poste als Antwort.

+0

Aber ich weiß nicht, warum pSource-> GetActualDataLength() größer als m_pInput-> CurrentMediaType(). GetSampleSize(). –

Antwort

0

ich die Auflösung selbst gefunden. Ich habe die Antwort in der Frage gepostet. Laut StackOverflow 's Guide, ich denke, ich bevorzuge es hier eingefügt.

Ich traf das Problem. Modifizieren Sie das CEZrgb24 :: Copy methold wie folgt,

HRESULT CEZrgb24::Copy(IMediaSample *pSource, IMediaSample *pDest) const 
{ 
    ... 
    // Copy the sample data 
    BYTE *pSourceBuffer, *pDestBuffer; 
    long lSourceSize = m_pInput->CurrentMediaType().GetSampleSize(); 

#ifdef DEBUG 
    long lDestSize = m_pOutput->CurrentMediaType().GetSampleSize(); 
    ASSERT(lDestSize >= lSourceSize); 
#endif 

    ... 
} 

Nun ist die Bestätigung erfolgreich.

0

Nun, das würde bedeuten, dass Sie nicht sicherstellen, dass der CMediaType für die Ausgabe gültig ist.

In :: CheckTransform wird E_FAIL zurückgegeben, es sei denn, mtIn und mtOut sind gleich, während CanPerformEZrgb24 bestätigt, dass der SubType RGB_24 ist. Einer dieser Tests MUSS RGB32 erlauben, durchzukommen. Dies bedeutet, dass Sie den Code geringfügig geändert haben.

Überprüfen Sie die folgenden Funktionen wie folgt aussehen:

HRESULT CEZrgb24::CheckTransform(const CMediaType *mtIn, const CMediaType *mtOut) 
{ 
    CheckPointer(mtIn,E_POINTER); 
    CheckPointer(mtOut,E_POINTER); 

    if (CanPerformEZrgb24(mtIn)) 
    { 
     if (*mtIn == *mtOut) 
     { 
      return NOERROR; 
     } 
    } 
    return E_FAIL; 
} 

BOOL CEZrgb24::CanPerformEZrgb24(const CMediaType *pMediaType) const 
{ 
    CheckPointer(pMediaType,FALSE); 

    if (IsEqualGUID(*pMediaType->Type(), MEDIATYPE_Video)) 
    { 
     if (IsEqualGUID(*pMediaType->Subtype(), MEDIASUBTYPE_RGB24)) 
     { 
      VIDEOINFOHEADER *pvi = (VIDEOINFOHEADER *) pMediaType->Format(); 
      return (pvi->bmiHeader.biBitCount == 24); 
     } 
    } 

    return FALSE; 

} 
+0

Ich habe sie nicht geändert. Ich habe das Projekt einfach erstellt und debuggt. –

+0

Ich habe versucht, eine Anweisung CopyMemory ((PVOID) pDestBuffer, (PVOID) pSourceBuffer, lSourceSize) von CEZrgb24 :: Copy als CopyMemory ((PVOID) pDestBuffer, (PVOID) pSourceBuffer, min (lSourceSize, lDestSize)) zu ändern. Und es funktioniert, obwohl einige Frames als rot gerendert sind. –

Verwandte Themen