<div style="line-height:1.7;color:#000000;font-size:14px;font-family:arial"><P># HG changeset patch<BR># User Min Chen <<A href="mailto:chenm003@163.com">chenm003@163.com</A>><BR># Date 1379423463 -28800<BR># Node ID c5c645aa14bfdbf482186730c59a000fdae10e07<BR># Parent  0d33ff236f68bc2238138a7213301b2efc0e6426<BR>Resolve some patching issues for previous patch</P>
<P>1. Added code that missed in last patch.<BR>2. check task is really ready, to be avoid deadlock when a low<BR>   id task enter ready queue but do not get enable signal.<BR>   ex: m_enableBitmap(0x1555) and m_queuedBitmap(0x0600)</P>
<P>diff -r 0d33ff236f68 -r c5c645aa14bf source/common/wavefront.cpp<BR>--- a/source/common/wavefront.cpp Mon Sep 16 21:06:49 2013 +0800<BR>+++ b/source/common/wavefront.cpp Tue Sep 17 21:11:03 2013 +0800<BR>@@ -118,16 +118,11 @@<BR>         while (m_queuedBitmap[w])<BR>         {<BR>             uint64_t oldval = m_queuedBitmap[w];<BR>-            if (oldval == 0) // race condition<BR>+            uint64_t mask = m_queuedBitmap[w] & m_enableBitmap[w];<BR>+            if (mask == 0) // race condition<BR>                 break;<BR> <BR>-        &nbsp
 ;   CTZ64(id, oldval);<BR>-<BR>-            // NOTE: if the lowest row is unavailable, so we don't check higher row<BR>-            if (!(m_enableBitmap[w] & (1LL << id)))<BR>-            {<BR>-                return false;<BR>-            }<BR>+            CTZ64(id, mask);<BR> <BR>             uint64_t newval = oldval & ~(1LL << id);<BR>             if (ATOMIC_CAS(&m_queuedBitmap[w], oldval, newval) == oldval)<BR>diff -r 0d33ff236f68 -r c5c645aa14bf source/encoder/frameencoder.cpp<B
 R>--- a/source/encoder/frameencoder.cpp Mon Sep 16 21:06:49 2013 +0800<BR>+++ b/source/encoder/frameencoder.cpp Tue Sep 17 21:11:03 2013 +0800<BR>@@ -952,7 +952,7 @@<BR>                 m_rows[row + 1].m_completed + 2 <= m_rows[row].m_completed)<BR>             {<BR>                 m_rows[row + 1].m_active = true;<BR>-                WaveFront::enqueueRow(row + 1);<BR>+                enqueueRowEncoder(row + 1);<BR>             }<BR>         }<BR> <BR>@@ -968,13 +968,16 @@<BR>     //
  Run row-wise loop filters<BR>     if (row >= m_filterRowDelay)<BR>     {<BR>-        m_frameFilter.processRow(row - m_filterRowDelay);<BR>+        enableRowFilter(row - m_filterRowDelay);<BR>+<BR>+        // NOTE: Active Filter to first row (row 0)<BR>+        if (row == m_filterRowDelay)<BR>+            enqueueRowFilter(0);<BR>     }<BR>     if (row == m_numRows - 1)<BR>     {<BR>         for(int i = m_numRows - m_filterRowDelay; i < m_numRows; i++)<BR>-            m_frameFilter.processRow(i);<BR>-        m_completionEvent.trigger();<BR>+   &n
 bsp;        enableRowFilter(i);<BR>     }<BR> }<BR> <BR>diff -r 0d33ff236f68 -r c5c645aa14bf source/encoder/frameencoder.h<BR>--- a/source/encoder/frameencoder.h Mon Sep 16 21:06:49 2013 +0800<BR>+++ b/source/encoder/frameencoder.h Tue Sep 17 21:11:03 2013 +0800<BR>@@ -107,7 +107,7 @@<BR> <BR>             // NOTE: Active next row<BR>             if (realRow != m_numRows - 1)<BR>-                enableRowFilter(realRow + 1);<BR>+                enqueueRowFilter(realRow + 1);<BR>             else<BR>              
    m_completionEvent.trigger();<BR>         }<BR></P>
<DIV></DIV></div>