Commit 7ba9f40a authored by Michael Niedermayer's avatar Michael Niedermayer

Merge remote-tracking branch 'cus/stable'

* cus/stable:
  ffplay: flush video filters on seek
  ffplay: use videoq.serial to detect obsolete frames
Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents 24c47f00 f65e5712
...@@ -116,7 +116,6 @@ typedef struct PacketQueue { ...@@ -116,7 +116,6 @@ typedef struct PacketQueue {
typedef struct VideoPicture { typedef struct VideoPicture {
double pts; // presentation timestamp for this picture double pts; // presentation timestamp for this picture
int64_t pos; // byte position in file int64_t pos; // byte position in file
int skip;
SDL_Overlay *bmp; SDL_Overlay *bmp;
int width, height; /* source height & width */ int width, height; /* source height & width */
AVRational sample_aspect_ratio; AVRational sample_aspect_ratio;
...@@ -1261,7 +1260,7 @@ static void pictq_prev_picture(VideoState *is) { ...@@ -1261,7 +1260,7 @@ static void pictq_prev_picture(VideoState *is) {
VideoPicture *prevvp; VideoPicture *prevvp;
/* update queue size and signal for the previous picture */ /* update queue size and signal for the previous picture */
prevvp = &is->pictq[(is->pictq_rindex + VIDEO_PICTURE_QUEUE_SIZE - 1) % VIDEO_PICTURE_QUEUE_SIZE]; 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); SDL_LockMutex(is->pictq_mutex);
if (is->pictq_size < VIDEO_PICTURE_QUEUE_SIZE - 1) { if (is->pictq_size < VIDEO_PICTURE_QUEUE_SIZE - 1) {
if (--is->pictq_rindex == -1) if (--is->pictq_rindex == -1)
...@@ -1316,7 +1315,7 @@ retry: ...@@ -1316,7 +1315,7 @@ retry:
/* dequeue the picture */ /* dequeue the picture */
vp = &is->pictq[is->pictq_rindex]; vp = &is->pictq[is->pictq_rindex];
if (vp->skip) { if (vp->serial != is->videoq.serial) {
pictq_next_picture(is); pictq_next_picture(is);
goto retry; goto retry;
} }
...@@ -1619,7 +1618,6 @@ static int queue_picture(VideoState *is, AVFrame *src_frame, double pts1, int64_ ...@@ -1619,7 +1618,6 @@ static int queue_picture(VideoState *is, AVFrame *src_frame, double pts1, int64_
vp->pts = pts; vp->pts = pts;
vp->pos = pos; vp->pos = pos;
vp->skip = 0;
vp->serial = serial; vp->serial = serial;
/* now we can update the picture count */ /* now we can update the picture count */
...@@ -1634,7 +1632,7 @@ static int queue_picture(VideoState *is, AVFrame *src_frame, double pts1, int64_ ...@@ -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) 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) if (packet_queue_get(&is->videoq, pkt, 1, serial) < 0)
return -1; return -1;
...@@ -1644,9 +1642,6 @@ static int get_video_frame(VideoState *is, AVFrame *frame, int64_t *pts, AVPacke ...@@ -1644,9 +1642,6 @@ static int get_video_frame(VideoState *is, AVFrame *frame, int64_t *pts, AVPacke
SDL_LockMutex(is->pictq_mutex); SDL_LockMutex(is->pictq_mutex);
// Make sure there are no long delay timers (ideally we should just flush the queue but that's harder) // 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) { while (is->pictq_size && !is->videoq.abort_request) {
SDL_CondWait(is->pictq_cond, is->pictq_mutex); SDL_CondWait(is->pictq_cond, is->pictq_mutex);
} }
...@@ -1815,6 +1810,7 @@ static int video_thread(void *arg) ...@@ -1815,6 +1810,7 @@ static int video_thread(void *arg)
int last_w = 0; int last_w = 0;
int last_h = 0; int last_h = 0;
enum AVPixelFormat last_format = -2; enum AVPixelFormat last_format = -2;
int last_serial = -1;
if (codec->codec->capabilities & CODEC_CAP_DR1) { if (codec->codec->capabilities & CODEC_CAP_DR1) {
is->use_dr1 = 1; is->use_dr1 = 1;
...@@ -1845,7 +1841,8 @@ static int video_thread(void *arg) ...@@ -1845,7 +1841,8 @@ static int video_thread(void *arg)
#if CONFIG_AVFILTER #if CONFIG_AVFILTER
if ( last_w != frame->width if ( last_w != frame->width
|| last_h != frame->height || 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", 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); last_w, last_h, frame->width, frame->height);
avfilter_graph_free(&graph); avfilter_graph_free(&graph);
...@@ -1863,6 +1860,7 @@ static int video_thread(void *arg) ...@@ -1863,6 +1860,7 @@ static int video_thread(void *arg)
last_w = frame->width; last_w = frame->width;
last_h = frame->height; last_h = frame->height;
last_format = frame->format; last_format = frame->format;
last_serial = serial;
} }
frame->pts = pts_int; frame->pts = pts_int;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment