Commit d45e5501 authored by Frank Galligan's avatar Frank Galligan

Fix rare deadlock before loop filter

There was an extremely rare deadlock that happened when one thread
was waiting to start the loop filter on frame n while the other
threads were starting to work on frame n+1.

Change-Id: Icc94f728b3b6663405435640d9a2996735ba19ef
parent 18c902f8
......@@ -161,6 +161,8 @@ THREAD_FUNCTION vp8_thread_decoding_proc(void *p_data)
while (1)
{
int current_filter_level = 0;
if (pbi->b_multithreaded_rd == 0)
break;
......@@ -279,6 +281,11 @@ THREAD_FUNCTION vp8_thread_decoding_proc(void *p_data)
}
}
}
// If |pbi->common.filter_level| is 0 the value can change in-between
// the sem_post and the check to call vp8_thread_loop_filter.
current_filter_level = pbi->common.filter_level;
// add this to each frame
if ((mbrd->mb_row == pbi->common.mb_rows-1) || ((mbrd->mb_row == pbi->common.mb_rows-2) && (pbi->common.mb_rows % (pbi->decoding_thread_count+1))==1))
{
......@@ -286,7 +293,7 @@ THREAD_FUNCTION vp8_thread_decoding_proc(void *p_data)
sem_post(&pbi->h_event_end_decoding);
}
if ((pbi->b_multithreaded_lf) &&(pbi->common.filter_level))
if ((pbi->b_multithreaded_lf) && (current_filter_level))
vp8_thread_loop_filter(pbi, mbrd, ithread);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment