I make video renderer filter with saving video resolution of video film. In windowed mode it works fine. In fullscreen mode (NVidia 3D Vision) image is rendering in the center of screen with source video resolution of video film with half of the width of source video film, when the images are next to the width. There must be black area to fill rest of screen (window) and the video image.
In fullscreen is the same situation as in windowed mode: all coordinated of back buffer are calculeted right.
May be NVidia does something when drawing the video in full screen?
Can you help me?
Here is the code:
D3DVIEWPORT9 local_view_port;
direct_3D_device->GetViewport(&local_view_port);
RECT local_view_port_rect = {local_view_port.X,local_view_port.Y,local_view_port.Width,local_view_port.Height};
SIZE local_view_port_size = {local_view_port.Width,local_view_port.Height};
RECT local_target_rect;
local_target_rect.left = 0;
local_target_rect.right = cxImage;
local_target_rect.top = 0;
local_target_rect.bottom = cyImage;
RECT local_target_rect_final_window;
RECT local_target_rect_final_bufer;
RECT local_window_rect;
SIZE local_window_size;
GetClientRect(parameter_VideoText->GetOwnerWindow(),&local_window_rect);
local_window_size.cx = local_window_rect.right - local_window_rect.left;
local_window_size.cy = local_window_rect.bottom - local_window_rect.top;
double local_multiplication_target = 1.0*local_view_port_size.cx/local_view_port_size.cy;
double local_multiplication_video = 1.0*(local_target_rect.right-local_target_rect.left)/(local_target_rect.bottom-local_target_rect.top);
double local_multiplication_window = 1.0*local_window_size.cx/local_window_size.cy;
if (local_multiplication_window<local_multiplication_video)
{
local_target_rect_final_window.left = 0;
local_target_rect_final_window.right = local_window_size.cx;
local_target_rect_final_window.top = local_window_size.cy/2 - 1.0*(local_target_rect.bottom-local_target_rect.top)/(local_target_rect.right-local_target_rect.left)*local_window_size.cx/2;
local_target_rect_final_window.bottom = local_window_size.cy/2 + 1.0*(local_target_rect.bottom-local_target_rect.top)/(local_target_rect.right-local_target_rect.left)*local_window_size.cx/2;
}
else
{
local_target_rect_final_window.left = local_window_size.cx/2 - 1.0*(local_target_rect.right-local_target_rect.left)/(local_target_rect.bottom-local_target_rect.top)*local_window_size.cy/2;
local_target_rect_final_window.right = local_window_size.cx/2 + 1.0*(local_target_rect.right-local_target_rect.left)/(local_target_rect.bottom-local_target_rect.top)*local_window_size.cy/2;
local_target_rect_final_window.top = 0;
local_target_rect_final_window.bottom = local_window_size.cy;
}
local_target_rect_final_bufer.left = 1.0*local_view_port_size.cx/local_window_size.cx*local_target_rect_final_window.left;
local_target_rect_final_bufer.right = 1.0*local_view_port_size.cx/local_window_size.cx*local_target_rect_final_window.right;
local_target_rect_final_bufer.top = 1.0*local_view_port_size.cy/local_window_size.cy*local_target_rect_final_window.top;
local_target_rect_final_bufer.bottom = 1.0*local_view_port_size.cy/local_window_size.cy*local_target_rect_final_window.bottom;
{
}
{
if(direct_3D_device->Clear (0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB (0, 0, 0), 0.0f, 0)!=D3D_OK)
{
return E_FAIL;
}
if(direct_3D_device->BeginScene ()!=D3D_OK)
{
return E_FAIL;
}
CComPtr<IDirect3DSurface9> pDestSurface;
if(direct_3D_device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pDestSurface)!=D3D_OK)
{
return E_FAIL;
}
if(pDestSurface)
{
if(direct_3D_device->StretchRect(gImageSrc, &srcRect, pDestSurface, &local_target_rect_final_bufer, D3DTEXF_LINEAR)!=D3D_OK)
{
return E_FAIL;
}
}
if(direct_3D_device->EndScene ()!=D3D_OK)
{
return E_FAIL;
}
if(direct_3D_device->Present (NULL, NULL, NULL, NULL)!=D3D_OK)
{
return E_FAIL;
}
}