打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
sdl 播放yuv
LRESULT CVideoPlayerPropPage::OnInitSDL(WPARAM wParam,LPARAM lParam)
{
#ifdef _SDL_H
// 初始化 需要很多时间  会影响ocx 界面的显示
if( SDL_Init(SDL_INIT_EVERYTHING) == -1)
{
TTRACE("%s SDL_Init is failed \r\n", __FUNCTION__);
}
//用mfc窗口句柄创建一个sdl window
    m_pSDLWindow = SDL_CreateWindowFrom( (void *)(m_ImgWnd->m_hWnd) );
#endif
return TRUE;

}




void CVideoPlayerPropPage::PlayMediaYuvData( ST_YUV_VIDEO_DATA &stYuvData )
{
STRY;
#ifdef _SDL_H

m_nWidth = stYuvData.nWidth;
m_nHeight = stYuvData.nHeight;
//SDL  Show YUV data
if(m_nMagnification == 0) //正常播放  没有缩放
{
m_sdlSrcRect.h = stYuvData.nHeight;
m_sdlSrcRect.w = stYuvData.nWidth;
m_sdlSrcRect.x = 0;
m_sdlSrcRect.y = 0;
}
SDL_Rect srcRT;
    srcRT.h = stYuvData.nHeight;
    srcRT.w = stYuvData.nWidth;
    srcRT.x = 0;
    srcRT.y = 0;

    SDL_Rect dstRT;
    dstRT.h = stYuvData.nHeight;
    dstRT.w = stYuvData.nWidth;
    dstRT.x = 0;
    dstRT.y = 0;

    int iW = stYuvData.nWidth;
    int iH = stYuvData.nHeight;    

    char szPrint[256] = {0};
    
    //计算yuv一行数据占的字节数
    int iPitch = iW*SDL_BYTESPERPIXEL(SDL_PIXELFORMAT_YV12);    

    int iWidth = 0;
    int iHeight = 0;
    SDL_GetWindowSize( m_pSDLWindow, &iWidth, &iHeight );
    dstRT.h = iHeight;
    dstRT.w = iWidth;   
    if(m_pSDLRender == NULL)
{
int nDriversCount = SDL_GetNumRenderDrivers();
//创建渲染器,第二个参数为选用的画图驱动,0代表d3d
m_pSDLRender = SDL_CreateRenderer( m_pSDLWindow, 0, SDL_RENDERER_ACCELERATED );
if(m_pSDLRender == NULL)
{
TTRACE("%s SDL_GetError() =%s ",__FUNCTION__,SDL_GetError());

}
SDL_RendererInfo info;
SDL_GetRendererInfo(m_pSDLRender, &info);
}

    //创建纹理
if(m_pSDLTexture == NULL)
{
m_pSDLTexture = SDL_CreateTexture( m_pSDLRender,SDL_PIXELFORMAT_YV12, SDL_TEXTUREACCESS_STREAMING, iW, iH ); 
}

int nRet = FALSE;

nRet = SDL_UpdateYUVTexture(m_pSDLTexture,&srcRT,stYuvData.pData[0],stYuvData.nLineSize[0],\
stYuvData.pData[1],stYuvData.nLineSize[1],stYuvData.pData[2],stYuvData.nLineSize[2]);

//nRet = SDL_UpdateTexture( m_pSDLTexture, &srcRT, stYuvData.pYuvbuf, iPitch );
nRet = SDL_RenderClear( m_pSDLRender );

//if( !m_bIsSpecilReToShow )//不是指定区域显示
{
if(m_bIsZoom)
{
m_bIsZoom = FALSE;
if(m_nMagnification > m_nOldMagnification)
{
if(m_nMagnification < stYuvData.nWidth)
{
m_sdlSrcRect.x += m_nMagnification;
}
if(m_nMagnification < stYuvData.nHeight )
{
m_sdlSrcRect.y += m_nMagnification;
}
if( (m_nMagnification*2 + m_sdlSrcRect.x ) < m_sdlSrcRect.w )
{
m_sdlSrcRect.w -= m_nMagnification;
m_sdlSrcRect.w -= m_nMagnification;
}
if( (m_nMagnification*2 + m_sdlSrcRect.y ) < m_sdlSrcRect.h )
{
m_sdlSrcRect.h -= m_nMagnification;
m_sdlSrcRect.h -= m_nMagnification;
}

//SetBrightness(stYuvData.pYuvbuf,m_nWidth,m_nHeight,g_nBrightness);
}
else
{
if(m_nMagnification < stYuvData.nWidth)
{
m_sdlSrcRect.x -= m_nMagnification;
}

if(m_nMagnification < stYuvData.nHeight )
{
m_sdlSrcRect.y -= m_nMagnification;
}
// if( (m_nMagnification + m_sdlSrcRect.x + 100) < m_sdlSrcRect.w )
{
m_sdlSrcRect.w += m_nMagnification;
m_sdlSrcRect.w += m_nMagnification;
}
// if( (m_nMagnification + m_sdlSrcRect.y + 100) < m_sdlSrcRect.h )
{
m_sdlSrcRect.h += m_nMagnification;
m_sdlSrcRect.h += m_nMagnification;
}
}
m_nOldMagnification = m_nMagnification;

/*
// if( (m_nMagnification + m_sdlSrcRect.x + 100) < m_sdlSrcRect.w )
{
srcRT.w -= m_nMagnification;
srcRT.w -= m_nMagnification;
m_sdlSrcRect.w =  srcRT.w;

}
// if( (m_nMagnification + m_sdlSrcRect.y + 100) < m_sdlSrcRect.h )
{
srcRT.h -= m_nMagnification;
srcRT.h -= m_nMagnification;
m_sdlSrcRect.h = srcRT.h;
}
*/

m_rectCurZoom.left = m_sdlSrcRect.x;
m_rectCurZoom.top = m_sdlSrcRect.y;
m_rectCurZoom.right = m_rectCurZoom.left + m_sdlSrcRect.w;
m_rectCurZoom.bottom = m_rectCurZoom.top + m_sdlSrcRect.h;
}

}
//else //指定区域显示
{
/*
   m_sdlSrcRect.x = m_rectCurZoom.left;
m_sdlSrcRect.y = m_rectCurZoom.right;
m_sdlSrcRect.w = m_rectCurZoom.Width();
m_sdlSrcRect.h = m_rectCurZoom.Height();
*/

}


SDL_RenderCopy( m_pSDLRender, m_pSDLTexture, &m_sdlSrcRect, &dstRT );

// SDL_RenderCopy( m_pSDLRender, m_pSDLTexture, &sdlRT, &dstRT );
SDL_RenderPresent( m_pSDLRender );
#endif
return;
SCATCH;
return;
}








本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
SDL2.0
Simple DirectMedia Layer
书写函数规范
SDL代码开发安全检查
SDL Passolo 2018 初级使用
SDL(Simple DirectMedia Layer)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服