Полноэкранный режим (сохранение соотношения сторон изображения видео фильма)

Я делаю отображение видео фильма с сохранением соотношения сторон изображения видео фильма.В оконном режиме получилось.

В полноэкранном режиме (NVidia 3D Vision) изображение выводится в центре размером изображения фильма (половины по ширине разрешения фильма с расположением кадров рядом по ширине) при разрешении полноэкранного режима больше указаного.

Я выяснил: NVidia делает что-то с бек буфером после меня в полноэкранном режиме.

В очках фильм смотрится не так как в австрийском плеере StereoScopic Player и его копии NVIDIA 3D Vision Video Player.

Вот код для пересчёта на основе размера бек буфера, окна плеера и размера видео фильма: 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;// parameter_VideoText->GetTargetRect(&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;

// local_target_rect_final_bufer.left = local_view_port_rect.left;// local_target_rect_final_bufer.right = local_view_port_rect.right;// local_target_rect_final_bufer.top = local_view_port_rect.top;

// local_target_rect_final_bufer.bottom = local_view_port_rect.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 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; } }

Последняя правка: пн, 29/08/2011 - 22:07
Submitted by Kozlov_Sergey on

Комментарии

rtfm закрыто.

Submitted by Relyer on

GameDev.by