全屏(保存视频分辨率) [英] Fullscreen (saving video resolution)

查看:131
本文介绍了全屏(保存视频分辨率)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我制作了视频渲染器过滤器,以节省视频电影的视频分辨率.在窗口模式下,它可以正常工作.在全屏模式(NVidia 3D Vision)中,当图像紧挨宽度时,图像将以视频影片的源视频分辨率呈现在屏幕中央,且其宽度为源影片的一半.必须有黑色区域以填充屏幕的其余部分(窗口)和视频图像.
在全屏模式下与在窗口模式下相同:正确计算后缓冲区的所有坐标.
全屏绘制视频时,NVidia可能会执行某些操作吗?
你能帮我吗?
这是代码:

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;
//			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;
			{
//				ofstream local_file;
//				local_file.open("log.txt");
//				local_file << local_target_rect_final_bufer.left << " " << local_target_rect_final_bufer.top << " \t" << local_target_rect_final_bufer.right << " " << local_target_rect_final_bufer.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;
				}
			}

推荐答案

NVidia用后缓冲区在我后面做一些事情.
NVidia does something after me with back buffer.


我使用了源表面拉伸
if(1.0 *(cxImage/2)/cyImage< 1.0)
{
ratio_x = 1.0 *(cxImage/2)/cyImage;
ratio_y = 1.0;
}
其他
{
ratio_x = 1.0;
ratio_y = 1.0/(cxImage/2)* cyImage;
}


CComPtr< IDirect3DSurface9> local_source_image_final;

RECT local_source_rectangle_final;

local_source_rectangle_final.left = 0;
local_source_rectangle_final.right = local_view_port_size.cx * 2 * ratio_x;
local_source_rectangle_final.top = 0;
local_source_rectangle_final.bottom = local_view_port_size.cy * ratio_y;

local_handle_result = direct_3D_device-> CreateRenderTarget(
local_view_port_size.cx * 2 * ratio_x,
local_view_port_size.cy * ratio_y,
D3DFMT_A8R8G8B8,D3DMULTISAMPLE_NONE,//表面位于视频存储器中
0,
是的,
& local_source_image_final,NULL);
I have used source surface stretch
if(1.0*(cxImage/2)/cyImage < 1.0)
{
ratio_x = 1.0*(cxImage/2)/cyImage;
ratio_y = 1.0;
}
else
{
ratio_x = 1.0;
ratio_y = 1.0/(cxImage/2)*cyImage;
}


CComPtr<IDirect3DSurface9> local_source_image_final;

RECT local_source_rectangle_final;

local_source_rectangle_final.left = 0;
local_source_rectangle_final.right = local_view_port_size.cx*2*ratio_x;
local_source_rectangle_final.top = 0;
local_source_rectangle_final.bottom = local_view_port_size.cy*ratio_y;

local_handle_result = direct_3D_device->CreateRenderTarget(
local_view_port_size.cx*2*ratio_x,
local_view_port_size.cy*ratio_y,
D3DFMT_A8R8G8B8, D3DMULTISAMPLE_NONE, // Surface is in video memory
0,
TRUE,
&local_source_image_final, NULL);


这篇关于全屏(保存视频分辨率)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆