Merge branch 'master' of https://github.com/olive-editor/olive
This commit is contained in:
+6
-5
@@ -180,21 +180,22 @@ void reset_cache(Clip* c, long target_frame) {
|
||||
|
||||
if (c->stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
|
||||
// seeks to nearest keyframe (target_frame represents internal clip frame)
|
||||
av_seek_frame(c->formatCtx, ms->file_index, clip_frame_to_seconds(c, target_frame) / timebase, AVSEEK_FLAG_BACKWARD);
|
||||
|
||||
av_seek_frame(c->formatCtx, ms->file_index, (int64_t) qFloor(clip_frame_to_seconds(c, target_frame) / timebase), AVSEEK_FLAG_BACKWARD);
|
||||
qDebug() << target_frame;
|
||||
|
||||
// play up to the frame we actually want
|
||||
long retrieved_frame = 0;
|
||||
AVFrame* temp = av_frame_alloc();
|
||||
do {
|
||||
do {
|
||||
retrieve_next_frame(c, temp);
|
||||
if (retrieved_frame == 0) {
|
||||
if (target_frame != 0) {
|
||||
retrieved_frame = floor(temp->pts * timebase * av_q2d(av_guess_frame_rate(c->formatCtx, c->stream, temp)));
|
||||
}
|
||||
if (target_frame != 0) retrieved_frame = floor(temp->pts * timebase * av_q2d(av_guess_frame_rate(c->formatCtx, c->stream, temp)));
|
||||
} else {
|
||||
retrieved_frame++;
|
||||
}
|
||||
} while (retrieved_frame < target_frame);
|
||||
|
||||
av_frame_free(&temp);
|
||||
} else if (c->stream->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
|
||||
// seek (target_frame represents timeline timecode in frames, not clip timecode)
|
||||
|
||||
+7
-14
@@ -75,7 +75,7 @@ void cache_clip(Clip* clip, long playhead, bool write_A, bool write_B, bool rese
|
||||
|
||||
void get_clip_frame(Clip* c, long playhead) {
|
||||
if (c->open) {
|
||||
long clip_time = seconds_to_clip_frame(c, playhead_to_seconds(c, playhead));
|
||||
long clip_time = refactor_frame_number(playhead - c->timeline_in + c->clip_in, c->sequence->frame_rate, av_q2d(av_guess_frame_rate(c->formatCtx, c->stream, c->frame)));
|
||||
|
||||
// do we need to update the texture?
|
||||
MediaStream* ms = static_cast<Media*>(c->media)->get_stream_from_file_index(c->media_stream);
|
||||
@@ -139,15 +139,8 @@ void get_clip_frame(Clip* c, long playhead) {
|
||||
bool write_A = (!using_cache_A && !c->cache_A.unread);
|
||||
bool write_B = (!using_cache_B && !c->cache_B.unread);
|
||||
if (write_A || write_B) {
|
||||
long playhead;
|
||||
if (cache_needs_reset) {
|
||||
// if we have no cache and need to seek, start us at the current playhead...
|
||||
playhead = clip_time;
|
||||
} else {
|
||||
// ...otherwise start at the end of the current cache
|
||||
playhead = cache_offset + c->cache_size;
|
||||
}
|
||||
cache_clip(c, playhead, write_A, write_B, cache_needs_reset, NULL);
|
||||
// if we have no cache and need to seek, start us at the current playhead, otherwise start at the end of the current cache
|
||||
cache_clip(c, (cache_needs_reset) ? clip_time : cache_offset + c->cache_size, write_A, write_B, cache_needs_reset, NULL);
|
||||
}
|
||||
c->lock.unlock();
|
||||
}
|
||||
@@ -175,12 +168,12 @@ void get_clip_frame(Clip* c, long playhead) {
|
||||
}
|
||||
}
|
||||
|
||||
float playhead_to_seconds(Clip* c, long playhead) {
|
||||
double playhead_to_seconds(Clip* c, long playhead) {
|
||||
// returns time in seconds
|
||||
return (qMax((long) 0, playhead - c->timeline_in) + c->clip_in)/c->sequence->frame_rate;
|
||||
}
|
||||
|
||||
long seconds_to_clip_frame(Clip* c, float seconds) {
|
||||
long seconds_to_clip_frame(Clip* c, double seconds) {
|
||||
// returns time as frame number (according to clip's frame rate)
|
||||
if (c->stream->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
|
||||
return floor(seconds*av_q2d(av_guess_frame_rate(c->formatCtx, c->stream, c->frame)));
|
||||
@@ -190,9 +183,9 @@ long seconds_to_clip_frame(Clip* c, float seconds) {
|
||||
}
|
||||
}
|
||||
|
||||
float clip_frame_to_seconds(Clip* c, long clip_frame) {
|
||||
double clip_frame_to_seconds(Clip* c, long clip_frame) {
|
||||
// returns frame number in decimal seconds
|
||||
return (float) clip_frame / c->sequence->frame_rate;
|
||||
return (double) clip_frame / av_q2d(av_guess_frame_rate(c->formatCtx, c->stream, c->frame));
|
||||
}
|
||||
|
||||
int retrieve_next_frame(Clip* c, AVFrame* f) {
|
||||
|
||||
+3
-3
@@ -19,9 +19,9 @@ void cache_video_worker(Clip* c, long playhead, ClipCache* cache);
|
||||
void handle_media(Sequence* sequence, long playhead, bool multithreaded);
|
||||
void reset_cache(Clip* c, long target_frame);
|
||||
void get_clip_frame(Clip* c, long playhead);
|
||||
float playhead_to_seconds(Clip* c, long playhead);
|
||||
long seconds_to_clip_frame(Clip* c, float seconds);
|
||||
float clip_frame_to_seconds(Clip* c, long clip_frame);
|
||||
double playhead_to_seconds(Clip* c, long playhead);
|
||||
long seconds_to_clip_frame(Clip* c, double seconds);
|
||||
double clip_frame_to_seconds(Clip* c, long clip_frame);
|
||||
int retrieve_next_frame(Clip* c, AVFrame* f);
|
||||
void retrieve_next_frame_raw_data(Clip* c, AVFrame* output);
|
||||
bool is_clip_active(Clip* c, long playhead);
|
||||
|
||||
Reference in New Issue
Block a user