SDL2.0的YUV显示问题,效率感觉太低,求教~!!

dianpozi 2013-06-24 07:57:32
SDL2.0的YUV显示问题,效率感觉太低;
(1)由于2.0支持了多窗口,所以想用SDL2.0来做多窗口的视频显示,参考网上的的一些做法,下面是我的做法,但是显示效率感觉很低;不知道大家有没有什么好的方法?
(2)另外,感觉感觉有很奇怪,在SDL1.2中,明确有SDL_DisplayYUVOverlay这个接口来专门显示YUV,在2.0中却找不到这个接口了;不知道大家是否知道2.0中是否有类似的函数?


#if 1
if(pPara->texture && !SDL_LockTexture(pPara->texture, &sdlRT, (void **)&pixels, &pitch) )
//if(pPara->texture)
{
if(pitch == picture.linesize[0]) {

int size = pitch * frame->height;
memcpy(pixels, picture.data[0], size);
memcpy(pixels + size, picture.data[2], size / 4);
memcpy(pixels + size * 5 / 4, picture.data[1], size / 4);

}
else {
#if 1
register unsigned char *y1,*y2,*y3,*i1,*i2,*i3;
int i;
y1 = pixels;
y3 = pixels + pitch * frame->height;
y2 = pixels + pitch * frame->height * 5 / 4;

i1=picture.data[0];
i2=picture.data[1];
i3=picture.data[2];

for (i = 0; i<(frame->height/2); i++)
{
memcpy(y1,i1,pitch);
i1+=picture.linesize[0];
y1+=pitch;
memcpy(y1,i1,pitch);

memcpy(y2,i2,pitch / 2);
memcpy(y3,i3,pitch / 2);

y1+=pitch;
y2+=pitch / 2;
y3+=pitch / 2;
i1+=picture.linesize[0];
i2+=picture.linesize[1];
i3+=picture.linesize[2];
}
#endif
}
SDL_UnlockTexture(pPara->texture);
}//texture
#endif

}//avpacket
#if 1
g_mutex.lock();
// SDL_RenderClear(pPara->renderer);
SDL_RenderCopy(pPara->renderer, pPara->texture, &sdlRT, &dstRT );
SDL_RenderPresent(pPara->renderer);
g_mutex.unlock();
#endif

...全文
1430 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ganjianh8 2014-12-23
  • 打赏
  • 举报
回复

if(m_pTexture == NULL)
    {
        m_pRender = SDL_CreateRenderer(m_pSDLWindow, -1, 0);
        Uint32 pixformat = SDL_PIXELFORMAT_IYUV;
        m_pTexture = SDL_CreateTexture(m_pRender, pixformat,
                                  SDL_TEXTUREACCESS_STREAMING, m_nWidth, m_nHeight);
    }
    SDL_UpdateTexture( m_pTexture, NULL, m_pBuffer, m_nWidth);
    SDL_RenderClear( m_pRender );
    SDL_Rect sdlRect;
    sdlRect.x = 0;
    sdlRect.y = 0;
    sdlRect.w = m_nWidth;
    sdlRect.h = m_nHeight;
    SDL_RenderCopy( m_pRender, m_pTexture, NULL, &sdlRect);
    SDL_RenderPresent( m_pRender );
ganjianh8 2014-12-23
  • 打赏
  • 举报
回复

SDL_CreateWindow()        
SDL_CreateWindowFrom()    
SDL_DestroyWindow()       
SDL_GetWindowData()       
SDL_GetWindowFlags()      
SDL_GetWindowGrab()       
SDL_GetWindowPosition()   
SDL_GetWindowSize()       
SDL_GetWindowTitle()      
SDL_HideWindow()          
SDL_MaximizeWindow()      
SDL_MinimizeWindow()      
SDL_RaiseWindow()         
SDL_RestoreWindow()       
SDL_SetWindowData()       
SDL_SetWindowFullscreen() 
SDL_SetWindowGrab()       
SDL_SetWindowIcon()       
SDL_SetWindowPosition()   
SDL_SetWindowSize()       
SDL_SetWindowBordered()   
SDL_SetWindowTitle()      
SDL_ShowWindow()          
wangzongze1015 2014-01-02
  • 打赏
  • 举报
回复
引用 楼主 dianpozi 的回复:
SDL2.0的YUV显示问题,效率感觉太低; (1)由于2.0支持了多窗口,所以想用SDL2.0来做多窗口的视频显示,参考网上的的一些做法,下面是我的做法,但是显示效率感觉很低;不知道大家有没有什么好的方法? (2)另外,感觉感觉有很奇怪,在SDL1.2中,明确有SDL_DisplayYUVOverlay这个接口来专门显示YUV,在2.0中却找不到这个接口了;不知道大家是否知道2.0中是否有类似的函数? #if 1 if(pPara->texture && !SDL_LockTexture(pPara->texture, &sdlRT, (void **)&pixels, &pitch) ) //if(pPara->texture) { if(pitch == picture.linesize[0]) { int size = pitch * frame->height; memcpy(pixels, picture.data[0], size); memcpy(pixels + size, picture.data[2], size / 4); memcpy(pixels + size * 5 / 4, picture.data[1], size / 4); } else { #if 1 register unsigned char *y1,*y2,*y3,*i1,*i2,*i3; int i; y1 = pixels; y3 = pixels + pitch * frame->height; y2 = pixels + pitch * frame->height * 5 / 4; i1=picture.data[0]; i2=picture.data[1]; i3=picture.data[2]; for (i = 0; i<(frame->height/2); i++) { memcpy(y1,i1,pitch); i1+=picture.linesize[0]; y1+=pitch; memcpy(y1,i1,pitch); memcpy(y2,i2,pitch / 2); memcpy(y3,i3,pitch / 2); y1+=pitch; y2+=pitch / 2; y3+=pitch / 2; i1+=picture.linesize[0]; i2+=picture.linesize[1]; i3+=picture.linesize[2]; } #endif } SDL_UnlockTexture(pPara->texture); }//texture #endif }//avpacket #if 1 g_mutex.lock(); // SDL_RenderClear(pPara->renderer); SDL_RenderCopy(pPara->renderer, pPara->texture, &sdlRT, &dstRT ); SDL_RenderPresent(pPara->renderer); g_mutex.unlock(); #endif
楼主 问题解决没?怎样实现多路视频播放用sdl2.0?
jamspen 2013-07-02
  • 打赏
  • 举报
回复
sdl的YUV应该是软件实现的,速度比较慢。你可以试一下d3d9 的YUV surface,直接拷贝YUV数据到YUV surface,这样速度很快。前提是你的显卡要支持d3d YUV 表面
dianpozi 2013-06-25
  • 打赏
  • 举报
回复
顶顶更健康啊。。。

19,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧