[x265-commits] [x265] Merge with stable

Ashok Kumar Mishra ashok at multicorewareinc.com
Fri Nov 23 01:03:04 CET 2018


details:   http://hg.videolan.org/x265/rev/f74003e88622
branches:  
changeset: 12434:f74003e88622
user:      Ashok Kumar Mishra <ashok at multicorewareinc.com>
date:      Thu Nov 22 15:02:08 2018 +0530
description:
Merge with stable

diffstat:

 .hgtags                         |   1 +
 doc/reST/releasenotes.rst       |  26 ++++++++++++++++++++++++++
 source/common/cpu.cpp           |   1 +
 source/common/framedata.cpp     |   6 +++---
 source/common/quant.cpp         |  11 ++++++++++-
 source/encoder/api.cpp          |  28 ++++++++++++++--------------
 source/encoder/encoder.cpp      |  11 +++++++----
 source/encoder/frameencoder.cpp |  10 ++++++----
 source/encoder/frameencoder.h   |   3 +++
 source/test/testharness.h       |   6 +++---
 source/x265.h                   |   5 ++++-
 11 files changed, 78 insertions(+), 30 deletions(-)

diffs (truncated from 320 to 300 lines):

diff -r fd517ae68f93 -r f74003e88622 .hgtags
--- a/.hgtags	Tue Sep 25 16:02:31 2018 +0530
+++ b/.hgtags	Thu Nov 22 15:02:08 2018 +0530
@@ -27,3 +27,4 @@ 64b2d0bf45a52511e57a6b7299160b961ca3d51c
 0e9ea76945c89962cd46cee6537586e2054b2935 2.6
 e41a9bf2bac4a7af2bec2bbadf91e63752d320ef 2.7
 a158a3a029663133455268e2a63ae6b0af2df720 2.8
+f9681d731f2e56c2ca185cec10daece5939bee07 2.9
diff -r fd517ae68f93 -r f74003e88622 doc/reST/releasenotes.rst
--- a/doc/reST/releasenotes.rst	Tue Sep 25 16:02:31 2018 +0530
+++ b/doc/reST/releasenotes.rst	Thu Nov 22 15:02:08 2018 +0530
@@ -2,6 +2,32 @@
 Release Notes
 *************
 
+Version 2.9
+===========
+
+Release date - 05/10/2018
+
+New features
+-------------
+1. Support for chunked encoding
+
+   :option:`--chunk-start and --chunk-end` 
+   Frames preceding first frame of chunk in display order will be encoded, however, they will be discarded in the bitstream.
+   Frames following last frame of the chunk in display order will be used in taking lookahead decisions, but, they will not be encoded. 
+   This feature can be enabled only in closed GOP structures. Default disabled.
+
+2. Support for HDR10+ version 1 SEI messages.
+
+Encoder enhancements
+--------------------
+1. Create API function for allocating and freeing x265_analysis_data.
+2. CEA 608/708 support: Read SEI messages from text file and encode it using userSEI message.
+
+Bug fixes
+---------
+1. Disable noise reduction when vbv is enabled.
+2. Support minLuma and maxLuma values changed by the commandline.
+
 Version 2.8
 ===========
 
diff -r fd517ae68f93 -r f74003e88622 source/common/cpu.cpp
--- a/source/common/cpu.cpp	Tue Sep 25 16:02:31 2018 +0530
+++ b/source/common/cpu.cpp	Thu Nov 22 15:02:08 2018 +0530
@@ -127,6 +127,7 @@ bool detect512()
 {
     return(enable512);
 }
+
 uint32_t cpu_detect(bool benableavx512 )
 {
 
diff -r fd517ae68f93 -r f74003e88622 source/common/framedata.cpp
--- a/source/common/framedata.cpp	Tue Sep 25 16:02:31 2018 +0530
+++ b/source/common/framedata.cpp	Thu Nov 22 15:02:08 2018 +0530
@@ -83,9 +83,9 @@ void FrameData::reinit(const SPS& sps)
     memset(m_rowStat, 0, sps.numCuInHeight * sizeof(*m_rowStat));
     if (m_param->bDynamicRefine)
     {
-        memset(m_picCTU->m_collectCURd, 0, MAX_NUM_DYN_REFINE * sizeof(uint64_t));
-        memset(m_picCTU->m_collectCUVariance, 0, MAX_NUM_DYN_REFINE * sizeof(uint32_t));
-        memset(m_picCTU->m_collectCUCount, 0, MAX_NUM_DYN_REFINE * sizeof(uint32_t));
+        memset(m_picCTU->m_collectCURd, 0, MAX_NUM_DYN_REFINE * sps.numCUsInFrame * sizeof(uint64_t));
+        memset(m_picCTU->m_collectCUVariance, 0, MAX_NUM_DYN_REFINE * sps.numCUsInFrame * sizeof(uint32_t));
+        memset(m_picCTU->m_collectCUCount, 0, MAX_NUM_DYN_REFINE * sps.numCUsInFrame * sizeof(uint32_t));
     }
 }
 
diff -r fd517ae68f93 -r f74003e88622 source/common/quant.cpp
--- a/source/common/quant.cpp	Tue Sep 25 16:02:31 2018 +0530
+++ b/source/common/quant.cpp	Thu Nov 22 15:02:08 2018 +0530
@@ -723,6 +723,7 @@ uint32_t Quant::rdoQuant(const CUData& c
             X265_CHECK(coeffNum[cgScanPos] == 0, "count of coeff failure\n");
             uint32_t scanPosBase = (cgScanPos << MLS_CG_SIZE);
             uint32_t blkPos      = codeParams.scan[scanPosBase];
+#if X265_ARCH_X86
             bool enable512 = detect512();
             if (enable512)
                 primitives.cu[log2TrSize - 2].psyRdoQuant(m_resiDctCoeff, m_fencDctCoeff, costUncoded, &totalUncodedCost, &totalRdCost, &psyScale, blkPos);
@@ -731,6 +732,10 @@ uint32_t Quant::rdoQuant(const CUData& c
                 primitives.cu[log2TrSize - 2].psyRdoQuant_1p(m_resiDctCoeff,  costUncoded, &totalUncodedCost, &totalRdCost,blkPos);
                 primitives.cu[log2TrSize - 2].psyRdoQuant_2p(m_resiDctCoeff, m_fencDctCoeff, costUncoded, &totalUncodedCost, &totalRdCost, &psyScale, blkPos);
             }
+#else
+            primitives.cu[log2TrSize - 2].psyRdoQuant_1p(m_resiDctCoeff, costUncoded, &totalUncodedCost, &totalRdCost, blkPos);
+            primitives.cu[log2TrSize - 2].psyRdoQuant_2p(m_resiDctCoeff, m_fencDctCoeff, costUncoded, &totalUncodedCost, &totalRdCost, &psyScale, blkPos);
+#endif
         }
     }
     else
@@ -805,8 +810,8 @@ uint32_t Quant::rdoQuant(const CUData& c
             uint32_t blkPos = codeParams.scan[scanPosBase];
             if (usePsyMask)
             {
+#if X265_ARCH_X86
                 bool enable512 = detect512();
-
                 if (enable512)
                     primitives.cu[log2TrSize - 2].psyRdoQuant(m_resiDctCoeff, m_fencDctCoeff, costUncoded, &totalUncodedCost, &totalRdCost, &psyScale, blkPos);
                 else
@@ -814,6 +819,10 @@ uint32_t Quant::rdoQuant(const CUData& c
                     primitives.cu[log2TrSize - 2].psyRdoQuant_1p(m_resiDctCoeff, costUncoded, &totalUncodedCost, &totalRdCost, blkPos);
                     primitives.cu[log2TrSize - 2].psyRdoQuant_2p(m_resiDctCoeff, m_fencDctCoeff, costUncoded, &totalUncodedCost, &totalRdCost, &psyScale, blkPos);
                 }
+#else
+                primitives.cu[log2TrSize - 2].psyRdoQuant_1p(m_resiDctCoeff, costUncoded, &totalUncodedCost, &totalRdCost, blkPos);
+                primitives.cu[log2TrSize - 2].psyRdoQuant_2p(m_resiDctCoeff, m_fencDctCoeff, costUncoded, &totalUncodedCost, &totalRdCost, &psyScale, blkPos);
+#endif
                 blkPos = codeParams.scan[scanPosBase];
                 for (int y = 0; y < MLS_CG_SIZE; y++)
                 {
diff -r fd517ae68f93 -r f74003e88622 source/encoder/api.cpp
--- a/source/encoder/api.cpp	Tue Sep 25 16:02:31 2018 +0530
+++ b/source/encoder/api.cpp	Thu Nov 22 15:02:08 2018 +0530
@@ -1483,11 +1483,11 @@ fail_or_end:
 double x265_calculate_vmafscore(x265_param *param, x265_vmaf_data *data)
 {
     double score;
-    
+
     data->width = param->sourceWidth;
     data->height = param->sourceHeight;
     data->internalBitDepth = param->internalBitDepth;
-   
+
     if (param->internalCsp == X265_CSP_I420)
     {
         if ((param->sourceWidth * param->sourceHeight) % 2 != 0)
@@ -1500,8 +1500,8 @@ double x265_calculate_vmafscore(x265_par
         data->offset = param->sourceWidth * param->sourceHeight * 2;
     else
         x265_log(NULL, X265_LOG_ERROR, "Invalid format\n");
-  
-    compute_vmaf(&score, vcd->format, data->width, data->height, read_frame, data, vcd->model_path, vcd->log_path, vcd->log_fmt, vcd->disable_clip, vcd->disable_avx, vcd->enable_transform, vcd->phone_model, vcd->psnr, vcd->ssim, vcd->ms_ssim, vcd->pool); 
+
+    compute_vmaf(&score, vcd->format, data->width, data->height, read_frame, data, vcd->model_path, vcd->log_path, vcd->log_fmt, vcd->disable_clip, vcd->disable_avx, vcd->enable_transform, vcd->phone_model, vcd->psnr, vcd->ssim, vcd->ms_ssim, vcd->pool, vcd->thread, vcd->subsample, vcd->enable_conf_interval);
 
     return score;
 }
@@ -1514,11 +1514,11 @@ int read_frame_10bit(float *reference_da
     PicYuv *distorted_frame = (PicYuv *)user_data->distorted_frame;
 
     if(!user_data->frame_set) {
- 
+
         int reference_stride = reference_frame->m_stride;
         int distorted_stride = distorted_frame->m_stride;
 
-        const uint16_t *reference_ptr = (const uint16_t *)reference_frame->m_picOrg[0]; 
+        const uint16_t *reference_ptr = (const uint16_t *)reference_frame->m_picOrg[0];
         const uint16_t *distorted_ptr = (const uint16_t *)distorted_frame->m_picOrg[0];
 
         temp_data = reference_data;
@@ -1534,7 +1534,7 @@ int read_frame_10bit(float *reference_da
             reference_ptr += reference_stride;
             temp_data += stride / sizeof(*temp_data);
         }
-        
+
         temp_data = distorted_data;
         for (i = 0; i < height; i++) {
             for (j = 0; j < width; j++) {
@@ -1546,8 +1546,8 @@ int read_frame_10bit(float *reference_da
 
         user_data->frame_set = 1;
         return 0;
-    }                                                             
-    return 2;                                                               
+    }
+    return 2;
 }
 
 int read_frame_8bit(float *reference_data, float *distorted_data, float *temp_data, int stride, void *s)
@@ -1578,7 +1578,7 @@ int read_frame_8bit(float *reference_dat
             reference_ptr += reference_stride;
             temp_data += stride / sizeof(*temp_data);
         }
-        
+
         temp_data = distorted_data;
         for (i = 0; i < height; i++) {
             for (j = 0; j < width; j++) {
@@ -1590,8 +1590,8 @@ int read_frame_8bit(float *reference_dat
 
         user_data->frame_set = 1;
         return 0;
-    }                                                             
-    return 2;                                                               
+    }
+    return 2;
 }
 
 double x265_calculate_vmaf_framelevelscore(x265_vmaf_framedata *vmafframedata)
@@ -1603,8 +1603,8 @@ double x265_calculate_vmaf_framelevelsco
         read_frame = read_frame_8bit;
     else
         read_frame = read_frame_10bit;
-    compute_vmaf(&score, vcd->format, vmafframedata->width, vmafframedata->height, read_frame, vmafframedata, vcd->model_path, vcd->log_path, vcd->log_fmt, vcd->disable_clip, vcd->disable_avx, vcd->enable_transform, vcd->phone_model, vcd->psnr, vcd->ssim, vcd->ms_ssim, vcd->pool);
- 
+    compute_vmaf(&score, vcd->format, vmafframedata->width, vmafframedata->height, read_frame, vmafframedata, vcd->model_path, vcd->log_path, vcd->log_fmt, vcd->disable_clip, vcd->disable_avx, vcd->enable_transform, vcd->phone_model, vcd->psnr, vcd->ssim, vcd->ms_ssim, vcd->pool, vcd->thread, vcd->subsample, vcd->enable_conf_interval);
+
     return score;
 }
 #endif
diff -r fd517ae68f93 -r f74003e88622 source/encoder/encoder.cpp
--- a/source/encoder/encoder.cpp	Tue Sep 25 16:02:31 2018 +0530
+++ b/source/encoder/encoder.cpp	Thu Nov 22 15:02:08 2018 +0530
@@ -2381,10 +2381,13 @@ void Encoder::getStreamHeaders(NALList& 
 
     if (m_param->bEmitHDRSEI)
     {
-        SEIContentLightLevel cllsei;
-        cllsei.max_content_light_level = m_param->maxCLL;
-        cllsei.max_pic_average_light_level = m_param->maxFALL;
-        cllsei.writeSEImessages(bs, m_sps, NAL_UNIT_PREFIX_SEI, list, m_param->bSingleSeiNal);
+        if (m_emitCLLSEI)
+        {
+            SEIContentLightLevel cllsei;
+            cllsei.max_content_light_level = m_param->maxCLL;
+            cllsei.max_pic_average_light_level = m_param->maxFALL;
+            cllsei.writeSEImessages(bs, m_sps, NAL_UNIT_PREFIX_SEI, list, m_param->bSingleSeiNal);
+        }
 
         if (m_param->masteringDisplayColorVolume)
         {
diff -r fd517ae68f93 -r f74003e88622 source/encoder/frameencoder.cpp
--- a/source/encoder/frameencoder.cpp	Tue Sep 25 16:02:31 2018 +0530
+++ b/source/encoder/frameencoder.cpp	Thu Nov 22 15:02:08 2018 +0530
@@ -1599,11 +1599,11 @@ void FrameEncoder::processRowEncoder(int
             if (!m_param->bEnableWavefront && col == numCols - 1)
             {
                 double qpBase = curEncData.m_cuStat[cuAddr].baseQp;
-                int reEncode = m_top->m_rateControl->rowVbvRateControl(m_frame, row, &m_rce, qpBase, m_sliceBaseRow, sliceId);
+                curRow.reEncode = m_top->m_rateControl->rowVbvRateControl(m_frame, row, &m_rce, qpBase, m_sliceBaseRow, sliceId);
                 qpBase = x265_clip3((double)m_param->rc.qpMin, (double)m_param->rc.qpMax, qpBase);
                 curEncData.m_rowStat[row].rowQp = qpBase;
                 curEncData.m_rowStat[row].rowQpScale = x265_qp2qScale(qpBase);
-                if (reEncode < 0)
+                if (curRow.reEncode < 0)
                 {
                     x265_log(m_param, X265_LOG_DEBUG, "POC %d row %d - encode restart required for VBV, to %.2f from %.2f\n",
                         m_frame->m_poc, row, qpBase, curEncData.m_cuStat[cuAddr].baseQp);
@@ -1642,17 +1642,19 @@ void FrameEncoder::processRowEncoder(int
                             curEncData.m_rowStat[r].sumQpRc += curEncData.m_cuStat[c].baseQp;
                             curEncData.m_rowStat[r].numEncodedCUs = c;
                         }
+                        if (curRow.reEncode < 0)
+                            break;
                         startCuAddr = EndCuAddr - numCols;
                         EndCuAddr = startCuAddr + 1;
                     }
                 }
                 double qpBase = curEncData.m_cuStat[cuAddr].baseQp;
-                int reEncode = m_top->m_rateControl->rowVbvRateControl(m_frame, row, &m_rce, qpBase, m_sliceBaseRow, sliceId);
+                curRow.reEncode = m_top->m_rateControl->rowVbvRateControl(m_frame, row, &m_rce, qpBase, m_sliceBaseRow, sliceId);
                 qpBase = x265_clip3((double)m_param->rc.qpMin, (double)m_param->rc.qpMax, qpBase);
                 curEncData.m_rowStat[row].rowQp = qpBase;
                 curEncData.m_rowStat[row].rowQpScale = x265_qp2qScale(qpBase);
 
-                if (reEncode < 0)
+                if (curRow.reEncode < 0)
                 {
                     x265_log(m_param, X265_LOG_DEBUG, "POC %d row %d - encode restart required for VBV, to %.2f from %.2f\n",
                              m_frame->m_poc, row, qpBase, curEncData.m_cuStat[cuAddr].baseQp);
diff -r fd517ae68f93 -r f74003e88622 source/encoder/frameencoder.h
--- a/source/encoder/frameencoder.h	Tue Sep 25 16:02:31 2018 +0530
+++ b/source/encoder/frameencoder.h	Thu Nov 22 15:02:08 2018 +0530
@@ -97,6 +97,8 @@ struct CTURow
     volatile uint32_t completed;
     volatile uint32_t avgQPComputed;
 
+    volatile int      reEncode;
+
     /* called at the start of each frame to initialize state */
     void init(Entropy& initContext, unsigned int sid)
     {
@@ -105,6 +107,7 @@ struct CTURow
         completed = 0;
         avgQPComputed = 0;
         sliceId = sid;
+        reEncode = 0;
         memset(&rowStats, 0, sizeof(rowStats));
         rowGoOnCoder.load(initContext);
     }
diff -r fd517ae68f93 -r f74003e88622 source/test/testharness.h
--- a/source/test/testharness.h	Tue Sep 25 16:02:31 2018 +0530
+++ b/source/test/testharness.h	Thu Nov 22 15:02:08 2018 +0530
@@ -93,9 +93,9 @@ static inline uint32_t __rdtsc(void)
 
 #define BENCH_RUNS 2000
 
-// Adapted from checkasm.c, runs each optimized primitive four times, measures rdtsc
-// and discards invalid times.  Repeats 1000 times to get a good average.  Then measures
-// the C reference with fewer runs and reports X factor and average cycles.
+/* Adapted from checkasm.c, runs each optimized primitive four times, measures rdtsc
+ * and discards invalid times. Repeats BENCH_RUNS times to get a good average.
+ * Then measures the C reference with BENCH_RUNS / 4 runs and reports X factor and average cycles.*/


More information about the x265-commits mailing list