<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Oct 1, 2013 at 6:59 AM, Aarthi Thirumalai <span dir="ltr"><<a href="mailto:aarthi@multicorewareinc.com" target="_blank">aarthi@multicorewareinc.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im"># HG changeset patch<br>
# User Aarthi Thirumalai<br>
</div># Date 1380628699 -19800<br>
#      Tue Oct 01 17:28:19 2013 +0530<br>
# Node ID fc225ea42650867a229d15f41e1f2a495629bb7d<br>
<div class="im"># Parent  36e2f4978ae40b23efa1a5403d59168d551f29a6<br>
Added x265_stats_t structure and x265_encoder_stats API to fetch output stats from encoder<br></div></blockquote><div><br></div><div>Queued with fixes, see below</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">
<br>
</div>diff -r 36e2f4978ae4 -r fc225ea42650 source/Lib/TLibEncoder/TEncTop.cpp<br>
<div class="im">--- a/source/Lib/TLibEncoder/TEncTop.cpp        Tue Oct 01 15:09:55 2013 +0530<br>
</div>+++ b/source/Lib/TLibEncoder/TEncTop.cpp        Tue Oct 01 17:28:19 2013 +0530<br>
<div class="im">@@ -312,6 +312,19 @@<br>
         return 100.0;<br>
 }<br>
<br>
+void TEncTop::fetchStats(x265_stats_t *stats)<br>
+{<br>
+    stats->globalPsnrY = m_analyzeAll.getPsnrY();<br>
+    stats->globalPsnrU = m_analyzeAll.getPsnrU();<br>
+    stats->globalPsnrV = m_analyzeAll.getPsnrV();<br>
+    stats->totalNumPics = m_analyzeAll.getNumPic();<br>
+    stats->accBits = m_analyzeAll.getBits();<br>
+    if (stats->totalNumPics > 0)<br>
+        stats->globalSsim = m_globalSsim / stats->totalNumPics;<br>
+    else<br>
+        stats->globalSsim = 0;<br>
+}<br>
+<br>
 #define VERBOSE_RATE 0<br>
 #if VERBOSE_RATE<br>
 static const char* nalUnitTypeToString(NalUnitType type)<br>
</div>diff -r 36e2f4978ae4 -r fc225ea42650 source/Lib/TLibEncoder/TEncTop.h<br>
<div class="im">--- a/source/Lib/TLibEncoder/TEncTop.h  Tue Oct 01 15:09:55 2013 +0530<br>
</div>+++ b/source/Lib/TLibEncoder/TEncTop.h  Tue Oct 01 17:28:19 2013 +0530<br>
<div class="im">@@ -106,6 +106,8 @@<br>
<br>
     int getStreamHeaders(NALUnitEBSP **nalunits);<br>
<br>
+    void fetchStats(x265_stats_t* stats);<br>
+<br>
     double printSummary();<br>
<br>
     TComScalingList* getScalingList() { return &m_scalingList; }<br>
</div>diff -r 36e2f4978ae4 -r fc225ea42650 source/encoder/encoder.cpp<br>
<div class="im">--- a/source/encoder/encoder.cpp        Tue Oct 01 15:09:55 2013 +0530<br>
</div>+++ b/source/encoder/encoder.cpp        Tue Oct 01 17:28:19 2013 +0530<br>
<div class="im">@@ -429,6 +429,15 @@<br>
 EXTERN_CYCLE_COUNTER(ME);<br>
<br>
 extern "C"<br>
+void x265_encoder_stats(x265_t *encoder, x265_stats_t *outputStats)<br>
+{<br>
+    CHECKED_MALLOC(outputStats, x265_stats_t, 1);<br>
</div>+    encoder->fetchStats(outputStats);<br></blockquote><div><br></div><div>this is a nice memory leak; and the caller's outputStats is not modified.</div><div><br></div><div>It is much more robust, and cleaner, for the caller to simply declare x265_stats_t instance on their stack</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">+fail:<br>
+    return;<br>
+}<br>
+<br>
+extern "C"<br>
 void x265_encoder_close(x265_t *encoder, double *outPsnr)<br>
 {<br>
     double globalPsnr = encoder->printSummary();<br>
</div>diff -r 36e2f4978ae4 -r fc225ea42650 source/x265.cpp<br>
<div class="im">--- a/source/x265.cpp   Tue Oct 01 15:09:55 2013 +0530<br>
</div>+++ b/source/x265.cpp   Tue Oct 01 17:28:19 2013 +0530<br>
<div><div class="h5">@@ -511,6 +511,7 @@<br>
     x265_picture_t *pic_in = &pic_orig;<br>
     x265_picture_t *pic_recon = cliopt.recon ? &pic_out : NULL;<br>
     x265_nal_t *p_nal;<br>
+    x265_stats_t *stats = NULL;<br>
     int nal;<br>
<br>
     if (!x265_encoder_headers(encoder, &p_nal, &nal))<br>
@@ -571,6 +572,7 @@<br>
         fprintf(stderr, "                                                                               \r");<br>
<br>
     double PSNR = 0.0;<br>
+    x265_encoder_stats(encoder, stats);<br>
     x265_encoder_close(encoder, &PSNR);<br>
     cliopt.bitstreamFile.close();<br>
<br>
@@ -580,8 +582,14 @@<br>
     double elapsed = (double)(x265_mdate() - cliopt.i_start) / 1000000;<br>
     double vidtime = (double)inFrameCount / param.frameRate;<br>
     double bitrate = (0.008f * cliopt.totalBytes) / vidtime;<br>
-    printf("\nencoded %d frames in %.2fs (%.2f fps), %.2f kb/s, Global PSNR: %.3f\n",<br>
-           outFrameCount, elapsed, outFrameCount / elapsed, bitrate, PSNR);<br>
+    printf("\nencoded %d frames in %.2fs (%.2f fps), %.2f kb/s, ",<br>
+           outFrameCount, elapsed, outFrameCount / elapsed, bitrate);<br>
+<br>
+    if (param.bEnablePsnr)<br>
+        printf("Global PSNR: %.3f\n", PSNR);<br>
+<br>
+    if (param.bEnableSsim && stats)<br>
+        printf("Global SSIM: %.3f\n", stats->globalSsim);<br>
<br>
     x265_cleanup(); /* Free library singletons */<br>
<br>
</div></div>diff -r 36e2f4978ae4 -r fc225ea42650 source/x265.h<br>
<div class="im">--- a/source/x265.h     Tue Oct 01 15:09:55 2013 +0530<br>
</div>+++ b/source/x265.h     Tue Oct 01 17:28:19 2013 +0530<br>
<div class="HOEnZb"><div class="h5">@@ -192,7 +192,20 @@<br>
 }<br>
 X265_RDO_LEVEL;<br>
<br>
+/* Output Stats from encoder */<br>
+typedef struct x265_stats_t<br>
+{<br>
+    double    globalPsnrY;<br>
+    double    globalPsnrU;<br>
+    double    globalPsnrV;<br>
+    double    globalSsim;<br>
+    double    accBits;<br>
+    double    totalNumPics;<br></div></div></blockquote><div><br></div><div>unneeded empty line</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb">
<div class="h5">
+}<br>
+x265_stats_t;<br>
+<br>
+/* Input parameters to the encoder */<br>
 typedef struct x265_param_t<br>
 {<br>
     int       logLevel;<br>
@@ -344,6 +357,10 @@<br>
  *      the payloads of all output NALs are guaranteed to be sequential in memory. */<br>
 int     x265_encoder_encode(x265_t *encoder, x265_nal_t **pp_nal, int *pi_nal, x265_picture_t *pic_in, x265_picture_t *pic_out);<br>
<br>
+/* x265_encoder_stats:<br>
+*       returns output stats from the encoder */<br>
+void    x265_encoder_stats(x265_t *encoder, x265_stats_t *);<br>
+<br>
 /* x265_encoder_close:<br>
  *      close an encoder handler.  Optionally return the global PSNR value (6 * psnrY + psnrU + psnrV) / 8 */<br>
 void    x265_encoder_close(x265_t *, double *globalPsnr);<br>
</div></div><div class="HOEnZb"><div class="h5">_______________________________________________<br>
x265-devel mailing list<br>
<a href="mailto:x265-devel@videolan.org">x265-devel@videolan.org</a><br>
<a href="https://mailman.videolan.org/listinfo/x265-devel" target="_blank">https://mailman.videolan.org/listinfo/x265-devel</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br>Steve Borho
</div></div>