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