[x265] [PATCH] Fix seg fault while enabling sea

Anusuya Kumarasamy anusuya.kumarasamy at multicorewareinc.com
Fri Sep 27 10:01:36 UTC 2024


>From 7cacb15e7992677942cacf858c80698a2af8d5b3 Mon Sep 17 00:00:00 2001
From: AnusuyaKumarasamy <anusuya.kumarasamy at multicorewareinc.com>
Date: Wed, 18 Sep 2024 16:29:29 +0530
Subject: [PATCH 1/5] Fix seg fault while enabling sea

---
 source/encoder/encoder.cpp     | 28 ++++++++++++++++------------
 source/encoder/framefilter.cpp |  6 +++---
 source/encoder/framefilter.h   |  2 +-
 3 files changed, 20 insertions(+), 16 deletions(-)

diff --git a/source/encoder/encoder.cpp b/source/encoder/encoder.cpp
index 65c247aba..82123606c 100644
--- a/source/encoder/encoder.cpp
+++ b/source/encoder/encoder.cpp
@@ -2332,22 +2332,26 @@ int Encoder::encode(const x265_picture* pic_in,
x265_picture** pic_out)
                     }
                 }
             }
-            if (m_param->searchMethod == X265_SEA &&
frameEnc[0]->m_lowres.sliceType != X265_TYPE_B)
+
+            for (int layer = 0; layer < m_param->numLayers; layer++)
             {
-                int padX = m_param->maxCUSize + 32;
-                int padY = m_param->maxCUSize + 16;
-                uint32_t numCuInHeight =
(frameEnc[0]->m_encData->m_reconPic[0]->m_picHeight + m_param->maxCUSize -
1) / m_param->maxCUSize;
-                int maxHeight = numCuInHeight * m_param->maxCUSize;
-                for (int i = 0; i < INTEGRAL_PLANE_NUM; i++)
+                if (m_param->searchMethod == X265_SEA &&
(frameEnc[layer]->m_lowres.sliceType != X265_TYPE_B || !layer))
                 {
-                    frameEnc[0]->m_encData->m_meBuffer[i] =
X265_MALLOC(uint32_t, frameEnc[0]->m_reconPic[0]->m_stride * (maxHeight +
(2 * padY)));
-                    if (frameEnc[0]->m_encData->m_meBuffer[i])
+                    int padX = m_param->maxCUSize + 32;
+                    int padY = m_param->maxCUSize + 16;
+                    uint32_t numCuInHeight =
(frameEnc[layer]->m_encData->m_reconPic[0]->m_picHeight +
m_param->maxCUSize - 1) / m_param->maxCUSize;
+                    int maxHeight = numCuInHeight * m_param->maxCUSize;
+                    for (int i = 0; i < INTEGRAL_PLANE_NUM; i++)
                     {
-                        memset(frameEnc[0]->m_encData->m_meBuffer[i], 0,
sizeof(uint32_t)* frameEnc[0]->m_reconPic[0]->m_stride * (maxHeight + (2 *
padY)));
-                        frameEnc[0]->m_encData->m_meIntegral[i] =
frameEnc[0]->m_encData->m_meBuffer[i] +
frameEnc[0]->m_encData->m_reconPic[0]->m_stride * padY + padX;
+                        frameEnc[layer]->m_encData->m_meBuffer[i] =
X265_MALLOC(uint32_t, frameEnc[layer]->m_reconPic[0]->m_stride * (maxHeight
+ (2 * padY)));
+                        if (frameEnc[layer]->m_encData->m_meBuffer[i])
+                        {
+
 memset(frameEnc[layer]->m_encData->m_meBuffer[i], 0, sizeof(uint32_t) *
frameEnc[layer]->m_reconPic[0]->m_stride * (maxHeight + (2 * padY)));
+                            frameEnc[layer]->m_encData->m_meIntegral[i] =
frameEnc[layer]->m_encData->m_meBuffer[i] +
frameEnc[layer]->m_encData->m_reconPic[0]->m_stride * padY + padX;
+                        }
+                        else
+                            x265_log(m_param, X265_LOG_ERROR, "SEA motion
search: POC %d Integral buffer[%d] unallocated\n", frameEnc[0]->m_poc, i);
                     }
-                    else
-                        x265_log(m_param, X265_LOG_ERROR, "SEA motion
search: POC %d Integral buffer[%d] unallocated\n", frameEnc[0]->m_poc, i);
                 }
             }

diff --git a/source/encoder/framefilter.cpp b/source/encoder/framefilter.cpp
index 344ac738d..71dc42b2c 100644
--- a/source/encoder/framefilter.cpp
+++ b/source/encoder/framefilter.cpp
@@ -659,7 +659,7 @@ void FrameFilter::processPostRow(int row, int layer)

     /* Generate integral planes for SEA motion search */
     if(m_param->searchMethod == X265_SEA)
-        computeMEIntegral(row);
+        computeMEIntegral(row, layer);
     // Notify other FrameEncoders that this row of reconstructed pixels is
available
     m_frame->m_reconRowFlag[row].set(1);

@@ -722,10 +722,10 @@ void FrameFilter::processPostRow(int row, int layer)
     }
 }

-void FrameFilter::computeMEIntegral(int row)
+void FrameFilter::computeMEIntegral(int row, int layer)
 {
     int lastRow = row ==
(int)m_frame->m_encData->m_slice->m_sps->numCuInHeight - 1;
-    if (m_frame->m_lowres.sliceType != X265_TYPE_B)
+    if (m_frame->m_lowres.sliceType != X265_TYPE_B || !layer)
     {
         /* If WPP, other than first row, integral calculation for current
row needs to wait till the
         * integral for the previous row is computed */
diff --git a/source/encoder/framefilter.h b/source/encoder/framefilter.h
index b84b7094c..8bea1a0e9 100644
--- a/source/encoder/framefilter.h
+++ b/source/encoder/framefilter.h
@@ -130,7 +130,7 @@ public:

     void processRow(int row, int layer);
     void processPostRow(int row, int layer);
-    void computeMEIntegral(int row);
+    void computeMEIntegral(int row, int layer);
 };
 }

-- 
2.36.0.windows.1
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20240927/20cd13bd/attachment.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Fix-seg-fault-while-enabling-sea.patch
Type: application/octet-stream
Size: 5027 bytes
Desc: not available
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20240927/20cd13bd/attachment.obj>


More information about the x265-devel mailing list