Fix loopfilter race condition in multithreaded encoder
Race was introduced by https://gerrit.chromium.org/gerrit/15563. If loopfilter related config params were changed between frames, or after a KEY frame, there could be a mismatch between encoder's and decoder's recontructed image. In worst case, when frame buffers are reallocated because of a size change, the loopfilter could do an invalid data access (segmentation fault). Fixes: Sync with the loopfilter before applying any encoder changes in vp8_change_config(). Moved the loopfilter synching to the top of encode_frame_to_data_rate() so that it's done before any alteration of the encoder. Change-Id: Ide5245d2a2aeed78752de750c0110bc4b46f5b7b
This commit is contained in:
parent
dba053898a
commit
3939e85b26
@ -1412,6 +1412,15 @@ void vp8_change_config(VP8_COMP *cpi, VP8_CONFIG *oxcf)
|
||||
if (!oxcf)
|
||||
return;
|
||||
|
||||
#if CONFIG_MULTITHREAD
|
||||
/* wait for the last picture loopfilter thread done */
|
||||
if (cpi->b_lpf_running)
|
||||
{
|
||||
sem_wait(&cpi->h_event_end_lpf);
|
||||
cpi->b_lpf_running = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (cm->version != oxcf->Version)
|
||||
{
|
||||
cm->version = oxcf->Version;
|
||||
@ -3194,6 +3203,15 @@ static void encode_frame_to_data_rate
|
||||
// Clear down mmx registers to allow floating point in what follows
|
||||
vp8_clear_system_state();
|
||||
|
||||
#if CONFIG_MULTITHREAD
|
||||
/* wait for the last picture loopfilter thread done */
|
||||
if (cpi->b_lpf_running)
|
||||
{
|
||||
sem_wait(&cpi->h_event_end_lpf);
|
||||
cpi->b_lpf_running = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Test code for segmentation of gf/arf (0,0)
|
||||
//segmentation_test_function( cpi);
|
||||
|
||||
@ -3748,14 +3766,7 @@ static void encode_frame_to_data_rate
|
||||
vp8_setup_key_frame(cpi);
|
||||
}
|
||||
|
||||
#if CONFIG_MULTITHREAD
|
||||
/* wait for the last picture loopfilter thread done */
|
||||
if (cpi->b_lpf_running)
|
||||
{
|
||||
sem_wait(&cpi->h_event_end_lpf);
|
||||
cpi->b_lpf_running = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#if CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user