Окно не отвечает при рендеринге изображения с использованием OpenGL ES
Я реализую Windows Media Player, есть несколько соответствующих потоков, чтобы сделать разные вещи:
- один поток для чтения видео и аудио данных.
- три потока для декодирования видео, аудио и субтитров отдельно.
- один поток для рендеринга картинок и один поток для воспроизведения аудио.
- один поток, чтобы получить несколько сообщений о состоянии
Я создаю окно следующим образом:
int main(int argc,char *argv[])
{
ijkmp_global_init();
ijkmp_global_set_inject_callback(inject_callback);
IjkMediaPlayer *mp = ijkmp_windows_create(&message_loop);
ijkmp_set_option_int(mp,4,"opensles",0);
ijkmp_set_option(mp,4,"overlay-format","fcc-_es2");
ijkmp_set_option_int(mp,4,"framedrop",1);
ijkmp_set_option_int(mp,4,"start-on-prepared",0);
ijkmp_set_inject_opaque(mp, NULL);
ijkmp_set_ijkio_inject_opaque(mp, NULL);
ijkmp_set_option_int(mp,1,"http-detect-range-support",0);
/* HINSTANCE instance = GetModuleHandle(NULL);
HWND hwnd = CreateWindow("ijkplayer", TEXT(""), WS_SIZEBOX,0, 0, 500, 500, NULL, NULL,
instance, NULL);
if(hwnd==NULL)
{
printf("error,the hwnd is null %d\n",GetLastError());
return -1;
}*/
HWND hwnd = CreateWindowNative(320,240);
SDL_VoutWindows_SetWindowsSurface(mp->ffplayer->vout, hwnd);
ijkmp_set_data_source(mp,argv[1]);
ijkmp_prepare_async(mp);
SDL_WaitThread(mp->msg_thread,NULL);
}
Как вы видите, работа по созданию окна выполняется в основном потоке, и я передаю обработчик окна потоку рендеринга для рендеринга. Но когда работа по созданию окна завершена, я должен ждать завершения воспроизведения видео. Поэтому я использую SDL_WaitThread, чтобы присоединиться к потоку msg. реализация SDL_WaitThread выглядит следующим образом:
void SDL_WaitThread(SDL_Thread *thread, int *status)
{
assert(thread);
if (!thread)
return;
pthread_join(thread->id, NULL);
if (status)
*status = thread->retval;
}
Я знаю, что некоторые проблемы могут существовать таким образом. В результате видеокартины всегда рендерится, но окно не отвечает...
Как решить эту проблему?