Make the buffered_pts array dynamically allocated to avoid the need for ever showing the "Too many buffered pts" error. Add a max_buffered_pts variable to make sure it's always one larger than the number of buffered_pts encountered. Signed-off-by: Con Kolivas -ck --- libmpcodecs/dec_video.c | 30 +++++++++++++++++------------- libmpdemux/stheader.h | 3 ++- mplayer.c | 7 ++++++- 3 files changed, 25 insertions(+), 15 deletions(-) Index: mplayer2-2.0/libmpcodecs/dec_video.c =================================================================== --- mplayer2-2.0.orig/libmpcodecs/dec_video.c 2011-05-29 12:33:51.283206710 +1000 +++ mplayer2-2.0/libmpcodecs/dec_video.c 2011-05-29 16:52:31.208204333 +1000 @@ -402,7 +402,12 @@ void *decode_video(sh_video_t *sh_video, double tt; struct MPOpts *opts = sh_video->opts; + if (!sh_video->max_buffered_pts) { + sh_video->max_buffered_pts = 2; + sh_video->buffered_pts = malloc(sh_video->max_buffered_pts * sizeof(double)); + } if (opts->correct_pts && pts != MP_NOPTS_VALUE) { + int i, j; int delay = get_current_video_decoder_lag(sh_video); if (delay >= 0) { if (delay > sh_video->num_buffered_pts) @@ -417,19 +422,18 @@ void *decode_video(sh_video_t *sh_video, else sh_video->num_buffered_pts = delay; } - if (sh_video->num_buffered_pts == - sizeof(sh_video->buffered_pts) / sizeof(double)) - mp_msg(MSGT_DECVIDEO, MSGL_ERR, "Too many buffered pts\n"); - else { - int i, j; - for (i = 0; i < sh_video->num_buffered_pts; i++) - if (sh_video->buffered_pts[i] < pts) - break; - for (j = sh_video->num_buffered_pts; j > i; j--) - sh_video->buffered_pts[j] = sh_video->buffered_pts[j - 1]; - sh_video->buffered_pts[i] = pts; - sh_video->num_buffered_pts++; - } + if (sh_video->num_buffered_pts >= sh_video->max_buffered_pts) { + sh_video->max_buffered_pts = sh_video->num_buffered_pts + 1; + sh_video->buffered_pts = realloc(sh_video->buffered_pts, (sh_video->max_buffered_pts) * sizeof(double)); + mp_msg(MSGT_DECVIDEO, MSGL_V, "Increasing max buffered pts to: %d\n", sh_video->max_buffered_pts); + } + for (i = 0; i < sh_video->num_buffered_pts; i++) + if (sh_video->buffered_pts[i] < pts) + break; + for (j = sh_video->num_buffered_pts; j > i; j--) + sh_video->buffered_pts[j] = sh_video->buffered_pts[j - 1]; + sh_video->buffered_pts[i] = pts; + sh_video->num_buffered_pts++; } if (sh_video->vd_driver->decode2) { Index: mplayer2-2.0/libmpdemux/stheader.h =================================================================== --- mplayer2-2.0.orig/libmpdemux/stheader.h 2011-05-29 12:33:40.408206712 +1000 +++ mplayer2-2.0/libmpdemux/stheader.h 2011-05-29 13:58:36.735205930 +1000 @@ -102,8 +102,9 @@ typedef struct sh_video { double i_pts; // PTS for the _next_ I/P frame float next_frame_time; double last_pts; - double buffered_pts[20]; + double *buffered_pts; int num_buffered_pts; + int max_buffered_pts; double codec_reordered_pts; double prev_codec_reordered_pts; int num_reordered_pts_problems; Index: mplayer2-2.0/mplayer.c =================================================================== --- mplayer2-2.0.orig/mplayer.c 2011-05-29 12:36:00.489206690 +1000 +++ mplayer2-2.0/mplayer.c 2011-05-29 16:49:54.823204357 +1000 @@ -4883,13 +4883,18 @@ if (mpctx->stream->type == STREAMTYPE_DV mpctx->seek = (struct seek_params){0}; get_relative_time(mpctx); // reset current delta // Make sure VO knows current pause state - if (mpctx->sh_video) + if (mpctx->sh_video) { vo_control(mpctx->video_out, mpctx->paused ? VOCTRL_PAUSE : VOCTRL_RESUME, NULL); + mpctx->sh_video->max_buffered_pts = 0; + } while (!mpctx->stop_play) run_playloop(mpctx); + if (mpctx->sh_video && mpctx->sh_video->max_buffered_pts) + free(mpctx->sh_video->buffered_pts); + mp_msg(MSGT_GLOBAL,MSGL_V,"EOF code: %d \n",mpctx->stop_play); #ifdef CONFIG_DVBIN