void seek_to(long long seek_offset) { long long offset; if (video_functions->seek == NULL) { fprintf(stderr, "cannot seek on this video!\n"); return; } if (video_write_thread) { pthread_kill(video_write_thread, SIGURG); } if (audio_write_thread) { pthread_kill(audio_write_thread, SIGURG); } if (mvpw_visible(ffwd_widget)) { mvpw_hide(ffwd_widget); av_ffwd(); } offset = video_functions->seek(seek_offset, SEEK_SET); jump_target = seek_offset; jumping = 1; PRINTF("-> %lld\n", offset); pthread_cond_broadcast(&video_cond); }
void video_subtitle_check(mvp_widget_t *widget) { extern mvp_widget_t *main_menu; if (demux_spu_get_id(handle) >= 0) mvpw_set_timer(root, video_subtitle_display, 250); else mvpw_set_timer(root, video_subtitle_check, 1000); if (gui_state == MVPMC_STATE_EMULATE ) { return; } if (! (mvpw_visible(file_browser) || mvpw_visible(playlist_widget) || mvpw_visible(mythtv_browser) || mvpw_visible(main_menu) || mvpw_visible(settings) || mvpw_visible(ct_text_box) || mvpw_visible(mythtv_menu))) { if(showing_guide == 0) { video_thumbnail(AV_THUMBNAIL_OFF,0); } } }
void fb_exit(void) { audio_stop = 1; audio_clear(); pthread_kill(audio_thread, SIGURG); if (current) { free(current); current = NULL; } mvpw_hide(fb_progress); video_clear(); av_stop(); if (!mvpw_visible(playlist_widget)) playlist_clear(); }
void mvpw_show(mvp_widget_t *widget) { mvp_widget_t *top; if (widget) { if ((widget->type == MVPW_DIALOG) && widget->data.dialog.modal) { top = mvpw_get_focus(); GrMapWindow(widget->wid); raise_widget(widget, top); if (!mvpw_visible((mvp_widget_t*)screensaver_widget)) GrRaiseWindow(widget->wid); mvpw_focus(widget); } else { GrMapWindow(widget->wid); if(widget->show) (*widget->show)(widget, 1); } } }
void video_callback(mvp_widget_t *widget, char key) { int jump; long long offset, size; pts_sync_data_t async, vsync; av_state_t state; /* printf("**SSDEBUG: In video_callback and got key %d \n",key); */ if (!video_playing) return; if(showing_guide) { if(mvp_tvguide_callback(widget, key) == 1) return; } if ( video_functions->key != NULL ) { if ( video_functions->key(key) == 1 ) { return; } } switch (key) { case MVPW_KEY_GO: case MVPW_KEY_GUIDE: if(showing_guide == 0 && showing_guide == 0) { printf("In %s showing guide %d \n",__FUNCTION__, key); showing_guide = 1; mvp_tvguide_video_topright(1); mvp_tvguide_show(mythtv_livetv_program_list, mythtv_livetv_description, mythtv_livetv_clock); break; } /* if the guide button is pressed while guide is active fall through to go back to remove guide and return to TV */ case MVPW_KEY_TV: if(showing_guide == 1) { printf("In %s hiding guide %d \n", __FUNCTION__, key); showing_guide = 0; mvp_tvguide_video_topright(0); mvp_tvguide_hide(mythtv_livetv_program_list, mythtv_livetv_description, mythtv_livetv_clock); } break; case MVPW_KEY_STOP: case MVPW_KEY_EXIT: back_to_guide_menu(); new_live_tv = 0; break; case MVPW_KEY_PAUSE: if (av_pause()) { mvpw_show(pause_widget); mvpw_hide(ffwd_widget); paused = 1; if (pause_osd && !display_on && (display_on_alt < 2)) { display_on_alt = 2; enable_osd(); } screensaver_enable(); } else { if (pause_osd && !display_on && (display_on_alt == 2)) { display_on_alt = 0; disable_osd(); mvpw_expose(root); } av_get_state(&state); if (state.mute) mvpw_show(mute_widget); else mvpw_hide(mute_widget); mvpw_hide(pause_widget); paused = 0; screensaver_disable(); } break; case MVPW_KEY_PLAY: if ( paused ) { /* * play key can be used to un-pause */ av_pause(); if (pause_osd && !display_on && (display_on_alt == 2)) { display_on_alt = 0; disable_osd(); mvpw_expose(root); } mvpw_hide(pause_widget); mvpw_hide(mute_widget); paused = 0; screensaver_disable(); } break; case MVPW_KEY_REPLAY: seek_by(-30); timed_osd(seek_osd_timeout*1000); break; case MVPW_KEY_REWIND: seek_by(-10); timed_osd(seek_osd_timeout*1000); break; case MVPW_KEY_SKIP: if (mythtv_seek_amount == 0 ) { seek_by(30); } else if (mythtv_seek_amount == 1 ) { seek_by(60); } else { seek_by(30); } timed_osd(seek_osd_timeout*1000); break; case MVPW_KEY_FFWD: if (av_ffwd() == 0) { demux_flush(handle); demux_seek(handle); av_get_state(&state); av_stop(); av_reset(); if (state.mute) { av_set_mute(1); } av_play(); mvpw_hide(ffwd_widget); } else { av_get_state(&state); mvpw_show(ffwd_widget); mvpw_hide(pause_widget); screensaver_disable(); } timed_osd(seek_osd_timeout*1000); break; case MVPW_KEY_LEFT: if (video_functions->seek) { size = video_functions->size(); jump_target = -1; jumping = 1; if (video_write_thread) { pthread_kill(video_write_thread, SIGURG); } if (audio_write_thread) { pthread_kill(audio_write_thread, SIGURG); } offset = video_functions->seek(0, SEEK_CUR); jump_target = ((-size / 100.0) + offset); pthread_cond_broadcast(&video_cond); } break; case MVPW_KEY_RIGHT: if (video_functions->seek) { size = video_functions->size(); jump_target = -1; jumping = 1; if (video_write_thread) { pthread_kill(video_write_thread, SIGURG); } if (audio_write_thread) { pthread_kill(audio_write_thread, SIGURG); } offset = video_functions->seek(0, SEEK_CUR); jump_target = ((size / 100.0) + offset); pthread_cond_broadcast(&video_cond); timed_osd(seek_osd_timeout*1000); } break; case MVPW_KEY_ZERO ... MVPW_KEY_NINE: if(new_live_tv) { printf("In %s showing guide %d \n",__FUNCTION__, key); showing_guide = 1; mvp_tvguide_video_topright(1); mvp_tvguide_show(mythtv_livetv_program_list, mythtv_livetv_description, mythtv_livetv_clock); mvp_tvguide_callback(widget, key); } else if (mythtv_livetv) { back_to_guide_menu(); mythtv_key_callback(mythtv_browser, key); } else { size = video_functions->size(); jump_target = -1; jumping = 1; if (video_write_thread) { pthread_kill(video_write_thread, SIGURG); } if (audio_write_thread) { pthread_kill(audio_write_thread, SIGURG); } jump = key; jump_target = size * (jump / 10.0); pthread_cond_broadcast(&video_cond); timed_osd(seek_osd_timeout*1000); } break; case MVPW_KEY_MENU: mvpw_show(popup_menu); mvpw_focus(popup_menu); break; case MVPW_KEY_MUTE: if (mvpw_visible(ffwd_widget)) { mvpw_hide(mute_widget); break; } if (av_mute() == 1) { mvpw_show(mute_widget); } else { mvpw_hide(mute_widget); } break; case MVPW_KEY_BLANK: case MVPW_KEY_OK: if (display_on || display_on_alt) { disable_osd(); mvpw_expose(root); display_on = 1; display_on_alt = 0; } else { enable_osd(); } display_on = !display_on; break; case MVPW_KEY_FULL: case MVPW_KEY_PREV_CHAN: if(IS_4x3(av_get_tv_aspect())) { if(av_get_tv_aspect() == AV_TV_ASPECT_4x3_CCO) av_set_tv_aspect(AV_TV_ASPECT_4x3); else av_set_tv_aspect(AV_TV_ASPECT_4x3_CCO); } break; case MVPW_KEY_CHAN_UP: case MVPW_KEY_UP: if (mythtv_livetv) mythtv_channel_up(); break; case MVPW_KEY_CHAN_DOWN: case MVPW_KEY_DOWN: if (mythtv_livetv) mythtv_channel_down(); break; case MVPW_KEY_RECORD: /* * XXX: This is a temporary hack until we figure out how * to tell when the audio and video are out of sync, * and correct it automatically. */ av_get_audio_sync(&async); av_get_video_sync(&vsync); printf("PRE SYNC: a 0x%"PRIx64" 0x%"PRIx64" v 0x%"PRIx64" 0x%"PRIx64"\n", async.stc, async.pts, vsync.stc, vsync.pts); av_delay_video(1000); av_get_audio_sync(&async); av_get_video_sync(&vsync); printf("POST SYNC: a 0x%"PRIx64" 0x%"PRIx64" v 0x%"PRIx64" 0x%"PRIx64"\n", async.stc, async.pts, vsync.stc, vsync.pts); break; case MVPW_KEY_VOL_UP: case MVPW_KEY_VOL_DOWN: volume_key_callback(volume_dialog, key); mvpw_show(volume_dialog); mvpw_set_timer(volume_dialog, timer_hide, 3000); break; default: PRINTF("button %d\n", key); break; } }
void back_to_guide_menu() { disable_osd(); if ( !running_replaytv ) { video_thumbnail(AV_THUMBNAIL_EIGTH,VID_THUMB_BOTTOM_RIGHT); } if (spu_widget) { mvpw_hide(spu_widget); mvpw_expose(root); mvpw_destroy(spu_widget); spu_widget = NULL; mvpw_set_timer(root, NULL, 0); } mvpw_hide(osd_widget); mvpw_hide(mute_widget); mvpw_hide(pause_widget); mvpw_hide(ffwd_widget); mvpw_hide(zoom_widget); display_on = 0; zoomed = 0; switch (gui_state) { case MVPMC_STATE_NONE: case MVPMC_STATE_EMULATE: case MVPMC_STATE_EMULATE_SHUTDOWN: case MVPMC_STATE_WEATHER: /* * XXX: redisplay the main menu? */ break; case MVPMC_STATE_MYTHTV: case MVPMC_STATE_MYTHTV_SHUTDOWN: printf("%s(): %d\n", __FUNCTION__, __LINE__); if (mythtv_livetv == 1) { if (mythtv_state == MYTHTV_STATE_LIVETV) { if (mvpw_visible(mythtv_browser) || new_live_tv) { mythtv_livetv_stop(); mythtv_livetv = 0; running_mythtv = 0; if(new_live_tv) { switch_gui_state(MVPMC_STATE_MYTHTV); mvpw_show(mythtv_logo); mvpw_show(mythtv_menu); mvpw_focus(mythtv_menu); } } else { mvpw_show(mythtv_channel); mvpw_show(mythtv_date); mvpw_show(mythtv_description); mvpw_show(mythtv_logo); mvpw_show(mythtv_browser); mvpw_focus(mythtv_browser); video_thumbnail(AV_THUMBNAIL_EIGTH,VID_THUMB_BOTTOM_RIGHT); } } else if (mythtv_state == MYTHTV_STATE_MAIN) { mvpw_show(mythtv_logo); mvpw_show(mythtv_menu); } else { mythtv_show_widgets(); } } else if (mythtv_main_menu) { mvpw_show(mythtv_logo); mvpw_show(mythtv_menu); mvpw_focus(mythtv_menu); } else if (running_mythtv) { printf("%s(): %d\n", __FUNCTION__, __LINE__); mythtv_show_widgets(); mvpw_focus(mythtv_browser); } break; case MVPMC_STATE_REPLAYTV: case MVPMC_STATE_REPLAYTV_SHUTDOWN: video_playing = 0; replaytv_back_from_video(); break; case MVPMC_STATE_FILEBROWSER: case MVPMC_STATE_FILEBROWSER_SHUTDOWN: case MVPMC_STATE_HTTP: case MVPMC_STATE_HTTP_SHUTDOWN: if (playlist) { mvpw_show(fb_progress); mvpw_show(playlist_widget); mvpw_focus(playlist_widget); } else { mvpw_show(fb_progress); mvpw_show(file_browser); mvpw_focus(file_browser); } break; case MVPMC_STATE_MCLIENT: case MVPMC_STATE_MCLIENT_SHUTDOWN: /* * No code is necessary here because: * - The key is already trapped / processed in gui.c/mclient_key_callback. * - And the mclient show / focus is in gui.c/main_select_callback. */ break; } mvpw_expose(root); }
static void seek_by(int seconds) { demux_attr_t *attr = demux_get_attr(handle); int delta; int stc_time, gop_time, pts_time; long long offset, size; if (video_functions->seek == NULL) { fprintf(stderr, "cannot seek on this video!\n"); return; } if (video_write_thread) { pthread_kill(video_write_thread, SIGURG); } if (audio_write_thread) { pthread_kill(audio_write_thread, SIGURG); } if (mvpw_visible(ffwd_widget)) { mvpw_hide(ffwd_widget); av_ffwd(); } gop_seek_attempts = 0; pts_seek_attempts = 0; av_current_stc(&seek_stc); seek_Bps = ((1024*1024) * 4) / 8; /* default to 4 megabits per second */ gop_time = 0; if ( attr->gop_valid ) { gop_time = (attr->gop.hour*60 + attr->gop.minute)*60 + attr->gop.second; if (attr->Bps) seek_Bps = attr->Bps; } pts_time = attr->gop.pts/PTS_HZ; stc_time = (seek_stc.hour*60 + seek_stc.minute)*60 + seek_stc.second; /* * If the STC and GOP timestamps are close, use the STC timestamp as * the starting point, because it is the timestamp for the frame the * hardware is currently playing. If GOP time not set use STC anyway. */ if (abs(gop_time - stc_time) < 10) { printf("STC SEEK from: %d, (%d)\n", stc_time, gop_time); seek_start_seconds = stc_time; gop_seek_attempts = 4; } else if (gop_time) { printf("GOP SEEK from: %d, (%d)\n", gop_time, pts_time); seek_start_seconds = gop_time; gop_seek_attempts = 4; } else { printf("PTS SEEK from: %d, (%d)\n", pts_time, gop_time); seek_start_seconds = pts_time; pts_seek_attempts = 4; } seek_start_pos = video_functions->seek(0, SEEK_CUR); size = video_functions->size(); seek_seconds = seek_start_seconds + seconds; /* The mvpmc hardware can only handle 12Mbps and some off-air DVB/ATSC * SD broadcasts appear to some way result in huge (200+Mbps) values * to appear in the seeks and cause 30 seconds seeks to go for a lot * longer */ if ( seek_Bps > (12/8)*1024*1024) { printf("Calculated Seek Bps was %d kbps, which is too high " \ "- set to 4Mbps\n",8*seek_Bps/1024); seek_Bps = (4/8) * 1024 * 1024; } delta = seek_Bps * seconds; /* * Abort the seek if near the end of the file */ if ((size < 0) || (seek_start_pos + delta > size)) { fprintf(stderr, "near end of file, seek aborted\n"); return; } PRINTF("%d Bps, currently %lld + %d\n", seek_Bps, seek_start_pos, delta); gettimeofday((struct timeval*)&seek_timeval, NULL); seek_attempts = 16; seeking = 1; offset = video_functions->seek(delta, SEEK_CUR); PRINTF("-> %lld\n", offset); pthread_cond_broadcast(&video_cond); }