# HG changeset patch
# User Aarthi Thirumalai<aar...@multicorewareinc.com>
# Date 1404146150 -19800
#      Mon Jun 30 22:05:50 2014 +0530
# Node ID af5360464d2e751bf17e795b3c314445431d59e0
# Parent  97150d9a406f9a40a240fcf6417385bc4b788b00
rc: write frame stats and cu stats to file in first pass

diff -r 97150d9a406f -r af5360464d2e source/encoder/encoder.cpp
--- a/source/encoder/encoder.cpp        Thu Jun 26 17:49:26 2014 +0530
+++ b/source/encoder/encoder.cpp        Mon Jun 30 22:05:50 2014 +0530
@@ -408,9 +408,12 @@
                 bytes -= (!i || type == NAL_UNIT_SPS || type == NAL_UNIT_PPS) 
? 4 : 3;
             }
         }
-        m_rateControl->rateControlEnd(out, bytes << 3, &curEncoder->m_rce);
+        if (m_rateControl->rateControlEnd(out, bytes << 3, &curEncoder->m_rce, 
&curEncoder->m_frameStats) < 0)
+        {
+            m_aborted = true;
+            return -1;
+        }
         finishFrameStats(out, curEncoder, bytes << 3);
-
         // Allow this frame to be recycled if no frame encoders are using it 
for reference
         if (!pic_out)
         {
@@ -445,8 +448,7 @@
                 fenc->getPicSym()->allocSaoParam(m_frameEncoder->getSAO());
         }
         fenc->getSlice()->setPOC(fenc->m_POC);
-
-        m_encodedFrameNum++;
+        curEncoder->m_rce.encodeOrder = m_encodedFrameNum++;
         if (m_bframeDelay)
         {
             int64_t *prevReorderedPts = m_prevReorderedPts;
diff -r 97150d9a406f -r af5360464d2e source/encoder/ratecontrol.cpp
--- a/source/encoder/ratecontrol.cpp    Thu Jun 26 17:49:26 2014 +0530
+++ b/source/encoder/ratecontrol.cpp    Mon Jun 30 22:05:50 2014 +0530
@@ -28,6 +28,7 @@
 #include "frame.h"
 
 #include "encoder.h"
+#include "frameencoder.h"
 #include "slicetype.h"
 #include "ratecontrol.h"
 #include "sei.h"
@@ -1224,7 +1225,7 @@
 }
 
 /* After encoding one frame, update rate control state */
-int RateControl::rateControlEnd(Frame* pic, int64_t bits, RateControlEntry* 
rce)
+int RateControl::rateControlEnd(Frame* pic, int64_t bits, RateControlEntry* 
rce, FrameStats* stats)
 {
     int64_t actualBits = bits;
     if (m_isAbr)
@@ -1273,7 +1274,38 @@
                     pic->m_avgQpAq /= (pic->getFrameHeightInCU() * 
pic->getFrameWidthInCU());
                 }
             }
-
+            // Write frame stats into the stats file if 2 pass is enabled.
+            if (m_param->rc.bStatWrite)
+            {
+                char cType = rce->sliceType == I_SLICE ? (rce->poc == 0 ? 'I' 
: 'i')
+                            : rce->sliceType == P_SLICE ? 
(pic->getSlice()->isReferenced()? 'P' : 'p')
+                            : pic->getSlice()->isReferenced()? 'B' : 'b';
+                if (fprintf(m_statFileOut,
+                         "in:%d out:%d type:%c dur:%.3f q:%.2f q-aq:%.2f 
tex:%d mv:%d misc:%d imb:%.2f pmb:%.2f smb:%.2f ",
+                         rce->poc, rce->encodeOrder,
+                         cType, m_frameDuration,
+                         pic->m_avgQpRc, pic->m_avgQpAq,
+                         stats->coeffBits,
+                         stats->mvBits,
+                         stats->miscBits,
+                         stats->cuCount_i,
+                         stats->cuCount_p,
+                         stats->cuCount_skip) < 0)
+                    goto writeFailure;
+                if (fprintf(m_statFileOut, ";\n") < 0)
+                    goto writeFailure;
+                /* Don't re-write the data in multi-pass mode. */
+                if (m_param->rc.cuTree && pic->getSlice()->isReferenced() && 
!m_param->rc.bStatRead)
+                {
+                    uint8_t sliceType = (uint8_t)rce->sliceType;
+                    for (int i = 0; i < m_ncu; i++)
+                         m_cuTreeStats.qpBuffer[0][i] = 
((uint16_t)pic->m_lowres.qpCuTreeOffset[i]) * 256.0;
+                    if (fwrite(&sliceType, 1, 1, m_cutreeStatFileOut) < 1)
+                        goto writeFailure;
+                    if (fwrite(m_cuTreeStats.qpBuffer[0], sizeof(uint16_t), 
m_ncu, m_cutreeStatFileOut) < m_ncu)
+                        goto writeFailure;
+                }
+            }
             /* amortize part of each I slice over the next several frames, up 
to
              * keyint-max, to avoid over-compensating for the large I slice 
cost */
             if (rce->sliceType == I_SLICE)
@@ -1354,6 +1386,10 @@
     }
     rce->isActive = false;
     return 0;
+
+writeFailure:
+    x265_log(m_param, X265_LOG_ERROR, "RatecontrolEnd: stats file could not be 
written to\n");
+    return 1;
 }
 
 #if defined(_MSC_VER)
diff -r 97150d9a406f -r af5360464d2e source/encoder/ratecontrol.h
--- a/source/encoder/ratecontrol.h      Thu Jun 26 17:49:26 2014 +0530
+++ b/source/encoder/ratecontrol.h      Mon Jun 30 22:05:50 2014 +0530
@@ -34,7 +34,7 @@
 class Frame;
 class TComSPS;
 class SEIBufferingPeriod;
-
+struct FrameStats;
 #define BASE_FRAME_DURATION 0.04
 
 /* Arbitrary limitations as a sanity check. */
@@ -59,6 +59,7 @@
     int mvBits;
     int bframes;
     int poc;
+    uint64_t encodeOrder;
     int64_t leadingNoBSatd;
     bool bLastMiniGopBFrame;
     double blurredComplexity;
@@ -157,7 +158,7 @@
     // to be called for each frame to process RateControl and set QP
     void rateControlStart(Frame* pic, Lookahead *, RateControlEntry* rce, 
Encoder* enc);
     void calcAdaptiveQuantFrame(Frame *pic);
-    int rateControlEnd(Frame* pic, int64_t bits, RateControlEntry* rce);
+    int rateControlEnd(Frame* pic, int64_t bits, RateControlEntry* rce, 
FrameStats* stats);
     int rowDiagonalVbvRateControl(Frame* pic, uint32_t row, RateControlEntry* 
rce, double& qpVbv);
     void hrdFullness(SEIBufferingPeriod* sei);
     bool init(TComSPS* sps);
_______________________________________________
x265-devel mailing list
x265-devel@videolan.org
https://mailman.videolan.org/listinfo/x265-devel

Reply via email to