=====================================================

SDL源码分析系列文章列表:

SDL2源码分析1:初始化(SDL_Init())

SDL2源码分析2:窗体(SDL_Window)

SDL2源码分析3:渲染器(SDL_Renderer)

SDL2源码分析4:纹理(SDL_Texture)

SDL2源码分析5:更新纹理(SDL_UpdateTexture())

SDL2源码分析6:拷贝到渲染器(SDL_RenderCopy())

SDL2源码分析7:显示(SDL_RenderPresent())

SDL2源码分析8:视频显示总结

=====================================================

本文简单总结一下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显示视频的流程例如以下图所看到的。

 更清晰的图片链接(右键保存):http://my.csdn.net/leixiaohua1020/album/detail/1795751

从图中能够看出。总体的流程能够概括为例如以下步骤:
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。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVpeGlhb2h1YTEwMjA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

更清晰的图片链接(右键保存):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渲染眼下还没有透彻分析。

更清晰的图片链接(右键保存):http://my.csdn.net/leixiaohua1020/album/detail/1795757

从图中能够看出,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:视频显示总结的更多相关文章

  1. SDL2源码分析6:拷贝到渲染器(SDL_RenderCopy())

    ===================================================== SDL源码分析系列文章列表: SDL2源码分析1:初始化(SDL_Init()) SDL2源 ...

  2. SDL2源码分析5:更新纹理(SDL_UpdateTexture())

    ===================================================== SDL源码分析系列文章列表: SDL2源码分析1:初始化(SDL_Init()) SDL2源 ...

  3. SDL2源码分析2:窗体(SDL_Window)

    ===================================================== SDL源码分析系列文章列表: SDL2源码分析1:初始化(SDL_Init()) SDL2源 ...

  4. SDL2源码分析1:初始化(SDL_Init())

    ===================================================== SDL源码分析系列文章列表: SDL2源码分析1:初始化(SDL_Init()) SDL2源 ...

  5. 一步步实现windows版ijkplayer系列文章之六——SDL2源码分析之OpenGL ES在windows上的渲染过程

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

  6. 一步步实现windows版ijkplayer系列文章之三——Ijkplayer播放器源码分析之音视频输出——音频篇

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

  7. 一步步实现windows版ijkplayer系列文章之二——Ijkplayer播放器源码分析之音视频输出——视频篇

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

  8. ffplay源码分析6-音频重采样

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10312713.html ffplay是FFmpeg工程自带的简单播放器,使用FFmpeg ...

  9. ffplay源码分析4-音视频同步

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10307089.html ffplay是FFmpeg工程自带的简单播放器,使用FFmpeg ...

随机推荐

  1. BSGS_Baby steps giant steps算法

    BSGS这个主要是用来解决这个题: A^x=B(mod C)(C是质数),都是整数,已知A.B.C求x. 在具体的题目中,C一般是所有可能事件的总数. 解: 设m = ceil(sqrt(C))(ce ...

  2. boost.asio包装类st_asio_wrapper开发教程(2014.5.23更新)(一)-----转

    一:什么是st_asio_wrapper它是一个c/s网络编程框架,基于对boost.asio的包装(最低在boost-1.49.0上调试过),目的是快速的构建一个c/s系统: 二:st_asio_w ...

  3. asp.net web api帮助文档的说明

    为asp.net的mvc web api填写自己的帮助文档 1. 加入Help的area(能够通过命令行或其它方式加入) 命令行:Install-Package Microsoft.AspNet.We ...

  4. HTML——使用表格对表单进行布局

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3Vuc2h1bWlu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...

  5. Android:Drag and Drop的应用

    最近看了下Drag and Drop部分的原文,觉得很有意思就像自己试着做一下,说实在的原文真的是不好读啊,要感谢那些为我们发表译文的大神们, 真的是不容易,原文中给了例子,但是只有后面零星的代码,真 ...

  6. iOS 网络错误-分类

    在进行网络数据交换的时候总是遇到各种各样的错误. 这些网络错误是来自client还是server. 我们来梳理一下: 我们将错误分为三个大类 操作系统错误 http请求错误 应用错误 1.操作系统错误 ...

  7. perl的一些基本用法

    ReadLine support available (try 'install Bundle::CPAN')cpan>进入cpan的shell,好了,我为了安装spamassassin,需要安 ...

  8. Unity3d 4.3.4f1执行项目

    今天.本来执行的非常快的一个项目. 忽然打开非常晚.尝试新建一个新的项目,竟然执行速度非常快. 心有不忿的,把整个Unity删除了.又一次安装. 再打开那个执行变慢的项目. 结果.执行速度回来了. 不 ...

  9. dsplib使用备忘

    1. 到TI官网下载与自己的芯片对应的dsplib库 2. 在工程属性里添加dsplib的头文件路径,lib库路径 3. 在源文件中包含dsplib头文件,如果是在.cpp文件里调用,包含头文件时要用 ...

  10. ajax+jsp实现三级联动下拉框

    js文件sjld.js  : $(document).ready( function(){ $.ajax({ url:"bindZ", type:"get", ...