Ticket #2516: patchpgs.diff

File patchpgs.diff, 2.1 KB (added by cehoyos, 3 years ago)

Hack from Reimar to show the reason for the problem

  • ffplay.c

    diff --git a/ffplay.c b/ffplay.c
    index 7276c4a..99e8c9a 100644
    a b typedef struct PacketQueue { 
    114114} PacketQueue; 
    115115 
    116116#define VIDEO_PICTURE_QUEUE_SIZE 4 
    117 #define SUBPICTURE_QUEUE_SIZE 4 
     117#define SUBPICTURE_QUEUE_SIZE 12 
    118118 
    119119typedef struct VideoPicture { 
    120120    double pts;             // presentation timestamp for this picture 
    static void video_image_display(VideoState *is) 
    788788    vp = &is->pictq[is->pictq_rindex]; 
    789789    if (vp->bmp) { 
    790790        if (is->subtitle_st) { 
    791             if (is->subpq_size > 0) { 
     791            if (is->subpq_size > 8) 
     792            while (is->subpq_size > 4) { 
    792793                sp = &is->subpq[is->subpq_rindex]; 
    793  
    794                 if (vp->pts >= sp->pts + ((float) sp->sub.start_display_time / 1000)) { 
     794                if (++is->subpq_rindex == SUBPICTURE_QUEUE_SIZE) 
     795                    is->subpq_rindex = 0; 
     796                SDL_LockMutex(is->subpq_mutex); 
     797                is->subpq_size--; 
     798                SDL_CondSignal(is->subpq_cond); 
     799                SDL_UnlockMutex(is->subpq_mutex); 
     800 
     801                if (vp->pts < sp->pts + ((float) sp->sub.start_display_time / 1000)) 
     802                    break; 
    795803                    SDL_LockYUVOverlay (vp->bmp); 
    796804 
    797805                    pict.data[0] = vp->bmp->pixels[0]; 
    static void video_image_display(VideoState *is) 
    807815                                      vp->bmp->w, vp->bmp->h); 
    808816 
    809817                    SDL_UnlockYUVOverlay (vp->bmp); 
    810                 } 
    811818            } 
    812819        } 
    813820 
    retry: 
    13931400                    SDL_CondSignal(is->subpq_cond); 
    13941401                    SDL_UnlockMutex(is->subpq_mutex); 
    13951402                } else { 
    1396                     if (is->subpq_size > 0) { 
     1403                    if (0 && is->subpq_size > 4) { 
    13971404                        sp = &is->subpq[is->subpq_rindex]; 
    13981405 
    13991406                        if (is->subpq_size > 1) 
    static int subtitle_thread(void *arg) 
    19901997            if (sp->sub.pts != AV_NOPTS_VALUE) 
    19911998                pts = sp->sub.pts / (double)AV_TIME_BASE; 
    19921999            sp->pts = pts; 
     2000sp->pts = 0; 
    19932001 
    19942002            for (i = 0; i < sp->sub.num_rects; i++) 
    19952003            {