基本信息
源码名称:c++ YUVplayer 示例源码
源码大小:0.84M
文件格式:.zip
开发语言:C/C++
更新时间:2018-08-13
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
/* * Copyright (c) 2010, Tae-young Jung * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the <organization>. * 4. Neither the name of the <organization> nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY <COPYRIGHT HOLDER> ''AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // OpenGLView.cpp : implementation file // #include "stdafx.h" #include "yuvplayer.h" #include "OpenGLView.h" #include <gl/gl.h> // COpenGLView IMPLEMENT_DYNCREATE(COpenGLView, CView) COpenGLView::COpenGLView() { loaded[0] = FALSE; loaded[1] = FALSE; t_width = 0; t_height = 0; ratio = 1.0; } COpenGLView::~COpenGLView() { } BEGIN_MESSAGE_MAP(COpenGLView, CView) ON_WM_CREATE() ON_WM_SIZE() ON_WM_DESTROY() ON_WM_ERASEBKGND() END_MESSAGE_MAP() // COpenGLView drawing void COpenGLView::OnDraw(CDC* pDC) { CDocument* pDoc = GetDocument(); HDC dc = ::GetDC(m_hWnd); int i; // TODO: add draw code here glClear(GL_COLOR_BUFFER_BIT); // clear screen and depth buffer for (i = 0 ; i < 2 ; i ) { if( loaded[i] ){ glBindTexture( GL_TEXTURE_2D, texture[i]); glBegin(GL_QUADS); glTexCoord2f( 0.f, 0.f ); glVertex3i( 0, 0, i); glTexCoord2f( 0.f, 1.f ); glVertex3i( 0, t_height, i); glTexCoord2f( 1.f, 1.f ); glVertex3i( t_width, t_height, i); glTexCoord2f( 1.f, 0.f ); glVertex3i( t_width, 0, i); glEnd(); } } SwapBuffers( dc ); ::ReleaseDC( m_hWnd, dc ); } // COpenGLView diagnostics #ifdef _DEBUG void COpenGLView::AssertValid() const { CView::AssertValid(); } #ifndef _WIN32_WCE void COpenGLView::Dump(CDumpContext& dc) const { CView::Dump(dc); } #endif #endif //_DEBUG // COpenGLView message handlers BOOL COpenGLView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CS_OWNDC; return CView::PreCreateWindow(cs); } int COpenGLView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here int nPixelFormat; // our pixel format index static PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), // size of structure 1, // default version PFD_DRAW_TO_WINDOW | // window drawing support PFD_SUPPORT_OPENGL | // OpenGL support PFD_DOUBLEBUFFER, // double buffering support PFD_TYPE_RGBA, // RGBA color mode 32, // 32 bit color mode 0, 0, 0, 0, 0, 0, // ignore color bits, non-palettized mode 0, // no alpha buffer 0, // ignore shift bit 0, // no accumulation buffer 0, 0, 0, 0, // ignore accumulation bits 0, // no z-buffer size 0, // no stencil buffer 0, // no auxiliary buffer PFD_MAIN_PLANE, // main drawing plane 0, // reserved 0, 0, 0 }; // layer masks ignored HDC hdc = ::GetDC(m_hWnd); nPixelFormat = ChoosePixelFormat(hdc, &pfd); BOOL success = SetPixelFormat(hdc, nPixelFormat, &pfd); m_hRC = wglCreateContext(hdc); wglMakeCurrent(hdc, m_hRC); glDisable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glGenTextures( 2, texture ); glBindTexture(GL_TEXTURE_2D, texture[0] ); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glBindTexture(GL_TEXTURE_2D, texture[1] ); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glClearColor(0,0,0,0); return 0; } void COpenGLView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); // TODO: Add your message handler code here glViewport( 0, 0, cx, cy ); glMatrixMode(GL_PROJECTION); // set projection matrix current matrix glLoadIdentity(); glOrtho( 0, cx, cy, 0, 0, 100); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef( 0, 0, -10.0f ); glScalef( ratio, ratio, 1.f ); } void COpenGLView::OnDestroy() { CView::OnDestroy(); // TODO: Add your message handler code here wglDeleteContext(m_hRC); } void COpenGLView::SetParam(int width, int height, float ratio) { for( t_width = 2 ; t_width < width ; t_width *= 2 ); for( t_height = 2 ; t_height < height ; t_height *= 2 ); this->ratio = ratio; loaded[0] = FALSE; loaded[1] = FALSE; } void COpenGLView::LoadTexture(unsigned char* rgba) { glBindTexture(GL_TEXTURE_2D, texture[0] ); if( loaded[0] ) glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, t_width, t_height, GL_RGBA, GL_UNSIGNED_BYTE, rgba ); else { glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, t_width, t_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgba ); loaded[0] = TRUE; } Invalidate(NULL); } void COpenGLView::LoadSegmentTexture(unsigned char* segment) { glBindTexture(GL_TEXTURE_2D, texture[1] ); if( loaded[1] ) glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, t_width, t_height, GL_RGBA, GL_UNSIGNED_BYTE, segment ); else{ glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, t_width, t_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, segment ); loaded[1] = TRUE; } Invalidate(NULL); } BOOL COpenGLView::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default return TRUE; //return CView::OnEraseBkgnd(pDC); }