| | 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 | } |