From eb16f00cf25e54f08c5a9ec25a8780ca708a2c3a Mon Sep 17 00:00:00 2001 From: Yunqing Wang Date: Thu, 5 May 2011 10:42:29 -0400 Subject: [PATCH] Fix rare hang in multi-thread encoder on Windows This patch is to fix a rare hang in multi-thread encoder that was only seen on Windows. Thanks for John's help in debugging the problem. More test is needed. Change-Id: Idb11c6d344c2082362a032b34c5a602a1eea62fc --- vp8/encoder/ethreading.c | 2 ++ vp8/encoder/onyx_if.c | 4 ++-- vp8/encoder/onyx_int.h | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/vp8/encoder/ethreading.c b/vp8/encoder/ethreading.c index c00494dcf..c92a366e8 100644 --- a/vp8/encoder/ethreading.c +++ b/vp8/encoder/ethreading.c @@ -514,6 +514,7 @@ void vp8cx_create_encoder_threads(VP8_COMP *cpi) LPFTHREAD_DATA * lpfthd = &cpi->lpf_thread_data; sem_init(&cpi->h_event_start_lpf, 0, 0); + sem_init(&cpi->h_event_end_picklpf, 0, 0); sem_init(&cpi->h_event_end_lpf, 0, 0); lpfthd->ptr1 = (void *)cpi; @@ -547,6 +548,7 @@ void vp8cx_remove_encoder_threads(VP8_COMP *cpi) sem_destroy(&cpi->h_event_end_encoding); sem_destroy(&cpi->h_event_end_lpf); + sem_destroy(&cpi->h_event_end_picklpf); sem_destroy(&cpi->h_event_start_lpf); //free thread related resources diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c index 1738e5699..78f86557d 100644 --- a/vp8/encoder/onyx_if.c +++ b/vp8/encoder/onyx_if.c @@ -3140,7 +3140,7 @@ void loopfilter_frame(VP8_COMP *cpi, VP8_COMMON *cm) #if CONFIG_MULTITHREAD if (cpi->b_multi_threaded) - sem_post(&cpi->h_event_end_lpf); /* signal that we have set filter_level */ + sem_post(&cpi->h_event_end_picklpf); /* signal that we have set filter_level */ #endif if (cm->filter_level > 0) @@ -4135,7 +4135,7 @@ static void encode_frame_to_data_rate #if CONFIG_MULTITHREAD /* wait that filter_level is picked so that we can continue with stream packing */ if (cpi->b_multi_threaded) - sem_wait(&cpi->h_event_end_lpf); + sem_wait(&cpi->h_event_end_picklpf); #endif // build the bitstream diff --git a/vp8/encoder/onyx_int.h b/vp8/encoder/onyx_int.h index e2e6b367c..c2fcff88c 100644 --- a/vp8/encoder/onyx_int.h +++ b/vp8/encoder/onyx_int.h @@ -590,6 +590,7 @@ typedef struct sem_t *h_event_start_encoding; sem_t h_event_end_encoding; sem_t h_event_start_lpf; + sem_t h_event_end_picklpf; sem_t h_event_end_lpf; #endif -- 2.40.0