[x265] [PATCH] log: add the RateFactor for each frame to the .stats file when using --crf mode
gopu at multicorewareinc.com
gopu at multicorewareinc.com
Tue May 6 09:21:57 CEST 2014
# HG changeset patch
# User Gopu Govindaswamy
# Date 1399360773 -19800
# Tue May 06 12:49:33 2014 +0530
# Node ID 4a78e823abdf875524ed07ac4485276160c52fb8
# Parent c4adcaef8d1d8d5f65841a42ef838594fa953185
log: add the RateFactor for each frame to the .stats file when using --crf mode
diff -r c4adcaef8d1d -r 4a78e823abdf source/Lib/TLibCommon/TComPic.h
--- a/source/Lib/TLibCommon/TComPic.h Mon May 05 00:22:50 2014 -0500
+++ b/source/Lib/TLibCommon/TComPic.h Tue May 06 12:49:33 2014 +0530
@@ -116,6 +116,7 @@
double* m_qpaRc;
double m_avgQpRc; //avg QP as decided by ratecontrol
double m_avgQpAq; //avg QP as decided by AQ in addition to ratecontrol
+ double m_rateFactor; //calculated based on the Frame QP
TComPic();
virtual ~TComPic();
diff -r c4adcaef8d1d -r 4a78e823abdf source/encoder/encoder.cpp
--- a/source/encoder/encoder.cpp Mon May 05 00:22:50 2014 -0500
+++ b/source/encoder/encoder.cpp Tue May 06 12:49:33 2014 +0530
@@ -124,7 +124,12 @@
if (m_csvfpt)
{
if (param->logLevel >= X265_LOG_DEBUG)
- fprintf(m_csvfpt, "Encode Order, Type, POC, QP, Bits, Y PSNR, U PSNR, V PSNR, YUV PSNR, SSIM, SSIM (dB), Encoding time, Elapsed time, List 0, List 1\n");
+ {
+ if (param->rc.rateControlMode == X265_RC_CRF)
+ fprintf(m_csvfpt, "Encode Order, Type, POC, QP, Bits, RateFactor, Y PSNR, U PSNR, V PSNR, YUV PSNR, SSIM, SSIM (dB), Encoding time, Elapsed time, List 0, List 1\n");
+ else
+ fprintf(m_csvfpt, "Encode Order, Type, POC, QP, Bits, Y PSNR, U PSNR, V PSNR, YUV PSNR, SSIM, SSIM (dB), Encoding time, Elapsed time, List 0, List 1\n");
+ }
else
fprintf(m_csvfpt, "Command, Date/Time, Elapsed Time, FPS, Bitrate, Y PSNR, U PSNR, V PSNR, Global PSNR, SSIM, SSIM (dB), Version\n");
}
@@ -898,6 +903,8 @@
char buf[1024];
int p;
p = sprintf(buf, "POC:%d %c QP %2.2lf(%d) %10d bits", poc, c, pic->m_avgQpAq, slice->getSliceQp(), (int)bits);
+ if (param->rc.rateControlMode == X265_RC_CRF)
+ p += sprintf(buf + p, " RF:%f", pic->m_rateFactor);
if (param->bEnablePsnr)
p += sprintf(buf + p, " [Y:%6.2lf U:%6.2lf V:%6.2lf]", psnrY, psnrU, psnrV);
if (param->bEnableSsim)
@@ -923,6 +930,8 @@
if (m_csvfpt)
{
fprintf(m_csvfpt, "%d, %c-SLICE, %4d, %2.2lf, %10d,", m_outputCount++, c, poc, pic->m_avgQpAq, (int)bits);
+ if (param->rc.rateControlMode == X265_RC_CRF)
+ fprintf(m_csvfpt, "%f,", pic->m_rateFactor);
double psnr = (psnrY * 6 + psnrU + psnrV) / 8;
if (param->bEnablePsnr)
fprintf(m_csvfpt, "%.3lf, %.3lf, %.3lf, %.3lf,", psnrY, psnrU, psnrV, psnr);
diff -r c4adcaef8d1d -r 4a78e823abdf source/encoder/ratecontrol.cpp
--- a/source/encoder/ratecontrol.cpp Mon May 05 00:22:50 2014 -0500
+++ b/source/encoder/ratecontrol.cpp Tue May 06 12:49:33 2014 +0530
@@ -1008,6 +1008,19 @@
{
checkAndResetABR(rce, true);
}
+ if (param->rc.rateControlMode == X265_RC_CRF)
+ {
+ if (int(pic->m_avgQpRc + 0.5) == pic->getSlice()->getSliceQp())
+ pic->m_rateFactor = rateFactorConstant;
+ else
+ {
+ /* If vbv changes the Frame QP then Recalculate the Ratefactor */
+ double baseCplx = ncu * (param->bframes ? 120 : 80);
+ double mbtree_offset = param->rc.cuTree ? (1.0 - param->rc.qCompress) * 13.5 : 0;
+ pic->m_rateFactor = pow(baseCplx, 1 - qCompress) /
+ x265_qp2qScale(int(pic->m_avgQpRc + 0.5) + mbtree_offset);
+ }
+ }
if (!isAbrReset)
{
if (param->rc.aqMode || isVbv)
More information about the x265-devel
mailing list