X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=ffplay.c;h=f48807a60692f8a4ac92ba60901da33f8ba141c6;hb=7432bcfe5a36331502c49fe03aefe39b9936247a;hp=93097e1ee7cfd5bd5c9645f6b265c9024397968a;hpb=268098d8b2a6e3dd84be788a2cd6fda10f7b3e71;p=ffmpeg diff --git a/ffplay.c b/ffplay.c index 93097e1ee7c..f48807a6069 100644 --- a/ffplay.c +++ b/ffplay.c @@ -64,7 +64,6 @@ const char program_name[] = "ffplay"; const int program_birth_year = 2003; #define MAX_QUEUE_SIZE (15 * 1024 * 1024) -#define MIN_AUDIOQ_SIZE (20 * 16 * 1024) #define MIN_FRAMES 5 /* SDL audio buffer size, in samples. Should be small to have precise @@ -133,6 +132,7 @@ typedef struct VideoState { AVInputFormat *iformat; int no_background; int abort_request; + int force_refresh; int paused; int last_paused; int seek_req; @@ -867,7 +867,8 @@ static void video_audio_display(VideoState *s) } } SDL_UpdateRect(screen, s->xpos, s->ytop, 1, s->height); - s->xpos++; + if (!s->paused) + s->xpos++; if (s->xpos >= s->width) s->xpos= s->xleft; } @@ -993,7 +994,7 @@ static int refresh_thread(void *opaque) SDL_Event event; event.type = FF_REFRESH_EVENT; event.user.data1 = opaque; - if (!is->refresh) { + if (!is->refresh && (!is->paused || is->force_refresh)) { is->refresh = 1; SDL_PushEvent(&event); } @@ -1156,6 +1157,9 @@ retry: goto retry; } + if (is->paused) + goto display; + /* compute nominal last_duration */ last_duration = vp->pts - is->frame_last_pts; if (last_duration > 0 && last_duration < 10.0) { @@ -1234,11 +1238,13 @@ retry: } } +display: /* display picture */ if (!display_disable) video_display(is); - pictq_next_picture(is); + if (!is->paused) + pictq_next_picture(is); } } else if (is->audio_st) { /* draw the next audio frame */ @@ -1250,6 +1256,7 @@ retry: if (!display_disable) video_display(is); } + is->force_refresh = 0; if (show_status) { static int64_t last_time; int64_t cur_time; @@ -1409,7 +1416,7 @@ static int queue_picture(VideoState *is, AVFrame *src_frame, double pts1, int64_ /* if the frame is not skipped, then display it */ if (vp->bmp) { - AVPicture pict; + AVPicture pict = { { 0 } }; #if CONFIG_AVFILTER if (vp->picref) avfilter_unref_buffer(vp->picref); @@ -1419,7 +1426,6 @@ static int queue_picture(VideoState *is, AVFrame *src_frame, double pts1, int64_ /* get a pointer on the bitmap */ SDL_LockYUVOverlay (vp->bmp); - memset(&pict, 0, sizeof(AVPicture)); pict.data[0] = vp->bmp->pixels[0]; pict.data[1] = vp->bmp->pixels[2]; pict.data[2] = vp->bmp->pixels[1]; @@ -1673,7 +1679,7 @@ static int input_request_frame(AVFilterLink *link) } else { picref = avfilter_get_video_buffer(link, AV_PERM_WRITE, link->w, link->h); av_image_copy(picref->data, picref->linesize, - priv->frame->data, priv->frame->linesize, + (const uint8_t **)(void **)priv->frame->data, priv->frame->linesize, picref->format, link->w, link->h); } av_free_packet(&pkt); @@ -1838,7 +1844,7 @@ static int video_thread(void *arg) frame->opaque = picref; } - if (av_cmp_q(tb, is->video_st->time_base)) { + if (ret >= 0 && av_cmp_q(tb, is->video_st->time_base)) { av_unused int64_t pts1 = pts_int; pts_int = av_rescale_q(pts_int, tb, is->video_st->time_base); av_dlog(NULL, "video_thread(): " @@ -1876,6 +1882,7 @@ static int video_thread(void *arg) } the_end: #if CONFIG_AVFILTER + av_freep(&vfilters); avfilter_graph_free(&graph); #endif av_free(frame); @@ -2246,6 +2253,7 @@ static int stream_component_open(VideoState *is, int stream_index) avctx->flags |= CODEC_FLAG_EMU_EDGE; if (avctx->codec_type == AVMEDIA_TYPE_AUDIO) { + memset(&is->audio_pkt_temp, 0, sizeof(is->audio_pkt_temp)); env = SDL_getenv("SDL_AUDIO_CHANNELS"); if (env) wanted_channel_layout = av_get_default_channel_layout(SDL_atoi(env)); @@ -2604,7 +2612,7 @@ static int read_thread(void *arg) /* if the queue are full, no need to read more */ if ( is->audioq.size + is->videoq.size + is->subtitleq.size > MAX_QUEUE_SIZE - || ( (is->audioq .size > MIN_AUDIOQ_SIZE || is->audio_stream < 0) + || ( (is->audioq .nb_packets > MIN_FRAMES || is->audio_stream < 0) && (is->videoq .nb_packets > MIN_FRAMES || is->video_stream < 0) && (is->subtitleq.nb_packets > MIN_FRAMES || is->subtitle_stream < 0))) { /* wait 10 ms */ @@ -2829,6 +2837,7 @@ static void event_loop(VideoState *cur_stream) break; case SDLK_f: toggle_full_screen(cur_stream); + cur_stream->force_refresh = 1; break; case SDLK_p: case SDLK_SPACE: @@ -2848,6 +2857,7 @@ static void event_loop(VideoState *cur_stream) break; case SDLK_w: toggle_audio_display(cur_stream); + cur_stream->force_refresh = 1; break; case SDLK_PAGEUP: incr = 600.0; @@ -2890,6 +2900,9 @@ static void event_loop(VideoState *cur_stream) break; } break; + case SDL_VIDEOEXPOSE: + cur_stream->force_refresh = 1; + break; case SDL_MOUSEBUTTONDOWN: if (exit_on_mousedown) { do_exit(cur_stream); @@ -2932,6 +2945,7 @@ static void event_loop(VideoState *cur_stream) SDL_HWSURFACE|SDL_RESIZABLE|SDL_ASYNCBLIT|SDL_HWACCEL); screen_width = cur_stream->width = event.resize.w; screen_height = cur_stream->height = event.resize.h; + cur_stream->force_refresh = 1; break; case SDL_QUIT: case FF_QUIT_EVENT: @@ -3217,7 +3231,7 @@ int main(int argc, char **argv) } av_init_packet(&flush_pkt); - flush_pkt.data = "FLUSH"; + flush_pkt.data = (char *)(intptr_t)"FLUSH"; is = stream_open(input_filename, file_iformat); if (!is) {