Index: libmpdemux/demux_mov.c =================================================================== --- libmpdemux/demux_mov.c (revision 24128) +++ libmpdemux/demux_mov.c (working copy) @@ -2128,6 +2128,44 @@ // calc real frame index: frame-=trak->editlist[trak->editlist_pos].start_frame; frame+=trak->editlist[trak->editlist_pos].start_sample; + + //if the edl adjustment is after a keyframe, add frames between + // previous keyframe and adjusted start for proper decoding + if (trak->pos == 0) { + //if track has keyframes, choose the nearest (earlier) keyframe + int kfi; + int curframe = 0; + for(kfi=0; kfi < trak->keyframes_size-1; kfi++) { + if(trak->samples[trak->keyframes[kfi+1]].pts + > trak->editlist[trak->editlist_pos].pos) { + curframe = trak->keyframes[kfi]; + break; + } + } + //while curframe is less than the actual display frame + for(; curframe < frame; curframe++) { + //seek and read packets up to the edl start frame + pts = (float)trak->samples[curframe].pts/trak->timescale; + stream_seek(demuxer->stream,trak->samples[curframe].pos); + x = trak->samples[curframe].size; + pos = trak->samples[curframe].pos; + if(curframe==0 && trak->stream_header_len>0) { + // we have to append the stream header... + demux_packet_t* dp=new_demux_packet(x+trak->stream_header_len); + memcpy(dp->buffer,trak->stream_header,trak->stream_header_len); + stream_read(demuxer->stream,dp->buffer+trak->stream_header_len,x); + free(trak->stream_header); + trak->stream_header = NULL; + trak->stream_header_len = 0; + dp->pts=pts; + dp->flags=0; + dp->pos=pos; // FIXME? + ds_add_packet(ds,dp); + } + else + ds_read_packet(ds,demuxer->stream,x,pts,pos,0); + } + } // calc pts: pts=(float)(trak->samples[frame].pts+ trak->editlist[trak->editlist_pos].pts_offset)/(float)trak->timescale;