diff --git a/ffplay.c b/ffplay.c
index 7276c4a..99e8c9a 100644
--- a/ffplay.c
+++ b/ffplay.c
@@ -114,7 +114,7 @@ typedef struct PacketQueue {
 } PacketQueue;
 
 #define VIDEO_PICTURE_QUEUE_SIZE 4
-#define SUBPICTURE_QUEUE_SIZE 4
+#define SUBPICTURE_QUEUE_SIZE 12
 
 typedef struct VideoPicture {
     double pts;             // presentation timestamp for this picture
@@ -788,10 +788,18 @@ static void video_image_display(VideoState *is)
     vp = &is->pictq[is->pictq_rindex];
     if (vp->bmp) {
         if (is->subtitle_st) {
-            if (is->subpq_size > 0) {
+            if (is->subpq_size > 8)
+            while (is->subpq_size > 4) {
                 sp = &is->subpq[is->subpq_rindex];
-
-                if (vp->pts >= sp->pts + ((float) sp->sub.start_display_time / 1000)) {
+                if (++is->subpq_rindex == SUBPICTURE_QUEUE_SIZE)
+                    is->subpq_rindex = 0;
+                SDL_LockMutex(is->subpq_mutex);
+                is->subpq_size--;
+                SDL_CondSignal(is->subpq_cond);
+                SDL_UnlockMutex(is->subpq_mutex);
+
+                if (vp->pts < sp->pts + ((float) sp->sub.start_display_time / 1000))
+                    break;
                     SDL_LockYUVOverlay (vp->bmp);
 
                     pict.data[0] = vp->bmp->pixels[0];
@@ -807,7 +815,6 @@ static void video_image_display(VideoState *is)
                                       vp->bmp->w, vp->bmp->h);
 
                     SDL_UnlockYUVOverlay (vp->bmp);
-                }
             }
         }
 
@@ -1393,7 +1400,7 @@ retry:
                     SDL_CondSignal(is->subpq_cond);
                     SDL_UnlockMutex(is->subpq_mutex);
                 } else {
-                    if (is->subpq_size > 0) {
+                    if (0 && is->subpq_size > 4) {
                         sp = &is->subpq[is->subpq_rindex];
 
                         if (is->subpq_size > 1)
@@ -1990,6 +1997,7 @@ static int subtitle_thread(void *arg)
             if (sp->sub.pts != AV_NOPTS_VALUE)
                 pts = sp->sub.pts / (double)AV_TIME_BASE;
             sp->pts = pts;
+sp->pts = 0;
 
             for (i = 0; i < sp->sub.num_rects; i++)
             {
