|
|
@@ -11,8 +11,9 @@ VideoRenderImpl::VideoRenderImpl(IRenderCallback* pCallback)
|
|
|
|
|
|
m_cx = SDL_WINDOWPOS_UNDEFINED;
|
|
|
m_cy = SDL_WINDOWPOS_UNDEFINED;
|
|
|
- m_width = 640;
|
|
|
- m_height = 360;
|
|
|
+ m_width = 0;
|
|
|
+ m_height = 0;
|
|
|
+ m_videoformat = VIDEO_FORMAT_RGB24;
|
|
|
m_flags = SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_BORDERLESS | SDL_WINDOW_HIDDEN | SDL_WINDOW_ALWAYS_ON_TOP | SDL_WINDOW_SKIP_TASKBAR;
|
|
|
}
|
|
|
|
|
|
@@ -60,11 +61,23 @@ int VideoRenderImpl::SetWindowProperty(videorender_param_t* tparam)
|
|
|
|
|
|
m_flags |= tparam->uwinflags;
|
|
|
|
|
|
+ m_videoformat = tparam->ivideoformat;
|
|
|
+
|
|
|
iRet = 0;
|
|
|
|
|
|
return iRet;
|
|
|
}
|
|
|
|
|
|
+SDL_PixelFormatEnum VideoRenderImpl::GetPixelFormat()
|
|
|
+{
|
|
|
+ SDL_PixelFormatEnum eType = SDL_PIXELFORMAT_BGR24;
|
|
|
+ if (VIDEO_FORMAT_I420 == m_videoformat){
|
|
|
+ eType = SDL_PIXELFORMAT_IYUV;
|
|
|
+ }
|
|
|
+
|
|
|
+ return eType;
|
|
|
+}
|
|
|
+
|
|
|
int VideoRenderImpl::VideoRenderSetParam(videorender_param_t* tparam)
|
|
|
{
|
|
|
if (SetWindowProperty(tparam)){
|
|
|
@@ -190,7 +203,7 @@ int VideoRenderImpl::VideoRenderSetParam(videorender_param_t* tparam)
|
|
|
SDL_SetRenderDrawBlendMode(m_renderer, SDL_BLENDMODE_NONE);
|
|
|
|
|
|
m_rending_texture = SDL_CreateTexture(m_renderer,
|
|
|
- SDL_PIXELFORMAT_BGR24,
|
|
|
+ GetPixelFormat(),
|
|
|
SDL_TEXTUREACCESS_STREAMING,
|
|
|
m_videowidth,
|
|
|
m_videoheight);
|
|
|
@@ -246,16 +259,13 @@ void VideoRenderImpl::VideoRenderDestroy()
|
|
|
int VideoRenderImpl::RenderVideoFrame(video_frame* pframe)
|
|
|
{
|
|
|
int iret = -1;
|
|
|
- m_callback->Debug("%s:%d", __FUNCTION__, __LINE__);
|
|
|
if (NULL == m_sdl_window || NULL == pframe || NULL == m_renderer || NULL == m_rending_texture){
|
|
|
return iret;
|
|
|
}
|
|
|
- m_callback->Debug("%s:%d",__FUNCTION__, __LINE__);
|
|
|
|
|
|
SDL_SetRenderDrawColor(m_renderer, 0, 0, 0, 255); /*black*/
|
|
|
SDL_RenderClear(m_renderer);
|
|
|
|
|
|
- m_callback->Debug("%s:%d", __FUNCTION__, __LINE__);
|
|
|
/* since data is continuous we can use SDL_UpdateTexture
|
|
|
* instead of SDL_UpdateYUVTexture.
|
|
|
* no need to use SDL_Lock/UnlockTexture (it doesn't seem faster)
|
|
|
@@ -264,7 +274,9 @@ int VideoRenderImpl::RenderVideoFrame(video_frame* pframe)
|
|
|
|
|
|
if (VIDEO_FORMAT_RGB24 == pframe->format){
|
|
|
SDL_UpdateTexture(m_rending_texture, NULL, pframe->data[0], pframe->width*3);
|
|
|
- m_callback->Debug("%s:%d", __FUNCTION__, __LINE__);
|
|
|
+ }
|
|
|
+ else if(VIDEO_FORMAT_I420 == pframe->format){
|
|
|
+ SDL_UpdateTexture(m_rending_texture, NULL, pframe->data[0], pframe->width);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
@@ -274,12 +286,9 @@ int VideoRenderImpl::RenderVideoFrame(video_frame* pframe)
|
|
|
|
|
|
|
|
|
SDL_RenderCopy(m_renderer, m_rending_texture, NULL, NULL);
|
|
|
- m_callback->Debug("%s:%d", __FUNCTION__, __LINE__);
|
|
|
|
|
|
SDL_RenderPresent(m_renderer);
|
|
|
|
|
|
- m_callback->Debug("%s:%d", __FUNCTION__, __LINE__);
|
|
|
-
|
|
|
iret = 0;
|
|
|
|
|
|
return iret;
|