X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftrunk%2Fsrc%2Fmodules%2Fmod_ffmpeg%2Fmptr_ffmpeg.cpp;h=f837c7bd83c8d5b82d30b4f2b02fc0a5de1dce34;hb=4ba22fb51d97f1ecce04dcc5e40569a4354c1bae;hp=3fa407685dd154b85774f91c69fd7667f79a6476;hpb=51503132a4e423e260cf9297ddd7d49d4fdff85c;p=synfig.git diff --git a/synfig-core/trunk/src/modules/mod_ffmpeg/mptr_ffmpeg.cpp b/synfig-core/trunk/src/modules/mod_ffmpeg/mptr_ffmpeg.cpp index 3fa4076..f837c7b 100644 --- a/synfig-core/trunk/src/modules/mod_ffmpeg/mptr_ffmpeg.cpp +++ b/synfig-core/trunk/src/modules/mod_ffmpeg/mptr_ffmpeg.cpp @@ -1,9 +1,12 @@ -/*! ======================================================================== -** Synfig -** ppm Target Module -** $Id: mptr_ffmpeg.cpp,v 1.1.1.1 2005/01/04 01:23:10 darco Exp $ +/* === S Y N F I G ========================================================= */ +/*! \file mptr_ffmpeg.cpp +** \brief ppm Target Module ** +** $Id$ +** +** \legal ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** Copyright (c) 2007 Chris Moore ** ** This package is free software; you can redistribute it and/or ** modify it under the terms of the GNU General Public License as @@ -14,6 +17,7 @@ ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** General Public License for more details. +** \endlegal ** ** === N O T E S =========================================================== ** @@ -31,6 +35,20 @@ #include #include "mptr_ffmpeg.h" #include +#include +#if HAVE_SYS_WAIT_H + #include +#endif +#if HAVE_IO_H + #include +#endif +#if HAVE_PROCESS_H + #include +#endif +#if HAVE_FCNTL_H + #include +#endif +#include #include #include #include @@ -43,16 +61,27 @@ using namespace synfig; using namespace std; using namespace etl; +#if defined(HAVE_FORK) && defined(HAVE_PIPE) && defined(HAVE_WAITPID) + #define UNIX_PIPE_TO_PROCESSES +#else + #define WIN32_PIPE_TO_PROCESSES +#endif + /* === G L O B A L S ======================================================= */ SYNFIG_IMPORTER_INIT(ffmpeg_mptr); SYNFIG_IMPORTER_SET_NAME(ffmpeg_mptr,"ffmpeg"); SYNFIG_IMPORTER_SET_EXT(ffmpeg_mptr,"avi"); SYNFIG_IMPORTER_SET_VERSION(ffmpeg_mptr,"0.1"); -SYNFIG_IMPORTER_SET_CVS_ID(ffmpeg_mptr,"$Id: mptr_ffmpeg.cpp,v 1.1.1.1 2005/01/04 01:23:10 darco Exp $"); +SYNFIG_IMPORTER_SET_CVS_ID(ffmpeg_mptr,"$Id$"); /* === M E T H O D S ======================================================= */ +bool ffmpeg_mptr::is_animated() +{ + return true; +} + bool ffmpeg_mptr::seek_to(int frame) { @@ -60,15 +89,67 @@ ffmpeg_mptr::seek_to(int frame) { if(file) { - pclose(file); +#if defined(WIN32_PIPE_TO_PROCESSES) + pclose(file); +#elif defined(UNIX_PIPE_TO_PROCESSES) + fclose(file); + int status; + waitpid(pid,&status,0); +#endif } +#if defined(WIN32_PIPE_TO_PROCESSES) + string command; - - command=strprintf("ffmpeg -i \"%s\" -an -f image2pipe -vcodec ppm -\n",filename.c_str()); - - file=popen(command.c_str(),"r"); - + + command=strprintf("ffmpeg -ss 00:00:00.%d -i \"%s\" -an -f image2pipe -vcodec ppm -\n",frame,filename.c_str()); + + file=popen(command.c_str(),POPEN_BINARY_READ_TYPE); + +#elif defined(UNIX_PIPE_TO_PROCESSES) + + int p[2]; + + if (pipe(p)) { + cerr<<"Unable to open pipe to ffmpeg"<