[x265] [PATCH] zone: Fix BufferRate mismatch and log unclipped BufferFillFinal into csv

Snehaa Giridharan snehaa at multicorewareinc.com
Wed Feb 19 10:57:49 CET 2020


# HG changeset patch
# User Snehaa Giridharan <snehaa at multicorewareinc.com>
# Date 1575548701 -19800
#      Thu Dec 05 17:55:01 2019 +0530
# Node ID 495e78dfd32bcdeee0c48a8732eba135be12cb8e
# Parent  ce3a4929efca3034bce12b7449d73ed2e03f9b4d
zone: Fix BufferRate mismatch and log unclipped BufferFillFinal into csv

This commit fixes
- Mismatch in BufferRate
- Log UnclippedBufferFillFinal into csv when csvloglevel greater than 1

diff --git a/doc/reST/cli.rst b/doc/reST/cli.rst
--- a/doc/reST/cli.rst
+++ b/doc/reST/cli.rst
@@ -107,6 +107,9 @@

  **BufferFillFinal** Buffer bits available after removing the frame out of
CPB.

+ **UnclippedBufferFillFinal** Unclipped buffer bits available after
removing the frame
+ out of CPB only used for csv logging purpose.
+
  **Latency** Latency in terms of number of frames between when the frame
  was given in and when the frame is given out.

diff --git a/source/encoder/api.cpp b/source/encoder/api.cpp
--- a/source/encoder/api.cpp
+++ b/source/encoder/api.cpp
@@ -1294,6 +1294,8 @@
                     fprintf(csvfp, "RateFactor, ");
                 if (param->rc.vbvBufferSize)
                     fprintf(csvfp, "BufferFill, BufferFillFinal, ");
+                if (param->csvLogLevel >= 2)
+                    fprintf(csvfp, "UnclippedBufferFillFinal, ");
                 if (param->bEnablePsnr)
                     fprintf(csvfp, "Y PSNR, U PSNR, V PSNR, YUV PSNR, ");
                 if (param->bEnableSsim)
@@ -1405,6 +1407,8 @@
         fprintf(param->csvfpt, "%.3lf,", frameStats->rateFactor);
     if (param->rc.vbvBufferSize)
         fprintf(param->csvfpt, "%.3lf, %.3lf,", frameStats->bufferFill,
frameStats->bufferFillFinal);
+    if (param->csvLogLevel >= 2)
+        fprintf(param->csvfpt, "%.3lf,",
frameStats->unclippedBufferFillFinal);
     if (param->bEnablePsnr)
         fprintf(param->csvfpt, "%.3lf, %.3lf, %.3lf, %.3lf,",
frameStats->psnrY, frameStats->psnrU, frameStats->psnrV, frameStats->psnr);
     if (param->bEnableSsim)
diff --git a/source/encoder/encoder.cpp b/source/encoder/encoder.cpp
--- a/source/encoder/encoder.cpp
+++ b/source/encoder/encoder.cpp
@@ -3012,6 +3012,8 @@
             frameStats->ipCostRatio = curFrame->m_lowres.ipCostRatio;
         frameStats->bufferFill = m_rateControl->m_bufferFillActual;
         frameStats->bufferFillFinal = m_rateControl->m_bufferFillFinal;
+        if (m_param->csvLogLevel >= 2)
+            frameStats->unclippedBufferFillFinal =
m_rateControl->m_unclippedBufferFillFinal;
         frameStats->frameLatency = inPoc - poc;
         if (m_param->rc.rateControlMode == X265_RC_CRF)
             frameStats->rateFactor = curEncData.m_rateFactor;
diff --git a/source/encoder/ratecontrol.cpp b/source/encoder/ratecontrol.cpp
--- a/source/encoder/ratecontrol.cpp
+++ b/source/encoder/ratecontrol.cpp
@@ -2745,7 +2745,9 @@
         x265_log(m_param, X265_LOG_WARNING, "poc:%d, VBV underflow (%.0f
bits)\n", rce->poc, m_bufferFillFinal);

     m_bufferFillFinal = X265_MAX(m_bufferFillFinal, 0);
-    m_bufferFillFinal += m_bufferRate;
+    m_bufferFillFinal += rce->bufferRate;
+    if (m_param->csvLogLevel >= 2)
+        m_unclippedBufferFillFinal = m_bufferFillFinal;

     if (m_param->rc.bStrictCbr)
     {
@@ -2755,14 +2757,14 @@
             filler += FILLER_OVERHEAD * 8;
         }
         m_bufferFillFinal -= filler;
-        bufferBits = X265_MIN(bits + filler + m_bufferExcess,
m_bufferRate);
+        bufferBits = X265_MIN(bits + filler + m_bufferExcess,
rce->bufferRate);
         m_bufferExcess = X265_MAX(m_bufferExcess - bufferBits + bits +
filler, 0);
         m_bufferFillActual += bufferBits - bits - filler;
     }
     else
     {
         m_bufferFillFinal = X265_MIN(m_bufferFillFinal, m_bufferSize);
-        bufferBits = X265_MIN(bits + m_bufferExcess, m_bufferRate);
+        bufferBits = X265_MIN(bits + m_bufferExcess, rce->bufferRate);
         m_bufferExcess = X265_MAX(m_bufferExcess - bufferBits + bits, 0);
         m_bufferFillActual += bufferBits - bits;
         m_bufferFillActual = X265_MIN(m_bufferFillActual, m_bufferSize);
diff --git a/source/encoder/ratecontrol.h b/source/encoder/ratecontrol.h
--- a/source/encoder/ratecontrol.h
+++ b/source/encoder/ratecontrol.h
@@ -157,6 +157,7 @@
     double m_rateFactorConstant;
     double m_bufferSize;
     double m_bufferFillFinal;  /* real buffer as of the last finished
frame */
+    double m_unclippedBufferFillFinal; /* real unclipped buffer as of the
last finished frame used to log in CSV*/
     double m_bufferFill;       /* planned buffer, if all in-progress
frames hit their bit budget */
     double m_bufferRate;       /* # of bits added to buffer_fill after
each frame */
     double m_vbvMaxRate;       /* in kbps */
diff --git a/source/x265.h b/source/x265.h
--- a/source/x265.h
+++ b/source/x265.h
@@ -304,6 +304,7 @@
     double           totalFrameTime;
     double           vmafFrameScore;
     double           bufferFillFinal;
+    double           unclippedBufferFillFinal;
 } x265_frame_stats;

 typedef struct x265_ctu_info_t

-- 
*Thanks and Regards,*
*Snehaa.G*
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20200219/ce95017c/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: Fix BufferRate mismatch and log unclipped BufferFillFinal into csv.diff
Type: application/octet-stream
Size: 5083 bytes
Desc: not available
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20200219/ce95017c/attachment-0001.obj>


More information about the x265-devel mailing list