[FFmpeg-cvslog] r21588 - trunk/ffplay.c
michael
subversion
Mon Feb 1 13:19:28 CET 2010
Author: michael
Date: Mon Feb 1 13:19:28 2010
New Revision: 21588
Log:
"Flush" the picture que on seeks, this prevents the display thread from
having frames from before and after the seek which just isnt a good idea.
Modified:
trunk/ffplay.c
Modified: trunk/ffplay.c
==============================================================================
--- trunk/ffplay.c Mon Feb 1 12:39:10 2010 (r21587)
+++ trunk/ffplay.c Mon Feb 1 13:19:28 2010 (r21588)
@@ -90,6 +90,7 @@ typedef struct VideoPicture {
SDL_Overlay *bmp;
int width, height; /* source height & width */
int allocated;
+ SDL_TimerID timer_id;
} VideoPicture;
typedef struct SubPicture {
@@ -913,10 +914,10 @@ static Uint32 sdl_refresh_timer_cb(Uint3
}
/* schedule a video refresh in 'delay' ms */
-static void schedule_refresh(VideoState *is, int delay)
+static SDL_TimerID schedule_refresh(VideoState *is, int delay)
{
if(!delay) delay=1; //SDL seems to be buggy when the delay is 0
- SDL_AddTimer(delay, sdl_refresh_timer_cb, is);
+ return SDL_AddTimer(delay, sdl_refresh_timer_cb, is);
}
/* get the current audio clock value */
@@ -1122,6 +1123,7 @@ static void video_refresh_timer(void *op
is->pictq_rindex = 0;
SDL_LockMutex(is->pictq_mutex);
+ vp->timer_id= 0;
is->pictq_size--;
SDL_CondSignal(is->pictq_cond);
SDL_UnlockMutex(is->pictq_mutex);
@@ -1277,8 +1279,9 @@ static int queue_picture(VideoState *is,
is->pictq_windex = 0;
SDL_LockMutex(is->pictq_mutex);
is->pictq_size++;
+ //We must schedule in a mutex as we must store the timer id before the timer dies or might end up freeing a alraedy freed id
+ vp->timer_id= schedule_refresh(is, (int)(compute_frame_delay(vp->pts, is) * 1000 + 0.5));
SDL_UnlockMutex(is->pictq_mutex);
- schedule_refresh(is, (int)(compute_frame_delay(vp->pts, is) * 1000 + 0.5));
}
return 0;
}
@@ -1326,7 +1329,7 @@ static int video_thread(void *arg)
{
VideoState *is = arg;
AVPacket pkt1, *pkt = &pkt1;
- int len1, got_picture;
+ int len1, got_picture, i;
AVFrame *frame= avcodec_alloc_frame();
double pts;
@@ -1339,6 +1342,21 @@ static int video_thread(void *arg)
if(pkt->data == flush_pkt.data){
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 que but thats harder)
+ for(i=0; i<VIDEO_PICTURE_QUEUE_SIZE; i++){
+ if(is->pictq[i].timer_id){
+ SDL_RemoveTimer(is->pictq[i].timer_id);
+ is->pictq[i].timer_id=0;
+ schedule_refresh(is, 1);
+ }
+ }
+ while (is->pictq_size && !is->videoq.abort_request) {
+ SDL_CondWait(is->pictq_cond, is->pictq_mutex);
+ }
+ SDL_UnlockMutex(is->pictq_mutex);
+
is->last_dts_for_fault_detection=
is->last_pts_for_fault_detection= INT64_MIN;
continue;
More information about the ffmpeg-cvslog
mailing list