一 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上溢/下溢之后的处理相关推荐

  1. 数值计算基础(上溢下溢、梯度优化、牛顿法、KKT方法)

    目录 上溢和下溢 病态条件 基于梯度的优化方法 KKT 方法 如果这篇文章对你有一点小小的帮助,请给个关注喔~我会非常开心的~ 上溢和下溢 上溢:当大量级的数字被近似为  时发生上溢,进一步计算会导致 ...

  2. C Primer Plus 6th Edition第三章编程练习上溢下溢

    3.11 编程练习 1.通过试验(即编写带有此类问题的程序)观察系统如何处理整数上溢.浮点数上溢和浮点数下溢的情况. int类型(整数类型)占用4字节,范围为-2^ 31 ~ 2^31-1 即-214 ...

  3. 【双符号位判决法】定点数上溢,下溢的判别

    上溢.下溢: 上溢:两个数进行运算,得到的结果的绝对值超过最大表示范围.定点整数之间只会发生上溢 下溢:两个浮点数运算,得到的结果的绝对值超过最小的表示范围.只有浮点数的运算会发生下溢 看图: 双符号 ...

  4. 计算机组成原理中的“上溢”和“下溢”分别的定义是什么?

    上溢应该是想要表示的数超过了所能表示的最大值吧,下溢则应该是超过了最小值.这两个应该是带符号数的表示中的吧. 25   6 评论  分享  举报 转存失败重新上传取消 crystal9285  来自科 ...

  5. 视频编解码,bbv 缓冲区的上溢和下溢

    使用硬件相似的数据处理.一般都是数据进来,处理后立即发出去的形式.所以一般有一个数据进,一个数据出,2个接口. 硬件处理基本都要求实时.数据进来,处理之后马上发处理,这个时间要求非常短,一般要求控制在 ...

  6. 浅谈上溢overflow和下溢underflow

    目录 一.为什么会出现overflow和underflow? 二.解决方法 一.为什么会出现overflow和underflow? 计算机只能使用有限的bit来描述数字,因此当被描述的数字需要超多的b ...

  7. 机器学习中的数学——上溢和下溢

    分类目录:<机器学习中的数学>总目录 连续数学在数字计算机上的根本困难是,我们需要通过有限数量的位模式来表示无限多的实数.这意味着我们在计算机中表示实数时,几乎总会引入一些近似误差.在许多 ...

  8. 上溢、下溢,this指针

    1.上溢.下溢: 对整数,溢出指代数值:小于最小值为下溢,大于最大值为上溢 对浮点数,溢出指绝对值:绝对值小于浮点数所能表示的最小值,为下溢,当作 0:绝对值大于浮点数所能表示的最大范围,为上溢,当作 ...

  9. 04_红黑树_B树知识点_添加上溢和删除下溢

    B树(Balanced Tree) B树是一种平衡的多路搜索树,多用于文件系统.数据库的实现 眼前一亮的特点  1个节点可以存储超过两个元素,可以拥有超过两个节点  平衡,每个节点的所有子树高度一 ...

  10. 数值计算中的上溢和下溢

    利用计算机实现数值计算,指的通常是利用迭代过程更新解来解决数学问题,而不是通过解析过程推到数学公式求解.常见得数值计算主要包括优化问题求解和解线性方程组. 上溢和下溢 通常实数在计算机内不能精确保存, ...

最新文章

  1. ASP.NET中生成缩略图的代码
  2. 使用 redmind 进行项目任务管理
  3. 深度学习论文阅读进阶路径图
  4. 电脑开机svchost.exe报错
  5. 【现代控制理论基础】二、线性控制系统的运动分析
  6. 逻辑卷 /dev/mapper
  7. 中国电信官方提醒:7类短信诈骗须警惕
  8. python神经网络反向传播_神经网络及反向传播算法
  9. 「视频」重磅 | Magic Leap再发Demo,凯文·凯利万字长文揭秘
  10. Linux下优雅的让程序后台运行
  11. mt,sgd,gd含义
  12. Android 读取Txt文件内容
  13. 不是二进制MAT文件,请尝试执行 load -ASCII 以便以文本形式读取
  14. 题目 1904: 蓝桥杯算法提高VIP-求arccos值
  15. NLP的bigrams函数“generator object bigrams at 0x000001D32A95A678“问题解决
  16. vue+openlayers图形交互,实现多边形绘制、编辑和保存
  17. 下载网络图片两种方式
  18. ubuntu终端中返回上一次访问的目录
  19. 论文 Through Fog High Resolution Imaging Using Millimeter Wave Radar 复现
  20. ECU-TEST笔记使用技巧01

热门文章

  1. django drf 初始化配置(mysql、跨域访问、默认用户模型)和用户模型重写,数据迁移,解决用户模型重写后无法创建超级用户的问题
  2. office无法卸载无法安装的解决方法
  3. 看红帽巨佬解析⭐《二、G1垃圾回收配置解析》⭐
  4. 算法题目打卡:Ques20201008
  5. 重装战姬电脑版模拟器怎么玩
  6. 打印机扫描显示服务器没有响应,打印机扫描一体机能够打印却不能扫描,提示缺少WIA的驱动程序...
  7. 补题:HOJ吉林selection B-Bribing Eve(Gym-101174B) (象限极角排序)
  8. POJ3345 Bribing FIPA(树形DP)
  9. 2020年运营版双端直播盒子APP带引导安装 QQ微信一键登录+多级分销+粉色系列
  10. JAVA面向对象 从0.5到1