<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>