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源代码分析7:显示(SDL_RenderPresent())
===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDL_Init()) SDL ...
- SDL2源代码分析6:复制到渲染器(SDL_RenderCopy())
===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDL_Init()) SDL ...
- SDL2源代码分析5:更新纹理(SDL_UpdateTexture())
===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDL_Init()) SDL ...
- SDL2源代码分析4:纹理(SDL_Texture)
===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDL_Init()) SDL ...
- SDL2源代码分析3:渲染器(SDL_Renderer)
===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDL_Init()) SDL ...
- SDL2源代码分析2:窗口(SDL_Window)
===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDL_Init()) SDL ...
- SDL2源代码分析1:初始化(SDL_Init())
===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDL_Init()) SDL ...
- 转:SDL2源代码分析
1:初始化(SDL_Init()) SDL简介 有关SDL的简介在<最简单的视音频播放示例7:SDL2播放RGB/YUV>以及<最简单的视音频播放示例9:SDL2播放PCM>中 ...
- SDL2源代码分析
1:初始化(SDL_Init()) SDL简介 有关SDL的简介在<最简单的视音频播放示例7:SDL2播放RGB/YUV>以及<最简单的视音频播放示例9:SDL2播放PCM>中 ...
随机推荐
- 在 telnet 中利用HTTP协议传递GET、POST参数
HTTP协议不仅可以用在浏览器中,还可以用在任何支持它的地方,平时用浏览器访问网站时HTTP协议内容是隐藏起来看不到的,用 telnet 就能揭开它的神秘面纱.telnet 开启方法参考文章末尾——t ...
- 修改SQL数据库中表字段类型时,报“一个或多个对象访问此列”错误的解决方法
在SQL数据库中使用SQL语句(格式:alter table [tablename] alter column [colname] [newDataType])修改某表的字段类型时,报一下错误:由于一 ...
- Vue2学习(2)
按键修饰符 还可以自定义按键修饰符别名,通过全局 config.keyCodes 对象设置: // 可以使用 `v-on:keyup.f1` Vue.config.keyCodes.f1 = 112 ...
- css文本强制一行 字间距
white-space:nowrap 在一行 .slideLastlyNews img{margin-left:9px;margin-right:5px;margin-top:6px;width:5p ...
- tf.nn.conv2d 和 tf.nn.max_pool 中 padding 分别为 'VALID' 和 'SAME' 的直觉上的经验和测试代码
这个地方一开始是迷糊的,写代码做比较分析,总结出直觉上的经验. 某人若想看精准的解释,移步这个网址(http://blog.csdn.net/fireflychh/article/details/73 ...
- 03_OGNL
1.值栈: 解答Struts能够直接获取属性值: 原因:Struts并不是直接通过request隐式对象中获取,而是将整个对象封装到了ValueStack值栈中,直接匹配是否存在这个属性,找到了就取出 ...
- Window下通过CuteFTP与Linux虚拟机连接失败的原因总结及解决方法
环境:虚拟机类型Redhat Enterprise 6 (1) 虚拟机是否安装了ftp服务器? 若未安装,则yum install vsftpd,并启动ftp服务 (2) 虚拟机防火墙是否已关闭? 若 ...
- Django 跨域请求处理
参考https://blog.csdn.net/qq_27068845/article/details/73007155 http://blog.51cto.com/aaronsa/2071108 d ...
- android M Launcher之LauncherModel (二)
上一篇我们通过LauncherModel的创建 ,实例化,以及与LauncherModel之间的沟通方式.初步了解了LauncherModel一些功能及用法,如果对LauncherModel一系列初始 ...
- Android源码浅析(五)——关于定制系统,如何给你的Android应用系统签名
Android源码浅析(五)--关于定制系统,如何给你的Android应用系统签名 今天来点简单的我相信很多定制系统的同学都会有一些特定功能的需求,比如 修改系统时间 静默安装 执行某shell命令 ...