-/*! ========================================================================
-** 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
**
** This package is free software; you can redistribute it and/or
** 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 ===========================================================
**
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 ======================================================= */
{
if(file)
{
- pclose(file);
+ pclose(file);
}
string command;
-
+
command=strprintf("ffmpeg -i \"%s\" -an -f image2pipe -vcodec ppm -\n",filename.c_str());
-
- file=popen(command.c_str(),"r");
-
+
+ file=popen(command.c_str(),POPEN_BINARY_READ_TYPE);
+
if(!file)
{
cerr<<"Unable to open pipe to ffmpeg"<<endl;
}
cur_frame=-1;
}
-
+
while(cur_frame<frame-1)
{
cerr<<"Seeking to..."<<frame<<'('<<cur_frame<<')'<<endl;
char cookie[2];
cookie[0]=fgetc(file);
cookie[1]=fgetc(file);
-
+
if(cookie[0]!='P' || cookie[1]!='6')
{
cerr<<"stream not in PPM format \""<<cookie[0]<<cookie[1]<<'"'<<endl;
return false;
}
-
+
fgetc(file);
fscanf(file,"%d %d\n",&w,&h);
fscanf(file,"%f",&divisor);
fgetc(file);
-
+
if(feof(file))
return false;
-
+
int x;
int y;
frame.set_wh(w,h);
1.0
);
}
- cur_frame++;
+ cur_frame++;
return true;
}
ffmpeg_mptr::~ffmpeg_mptr()
{
if(file)
- pclose(file);
+ pclose(file);
#ifdef HAVE_TERMIOS_H
tcsetattr(0,TCSANOW,&oldtty);
#endif
if(!grab_frame());
return false;
}
-
+
surface=frame;
return false;
}