static Bool play_pause_seek_gettime(GF_Terminal *term, const char *fn) { u32 time; const u32 target_time_in_ms = 10000; //play connected = GF_FALSE; gf_term_connect_from_time(term, fn, 0, GF_FALSE); while (!connected) gf_sleep(1); //seek to target_time_in_ms gf_term_play_from_time(term, target_time_in_ms, GF_FALSE); gf_term_set_option(term, GF_OPT_PLAY_STATE, GF_STATE_STEP_PAUSE); time = gf_term_get_time_in_ms(term); assert(time == target_time_in_ms); //seek to 0 connected = GF_FALSE; gf_term_play_from_time(term, 0, GF_FALSE); while (!connected) gf_sleep(1); time = gf_term_get_time_in_ms(term); assert(time == 0); return GF_TRUE; }
void update_state_info() { TCHAR wstate[1024]; Double FPS; u32 time, m, s; if (!show_status) return; if (last_state_time) { if (GetTickCount() > last_state_time + 200) { last_state_time = 0; reset_status = 1; } else return; } if (!term) return; if (!is_connected && reset_status) { SendMessage(g_hwnd_status, WM_SETTEXT, 0, (LPARAM) TEXT("Ready") ); reset_status = 0; return; } FPS = gf_term_get_framerate(term, 0); time = gf_term_get_time_in_ms(term) / 1000; m = time/60; s = time - m*60; if (view_cpu) { GF_SystemRTInfo rti; if (!gf_sys_get_rti(STATE_TIMER_DUR, &rti, 0)) return; wsprintf(wstate, TEXT("T %02d:%02d : FPS %02.2f : CPU %02d"), m, s, FPS, rti.total_cpu_usage); } else { wsprintf(wstate, TEXT("T %02d:%02d : FPS %02.2f"), m, s, FPS); } SendMessage(g_hwnd_status, WM_SETTEXT, 0, (LPARAM) wstate); }
static void on_gpac_rti_log(void *cbk, u32 ll, u32 lm, const char *fmt, va_list list) { if (!log_file) return; if (lm & GF_LOG_RTI) { GF_SystemRTInfo rti; if (fmt) vfprintf(log_file, fmt, list); gf_sys_get_rti(rti_update_time_ms, &rti, 0); fprintf(log_file, "% 8d\t% 8d\t% 8d\t% 4d\t% 8d\t\t", gf_sys_clock(), gf_term_get_time_in_ms(term), rti.total_cpu_usage, (u32) gf_term_get_framerate(term, 0), (u32) ( rti.gpac_memory / 1024) ); } else if (fmt && (ll>=GF_LOG_INFO)) { vfprintf(log_file, fmt, list); } }
void CMainFrame::UpdateTime() { u32 now; COsmo4 *app = GetApp(); if (!app->m_open || app->m_stoped) return; now = gf_term_get_time_in_ms(app->m_term); if (!now) return; if (app->m_can_seek && (now>=app->m_duration + 100)) { if (gf_term_get_option(app->m_term, GF_OPT_IS_FINISHED)) { if (app->m_Loop && m_full_screen) { gf_term_play_from_time(app->m_term, 0, 0); } else { OnFileStop(); if (app->m_Loop) OnFilePause(); } return; } } if (!m_full_screen) m_progBar.SetPosition(now); }
Bool Osmo4CE_EventProc(void *priv, GF_Event *event) { u32 dur; COsmo4 *app = (COsmo4 *) priv; CMainFrame *pFrame = (CMainFrame *) app->m_pMainWnd; /*shutdown*/ if (!pFrame) return 0; switch (event->type) { case GF_EVENT_MESSAGE: if (event->message.error!=GF_OK) { if (event->message.error<GF_OK) { pFrame->console_err = event->message.error; pFrame->console_message = event->message.message; pFrame->PostMessage(WM_CONSOLEMSG, 0, 0); } return 0; } if (1) return 0; /*process user message*/ pFrame->console_err = GF_OK; pFrame->console_message = event->message.message; pFrame->PostMessage(WM_CONSOLEMSG, 0, 0); break; case GF_EVENT_SIZE: break; case GF_EVENT_SCENE_SIZE: app->m_scene_width = event->size.width; app->m_scene_height = event->size.height; if (!pFrame->m_full_screen) pFrame->PostMessage(WM_SETSIZE, event->size.width, event->size.height); break; case GF_EVENT_CONNECT: app->m_open = event->connect.is_connected; break; case GF_EVENT_DURATION: dur = (u32) (1000 * event->duration.duration); if (dur<2000) dur = 0; app->m_duration = dur; app->m_can_seek = event->duration.can_seek && dur; pFrame->m_progBar.m_range_invalidated = 1; /*by default, don't display timing if not seekable and vice-versa*/ if (app->m_can_seek != pFrame->m_view_timing) { pFrame->m_view_timing = app->m_can_seek; if (!pFrame->m_full_screen) pFrame->PostMessage(WM_SETSIZE, 0, 0); } break; case GF_EVENT_NAVIGATE: /*store URL since it may be destroyed, and post message*/ app->m_navigate_url = event->navigate.to_url; pFrame->PostMessage(WM_NAVIGATE, NULL, NULL); return 1; case GF_EVENT_QUIT: pFrame->PostMessage(WM_CLOSE, 0L, 0L); break; /*ipaq keys*/ case GF_EVENT_KEYDOWN: switch (event->key.key_code) { case GF_KEY_F1: pFrame->PostMessage(WM_COMMAND, ID_FILE_OPEN); break; case GF_KEY_F2: pFrame->PostMessage(WM_QUIT); break; case GF_KEY_F3: pFrame->PostMessage(WM_COMMAND, ID_FILE_RESTART); break; case GF_KEY_F5: pFrame->PostMessage(WM_COMMAND, ID_VIEW_FULLSCREEN); break; case GF_KEY_ENTER: pFrame->PostMessage(WM_COMMAND, ID_FILE_PAUSE); break; case GF_KEY_LEFT: if (app->m_duration>=2000) { s32 res = gf_term_get_time_in_ms(app->m_term) - 5*app->m_duration/100; if (res<0) res=0; gf_term_play_from_time(app->m_term, res, 0); } break; case GF_KEY_RIGHT: if (app->m_duration>=2000) { u32 res = gf_term_get_time_in_ms(app->m_term) + 5*app->m_duration/100; if (res>=app->m_duration) res = 0; gf_term_play_from_time(app->m_term, res, 0); } break; case GF_KEY_UP: if (app->m_duration>=2000) pFrame->PostMessage(WM_COMMAND, ID_FILE_STEP); break; case GF_KEY_DOWN: gf_term_set_option(app->m_term, GF_OPT_REFRESH, 0); break; } break; case GF_EVENT_MOUSEDOUBLECLICK: pFrame->PostMessage(WM_COMMAND, ID_VIEW_FULLSCREEN); return 0; } return 0; }
Bool Osmo4_EventProc(void *priv, GF_Event *evt) { u32 dur; Osmo4 *gpac = (Osmo4 *) priv; CMainFrame *pFrame = (CMainFrame *) gpac->m_pMainWnd; /*shutdown*/ if (!pFrame) return GF_FALSE; CT2A url_ch(pFrame->m_pPlayList->GetURL()); switch (evt->type) { case GF_EVENT_DURATION: dur = (u32) (1000 * evt->duration.duration); if (dur){ pFrame->SetPlayLayout(); } //if (dur<1100) dur = 0; pFrame->m_pPlayList->SetDuration((u32) evt->duration.duration ); gpac->max_duration = dur; gpac->can_seek = evt->duration.can_seek; if (!gpac->can_seek) { pFrame->m_Sliders.m_PosSlider.EnableWindow(FALSE); } else { pFrame->m_Sliders.m_PosSlider.EnableWindow(TRUE); pFrame->m_Sliders.m_PosSlider.SetRangeMin(0); pFrame->m_Sliders.m_PosSlider.SetRangeMax(dur); } break; case GF_EVENT_MESSAGE: if (!evt->message.service || !strcmp(evt->message.service, (LPCSTR)url_ch)) { pFrame->console_service = "main service"; } else { pFrame->console_service = evt->message.service; } if (evt->message.error!=GF_OK) { if (evt->message.error<GF_OK || !gpac->m_NoConsole) { pFrame->console_err = evt->message.error; pFrame->console_message = evt->message.message; gpac->m_pMainWnd->PostMessage(WM_CONSOLEMSG, 0, 0); /*any error before connection confirm is a service connection error*/ if (!gpac->m_isopen) pFrame->m_pPlayList->SetDead(); } return GF_FALSE; } if (gpac->m_NoConsole) return GF_FALSE; /*process user message*/ pFrame->console_err = GF_OK; pFrame->console_message = evt->message.message; gpac->m_pMainWnd->PostMessage(WM_CONSOLEMSG, 0, 0); break; case GF_EVENT_PROGRESS: char *szType; if (evt->progress.progress_type==0) szType = "Buffer "; else if (evt->progress.progress_type==1) szType = "Download "; else if (evt->progress.progress_type==2) szType = "Import "; gf_set_progress(szType, evt->progress.done, evt->progress.total); break; case GF_EVENT_NAVIGATE_INFO: pFrame->console_message = evt->navigate.to_url; gpac->m_pMainWnd->PostMessage(WM_CONSOLEMSG, 1000, 0); break; case GF_EVENT_SCENE_SIZE: if (evt->size.width && evt->size.height) { gpac->orig_width = evt->size.width; gpac->orig_height = evt->size.height; if (gpac->m_term && !pFrame->m_bFullScreen) pFrame->PostMessage(WM_SETSIZE, evt->size.width, evt->size.height); } break; /*don't resize on win32 msg notif*/ #if 0 case GF_EVENT_SIZE: if (/*gpac->m_term && !pFrame->m_bFullScreen && */gpac->orig_width && (evt->size.width < W32_MIN_WIDTH) ) pFrame->PostMessage(WM_SETSIZE, W32_MIN_WIDTH, (W32_MIN_WIDTH*gpac->orig_height) / gpac->orig_width); else pFrame->PostMessage(WM_SETSIZE, evt->size.width, evt->size.height); break; #endif case GF_EVENT_CONNECT: // if (pFrame->m_bStartupFile) return 0; // Maja commented out buildstream list since menu item discarded //pFrame->BuildStreamList(GF_TRUE); if (evt->connect.is_connected) { //pFrame->BuildChapterList(GF_FALSE); gpac->m_isopen = GF_TRUE; //resetting sliders when opening a new file creates a deadlock on the window thread which is disconnecting // Maja changed: must change when change toolbar //pFrame->m_wndToolBar.SetButtonInfo(5, ID_FILE_PLAY, TBBS_BUTTON, gpac->m_isopen ? 4 : 3); //pFrame->m_wndToolBar.SetButtonInfo(2, ID_FILE_PLAY, TBBS_BUTTON, gpac->m_isopen ? 4 : 3); pFrame->m_Sliders.m_PosSlider.SetPos(0); pFrame->SetProgTimer(GF_TRUE); } else { gpac->max_duration = 0; gpac->m_isopen = GF_FALSE; //pFrame->BuildChapterList(GF_TRUE); } if (!pFrame->m_bFullScreen) { pFrame->SetFocus(); pFrame->SetForegroundWindow(); } break; case GF_EVENT_QUIT: pFrame->PostMessage(WM_CLOSE, 0L, 0L); break; case GF_EVENT_MIGRATE: { } break; case GF_EVENT_KEYDOWN: gf_term_process_shortcut(gpac->m_term, evt); /*update volume control*/ pFrame->m_Sliders.SetVolume(); switch (evt->key.key_code) { case GF_KEY_HOME: gf_term_set_option(gpac->m_term, GF_OPT_NAVIGATION_TYPE, 1); break; case GF_KEY_ESCAPE: pFrame->PostMessage(WM_COMMAND, ID_VIEW_FULLSCREEN); break; case GF_KEY_MEDIANEXTTRACK: pFrame->m_pPlayList->PlayNext(); break; case GF_KEY_MEDIAPREVIOUSTRACK: pFrame->m_pPlayList->PlayPrev(); break; case GF_KEY_H: if ((evt->key.flags & GF_KEY_MOD_CTRL) && gpac->m_isopen) gf_term_switch_quality(gpac->m_term, GF_TRUE); break; case GF_KEY_L: if ((evt->key.flags & GF_KEY_MOD_CTRL) && gpac->m_isopen) gf_term_switch_quality(gpac->m_term, GF_FALSE); break; case GF_KEY_LEFT: case GF_KEY_RIGHT: if (gpac->m_isopen && (gf_term_get_option(gpac->m_term, GF_OPT_NAVIGATION) == GF_NAVIGATE_NONE)) { if (evt->key.flags & GF_KEY_MOD_CTRL) { if (evt->key.key_code==GF_KEY_LEFT) pFrame->m_pPlayList->PlayPrev(); else if (evt->key.key_code==GF_KEY_RIGHT) pFrame->m_pPlayList->PlayNext(); } else if (gpac->can_seek && (evt->key.flags & GF_KEY_MOD_ALT)) { u32 duration = gpac->max_duration; s32 current_time = gf_term_get_time_in_ms(gpac->m_term); if (evt->key.key_code==GF_KEY_LEFT) { current_time -= 5*duration/100; if (current_time<0) current_time=0; gf_term_play_from_time(gpac->m_term, (u64) current_time, 0); } else if (evt->key.key_code==GF_KEY_RIGHT) { current_time += 5*duration/100; if ((u32) current_time < duration) { gf_term_play_from_time(gpac->m_term, (u64) current_time, 0); } } } } break; } break; case GF_EVENT_NAVIGATE: /*fixme - a proper browser would require checking mime type & co*/ /*store URL since it may be destroyed, and post message*/ gpac->m_navigate_url = evt->navigate.to_url; pFrame->PostMessage(WM_NAVIGATE, NULL, NULL); return GF_TRUE; case GF_EVENT_VIEWPOINTS: pFrame->BuildViewList(); return GF_FALSE; case GF_EVENT_STREAMLIST: //pFrame->BuildStreamList(GF_FALSE); return GF_FALSE; case GF_EVENT_SET_CAPTION: pFrame->SetWindowText(CString(evt->caption.caption)); break; case GF_EVENT_DBLCLICK: pFrame->PostMessage(WM_COMMAND, ID_VIEW_FULLSCREEN); return GF_FALSE; case GF_EVENT_AUTHORIZATION: { UserPassDialog passdlg; return passdlg.GetPassword(CString(evt->auth.site_url), CString(evt->auth.user), evt->auth.password); } } return GF_FALSE; }