From 8ba58951e9db28dccaf9adbd32eb24de28fa5e67 Mon Sep 17 00:00:00 2001 From: Yunqing Wang Date: Fri, 15 Apr 2011 12:57:15 -0400 Subject: [PATCH] Handle long delay between video frames in multi-thread decoder(issue 312) This is reported by m...@hesotech.de (see issue 312): "The decoder causes an access violation when you decode the first frame, then make a pause of about 60 seconds and then decode further frames. But only if vpx_codec_dec_cfg_t.threads> 1. This is caused by a timeout of WaitForSingleObject. When I change the definition of VPXINFINITE to INFINITE(0xFFFFFFFF), the problem is solved." Reproduced the crash and verified the changes on Windows platform. This brings the behavior inline with the other platforms using sem_wait(). Change-Id: I27b32f90bce05846ef2684b50f7a88f292299da1 --- vp8/common/threading.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/vp8/common/threading.h b/vp8/common/threading.h index 44eaf08..b7542b3 100644 --- a/vp8/common/threading.h +++ b/vp8/common/threading.h @@ -12,8 +12,6 @@ #ifndef _PTHREAD_EMULATION #define _PTHREAD_EMULATION -#define VPXINFINITE 10000 /* 10second. */ - #if CONFIG_OS_SUPPORT && CONFIG_MULTITHREAD /* Thread management macros */ @@ -28,7 +26,7 @@ #define pthread_t HANDLE #define pthread_attr_t DWORD #define pthread_create(thhandle,attr,thfunc,tharg) (int)((*thhandle=(HANDLE)_beginthreadex(NULL,0,(unsigned int (__stdcall *)(void *))thfunc,tharg,0,NULL))==NULL) -#define pthread_join(thread, result) ((WaitForSingleObject((thread),VPXINFINITE)!=WAIT_OBJECT_0) || !CloseHandle(thread)) +#define pthread_join(thread, result) ((WaitForSingleObject((thread),INFINITE)!=WAIT_OBJECT_0) || !CloseHandle(thread)) #define pthread_detach(thread) if(thread!=NULL)CloseHandle(thread) #define thread_sleep(nms) Sleep(nms) #define pthread_cancel(thread) terminate_thread(thread,0) @@ -62,7 +60,7 @@ #define sem_t HANDLE #define pause(voidpara) __asm PAUSE #define sem_init(sem, sem_attr1, sem_init_value) (int)((*sem = CreateEvent(NULL,FALSE,FALSE,NULL))==NULL) -#define sem_wait(sem) (int)(WAIT_OBJECT_0 != WaitForSingleObject(*sem,VPXINFINITE)) +#define sem_wait(sem) (int)(WAIT_OBJECT_0 != WaitForSingleObject(*sem,INFINITE)) #define sem_post(sem) SetEvent(*sem) #define sem_destroy(sem) if(*sem)((int)(CloseHandle(*sem))==TRUE) #define thread_sleep(nms) Sleep(nms) -- 2.7.4