X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=futatabi%2Fexport.cpp;h=50fc950bbd2fa8ead59a365c28375b9be66ac278;hb=0403c737e76f127d046fcdf9eec7b2e3258833d8;hp=fe713b4d7bcc23bc64f875fcaa7c6dab20af0c5c;hpb=9725acd82ef5fd6ee02761fc4f50ba57d10c18dc;p=nageru diff --git a/futatabi/export.cpp b/futatabi/export.cpp index fe713b4..50fc950 100644 --- a/futatabi/export.cpp +++ b/futatabi/export.cpp @@ -1,6 +1,7 @@ +#include "export.h" + #include "clip_list.h" #include "defs.h" -#include "export.h" #include "flags.h" #include "frame_on_disk.h" #include "player.h" @@ -9,11 +10,9 @@ #include #include - #include -#include - #include +#include extern "C" { #include @@ -100,14 +99,14 @@ void export_multitrack_clip(const string &filename, const Clip &clip) // Create the streams. Note that some of them could be without frames // (we try to maintain the stream indexes in the export). - vector video_streams; + vector video_streams; for (unsigned stream_idx = 0; stream_idx <= last_stream_idx; ++stream_idx) { AVStream *avstream_video = avformat_new_stream(avctx, nullptr); if (avstream_video == nullptr) { fprintf(stderr, "avformat_new_stream() failed\n"); exit(1); } - avstream_video->time_base = AVRational{1, TIMEBASE}; + avstream_video->time_base = AVRational{ 1, TIMEBASE }; avstream_video->codecpar->codec_type = AVMEDIA_TYPE_VIDEO; avstream_video->codecpar->codec_id = AV_CODEC_ID_MJPEG; avstream_video->codecpar->width = global_flags.width; // Might be wrong, but doesn't matter all that much. @@ -165,8 +164,8 @@ void export_multitrack_clip(const string &filename, const Clip &clip) } } string jpeg = readers[first_frame_stream_idx].read_frame(first_frame); - int64_t scaled_pts = av_rescale_q(first_frame.pts, AVRational{1, TIMEBASE}, - video_streams[first_frame_stream_idx]->time_base); + int64_t scaled_pts = av_rescale_q(first_frame.pts, AVRational{ 1, TIMEBASE }, + video_streams[first_frame_stream_idx]->time_base); buffered_jpegs.emplace_back(BufferedJPEG{ scaled_pts, first_frame_stream_idx, std::move(jpeg) }); if (buffered_jpegs.size() >= 1000) { if (!write_buffered_jpegs(avctx, buffered_jpegs)) { @@ -183,7 +182,7 @@ void export_multitrack_clip(const string &filename, const Clip &clip) if (progress.wasCanceled()) { unlink(filename.c_str()); return; - } + } } if (!write_buffered_jpegs(avctx, buffered_jpegs)) { @@ -224,30 +223,24 @@ void export_interpolated_clip(const string &filename, const vector &clips) progress.setMaximum(100000); progress.setValue(0); - double total_length = compute_time_left(clips, {{0, 0.0}}); + vector clips_with_id; + for (const Clip &clip : clips) { + clips_with_id.emplace_back(ClipWithID{ clip, 0 }); + } + double total_length = compute_total_time(clips_with_id); promise done_promise; future done = done_promise.get_future(); - std::atomic current_value{0.0}; - size_t clip_idx = 0; + std::atomic current_value{ 0.0 }; Player player(/*destination=*/nullptr, Player::FILE_STREAM_OUTPUT, closer.release()); - player.set_done_callback([&done_promise, &clip_idx, &clips] { - if (clip_idx >= clips.size()) { - done_promise.set_value(); - } - }); - player.set_next_clip_callback([&clip_idx, &clips]() -> pair { - if (++clip_idx >= clips.size()) { - return make_pair(Clip(), -1); - } else { - return make_pair(clips[clip_idx], clip_idx); - } + player.set_done_callback([&done_promise] { + done_promise.set_value(); }); - player.set_progress_callback([¤t_value, &clips, total_length] (const std::map &player_progress) { - current_value = 1.0 - compute_time_left(clips, player_progress) / total_length; + player.set_progress_callback([¤t_value, &clips, total_length](const std::map &player_progress, double time_remaining) { + current_value = 1.0 - time_remaining / total_length; }); - player.play_clip(clips[0], clip_idx, clips[0].stream_idx); + player.play(clips_with_id); while (done.wait_for(std::chrono::milliseconds(100)) != future_status::ready && !progress.wasCanceled()) { progress.setValue(lrint(100000.0 * current_value)); }