<div dir="ltr">right - this patch should be ignored<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Aug 19, 2015 at 1:26 PM, Steve Borho <span dir="ltr"><<a href="mailto:steve@borho.org" target="_blank">steve@borho.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On 08/17, <a href="mailto:deepthi@multicorewareinc.com">deepthi@multicorewareinc.com</a> wrote:<br>
> # HG changeset patch<br>
> # User Deepthi Nandakumar <<a href="mailto:deepthi@multicorewareinc.com">deepthi@multicorewareinc.com</a>><br>
> # Date 1439811205 -19800<br>
> #      Mon Aug 17 17:03:25 2015 +0530<br>
> # Node ID 9834fc054362a039580b205323d47fe1561c1ac9<br>
> # Parent  996ebce8c874fc511d495cee227d24413e99d0c1<br>
> build: export x265-extras in the DLL<br>
<br>
</span>this defeats the purpose of them being in 'extras' to begin with. If the<br>
features are linked into the shared library they might as well be<br>
configured via x265_param and managed by the encoder itself (and turned<br>
into encoder/csv.cpp and common/dither.cpp)<br>
<div><div class="h5"><br>
> diff -r 996ebce8c874 -r 9834fc054362 source/CMakeLists.txt<br>
> --- a/source/CMakeLists.txt   Mon Aug 17 10:52:15 2015 +0530<br>
> +++ b/source/CMakeLists.txt   Mon Aug 17 17:03:25 2015 +0530<br>
> @@ -535,11 +535,11 @@<br>
>      if(XCODE)<br>
>          # Xcode seems unable to link the CLI with libs, so link as one targget<br>
>          add_executable(cli ../COPYING ${InputFiles} ${OutputFiles} ${GETOPT}<br>
> -                       x265.cpp x265.h x265cli.h x265-extras.h x265-extras.cpp<br>
> +                       x265.cpp x265.h x265cli.h<br>
>                         $<TARGET_OBJECTS:encoder> $<TARGET_OBJECTS:common> ${YASM_OBJS} ${YASM_SRCS})<br>
>      else()<br>
>          add_executable(cli ../COPYING ${InputFiles} ${OutputFiles} ${GETOPT} ${X265_RC_FILE}<br>
> -                       ${ExportDefs} x265.cpp x265.h x265cli.h x265-extras.h x265-extras.cpp)<br>
> +                       ${ExportDefs} x265.cpp x265.h x265cli.h)<br>
>          if(WIN32 OR NOT ENABLE_SHARED OR INTEL_CXX)<br>
>              # The CLI cannot link to the shared library on Windows, it<br>
>              # requires internal APIs not exported from the DLL<br>
> diff -r 996ebce8c874 -r 9834fc054362 source/common/CMakeLists.txt<br>
> --- a/source/common/CMakeLists.txt    Mon Aug 17 10:52:15 2015 +0530<br>
> +++ b/source/common/CMakeLists.txt    Mon Aug 17 17:03:25 2015 +0530<br>
> @@ -110,4 +110,5 @@<br>
>      predict.cpp  predict.h<br>
>      scalinglist.cpp scalinglist.h<br>
>      quant.cpp quant.h contexts.h<br>
> -    deblock.cpp deblock.h)<br>
> +    deblock.cpp deblock.h<br>
> +    x265-extras.cpp x265-extras.h)<br>
> diff -r 996ebce8c874 -r 9834fc054362 source/common/x265-extras.cpp<br>
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000<br>
> +++ b/source/common/x265-extras.cpp   Mon Aug 17 17:03:25 2015 +0530<br>
> @@ -0,0 +1,341 @@<br>
> +/*****************************************************************************<br>
> + * Copyright (C) 2015 x265 project<br>
> + *<br>
> + * Authors: Steve Borho <<a href="mailto:steve@borho.org">steve@borho.org</a>><br>
> + *          Selvakumar Nithiyaruban <<a href="mailto:selvakumar@multicorewareinc.com">selvakumar@multicorewareinc.com</a>><br>
> + *          Divya Manivannan <<a href="mailto:divya@multicorewareinc.com">divya@multicorewareinc.com</a>><br>
> + *<br>
> + * This program is free software; you can redistribute it and/or modify<br>
> + * it under the terms of the GNU General Public License as published by<br>
> + * the Free Software Foundation; either version 2 of the License, or<br>
> + * (at your option) any later version.<br>
> + *<br>
> + * This program is distributed in the hope that it will be useful,<br>
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of<br>
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the<br>
> + * GNU General Public License for more details.<br>
> + *<br>
> + * You should have received a copy of the GNU General Public License<br>
> + * along with this program; if not, write to the Free Software<br>
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.<br>
> + *<br>
> + * This program is also available under a commercial proprietary license.<br>
> + * For more information, contact us at license @ <a href="http://x265.com" rel="noreferrer" target="_blank">x265.com</a>.<br>
> + *****************************************************************************/<br>
> +<br>
> +#include "x265.h"<br>
> +#include "x265-extras.h"<br>
> +<br>
> +#include "common.h"<br>
> +<br>
> +using namespace X265_NS;<br>
> +<br>
> +static const char* summaryCSVHeader =<br>
> +    "Command, Date/Time, Elapsed Time, FPS, Bitrate, "<br>
> +    "Y PSNR, U PSNR, V PSNR, Global PSNR, SSIM, SSIM (dB), "<br>
> +    "I count, I ave-QP, I kbps, I-PSNR Y, I-PSNR U, I-PSNR V, I-SSIM (dB), "<br>
> +    "P count, P ave-QP, P kbps, P-PSNR Y, P-PSNR U, P-PSNR V, P-SSIM (dB), "<br>
> +    "B count, B ave-QP, B kbps, B-PSNR Y, B-PSNR U, B-PSNR V, B-SSIM (dB), "<br>
> +    "MaxCLL, MaxFALL, Version\n";<br>
> +<br>
> +FILE* x265_csvlog_open(const x265_api& api, const x265_param& param, const char* fname, int level)<br>
> +{<br>
> +    if (sizeof(x265_stats) != api.sizeof_stats || sizeof(x265_picture) != api.sizeof_picture)<br>
> +    {<br>
> +        fprintf(stderr, "extras [error]: structure size skew, unable to create CSV logfile\n");<br>
> +        return NULL;<br>
> +    }<br>
> +<br>
> +    FILE *csvfp = fopen(fname, "r");<br>
> +    if (csvfp)<br>
> +    {<br>
> +        /* file already exists, re-open for append */<br>
> +        fclose(csvfp);<br>
> +        return fopen(fname, "ab");<br>
> +    }<br>
> +    else<br>
> +    {<br>
> +        /* new CSV file, write header */<br>
> +        csvfp = fopen(fname, "wb");<br>
> +        if (csvfp)<br>
> +        {<br>
> +            if (level)<br>
> +            {<br>
> +                fprintf(csvfp, "Encode Order, Type, POC, QP, Bits, ");<br>
> +                if (param.rc.rateControlMode == X265_RC_CRF)<br>
> +                    fprintf(csvfp, "RateFactor, ");<br>
> +                fprintf(csvfp, "Y PSNR, U PSNR, V PSNR, YUV PSNR, SSIM, SSIM (dB),  List 0, List 1");<br>
> +                /* detailed performance statistics */<br>
> +                fprintf(csvfp, ", DecideWait (ms), Row0Wait (ms), Wall time (ms), Ref Wait Wall (ms), Total CTU time (ms), Stall Time (ms), Avg WPP, Row Blocks");<br>
> +                if (level >= 2)<br>
> +                {<br>
> +                    uint32_t size = param.maxCUSize;<br>
> +                    for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)<br>
> +                    {<br>
> +                        fprintf(csvfp, ", Intra %dx%d DC, Intra %dx%d Planar, Intra %dx%d Ang", size, size, size, size, size, size);<br>
> +                        size /= 2;<br>
> +                    }<br>
> +                    fprintf(csvfp, ", 4x4");<br>
> +                    size = param.maxCUSize;<br>
> +                    if (param.bEnableRectInter)<br>
> +                    {<br>
> +                        for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)<br>
> +                        {<br>
> +                            fprintf(csvfp, ", Inter %dx%d, Inter %dx%d (Rect)", size, size, size, size);<br>
> +                            if (param.bEnableAMP)<br>
> +                                fprintf(csvfp, ", Inter %dx%d (Amp)", size, size);<br>
> +                            size /= 2;<br>
> +                        }<br>
> +                    }<br>
> +                    else<br>
> +                    {<br>
> +                        for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)<br>
> +                        {<br>
> +                            fprintf(csvfp, ", Inter %dx%d", size, size);<br>
> +                            size /= 2;<br>
> +                        }<br>
> +                    }<br>
> +                    size = param.maxCUSize;<br>
> +                    for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)<br>
> +                    {<br>
> +                        fprintf(csvfp, ", Skip %dx%d", size, size);<br>
> +                        size /= 2;<br>
> +                    }<br>
> +                    size = param.maxCUSize;<br>
> +                    for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)<br>
> +                    {<br>
> +                        fprintf(csvfp, ", Merge %dx%d", size, size);<br>
> +                        size /= 2;<br>
> +                    }<br>
> +                    fprintf(csvfp, ", Avg Luma Distortion, Avg Chroma Distortion, Avg psyEnergy, Avg Luma Level, Max Luma Level");<br>
> +                }<br>
> +                fprintf(csvfp, "\n");<br>
> +            }<br>
> +            else<br>
> +                fputs(summaryCSVHeader, csvfp);<br>
> +        }<br>
> +        return csvfp;<br>
> +    }<br>
> +}<br>
> +<br>
> +// per frame CSV logging<br>
> +void x265_csvlog_frame(FILE* csvfp, const x265_param& param, const x265_picture& pic, int level)<br>
> +{<br>
> +    if (!csvfp)<br>
> +        return;<br>
> +<br>
> +    const x265_frame_stats* frameStats = &pic.frameData;<br>
> +    fprintf(csvfp, "%d, %c-SLICE, %4d, %2.2lf, %10d,", frameStats->encoderOrder, frameStats->sliceType, frameStats->poc, frameStats->qp, (int)frameStats->bits);<br>
> +    if (param.rc.rateControlMode == X265_RC_CRF)<br>
> +        fprintf(csvfp, "%.3lf,", frameStats->rateFactor);<br>
> +    if (param.bEnablePsnr)<br>
> +        fprintf(csvfp, "%.3lf, %.3lf, %.3lf, %.3lf,", frameStats->psnrY, frameStats->psnrU, frameStats->psnrV, frameStats->psnr);<br>
> +    else<br>
> +        fputs(" -, -, -, -,", csvfp);<br>
> +    if (param.bEnableSsim)<br>
> +        fprintf(csvfp, " %.6f, %6.3f,", frameStats->ssim, x265_ssim2dB(frameStats->ssim));<br>
> +    else<br>
> +        fputs(" -, -,", csvfp);<br>
> +    if (frameStats->sliceType == 'I')<br>
> +        fputs(" -, -,", csvfp);<br>
> +    else<br>
> +    {<br>
> +        int i = 0;<br>
> +        while (frameStats->list0POC[i] != -1)<br>
> +            fprintf(csvfp, "%d ", frameStats->list0POC[i++]);<br>
> +        fprintf(csvfp, ",");<br>
> +        if (frameStats->sliceType != 'P')<br>
> +        {<br>
> +            i = 0;<br>
> +            while (frameStats->list1POC[i] != -1)<br>
> +                fprintf(csvfp, "%d ", frameStats->list1POC[i++]);<br>
> +            fprintf(csvfp, ",");<br>
> +        }<br>
> +        else<br>
> +            fputs(" -,", csvfp);<br>
> +    }<br>
> +    fprintf(csvfp, " %.1lf, %.1lf, %.1lf, %.1lf, %.1lf, %.1lf,", frameStats->decideWaitTime, frameStats->row0WaitTime, frameStats->wallTime, frameStats->refWaitWallTime, frameStats->totalCTUTime, frameStats->stallTime);<br>
> +    fprintf(csvfp, " %.3lf, %d", frameStats->avgWPP, frameStats->countRowBlocks);<br>
> +    if (level >= 2)<br>
> +    {<br>
> +        for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)<br>
> +            fprintf(csvfp, ", %5.2lf%%, %5.2lf%%, %5.2lf%%", frameStats->cuStats.percentIntraDistribution[depth][0], frameStats->cuStats.percentIntraDistribution[depth][1], frameStats->cuStats.percentIntraDistribution[depth][2]);<br>
> +        fprintf(csvfp, ", %5.2lf%%", frameStats->cuStats.percentIntraNxN);<br>
> +        if (param.bEnableRectInter)<br>
> +        {<br>
> +            for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)<br>
> +            {<br>
> +                fprintf(csvfp, ", %5.2lf%%, %5.2lf%%", frameStats->cuStats.percentInterDistribution[depth][0], frameStats->cuStats.percentInterDistribution[depth][1]);<br>
> +                if (param.bEnableAMP)<br>
> +                    fprintf(csvfp, ", %5.2lf%%", frameStats->cuStats.percentInterDistribution[depth][2]);<br>
> +            }<br>
> +        }<br>
> +        else<br>
> +        {<br>
> +            for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)<br>
> +                fprintf(csvfp, ", %5.2lf%%", frameStats->cuStats.percentInterDistribution[depth][0]);<br>
> +        }<br>
> +        for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)<br>
> +            fprintf(csvfp, ", %5.2lf%%", frameStats->cuStats.percentSkipCu[depth]);<br>
> +        for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)<br>
> +            fprintf(csvfp, ", %5.2lf%%", frameStats->cuStats.percentMergeCu[depth]);<br>
> +        fprintf(csvfp, ", %.2lf, %.2lf, %.2lf, %.2lf, %d", frameStats->avgLumaDistortion, frameStats->avgChromaDistortion, frameStats->avgPsyEnergy, frameStats->avgLumaLevel, frameStats->maxLumaLevel);<br>
> +    }<br>
> +    fprintf(csvfp, "\n");<br>
> +    fflush(stderr);<br>
> +}<br>
> +<br>
> +void x265_csvlog_encode(FILE* csvfp, const x265_api& api, const x265_param& param, const x265_stats& stats, int level, int argc, char** argv)<br>
> +{<br>
> +    if (!csvfp)<br>
> +        return;<br>
> +<br>
> +    if (level)<br>
> +    {<br>
> +        // adding summary to a per-frame csv log file, so it needs a summary header<br>
> +        fprintf(csvfp, "\nSummary\n");<br>
> +        fputs(summaryCSVHeader, csvfp);<br>
> +    }<br>
> +<br>
> +    // CLI arguments or other<br>
> +    for (int i = 1; i < argc; i++)<br>
> +    {<br>
> +        if (i) fputc(' ', csvfp);<br>
> +        fputs(argv[i], csvfp);<br>
> +    }<br>
> +<br>
> +    // current date and time<br>
> +    time_t now;<br>
> +    struct tm* timeinfo;<br>
> +    time(&now);<br>
> +    timeinfo = localtime(&now);<br>
> +    char buffer[200];<br>
> +    strftime(buffer, 128, "%c", timeinfo);<br>
> +    fprintf(csvfp, ", %s, ", buffer);<br>
> +<br>
> +    // elapsed time, fps, bitrate<br>
> +    fprintf(csvfp, "%.2f, %.2f, %.2f,",<br>
> +        stats.elapsedEncodeTime, stats.encodedPictureCount / stats.elapsedEncodeTime, stats.bitrate);<br>
> +<br>
> +    if (param.bEnablePsnr)<br>
> +        fprintf(csvfp, " %.3lf, %.3lf, %.3lf, %.3lf,",<br>
> +        stats.globalPsnrY / stats.encodedPictureCount, stats.globalPsnrU / stats.encodedPictureCount,<br>
> +        stats.globalPsnrV / stats.encodedPictureCount, stats.globalPsnr);<br>
> +    else<br>
> +        fprintf(csvfp, " -, -, -, -,");<br>
> +    if (param.bEnableSsim)<br>
> +        fprintf(csvfp, " %.6f, %6.3f,", stats.globalSsim, x265_ssim2dB(stats.globalSsim));<br>
> +    else<br>
> +        fprintf(csvfp, " -, -,");<br>
> +<br>
> +    if (stats.statsI.numPics)<br>
> +    {<br>
> +        fprintf(csvfp, " %-6u, %2.2lf, %-8.2lf,", stats.statsI.numPics, stats.statsI.avgQp, stats.statsI.bitrate);<br>
> +        if (param.bEnablePsnr)<br>
> +            fprintf(csvfp, " %.3lf, %.3lf, %.3lf,", stats.statsI.psnrY, stats.statsI.psnrU, stats.statsI.psnrV);<br>
> +        else<br>
> +            fprintf(csvfp, " -, -, -,");<br>
> +        if (param.bEnableSsim)<br>
> +            fprintf(csvfp, " %.3lf,", stats.statsI.ssim);<br>
> +        else<br>
> +            fprintf(csvfp, " -,");<br>
> +    }<br>
> +    else<br>
> +        fprintf(csvfp, " -, -, -, -, -, -, -,");<br>
> +<br>
> +    if (stats.statsP.numPics)<br>
> +    {<br>
> +        fprintf(csvfp, " %-6u, %2.2lf, %-8.2lf,", stats.statsP.numPics, stats.statsP.avgQp, stats.statsP.bitrate);<br>
> +        if (param.bEnablePsnr)<br>
> +            fprintf(csvfp, " %.3lf, %.3lf, %.3lf,", stats.statsP.psnrY, stats.statsP.psnrU, stats.statsP.psnrV);<br>
> +        else<br>
> +            fprintf(csvfp, " -, -, -,");<br>
> +        if (param.bEnableSsim)<br>
> +            fprintf(csvfp, " %.3lf,", stats.statsP.ssim);<br>
> +        else<br>
> +            fprintf(csvfp, " -,");<br>
> +    }<br>
> +    else<br>
> +        fprintf(csvfp, " -, -, -, -, -, -, -,");<br>
> +<br>
> +    if (stats.statsB.numPics)<br>
> +    {<br>
> +        fprintf(csvfp, " %-6u, %2.2lf, %-8.2lf,", stats.statsB.numPics, stats.statsB.avgQp, stats.statsB.bitrate);<br>
> +        if (param.bEnablePsnr)<br>
> +            fprintf(csvfp, " %.3lf, %.3lf, %.3lf,", stats.statsB.psnrY, stats.statsB.psnrU, stats.statsB.psnrV);<br>
> +        else<br>
> +            fprintf(csvfp, " -, -, -,");<br>
> +        if (param.bEnableSsim)<br>
> +            fprintf(csvfp, " %.3lf,", stats.statsB.ssim);<br>
> +        else<br>
> +            fprintf(csvfp, " -,");<br>
> +    }<br>
> +    else<br>
> +        fprintf(csvfp, " -, -, -, -, -, -, -,");<br>
> +<br>
> +    fprintf(csvfp, " %-6u, %-6u, %s\n", stats.maxCLL, stats.maxFALL, api.version_str);<br>
> +}<br>
> +<br>
> +/* The dithering algorithm is based on Sierra-2-4A error diffusion. */<br>
> +static void ditherPlane(pixel *dst, int dstStride, uint16_t *src, int srcStride,<br>
> +                        int width, int height, int16_t *errors, int bitDepth)<br>
> +{<br>
> +    const int lShift = 16 - bitDepth;<br>
> +    const int rShift = 16 - bitDepth + 2;<br>
> +    const int half = (1 << (16 - bitDepth + 1));<br>
> +    const int pixelMax = (1 << bitDepth) - 1;<br>
> +<br>
> +    memset(errors, 0, (width + 1) * sizeof(int16_t));<br>
> +    int pitch = 1;<br>
> +    for (int y = 0; y < height; y++, src += srcStride, dst += dstStride)<br>
> +    {<br>
> +        int16_t err = 0;<br>
> +        for (int x = 0; x < width; x++)<br>
> +        {<br>
> +            err = err * 2 + errors[x] + errors[x + 1];<br>
> +            dst[x * pitch] = (pixel)x265_clip3(0, pixelMax, ((src[x * 1] << 2) + err + half) >> rShift);<br>
> +            errors[x] = err = src[x * pitch] - (dst[x * pitch] << lShift);<br>
> +        }<br>
> +    }<br>
> +}<br>
> +<br>
> +void x265_dither_image(const x265_api& api, x265_picture& picIn, int picWidth, int picHeight, int16_t *errorBuf, int bitDepth)<br>
> +{<br>
> +    if (sizeof(x265_picture) != api.sizeof_picture)<br>
> +    {<br>
> +        fprintf(stderr, "extras [error]: structure size skew, unable to dither\n");<br>
> +        return;<br>
> +    }<br>
> +<br>
> +    if (picIn.bitDepth <= 8)<br>
> +    {<br>
> +        fprintf(stderr, "extras [error]: dither support enabled only for input bitdepth > 8\n");<br>
> +        return;<br>
> +    }<br>
> +<br>
> +    /* This portion of code is from readFrame in x264. */<br>
> +    for (int i = 0; i < x265_cli_csps[picIn.colorSpace].planes; i++)<br>
> +    {<br>
> +        if ((picIn.bitDepth & 7) && (picIn.bitDepth != 16))<br>
> +        {<br>
> +            /* upconvert non 16bit high depth planes to 16bit */<br>
> +            uint16_t *plane = (uint16_t*)picIn.planes[i];<br>
> +            uint32_t pixelCount = x265_picturePlaneSize(picIn.colorSpace, picWidth, picHeight, i);<br>
> +            int lShift = 16 - picIn.bitDepth;<br>
> +<br>
> +            /* This loop assumes width is equal to stride which<br>
> +             * happens to be true for file reader outputs */<br>
> +            for (uint32_t j = 0; j < pixelCount; j++)<br>
> +                plane[j] = plane[j] << lShift;<br>
> +        }<br>
> +    }<br>
> +<br>
> +    for (int i = 0; i < x265_cli_csps[picIn.colorSpace].planes; i++)<br>
> +    {<br>
> +        int height = (int)(picHeight >> x265_cli_csps[picIn.colorSpace].height[i]);<br>
> +        int width = (int)(picWidth >> x265_cli_csps[picIn.colorSpace].width[i]);<br>
> +<br>
> +        ditherPlane(((pixel*)picIn.planes[i]), picIn.stride[i] / sizeof(pixel), ((uint16_t*)picIn.planes[i]),<br>
> +                    picIn.stride[i] / 2, width, height, errorBuf, bitDepth);<br>
> +    }<br>
> +}<br>
> diff -r 996ebce8c874 -r 9834fc054362 source/common/x265-extras.h<br>
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000<br>
> +++ b/source/common/x265-extras.h     Mon Aug 17 17:03:25 2015 +0530<br>
> @@ -0,0 +1,60 @@<br>
> +/*****************************************************************************<br>
> + * Copyright (C) 2015 x265 project<br>
> + *<br>
> + * Authors: Steve Borho <<a href="mailto:steve@borho.org">steve@borho.org</a>><br>
> + *<br>
> + * This program is free software; you can redistribute it and/or modify<br>
> + * it under the terms of the GNU General Public License as published by<br>
> + * the Free Software Foundation; either version 2 of the License, or<br>
> + * (at your option) any later version.<br>
> + *<br>
> + * This program is distributed in the hope that it will be useful,<br>
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of<br>
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the<br>
> + * GNU General Public License for more details.<br>
> + *<br>
> + * You should have received a copy of the GNU General Public License<br>
> + * along with this program; if not, write to the Free Software<br>
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.<br>
> + *<br>
> + * This program is also available under a commercial proprietary license.<br>
> + * For more information, contact us at license @ <a href="http://x265.com" rel="noreferrer" target="_blank">x265.com</a>.<br>
> + *****************************************************************************/<br>
> +<br>
> +#ifndef X265_EXTRAS_H<br>
> +#define X265_EXTRAS_H 1<br>
> +<br>
> +#include "x265.h"<br>
> +<br>
> +#include <stdio.h><br>
> +#include <stdint.h><br>
> +<br>
> +#ifdef __cplusplus<br>
> +extern "C" {<br>
> +#endif<br>
> +<br>
> +/* Open a CSV log file. On success it returns a file handle which must be passed<br>
> + * to x265_csvlog_frame() and/or x265_csvlog_encode(). The file handle must be<br>
> + * closed by the caller using fclose(). If level is 0, then no frame logging<br>
> + * header is written to the file. This function will return NULL if it is unable<br>
> + * to open the file for write or if it detects a structure size skew */<br>
> +FILE* x265_csvlog_open(const x265_api& api, const x265_param& param, const char* fname, int level);<br>
> +<br>
> +/* Log frame statistics to the CSV file handle. level should have been non-zero<br>
> + * in the call to x265_csvlog_open() if this function is called. */<br>
> +void x265_csvlog_frame(FILE* csvfp, const x265_param& param, const x265_picture& pic, int level);<br>
> +<br>
> +/* Log final encode statistics to the CSV file handle. 'argc' and 'argv' are<br>
> + * intended to be command line arguments passed to the encoder. Encode<br>
> + * statistics should be queried from the encoder just prior to closing it. */<br>
> +void x265_csvlog_encode(FILE* csvfp, const x265_api& api, const x265_param& param, const x265_stats& stats, int level, int argc, char** argv);<br>
> +<br>
> +/* In-place downshift from a bit-depth greater than 8 to a bit-depth of 8, using<br>
> + * the residual bits to dither each row. */<br>
> +void x265_dither_image(const x265_api& api, x265_picture&, int picWidth, int picHeight, int16_t *errorBuf, int bitDepth);<br>
> +<br>
> +#ifdef __cplusplus<br>
> +}<br>
> +#endif<br>
> +<br>
> +#endif<br>
> diff -r 996ebce8c874 -r 9834fc054362 source/x265-extras.cpp<br>
> --- a/source/x265-extras.cpp  Mon Aug 17 10:52:15 2015 +0530<br>
> +++ /dev/null Thu Jan 01 00:00:00 1970 +0000<br>
> @@ -1,341 +0,0 @@<br>
> -/*****************************************************************************<br>
> - * Copyright (C) 2015 x265 project<br>
> - *<br>
> - * Authors: Steve Borho <<a href="mailto:steve@borho.org">steve@borho.org</a>><br>
> - *          Selvakumar Nithiyaruban <<a href="mailto:selvakumar@multicorewareinc.com">selvakumar@multicorewareinc.com</a>><br>
> - *          Divya Manivannan <<a href="mailto:divya@multicorewareinc.com">divya@multicorewareinc.com</a>><br>
> - *<br>
> - * This program is free software; you can redistribute it and/or modify<br>
> - * it under the terms of the GNU General Public License as published by<br>
> - * the Free Software Foundation; either version 2 of the License, or<br>
> - * (at your option) any later version.<br>
> - *<br>
> - * This program is distributed in the hope that it will be useful,<br>
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of<br>
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the<br>
> - * GNU General Public License for more details.<br>
> - *<br>
> - * You should have received a copy of the GNU General Public License<br>
> - * along with this program; if not, write to the Free Software<br>
> - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.<br>
> - *<br>
> - * This program is also available under a commercial proprietary license.<br>
> - * For more information, contact us at license @ <a href="http://x265.com" rel="noreferrer" target="_blank">x265.com</a>.<br>
> - *****************************************************************************/<br>
> -<br>
> -#include "x265.h"<br>
> -#include "x265-extras.h"<br>
> -<br>
> -#include "common.h"<br>
> -<br>
> -using namespace X265_NS;<br>
> -<br>
> -static const char* summaryCSVHeader =<br>
> -    "Command, Date/Time, Elapsed Time, FPS, Bitrate, "<br>
> -    "Y PSNR, U PSNR, V PSNR, Global PSNR, SSIM, SSIM (dB), "<br>
> -    "I count, I ave-QP, I kbps, I-PSNR Y, I-PSNR U, I-PSNR V, I-SSIM (dB), "<br>
> -    "P count, P ave-QP, P kbps, P-PSNR Y, P-PSNR U, P-PSNR V, P-SSIM (dB), "<br>
> -    "B count, B ave-QP, B kbps, B-PSNR Y, B-PSNR U, B-PSNR V, B-SSIM (dB), "<br>
> -    "MaxCLL, MaxFALL, Version\n";<br>
> -<br>
> -FILE* x265_csvlog_open(const x265_api& api, const x265_param& param, const char* fname, int level)<br>
> -{<br>
> -    if (sizeof(x265_stats) != api.sizeof_stats || sizeof(x265_picture) != api.sizeof_picture)<br>
> -    {<br>
> -        fprintf(stderr, "extras [error]: structure size skew, unable to create CSV logfile\n");<br>
> -        return NULL;<br>
> -    }<br>
> -<br>
> -    FILE *csvfp = fopen(fname, "r");<br>
> -    if (csvfp)<br>
> -    {<br>
> -        /* file already exists, re-open for append */<br>
> -        fclose(csvfp);<br>
> -        return fopen(fname, "ab");<br>
> -    }<br>
> -    else<br>
> -    {<br>
> -        /* new CSV file, write header */<br>
> -        csvfp = fopen(fname, "wb");<br>
> -        if (csvfp)<br>
> -        {<br>
> -            if (level)<br>
> -            {<br>
> -                fprintf(csvfp, "Encode Order, Type, POC, QP, Bits, ");<br>
> -                if (param.rc.rateControlMode == X265_RC_CRF)<br>
> -                    fprintf(csvfp, "RateFactor, ");<br>
> -                fprintf(csvfp, "Y PSNR, U PSNR, V PSNR, YUV PSNR, SSIM, SSIM (dB),  List 0, List 1");<br>
> -                /* detailed performance statistics */<br>
> -                fprintf(csvfp, ", DecideWait (ms), Row0Wait (ms), Wall time (ms), Ref Wait Wall (ms), Total CTU time (ms), Stall Time (ms), Avg WPP, Row Blocks");<br>
> -                if (level >= 2)<br>
> -                {<br>
> -                    uint32_t size = param.maxCUSize;<br>
> -                    for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)<br>
> -                    {<br>
> -                        fprintf(csvfp, ", Intra %dx%d DC, Intra %dx%d Planar, Intra %dx%d Ang", size, size, size, size, size, size);<br>
> -                        size /= 2;<br>
> -                    }<br>
> -                    fprintf(csvfp, ", 4x4");<br>
> -                    size = param.maxCUSize;<br>
> -                    if (param.bEnableRectInter)<br>
> -                    {<br>
> -                        for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)<br>
> -                        {<br>
> -                            fprintf(csvfp, ", Inter %dx%d, Inter %dx%d (Rect)", size, size, size, size);<br>
> -                            if (param.bEnableAMP)<br>
> -                                fprintf(csvfp, ", Inter %dx%d (Amp)", size, size);<br>
> -                            size /= 2;<br>
> -                        }<br>
> -                    }<br>
> -                    else<br>
> -                    {<br>
> -                        for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)<br>
> -                        {<br>
> -                            fprintf(csvfp, ", Inter %dx%d", size, size);<br>
> -                            size /= 2;<br>
> -                        }<br>
> -                    }<br>
> -                    size = param.maxCUSize;<br>
> -                    for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)<br>
> -                    {<br>
> -                        fprintf(csvfp, ", Skip %dx%d", size, size);<br>
> -                        size /= 2;<br>
> -                    }<br>
> -                    size = param.maxCUSize;<br>
> -                    for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)<br>
> -                    {<br>
> -                        fprintf(csvfp, ", Merge %dx%d", size, size);<br>
> -                        size /= 2;<br>
> -                    }<br>
> -                    fprintf(csvfp, ", Avg Luma Distortion, Avg Chroma Distortion, Avg psyEnergy, Avg Luma Level, Max Luma Level");<br>
> -                }<br>
> -                fprintf(csvfp, "\n");<br>
> -            }<br>
> -            else<br>
> -                fputs(summaryCSVHeader, csvfp);<br>
> -        }<br>
> -        return csvfp;<br>
> -    }<br>
> -}<br>
> -<br>
> -// per frame CSV logging<br>
> -void x265_csvlog_frame(FILE* csvfp, const x265_param& param, const x265_picture& pic, int level)<br>
> -{<br>
> -    if (!csvfp)<br>
> -        return;<br>
> -<br>
> -    const x265_frame_stats* frameStats = &pic.frameData;<br>
> -    fprintf(csvfp, "%d, %c-SLICE, %4d, %2.2lf, %10d,", frameStats->encoderOrder, frameStats->sliceType, frameStats->poc, frameStats->qp, (int)frameStats->bits);<br>
> -    if (param.rc.rateControlMode == X265_RC_CRF)<br>
> -        fprintf(csvfp, "%.3lf,", frameStats->rateFactor);<br>
> -    if (param.bEnablePsnr)<br>
> -        fprintf(csvfp, "%.3lf, %.3lf, %.3lf, %.3lf,", frameStats->psnrY, frameStats->psnrU, frameStats->psnrV, frameStats->psnr);<br>
> -    else<br>
> -        fputs(" -, -, -, -,", csvfp);<br>
> -    if (param.bEnableSsim)<br>
> -        fprintf(csvfp, " %.6f, %6.3f,", frameStats->ssim, x265_ssim2dB(frameStats->ssim));<br>
> -    else<br>
> -        fputs(" -, -,", csvfp);<br>
> -    if (frameStats->sliceType == 'I')<br>
> -        fputs(" -, -,", csvfp);<br>
> -    else<br>
> -    {<br>
> -        int i = 0;<br>
> -        while (frameStats->list0POC[i] != -1)<br>
> -            fprintf(csvfp, "%d ", frameStats->list0POC[i++]);<br>
> -        fprintf(csvfp, ",");<br>
> -        if (frameStats->sliceType != 'P')<br>
> -        {<br>
> -            i = 0;<br>
> -            while (frameStats->list1POC[i] != -1)<br>
> -                fprintf(csvfp, "%d ", frameStats->list1POC[i++]);<br>
> -            fprintf(csvfp, ",");<br>
> -        }<br>
> -        else<br>
> -            fputs(" -,", csvfp);<br>
> -    }<br>
> -    fprintf(csvfp, " %.1lf, %.1lf, %.1lf, %.1lf, %.1lf, %.1lf,", frameStats->decideWaitTime, frameStats->row0WaitTime, frameStats->wallTime, frameStats->refWaitWallTime, frameStats->totalCTUTime, frameStats->stallTime);<br>
> -    fprintf(csvfp, " %.3lf, %d", frameStats->avgWPP, frameStats->countRowBlocks);<br>
> -    if (level >= 2)<br>
> -    {<br>
> -        for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)<br>
> -            fprintf(csvfp, ", %5.2lf%%, %5.2lf%%, %5.2lf%%", frameStats->cuStats.percentIntraDistribution[depth][0], frameStats->cuStats.percentIntraDistribution[depth][1], frameStats->cuStats.percentIntraDistribution[depth][2]);<br>
> -        fprintf(csvfp, ", %5.2lf%%", frameStats->cuStats.percentIntraNxN);<br>
> -        if (param.bEnableRectInter)<br>
> -        {<br>
> -            for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)<br>
> -            {<br>
> -                fprintf(csvfp, ", %5.2lf%%, %5.2lf%%", frameStats->cuStats.percentInterDistribution[depth][0], frameStats->cuStats.percentInterDistribution[depth][1]);<br>
> -                if (param.bEnableAMP)<br>
> -                    fprintf(csvfp, ", %5.2lf%%", frameStats->cuStats.percentInterDistribution[depth][2]);<br>
> -            }<br>
> -        }<br>
> -        else<br>
> -        {<br>
> -            for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)<br>
> -                fprintf(csvfp, ", %5.2lf%%", frameStats->cuStats.percentInterDistribution[depth][0]);<br>
> -        }<br>
> -        for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)<br>
> -            fprintf(csvfp, ", %5.2lf%%", frameStats->cuStats.percentSkipCu[depth]);<br>
> -        for (uint32_t depth = 0; depth <= g_maxCUDepth; depth++)<br>
> -            fprintf(csvfp, ", %5.2lf%%", frameStats->cuStats.percentMergeCu[depth]);<br>
> -        fprintf(csvfp, ", %.2lf, %.2lf, %.2lf, %.2lf, %d", frameStats->avgLumaDistortion, frameStats->avgChromaDistortion, frameStats->avgPsyEnergy, frameStats->avgLumaLevel, frameStats->maxLumaLevel);<br>
> -    }<br>
> -    fprintf(csvfp, "\n");<br>
> -    fflush(stderr);<br>
> -}<br>
> -<br>
> -void x265_csvlog_encode(FILE* csvfp, const x265_api& api, const x265_param& param, const x265_stats& stats, int level, int argc, char** argv)<br>
> -{<br>
> -    if (!csvfp)<br>
> -        return;<br>
> -<br>
> -    if (level)<br>
> -    {<br>
> -        // adding summary to a per-frame csv log file, so it needs a summary header<br>
> -        fprintf(csvfp, "\nSummary\n");<br>
> -        fputs(summaryCSVHeader, csvfp);<br>
> -    }<br>
> -<br>
> -    // CLI arguments or other<br>
> -    for (int i = 1; i < argc; i++)<br>
> -    {<br>
> -        if (i) fputc(' ', csvfp);<br>
> -        fputs(argv[i], csvfp);<br>
> -    }<br>
> -<br>
> -    // current date and time<br>
> -    time_t now;<br>
> -    struct tm* timeinfo;<br>
> -    time(&now);<br>
> -    timeinfo = localtime(&now);<br>
> -    char buffer[200];<br>
> -    strftime(buffer, 128, "%c", timeinfo);<br>
> -    fprintf(csvfp, ", %s, ", buffer);<br>
> -<br>
> -    // elapsed time, fps, bitrate<br>
> -    fprintf(csvfp, "%.2f, %.2f, %.2f,",<br>
> -        stats.elapsedEncodeTime, stats.encodedPictureCount / stats.elapsedEncodeTime, stats.bitrate);<br>
> -<br>
> -    if (param.bEnablePsnr)<br>
> -        fprintf(csvfp, " %.3lf, %.3lf, %.3lf, %.3lf,",<br>
> -        stats.globalPsnrY / stats.encodedPictureCount, stats.globalPsnrU / stats.encodedPictureCount,<br>
> -        stats.globalPsnrV / stats.encodedPictureCount, stats.globalPsnr);<br>
> -    else<br>
> -        fprintf(csvfp, " -, -, -, -,");<br>
> -    if (param.bEnableSsim)<br>
> -        fprintf(csvfp, " %.6f, %6.3f,", stats.globalSsim, x265_ssim2dB(stats.globalSsim));<br>
> -    else<br>
> -        fprintf(csvfp, " -, -,");<br>
> -<br>
> -    if (stats.statsI.numPics)<br>
> -    {<br>
> -        fprintf(csvfp, " %-6u, %2.2lf, %-8.2lf,", stats.statsI.numPics, stats.statsI.avgQp, stats.statsI.bitrate);<br>
> -        if (param.bEnablePsnr)<br>
> -            fprintf(csvfp, " %.3lf, %.3lf, %.3lf,", stats.statsI.psnrY, stats.statsI.psnrU, stats.statsI.psnrV);<br>
> -        else<br>
> -            fprintf(csvfp, " -, -, -,");<br>
> -        if (param.bEnableSsim)<br>
> -            fprintf(csvfp, " %.3lf,", stats.statsI.ssim);<br>
> -        else<br>
> -            fprintf(csvfp, " -,");<br>
> -    }<br>
> -    else<br>
> -        fprintf(csvfp, " -, -, -, -, -, -, -,");<br>
> -<br>
> -    if (stats.statsP.numPics)<br>
> -    {<br>
> -        fprintf(csvfp, " %-6u, %2.2lf, %-8.2lf,", stats.statsP.numPics, stats.statsP.avgQp, stats.statsP.bitrate);<br>
> -        if (param.bEnablePsnr)<br>
> -            fprintf(csvfp, " %.3lf, %.3lf, %.3lf,", stats.statsP.psnrY, stats.statsP.psnrU, stats.statsP.psnrV);<br>
> -        else<br>
> -            fprintf(csvfp, " -, -, -,");<br>
> -        if (param.bEnableSsim)<br>
> -            fprintf(csvfp, " %.3lf,", stats.statsP.ssim);<br>
> -        else<br>
> -            fprintf(csvfp, " -,");<br>
> -    }<br>
> -    else<br>
> -        fprintf(csvfp, " -, -, -, -, -, -, -,");<br>
> -<br>
> -    if (stats.statsB.numPics)<br>
> -    {<br>
> -        fprintf(csvfp, " %-6u, %2.2lf, %-8.2lf,", stats.statsB.numPics, stats.statsB.avgQp, stats.statsB.bitrate);<br>
> -        if (param.bEnablePsnr)<br>
> -            fprintf(csvfp, " %.3lf, %.3lf, %.3lf,", stats.statsB.psnrY, stats.statsB.psnrU, stats.statsB.psnrV);<br>
> -        else<br>
> -            fprintf(csvfp, " -, -, -,");<br>
> -        if (param.bEnableSsim)<br>
> -            fprintf(csvfp, " %.3lf,", stats.statsB.ssim);<br>
> -        else<br>
> -            fprintf(csvfp, " -,");<br>
> -    }<br>
> -    else<br>
> -        fprintf(csvfp, " -, -, -, -, -, -, -,");<br>
> -<br>
> -    fprintf(csvfp, " %-6u, %-6u, %s\n", stats.maxCLL, stats.maxFALL, api.version_str);<br>
> -}<br>
> -<br>
> -/* The dithering algorithm is based on Sierra-2-4A error diffusion. */<br>
> -static void ditherPlane(pixel *dst, int dstStride, uint16_t *src, int srcStride,<br>
> -                        int width, int height, int16_t *errors, int bitDepth)<br>
> -{<br>
> -    const int lShift = 16 - bitDepth;<br>
> -    const int rShift = 16 - bitDepth + 2;<br>
> -    const int half = (1 << (16 - bitDepth + 1));<br>
> -    const int pixelMax = (1 << bitDepth) - 1;<br>
> -<br>
> -    memset(errors, 0, (width + 1) * sizeof(int16_t));<br>
> -    int pitch = 1;<br>
> -    for (int y = 0; y < height; y++, src += srcStride, dst += dstStride)<br>
> -    {<br>
> -        int16_t err = 0;<br>
> -        for (int x = 0; x < width; x++)<br>
> -        {<br>
> -            err = err * 2 + errors[x] + errors[x + 1];<br>
> -            dst[x * pitch] = (pixel)x265_clip3(0, pixelMax, ((src[x * 1] << 2) + err + half) >> rShift);<br>
> -            errors[x] = err = src[x * pitch] - (dst[x * pitch] << lShift);<br>
> -        }<br>
> -    }<br>
> -}<br>
> -<br>
> -void x265_dither_image(const x265_api& api, x265_picture& picIn, int picWidth, int picHeight, int16_t *errorBuf, int bitDepth)<br>
> -{<br>
> -    if (sizeof(x265_picture) != api.sizeof_picture)<br>
> -    {<br>
> -        fprintf(stderr, "extras [error]: structure size skew, unable to dither\n");<br>
> -        return;<br>
> -    }<br>
> -<br>
> -    if (picIn.bitDepth <= 8)<br>
> -    {<br>
> -        fprintf(stderr, "extras [error]: dither support enabled only for input bitdepth > 8\n");<br>
> -        return;<br>
> -    }<br>
> -<br>
> -    /* This portion of code is from readFrame in x264. */<br>
> -    for (int i = 0; i < x265_cli_csps[picIn.colorSpace].planes; i++)<br>
> -    {<br>
> -        if ((picIn.bitDepth & 7) && (picIn.bitDepth != 16))<br>
> -        {<br>
> -            /* upconvert non 16bit high depth planes to 16bit */<br>
> -            uint16_t *plane = (uint16_t*)picIn.planes[i];<br>
> -            uint32_t pixelCount = x265_picturePlaneSize(picIn.colorSpace, picWidth, picHeight, i);<br>
> -            int lShift = 16 - picIn.bitDepth;<br>
> -<br>
> -            /* This loop assumes width is equal to stride which<br>
> -             * happens to be true for file reader outputs */<br>
> -            for (uint32_t j = 0; j < pixelCount; j++)<br>
> -                plane[j] = plane[j] << lShift;<br>
> -        }<br>
> -    }<br>
> -<br>
> -    for (int i = 0; i < x265_cli_csps[picIn.colorSpace].planes; i++)<br>
> -    {<br>
> -        int height = (int)(picHeight >> x265_cli_csps[picIn.colorSpace].height[i]);<br>
> -        int width = (int)(picWidth >> x265_cli_csps[picIn.colorSpace].width[i]);<br>
> -<br>
> -        ditherPlane(((pixel*)picIn.planes[i]), picIn.stride[i] / sizeof(pixel), ((uint16_t*)picIn.planes[i]),<br>
> -                    picIn.stride[i] / 2, width, height, errorBuf, bitDepth);<br>
> -    }<br>
> -}<br>
> diff -r 996ebce8c874 -r 9834fc054362 source/x265-extras.h<br>
> --- a/source/x265-extras.h    Mon Aug 17 10:52:15 2015 +0530<br>
> +++ /dev/null Thu Jan 01 00:00:00 1970 +0000<br>
> @@ -1,66 +0,0 @@<br>
> -/*****************************************************************************<br>
> - * Copyright (C) 2015 x265 project<br>
> - *<br>
> - * Authors: Steve Borho <<a href="mailto:steve@borho.org">steve@borho.org</a>><br>
> - *<br>
> - * This program is free software; you can redistribute it and/or modify<br>
> - * it under the terms of the GNU General Public License as published by<br>
> - * the Free Software Foundation; either version 2 of the License, or<br>
> - * (at your option) any later version.<br>
> - *<br>
> - * This program is distributed in the hope that it will be useful,<br>
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of<br>
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the<br>
> - * GNU General Public License for more details.<br>
> - *<br>
> - * You should have received a copy of the GNU General Public License<br>
> - * along with this program; if not, write to the Free Software<br>
> - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.<br>
> - *<br>
> - * This program is also available under a commercial proprietary license.<br>
> - * For more information, contact us at license @ <a href="http://x265.com" rel="noreferrer" target="_blank">x265.com</a>.<br>
> - *****************************************************************************/<br>
> -<br>
> -#ifndef X265_EXTRAS_H<br>
> -#define X265_EXTRAS_H 1<br>
> -<br>
> -#include "x265.h"<br>
> -<br>
> -#include <stdio.h><br>
> -#include <stdint.h><br>
> -<br>
> -#ifdef __cplusplus<br>
> -extern "C" {<br>
> -#endif<br>
> -<br>
> -#if _WIN32<br>
> -#define LIBAPI __declspec(dllexport)<br>
> -#else<br>
> -#define LIBAPI<br>
> -#endif<br>
> -<br>
> -/* Open a CSV log file. On success it returns a file handle which must be passed<br>
> - * to x265_csvlog_frame() and/or x265_csvlog_encode(). The file handle must be<br>
> - * closed by the caller using fclose(). If level is 0, then no frame logging<br>
> - * header is written to the file. This function will return NULL if it is unable<br>
> - * to open the file for write or if it detects a structure size skew */<br>
> -LIBAPI FILE* x265_csvlog_open(const x265_api& api, const x265_param& param, const char* fname, int level);<br>
> -<br>
> -/* Log frame statistics to the CSV file handle. level should have been non-zero<br>
> - * in the call to x265_csvlog_open() if this function is called. */<br>
> -LIBAPI void x265_csvlog_frame(FILE* csvfp, const x265_param& param, const x265_picture& pic, int level);<br>
> -<br>
> -/* Log final encode statistics to the CSV file handle. 'argc' and 'argv' are<br>
> - * intended to be command line arguments passed to the encoder. Encode<br>
> - * statistics should be queried from the encoder just prior to closing it. */<br>
> -LIBAPI void x265_csvlog_encode(FILE* csvfp, const x265_api& api, const x265_param& param, const x265_stats& stats, int level, int argc, char** argv);<br>
> -<br>
> -/* In-place downshift from a bit-depth greater than 8 to a bit-depth of 8, using<br>
> - * the residual bits to dither each row. */<br>
> -LIBAPI void x265_dither_image(const x265_api& api, x265_picture&, int picWidth, int picHeight, int16_t *errorBuf, int bitDepth);<br>
> -<br>
> -#ifdef __cplusplus<br>
> -}<br>
> -#endif<br>
> -<br>
> -#endif<br>
> diff -r 996ebce8c874 -r 9834fc054362 source/<a href="http://x265.def.in" rel="noreferrer" target="_blank">x265.def.in</a><br>
> --- a/source/<a href="http://x265.def.in" rel="noreferrer" target="_blank">x265.def.in</a>      Mon Aug 17 10:52:15 2015 +0530<br>
> +++ b/source/<a href="http://x265.def.in" rel="noreferrer" target="_blank">x265.def.in</a>      Mon Aug 17 17:03:25 2015 +0530<br>
> @@ -22,3 +22,7 @@<br>
>  x265_cleanup<br>
>  x265_api_get_${X265_BUILD}<br>
>  x265_api_query<br>
> +x265_csvlog_open<br>
> +x265_csvlog_frame<br>
> +x265_csvlog_encode<br>
> +x265_dither_image<br>
</div></div>> _______________________________________________<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" rel="noreferrer" target="_blank">https://mailman.videolan.org/listinfo/x265-devel</a><br>
><br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
Steve Borho<br>
<br>
_______________________________________________<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" rel="noreferrer" target="_blank">https://mailman.videolan.org/listinfo/x265-devel</a><br>
<br>
</font></span></blockquote></div><br></div>