From 668af164b70a61c82ab5139c9c9ef3c59745c61b Mon Sep 17 00:00:00 2001 From: Christophe Geuzaine <cgeuzaine@ulg.ac.be> Date: Tue, 18 May 2010 13:38:41 +0000 Subject: [PATCH] better mpeg export --- Common/CreateFile.cpp | 31 ++++++++++++++++++++----------- Fltk/fileDialogs.cpp | 15 ++++++++++++++- 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/Common/CreateFile.cpp b/Common/CreateFile.cpp index 06a513d875..cf7a5cea08 100644 --- a/Common/CreateFile.cpp +++ b/Common/CreateFile.cpp @@ -449,20 +449,29 @@ void CreateOutputFile(std::string fileName, int format) status_play_manual(!CTX::instance()->post.animCycle, 0); for(int i = 0; i < numFrames; i++){ char tmp[256]; - sprintf(tmp, "%s.gmsh-%03d.ppm", CTX::instance()->homeDir.c_str(), i + 1); + sprintf(tmp, "%s.gmsh-%03d.ppm", CTX::instance()->homeDir.c_str(), i); CreateOutputFile(tmp, FORMAT_PPM); status_play_manual(!CTX::instance()->post.animCycle, 1); } - fprintf(fp, "PATTERN I\n" "BASE_FILE_FORMAT PPM\n" - "GOP_SIZE 30\n" "SLICES_PER_FRAME 1\n" - "PIXEL HALF\n" "RANGE 10\n" - "PSEARCH_ALG TWOLEVEL\n" "BSEARCH_ALG CROSS2\n" - "IQSCALE 1\n" "PQSCALE 10\n" - "BQSCALE 25\n" "REFERENCE_FRAME DECODED\n" - "OUTPUT %s\n" "INPUT_CONVERT *\n" - "INPUT_DIR %s\n" - "INPUT\n" ".gmsh-*.ppm [001-%03d]\n" "END_INPUT\n", - fileName.c_str(), CTX::instance()->homeDir.c_str(), numFrames); + int repeat = (int)(CTX::instance()->post.animDelay * 24); + if(repeat < 1) repeat = 1; + std::string pattern("I"); + // including P frames would lead to smaller files, but the + // quality degradation is perceptible... + // for(int i = 1; i < repeat; i++) pattern += "P"; + fprintf(fp, "PATTERN %s\nBASE_FILE_FORMAT PPM\nGOP_SIZE %d\n" + "SLICES_PER_FRAME 1\nPIXEL FULL\nRANGE 10\n" + "PSEARCH_ALG EXHAUSTIVE\nBSEARCH_ALG CROSS2\n" + "IQSCALE 1\nPQSCALE 1\nBQSCALE 25\nREFERENCE_FRAME DECODED\n" + "OUTPUT %s\nINPUT_CONVERT *\nINPUT_DIR %s\nINPUT\n", + pattern.c_str(), repeat, fileName.c_str(), + CTX::instance()->homeDir.c_str()); + for(int i = 0; i < numFrames; i++){ + fprintf(fp, ".gmsh-%03d.ppm", i); + if(repeat > 1) fprintf(fp, " [1-%d]", repeat); + fprintf(fp, "\n"); + } + fprintf(fp, "END_INPUT\n"); fclose(fp); char *args[] = {(char*)"gmsh", (char*)parFileName.c_str()}; try{ diff --git a/Fltk/fileDialogs.cpp b/Fltk/fileDialogs.cpp index 4e12b5063b..fff4053506 100644 --- a/Fltk/fileDialogs.cpp +++ b/Fltk/fileDialogs.cpp @@ -13,6 +13,7 @@ #include <FL/Fl_Check_Button.H> #include <FL/Fl_Return_Button.H> #include <FL/Fl_Value_Slider.H> +#include <FL/Fl_Value_Input.H> #include <FL/Fl_Menu_Window.H> #include <FL/Fl_Select_Browser.H> #include <FL/Fl_Toggle_Button.H> @@ -356,13 +357,14 @@ int mpegFileDialog(const char *name) Fl_Window *window; Fl_Round_Button *b[2]; Fl_Check_Button *c[1]; + Fl_Value_Input *v[1]; Fl_Button *ok, *cancel; }; static _mpegFileDialog *dialog = NULL; if(!dialog){ dialog = new _mpegFileDialog; - int h = 3 * WB + 4 * BH, w = 2 * BB + 3 * WB, y = WB; + int h = 3 * WB + 5 * BH, w = 2 * BB + 3 * WB, y = WB; dialog->window = new Fl_Double_Window(w, h, "MPEG Options"); dialog->window->box(GMSH_WINDOW_BOX); dialog->window->set_modal(); @@ -376,9 +378,18 @@ int mpegFileDialog(const char *name) dialog->b[1]->type(FL_RADIO_BUTTON); o->end(); } + dialog->v[0] = new Fl_Value_Input + (WB, y, BB / 2, BH, "Frame duration (in sec.)"); y += BH; + dialog->v[0]->minimum(1. / 24.); + dialog->v[0]->maximum(2.); + dialog->v[0]->step(1. / 24.); + dialog->v[0]->precision(3); + dialog->v[0]->align(FL_ALIGN_RIGHT); + dialog->c[0] = new Fl_Check_Button (WB, y, 2 * BB + WB, BH, "Composite all window tiles"); y += BH; dialog->c[0]->type(FL_TOGGLE_BUTTON); + dialog->ok = new Fl_Return_Button(WB, y + WB, BB, BH, "OK"); dialog->cancel = new Fl_Button(2 * WB + BB, y + WB, BB, BH, "Cancel"); dialog->window->end(); @@ -387,6 +398,7 @@ int mpegFileDialog(const char *name) dialog->b[0]->value(!CTX::instance()->post.animCycle); dialog->b[1]->value(CTX::instance()->post.animCycle); + dialog->v[0]->value(CTX::instance()->post.animDelay); dialog->c[0]->value(CTX::instance()->print.compositeWindows); dialog->window->show(); @@ -397,6 +409,7 @@ int mpegFileDialog(const char *name) if (!o) break; if (o == dialog->ok) { opt_post_anim_cycle(0, GMSH_SET | GMSH_GUI, (int)dialog->b[1]->value()); + opt_post_anim_delay(0, GMSH_SET | GMSH_GUI, dialog->v[0]->value()); opt_print_composite_windows(0, GMSH_SET | GMSH_GUI, (int)dialog->c[0]->value()); CreateOutputFile(name, FORMAT_MPEG); dialog->window->hide(); -- GitLab