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 显示视频的一个问题的主要内容,如果未能解决你的问题,请参考以下文章

高效渲染从 Media Foundation 获得的 Direct3D 视频

如何使用两个片段实现视频和视频列表

视频没有在片段 ViewPager 中暂停

如何在片段中播放视频

从其他片段启动视频视图片段时显示问题?

滚动时在另一个片段视频视图中重叠一个片段的视频拇指