vlc使用ffmepg get_buffer2流程

一、综述:

在设计播放器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

时间: 2024-10-23 13:53:49

vlc使用ffmepg get_buffer2流程的相关文章

【VLC核心二】clock管理流程

一.前言 clock管理是vlc播放音视频的重要部分,从live555收流到decoder解码到render渲染,整个播放过程中均需依赖clock机制. 二.涉及的类文件 src\input\input.c modules\access\live555.cpp src\input\es_out.c src\input\decoder.c src\input\clock.c 三.clock核心点备注 1.live555::CmdExecuteControl(ES_OUT_SET_PCR,p_sys

【VLC核心一】播放流程梳理->live555收流+ffmpeg:AVCodec解码

一.前言 VLC播放音视频的核心流程梳理,从live555收流到ffmpeg解码的整套流程 涉及到MultiFramedRTPSource.RTPSource.FramedSource.live555.es_out.decoder.video.clock.video_output.araw.mtime.dec.input.output.filters.directx等核心类. 二.核心点备注 1.RTPSource中使用报文时间戳与当前时间计算抖动的核心代码 unsigned arrival =

VLC音频重采样Audio resample核心流程梳理

基于VLC的视频播放器

原文:基于VLC的视频播放器 最近在研究视频播放的功能,之前是使用VideoView.在网上看了一下,感觉不是很好,支持的格式比较少,现在网络视频的格式各种各样,感觉用VideoView播放起来局限性很大. 找到了一个比较合适的播放器,Github地址为https://github.com/xiaomo/AndroidPlayerLibrary .这个播放器是基于vlc这个软件,在将我们的demo导入到Eclipse中之后,可以发现,这样一个libvlc文件夹. 在Media这个类中我们可以发现

VLC播放器调试经验总结

一.前言 在使用VS学习VLC源码时,可以打断点分析变量数据,跟踪代码流程,方便我们理解源码.但是在定位音视频卡顿.延时等疑难问题时,这一招就不管用了,因为打上断点就会导致实时计算的pts值不准确,影响复现真实场景.所以音视频卡顿.延时类问题,更需要我们抓包.打印每一帧数据的Timestamp.pts及clock转换中的关键数据.这里引入一个简单的方法:增加收流.解码.渲染一条线上的时间戳,便于分析. 二.时间戳日志打印具体方法 1.将live/liveMedia/include/RTPSour

VLC已知问题及解决办法,欢迎拍砖

本文会持续更新~~~~~ 研究VLC有一段时间了,发现VLC中有不少问题,做了部分修改,欢迎各位拍砖. 1.VS编译的版本不能播放tcp的流,而官网下载的release版本可以播放. 原因: 1.VS编译的版本中使用了live555的源码,其源码的版本号较低,而release版本中的 live555版本较高: 2.我们的服务器在rtsp流程中做了部分改变,在收到play请求后即发送rtp数据和play响应,为追求速度,两者的先后顺序未控制.这样老的live555版本只能在收到play响应后再解析

4个流程帮你快速搞定运营设计!

  请同学们留出3--5分钟,看完这条微博要用.前两天<我是歌手>失控,汪涵超强的救场能力让大家都看到他背后几十年的沉淀.同理,设计师想适应运营短且快的特点,持续高产,有一套可执行的流程非常重要.微博之后,更加精彩 >>> 在现如今的社会中,每天都在进行着一场场没有硝烟的商战.运营设计则是至关重要的一部分.那么怎么才能做出一个好的运营设计或者一个相对比较成功的运营设计呢?我们要知道设计的目的. 设计的目的是什么? 设计核心在于能够让用户在有限的时间内Get最有价值的信息,找到

Magento认证工程师考试及注册流程

Magento公司在2011年下半年推出了Magento认证工程师考试, 其分为两个级别Magento Certified Developer和The Magento Certified Developer Plus, 费用都是一样的每科$260. 至于通过考试的好处,我在这里就不多说了, 有兴趣的同学可以看这里: http://www.magentocommerce.com/certification/的关于Benefits描述. 据公司老大4月分参加一年一度的Magento大会" Imagi

Linux 的启动流程

那篇文章不涉及操作系统,只与主板的板载程序有关.今天,我想接着往下写,探讨操作系统接管硬件以后发生的事情,也就是操作系统的启动流程. 这个部分比较有意思.因为在BIOS阶段,计算机的行为基本上被写死了,程序员可以做的事情并不多:但是,一旦进入操作系统,程序员几乎可以定制所有方面.所以,这个部分与程序员的关系更密切. 我主要关心的是Linux操作系统,它是目前服务器端的主流操作系统.下面的内容针对的是Debian发行版,因为我对其他发行版不够熟悉. 第一步.加载内核 操作系统接管硬件以后,首先读入