Index: libmpdemux/demux_mov.c =================================================================== --- libmpdemux/demux_mov.c (revision 18891) +++ libmpdemux/demux_mov.c (working copy) @@ -267,10 +267,21 @@ // skip! el->frames=0; continue; } - // find start sample + // find start sample. If track has keyframes, choose the nearest + // (earlier) keyframe. Otherwise, just choose the nearest sample. + if(trak->keyframes_size) { + unsigned int kfi; + for(kfi=0;kfikeyframes_size-1;kfi++){ + if(trak->samples[trak->keyframes[kfi+1]].pts > pts){ + sample = trak->keyframes[kfi]; + break; + } + } + } else { for(;samplesamples_size;sample++){ if(pts<=trak->samples[sample].pts) break; } + } el->start_sample=sample; el->pts_offset=((long long)e_pts*(long long)trak->timescale)/(long long)timescale-trak->samples[sample].pts; pts+=((long long)el->dur*(long long)trak->timescale)/(long long)timescale;