Merge remote-tracking branch 'cus/stable'

* cus/stable:
  ffplay: set default window size before starting audio
  ffplay: factor out function setting default window size
  ffplay: remove no longer necessary codec flush
  ffplay: do not wait for flushing the picture queue on flush packet

Merged-by: Michael Niedermayer <michaelni@gmx.at>
pull/48/merge
Michael Niedermayer 11 years ago
commit c6959918f6
  1. 37
      ffplay.c

@ -1066,20 +1066,24 @@ static void sigterm_handler(int sig)
exit(123); exit(123);
} }
static void set_default_window_size(VideoPicture *vp)
{
SDL_Rect rect;
calculate_display_rect(&rect, 0, 0, INT_MAX, vp->height, vp);
default_width = rect.w;
default_height = rect.h;
}
static int video_open(VideoState *is, int force_set_video_mode, VideoPicture *vp) static int video_open(VideoState *is, int force_set_video_mode, VideoPicture *vp)
{ {
int flags = SDL_HWSURFACE | SDL_ASYNCBLIT | SDL_HWACCEL; int flags = SDL_HWSURFACE | SDL_ASYNCBLIT | SDL_HWACCEL;
int w,h; int w,h;
SDL_Rect rect;
if (is_full_screen) flags |= SDL_FULLSCREEN; if (is_full_screen) flags |= SDL_FULLSCREEN;
else flags |= SDL_RESIZABLE; else flags |= SDL_RESIZABLE;
if (vp && vp->width) { if (vp && vp->width)
calculate_display_rect(&rect, 0, 0, INT_MAX, vp->height, vp); set_default_window_size(vp);
default_width = rect.w;
default_height = rect.h;
}
if (is_full_screen && fs_screen_width) { if (is_full_screen && fs_screen_width) {
w = fs_screen_width; w = fs_screen_width;
@ -1376,10 +1380,14 @@ retry:
if (vp->serial != is->videoq.serial) { if (vp->serial != is->videoq.serial) {
pictq_next_picture(is); pictq_next_picture(is);
is->video_current_pos = -1;
redisplay = 0; redisplay = 0;
goto retry; goto retry;
} }
if (lastvp->serial != vp->serial && !redisplay)
is->frame_timer = av_gettime() / 1000000.0;
if (is->paused) if (is->paused)
goto display; goto display;
@ -1670,15 +1678,6 @@ static int get_video_frame(VideoState *is, AVFrame *frame, AVPacket *pkt, int *s
if (pkt->data == flush_pkt.data) { if (pkt->data == flush_pkt.data) {
avcodec_flush_buffers(is->video_st->codec); avcodec_flush_buffers(is->video_st->codec);
SDL_LockMutex(is->pictq_mutex);
// Make sure there are no long delay timers (ideally we should just flush the queue but that's harder)
while (is->pictq_size && !is->videoq.abort_request) {
SDL_CondWait(is->pictq_cond, is->pictq_mutex);
}
is->video_current_pos = -1;
is->frame_timer = (double)av_gettime() / 1000000.0;
SDL_UnlockMutex(is->pictq_mutex);
return 0; return 0;
} }
@ -1995,7 +1994,6 @@ static int video_thread(void *arg)
goto the_end; goto the_end;
} }
the_end: the_end:
avcodec_flush_buffers(is->video_st->codec);
#if CONFIG_AVFILTER #if CONFIG_AVFILTER
avfilter_graph_free(&graph); avfilter_graph_free(&graph);
#endif #endif
@ -2820,6 +2818,13 @@ static int read_thread(void *arg)
} }
is->show_mode = show_mode; is->show_mode = show_mode;
if (st_index[AVMEDIA_TYPE_VIDEO] >= 0) {
AVStream *st = ic->streams[st_index[AVMEDIA_TYPE_VIDEO]];
AVCodecContext *avctx = st->codec;
VideoPicture vp = {.width = avctx->width, .height = avctx->height, .sar = av_guess_sample_aspect_ratio(ic, st, NULL)};
if (vp.width)
set_default_window_size(&vp);
}
/* open the streams */ /* open the streams */
if (st_index[AVMEDIA_TYPE_AUDIO] >= 0) { if (st_index[AVMEDIA_TYPE_AUDIO] >= 0) {

Loading…
Cancel
Save