[x265] [PATCH] add API and implementation for Region of Interest(ROI)

santhoshini at multicorewareinc.com santhoshini at multicorewareinc.com
Fri Aug 7 06:26:38 CEST 2015


# HG changeset patch
# User Santhoshini Sekar<santhoshini at multicorewareinc.com>
# Date 1438839704 -19800
#      Thu Aug 06 11:11:44 2015 +0530
# Node ID 450055cd2ef7e85ba8fff2d163161c0d0428b5fe
# Parent  9982ac741d1850d2b2451985feef5e0de0790794
add API and implementation for Region of Interest(ROI)

diff -r 9982ac741d18 -r 450055cd2ef7 source/CMakeLists.txt
--- a/source/CMakeLists.txt	Thu Aug 06 10:29:06 2015 +0530
+++ b/source/CMakeLists.txt	Thu Aug 06 11:11:44 2015 +0530
@@ -30,7 +30,7 @@
 mark_as_advanced(FPROFILE_USE FPROFILE_GENERATE NATIVE_BUILD)
 
 # X265_BUILD must be incremented each time the public API is changed
-set(X265_BUILD 68)
+set(X265_BUILD 69)
 configure_file("${PROJECT_SOURCE_DIR}/x265.def.in"
                "${PROJECT_BINARY_DIR}/x265.def")
 configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in"
diff -r 9982ac741d18 -r 450055cd2ef7 source/common/frame.h
--- a/source/common/frame.h	Thu Aug 06 10:29:06 2015 +0530
+++ b/source/common/frame.h	Thu Aug 06 11:11:44 2015 +0530
@@ -59,6 +59,8 @@
     bool                   m_lowresInit;         // lowres init complete (pre-analysis)
     bool                   m_bChromaExtended;    // orig chroma planes motion extended for weight analysis
 
+    float*                 m_quantOffsets;       // points to quantOffsets in x265_picture
+
     /* Frame Parallelism - notification between FrameEncoders of available motion reference rows */
     ThreadSafeInteger      m_reconRowCount;      // count of CTU rows completely reconstructed and extended for motion reference
     volatile uint32_t      m_countRefEncoders;   // count of FrameEncoder threads monitoring m_reconRowCount
@@ -73,6 +75,7 @@
     bool allocEncodeData(x265_param *param, const SPS& sps);
     void reinit(const SPS& sps);
     void destroy();
+    void (*quantOffsetsFree)(void*);
 };
 }
 
diff -r 9982ac741d18 -r 450055cd2ef7 source/encoder/encoder.cpp
--- a/source/encoder/encoder.cpp	Thu Aug 06 10:29:06 2015 +0530
+++ b/source/encoder/encoder.cpp	Thu Aug 06 11:11:44 2015 +0530
@@ -465,6 +465,8 @@
         inFrame->m_pts       = pic_in->pts;
         inFrame->m_forceqp   = pic_in->forceqp;
         inFrame->m_param     = m_reconfigured ? m_latestParam : m_param;
+        inFrame->m_quantOffsets = pic_in->quantOffsets;
+        inFrame->quantOffsetsFree = pic_in->quantOffsets_free;
 
         if (m_pocLast == 0)
             m_firstPts = inFrame->m_pts;
@@ -632,6 +634,9 @@
             frameEnc = m_lookahead->getDecidedPicture();
         if (frameEnc && !pass)
         {
+            if (frameEnc->quantOffsetsFree)
+                frameEnc->quantOffsetsFree(frameEnc->m_quantOffsets);
+
             /* give this frame a FrameData instance before encoding */
             if (m_dpb->m_picSymFreeList)
             {
diff -r 9982ac741d18 -r 450055cd2ef7 source/encoder/slicetype.cpp
--- a/source/encoder/slicetype.cpp	Thu Aug 06 10:29:06 2015 +0530
+++ b/source/encoder/slicetype.cpp	Thu Aug 06 11:11:44 2015 +0530
@@ -96,6 +96,7 @@
     int maxRow = curFrame->m_fencPic->m_picHeight;
     int blockCount = curFrame->m_lowres.maxBlocksInRow * curFrame->m_lowres.maxBlocksInCol;
 
+    float* quantOffsets = curFrame->m_quantOffsets;
     for (int y = 0; y < 3; y++)
     {
         curFrame->m_lowres.wp_ssd[y] = 0;
@@ -113,10 +114,21 @@
 
         if (param->rc.aqMode && param->rc.aqStrength == 0)
         {
-            memset(curFrame->m_lowres.qpCuTreeOffset, 0, cuCount * sizeof(double));
-            memset(curFrame->m_lowres.qpAqOffset, 0, cuCount * sizeof(double));
-            for (int cuxy = 0; cuxy < cuCount; cuxy++)
-                curFrame->m_lowres.invQscaleFactor[cuxy] = 256;
+            if (quantOffsets)
+            {
+                for (int cuxy = 0; cuxy < cuCount; cuxy++)
+                {
+                    curFrame->m_lowres.qpCuTreeOffset[cuxy] = curFrame->m_lowres.qpAqOffset[cuxy] = quantOffsets[cuxy];
+                    curFrame->m_lowres.invQscaleFactor[cuxy] = x265_exp2fix8(curFrame->m_lowres.qpCuTreeOffset[cuxy]);
+                }
+            }
+            else
+            {
+                memset(curFrame->m_lowres.qpCuTreeOffset, 0, cuCount * sizeof(double));
+                memset(curFrame->m_lowres.qpAqOffset, 0, cuCount * sizeof(double));
+                for (int cuxy = 0; cuxy < cuCount; cuxy++)
+                    curFrame->m_lowres.invQscaleFactor[cuxy] = 256;
+            }
         }
 
         /* Need variance data for weighted prediction */
@@ -177,6 +189,8 @@
                     uint32_t energy = acEnergyCu(curFrame, blockX, blockY, param->internalCsp);
                     qp_adj = strength * (X265_LOG2(X265_MAX(energy, 1)) - (14.427f + 2 * (X265_DEPTH - 8)));
                 }
+                if (quantOffsets)
+                    qp_adj += quantOffsets[blockXY];
                 curFrame->m_lowres.qpAqOffset[blockXY] = qp_adj;
                 curFrame->m_lowres.qpCuTreeOffset[blockXY] = qp_adj;
                 curFrame->m_lowres.invQscaleFactor[blockXY] = x265_exp2fix8(qp_adj);
diff -r 9982ac741d18 -r 450055cd2ef7 source/x265.h
--- a/source/x265.h	Thu Aug 06 10:29:06 2015 +0530
+++ b/source/x265.h	Thu Aug 06 11:11:44 2015 +0530
@@ -205,6 +205,17 @@
      * this data structure */
     x265_analysis_data analysisData;
 
+    /* An array of quantizer offsets to be applied to this image during encoding.
+     * These are added on top of the decisions made by rateControl.
+     * Adaptive quantization must be enabled to use this feature. These quantizer 
+     * offsets should be given for each 16x16 block. Behavior if quant
+     * offsets differ between encoding passes is undefined. */
+    float            *quantOffsets;
+
+    /* optional callback to free quant_offsets when used.
+     * Useful if one wants to use a different quant_offset array for each frame. */
+    void (*quantOffsets_free)(void*);
+
     /* Frame level statistics */
     x265_frame_stats frameData;
 


More information about the x265-devel mailing list