vlc使用ffmepg get_buffer2流程

简介: 一、综述:在设计播放器1.0时,曾使用vtune和VS自带的性能分析工具测试,对于播放器这样的软件其核心流程分为收流&拼帧、解码、渲染三大块,其中收流&拼帧在大并发模式下不是性能瓶颈。

一、综述:

在设计播放器1.0时,曾使用vtune和VS自带的性能分析工具测试,对于播放器这样的软件其核心流程分为收流&拼帧、解码、渲染三大块,其中收流&拼帧在大并发模式下不是性能瓶颈。渲染模块使用D3D渲染,渲染操作本身仅占用3%左右的CPU时间。而解码和拷贝操作是非常耗费CPU的。对于ffmpeg解码优化,本文不做赘述,后续详细展开。此处仅讨论内存拷贝优化方案

二、内存拷贝优化方案

1、业界通用播放器一般均使用内存池pool的设计思路,根据分辨率大小申请内存块,一旦申请后,由内存池统一管理。解码模块从内存池get内存,填充数据后,通知渲染模块,渲染模块消费后,归还到内存池。类似生产、消费的模式。这种设计思路的优点是大量减少了内存申请释放的动作,处理效率高。缺点是解码、渲染线程在访问内存池时需加锁,并发性上有损耗。

2、如果是基于消息驱动机制实现的播放器,解码模块与渲染模块是消息驱动,相互间的交互完全通过发消息,取消息队列数据完成。未采用内存池方法,而是每次解码时申请内存,渲染模块消费后释放。

几大优化点:

1)解码前可以new出内存=解码对象Length+YUV占用数据空间+ffmepg解码所需的padding空间。一次申请这样一块连续内存,配合下面详细流程中偏移到YUV地址,将Y\U\V三个picth指针地址记录后交由ffmpeg解码,解码后将解码参数赋值到解码对象中,可以使用 new(pBuf)CVideoFrame()方式转换为CVideoFrame对象指针后赋值。这样改进后解码到最终渲染需new一次内存,拷贝一次(申请的内存拷贝到D3D离屏表面)

2)VLC中还做了优化,D3D离屏表面的内存由于内存池第一个,这样使用这块内存的时候可以省掉一次拷贝。(个人觉得没必要,增加了代码复杂度,且优化效果不明显)

三、详细流程

1   modules\codec\avcodec\video.c           InitVideoDec    get_buffer2 = lavc_GetFrame;

2   modules\codec\avcodec\video.c           lavc_GetFrame
3   modules\codec\avcodec\video.c           lavc_dr_GetFrame
4   modules\codec\avcodec\video.c           ffmpeg_NewPictBuf
5   src\input\decoder.c                     decoder_NewPicture
6   src\input\decoder.c                     vout_new_buffer
7   if (p_owner->p_vout == NULL) goto 8 else goto 13
8       src\input\resource.c                if (p_owner->p_vout == NULL) input_resource_RequestVout
9       src\input\resource.c                RequestVout
10      src\video_output\video_output.c     VoutCreate
11      src\video_output\video_output.c     vlc_clone(&vout->p->thread, Thread, vout, VLC_THREAD_PRIORITY_OUTPUT) 创建线程 goto 15
12      src\video_output\video_output.c     vout_control_WaitEmpty(&vout->p->control); 等待线程创建picture_pool完毕 goto 13
    
13  src\video_output\video_output.c         vout_GetPicture
14  src\misc\picture_pool.c                 picture_pool_Get 从picture_pool取出一帧pciture_t


15  src\video_output\video_output.c         Thread
16  src\video_output\video_output.c         ThreadControl
17  src\video_output\video_output.c         ThreadStart

18  src\video_output\vout_wrapper.c         vout_OpenWrapper goto 24

19  src\video_output\vout_wrapper.c         vout_InitWrapper
20  src\misc\picture_pool.c                 picture_pool_NewFromFormat
21  src\misc\picture_pool.c                 picture_pool_New 创建picturepool
22  src\misc\picture.c                      33次picture_NewFromFormat
23  src\misc\picture.c                      picture_NewFromResource     return 11 to 12

24  src\video_output\display.c              vout_NewDisplay
25  src\video_output\display.c              DisplayNew
26  src\video_output\display.c              vout_display_New
27  src\modules\modules.c                   module_need
28  src\modules\modules.c                   vlc_module_load
29  modules\video_output\msw\direct3d.c     Open
30  modules\video_output\msw\direct3d.c     Direct3DOpen
31  modules\video_output\msw\direct3d.c     Direct3DCreateResources
32  modules\video_output\msw\direct3d.c     Direct3DCreatePool
33  src\misc\picture.c                      picture_NewFromResource     return 18 to 19



筱骏
+关注
目录
打赏
0
0
0
0
41
分享
相关文章
FFmpeg开发笔记(二十六)Linux环境安装ZLMediaKit实现视频推流
《FFmpeg开发实战》书中介绍轻量级流媒体服务器MediaMTX,但其功能有限,不适合生产环境。推荐使用国产开源的ZLMediaKit,它支持多种流媒体协议和音视频编码标准。以下是华为欧拉系统下编译安装ZLMediaKit和FFmpeg的步骤,包括更新依赖、下载源码、配置、编译、安装以及启动MediaServer服务。此外,还提供了通过FFmpeg进行RTSP和RTMP推流,并使用VLC播放器拉流的示例。
419 3
FFmpeg开发笔记(二十六)Linux环境安装ZLMediaKit实现视频推流
|
9月前
|
FFmpeg开发笔记(二十四)Linux环境给FFmpeg集成AV1的编解码器
AV1是一种高效免费的视频编码标准,由AOM联盟制定,相比H.265压缩率提升约27%。各大流媒体平台倾向使用AV1。本文介绍了如何在Linux环境下为FFmpeg集成AV1编解码库libaom、libdav1d和libsvtav1。涉及下载源码、配置、编译和安装步骤,包括设置环境变量以启用这三个库。
373 3
FFmpeg开发笔记(二十四)Linux环境给FFmpeg集成AV1的编解码器
|
10月前
FFmpeg开发笔记(十八)FFmpeg兼容各种音频格式的播放
《FFmpeg开发实战》一书中,第10章示例程序playaudio.c原本仅支持mp3和aac音频播放。为支持ogg、amr、wma等非固定帧率音频,需进行三处修改:1)当frame_size为0时,将输出采样数量设为512;2)遍历音频帧时,计算实际采样位数以确定播放数据大小;3)在SDL音频回调函数中,确保每次发送len字节数据。改进后的代码在chapter10/playaudio2.c,可编译运行播放ring.ogg测试,成功则显示日志并播放铃声。
163 1
FFmpeg开发笔记(十八)FFmpeg兼容各种音频格式的播放
FFmpeg简易播放器的实现1-最简版
基于 FFmpeg 和 SDL 实现的简易视频播放器,主要分为读取视频文件解码和调用 SDL 播放两大部分。
490 0
FFmpeg简易播放器的实现1-最简版
FFmpeg开发笔记(六):ffmpeg解码视频并使用SDL同步时间显示播放
FFmpeg开发笔记(六):ffmpeg解码视频并使用SDL同步时间显示播放
FFmpeg开发笔记(六):ffmpeg解码视频并使用SDL同步时间显示播放
FFmpeg开发笔记(八):ffmpeg解码音频并使用SDL同步音频播放
FFmpeg开发笔记(八):ffmpeg解码音频并使用SDL同步音频播放
FFmpeg开发笔记(八):ffmpeg解码音频并使用SDL同步音频播放
FFmpeg 开发(06):FFmpeg 播放器实现音视频同步的三种方式
前文中,我们基于 FFmpeg 利用 OpenGL ES 和 OpenSL ES 分别实现了对解码后视频和音频的渲染,本文将实现播放器的最后一个重要功能:音视频同步。
561 0
FFmpeg 开发(06):FFmpeg 播放器实现音视频同步的三种方式
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等