#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)的更多相关文章

  1. 使用DirectDraw直接显示YUV视频数据

    最近在编写一个进行视频播放的ActiveX控件,工作已经接近尾声,现将其中显示YUV数据的使用DirectDraw的一些经验总结如下:(解码部分不是我编写的,我负责从网络接收数据,将数据传给解码器,并 ...

  2. 使用D3D渲染YUV视频数据

    源代码下载 在PC机上,对于YUV格式的视频如YV12,YUY2等的显示方法,一般是采用DIRECTDRAW,使用显卡的OVERLAY表面显示.OVERLAY技术主要是为了解决在PC上播放VCD而在显 ...

  3. 使用D3D渲染YUV视频数据<转>

    源代码下载 转载地址:http://blog.csdn.net/dengzikun/article/details/5824874 源码地址:http://download.csdn.net/down ...

  4. avi视频格式转yuv格式与播放yuv视频

    因为要用到yuv格式视频.而眼下仅仅有avi格式的视频,所以须要转换,而且opencv不支持yuv编码的视频播放.所以须要转换为rgb编码.而后播放.写了两个程序.以供參考: 1,avi格式视频转yu ...

  5. DirectDraw 直接显示RGB图象的最简单实现

      来自:   #include "DDraw.h" class CDDraw { public: void CleanUp(); void DrawDIB(BITMAPINFOH ...

  6. 基于RTP的H264视频数据打包解包类

    from:http://blog.csdn.net/dengzikun/article/details/5807694 最近考虑使用RTP替换原有的高清视频传输协议,遂上网查找有关H264视频RTP打 ...

  7. JavaCV 采集摄像头及桌面视频数据

    javacv 封装了javacpp-presets库很多native API,简化了开发,对java程序员来说比较友好. 之前使用JavaCV库都是使用ffmpeg native API开发,这种方式 ...

  8. 转:YUV RGB 常见视频格式解析

    转: http://www.cnblogs.com/qinjunni/archive/2012/02/23/2364446.html YUV RGB 常见视频格式解析 I420是YUV格式的一种,而Y ...

  9. FFmpeg(六) 播放视频之GLSurfaceView显示RGB数据

    一.播放视频说明 1.两种方式播放视频 ①shader播放YUV,后面再介绍. ②RGB直接显示数据,简单.性能差,用到FFmpeg的格式转换,没有shader效率高.本文介绍这个方式. 2.GLSu ...

随机推荐

  1. ELK安装

    一.概念 1.核心组成 ELK由Elasticsearch.Logstash和Kibana三部分组件组成: Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引 ...

  2. viim命令行模式查找替换

    1.查找 /   向上查找 ? 向下查找 2.替换 1.:s/vivian/sky/ 替换当前行第一个 vivian 为 sky :s/vivian/sky/g 替换当前行所有 vivian 为 sk ...

  3. python selenium 鼠标悬停

    #鼠标悬停 chain = ActionChains(driver) implement = driver.find_element_by_link_text() chain.move_to_elem ...

  4. 11_Python文件操作

    一.文件操作的基本流程 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众 ...

  5. android adb shell input各种妙用

    项目中使用一个开发版,预留两个usb接口.类似华硕TinkerBoard. 一个用户连接摄像头,一个用于adb调试.结果就没了鼠标的接口.多次切换鼠标和摄像头插头,非常不方便,带摄像头的app没法调试 ...

  6. Oracle打印日历功能

    Oracle用SQL打印日历 1.1  打印当月日历 , D, NULL)) SUN, , D, NULL)) MON, , D, NULL)) TUE, , D, NULL)) WED, , D,  ...

  7. java 虚拟机--新生代与老年代GC [转]

    原文链接:http://www.360doc.com/content/12/1023/16/9615799_243296263.shtml 1. Java堆中各代分布: 图1:Java堆中各代分布 Y ...

  8. RMI基础篇

    远程方法调用(Remote Method Invocation,RMI)从JDK1.1就已经实现,它大大增强了Java开发分布式应用的能力. RMI可以实现通过网络完成不同JVM间的通信,不仅可以传递 ...

  9. document.activeElement 过滤选择文件弹窗导致的页面失焦

    在线考试页面,常常需要检测用户是否作弊. 一般是监听页面是否失焦的方式,而失焦的方式有很多种,比如QQ弹窗,切换页面,切换程序,input文件上传选择文件等 选择文件是正常情况,这种情况下需要过滤 本 ...

  10. 本地Linux服务器上配置Git

    当我们需要拉取远程服务器代码到本地服务器时,我们首先要确定已经配置了正确的Git账号,可以从~/.gitconfig文件(为隐藏文件,需要使用ls -a查看),以及~/.ssh下的id_rsa.pub ...