X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=ffplay.c;h=93090ad60bb6c67874632aec41e481d7a1d4f0b6;hb=b1b870fbd7185bffbe27c5918001b40a8ff8b920;hp=428c78e747c19e3c2ad62e460c6459b28d1ff7e5;hpb=9aeffb3c2a0d86a1271836f87915d3a2e069cdd2;p=ffmpeg diff --git a/ffplay.c b/ffplay.c index 428c78e747c..93090ad60bb 100644 --- a/ffplay.c +++ b/ffplay.c @@ -116,7 +116,6 @@ typedef struct PacketQueue { typedef struct VideoPicture { double pts; // presentation timestamp for this picture int64_t pos; // byte position in file - int skip; SDL_Overlay *bmp; int width, height; /* source height & width */ AVRational sample_aspect_ratio; @@ -1261,7 +1260,7 @@ static void pictq_prev_picture(VideoState *is) { VideoPicture *prevvp; /* update queue size and signal for the previous picture */ prevvp = &is->pictq[(is->pictq_rindex + VIDEO_PICTURE_QUEUE_SIZE - 1) % VIDEO_PICTURE_QUEUE_SIZE]; - if (prevvp->allocated && !prevvp->skip) { + if (prevvp->allocated && prevvp->serial == is->videoq.serial) { SDL_LockMutex(is->pictq_mutex); if (is->pictq_size < VIDEO_PICTURE_QUEUE_SIZE - 1) { if (--is->pictq_rindex == -1) @@ -1316,7 +1315,7 @@ retry: /* dequeue the picture */ vp = &is->pictq[is->pictq_rindex]; - if (vp->skip) { + if (vp->serial != is->videoq.serial) { pictq_next_picture(is); goto retry; } @@ -1619,7 +1618,6 @@ static int queue_picture(VideoState *is, AVFrame *src_frame, double pts1, int64_ vp->pts = pts; vp->pos = pos; - vp->skip = 0; vp->serial = serial; /* now we can update the picture count */ @@ -1634,7 +1632,7 @@ static int queue_picture(VideoState *is, AVFrame *src_frame, double pts1, int64_ static int get_video_frame(VideoState *is, AVFrame *frame, int64_t *pts, AVPacket *pkt, int *serial) { - int got_picture, i; + int got_picture; if (packet_queue_get(&is->videoq, pkt, 1, serial) < 0) return -1; @@ -1644,9 +1642,6 @@ static int get_video_frame(VideoState *is, AVFrame *frame, int64_t *pts, AVPacke SDL_LockMutex(is->pictq_mutex); // Make sure there are no long delay timers (ideally we should just flush the queue but that's harder) - for (i = 0; i < VIDEO_PICTURE_QUEUE_SIZE; i++) { - is->pictq[i].skip = 1; - } while (is->pictq_size && !is->videoq.abort_request) { SDL_CondWait(is->pictq_cond, is->pictq_mutex); } @@ -1815,6 +1810,7 @@ static int video_thread(void *arg) int last_w = 0; int last_h = 0; enum AVPixelFormat last_format = -2; + int last_serial = -1; if (codec->codec->capabilities & CODEC_CAP_DR1) { is->use_dr1 = 1; @@ -1845,7 +1841,8 @@ static int video_thread(void *arg) #if CONFIG_AVFILTER if ( last_w != frame->width || last_h != frame->height - || last_format != frame->format) { + || last_format != frame->format + || last_serial != serial) { av_log(NULL, AV_LOG_INFO, "Frame changed from size:%dx%d to size:%dx%d\n", last_w, last_h, frame->width, frame->height); avfilter_graph_free(&graph); @@ -1863,6 +1860,7 @@ static int video_thread(void *arg) last_w = frame->width; last_h = frame->height; last_format = frame->format; + last_serial = serial; } frame->pts = pts_int;