ffplay: force video refresh if the window is resized or damaged

Signed-off-by: Marton Balint <cus@passwd.hu>
This commit is contained in:
Marton Balint 2011-10-31 20:35:19 +01:00
parent 9e2ee46206
commit dbe7170e2a

View File

@ -133,6 +133,7 @@ typedef struct VideoState {
AVInputFormat *iformat; AVInputFormat *iformat;
int no_background; int no_background;
int abort_request; int abort_request;
int force_refresh;
int paused; int paused;
int last_paused; int last_paused;
int seek_req; int seek_req;
@ -993,7 +994,7 @@ static int refresh_thread(void *opaque)
SDL_Event event; SDL_Event event;
event.type = FF_REFRESH_EVENT; event.type = FF_REFRESH_EVENT;
event.user.data1 = opaque; event.user.data1 = opaque;
if (!is->refresh) { if (!is->refresh && (!is->paused || is->force_refresh)) {
is->refresh = 1; is->refresh = 1;
SDL_PushEvent(&event); SDL_PushEvent(&event);
} }
@ -1156,6 +1157,9 @@ retry:
goto retry; goto retry;
} }
if (is->paused)
goto display;
/* compute nominal last_duration */ /* compute nominal last_duration */
last_duration = vp->pts - is->frame_last_pts; last_duration = vp->pts - is->frame_last_pts;
if (last_duration > 0 && last_duration < 10.0) { if (last_duration > 0 && last_duration < 10.0) {
@ -1234,11 +1238,13 @@ retry:
} }
} }
display:
/* display picture */ /* display picture */
if (!display_disable) if (!display_disable)
video_display(is); video_display(is);
pictq_next_picture(is); if (!is->paused)
pictq_next_picture(is);
} }
} else if (is->audio_st) { } else if (is->audio_st) {
/* draw the next audio frame */ /* draw the next audio frame */
@ -1250,6 +1256,7 @@ retry:
if (!display_disable) if (!display_disable)
video_display(is); video_display(is);
} }
is->force_refresh = 0;
if (show_status) { if (show_status) {
static int64_t last_time; static int64_t last_time;
int64_t cur_time; int64_t cur_time;
@ -2829,6 +2836,7 @@ static void event_loop(VideoState *cur_stream)
break; break;
case SDLK_f: case SDLK_f:
toggle_full_screen(cur_stream); toggle_full_screen(cur_stream);
cur_stream->force_refresh = 1;
break; break;
case SDLK_p: case SDLK_p:
case SDLK_SPACE: case SDLK_SPACE:
@ -2848,6 +2856,7 @@ static void event_loop(VideoState *cur_stream)
break; break;
case SDLK_w: case SDLK_w:
toggle_audio_display(cur_stream); toggle_audio_display(cur_stream);
cur_stream->force_refresh = 1;
break; break;
case SDLK_PAGEUP: case SDLK_PAGEUP:
incr = 600.0; incr = 600.0;
@ -2890,6 +2899,9 @@ static void event_loop(VideoState *cur_stream)
break; break;
} }
break; break;
case SDL_VIDEOEXPOSE:
cur_stream->force_refresh = 1;
break;
case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONDOWN:
if (exit_on_mousedown) { if (exit_on_mousedown) {
do_exit(cur_stream); do_exit(cur_stream);
@ -2932,6 +2944,7 @@ static void event_loop(VideoState *cur_stream)
SDL_HWSURFACE|SDL_RESIZABLE|SDL_ASYNCBLIT|SDL_HWACCEL); SDL_HWSURFACE|SDL_RESIZABLE|SDL_ASYNCBLIT|SDL_HWACCEL);
screen_width = cur_stream->width = event.resize.w; screen_width = cur_stream->width = event.resize.w;
screen_height = cur_stream->height = event.resize.h; screen_height = cur_stream->height = event.resize.h;
cur_stream->force_refresh = 1;
break; break;
case SDL_QUIT: case SDL_QUIT:
case FF_QUIT_EVENT: case FF_QUIT_EVENT: