[MPlayer-advusers] mplayer aborts with -nosound

Nico Sabbi Nicola.Sabbi at poste.it
Sun Feb 10 13:00:55 CET 2008


Il Saturday 09 February 2008 21:48:36 Bob Bell ha scritto:
> On Sat, Feb 09, 2008 at 01:36:50PM -0500, Bob Bell wrote:
> >On Sat, Feb 09, 2008 at 12:16:23PM +0100, Nico Sabbi wrote:
> >>An easier fix consists in raising TIMESTAMP_PROBE_LEN a bit
> >>(1M for example). Does it work?
> >
> >It does indeed.
> 
> It did some extra poking.  The demuxer looks for a series of three 
> timestamps at three spots: the beginning of the file, the middle of the 
> file, and the end of the file.  At the beginning there's no problem.  
> However, for my primary test in the middle the timestamps are at offsets 
> of 215040, 583680, and 931840 bytes.  Bumping to TIMESTAMP_PROBE_LEN 
> therefore *barely* catches this case.
> 
> I was thinking, might it not make more sense to reset the probe length 
> every time a timestamp was found?  The patch below implements that and 
> also works with my testing.
> 
> -- Bob
> 
> Index: libmpdemux/demux_mpg.c
> ===================================================================
> --- libmpdemux/demux_mpg.c	(revision 25959)
> +++ libmpdemux/demux_mpg.c	(working copy)
> @@ -103,8 +103,11 @@
>    return 1;
>  }
>  
> -// 500000 is a wild guess
> -#define TIMESTAMP_PROBE_LEN 500000
> +//MAX_PTS_INTERVAL denotes the maximum number of bytes
> +//to probe for the next pts
> +//500000 is a wild guess
> +#define MAX_PTS_INTERVAL 500000
> +#define TIMESTAMP_PROBE_LEN (3*MAX_PTS_INTERVAL)
>  
>  //MAX_PTS_DIFF_FOR_CONSECUTIVE denotes the maximum difference
>  //between two pts to consider them consecutive
> @@ -123,6 +126,7 @@
>    float found_pts2; //the pts found before found_pts1
>    float found_pts3; //the pts found before found_pts2
>    int found = 0;
> +  off_t end_of_probe;
>  
>    if(!mpg_d || stream_pos < 0)
>      return pts;
> @@ -135,10 +139,11 @@
>    //Therefore, we seek until we found three consecutive
>    //pts within MAX_PTS_DIFF_FOR_CONSECUTIVE.
>  
> +  end_of_probe = stream_pos + MAX_PTS_INTERVAL;
>    while(found<3 && !s->eof
>     && (fabsf(found_pts2-found_pts1) < MAX_PTS_DIFF_FOR_CONSECUTIVE)
>     && (fabsf(found_pts3-found_pts2) < MAX_PTS_DIFF_FOR_CONSECUTIVE)
> -   && (stream_tell(s) < stream_pos + TIMESTAMP_PROBE_LEN)
> +   && (stream_tell(s) < end_of_probe)
>     && ds_fill_buffer(demuxer->video))
>    {
>      if(mpg_d->last_pts != found_pts1)
> @@ -152,6 +157,7 @@
>          found_pts1 = mpg_d->last_pts;
>        }
>        found++;
> +      end_of_probe = stream_tell(s) + MAX_PTS_INTERVAL;
>      }
>    }
>  

it doesn't work like the current code: the intent is to verify if the delta_pts
is ~ proportional to the delta_space, but if you stretch the space the result
will be bogus. Correct me if I'm wrong



More information about the MPlayer-advusers mailing list