如何使用DirectDraw直接显示RGB、YUV视频数据(播放yuv)
#include "draw.h"
void CTest100Dlg::OnButton1()
{
// TODO: Add your control notification handler code here
CloseShowBMP();
InitDrawBMP(m_screen.GetSafeHwnd(),m_sel.GetCurSel());
}
void CTest100Dlg::OnButton2()
{
CString strFilename,str;
CFileDialog openBox(TRUE,NULL,"",OFN_HIDEREADONLY,"bmp(*.bmp)|*.bmp|ALLFiles(*.*)|*.*||",NULL);
openBox.m_ofn.lpstrTitle="打开数据文件";
INT_PTR nResult = openBox.DoModal();
// 如果文件打开则准备播放
if (nResult == IDOK)
{
strFilename=openBox.GetPathName();
}
else
{
return;
}
strFilename.ReleaseBuffer();
ReadBMP(strFilename);
ShowBMP();
}
void CTest100Dlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
// MessageBox("sadf");
CloseShowBMP();
CDialog::OnClose();
}
void CTest100Dlg::OnButton3()
{
// TODO: Add your control notification handler code here
CString strFilename,str;
CFileDialog openBox(TRUE,NULL,"",OFN_HIDEREADONLY,"YUV(*.yuv)|*.yuv|ALLFiles(*.*)|*.*||",NULL);
openBox.m_ofn.lpstrTitle="打开数据文件";
INT_PTR nResult = openBox.DoModal();
// 如果文件打开则准备播放
if (nResult == IDOK)
{
strFilename=openBox.GetPathName();
}
else
{
return;
}
strFilename.ReleaseBuffer();
CClientDC dc(this);
CDC *pdc = &dc;
ReadYUV(strFilename,pdc);
}
void CTest100Dlg::OnButton4()
{
LPDIRECTDRAW lpdd=NULL;
LPDIRECTDRAW7 lpdd7=NULL;
//LPDIRECTDRAWSURFACE7 lpddsback;
LPDIRECTDRAWSURFACE7 lpddsprimary=NULL;
LPDIRECTDRAWSURFACE7 lpddsmypage[6];
LPDIRECTDRAWPALETTE lpddpal=NULL;
DDSURFACEDESC2 ddsd;
LPDIRECTDRAWCLIPPER lpDDClipper = NULL;
// TODO: 在此添加控件通知处理程序代码
height=width=widthBytes=0;
m_screen.SetWindowPos(&CWnd::wndBottom,0,0,720,576, SWP_NOMOVE | SWP_SHOWWINDOW);
UpdateWindow();
main_window_handle = m_screen.GetSafeHwnd();
if(DD_OK!=(DirectDrawCreateEx(NULL, (void **)&lpdd7, IID_IDirectDraw7, NULL)))
{
return ;
}
// set the cooperative level for full-screen mode
if(DD_OK != lpdd7->SetCooperativeLevel(AfxGetMainWnd()->GetSafeHwnd(), DDSCL_NORMAL))
{
return ;
}
/*设置控制级时,如果应用程序请求了 DDSCL_NORMAL 模式(表明应用程序以普通窗口的形式运行),则不需要提供一个指定窗口的句柄.给窗口句柄参数为 NULL, 所有的窗口都可以被设置为普通的控制级. */
// set the display mode to 640x480x256
// clear ddsd and set size
memset(&ddsd,0,sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
// enable valid fields
ddsd.dwFlags=DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
// create the primary surface
if(DD_OK!=(lpdd7->CreateSurface(&ddsd, &lpddsprimary, NULL)))
{
return ;
}
// 创建裁剪器
if (FAILED(lpdd7->CreateClipper(0, &lpDDClipper, NULL)))
return ;
// 与窗口工作区关联
if (FAILED(lpDDClipper->SetHWnd(0, main_window_handle)))
{
lpDDClipper->Release();
return ;
}
if (FAILED(lpddsprimary->SetClipper(lpDDClipper)))
{
lpDDClipper->Release();
return ;
}
//
memset(&ddsd,0,sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
ddsd.dwWidth = 720;
ddsd.dwHeight = 576;
ddsd.dwBackBufferCount = 0;//忽略 //忽略
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN| DDSCAPS_VIDEOMEMORY;
ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
ddsd.ddpfPixelFormat.dwFlags = DDPF_FOURCC | DDPF_YUV ;
ddsd.ddpfPixelFormat.dwFourCC = MAKEFOURCC('Y','V','1','2');
ddsd.ddpfPixelFormat.dwYUVBitCount = 8;
//
if(DD_OK!=(lpdd7->CreateSurface(&ddsd, &lpddsmypage[0], NULL)))
{
return ;
}
POINT p;
p.x = 0; p.y = 0;
m_screen.ClientToScreen(&p);//获取屏幕顶点
// m_screen.GetClientRect(&rcRectDest);
rcRectDest.left = 0; rcRectDest.top=0; rcRectDest.right = 720; rcRectDest.bottom = 576;
OffsetRect(&rcRectDest, p.x, p.y);//把窗口区域转化为屏幕区域坐标
SetRect(&rcRectSrc, 0, 0, 720, 576);//初始化窗口区域
/////////////////////////////////////////////////////////////
BYTE *buf[3];
buf[0] = new BYTE[720*576];
buf[1] = new BYTE[720*576/4];
buf[2] = new BYTE[720*576/4];
FILE *fp;
fp = fopen("d:\\temp\\VIDEO720576.yuv","rb+");
while(!feof(fp))
{
// fread(buf,720*576*3/2,1,fp);
if(DD_OK != lpddsmypage[0]->Lock(NULL,&ddsd,DDLOCK_WAIT|DDLOCK_SURFACEMEMORYPTR,NULL))
{
return ;
}
UCHAR *lp_buffer = (UCHAR *)ddsd.lpSurface;
fread(buf[0],720*576,1,fp);
fread(buf[1],720*576/4,1,fp);
fread(buf[2],720*576/4,1,fp);
LPBYTE lpY = lp_buffer;
LPBYTE lpV = lp_buffer + ddsd.lPitch * 576;
LPBYTE lpU = lp_buffer + ddsd.lPitch * 576 * 5 / 4;
for (int k=0;k<576;k++)
{
memcpy(lpY + k*ddsd.lPitch,buf[0]+720*k,720);
if (k%2==0)
{
memcpy(lpU+ k*ddsd.lPitch/4 ,buf[1]+720*k/4,720/2);
memcpy(lpV+ k*ddsd.lPitch/4 ,buf[2]+720*k/4,720/2);
}
}
Sleep(40);
//////////////////////////////////////////////////////////////////////////
//memcpy(bmp_buffer,buf[0],720*576*2);
if(DD_OK != lpddsmypage[0]->Unlock(NULL))
{
return ;
}
HRESULT ddRval;
ddRval= lpddsprimary->Blt( &rcRectDest, lpddsmypage[0], &rcRectSrc, DDBLT_WAIT, NULL);
//while(ddRval == DDERR_WASSTILLDRAWING);
//ddRval=lpddsprimary->Flip(lpddsmypage[0],1);
if(DD_OK != ddRval)
{
return ;
}
}
//fclose(fp);
if(lpddsmypage)
{
lpddsmypage[0]->Release();
lpddsmypage[0]=NULL;
}
MessageBox(_T("over"));
}
http://download.csdn.net/detail/mao0514/8202699
如何使用DirectDraw直接显示RGB、YUV视频数据(播放yuv)的更多相关文章
- 使用DirectDraw直接显示YUV视频数据
最近在编写一个进行视频播放的ActiveX控件,工作已经接近尾声,现将其中显示YUV数据的使用DirectDraw的一些经验总结如下:(解码部分不是我编写的,我负责从网络接收数据,将数据传给解码器,并 ...
- 使用D3D渲染YUV视频数据
源代码下载 在PC机上,对于YUV格式的视频如YV12,YUY2等的显示方法,一般是采用DIRECTDRAW,使用显卡的OVERLAY表面显示.OVERLAY技术主要是为了解决在PC上播放VCD而在显 ...
- 使用D3D渲染YUV视频数据<转>
源代码下载 转载地址:http://blog.csdn.net/dengzikun/article/details/5824874 源码地址:http://download.csdn.net/down ...
- avi视频格式转yuv格式与播放yuv视频
因为要用到yuv格式视频.而眼下仅仅有avi格式的视频,所以须要转换,而且opencv不支持yuv编码的视频播放.所以须要转换为rgb编码.而后播放.写了两个程序.以供參考: 1,avi格式视频转yu ...
- DirectDraw 直接显示RGB图象的最简单实现
来自: #include "DDraw.h" class CDDraw { public: void CleanUp(); void DrawDIB(BITMAPINFOH ...
- 基于RTP的H264视频数据打包解包类
from:http://blog.csdn.net/dengzikun/article/details/5807694 最近考虑使用RTP替换原有的高清视频传输协议,遂上网查找有关H264视频RTP打 ...
- JavaCV 采集摄像头及桌面视频数据
javacv 封装了javacpp-presets库很多native API,简化了开发,对java程序员来说比较友好. 之前使用JavaCV库都是使用ffmpeg native API开发,这种方式 ...
- 转:YUV RGB 常见视频格式解析
转: http://www.cnblogs.com/qinjunni/archive/2012/02/23/2364446.html YUV RGB 常见视频格式解析 I420是YUV格式的一种,而Y ...
- FFmpeg(六) 播放视频之GLSurfaceView显示RGB数据
一.播放视频说明 1.两种方式播放视频 ①shader播放YUV,后面再介绍. ②RGB直接显示数据,简单.性能差,用到FFmpeg的格式转换,没有shader效率高.本文介绍这个方式. 2.GLSu ...
随机推荐
- Bug等级判断标准
测试的问题大致可分为以下几个类型:致命问题严重问题一般问题轻微问题 判断标准如下1.致命问题:造成系统崩溃.死机.死循环,导致数据库数据丢失,与数据库连接错误,主要功能丧失,基本模块缺失等问题.如:代 ...
- 程序管理与SElinux
一.程序: 1.在Linux中,触发任何一个事件是,系统都会将他定义为一个程序,并且给予这个程序一PID,同时依据启发这个程序的使用者与相关属性关系,给予这个PID一组有效的权限设定,从此以后,这个P ...
- 关于scanf,gets
1.用了gets后,假如你没有输入任何东西直接[enter],它将执行下一条命令 2.用了scanf后,直接按了[enter],它将换行并等待你的输入,直到你输入非[enter],再执行下一条命令. ...
- 前端自动化测试神器-Katalon进阶用法
前言 上一篇介绍了Katalon的基础用法,本篇继续介绍一些进阶的用法. Keyword 和 Method Call Statement Keyword Keyword就是自定义方法,该方法在当前项目 ...
- MySQL死锁案例分析与解决方案
MySQL死锁案例分析与解决方案 现象: 数据库查询: SQL语句分析: mysql. 并发delete同一行记录,偶发死锁. delete from x_table where id=? ...
- mysql5.6默认情况下内存占用太大
下载了mysql5.6.12 ,默认占用内存达400多M, 而原来使用的5.0 只有30M.. 解决方案:调整以下参数----------------performance_schema_max_t ...
- ABP官方文档翻译 2.2 ABP会话
ABP会话 介绍 关于IAbpSession 注入会话 会话属性 覆盖当前会话值 警告! 用户标示 介绍 如果应用需要登录的话,同样也需要知道当前用户可以执行哪些操作.ABP在展现层提供了会话对象,同 ...
- Python基础篇(二)
Python最基本的数据结构是序列(sequence),序列中的每个元素被分以以0开头的唯一的一个id号. Python中有6种内建的序列:列表,元组,字符串,Unicode字符串,buffer对象和 ...
- 洛谷 [P2701] 巨大的牛棚
首先,本题是一道最大子矩阵问题,且m,n较小,可以使用DP做, 与 洛谷 [P1387]最大正方形 做法相同. #include <iostream> #include <cstdi ...
- [Sdoi2017]相关分析 [线段树]
[Sdoi2017]相关分析 题意:沙茶线段树 md其实我考场上还剩一个多小时写了40分 其实当时写正解也可以吧1h也就写完了不过还要拍一下 正解代码比40分短2333 #include <io ...