Ticket #1217: mov-elst.patch

File mov-elst.patch, 2.4 KB (added by rectalogic@…, 18 years ago)

demux_mov.c patch

  • libmpdemux/demux_mov.c

     
    21362136} else {
    21372137    int frame=trak->pos;
    21382138    // editlist support:
    2139     if(trak->type == MOV_TRAK_VIDEO && trak->editlist_size>=1){
     2139    if(trak->editlist_size >= 1){
    21402140        // find the right editlist entry:
    21412141        if(frame<trak->editlist[trak->editlist_pos].start_frame)
    21422142            trak->editlist_pos=0;
     
    21482148        // calc real frame index:
    21492149        frame-=trak->editlist[trak->editlist_pos].start_frame;
    21502150        frame+=trak->editlist[trak->editlist_pos].start_sample;
     2151
     2152        //if the edl adjustment is after a keyframe, add frames between
     2153        //  previous keyframe and adjusted start for proper decoding
     2154        if (trak->type == MOV_TRAK_VIDEO &&
     2155            trak->pos == trak->editlist[trak->editlist_pos].start_frame &&
     2156            trak->keyframes_size) {
     2157          //choose the nearest (earlier) keyframe
     2158          int kfi;
     2159          int curframe = trak->keyframes[trak->keyframes_size-1];
     2160          for(kfi=0;kfi<trak->keyframes_size-1;kfi++) {
     2161            if(trak->samples[trak->keyframes[kfi+1]].pts
     2162                > trak->editlist[trak->editlist_pos].pos) {
     2163              curframe = trak->keyframes[kfi];
     2164              break;
     2165            }
     2166          }
     2167          //while curframe is less than the actual display frame
     2168          for(; curframe < frame; curframe++) {
     2169            //seek and read packets up to the edl start frame
     2170            pts = (float)(trak->samples[frame].pts +
     2171                trak->editlist[trak->editlist_pos].pts_offset) /
     2172                (float)trak->timescale;
     2173            stream_seek(demuxer->stream,trak->samples[curframe].pos);
     2174            x=trak->samples[curframe].size;
     2175            pos=trak->samples[curframe].pos;             
     2176            if(curframe==0 && trak->stream_header_len>0) {
     2177              // we have to append the stream header...
     2178              demux_packet_t* dp=new_demux_packet(x+trak->stream_header_len);
     2179              memcpy(dp->buffer,trak->stream_header,trak->stream_header_len);
     2180              stream_read(demuxer->stream,dp->buffer+trak->stream_header_len,x);
     2181              free(trak->stream_header);
     2182              trak->stream_header = NULL;
     2183              trak->stream_header_len = 0;
     2184              dp->pts=pts;
     2185              dp->flags=0;
     2186              dp->pos=pos; // FIXME?
     2187              ds_add_packet(ds,dp);
     2188            }
     2189            else               
     2190              ds_read_packet(ds,demuxer->stream,x,pts,pos,0);
     2191          }
     2192        }
    21512193        // calc pts:
    21522194        pts=(float)(trak->samples[frame].pts+
    21532195            trak->editlist[trak->editlist_pos].pts_offset)/(float)trak->timescale;