[x265] [PATCH] wavefront: fix for triggering rows for multiple slices when wpp is enabled

Pradeep Ramachandran pradeep at multicorewareinc.com
Thu Sep 28 08:13:42 CEST 2017


On Thu, Sep 21, 2017 at 8:16 PM, <ashok at multicorewareinc.com> wrote:

> # HG changeset patch
> # User Ashok Kumar Mishra <ashok at multicorewareinc.com>
> # Date 1505220183 -19800
> #      Tue Sep 12 18:13:03 2017 +0530
> # Node ID 71f700844b0b2a9120bfd8a2d1f13e219aa20677
> # Parent  1a7edb6fd9932b09c2b5646c7dcc820a51795827
> wavefront: fix for triggering rows for multiple slices when wpp is enabled
> It is required to trigger alternative rows in slices for encoding when wpp
> is enabled.
>

Nicely done! Looks good. Will push into default


>
> diff -r 1a7edb6fd993 -r 71f700844b0b source/common/wavefront.cpp
> --- a/source/common/wavefront.cpp       Thu Jun 29 13:13:56 2017 +0530
> +++ b/source/common/wavefront.cpp       Tue Sep 12 18:13:03 2017 +0530
> @@ -43,11 +43,17 @@
>      if (m_externalDependencyBitmap)
>          memset((void*)m_externalDependencyBitmap, 0, sizeof(uint32_t) *
> m_numWords);
>
> +    m_row_to_idx = X265_MALLOC(uint32_t, m_numRows);
> +    m_idx_to_row = X265_MALLOC(uint32_t, m_numRows);
> +
>      return m_internalDependencyBitmap && m_externalDependencyBitmap;
>  }
>
>  WaveFront::~WaveFront()
>  {
> +    x265_free((void*)m_row_to_idx);
> +    x265_free((void*)m_idx_to_row);
> +
>      x265_free((void*)m_internalDependencyBitmap);
>      x265_free((void*)m_externalDependencyBitmap);
>  }
> diff -r 1a7edb6fd993 -r 71f700844b0b source/common/wavefront.h
> --- a/source/common/wavefront.h Thu Jun 29 13:13:56 2017 +0530
> +++ b/source/common/wavefront.h Tue Sep 12 18:13:03 2017 +0530
> @@ -52,6 +52,10 @@
>
>      int m_numRows;
>
> +protected:
> +    uint32_t *m_row_to_idx;
> +    uint32_t *m_idx_to_row;
> +
>  public:
>
>      WaveFront()
> diff -r 1a7edb6fd993 -r 71f700844b0b source/encoder/frameencoder.cpp
> --- a/source/encoder/frameencoder.cpp   Thu Jun 29 13:13:56 2017 +0530
> +++ b/source/encoder/frameencoder.cpp   Tue Sep 12 18:13:03 2017 +0530
> @@ -701,6 +701,24 @@
>      {
>          m_rows[m_sliceBaseRow[sliceId]].active = true;
>      }
> +    if (m_param->bEnableWavefront)
> +    {
> +        int i = 0;
> +        for (uint32_t rowInSlice = 0; rowInSlice < m_sliceGroupSize;
> rowInSlice++)
> +        {
> +            for (uint32_t sliceId = 0; sliceId < m_param->maxSlices;
> sliceId++)
> +            {
> +                const uint32_t sliceStartRow = m_sliceBaseRow[sliceId];
> +                const uint32_t sliceEndRow = m_sliceBaseRow[sliceId + 1]
> - 1;
> +                const uint32_t row = sliceStartRow + rowInSlice;
> +                if (row > sliceEndRow)
> +                    continue;
> +                m_row_to_idx[row] = i;
> +                m_idx_to_row[i] = row;
> +                i += 1;
> +            }
> +        }
> +    }
>
>      if (m_param->bEnableWavefront)
>      {
> @@ -735,11 +753,11 @@
>                      }
>                  }
>
> -                enableRowEncoder(row); /* clear external dependency for
> this row */
> +                enableRowEncoder(m_row_to_idx[row]); /* clear external
> dependency for this row */
>                  if (!rowInSlice)
>                  {
>                      m_row0WaitTime = x265_mdate();
> -                    enqueueRowEncoder(row); /* clear internal dependency,
> start wavefront */
> +                    enqueueRowEncoder(m_row_to_idx[row]); /* clear
> internal dependency, start wavefront */
>                  }
>                  tryWakeOne();
>              } // end of loop rowInSlice
> @@ -1196,8 +1214,8 @@
>      if (ATOMIC_INC(&m_activeWorkerCount) == 1 && m_stallStartTime)
>          m_totalNoWorkerTime += x265_mdate() - m_stallStartTime;
>
> -    const uint32_t realRow = row >> 1;
> -    const uint32_t typeNum = row & 1;
> +    const uint32_t realRow = m_idx_to_row[row >> 1];
> +    const uint32_t typeNum = m_idx_to_row[row & 1];
>
>      if (!typeNum)
>          processRowEncoder(realRow, m_tld[threadId]);
> @@ -1207,7 +1225,7 @@
>
>          // NOTE: Active next row
>          if (realRow != m_sliceBaseRow[m_rows[realRow].sliceId + 1] - 1)
> -            enqueueRowFilter(realRow + 1);
> +            enqueueRowFilter(m_row_to_idx[realRow + 1]);
>      }
>
>      if (ATOMIC_DEC(&m_activeWorkerCount) == 0)
> @@ -1649,7 +1667,7 @@
>                  m_rows[row + 1].completed + 2 <= curRow.completed)
>              {
>                  m_rows[row + 1].active = true;
> -                enqueueRowEncoder(row + 1);
> +                enqueueRowEncoder(m_row_to_idx[row + 1]);
>                  tryWakeOne(); /* wake up a sleeping thread or set the
> help wanted flag */
>              }
>          }
> @@ -1736,11 +1754,11 @@
>      {
>          if (rowInSlice >= m_filterRowDelay)
>          {
> -            enableRowFilter(row - m_filterRowDelay);
> +            enableRowFilter(m_row_to_idx[row - m_filterRowDelay]);
>
>              /* NOTE: Activate filter if first row (row 0) */
>              if (rowInSlice == m_filterRowDelay)
> -                enqueueRowFilter(row - m_filterRowDelay);
> +                enqueueRowFilter(m_row_to_idx[row - m_filterRowDelay]);
>              tryWakeOne();
>          }
>
> @@ -1748,7 +1766,7 @@
>          {
>              for (uint32_t i = endRowInSlicePlus1 - m_filterRowDelay; i <
> endRowInSlicePlus1; i++)
>              {
> -                enableRowFilter(i);
> +                enableRowFilter(m_row_to_idx[i]);
>              }
>              tryWakeOne();
>          }
> @@ -1756,7 +1774,7 @@
>          // handle specially case - single row slice
>          if  (bFirstRowInSlice & bLastRowInSlice)
>          {
> -            enqueueRowFilter(row);
> +            enqueueRowFilter(m_row_to_idx[row]);
>              tryWakeOne();
>          }
>      }
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20170928/70735620/attachment-0001.html>


More information about the x265-devel mailing list