У меня возникли некоторые проблемы при использовании d3d9 для рисования YUV 420 - PullRequest
0 голосов
/ 13 марта 2019

Я использую следующий код для отображения видеофайла YUV (1920 * 1080), но он не мог работать, он зависал при запуске его в Qt creator. Что-то не так с приведенным ниже кодом, и как исправить следующий код, чтобы он отображал видео YUV? код выглядит следующим образом, и есть другой код, который я пропустил:

......

const int pixel_w=1920,pixel_h=1080;
FILE *fileYuv=NULL;
//Bit per Pixel
const int bpp=32;

unsigned char buffer[pixel_w*pixel_h*bpp/8];


int Init( HWND hwnd, unsigned int lWidth, unsigned int lHeight, bool isYuv )


bool Render(char *buffer)
{
    LRESULT lRet;

    if(buffer == NULL || m_pDirect3DDevice == NULL)
        return false;
    //Clears one or more surfaces
    lRet = m_pDirect3DDevice->Clear(0, NULL, D3DCLEAR_TARGET,D3DCOLOR_XRGB(0, 255, 0), 1.0f, 0);
//    lRet = m_pDirect3DDevice->Clear(0, NULL, D3DCLEAR_TARGET,D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

    D3DLOCKED_RECT d3d_rect;
    //Locks a rectangle on a texture resource.
    //And then we can manipulate pixel data in it.
    lRet = m_pDirect3DTexture->LockRect( 0, &d3d_rect, 0, 0 );
    if ( FAILED(lRet) ){
        return false;
    }
    // Copy pixel data to texture
    byte *pSrc = (byte *)buffer;
    byte *pDest = (byte *)d3d_rect.pBits;
    int stride = d3d_rect.Pitch;

    unsigned long i = 0;

    for(i = 0;i < pixel_h;i ++){
        memcpy(pDest + i * stride,pSrc + i * pixel_w, pixel_w);
    }
    for(i = 0;i < pixel_h/2;i ++){
        memcpy(pDest + stride * pixel_h + i * stride / 2,pSrc + pixel_w * pixel_h + pixel_w * pixel_h / 4 + i * pixel_w / 2, pixel_w / 2);
    }
    for(i = 0;i < pixel_h/2;i ++){
        memcpy(pDest + stride * pixel_h + stride * pixel_h / 4 + i * stride / 2,pSrc + pixel_w * pixel_h + i * pixel_w / 2, pixel_w / 2);
    }


    m_pDirect3DTexture->UnlockRect( 0 );

    //Begin the scene
    if ( FAILED(m_pDirect3DDevice->BeginScene()) ){
        return false;
    }

    lRet = m_pDirect3DDevice->SetTexture( 0, m_pDirect3DTexture );

    m_pDirect3DDevice->SetStreamSource( 0, m_pDirect3DVertexBuffer,
        0, sizeof(CUSTOMVERTEX) );

    lRet = m_pDirect3DDevice->SetFVF( D3DFVF_CUSTOMVERTEX );

    m_pDirect3DDevice->DrawPrimitive( D3DPT_TRIANGLEFAN, 0, 2 );
    m_pDirect3DDevice->EndScene();

    m_pDirect3DDevice->Present( NULL, NULL, NULL, NULL );
    return true;
}
...