Status MovieExporter::run(const Object* obj, const ExportMovieDesc& desc, std::function<void( float )> progress ) { progress( 0.f ); QString ffmpegPath = ffmpegLocation(); qDebug() << ffmpegPath; if ( !QFile::exists( ffmpegPath ) ) { qDebug() << "Please place ffmpeg.exe in " << ffmpegPath << " directory"; return Status::ERROR_FFMPEG_NOT_FOUND; } STATUS_CHECK( checkInputParameters( desc ) ); mDesc = desc; qDebug() << "OutFile: " << mDesc.strFileName; // Setup temporary folder if ( !mTempDir.isValid() ) { Q_ASSERT( false && "Cannot create temp folder." ); return Status::FAIL; } mTempWorkDir = mTempDir.path(); progress( 0.03f ); if ( !desc.strFileName.endsWith( "gif" ) ) { STATUS_CHECK( assembleAudio( obj, ffmpegPath, progress ) ); } progress( 0.10f ); STATUS_CHECK( generateImageSequence( obj, progress ) ); progress( 0.99f ); twoPassEncoding( ffmpegPath, desc.strFileName ); progress( 1.0f ); return Status::OK; }
/** Begin exporting the movie described by exportDesc. * * @param[in] obj An Object containing the animation to export. * @param[in] desc A structure containing all the export parameters. * See ExportMovieDesc. * @param[out] majorProgress A function to update the major progress bar. * The major progress bar goes from 0-100% only * one time, representing the overall progress of * the export. The first float parameter is * the current progress %, and the second is * the desired progress when the next sub-task * completes. This should only be called at the * beginning of a subtask. * @param[out] minorProgress A function to update the minor progress bar. * The minor progress bar goes from 0-100% for * each sub-task of the exporting process. * It is up to minor progress to update the * major progress bar to reflect the sub-task * progress. * @param[out] progressMessage A function ot update the progres bar * message. The messages will describe * the current sub-task of the exporting * process. * * @return Returns Status:OK on success, or Status::FAIL on error. */ Status MovieExporter::run(const Object* obj, const ExportMovieDesc& desc, std::function<void(float, float)> majorProgress, std::function<void(float)> minorProgress, std::function<void(QString)> progressMessage) { majorProgress(0.f, 0.03f); minorProgress(0.f); progressMessage(QObject::tr("Checking environment...")); clock_t t1 = clock(); QString ffmpegPath = ffmpegLocation(); qDebug() << ffmpegPath; if (!QFile::exists(ffmpegPath)) { #ifdef _WIN32 qCritical() << "Please place ffmpeg.exe in " << ffmpegPath << " directory"; #else qCritical() << "Please place ffmpeg in " << ffmpegPath << " directory"; #endif return Status::ERROR_FFMPEG_NOT_FOUND; } STATUS_CHECK(checkInputParameters(desc)); mDesc = desc; qDebug() << "OutFile: " << mDesc.strFileName; // Setup temporary folder if (!mTempDir.isValid()) { Q_ASSERT(false && "Cannot create temp folder."); return Status::FAIL; } mTempWorkDir = mTempDir.path(); minorProgress(0.f); if (desc.strFileName.endsWith("gif", Qt::CaseInsensitive)) { majorProgress(0.03f, 1.f); progressMessage("Generating gif..."); minorProgress(0.f); STATUS_CHECK(generateGif(obj, ffmpegPath, desc.strFileName, minorProgress)); } else { majorProgress(0.03f, 0.25f); progressMessage("Assembling audio..."); minorProgress(0.f); STATUS_CHECK(assembleAudio(obj, ffmpegPath, minorProgress)); minorProgress(1.f); majorProgress(0.25f, 1.f); progressMessage("Generating movie..."); STATUS_CHECK(generateMovie(obj, ffmpegPath, desc.strFileName, minorProgress)); } minorProgress(1.f); majorProgress(1.f, 1.f); progressMessage(QObject::tr("Done")); clock_t t2 = clock() - t1; qDebug("MOVIE = %.1f sec", static_cast<double>(t2 / CLOCKS_PER_SEC)); return Status::OK; }