x265 编码一行,以及vbv上溢/下溢之后的处理
一 265支持wpp,按CU单元并行编码,所以逻辑会更复杂一些,特别是对于vbv出现上/下溢。
用2个值记录当前行的状态, 一个记录当前是否已经完成filterFrame,一个记录当前行号。
void FrameEncoder::processRow(int row, int threadId) //处理一行,row 是当前处理的行, threadId是线程Id
{int64_t startTime = x265_mdate();if (ATOMIC_INC(&m_activeWorkerCount) == 1 && m_stallStartTime)m_totalNoWorkerTime += x265_mdate() - m_stallStartTime;const uint32_t realRow = m_idx_to_row[row >> 1];//存放真实的行号,偶数行const uint32_t typeNum = m_idx_to_row[row & 1]; //奇数行存放的是,是否FIlter过的状态if (!typeNum) //偶数行 even number lineprocessRowEncoder(realRow, m_tld[threadId]); //处理偶数行编码else //奇数行 odd number line {m_frameFilter.processRow(realRow); //滤波处理奇数行 ,当前行进行滤波处理,处理完了,插入encode 队列?// NOTE: Active next rowif (realRow != m_sliceBaseRow[m_rows[realRow].sliceId + 1] - 1)enqueueRowFilter(m_row_to_idx[realRow + 1]); //对下一行滤波,并插入到队列}if (ATOMIC_DEC(&m_activeWorkerCount) == 0)m_stallStartTime = x265_mdate();m_totalWorkerElapsedTime += x265_mdate() - startTime; // not thread safe, but good enough, 统计一行处理时间
}
二 当出现vbv上/下溢的时候是如何处理的
curRow.reEncode = m_top->m_rateControl->rowVbvRateControl(m_frame, row, &m_rce, qpBase, m_sliceBaseRow, sliceId);qpBase = x265_clip3((double)m_param->rc.qpMin, (double)m_param->rc.qpMax, qpBase);curEncData.m_rowStat[row].rowQp = qpBase;curEncData.m_rowStat[row].rowQpScale = x265_qp2qScale(qpBase);if (curRow.reEncode < 0) //vbv控制异常,需要重新编码{x265_log(m_param, X265_LOG_DEBUG, "POC %d row %d - encode restart required for VBV, to %.2f from %.2f\n",m_frame->m_poc, row, qpBase, curEncData.m_cuStat[cuAddr].baseQp);// prevent the WaveFront::findJob() method from providing new jobsm_vbvResetTriggerRow[curRow.sliceId] = row; //触发重新编码的行号记录下来, 这里不需要加锁,/** 外面有个条件 rowInSlice == col 它的方向是这样的, *****而编码的方向是 *****上面这两永远只有一个交叉点,所以不担心不加锁,设置这个stop会乱套,以及trigger 行 * **/m_bAllRowsStop[curRow.sliceId] = true;//所有的编码行都停止下来for (uint32_t r = m_sliceBaseRow[sliceId + 1] - 1; r >= row; r--){//扫描触发重新编码行的后面那些行CTURow& stopRow = m_rows[r];if (r != row) //如果还没有遍历到当前这一行{/* if row was active (ready to be run) clear active bit and bitmap bit for this row */stopRow.lock.acquire();while (stopRow.active) //如果需要停止的行,还是在active状态{if (dequeueRow(m_row_to_idx[r] * 2)) //把编码状态从这一行的信息里面删除,stopRow.active = false; //然后设置为falseelse{/* we must release the row lock to allow the thread to exit 如果删除失败*/stopRow.lock.release();GIVE_UP_TIME(); //释放CPU,等会再删除stopRow.lock.acquire();}}stopRow.lock.release();//释放锁bool bRowBusy = true;do{stopRow.lock.acquire();bRowBusy = stopRow.busy;stopRow.lock.release();if (bRowBusy){GIVE_UP_TIME();}}while (bRowBusy);}m_outStreams[r].resetBits(); //bitstream resetstopRow.completed = 0;//行完成状态重置memset(&stopRow.rowStats, 0, sizeof(stopRow.rowStats));curEncData.m_rowStat[r].numEncodedCUs = 0;curEncData.m_rowStat[r].encodedBits = 0;curEncData.m_rowStat[r].rowSatd = 0;curEncData.m_rowStat[r].rowIntraSatd = 0;curEncData.m_rowStat[r].sumQpRc = 0;curEncData.m_rowStat[r].sumQpAq = 0;}m_bAllRowsStop[curRow.sliceId] = false; //所有的行都停下来了,实际上只管了后面的那些行}}}if (m_param->bEnableWavefront && curRow.completed >= 2 && !bLastRowInSlice &&(!m_bAllRowsStop[curRow.sliceId] || intRow + 1 < m_vbvResetTriggerRow[curRow.sliceId])){ //之前的行还是继续编码/* activate next row */ScopedLock below(m_rows[row + 1].lock);if (m_rows[row + 1].active == false &&m_rows[row + 1].completed + 2 <= curRow.completed){m_rows[row + 1].active = true;enqueueRowEncoder(m_row_to_idx[row + 1]);tryWakeOne(); /* wake up a sleeping thread or set the help wanted flag */}}//后面的行需要停止再来ScopedLock self(curRow.lock);if ((m_bAllRowsStop[curRow.sliceId] && intRow > m_vbvResetTriggerRow[curRow.sliceId]) ||(!bFirstRowInSlice && ((curRow.completed < numCols - 1) || (m_rows[row - 1].completed < numCols)) && m_rows[row - 1].completed < curRow.completed + 2)){curRow.active = false;curRow.busy = false;ATOMIC_INC(&m_countRowBlocks);return;}
x265 编码一行,以及vbv上溢/下溢之后的处理相关推荐
- 数值计算基础(上溢下溢、梯度优化、牛顿法、KKT方法)
目录 上溢和下溢 病态条件 基于梯度的优化方法 KKT 方法 如果这篇文章对你有一点小小的帮助,请给个关注喔~我会非常开心的~ 上溢和下溢 上溢:当大量级的数字被近似为 时发生上溢,进一步计算会导致 ...
- C Primer Plus 6th Edition第三章编程练习上溢下溢
3.11 编程练习 1.通过试验(即编写带有此类问题的程序)观察系统如何处理整数上溢.浮点数上溢和浮点数下溢的情况. int类型(整数类型)占用4字节,范围为-2^ 31 ~ 2^31-1 即-214 ...
- 【双符号位判决法】定点数上溢,下溢的判别
上溢.下溢: 上溢:两个数进行运算,得到的结果的绝对值超过最大表示范围.定点整数之间只会发生上溢 下溢:两个浮点数运算,得到的结果的绝对值超过最小的表示范围.只有浮点数的运算会发生下溢 看图: 双符号 ...
- 计算机组成原理中的“上溢”和“下溢”分别的定义是什么?
上溢应该是想要表示的数超过了所能表示的最大值吧,下溢则应该是超过了最小值.这两个应该是带符号数的表示中的吧. 25 6 评论 分享 举报 转存失败重新上传取消 crystal9285 来自科 ...
- 视频编解码,bbv 缓冲区的上溢和下溢
使用硬件相似的数据处理.一般都是数据进来,处理后立即发出去的形式.所以一般有一个数据进,一个数据出,2个接口. 硬件处理基本都要求实时.数据进来,处理之后马上发处理,这个时间要求非常短,一般要求控制在 ...
- 浅谈上溢overflow和下溢underflow
目录 一.为什么会出现overflow和underflow? 二.解决方法 一.为什么会出现overflow和underflow? 计算机只能使用有限的bit来描述数字,因此当被描述的数字需要超多的b ...
- 机器学习中的数学——上溢和下溢
分类目录:<机器学习中的数学>总目录 连续数学在数字计算机上的根本困难是,我们需要通过有限数量的位模式来表示无限多的实数.这意味着我们在计算机中表示实数时,几乎总会引入一些近似误差.在许多 ...
- 上溢、下溢,this指针
1.上溢.下溢: 对整数,溢出指代数值:小于最小值为下溢,大于最大值为上溢 对浮点数,溢出指绝对值:绝对值小于浮点数所能表示的最小值,为下溢,当作 0:绝对值大于浮点数所能表示的最大范围,为上溢,当作 ...
- 04_红黑树_B树知识点_添加上溢和删除下溢
B树(Balanced Tree) B树是一种平衡的多路搜索树,多用于文件系统.数据库的实现 眼前一亮的特点 1个节点可以存储超过两个元素,可以拥有超过两个节点 平衡,每个节点的所有子树高度一 ...
- 数值计算中的上溢和下溢
利用计算机实现数值计算,指的通常是利用迭代过程更新解来解决数学问题,而不是通过解析过程推到数学公式求解.常见得数值计算主要包括优化问题求解和解线性方程组. 上溢和下溢 通常实数在计算机内不能精确保存, ...
最新文章
- ASP.NET中生成缩略图的代码
- 使用 redmind 进行项目任务管理
- 深度学习论文阅读进阶路径图
- 电脑开机svchost.exe报错
- 【现代控制理论基础】二、线性控制系统的运动分析
- 逻辑卷 /dev/mapper
- 中国电信官方提醒:7类短信诈骗须警惕
- python神经网络反向传播_神经网络及反向传播算法
- 「视频」重磅 | Magic Leap再发Demo,凯文·凯利万字长文揭秘
- Linux下优雅的让程序后台运行
- mt,sgd,gd含义
- Android 读取Txt文件内容
- 不是二进制MAT文件,请尝试执行 load -ASCII 以便以文本形式读取
- 题目 1904: 蓝桥杯算法提高VIP-求arccos值
- NLP的bigrams函数“generator object bigrams at 0x000001D32A95A678“问题解决
- vue+openlayers图形交互,实现多边形绘制、编辑和保存
- 下载网络图片两种方式
- ubuntu终端中返回上一次访问的目录
- 论文 Through Fog High Resolution Imaging Using Millimeter Wave Radar 复现
- ECU-TEST笔记使用技巧01
热门文章
- django drf 初始化配置(mysql、跨域访问、默认用户模型)和用户模型重写,数据迁移,解决用户模型重写后无法创建超级用户的问题
- office无法卸载无法安装的解决方法
- 看红帽巨佬解析⭐《二、G1垃圾回收配置解析》⭐
- 算法题目打卡:Ques20201008
- 重装战姬电脑版模拟器怎么玩
- 打印机扫描显示服务器没有响应,打印机扫描一体机能够打印却不能扫描,提示缺少WIA的驱动程序...
- 补题:HOJ吉林selection B-Bribing Eve(Gym-101174B) (象限极角排序)
- POJ3345 Bribing FIPA(树形DP)
- 2020年运营版双端直播盒子APP带引导安装 QQ微信一键登录+多级分销+粉色系列
- JAVA面向对象 从0.5到1