Esempio n. 1
0
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);
}
Esempio n. 2
0
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);
		}
	} 
}
Esempio n. 3
0
File: fb.c Progetto: gettler/mvpmc
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();
}
Esempio n. 4
0
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);
		}
	}
}
Esempio n. 5
0
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;
	}
}
Esempio n. 6
0
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);
}
Esempio n. 7
0
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);
}