<div dir="ltr">sry, forgot to commit a new change. pls ignore the previous patch. ll send the updated one. </div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Oct 1, 2013 at 3:16 PM, 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"># HG changeset patch<br>
# User Aarthi Thirumalai<br>
# Date 1380620634 -19800<br>
#      Tue Oct 01 15:13:54 2013 +0530<br>
# Node ID 2a95812683f8f1b7ab75fcdf9034b6003a166f76<br>
# Parent  36e2f4978ae40b23efa1a5403d59168d551f29a6<br>
Added x265_stats_t structure and x265_encoder_stats API to fetch output stats from encoder.<br>
<br>
diff -r 36e2f4978ae4 -r 2a95812683f8 source/Lib/TLibEncoder/TEncTop.cpp<br>
--- a/source/Lib/TLibEncoder/TEncTop.cpp        Tue Oct 01 15:09:55 2013 +0530<br>
+++ b/source/Lib/TLibEncoder/TEncTop.cpp        Tue Oct 01 15:13:54 2013 +0530<br>
@@ -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>
diff -r 36e2f4978ae4 -r 2a95812683f8 source/Lib/TLibEncoder/TEncTop.h<br>
--- a/source/Lib/TLibEncoder/TEncTop.h  Tue Oct 01 15:09:55 2013 +0530<br>
+++ b/source/Lib/TLibEncoder/TEncTop.h  Tue Oct 01 15:13:54 2013 +0530<br>
@@ -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>
diff -r 36e2f4978ae4 -r 2a95812683f8 source/encoder/encoder.cpp<br>
--- a/source/encoder/encoder.cpp        Tue Oct 01 15:09:55 2013 +0530<br>
+++ b/source/encoder/encoder.cpp        Tue Oct 01 15:13:54 2013 +0530<br>
@@ -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>
+    encoder->getStats(outputStats);<br>
+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>
diff -r 36e2f4978ae4 -r 2a95812683f8 source/x265.cpp<br>
--- a/source/x265.cpp   Tue Oct 01 15:09:55 2013 +0530<br>
+++ b/source/x265.cpp   Tue Oct 01 15:13:54 2013 +0530<br>
@@ -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>
diff -r 36e2f4978ae4 -r 2a95812683f8 source/x265.h<br>
--- a/source/x265.h     Tue Oct 01 15:09:55 2013 +0530<br>
+++ b/source/x265.h     Tue Oct 01 15:13:54 2013 +0530<br>
@@ -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>
<br>
+}<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>
</blockquote></div><br></div>