Ticket #2516: patchpgs.diff

File patchpgs.diff, 2.1 KB (added by Carl Eugen Hoyos, 13 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            {