Index: libmpdemux/demux_mov.c =================================================================== --- libmpdemux/demux_mov.c (revision 18722) +++ libmpdemux/demux_mov.c (working copy) @@ -1090,8 +1090,37 @@ // printf("pos=%d max=%d\n",pos,trak->stdata_len); } } - sh->fps=trak->timescale/ - ((trak->durmap_size>=1)?(float)trak->durmap[0].dur:1); + + // find average fps by taking average duration (highest and lowest removed) + switch (trak->durmap_size) + { + case 0: + sh->fps=trak->timescale; + break; + case 1: + sh->fps=trak->timescale/(float)trak->durmap[0].dur; + break; + case 2: + sh->fps=trak->timescale/(((float)trak->durmap[0].dur+(float)trak->durmap[1].dur)/2); + break; + default: + { + int j; + int sum=0, min, max; + float avg; + for (j=0 ; jdurmap_size; j++) + { + sum += trak->durmap[j].dur; + min = j == 0 || trak->durmap[j].dur < min ? trak->durmap[j].dur : min; + max = j == 0 || trak->durmap[j].dur > max ? trak->durmap[j].dur : max; + } + sum -= min + max; + avg = ((float) sum) / ((float)trak->durmap_size - 2); + sh->fps=trak->timescale/avg; + } + break; + } + sh->frametime=1.0f/sh->fps; sh->disp_w=trak->stdata[25]|(trak->stdata[24]<<8);