2012-02-02 133 views

答えて

2

この投稿への訪問数が目立つようになったので、私自身の質問に答えるつもりです。

MJPGとYUY2の間のすべての変換を列挙するのは、MJPGとRGB32の間に直接の変換がないようだからです。私は1080ウェブカメラからのサンプルをフェッチするために、このメソッドを使用し、YUY2にMJPGを復号化し、次にRGB32にYUY2を復号化した後、OpenGLのRGB32テクスチャをロード http://msdn.microsoft.com/en-us/library/windows/desktop/ff819079%28v=vs.85%29.aspx

:YUY2とRBG32間で画像を変換するためには、色変換DSPを使用しますそれを表示します。これは30fpsでコア2デュオとRadeon HD5650で行われます。 OpenCL(いくつかの畳み込み)で画像を計算すると、15 fpsに低下します。

コード変換YUY2にMJPGを作成する:

MFT_REGISTER_TYPE_INFO inputFilter = { MFMediaType_Video, MFVideoFormat_MJPG }; 
MFT_REGISTER_TYPE_INFO outputFilter = { MFMediaType_Video, MFVideoFormat_YUY2 }; 
UINT32 unFlags = MFT_ENUM_FLAG_SYNCMFT | MFT_ENUM_FLAG_LOCALMFT | MFT_ENUM_FLAG_SORTANDFILTER; 

HRESULT r = MFTEnumEx(MFT_CATEGORY_VIDEO_DECODER, unFlags, &inputFilter, &outputFilter, &ppActivate, &numDecodersMJPG); 
if (FAILED(r)) throw gcnew Exception(""); 
if (numDecodersMJPG < 1) throw gcnew Exception(""); 

// Activate transform 
IMFTransform *pMPEG4 = NULL; 
r = ppActivate[0]->ActivateObject(__uuidof(IMFTransform), (void**)&pMPEG4); 
if (FAILED(r)) throw gcnew Exception("No se pudo crear el decodificador MJPG."); 

次部分(YUY2からRGB32に最初MJPGからYUY2へと)圧縮されたサンプルを復号する復号器を使用することです。 http://msdn.microsoft.com/en-us/library/windows/desktop/aa965264%28v=vs.85%29.aspx

または::これはで説明されて

 MFT_OUTPUT_STREAM_INFO osi; 

    HRESULT r = pDecoder->ProcessMessage(MFT_MESSAGE_NOTIFY_BEGIN_STREAMING, 0); 
    if (FAILED(r)) throw gcnew Exception(""); 

    r = pDecoder->ProcessInput(0, sample, 0); 
    if (FAILED(r)) throw gcnew Exception(""); 

    r = pDecoder->GetOutputStreamInfo(0, &osi); 
    if (FAILED(r)) throw gcnew Exception(""); 

    DWORD status = 0; 
    r = pDecoder->GetOutputStatus(&status); 
    if (FAILED(r)) throw gcnew Exception(""); 
    if (status = MFT_OUTPUT_STATUS_SAMPLE_READY) { 
    } 

    // Use your own CreateSample function 
    IMFSample *outputSample = CreateSample(osi.cbSize); 

    DWORD outStatus = 0; 
    MFT_OUTPUT_DATA_BUFFER odf; 
    odf.dwStreamID = 0; 
    odf.pSample = outputSample; 
    odf.dwStatus = 0; 
    odf.pEvents = NULL; 
    r = pDecoder->ProcessOutput(0, 1, &odf, &outStatus); 
    if (r != MF_E_TRANSFORM_NEED_MORE_INPUT && FAILED(r)) { 
     outputSample->Release(); 
     throw gcnew Exception(""); 
    } 

    r = pDecoder->ProcessMessage(MFT_MESSAGE_NOTIFY_END_OF_STREAM, 0); 
    if (FAILED(r)) { 
     outputSample->Release(); 
     throw gcnew Exception(""); 
    } 

    r = pDecoder->ProcessMessage(MFT_MESSAGE_COMMAND_DRAIN, 0); 
    if (FAILED(r)) { 
     outputSample->Release(); 
     throw gcnew Exception(""); 
    } 

    return outputSample;