SDL2源码分析8:视频显示总结
=====================================================
SDL源码分析系列文章列表:
SDL2源码分析5:更新纹理(SDL_UpdateTexture())
SDL2源码分析6:拷贝到渲染器(SDL_RenderCopy())
SDL2源码分析7:显示(SDL_RenderPresent())
=====================================================
本文简单总结一下SDL显示视频的源码。
SDL显示视频的结构体
SDL显示视频涉及到下列结构体:
SDL_Window:代表了窗体
SDL_Renderer:代表了渲染器
SDL_Texture:代表了纹理
SDL_Rect:一个矩形框。用于确定纹理显示的位置。
上述几个结构体之间的关系例如以下图所看到的。
PS:该图源自于文章《最简单的基于FFMPEG+SDL的视频播放器 ver2 (採用SDL2.0)》
由图可见。YUV/RGB像素数据首先载入至SDL_Texture,然后通过SDL_Render渲染至SDL_Window。当中SDL_Rect能够指定显示的位置。
SDL显示视频的流程
SDL显示视频的流程例如以下图所看到的。
从图中能够看出。总体的流程能够概括为例如以下步骤:
1. 初始化:SDL_Init()
2. 创建SDL_Window:SDL_CreateWindow()
3. 创建SDL_Render:SDL_CreateRenderer()
4. 创建SDL_Texture:SDL_CreateTexture()
5. 更新SDL_Texture:SDL_UpdateTexture()
6. 渲染SDL_Texture:SDL_RenderCopy()
7. 显示:SDL_RenderPresent()
8. 返回步骤4继续运行
上图中显示了SDL播放视频的时候API的调用流程。
下文总结一下在不同的系统以及渲染技术下,这些SDL的API和系统底层API之间的调用关系。
SDL-Windows-Direct3D
SDL在Windows系统下,使用Direct3D渲染视频的时候的函数调用关系例如以下图所看到的。
PS:白色背景函数为SDL的API;蓝色背景的函数为Win32的API。紫色背景的函数Direct3D的API。
更清晰的图片链接(右键保存):http://my.csdn.net/leixiaohua1020/album/detail/1795753
从图中能够看出,SDL在Windows下使用Direct3D渲染视频的时候。函数之间的调用关系例如以下所列:
SDL_CreateWindow()调用了例如以下Win32的API:
CreateWindow()
SetWindowText()
ShowWindow()
SetWindowPos()
SDL_CreateRenderer()调用了例如以下Direc3D的API:
Direct3DCreate9()
IDirect3D9_GetDeviceCaps()
IDirect3D9_CreateDevice()
IDirect3DDevice9_SetFVF()
IDirect3DDevice9_SetRenderState()
IDirect3DDevice9_SetTextureStageState()
IDirect3DDevice9_SetTransform()
IDirect3DDevice9_CreatePixelShader()
SDL_CreateTexture()调用了例如以下Direc3D的API:
IDirect3DDevice9_CreateTexture()
SDL_UpdateTexture()调用了例如以下Direc3D的API:
IDirect3DTexture9_LockRect()
memcpy():这个不算D3D的。用于拷贝像素数据。
IDirect3DTexture9_UnlockRect()
SDL_RenderCopy()调用了例如以下Direc3D的API:
IDirect3DDevice9_BeginScene()
IDirect3DDevice9_SetRenderState()
IDirect3DDevice9_SetSamplerState()
IDirect3DDevice9_SetTexture()
IDirect3DDevice9_SetPixelShader()
IDirect3DDevice9_DrawPrimitiveUP()
SDL_RenderPresent()调用了例如以下Direc3D的API:
IDirect3DDevice9_EndScene()
IDirect3DDevice9_Present()
SDL-Windows-OpenGL
SDL在Windows系统下,使用OpenGL渲染视频的时候的函数调用关系例如以下图所看到的。
PS:白色背景函数为SDL的API;蓝色背景的函数为Win32的API;紫色背景的函数OpenGL的API。
更清晰的图片链接(右键保存):http://my.csdn.net/leixiaohua1020/album/detail/1795755
从图中能够看出,SDL在Windows下使用OpenGL渲染视频的时候。函数之间的调用关系例如以下所列:
SDL_CreateWindow()调用了例如以下Win32的API:
CreateWindow()
SetWindowText()
ShowWindow()
SetWindowPos()
SDL_CreateRenderer()调用了例如以下OpenGL的API:
glCreateProgramObject()
glCreateShaderObject()
glShaderSource()
glCompileShader()
GetObjectParameteriv()
AttachObject()
LinkProgram()
UseProgramObject()
SDL_CreateTexture()调用了例如以下OpenGL的API:
glGenTextures()
glBindTexture()
glTexParameteri()
glTexImage2D()
SDL_UpdateTexture()调用了例如以下OpenGL的API:
glBindTexture()
glTexSubImage2D()
SDL_RenderCopy()调用了例如以下OpenGL的API:
glActiveTexture()
glBindTexture()
SDL_RenderPresent()调用了例如以下OpenGL的API:
SwapBuffers()
SDL-Windows-Software
SDL在Windows系统下,使用Software渲染视频的时候的函数调用关系例如以下图所看到的。
PS1:白色背景函数为SDL的API;蓝色背景的函数为Win32的API。
PS2:Software渲染眼下还没有透彻分析。
从图中能够看出,SDL在Windows下使用Software渲染视频的时候。函数之间的调用关系例如以下所列:
SDL_CreateWindow()调用了例如以下Win32的API:
CreateWindow()
SetWindowText()
ShowWindow()
SetWindowPos()
SDL_CreateRenderer()调用了例如以下Win32的API:
CreateCompatibleBitmap()
GetDIBits()
CreateCompatibleDC()
CreateDIBSection()
SelectObject()
SDL_UpdateTexture()调用了memcpy()填充像素数据。
SDL_RenderPresent()调用了例如以下Win32的API:
BitBlt()
SDL2源码分析8:视频显示总结的更多相关文章
- SDL2源码分析6:拷贝到渲染器(SDL_RenderCopy())
===================================================== SDL源码分析系列文章列表: SDL2源码分析1:初始化(SDL_Init()) SDL2源 ...
- SDL2源码分析5:更新纹理(SDL_UpdateTexture())
===================================================== SDL源码分析系列文章列表: SDL2源码分析1:初始化(SDL_Init()) SDL2源 ...
- SDL2源码分析2:窗体(SDL_Window)
===================================================== SDL源码分析系列文章列表: SDL2源码分析1:初始化(SDL_Init()) SDL2源 ...
- SDL2源码分析1:初始化(SDL_Init())
===================================================== SDL源码分析系列文章列表: SDL2源码分析1:初始化(SDL_Init()) SDL2源 ...
- 一步步实现windows版ijkplayer系列文章之六——SDL2源码分析之OpenGL ES在windows上的渲染过程
一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...
- 一步步实现windows版ijkplayer系列文章之三——Ijkplayer播放器源码分析之音视频输出——音频篇
一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...
- 一步步实现windows版ijkplayer系列文章之二——Ijkplayer播放器源码分析之音视频输出——视频篇
一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...
- ffplay源码分析6-音频重采样
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10312713.html ffplay是FFmpeg工程自带的简单播放器,使用FFmpeg ...
- ffplay源码分析4-音视频同步
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10307089.html ffplay是FFmpeg工程自带的简单播放器,使用FFmpeg ...
随机推荐
- vim 操作指令2
VIM命令大全 光标控制命令 命令 光标移动 h 向左移一个字符 j 向下移一行 k 向上移一行 l 向右移一个字符 G 移到文件的最后一行 w 移到下一个字的开头 W 移到下一个字的开头,忽略标点符 ...
- TFS2010安装与管理
整了几天TFS,把相关的一些配置与安装的要点简单记下,希望对大家有用.本篇主要是安装与配置上的内容,下一篇会介绍如何使用以及使用方面的相关心得体会. 本篇内容简要: 1. 安装部署 1.1. 流 ...
- leetCode 34.Search for a Range (搜索范围) 解题思路和方法
Search for a Range Given a sorted array of integers, find the starting and ending position of a give ...
- MySQL字符集编码
MySQL字符集编码总结 之前内部博客上凯哥分享了一篇关于mysql字符集的文章,之前我对mysql字符集一块基本没有深究过,看到凯哥文章后有些地方有点疑惑,遂自己去看了mysql的官方文档,并參考了 ...
- 从O2O体验活动看华硕平板也“来电”新融合理念
随着平板电脑的普及,用户对平板的要求也变得越来越高,且这种要求已经逐渐从单纯的性能方面拓展到全方位的功能方面,尤其在通讯.社交.娱乐等层面,平板迫切需要满足用户日益增长的需求. ...
- C++经典笔试题及参考答案-趋势科技
1.static有什么用途?(请至少说明两种) 答案:1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变. 2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数 ...
- 鸟哥之安裝 CentOS7.x
http://linux.vbird.org/linux_basic/0157installcentos7.php since 2002/01/01 新手建議 開始閱讀之前 網站導覽 Linux 基礎 ...
- codeforces 604B More Cowbell
题目链接:http://codeforces.com/contest/604/problem/B 题意:n个数字,k个盒子,把n个数放入k个盒子中,每个盒子最多只能放两个数字,问盒子容量的最小值是多少 ...
- Android开发:TextView添加超链接的简便方法
TextView中加入超链接的方式很多,但下面的方式应该的最简便合理的 strings.xml中定义字串 <string name="blog"><a href= ...
- nginx 源码安装
安装环境: 操作系统:Ubuntu 12.04 Nginx: V1.4.2 PCRE: V8.33 zlib: V1.2.8 下载上述源包到当前用户主目录(本机:/hom ...