Skip to content

Commit 647e1b1

Browse files
committed
better progress bar; support concatenating multiple input files
1 parent 13d4451 commit 647e1b1

File tree

1 file changed

+47
-40
lines changed

1 file changed

+47
-40
lines changed

gop_muxer.cpp

Lines changed: 47 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ uint32_t total = 0;
1414
int fail = 0;
1515

1616
void show_progress(const char * item) {
17-
puts(item);
17+
printf("%7d/%d %.2lf%% %s \r", progress, total, progress * 100.0 / total, item);
1818
}
1919

2020
void load_gop_file(const char * gop_filename) {
@@ -26,10 +26,14 @@ void load_gop_file(const char * gop_filename) {
2626
auto len = strlen(buffer);
2727
if(buffer[len-1] == '\n') buffer[len-1] = 0;
2828
if(buffer[0] == 0) continue;
29-
if(strncmp(buffer, "#options", 8) == 0)
30-
sprintf(opt_filename, "%s%s", dir_prefix, buffer + 9);
31-
else if(strncmp(buffer, "#headers", 8) == 0)
32-
sprintf(hdr_filename, "%s%s", dir_prefix, buffer + 9);
29+
if(strncmp(buffer, "#options", 8) == 0) {
30+
if(!opt_filename[0])
31+
sprintf(opt_filename, "%s%s", dir_prefix, buffer + 9);
32+
}
33+
else if(strncmp(buffer, "#headers", 8) == 0) {
34+
if(!hdr_filename[0])
35+
sprintf(hdr_filename, "%s%s", dir_prefix, buffer + 9);
36+
}
3337
else {
3438
auto data_filename = new char[strlen(dir_prefix) + strlen(buffer) + 1];
3539
sprintf(data_filename, "%s%s", dir_prefix, buffer);
@@ -43,7 +47,7 @@ void load_gop_file(const char * gop_filename) {
4347
summary = (lsmash_video_summary_t *)lsmash_create_summary(LSMASH_SUMMARY_TYPE_VIDEO);
4448
summary->sample_type = ISOM_CODEC_TYPE_HVC1_VIDEO;
4549

46-
show_progress(gop_filename);
50+
printf("%s loaded.\n", gop_filename);
4751
}
4852

4953
void load_options_file(const char * opt_filename) {
@@ -345,63 +349,66 @@ void clean_up() {
345349
}
346350

347351
void help(const char * argv[]) {
348-
printf("%s <file.gop>\n", argv[0]);
352+
printf("%s <file1.gop> [<file2.gop> ... <fileN.gop>]\n", argv[0]);
349353
puts("");
350-
puts("Mux given file with its segments into an mp4 file.");
354+
puts("Mux given files with its segments into an mp4 file.");
351355
puts("");
352-
puts("CAUTION! 'file.mp4' will be overwritten without confirmation!");
356+
puts("CAUTION! 'fileN.mp4' will be overwritten without confirmation!");
353357
puts("");
354358
}
355359

356360
int main(int argc, const char * argv[]) {
357-
if (argc != 2) {
361+
if (argc < 2) {
358362
help(argv);
359363
return -1;
360364
}
361-
const char* gop_filename = argv[1];
362-
const char* extension = gop_filename + strlen(gop_filename) - 4;
363-
if (strcmp(extension, ".gop") != 0) {
364-
printf("Only .gop file is accepted, %s given.\n", gop_filename);
365-
return -2;
366-
}
367365

368-
const char* slash = strrchr(gop_filename, '/');
369-
if(slash == NULL) slash = strrchr(gop_filename, '\\');
370-
if(slash == NULL) {
371-
dir_prefix = "";
372-
slash = gop_filename;
373-
}
374-
else {
375-
int dir_len = slash - gop_filename + 2;
376-
char* tmp_dir_prefix = new char[dir_len];
377-
strncpy(tmp_dir_prefix, gop_filename, dir_len - 1);
378-
tmp_dir_prefix[dir_len - 1] = 0;
379-
dir_prefix = tmp_dir_prefix;
380-
slash++;
381-
}
382-
int len = strlen(slash) - 3;
383-
name_prefix = new char[len];
384-
strncpy(name_prefix, slash, len - 1);
385-
name_prefix[len - 1] = 0;
366+
for (int i = 1; i < argc; i++) {
367+
const char* gop_filename = argv[i];
368+
const char* extension = gop_filename + strlen(gop_filename) - 4;
369+
if (strcmp(extension, ".gop") != 0) {
370+
printf("Only .gop file is accepted, %s given.\n", gop_filename);
371+
return -2;
372+
}
386373

387-
sprintf(out_filename, "%s%s.mp4", dir_prefix, name_prefix);
374+
const char* slash = strrchr(gop_filename, '/');
375+
if(slash == NULL) slash = strrchr(gop_filename, '\\');
376+
if(slash == NULL) {
377+
dir_prefix = "";
378+
slash = gop_filename;
379+
}
380+
else {
381+
int dir_len = slash - gop_filename + 2;
382+
char* tmp_dir_prefix = new char[dir_len];
383+
strncpy(tmp_dir_prefix, gop_filename, dir_len - 1);
384+
tmp_dir_prefix[dir_len - 1] = 0;
385+
dir_prefix = tmp_dir_prefix;
386+
slash++;
387+
}
388+
int len = strlen(slash) - 3;
389+
name_prefix = new char[len];
390+
strncpy(name_prefix, slash, len - 1);
391+
name_prefix[len - 1] = 0;
388392

389-
printf("Dir: %s\nFile: %s\n", dir_prefix, name_prefix);
393+
sprintf(out_filename, "%s%s.mp4", dir_prefix, name_prefix);
390394

391-
load_gop_file(gop_filename);
395+
printf("Dir: %-20s File: %-20s\n", dir_prefix, name_prefix);
396+
397+
load_gop_file(argv[i]);
398+
}
392399

393400
if(opt_filename[0] == 0) { puts("Options file missing."); return -3; }
394401
if(hdr_filename[0] == 0) { puts("Headers file missing."); return -3; }
395402
if(data_list.size() == 0) { puts("Data files missing."); return -3; }
396403

397-
total = data_list.size() + 2;
398-
show_progress("");
404+
total = data_list.size();
405+
printf("Saving to %s\n", out_filename);
399406

400407
load_options_file(opt_filename);
401-
402408
load_headers_file(hdr_filename);
403409

404410
for (auto data_filename : data_list) {
411+
progress++;
405412
load_data_file(data_filename);
406413
}
407414

0 commit comments

Comments
 (0)