Direct3d 显示视频的一个问题
Posted qianbo_insist
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Direct3d 显示视频的一个问题相关的知识,希望对你有一定的参考价值。
direct3d 的优势
在windows上面,d3d首当其冲是效率最好的。
#ifndef __D3D_RENDER_H__
#define __D3D_RENDER_H__
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <windows.h>
#include <d3d9.h>
//#pragma comment(lib,"dxguid.lib")
//#pragma comment(lib,"d3d9.lib")
//#pragma comment(lib,"d3dx9.lib")
#define BGR(b,g,r) ((COLORREF)(((BYTE)(b)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(r))<<16)))
typedef IDirect3D9 * (WINAPI *DLL_Direct3DCreate9)(UINT SDKVersion);
class d3d_render
{
public:
d3d_render();
virtual ~d3d_render();
public:
/* 初始render. */
virtual int init_render(void* ctx, int w, int h);
/* 渲染一帧. */
virtual int render_one_frame(uint8_t* y ,uint8_t* u ,uint8_t* v);
///* 调整大小. */
//virtual void re_size(int width, int height);
///* 设置宽高比. */
//virtual void aspect_ratio(int srcw, int srch, bool enable_aspect);
/* 撤销render. */
virtual void destory_render();
private:
void fill_d3d_presentparams(D3DPRESENT_PARAMETERS *present_params,int width,int height);
bool reconfigure_d3d();
private:
HMODULE _hD3d9;
D3DCAPS9 _disp_caps;
private:
LPDIRECT3D9 m_d3d_handle; /**< Direct3D Handle */
//CRITICAL_SECTION glocker;
//static int ref;
LPDIRECT3DDEVICE9 m_d3d_device; /**< The Direct3D Adapter */
LPDIRECT3DSURFACE9 m_d3d_surface; /**< Offscreen Direct3D Surface. */
LPDIRECT3DSURFACE9 m_d3d_backbuf; /**< Video card's back buffer (used to display next frame) */
D3DLOCKED_RECT m_locked_rect; /**< The locked offscreen surface */
D3DFORMAT m_desktop_fmt; /**< Desktop (screen) colorspace format. */
D3DFORMAT m_movie_src_fmt; /**< Movie colorspace format (depends on the movie's codec) */
D3DPRESENT_PARAMETERS m_present_params;
HWND m_hwnd;
int m_old_width;
int m_old_height;
int m_image_width;
int m_image_height;
DLL_Direct3DCreate9 fpDirect3DCreate9;
protected:
int D3D9Load();
//新的窗体的高度和宽度
int ResetEverything(int width,int height);
int ResetEverythingAndD3d(int width,int height);
//int RestoreEverything();
};
#endif // __D3D_RENDER_H__
问题
遇到休眠的问题:在操作系统休眠的时候,很多小伙伴自己做的播放器就歇菜了,声音还在自己播放,视频却停止了。所以要侦测事件,在每一帧里面都要拿到事件消息。
hr = m_d3d_device->TestCooperativeLevel();
提示:
D3DERR_DEVICELOST
D3DERR_DEVICENOTRESET
得到reset消息以后,要重新申请设备,重新开始申请设备表面。
清晰度的问题
d3d默认的放大缩小并不是比较好的线性伸缩。需要设置才行
提示:
IDirect3DDevice9_SetSamplerState(m_d3d_device, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
IDirect3DDevice9_SetSamplerState(m_d3d_device, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
以上是关于Direct3d 显示视频的一个问题的主要内容,如果未能解决你的问题,请参考以下文章