HM码率统计
来源:互联网 发布:zblogphp.js 编辑:程序博客网 时间:2024/04/29 22:28
HM编码完所有帧后,输出到stdout的数据格式:
SUMMARY ——————————————————–
Total Frames | Bitrate Y-PSNR U-PSNR V-PSNR YUV-PSNR
500 a 1722.4448 40.8944 43.4868 42.9115 41.4105
I Slices——————————————————–
Total Frames | Bitrate Y-PSNR U-PSNR V-PSNR YUV-PSNR
1 i 5586.0000 42.8015 44.8098 44.9784 43.3934
P Slices——————————————————–
Total Frames | Bitrate Y-PSNR U-PSNR V-PSNR YUV-PSNR
0 p -1.#IND -1.#IND -1.#IND -1.#IND -1.#IND
B Slices——————————————————–
Total Frames | Bitrate Y-PSNR U-PSNR V-PSNR YUV-PSNR
499 b 1714.7022 40.8906 43.4842 42.9074 41.4073
RVM: 0.000
Bytes written to file: 2155067 (1724.054 kbps)
Total Time: 23008.202 sec.
上面的内容中有两个平均码率:1722.4448kbps和1724.054kbps。前者为RBSP的码率。对应的比特统计代码如下:
//===== add PSNR ===== // m_gcAnalyzeAll对应的数据:SUMMARY--------------------------- m_gcAnalyzeAll.addResult (dPSNR, (Double)uibits, MSEyuvframe); TComSlice* pcSlice = pcPic->getSlice(0); if (pcSlice->isIntra()) { // m_gcAnalyzeI对应的数据:I Slices-------------------------- m_gcAnalyzeI.addResult (dPSNR, (Double)uibits, MSEyuvframe); } if (pcSlice->isInterP()) { // m_gcAnalyzeP对应的数据:P Slices-------------------------- m_gcAnalyzeP.addResult (dPSNR, (Double)uibits, MSEyuvframe); } if (pcSlice->isInterB()) { // m_gcAnalyzeB对应的数据:B Slices-------------------------- m_gcAnalyzeB.addResult (dPSNR, (Double)uibits, MSEyuvframe); }
VPS/SPS/PPS的RBSP所耗费比特被加在第一个I帧上了。TEncGOP::xWriteParameterSets用于编码VPS/SPS/PPS。它的代码如下:
Int TEncGOP::xWriteParameterSets (AccessUnit &accessUnit, TComSlice *slice){ Int actualTotalBits = 0; actualTotalBits += xWriteVPS(accessUnit, m_pcEncTop->getVPS()); actualTotalBits += xWriteSPS(accessUnit, slice->getSPS()); actualTotalBits += xWritePPS(accessUnit, slice->getPPS()); return actualTotalBits;}
后一个码率为写到文件上的平均码率,较上面的码率大。对应的比特统计代码:
Void TAppEncTop::rateStatsAccum(const AccessUnit& au, const std::vector<UInt>& annexBsizes){ // 第一个au的size为4,包含VPS/SPS/PPS和首帧4个NALU;后面的au是每一个Slice的NALU,size为1. AccessUnit::const_iterator it_au = au.begin(); vector<UInt>::const_iterator it_stats = annexBsizes.begin(); for (; it_au != au.end(); it_au++, it_stats++) { switch ((*it_au)->m_nalUnitType) { // Slice NALU的数据 case NAL_UNIT_CODED_SLICE_TRAIL_R: case NAL_UNIT_CODED_SLICE_TRAIL_N: case NAL_UNIT_CODED_SLICE_TSA_R: case NAL_UNIT_CODED_SLICE_TSA_N: case NAL_UNIT_CODED_SLICE_STSA_R: case NAL_UNIT_CODED_SLICE_STSA_N: case NAL_UNIT_CODED_SLICE_BLA_W_LP: case NAL_UNIT_CODED_SLICE_BLA_W_RADL: case NAL_UNIT_CODED_SLICE_BLA_N_LP: case NAL_UNIT_CODED_SLICE_IDR_W_RADL: case NAL_UNIT_CODED_SLICE_IDR_N_LP: case NAL_UNIT_CODED_SLICE_CRA: case NAL_UNIT_CODED_SLICE_RADL_N: case NAL_UNIT_CODED_SLICE_RADL_R: case NAL_UNIT_CODED_SLICE_RASL_N: case NAL_UNIT_CODED_SLICE_RASL_R: case NAL_UNIT_VPS: // VPS NALU的数据 case NAL_UNIT_SPS: // SPS NALU的数据 case NAL_UNIT_PPS: // PPS NALU的数据 m_essentialBytes += *it_stats; break; default: break; } m_totalBytes += *it_stats; }}
- HM码率统计
- HM码流整理
- 关于HM码率控制的代码研究
- HM编码器代码阅读(29)——码率控制
- HEVC码率控制浅析——HM代码阅读之一
- HEVC码率控制浅析——HM代码阅读之二
- HEVC码率控制浅析——HM代码阅读之三
- HEVC码率控制浅析——HM代码阅读之四
- HEVC码率控制浅析——HM代码阅读之一
- HEVC码率控制浅析——HM代码阅读之二
- HEVC码率控制浅析——HM代码阅读之三
- HEVC码率控制浅析——HM代码阅读之四
- HM编码器代码阅读(41)——码率控制(二)
- HEVC码率控制算法研究与HM相应代码分析(三)——算法及代码分析
- HM/JEM划分模式的率失真代价的计算
- HM编码器代码阅读(42)——率失真优化
- 码控 HM
- HM学习心得
- 软件设计是怎样炼成的(6)——打造系统的底蕴(数据库设计)(上篇)
- 我的Unity(10)一点一滴 利用UI制作摇杆控制物体移动
- windows 下composer的安装
- 根据类名,获取接口对象
- 【CF741C】Arpa's overnight party and Mehrdad's silent entering 题解
- HM码率统计
- 如何从app业务逻辑提炼api接口
- 递归的函数
- stringBuilder - 解决拼接字符串产生的滞留性
- 软件设计是怎样炼成的(6)——打造系统的底蕴(数据库设计)(下篇)
- html总结
- 模拟控制文件全部丢失与归档日志文件丢失的不完全恢复
- tomcat 内存溢出
- 二:Java语言基础组成—— 标识符