ffmpeg d3d11va 加速 访问帧 出现帧混乱 flush

news/2024/7/10 21:21:43 标签: d3d11va, ffmpeg, 帧混乱, flush

使用ffmpeg d3d11va的时候出现帧的时序上混乱。
通过ffmpeg 源码可知,ffmpegd3d11va 时 出来的frame 中的data[0]存放的是decode texture数组(默认大小为20),data[1] 存放下标(可以发现,貌似下标总是一个随机的值,没调试进去,所以没有发现在哪里修改下标,不过通过下表访问的数据是没错的)。decode texture是在显存上的一个纹理,但是如果按demo中的方式去取图像,他需要先创建一个staging 类型的 texture ,再将decode texture拷贝到staging类型的 texture,再将staging 类型的texture中的内容map出来,这是极为消耗时间的 。我的操作是直接decode texture放到我的default类型的render texture中。开始的时候出现问题帧时序上的问题。但是如果调用ffmpeg demo中的原始的代码,却没有出现这个问题。

查了一通,发现这里。

大概意思就是: D3d中有一个内部的命令缓冲(command list)机制,这个机制能减少用户态和内核态的切换。很多函数执行完后,会暂时将操作放到command list中,后续command list会高效的去执行。有以下几个操作能让command list立马执行完。

猜测 因为ffmpeg d3d11va 中解码时在内部有开启子线程。多线程操作导致了在 copysubresource 时 ,产生了pipeline stall。  
于是在copysubresourceregion后加入flush 命令,果然就没有这个问题了。下面的lock是必须加上的。

D3D11_BOX box; box.back = 1, box.front = 0, box.left = 0, box.right = descT.Width, box.top = 0, box.bottom = descT.Height;
ctx1->lock(ctx1->lock_ctx);
dctx->CopySubresourceRegion(frame->m_d3DTextureFfmpeg, 0, 0, 0, 0, (ID3D11Texture2D*)m_frame->data[0], currentFrameIndex,&box); //may be we can use the buffer in the frame directly
dctx->Flush(); //清空缓冲命令 //https://docs.microsoft.com/zh-cn/windows/desktop/api/d3d11/nf-d3d11-id3d11devicecontext-flush
ctx1->unlock(ctx1->lock_ctx);

值得注意的是copysubresouce 大概是有两帧的延时:


http://www.niftyadmin.cn/n/1150097.html

相关文章

Gabriel 图 (gabriel gragh)

(欢迎录载到百科中) 参考https://www.jianshu.com/p/7f27273d5f23?fromtimeline 按Grabriel三角划分法 划分 出来的结果叫Grabriel 图。 Grabriel 划分 是 Delaunany 三角剖分的一种 定义:GG(grabriel gragh 缩写) 存在点集E ,u、v、w 属于…

纳斯达克CEO:我们与ICO保持距离

纳斯达克CEO Adena Friedman 近日在Georgetown University大会上表示,纳斯达克正与ICO保持距离。在演讲中,她批评了ICO发行方缺乏足够的投资者保护和披露标准。 ICO是一种区块链创业公司行之有效的融资方式。但是,在投资者的非理性投资、监管…

点到线段的距离 distancePtSeg2d distancePtSeg

线段是有范围的,考虑下面三种情况 //3d static float distancePtSeg(const float* pt, const float* p, const float* q) {float pqx q[0] - p[0];float pqy q[1] - p[1];float pqz q[2] - p[2];float dx pt[0] - p[0];float dy pt[1] - p[1];float dz pt[2] …

WinForm部署问题

WinForm部署问题 1、解决:This implementation is not part of the Windows Platform 问题? 一:单击 开始 ,单击 运行 ,键入 gpedit.msc ,然后单击 确定 。    二:依次展开 计算机配置 &…

recast 6 rcBuildPolyMeshDetail

buildPolyDetail() 传入的是contours,先对过长的边进行插值,通过”int nn 1 (int)floorf(d/sampleDist);“ 进行判断需要划分多少段,这个过程也对点的y轴进行了设置。然后按原来的方向顺序将点的下标放到hull中&…

深入理解JVM虚拟机7:JNDI,OSGI,Tomcat类加载器实现

打破双亲委派模型 JNDI JNDI 的理解 JNDI是 Java 命名与文件夹接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之中的一个,不少专家觉得,没有透彻理解JNDI的意义和作用,就没有真正掌握…

unigine geopivot 经纬度 空间坐标 三维平铺坐标

unigine中的geopivot 作用是进行 经纬度与空间坐标系之间的换算 以及 经纬度到三维平铺坐标之间的换算 (先理解区分下 经纬度 三维空间坐标 三维平铺坐标 这三个的概念:首先在unigine中如果没有geopivot节点,那么就只有一个三维空间坐标的概…

构建无障碍 React Native 应用

本文讲的是构建无障碍 React Native 应用,我有几张阿里云幸运券分享给你,用券购买或者升级阿里云相应产品会有特惠惊喜哦!把想要买的产品的幸运券都领走吧!快下手,马上就要抢光了。最近,随着面向 Web 的 Re…