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;  }}
0 0
原创粉丝点击