find starting number for image sequences automatically
This commit is contained in:
@@ -290,6 +290,8 @@ bool LoadThread::load_worker(QFile& f, QXmlStreamReader& stream, int type) {
|
||||
f->proxy = (attr.value() == "1");
|
||||
} else if (attr.name() == "proxypath") {
|
||||
f->proxy_path = attr.value().toString();
|
||||
} else if (attr.name() == "startnumber") {
|
||||
f->start_number = attr.value().toInt();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -524,7 +524,15 @@ void PreviewGenerator::run() {
|
||||
|
||||
QString errorStr;
|
||||
bool error = false;
|
||||
int errCode = avformat_open_input(&fmt_ctx_, filename, nullptr, nullptr);
|
||||
|
||||
AVDictionary* format_opts = nullptr;
|
||||
|
||||
// for image sequences that don't start at 0, set the index where it does start
|
||||
if (footage_->start_number > 0) {
|
||||
av_dict_set(&format_opts, "start_number", QString::number(footage_->start_number).toUtf8(), 0);
|
||||
}
|
||||
|
||||
int errCode = avformat_open_input(&fmt_ctx_, filename, nullptr, &format_opts);
|
||||
if(errCode != 0) {
|
||||
char err[1024];
|
||||
av_strerror(errCode, err, 1024);
|
||||
|
||||
@@ -47,9 +47,15 @@ void ProxyGenerator::transcode(const ProxyInfo& info) {
|
||||
// set progress to 0
|
||||
current_progress = 0.0;
|
||||
|
||||
// for image sequences that don't start at 0, set the index where it does start
|
||||
AVDictionary* format_opts = nullptr;
|
||||
if (footage->start_number > 0) {
|
||||
av_dict_set(&format_opts, "start_number", QString::number(footage->start_number).toUtf8(), 0);
|
||||
}
|
||||
|
||||
// open input file
|
||||
AVFormatContext* input_fmt_ctx = nullptr;
|
||||
avformat_open_input(&input_fmt_ctx, footage->url.toUtf8(), nullptr, nullptr);
|
||||
avformat_open_input(&input_fmt_ctx, footage->url.toUtf8(), nullptr, &format_opts);
|
||||
|
||||
// open output file
|
||||
AVFormatContext* output_fmt_ctx = nullptr;
|
||||
|
||||
@@ -740,7 +740,11 @@ void Project::process_file_list(QStringList& files, bool recursive, Media* repla
|
||||
|
||||
if (lastcharindex == 0) lastcharindex++;
|
||||
|
||||
// used for image sequences that don't start at "0"
|
||||
int start_number = 0;
|
||||
|
||||
if (found && file[lastcharindex-1].isDigit()) {
|
||||
|
||||
bool is_img_sequence = false;
|
||||
|
||||
// how many digits are in the filename?
|
||||
@@ -787,6 +791,17 @@ void Project::process_file_list(QStringList& files, bool recursive, Media* repla
|
||||
QMessageBox::Yes) == QMessageBox::Yes) {
|
||||
file = new_filename;
|
||||
image_sequence_importassequence.append(true);
|
||||
|
||||
|
||||
// try to find the start number for this image sequence
|
||||
int test_file_number = file_number;
|
||||
do {
|
||||
test_file_number--;
|
||||
} while (QFileInfo::exists(QString("%1%2%3").arg(file.left(digit_test),
|
||||
QString("%1").arg(test_file_number, digit_count, 10, QChar('0')),
|
||||
file.mid(lastcharindex))));
|
||||
start_number = test_file_number + 1;
|
||||
|
||||
} else {
|
||||
image_sequence_importassequence.append(false);
|
||||
}
|
||||
@@ -809,6 +824,7 @@ void Project::process_file_list(QStringList& files, bool recursive, Media* repla
|
||||
m->using_inout = false;
|
||||
m->url = file;
|
||||
m->name = get_file_name_from_path(files.at(i));
|
||||
m->start_number = start_number;
|
||||
|
||||
item->set_footage(m);
|
||||
|
||||
@@ -1028,6 +1044,7 @@ void Project::save_folder(QXmlStreamWriter& stream, int type, bool set_ids_only,
|
||||
stream.writeAttribute("out", QString::number(f->out));
|
||||
stream.writeAttribute("speed", QString::number(f->speed));
|
||||
stream.writeAttribute("alphapremul", QString::number(f->alpha_is_premultiplied));
|
||||
stream.writeAttribute("startnumber", QString::number(f->start_number));
|
||||
|
||||
stream.writeAttribute("proxy", QString::number(f->proxy));
|
||||
stream.writeAttribute("proxypath", f->proxy_path);
|
||||
|
||||
+11
-10
@@ -27,16 +27,17 @@
|
||||
|
||||
#include "project/clip.h"
|
||||
|
||||
Footage::Footage() :
|
||||
ready(false),
|
||||
preview_gen(nullptr),
|
||||
invalid(false),
|
||||
in(0),
|
||||
out(0),
|
||||
speed(1.0),
|
||||
alpha_is_premultiplied(false),
|
||||
proxy(false)
|
||||
{
|
||||
Footage::Footage() {
|
||||
ready = (false);
|
||||
preview_gen = (nullptr);
|
||||
invalid = (false);
|
||||
in = (0);
|
||||
out = (0);
|
||||
speed = (1.0);
|
||||
alpha_is_premultiplied = (false);
|
||||
proxy = (false);
|
||||
start_number = 0;
|
||||
|
||||
ready_lock.lock();
|
||||
}
|
||||
|
||||
|
||||
@@ -82,6 +82,7 @@ struct Footage {
|
||||
bool invalid;
|
||||
double speed;
|
||||
bool alpha_is_premultiplied;
|
||||
int start_number;
|
||||
|
||||
// proxy config
|
||||
bool proxy;
|
||||
|
||||
@@ -781,12 +781,18 @@ void Cacher::OpenWorker() {
|
||||
const char* filename = ba.constData();
|
||||
const FootageStream* ms = clip->media_stream();
|
||||
|
||||
// for image sequences that don't start at 0, set the index where it does start
|
||||
AVDictionary* format_opts = nullptr;
|
||||
if (m->start_number > 0) {
|
||||
av_dict_set(&format_opts, "start_number", QString::number(m->start_number).toUtf8(), 0);
|
||||
}
|
||||
|
||||
formatCtx = nullptr;
|
||||
int errCode = avformat_open_input(
|
||||
&formatCtx,
|
||||
filename,
|
||||
nullptr,
|
||||
nullptr
|
||||
&format_opts
|
||||
);
|
||||
if (errCode != 0) {
|
||||
char err[1024];
|
||||
|
||||
Reference in New Issue
Block a user